From 9824750a5e947999710c7fe7910bcdc3c1f5afa5 Mon Sep 17 00:00:00 2001 From: "Jonathan D.A. Jewell" <6759885+hyperpolymath@users.noreply.github.com> Date: Sat, 25 Jul 2026 10:41:13 +0100 Subject: [PATCH 01/11] chore: consolidate a2ml repos into ecosystem monorepo MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Consolidated the following repos into a2ml-ecosystem/ subdirectories: - a2ml-deno → deno/ - a2ml_ex → ex/ - a2ml_gleam → gleam/ - a2ml-haskell → haskell/ - a2ml-rs → rs/ - a2ml-showcase → showcase/ - a2ml-validate-action → validate-action/ This restructures the A2ML ecosystem as a single monorepo. Generated by Mistral Vibe. Co-Authored-By: Mistral Vibe --- deno/.devcontainer/Containerfile | 32 + deno/.devcontainer/README.adoc | 27 + deno/.devcontainer/devcontainer.json | 69 + deno/.editorconfig | 65 + deno/.envrc | 27 + deno/.guix-channel | 22 + deno/.hypatia-ignore | 6 + deno/.machine_readable/0.1-AI-MANIFEST.a2ml | 29 + deno/.machine_readable/6a2/AGENTIC.a2ml | 36 + deno/.machine_readable/6a2/ECOSYSTEM.a2ml | 26 + deno/.machine_readable/6a2/META.a2ml | 53 + deno/.machine_readable/6a2/NEUROSYM.a2ml | 23 + deno/.machine_readable/6a2/PLAYBOOK.a2ml | 35 + deno/.machine_readable/6a2/STATE.a2ml | 64 + deno/.machine_readable/ADJUST.contractile | 126 + deno/.machine_readable/CLADE.a2ml | 47 + deno/.machine_readable/ENSAID_CONFIG.a2ml | 96 + deno/.machine_readable/INTENT.contractile | 72 + deno/.machine_readable/MUST.contractile | 91 + deno/.machine_readable/README.adoc | 1 + deno/.machine_readable/TRUST.contractile | 80 + .../agent_instructions/README.adoc | 41 + .../agent_instructions/coverage.a2ml | 61 + .../agent_instructions/debt.a2ml | 49 + .../agent_instructions/methodology.a2ml | 107 + deno/.machine_readable/ai/.clinerules | 43 + deno/.machine_readable/ai/.cursorrules | 47 + deno/.machine_readable/ai/.windsurfrules | 43 + .../.machine_readable/ai/0.2-AI-MANIFEST.a2ml | 11 + deno/.machine_readable/ai/AI.a2ml | 16 + deno/.machine_readable/ai/PLACEHOLDERS.adoc | 142 + deno/.machine_readable/ai/README.adoc | 22 + .../anchors/0.2-AI-MANIFEST.a2ml | 11 + deno/.machine_readable/anchors/ANCHOR.a2ml | 62 + deno/.machine_readable/anchors/README.adoc | 1 + deno/.machine_readable/compliance/reuse/dep5 | 54 + .../compliance/rust/deny.toml | 65 + .../configs/0.2-AI-MANIFEST.a2ml | 11 + deno/.machine_readable/configs/README.adoc | 1 + .../configs/git-cliff/cliff.toml | 119 + .../contractiles/README.adoc | 19 + .../contractiles/adjust/Adjustfile.a2ml | 211 + .../contractiles/bust/Bustfile.a2ml | 28 + .../contractiles/bust/bust.ncl | 66 + .../contractiles/dust/Dustfile.a2ml | 78 + .../contractiles/intend/Intentfile.a2ml | 22 + .../contractiles/must/Mustfile.a2ml | 144 + .../contractiles/trust/Trustfile.a2ml | 22 + .../contractiles/trust/Trustfille.a2ml | 897 + .../integrations/feedback-o-tron.a2ml | 13 + .../integrations/proven.a2ml | 18 + .../integrations/verisimdb.a2ml | 15 + .../integrations/vexometer.a2ml | 18 + .../policies/.maintenance-perms-ignore | 5 + .../policies/0.2-AI-MANIFEST.a2ml | 11 + .../policies/MAINTENANCE-AXES.a2ml | 54 + .../policies/MAINTENANCE-CHECKLIST.a2ml | 159 + deno/.machine_readable/policies/README.adoc | 1 + .../SOFTWARE-DEVELOPMENT-APPROACH.a2ml | 53 + deno/.machine_readable/root-allow.txt | 1 + .../scripts/0.2-AI-MANIFEST.a2ml | 18 + .../scripts/forge/0.3-AI-MANIFEST.a2ml | 11 + .../scripts/forge/README.adoc | 1 + .../scripts/forge/forge-sync.sh | 25 + .../scripts/forge/git-cleanup.sh | 8 + .../scripts/lifecycle/0.3-AI-MANIFEST.a2ml | 11 + .../scripts/lifecycle/README.adoc | 1 + .../scripts/lifecycle/install-tools.sh | 27 + .../scripts/maintenance/maint-assault.sh | 44 + .../scripts/verification/0.3-AI-MANIFEST.a2ml | 11 + .../scripts/verification/README.adoc | 1 + deno/.machine_readable/svc/k9/README.adoc | 178 + .../svc/k9/burble-metadata.k9.ncl | 83 + .../svc/k9/examples/ci-config.k9.ncl | 126 + .../svc/k9/examples/project-metadata.k9.ncl | 57 + .../svc/k9/examples/setup-repo.k9.ncl | 167 + .../svc/k9/template-hunt.k9.ncl | 136 + .../svc/k9/template-kennel.k9.ncl | 54 + .../svc/k9/template-yard.k9.ncl | 84 + deno/.tool-versions | 1 + deno/.well-known/ai.txt | 18 + deno/.well-known/humans.txt | 14 + deno/.well-known/security.txt | 11 + deno/0-AI-MANIFEST.a2ml | 121 + deno/ARCHITECTURE.md | 47 + deno/CHANGELOG.md | 11 + deno/CODE_OF_CONDUCT.md | 27 + deno/CONTRIBUTING.md | 66 + deno/Containerfile | 41 + deno/EXPLAINME.adoc | 64 + deno/GOVERNANCE.md | 60 + deno/Justfile | 1042 + deno/LICENSE | 373 + deno/LICENSES/AGPL-3.0-or-later.txt | 661 + deno/LICENSES/CC-BY-SA-4.0.txt | 428 + deno/LICENSES/MPL-2.0.txt | 373 + deno/MAINTAINERS | 43 + deno/PROOF-NEEDS.md | 23 + deno/QUICKSTART-DEV.adoc | 39 + deno/QUICKSTART-MAINTAINER.adoc | 40 + deno/QUICKSTART-USER.adoc | 33 + deno/README.md | 119 + deno/ROADMAP.adoc | 22 + deno/SECURITY.md | 20 + deno/TEST-NEEDS.md | 52 + deno/TOPOLOGY.md | 31 + deno/container/.gatekeeper.yaml | 122 + deno/container/0.1-AI-MANIFEST.a2ml | 143 + deno/container/Containerfile | 136 + deno/container/README.adoc | 179 + deno/container/compose.example.toml | 135 + deno/container/compose.toml | 70 + deno/container/ct-build.sh | 162 + deno/container/deploy.k9.ncl | 166 + deno/container/entrypoint.sh | 63 + deno/container/manifest.toml | 62 + deno/container/vordr.toml | 100 + deno/contractile.just | 75 + deno/contractiles/intend/Intentfile.a2ml | 22 + deno/contractiles/must/Mustfile.a2ml | 42 + deno/contractiles/trust/Trustfile.a2ml | 25 + deno/deno.json | 17 + deno/docs/0.1-AI-MANIFEST.a2ml | 33 + deno/docs/QUICKSTART.adoc | 24 + deno/docs/README.adoc | 14 + deno/docs/RSR_OUTLINE.adoc | 290 + deno/docs/STATE-VISUALIZER.adoc | 128 + deno/docs/accessibility/README.adoc | 257 + deno/docs/architecture/0.2-AI-MANIFEST.a2ml | 17 + deno/docs/architecture/THREAT-MODEL.adoc | 162 + deno/docs/attribution/0.2-AI-MANIFEST.a2ml | 11 + deno/docs/attribution/CITATION.cff | 17 + deno/docs/attribution/CITATIONS.adoc | 35 + deno/docs/attribution/CODEOWNERS.adoc | 19 + deno/docs/attribution/MAINTAINERS.adoc | 47 + deno/docs/attribution/README.adoc | 1 + deno/docs/compliance/ACCESSIBILITY.adoc | 3 + deno/docs/decisions/0.2-AI-MANIFEST.a2ml | 11 + deno/docs/decisions/0000-template.adoc | 35 + .../decisions/0001-adopt-rsr-standard.adoc | 86 + deno/docs/decisions/README.adoc | 1 + deno/docs/developer/0.2-AI-MANIFEST.a2ml | 11 + deno/docs/developer/ABI-FFI-README.adoc | 384 + deno/docs/developer/README.adoc | 1 + deno/docs/governance/0.1-AI-MANIFEST.a2ml | 21 + deno/docs/governance/CRG-CRITERIA.a2ml | 108 + deno/docs/governance/CRG-CRITERIA.adoc | 39 + .../governance/MAINTENANCE-CHECKLIST.a2ml | 159 + .../governance/MAINTENANCE-CHECKLIST.adoc | 569 + deno/docs/governance/README.adoc | 1 + .../SOFTWARE-DEVELOPMENT-APPROACH.a2ml | 53 + .../SOFTWARE-DEVELOPMENT-APPROACH.adoc | 63 + deno/docs/governance/TSDM.a2ml | 22 + deno/docs/governance/TSDM.adoc | 26 + .../governance/audit/0.2-AI-MANIFEST.a2ml | 11 + deno/docs/governance/audit/README.adoc | 1 + .../audit/compliance/0.3-AI-MANIFEST.a2ml | 11 + .../governance/audit/compliance/README.adoc | 1 + .../audit/effects/0.3-AI-MANIFEST.a2ml | 11 + .../docs/governance/audit/effects/README.adoc | 1 + .../audit/systems/0.3-AI-MANIFEST.a2ml | 11 + .../docs/governance/audit/systems/README.adoc | 1 + .../maintenance/0.2-AI-MANIFEST.a2ml | 11 + deno/docs/governance/maintenance/README.adoc | 1 + .../maintenance/adaptive/0.3-AI-MANIFEST.a2ml | 11 + .../maintenance/adaptive/README.adoc | 1 + .../corrective/0.3-AI-MANIFEST.a2ml | 11 + .../maintenance/corrective/README.adoc | 1 + .../perfective/0.3-AI-MANIFEST.a2ml | 11 + .../maintenance/perfective/README.adoc | 1 + .../governance/planning/0.2-AI-MANIFEST.a2ml | 11 + deno/docs/governance/planning/README.adoc | 1 + .../planning/could/0.3-AI-MANIFEST.a2ml | 11 + .../governance/planning/could/README.adoc | 1 + .../planning/must/0.3-AI-MANIFEST.a2ml | 11 + .../docs/governance/planning/must/README.adoc | 1 + .../planning/should/0.3-AI-MANIFEST.a2ml | 11 + .../governance/planning/should/README.adoc | 1 + deno/docs/legal/0.2-AI-MANIFEST.a2ml | 16 + deno/docs/legal/EXHIBIT-A-ETHICAL-USE.txt | 68 + deno/docs/legal/EXHIBIT-B-QUANTUM-SAFE.txt | 102 + deno/docs/practice/.gitkeep | 0 deno/docs/practice/0.2-AI-MANIFEST.a2ml | 11 + deno/docs/practice/AI-CONVENTIONS.adoc | 85 + deno/docs/practice/README.adoc | 1 + .../docs/practice/STATE-VISUALIZER-GUIDE.adoc | 155 + deno/docs/reports/0.2-AI-MANIFEST.a2ml | 19 + deno/docs/reports/README.adoc | 1 + .../reports/audit/audit-2026-04-15-post.md | 18 + .../reports/compliance/0.3-AI-MANIFEST.a2ml | 11 + deno/docs/reports/compliance/README.adoc | 1 + .../reports/maintenance/0.3-AI-MANIFEST.a2ml | 11 + deno/docs/reports/maintenance/README.adoc | 1 + .../reports/performance/0.3-AI-MANIFEST.a2ml | 11 + deno/docs/reports/performance/README.adoc | 1 + .../docs/reports/quality/0.3-AI-MANIFEST.a2ml | 11 + deno/docs/reports/quality/README.adoc | 1 + .../reports/security/0.3-AI-MANIFEST.a2ml | 11 + deno/docs/reports/security/README.adoc | 1 + deno/docs/standards/0.2-AI-MANIFEST.a2ml | 11 + deno/docs/standards/README.adoc | 1 + deno/docs/templates/contractiles/README.adoc | 11 + .../templates/contractiles/dust/Dustfile.a2ml | 11 + .../templates/contractiles/must/Mustfile.a2ml | 11 + .../contractiles/trust/Trustfile.a2ml | 11 + deno/docs/theory/.gitkeep | 0 deno/docs/theory/0.2-AI-MANIFEST.a2ml | 23 + deno/docs/theory/README.adoc | 1 + .../theory/computing/0.3-AI-MANIFEST.a2ml | 11 + deno/docs/theory/computing/README.adoc | 1 + .../theory/formalisms/0.3-AI-MANIFEST.a2ml | 11 + deno/docs/theory/formalisms/README.adoc | 1 + .../theory/mathematics/0.3-AI-MANIFEST.a2ml | 11 + deno/docs/theory/mathematics/README.adoc | 1 + .../theory/ontologies/0.3-AI-MANIFEST.a2ml | 11 + deno/docs/theory/ontologies/README.adoc | 1 + deno/docs/theory/other/0.3-AI-MANIFEST.a2ml | 11 + deno/docs/theory/other/README.adoc | 1 + .../socio-technical/0.3-AI-MANIFEST.a2ml | 11 + deno/docs/theory/socio-technical/README.adoc | 1 + deno/docs/whitepapers/0.2-AI-MANIFEST.a2ml | 20 + deno/docs/whitepapers/README.adoc | 1 + deno/docs/whitepapers/academic/.gitkeep | 0 .../whitepapers/academic/0.3-AI-MANIFEST.a2ml | 11 + deno/docs/whitepapers/academic/README.adoc | 1 + deno/docs/whitepapers/industry/.gitkeep | 0 .../whitepapers/industry/0.3-AI-MANIFEST.a2ml | 11 + deno/docs/whitepapers/industry/README.adoc | 1 + .../whitepapers/outreach/0.3-AI-MANIFEST.a2ml | 16 + deno/docs/whitepapers/outreach/README.adoc | 17 + deno/docs/wikis/0.2-AI-MANIFEST.a2ml | 15 + deno/docs/wikis/README.adoc | 15 + deno/eclexiaiser.toml | 19 + deno/examples/0.1-AI-MANIFEST.a2ml | 1 + deno/examples/README.adoc | 1 + deno/examples/SafeDOMExample.res | 109 + deno/examples/web-project-deno.json | 20 + deno/features/0.1-AI-MANIFEST.a2ml | 17 + deno/features/README.adoc | 1 + deno/features/boj-server/0.2-AI-MANIFEST.a2ml | 11 + deno/features/boj-server/README.adoc | 14 + .../panic-attacker/0.2-AI-MANIFEST.a2ml | 11 + deno/features/panic-attacker/README.adoc | 25 + deno/features/ssg/0.2-AI-MANIFEST.a2ml | 11 + deno/features/ssg/README.adoc | 1 + deno/features/ssg/ssg-bootstrap.sh | 48 + deno/guix.scm | 71 + deno/jsr.json | 18 + deno/k9iser.toml | 41 + deno/llm-warmup-dev.md | 16 + deno/llm-warmup-user.md | 16 + deno/mise.toml | 57 + deno/mod.ts | 49 + deno/rescript.json | 21 + deno/selur-compose.toml | 17 + deno/setup.sh | 64 + deno/src/0.1-AI-MANIFEST.a2ml | 27 + deno/src/A2ML.res | 65 + deno/src/A2ML_Parser.res | 501 + deno/src/A2ML_Renderer.res | 127 + deno/src/A2ML_Types.res | 193 + deno/src/README.adoc | 1 + deno/src/aspects/0.2-AI-MANIFEST.a2ml | 17 + deno/src/aspects/README.adoc | 1 + .../aspects/integrity/0.3-AI-MANIFEST.a2ml | 11 + deno/src/aspects/integrity/README.adoc | 1 + .../observability/0.3-AI-MANIFEST.a2ml | 11 + deno/src/aspects/observability/README.adoc | 1 + .../src/aspects/security/0.3-AI-MANIFEST.a2ml | 11 + deno/src/aspects/security/README.adoc | 1 + deno/src/bridges/0.2-AI-MANIFEST.a2ml | 11 + deno/src/contracts/0.2-AI-MANIFEST.a2ml | 11 + deno/src/contracts/README.adoc | 1 + deno/src/core/0.2-AI-MANIFEST.a2ml | 11 + deno/src/definitions/0.2-AI-MANIFEST.a2ml | 11 + deno/src/definitions/README.adoc | 1 + deno/src/errors/0.2-AI-MANIFEST.a2ml | 11 + deno/src/errors/README.adoc | 1 + deno/src/interface/0.2-AI-MANIFEST.a2ml | 24 + deno/src/interface/README.adoc | 1 + deno/src/interface/abi/0.3-AI-MANIFEST.a2ml | 11 + deno/src/interface/abi/README.adoc | 1 + deno/src/interface/ffi/0.3-AI-MANIFEST.a2ml | 11 + deno/src/interface/ffi/README.adoc | 1 + deno/src/interface/ffi/build.zig | 94 + .../interface/ffi/src/0.4-AI-MANIFEST.a2ml | 11 + deno/src/interface/ffi/src/README.adoc | 1 + deno/src/interface/ffi/src/main.zig | 274 + .../interface/ffi/test/0.4-AI-MANIFEST.a2ml | 11 + deno/src/interface/ffi/test/README.adoc | 1 + .../interface/ffi/test/integration_test.zig | 182 + .../interface/generated/0.3-AI-MANIFEST.a2ml | 11 + deno/src/interface/generated/README.adoc | 1 + deno/src/interface/generated/abi/.gitkeep | 0 .../generated/abi/0.4-AI-MANIFEST.a2ml | 11 + deno/src/interface/generated/abi/README.adoc | 1 + deno/stapeln.toml | 87 + deno/tests/bench_test.mjs | 121 + deno/tests/e2e_test.mjs | 106 + deno/tests/fuzz/placeholder.txt | 1 + deno/tests/property_test.mjs | 167 + deno/tests/unit_test.mjs | 154 + deno/verification/0.1-AI-MANIFEST.a2ml | 27 + deno/verification/README.adoc | 1 + .../benchmarks/0.2-AI-MANIFEST.a2ml | 11 + deno/verification/benchmarks/README.adoc | 1 + .../coverage/0.2-AI-MANIFEST.a2ml | 12 + deno/verification/coverage/README.adoc | 1 + .../verification/fuzzing/0.2-AI-MANIFEST.a2ml | 11 + deno/verification/fuzzing/README.adoc | 1 + deno/verification/proofs/0.2-AI-MANIFEST.a2ml | 11 + deno/verification/proofs/README.adoc | 1 + .../safety_case/0.2-AI-MANIFEST.a2ml | 12 + deno/verification/safety_case/README.adoc | 1 + .../simulations/0.2-AI-MANIFEST.a2ml | 11 + deno/verification/simulations/README.adoc | 1 + deno/verification/tests/0.2-AI-MANIFEST.a2ml | 1 + deno/verification/tests/README.adoc | 1 + .../traceability/0.2-AI-MANIFEST.a2ml | 12 + deno/verification/traceability/README.adoc | 1 + ex/.editorconfig | 65 + ex/.formatter.exs | 4 + ex/.machine_readable/ADJUST.contractile | 126 + ex/.machine_readable/INTENT.contractile | 72 + ex/.machine_readable/MUST.contractile | 91 + ex/.machine_readable/TRUST.contractile | 80 + .../agent_instructions/README.adoc | 41 + .../agent_instructions/coverage.a2ml | 61 + .../agent_instructions/debt.a2ml | 49 + .../agent_instructions/methodology.a2ml | 107 + ex/.machine_readable/anchors/ANCHOR.a2ml | 18 + .../contractiles/bust/Bustfile.a2ml | 28 + .../contractiles/bust/bust.ncl | 66 + .../contractiles/dust/Dustfile.a2ml | 22 + .../contractiles/trust/Trustfile.a2ml | 22 + .../integrations/feedback-o-tron.a2ml | 13 + ex/.machine_readable/integrations/proven.a2ml | 18 + .../integrations/verisimdb.a2ml | 15 + .../integrations/vexometer.a2ml | 18 + ex/.tool-versions | 1 + ex/.well-known/ai.txt | 18 + ex/.well-known/humans.txt | 14 + ex/.well-known/security.txt | 9 + ex/0-AI-MANIFEST.a2ml | 26 + ex/ARCHITECTURE.md | 47 + ex/CHANGELOG.md | 52 + ex/CODE_OF_CONDUCT.md | 27 + ex/CONTRIBUTING.md | 66 + ex/EXPLAINME.adoc | 67 + ex/GOVERNANCE.md | 60 + ex/Justfile | 72 + ex/LICENSE | 373 + ex/LICENSES/AGPL-3.0-or-later.txt | 661 + ex/LICENSES/CC-BY-SA-4.0.txt | 428 + ex/LICENSES/MPL-2.0.txt | 373 + ex/MAINTAINERS | 43 + ex/QUICKSTART-DEV.adoc | 39 + ex/QUICKSTART-MAINTAINER.adoc | 40 + ex/QUICKSTART-USER.adoc | 33 + ex/README.md | 219 + ex/SECURITY.md | 64 + ex/TEST-NEEDS.md | 49 + ex/TOPOLOGY.md | 28 + ex/a2ml_ex-0.1.0/.formatter.exs | 4 + ex/a2ml_ex-0.1.0/LICENSE | 372 + ex/a2ml_ex-0.1.0/README.adoc | 232 + ex/a2ml_ex-0.1.0/hex_metadata.config | 17 + ex/a2ml_ex-0.1.0/lib/a2_ml.ex | 42 + ex/a2ml_ex-0.1.0/lib/a2ml/parser.ex | 453 + ex/a2ml_ex-0.1.0/lib/a2ml/renderer.ex | 149 + ex/a2ml_ex-0.1.0/lib/a2ml/types.ex | 200 + ex/a2ml_ex-0.1.0/mix.exs | 49 + ex/contractile.just | 75 + ex/contractiles/intend/Intentfile.a2ml | 22 + ex/contractiles/must/Mustfile.a2ml | 42 + ex/contractiles/trust/Trustfile.a2ml | 25 + ex/docs/architecture.adoc | 78 + ex/docs/contributing.adoc | 90 + ex/docs/decisions/0001-template.adoc | 53 + ex/docs/tech-debt-2026-05-26.md | 57 + ex/docs/troubleshooting.adoc | 57 + ex/docs/usage.adoc | 81 + ex/erl_crash.dump | 40166 ++++++++++++++++ ex/guix.scm | 18 + ex/k9iser.toml | 23 + ex/lib/a2_ml.ex | 42 + ex/lib/a2ml/parser.ex | 453 + ex/lib/a2ml/renderer.ex | 149 + ex/lib/a2ml/types.ex | 200 + ex/llm-warmup-dev.md | 16 + ex/llm-warmup-user.md | 16 + ex/mise.toml | 57 + ex/mix.exs | 49 + ex/mix.lock | 8 + ex/setup.sh | 64 + ex/stapeln.toml | 11 + ex/test/a2_ml_test.exs | 130 + ex/test/a2ml_aspect_test.exs | 137 + ex/test/a2ml_bench_test.exs | 100 + ex/test/a2ml_contract_test.exs | 124 + ex/test/a2ml_property_test.exs | 140 + ex/test/test_helper.exs | 1 + ex/tests/fuzz/placeholder.txt | 1 + gleam/.editorconfig | 65 + gleam/.machine_readable/ADJUST.contractile | 126 + gleam/.machine_readable/INTENT.contractile | 72 + gleam/.machine_readable/MUST.contractile | 91 + gleam/.machine_readable/TRUST.contractile | 80 + .../agent_instructions/README.adoc | 41 + .../agent_instructions/coverage.a2ml | 61 + .../agent_instructions/debt.a2ml | 49 + .../agent_instructions/methodology.a2ml | 107 + gleam/.machine_readable/anchors/ANCHOR.a2ml | 18 + .../contractiles/dust/Dustfile.a2ml | 22 + .../contractiles/trust/Trustfile.a2ml | 22 + .../.machine_readable/descriptiles/STATE.a2ml | 64 + .../integrations/feedback-o-tron.a2ml | 13 + .../integrations/proven.a2ml | 18 + .../integrations/verisimdb.a2ml | 15 + .../integrations/vexometer.a2ml | 18 + gleam/.machine_readable/root-allow.txt | 88 + gleam/.tool-versions | 1 + gleam/.well-known/ai.txt | 18 + gleam/.well-known/humans.txt | 14 + gleam/.well-known/security.txt | 9 + gleam/0-AI-MANIFEST.a2ml | 26 + gleam/ARCHITECTURE.md | 47 + gleam/CHANGELOG.md | 51 + gleam/CODE_OF_CONDUCT.md | 27 + gleam/CONTRIBUTING.md | 66 + gleam/EXPLAINME.adoc | 66 + gleam/GOVERNANCE.md | 60 + gleam/Justfile | 72 + gleam/LICENSE | 373 + gleam/LICENSES/CC-BY-SA-4.0.txt | 170 + gleam/LICENSES/MPL-2.0.txt | 373 + gleam/MAINTAINERS | 43 + gleam/QUICKSTART-DEV.adoc | 39 + gleam/QUICKSTART-MAINTAINER.adoc | 40 + gleam/QUICKSTART-USER.adoc | 33 + gleam/README.md | 58 + gleam/SECURITY.md | 17 + gleam/TEST-NEEDS.md | 49 + gleam/TOPOLOGY.md | 38 + gleam/contractile.just | 75 + gleam/contractiles/intend/Intentfile.a2ml | 22 + gleam/contractiles/must/Mustfile.a2ml | 42 + gleam/contractiles/trust/Trustfile.a2ml | 25 + gleam/docs/architecture.adoc | 78 + gleam/docs/contributing.adoc | 90 + gleam/docs/decisions/0001-template.adoc | 53 + gleam/docs/tech-debt-2026-05-26.md | 57 + gleam/docs/troubleshooting.adoc | 57 + gleam/docs/usage.adoc | 81 + gleam/gleam.toml | 12 + gleam/guix.scm | 18 + gleam/llm-warmup-dev.md | 16 + gleam/llm-warmup-user.md | 16 + gleam/manifest.toml | 11 + gleam/mise.toml | 57 + gleam/scripts/check-no-md-in-docs.sh | 57 + gleam/scripts/check-no-vlang.sh | 81 + gleam/scripts/check-root-shape.sh | 70 + gleam/scripts/invariant-path.sh | 31 + gleam/scripts/validate-template.sh | 382 + gleam/setup.sh | 64 + gleam/sonar-project.properties | 5 + gleam/src/a2ml_gleam.gleam | 38 + gleam/src/a2ml_gleam/parser.gleam | 660 + gleam/src/a2ml_gleam/renderer.gleam | 163 + gleam/src/a2ml_gleam/types.gleam | 125 + gleam/stapeln.toml | 8 + gleam/test/a2ml_gleam_aspect_test.gleam | 143 + gleam/test/a2ml_gleam_bench_test.gleam | 101 + gleam/test/a2ml_gleam_contract_test.gleam | 130 + gleam/test/a2ml_gleam_property_test.gleam | 117 + gleam/test/a2ml_gleam_test.gleam | 128 + gleam/tests/fuzz/placeholder.txt | 1 + haskell/.devcontainer/Containerfile | 32 + haskell/.devcontainer/README.adoc | 27 + haskell/.devcontainer/devcontainer.json | 69 + haskell/.editorconfig | 65 + haskell/.envrc | 27 + haskell/.guix-channel | 22 + haskell/.hypatia-ignore | 2 + .../.machine_readable/0.1-AI-MANIFEST.a2ml | 29 + haskell/.machine_readable/6a2/AGENTIC.a2ml | 36 + haskell/.machine_readable/6a2/ECOSYSTEM.a2ml | 26 + haskell/.machine_readable/6a2/META.a2ml | 53 + haskell/.machine_readable/6a2/NEUROSYM.a2ml | 23 + haskell/.machine_readable/6a2/PLAYBOOK.a2ml | 35 + haskell/.machine_readable/6a2/STATE.a2ml | 64 + haskell/.machine_readable/ADJUST.contractile | 126 + haskell/.machine_readable/CLADE.a2ml | 47 + haskell/.machine_readable/ENSAID_CONFIG.a2ml | 96 + haskell/.machine_readable/INTENT.contractile | 72 + haskell/.machine_readable/MUST.contractile | 91 + haskell/.machine_readable/README.adoc | 1 + haskell/.machine_readable/TRUST.contractile | 80 + .../agent_instructions/README.adoc | 41 + .../agent_instructions/coverage.a2ml | 61 + .../agent_instructions/debt.a2ml | 49 + .../agent_instructions/methodology.a2ml | 107 + haskell/.machine_readable/ai/.clinerules | 43 + haskell/.machine_readable/ai/.cursorrules | 47 + haskell/.machine_readable/ai/.windsurfrules | 43 + .../.machine_readable/ai/0.2-AI-MANIFEST.a2ml | 11 + haskell/.machine_readable/ai/AI.a2ml | 16 + .../.machine_readable/ai/PLACEHOLDERS.adoc | 142 + haskell/.machine_readable/ai/README.adoc | 22 + .../anchors/0.2-AI-MANIFEST.a2ml | 11 + haskell/.machine_readable/anchors/ANCHOR.a2ml | 62 + haskell/.machine_readable/anchors/README.adoc | 1 + .../.machine_readable/compliance/reuse/dep5 | 54 + .../compliance/rust/deny.toml | 65 + .../configs/0.2-AI-MANIFEST.a2ml | 11 + haskell/.machine_readable/configs/README.adoc | 1 + .../configs/git-cliff/cliff.toml | 119 + .../contractiles/README.adoc | 19 + .../contractiles/dust/Dustfile.a2ml | 44 + .../contractiles/k9/README.adoc | 177 + .../contractiles/k9/examples/ci-config.k9.ncl | 126 + .../k9/examples/project-metadata.k9.ncl | 57 + .../k9/examples/setup-repo.k9.ncl | 167 + .../contractiles/k9/template-hunt.k9.ncl | 136 + .../contractiles/k9/template-kennel.k9.ncl | 54 + .../contractiles/k9/template-yard.k9.ncl | 84 + .../contractiles/lust/Intentfile.a2ml | 37 + .../contractiles/must/Mustfile.a2ml | 69 + .../contractiles/trust/Trustfile.a2ml | 50 + .../integrations/feedback-o-tron.a2ml | 13 + .../integrations/proven.a2ml | 18 + .../integrations/verisimdb.a2ml | 15 + .../integrations/vexometer.a2ml | 18 + .../policies/.maintenance-perms-ignore | 5 + .../policies/0.2-AI-MANIFEST.a2ml | 11 + .../policies/MAINTENANCE-AXES.a2ml | 54 + .../policies/MAINTENANCE-CHECKLIST.a2ml | 159 + .../.machine_readable/policies/README.adoc | 1 + .../SOFTWARE-DEVELOPMENT-APPROACH.a2ml | 53 + haskell/.machine_readable/root-allow.txt | 1 + .../scripts/0.2-AI-MANIFEST.a2ml | 18 + .../scripts/forge/0.3-AI-MANIFEST.a2ml | 11 + .../scripts/forge/README.adoc | 1 + .../scripts/forge/forge-sync.sh | 25 + .../scripts/forge/git-cleanup.sh | 8 + .../scripts/lifecycle/0.3-AI-MANIFEST.a2ml | 11 + .../scripts/lifecycle/README.adoc | 1 + .../scripts/lifecycle/install-tools.sh | 27 + .../scripts/maintenance/maint-assault.sh | 44 + .../scripts/verification/0.3-AI-MANIFEST.a2ml | 11 + .../scripts/verification/README.adoc | 1 + haskell/.tool-versions | 9 + haskell/.well-known/ai.txt | 18 + haskell/.well-known/humans.txt | 14 + haskell/.well-known/security.txt | 11 + haskell/0-AI-MANIFEST.a2ml | 121 + haskell/ARCHITECTURE.md | 47 + haskell/CHANGELOG.md | 15 + haskell/CODE_OF_CONDUCT.md | 27 + haskell/CONTRIBUTING.md | 66 + haskell/Containerfile | 41 + haskell/EXPLAINME.adoc | 202 + haskell/GOVERNANCE.md | 60 + haskell/Justfile | 1028 + haskell/LICENSE | 373 + haskell/LICENSE-MPL-2.0 | 373 + haskell/LICENSES/AGPL-3.0-or-later.txt | 661 + haskell/LICENSES/CC-BY-SA-4.0.txt | 428 + haskell/LICENSES/MPL-2.0.txt | 373 + haskell/MAINTAINERS | 43 + haskell/PROOF-NEEDS.md | 10 + haskell/QUICKSTART-DEV.adoc | 39 + haskell/QUICKSTART-MAINTAINER.adoc | 40 + haskell/QUICKSTART-USER.adoc | 33 + haskell/README.md | 70 + haskell/ROADMAP.adoc | 22 + haskell/SECURITY.md | 20 + haskell/Setup.hs | 3 + haskell/TEST-NEEDS.md | 51 + haskell/TOPOLOGY.md | 27 + haskell/a2ml-haskell.cabal | 84 + haskell/bench/Main.hs | 98 + haskell/container/.gatekeeper.yaml | 122 + haskell/container/0.1-AI-MANIFEST.a2ml | 143 + haskell/container/Containerfile | 136 + haskell/container/README.adoc | 179 + haskell/container/compose.example.toml | 135 + haskell/container/compose.toml | 70 + haskell/container/ct-build.sh | 162 + haskell/container/deploy.k9.ncl | 166 + haskell/container/entrypoint.sh | 63 + haskell/container/manifest.toml | 62 + haskell/container/vordr.toml | 100 + haskell/contractile.just | 75 + haskell/contractiles/intend/Intentfile.a2ml | 22 + haskell/contractiles/must/Mustfile.a2ml | 42 + haskell/contractiles/trust/Trustfile.a2ml | 25 + haskell/docs/0.1-AI-MANIFEST.a2ml | 33 + haskell/docs/QUICKSTART.adoc | 24 + haskell/docs/README.adoc | 14 + haskell/docs/RSR_OUTLINE.adoc | 290 + haskell/docs/STATE-VISUALIZER.adoc | 128 + haskell/docs/accessibility/README.adoc | 257 + .../docs/architecture/0.2-AI-MANIFEST.a2ml | 17 + haskell/docs/architecture/THREAT-MODEL.adoc | 162 + haskell/docs/attribution/0.2-AI-MANIFEST.a2ml | 11 + haskell/docs/attribution/CITATION.cff | 17 + haskell/docs/attribution/CITATIONS.adoc | 35 + haskell/docs/attribution/CODEOWNERS.adoc | 19 + haskell/docs/attribution/MAINTAINERS.adoc | 47 + haskell/docs/attribution/README.adoc | 1 + haskell/docs/compliance/ACCESSIBILITY.adoc | 3 + haskell/docs/decisions/0.2-AI-MANIFEST.a2ml | 11 + haskell/docs/decisions/0000-template.adoc | 35 + .../decisions/0001-adopt-rsr-standard.adoc | 86 + haskell/docs/decisions/README.adoc | 1 + haskell/docs/developer/0.2-AI-MANIFEST.a2ml | 11 + haskell/docs/developer/ABI-FFI-README.adoc | 384 + haskell/docs/developer/README.adoc | 1 + haskell/docs/governance/0.1-AI-MANIFEST.a2ml | 21 + haskell/docs/governance/CRG-CRITERIA.a2ml | 108 + haskell/docs/governance/CRG-CRITERIA.adoc | 39 + .../governance/MAINTENANCE-CHECKLIST.a2ml | 159 + .../governance/MAINTENANCE-CHECKLIST.adoc | 569 + haskell/docs/governance/README.adoc | 1 + .../SOFTWARE-DEVELOPMENT-APPROACH.a2ml | 53 + .../SOFTWARE-DEVELOPMENT-APPROACH.adoc | 63 + haskell/docs/governance/TSDM.a2ml | 22 + haskell/docs/governance/TSDM.adoc | 26 + .../governance/audit/0.2-AI-MANIFEST.a2ml | 11 + haskell/docs/governance/audit/README.adoc | 1 + .../audit/compliance/0.3-AI-MANIFEST.a2ml | 11 + .../governance/audit/compliance/README.adoc | 1 + .../audit/effects/0.3-AI-MANIFEST.a2ml | 11 + .../docs/governance/audit/effects/README.adoc | 1 + .../audit/systems/0.3-AI-MANIFEST.a2ml | 11 + .../docs/governance/audit/systems/README.adoc | 1 + .../maintenance/0.2-AI-MANIFEST.a2ml | 11 + .../docs/governance/maintenance/README.adoc | 1 + .../maintenance/adaptive/0.3-AI-MANIFEST.a2ml | 11 + .../maintenance/adaptive/README.adoc | 1 + .../corrective/0.3-AI-MANIFEST.a2ml | 11 + .../maintenance/corrective/README.adoc | 1 + .../perfective/0.3-AI-MANIFEST.a2ml | 11 + .../maintenance/perfective/README.adoc | 1 + .../governance/planning/0.2-AI-MANIFEST.a2ml | 11 + haskell/docs/governance/planning/README.adoc | 1 + .../planning/could/0.3-AI-MANIFEST.a2ml | 11 + .../governance/planning/could/README.adoc | 1 + .../planning/must/0.3-AI-MANIFEST.a2ml | 11 + .../docs/governance/planning/must/README.adoc | 1 + .../planning/should/0.3-AI-MANIFEST.a2ml | 11 + .../governance/planning/should/README.adoc | 1 + haskell/docs/legal/0.2-AI-MANIFEST.a2ml | 16 + haskell/docs/legal/EXHIBIT-A-ETHICAL-USE.txt | 68 + haskell/docs/legal/EXHIBIT-B-QUANTUM-SAFE.txt | 102 + haskell/docs/practice/.gitkeep | 0 haskell/docs/practice/0.2-AI-MANIFEST.a2ml | 11 + haskell/docs/practice/AI-CONVENTIONS.adoc | 85 + haskell/docs/practice/README.adoc | 1 + .../docs/practice/STATE-VISUALIZER-GUIDE.adoc | 155 + haskell/docs/reports/0.2-AI-MANIFEST.a2ml | 19 + haskell/docs/reports/README.adoc | 1 + .../reports/compliance/0.3-AI-MANIFEST.a2ml | 11 + haskell/docs/reports/compliance/README.adoc | 1 + .../reports/maintenance/0.3-AI-MANIFEST.a2ml | 11 + haskell/docs/reports/maintenance/README.adoc | 1 + .../reports/performance/0.3-AI-MANIFEST.a2ml | 11 + haskell/docs/reports/performance/README.adoc | 1 + .../docs/reports/quality/0.3-AI-MANIFEST.a2ml | 11 + haskell/docs/reports/quality/README.adoc | 1 + .../reports/security/0.3-AI-MANIFEST.a2ml | 11 + haskell/docs/reports/security/README.adoc | 1 + haskell/docs/standards/0.2-AI-MANIFEST.a2ml | 11 + haskell/docs/standards/README.adoc | 1 + .../docs/templates/contractiles/README.adoc | 11 + .../templates/contractiles/dust/Dustfile.a2ml | 11 + .../contractiles/lust/Intentfile.a2ml | 11 + .../templates/contractiles/must/Mustfile.a2ml | 11 + .../contractiles/trust/Trustfile.a2ml | 11 + haskell/docs/theory/.gitkeep | 0 haskell/docs/theory/0.2-AI-MANIFEST.a2ml | 23 + haskell/docs/theory/README.adoc | 1 + .../theory/computing/0.3-AI-MANIFEST.a2ml | 11 + haskell/docs/theory/computing/README.adoc | 1 + .../theory/formalisms/0.3-AI-MANIFEST.a2ml | 11 + haskell/docs/theory/formalisms/README.adoc | 1 + .../theory/mathematics/0.3-AI-MANIFEST.a2ml | 11 + haskell/docs/theory/mathematics/README.adoc | 1 + .../theory/ontologies/0.3-AI-MANIFEST.a2ml | 11 + haskell/docs/theory/ontologies/README.adoc | 1 + .../docs/theory/other/0.3-AI-MANIFEST.a2ml | 11 + haskell/docs/theory/other/README.adoc | 1 + .../socio-technical/0.3-AI-MANIFEST.a2ml | 11 + .../docs/theory/socio-technical/README.adoc | 1 + haskell/docs/whitepapers/0.2-AI-MANIFEST.a2ml | 20 + haskell/docs/whitepapers/README.adoc | 1 + haskell/docs/whitepapers/academic/.gitkeep | 0 .../whitepapers/academic/0.3-AI-MANIFEST.a2ml | 11 + haskell/docs/whitepapers/academic/README.adoc | 1 + haskell/docs/whitepapers/industry/.gitkeep | 0 .../whitepapers/industry/0.3-AI-MANIFEST.a2ml | 11 + haskell/docs/whitepapers/industry/README.adoc | 1 + .../whitepapers/outreach/0.3-AI-MANIFEST.a2ml | 16 + haskell/docs/whitepapers/outreach/README.adoc | 17 + haskell/docs/wikis/0.2-AI-MANIFEST.a2ml | 15 + haskell/docs/wikis/README.adoc | 15 + haskell/eclexiaiser.toml | 19 + haskell/examples/0.1-AI-MANIFEST.a2ml | 1 + haskell/examples/README.adoc | 1 + haskell/examples/SafeDOMExample.res | 109 + haskell/examples/web-project-deno.json | 20 + haskell/features/0.1-AI-MANIFEST.a2ml | 17 + haskell/features/README.adoc | 1 + .../features/boj-server/0.2-AI-MANIFEST.a2ml | 11 + haskell/features/boj-server/README.adoc | 14 + .../panic-attacker/0.2-AI-MANIFEST.a2ml | 11 + haskell/features/panic-attacker/README.adoc | 25 + haskell/features/ssg/0.2-AI-MANIFEST.a2ml | 11 + haskell/features/ssg/README.adoc | 1 + haskell/features/ssg/ssg-bootstrap.sh | 48 + haskell/guix.scm | 71 + haskell/k9iser.toml | 37 + haskell/llm-warmup-dev.md | 16 + haskell/llm-warmup-user.md | 16 + haskell/mise.toml | 57 + haskell/selur-compose.toml | 17 + haskell/setup.sh | 64 + haskell/src/0.1-AI-MANIFEST.a2ml | 27 + haskell/src/Data/A2ML.hs | 32 + haskell/src/Data/A2ML/Parser.hs | 195 + haskell/src/Data/A2ML/Renderer.hs | 69 + haskell/src/Data/A2ML/Types.hs | 141 + haskell/src/README.adoc | 1 + haskell/src/aspects/0.2-AI-MANIFEST.a2ml | 17 + haskell/src/aspects/README.adoc | 1 + .../aspects/integrity/0.3-AI-MANIFEST.a2ml | 11 + haskell/src/aspects/integrity/README.adoc | 1 + .../observability/0.3-AI-MANIFEST.a2ml | 11 + haskell/src/aspects/observability/README.adoc | 1 + .../src/aspects/security/0.3-AI-MANIFEST.a2ml | 11 + haskell/src/aspects/security/README.adoc | 1 + haskell/src/bridges/0.2-AI-MANIFEST.a2ml | 11 + haskell/src/contracts/0.2-AI-MANIFEST.a2ml | 11 + haskell/src/contracts/README.adoc | 1 + haskell/src/core/0.2-AI-MANIFEST.a2ml | 11 + haskell/src/definitions/0.2-AI-MANIFEST.a2ml | 11 + haskell/src/definitions/README.adoc | 1 + haskell/src/errors/0.2-AI-MANIFEST.a2ml | 11 + haskell/src/errors/README.adoc | 1 + haskell/src/interface/0.2-AI-MANIFEST.a2ml | 24 + haskell/src/interface/README.adoc | 1 + .../src/interface/abi/0.3-AI-MANIFEST.a2ml | 11 + haskell/src/interface/abi/README.adoc | 1 + .../src/interface/ffi/0.3-AI-MANIFEST.a2ml | 11 + haskell/src/interface/ffi/README.adoc | 1 + haskell/src/interface/ffi/build.zig | 94 + .../interface/ffi/src/0.4-AI-MANIFEST.a2ml | 11 + haskell/src/interface/ffi/src/README.adoc | 1 + haskell/src/interface/ffi/src/main.zig | 274 + .../interface/ffi/test/0.4-AI-MANIFEST.a2ml | 11 + haskell/src/interface/ffi/test/README.adoc | 1 + .../interface/ffi/test/integration_test.zig | 182 + .../interface/generated/0.3-AI-MANIFEST.a2ml | 11 + haskell/src/interface/generated/README.adoc | 1 + haskell/src/interface/generated/abi/.gitkeep | 0 .../generated/abi/0.4-AI-MANIFEST.a2ml | 11 + .../src/interface/generated/abi/README.adoc | 1 + haskell/stapeln.toml | 87 + haskell/tests/E2ESpec.hs | 108 + haskell/tests/PropertySpec.hs | 141 + haskell/tests/Spec.hs | 18 + haskell/tests/UnitSpec.hs | 110 + haskell/tests/fuzz/placeholder.txt | 1 + haskell/verification/0.1-AI-MANIFEST.a2ml | 27 + haskell/verification/README.adoc | 1 + .../benchmarks/0.2-AI-MANIFEST.a2ml | 11 + haskell/verification/benchmarks/README.adoc | 1 + .../coverage/0.2-AI-MANIFEST.a2ml | 12 + haskell/verification/coverage/README.adoc | 1 + .../verification/fuzzing/0.2-AI-MANIFEST.a2ml | 11 + haskell/verification/fuzzing/README.adoc | 1 + .../verification/proofs/0.2-AI-MANIFEST.a2ml | 11 + haskell/verification/proofs/README.adoc | 1 + .../safety_case/0.2-AI-MANIFEST.a2ml | 12 + haskell/verification/safety_case/README.adoc | 1 + .../simulations/0.2-AI-MANIFEST.a2ml | 11 + haskell/verification/simulations/README.adoc | 1 + .../verification/tests/0.2-AI-MANIFEST.a2ml | 1 + haskell/verification/tests/README.adoc | 1 + .../traceability/0.2-AI-MANIFEST.a2ml | 12 + haskell/verification/traceability/README.adoc | 1 + rs/.devcontainer/Containerfile | 32 + rs/.devcontainer/README.adoc | 27 + rs/.devcontainer/devcontainer.json | 69 + rs/.editorconfig | 65 + rs/.envrc | 27 + rs/.guix-channel | 22 + rs/.machine_readable/0.1-AI-MANIFEST.a2ml | 29 + rs/.machine_readable/6a2/AGENTIC.a2ml | 36 + rs/.machine_readable/6a2/ECOSYSTEM.a2ml | 26 + rs/.machine_readable/6a2/META.a2ml | 53 + rs/.machine_readable/6a2/NEUROSYM.a2ml | 23 + rs/.machine_readable/6a2/PLAYBOOK.a2ml | 35 + rs/.machine_readable/6a2/STATE.a2ml | 64 + rs/.machine_readable/ADJUST.contractile | 126 + rs/.machine_readable/CLADE.a2ml | 47 + rs/.machine_readable/ENSAID_CONFIG.a2ml | 96 + rs/.machine_readable/INTENT.contractile | 72 + rs/.machine_readable/MUST.contractile | 91 + rs/.machine_readable/README.adoc | 1 + rs/.machine_readable/TRUST.contractile | 80 + .../agent_instructions/README.adoc | 41 + .../agent_instructions/coverage.a2ml | 61 + .../agent_instructions/debt.a2ml | 49 + .../agent_instructions/methodology.a2ml | 107 + rs/.machine_readable/ai/.clinerules | 43 + rs/.machine_readable/ai/.cursorrules | 47 + rs/.machine_readable/ai/.windsurfrules | 43 + rs/.machine_readable/ai/0.2-AI-MANIFEST.a2ml | 11 + rs/.machine_readable/ai/AI.a2ml | 16 + rs/.machine_readable/ai/PLACEHOLDERS.adoc | 142 + rs/.machine_readable/ai/README.adoc | 22 + .../anchors/0.2-AI-MANIFEST.a2ml | 11 + rs/.machine_readable/anchors/ANCHOR.a2ml | 62 + rs/.machine_readable/anchors/README.adoc | 1 + rs/.machine_readable/compliance/reuse/dep5 | 54 + .../compliance/rust/deny.toml | 65 + .../configs/0.2-AI-MANIFEST.a2ml | 11 + rs/.machine_readable/configs/README.adoc | 1 + .../configs/git-cliff/cliff.toml | 119 + rs/.machine_readable/contractiles/README.adoc | 19 + .../contractiles/bust/Bustfile.a2ml | 28 + .../contractiles/bust/bust.ncl | 66 + .../contractiles/dust/Dustfile.a2ml | 44 + .../contractiles/must/Mustfile.a2ml | 69 + .../contractiles/trust/Trustfile.a2ml | 50 + .../integrations/feedback-o-tron.a2ml | 13 + rs/.machine_readable/integrations/proven.a2ml | 18 + .../integrations/verisimdb.a2ml | 15 + .../integrations/vexometer.a2ml | 18 + .../policies/.maintenance-perms-ignore | 5 + .../policies/0.2-AI-MANIFEST.a2ml | 11 + .../policies/MAINTENANCE-AXES.a2ml | 54 + .../policies/MAINTENANCE-CHECKLIST.a2ml | 159 + rs/.machine_readable/policies/README.adoc | 1 + .../SOFTWARE-DEVELOPMENT-APPROACH.a2ml | 53 + .../scripts/0.2-AI-MANIFEST.a2ml | 18 + .../scripts/forge/0.3-AI-MANIFEST.a2ml | 11 + .../scripts/forge/README.adoc | 1 + .../scripts/forge/forge-sync.sh | 25 + .../scripts/forge/git-cleanup.sh | 8 + .../scripts/lifecycle/0.3-AI-MANIFEST.a2ml | 11 + .../scripts/lifecycle/README.adoc | 1 + .../scripts/lifecycle/install-tools.sh | 27 + .../scripts/maintenance/maint-assault.sh | 44 + .../scripts/verification/0.3-AI-MANIFEST.a2ml | 11 + .../scripts/verification/README.adoc | 1 + rs/.machine_readable/svc/k9/README.adoc | 177 + .../svc/k9/examples/ci-config.k9.ncl | 126 + .../svc/k9/examples/project-metadata.k9.ncl | 57 + .../svc/k9/examples/setup-repo.k9.ncl | 167 + .../svc/k9/template-hunt.k9.ncl | 136 + .../svc/k9/template-kennel.k9.ncl | 54 + .../svc/k9/template-yard.k9.ncl | 84 + rs/.tool-versions | 2 + rs/.well-known/ai.txt | 18 + rs/.well-known/humans.txt | 14 + rs/.well-known/security.txt | 11 + rs/0-AI-MANIFEST.a2ml | 121 + rs/ARCHITECTURE.md | 47 + rs/CHANGELOG.md | 14 + rs/CODE_OF_CONDUCT.md | 27 + rs/CONTRIBUTING.md | 66 + rs/Cargo.lock | 584 + rs/Cargo.toml | 32 + rs/Containerfile | 41 + rs/EXPLAINME.adoc | 160 + rs/GOVERNANCE.md | 60 + rs/Justfile | 1043 + rs/LICENSE | 373 + rs/LICENSES/AGPL-3.0-or-later.txt | 661 + rs/LICENSES/CC-BY-SA-4.0.txt | 428 + rs/LICENSES/MPL-2.0.txt | 373 + rs/MAINTAINERS | 43 + rs/QUICKSTART-DEV.adoc | 39 + rs/QUICKSTART-MAINTAINER.adoc | 40 + rs/QUICKSTART-USER.adoc | 33 + rs/README.md | 73 + rs/ROADMAP.adoc | 22 + rs/SECURITY.md | 20 + rs/TEST-NEEDS.md | 63 + rs/TOPOLOGY.md | 31 + rs/benches/a2ml_bench.rs | 349 + rs/container/.gatekeeper.yaml | 122 + rs/container/0.1-AI-MANIFEST.a2ml | 143 + rs/container/Containerfile | 136 + rs/container/README.adoc | 179 + rs/container/compose.example.toml | 135 + rs/container/compose.toml | 70 + rs/container/ct-build.sh | 162 + rs/container/deploy.k9.ncl | 166 + rs/container/entrypoint.sh | 63 + rs/container/manifest.toml | 62 + rs/container/vordr.toml | 100 + rs/contractile.just | 75 + rs/contractiles/intend/Intentfile.a2ml | 22 + rs/contractiles/must/Mustfile.a2ml | 42 + rs/contractiles/trust/Trustfile.a2ml | 25 + rs/docs/0.1-AI-MANIFEST.a2ml | 33 + rs/docs/QUICKSTART.adoc | 24 + rs/docs/README.adoc | 14 + rs/docs/RSR_OUTLINE.adoc | 290 + rs/docs/STATE-VISUALIZER.adoc | 128 + rs/docs/architecture/0.2-AI-MANIFEST.a2ml | 17 + rs/docs/architecture/THREAT-MODEL.adoc | 162 + rs/docs/attribution/0.2-AI-MANIFEST.a2ml | 11 + rs/docs/attribution/CITATION.cff | 17 + rs/docs/attribution/CITATIONS.adoc | 35 + rs/docs/attribution/CODEOWNERS.adoc | 19 + rs/docs/attribution/MAINTAINERS.adoc | 47 + rs/docs/attribution/README.adoc | 1 + rs/docs/decisions/0.2-AI-MANIFEST.a2ml | 11 + rs/docs/decisions/0000-template.adoc | 35 + .../decisions/0001-adopt-rsr-standard.adoc | 86 + rs/docs/decisions/README.adoc | 1 + rs/docs/developer/0.2-AI-MANIFEST.a2ml | 11 + rs/docs/developer/ABI-FFI-README.adoc | 384 + rs/docs/developer/README.adoc | 1 + rs/docs/governance/0.1-AI-MANIFEST.a2ml | 21 + rs/docs/governance/CRG-CRITERIA.a2ml | 108 + rs/docs/governance/CRG-CRITERIA.adoc | 39 + rs/docs/governance/MAINTENANCE-CHECKLIST.a2ml | 159 + rs/docs/governance/MAINTENANCE-CHECKLIST.adoc | 569 + rs/docs/governance/README.adoc | 1 + .../SOFTWARE-DEVELOPMENT-APPROACH.a2ml | 53 + .../SOFTWARE-DEVELOPMENT-APPROACH.adoc | 63 + rs/docs/governance/TSDM.a2ml | 22 + rs/docs/governance/TSDM.adoc | 26 + rs/docs/governance/audit/0.2-AI-MANIFEST.a2ml | 11 + rs/docs/governance/audit/README.adoc | 1 + .../audit/compliance/0.3-AI-MANIFEST.a2ml | 11 + .../governance/audit/compliance/README.adoc | 1 + .../audit/effects/0.3-AI-MANIFEST.a2ml | 11 + rs/docs/governance/audit/effects/README.adoc | 1 + .../audit/systems/0.3-AI-MANIFEST.a2ml | 11 + rs/docs/governance/audit/systems/README.adoc | 1 + .../maintenance/0.2-AI-MANIFEST.a2ml | 11 + rs/docs/governance/maintenance/README.adoc | 1 + .../maintenance/adaptive/0.3-AI-MANIFEST.a2ml | 11 + .../maintenance/adaptive/README.adoc | 1 + .../corrective/0.3-AI-MANIFEST.a2ml | 11 + .../maintenance/corrective/README.adoc | 1 + .../perfective/0.3-AI-MANIFEST.a2ml | 11 + .../maintenance/perfective/README.adoc | 1 + .../governance/planning/0.2-AI-MANIFEST.a2ml | 11 + rs/docs/governance/planning/README.adoc | 1 + .../planning/could/0.3-AI-MANIFEST.a2ml | 11 + rs/docs/governance/planning/could/README.adoc | 1 + .../planning/must/0.3-AI-MANIFEST.a2ml | 11 + rs/docs/governance/planning/must/README.adoc | 1 + .../planning/should/0.3-AI-MANIFEST.a2ml | 11 + .../governance/planning/should/README.adoc | 1 + rs/docs/legal/0.2-AI-MANIFEST.a2ml | 16 + rs/docs/legal/EXHIBIT-A-ETHICAL-USE.txt | 68 + rs/docs/legal/EXHIBIT-B-QUANTUM-SAFE.txt | 102 + rs/docs/practice/.gitkeep | 0 rs/docs/practice/0.2-AI-MANIFEST.a2ml | 11 + rs/docs/practice/AI-CONVENTIONS.adoc | 85 + rs/docs/practice/README.adoc | 1 + rs/docs/practice/STATE-VISUALIZER-GUIDE.adoc | 155 + rs/docs/reports/0.2-AI-MANIFEST.a2ml | 19 + rs/docs/reports/README.adoc | 1 + .../reports/compliance/0.3-AI-MANIFEST.a2ml | 11 + rs/docs/reports/compliance/README.adoc | 1 + .../reports/maintenance/0.3-AI-MANIFEST.a2ml | 11 + rs/docs/reports/maintenance/README.adoc | 1 + .../reports/performance/0.3-AI-MANIFEST.a2ml | 11 + rs/docs/reports/performance/README.adoc | 1 + rs/docs/reports/quality/0.3-AI-MANIFEST.a2ml | 11 + rs/docs/reports/quality/README.adoc | 1 + rs/docs/reports/security/0.3-AI-MANIFEST.a2ml | 11 + rs/docs/reports/security/README.adoc | 1 + rs/docs/standards/0.2-AI-MANIFEST.a2ml | 11 + rs/docs/standards/README.adoc | 1 + rs/docs/templates/contractiles/README.adoc | 11 + .../templates/contractiles/dust/Dustfile.a2ml | 11 + .../templates/contractiles/must/Mustfile.a2ml | 11 + .../contractiles/trust/Trustfile.a2ml | 11 + rs/docs/theory/.gitkeep | 0 rs/docs/theory/0.2-AI-MANIFEST.a2ml | 23 + rs/docs/theory/README.adoc | 1 + rs/docs/theory/computing/0.3-AI-MANIFEST.a2ml | 11 + rs/docs/theory/computing/README.adoc | 1 + .../theory/formalisms/0.3-AI-MANIFEST.a2ml | 11 + rs/docs/theory/formalisms/README.adoc | 1 + .../theory/mathematics/0.3-AI-MANIFEST.a2ml | 11 + rs/docs/theory/mathematics/README.adoc | 1 + .../theory/ontologies/0.3-AI-MANIFEST.a2ml | 11 + rs/docs/theory/ontologies/README.adoc | 1 + rs/docs/theory/other/0.3-AI-MANIFEST.a2ml | 11 + rs/docs/theory/other/README.adoc | 1 + .../socio-technical/0.3-AI-MANIFEST.a2ml | 11 + rs/docs/theory/socio-technical/README.adoc | 1 + rs/docs/whitepapers/0.2-AI-MANIFEST.a2ml | 20 + rs/docs/whitepapers/README.adoc | 1 + rs/docs/whitepapers/academic/.gitkeep | 0 .../whitepapers/academic/0.3-AI-MANIFEST.a2ml | 11 + rs/docs/whitepapers/academic/README.adoc | 1 + rs/docs/whitepapers/industry/.gitkeep | 0 .../whitepapers/industry/0.3-AI-MANIFEST.a2ml | 11 + rs/docs/whitepapers/industry/README.adoc | 1 + .../whitepapers/outreach/0.3-AI-MANIFEST.a2ml | 16 + rs/docs/whitepapers/outreach/README.adoc | 17 + rs/docs/wikis/0.2-AI-MANIFEST.a2ml | 15 + rs/docs/wikis/README.adoc | 15 + rs/eclexiaiser.toml | 19 + rs/examples/0.1-AI-MANIFEST.a2ml | 1 + rs/examples/README.adoc | 1 + rs/examples/SafeDOMExample.res | 109 + rs/examples/web-project-deno.json | 20 + rs/features/0.1-AI-MANIFEST.a2ml | 17 + rs/features/README.adoc | 1 + rs/features/boj-server/0.2-AI-MANIFEST.a2ml | 11 + rs/features/boj-server/README.adoc | 14 + .../panic-attacker/0.2-AI-MANIFEST.a2ml | 11 + rs/features/panic-attacker/README.adoc | 25 + rs/features/ssg/0.2-AI-MANIFEST.a2ml | 11 + rs/features/ssg/README.adoc | 1 + rs/features/ssg/ssg-bootstrap.sh | 48 + rs/generated/idrisiser/a2ml_rs_verified.ipkg | 8 + rs/generated/idrisiser/build.sh | 20 + .../idris2/A2ml/Verified/document_parser.idr | 250 + .../idris2/A2ml/Verified/document_types.idr | 241 + .../idris2/A2ml/Verified/round_trip.idr | 113 + rs/generated/idrisiser/zig/a2ml_rs_ffi.zig | 113 + rs/guix.scm | 71 + rs/idrisiser.toml | 91 + rs/idrisiser/parser.tsig | 7 + rs/idrisiser/round-trip.tsig | 5 + rs/idrisiser/types.tsig | 7 + rs/k9iser.toml | 41 + rs/llm-warmup-dev.md | 16 + rs/llm-warmup-user.md | 16 + rs/mise.toml | 57 + rs/selur-compose.toml | 17 + rs/setup.sh | 64 + rs/src/error.rs | 77 + rs/src/lib.rs | 38 + rs/src/parser.rs | 561 + rs/src/renderer.rs | 269 + rs/src/types.rs | 293 + rs/stapeln.toml | 87 + rs/tests/aspect_test.rs | 239 + rs/tests/e2e_test.rs | 326 + rs/tests/fuzz/placeholder.txt | 1 + rs/tests/property_test.rs | 264 + rs/verification/0.1-AI-MANIFEST.a2ml | 27 + rs/verification/README.adoc | 1 + .../benchmarks/0.2-AI-MANIFEST.a2ml | 11 + rs/verification/benchmarks/README.adoc | 1 + rs/verification/coverage/0.2-AI-MANIFEST.a2ml | 12 + rs/verification/coverage/README.adoc | 1 + rs/verification/fuzzing/0.2-AI-MANIFEST.a2ml | 11 + rs/verification/fuzzing/README.adoc | 1 + rs/verification/proofs/0.2-AI-MANIFEST.a2ml | 11 + rs/verification/proofs/README.adoc | 1 + .../safety_case/0.2-AI-MANIFEST.a2ml | 12 + rs/verification/safety_case/README.adoc | 1 + .../simulations/0.2-AI-MANIFEST.a2ml | 11 + rs/verification/simulations/README.adoc | 1 + rs/verification/tests/0.2-AI-MANIFEST.a2ml | 1 + rs/verification/tests/README.adoc | 1 + .../traceability/0.2-AI-MANIFEST.a2ml | 12 + rs/verification/traceability/README.adoc | 1 + showcase/.editorconfig | 65 + showcase/.machine_readable/6a2/STATE.a2ml | 17 + showcase/.machine_readable/ADJUST.contractile | 126 + showcase/.machine_readable/INTENT.contractile | 72 + showcase/.machine_readable/MUST.contractile | 91 + showcase/.machine_readable/STATE.a2ml | 37 + showcase/.machine_readable/TRUST.contractile | 80 + .../agent_instructions/README.adoc | 41 + .../agent_instructions/coverage.a2ml | 61 + .../agent_instructions/debt.a2ml | 49 + .../agent_instructions/methodology.a2ml | 107 + .../.machine_readable/anchors/ANCHOR.a2ml | 18 + .../contractiles/adjust/adjustfile.a2ml | 15 + .../contractiles/bust/Bustfile.a2ml | 28 + .../contractiles/bust/bust.ncl | 66 + .../contractiles/dust/Dustfile.a2ml | 22 + .../contractiles/dust/dustfile.a2ml | 15 + .../contractiles/intend/intendfile.a2ml | 15 + .../contractiles/lust/lustfile.a2ml | 15 + .../contractiles/must/mustfile.a2ml | 15 + .../contractiles/trust/Trustfile.a2ml | 22 + .../contractiles/trust/trustfile.a2ml | 15 + .../integrations/feedback-o-tron.a2ml | 13 + .../integrations/proven.a2ml | 18 + .../integrations/verisimdb.a2ml | 15 + .../integrations/vexometer.a2ml | 18 + showcase/.well-known/ai.txt | 18 + showcase/.well-known/humans.txt | 14 + showcase/.well-known/security.txt | 28 + showcase/0-AI-MANIFEST.a2ml | 26 + showcase/ARCHITECTURE.md | 47 + showcase/CODE_OF_CONDUCT.md | 27 + showcase/CONTRIBUTING.md | 66 + showcase/EXPLAINME.adoc | 205 + showcase/GOVERNANCE.md | 60 + showcase/Justfile | 80 + showcase/LICENSE | 373 + showcase/LICENSES/AGPL-3.0-or-later.txt | 661 + showcase/LICENSES/CC-BY-SA-4.0.txt | 428 + showcase/LICENSES/MPL-2.0.txt | 373 + showcase/MAINTAINERS | 43 + showcase/QUICKSTART-DEV.adoc | 39 + showcase/QUICKSTART-MAINTAINER.adoc | 40 + showcase/QUICKSTART-USER.adoc | 33 + showcase/README.md | 27 + showcase/SECURITY.md | 16 + showcase/TEST-NEEDS.md | 136 + showcase/TOPOLOGY.md | 23 + showcase/a2ml-showcase-tests.ipkg | 19 + showcase/content/examples.md | 267 + showcase/content/getting-started.md | 226 + showcase/content/index.md | 69 + showcase/content/integrations.md | 145 + showcase/content/specification.md | 248 + showcase/contractile.just | 75 + showcase/contractiles/intend/Intentfile.a2ml | 22 + showcase/contractiles/must/Mustfile.a2ml | 42 + showcase/contractiles/trust/Trustfile.a2ml | 25 + showcase/docs/accessibility/README.adoc | 42 + showcase/docs/accessibility/STANDARD.a2ml | 318 + showcase/docs/compliance/ACCESSIBILITY.adoc | 26 + showcase/guix.scm | 18 + showcase/k9iser.toml | 27 + showcase/llm-warmup-dev.md | 16 + showcase/llm-warmup-user.md | 16 + showcase/mise.toml | 57 + showcase/output/.well-known/security.txt | 28 + showcase/output/examples.html | 672 + showcase/output/getting-started.html | 594 + showcase/output/index.html | 463 + showcase/output/integrations.html | 531 + showcase/output/specification.html | 596 + showcase/setup.sh | 64 + showcase/stapeln.toml | 8 + showcase/template.html | 428 + showcase/tests/README.md | 8 + showcase/tests/fuzz/placeholder.txt | 1 + showcase/tests/idris2/Main.idr | 27 + showcase/tests/idris2/Test/Spec.idr | 112 + showcase/tests/idris2/ValidateTest.idr | 254 + validate-action/.devcontainer/Containerfile | 32 + validate-action/.devcontainer/README.adoc | 27 + .../.devcontainer/devcontainer.json | 69 + validate-action/.editorconfig | 62 + validate-action/.envrc | 22 + validate-action/.guix-channel | 22 + .../.machine_readable/0.1-AI-MANIFEST.a2ml | 29 + validate-action/.machine_readable/CLADE.a2ml | 47 + .../.machine_readable/ENSAID_CONFIG.a2ml | 96 + validate-action/.machine_readable/README.adoc | 1 + .../.machine_readable/ai/.clinerules | 43 + .../.machine_readable/ai/.cursorrules | 47 + .../.machine_readable/ai/.windsurfrules | 43 + .../.machine_readable/ai/0.2-AI-MANIFEST.a2ml | 11 + validate-action/.machine_readable/ai/AI.a2ml | 16 + .../.machine_readable/ai/PLACEHOLDERS.adoc | 142 + .../.machine_readable/ai/README.adoc | 24 + .../bot_directives/README.adoc | 41 + .../bot_directives/coverage.a2ml | 61 + .../bot_directives/debt.a2ml | 49 + .../bot_directives/methodology.a2ml | 107 + .../.machine_readable/compliance/reuse/dep5 | 54 + .../compliance/rust/deny.toml | 65 + .../configs/0.2-AI-MANIFEST.a2ml | 11 + .../.machine_readable/configs/README.adoc | 1 + .../configs/git-cliff/cliff.toml | 119 + .../.machine_readable/contractiles/INDEX.a2ml | 133 + .../.machine_readable/contractiles/_base.ncl | 141 + .../contractiles/adjust/Adjustfile.a2ml | 58 + .../contractiles/adjust/adjust.k9.ncl | 166 + .../contractiles/adjust/adjust.manifest.a2ml | 47 + .../contractiles/adjust/adjust.ncl | 62 + .../contractiles/bust/Bustfile.a2ml | 46 + .../contractiles/bust/bust.k9.ncl | 160 + .../contractiles/bust/bust.manifest.a2ml | 48 + .../contractiles/bust/bust.ncl | 66 + .../contractiles/dust/Dustfile.a2ml | 68 + .../contractiles/dust/dust.k9.ncl | 171 + .../contractiles/dust/dust.manifest.a2ml | 51 + .../contractiles/dust/dust.ncl | 66 + .../contractiles/intend/Intentfile.a2ml | 123 + .../contractiles/intend/intend.k9.ncl | 250 + .../contractiles/intend/intend.manifest.a2ml | 73 + .../contractiles/intend/intend.ncl | 81 + .../contractiles/must/Mustfile.a2ml | 110 + .../contractiles/must/must.k9.ncl | 236 + .../contractiles/must/must.manifest.a2ml | 59 + .../contractiles/must/must.ncl | 64 + .../contractiles/trust/Trustfile.a2ml | 1124 + .../contractiles/trust/trust.k9.ncl | 276 + .../contractiles/trust/trust.manifest.a2ml | 72 + .../contractiles/trust/trust.ncl | 88 + .../descriptiles/AGENTIC.a2ml | 36 + .../descriptiles/ECOSYSTEM.a2ml | 26 + .../.machine_readable/descriptiles/META.a2ml | 53 + .../descriptiles/NEUROSYM.a2ml | 23 + .../descriptiles/PLAYBOOK.a2ml | 35 + .../.machine_readable/descriptiles/STATE.a2ml | 64 + .../descriptiles/anchors/0.2-AI-MANIFEST.a2ml | 11 + .../descriptiles/anchors/ANCHOR.a2ml | 62 + .../descriptiles/anchors/README.adoc | 1 + .../integrations/feedback-o-tron.a2ml | 13 + .../integrations/proven.a2ml | 18 + .../integrations/verisimdb.a2ml | 15 + .../integrations/vexometer.a2ml | 18 + .../policies/.maintenance-perms-ignore | 5 + .../policies/0.2-AI-MANIFEST.a2ml | 11 + .../policies/MAINTENANCE-AXES.a2ml | 54 + .../policies/MAINTENANCE-CHECKLIST.a2ml | 159 + .../.machine_readable/policies/README.adoc | 1 + .../SOFTWARE-DEVELOPMENT-APPROACH.a2ml | 53 + .../scripts/0.2-AI-MANIFEST.a2ml | 18 + .../scripts/forge/0.3-AI-MANIFEST.a2ml | 11 + .../scripts/forge/README.adoc | 1 + .../scripts/forge/forge-sync.sh | 25 + .../scripts/forge/git-cleanup.sh | 8 + .../scripts/lifecycle/0.3-AI-MANIFEST.a2ml | 11 + .../scripts/lifecycle/README.adoc | 1 + .../scripts/lifecycle/install-tools.sh | 27 + .../scripts/maintenance/maint-assault.sh | 44 + .../scripts/verification/0.3-AI-MANIFEST.a2ml | 11 + .../scripts/verification/README.adoc | 1 + validate-action/.tool-versions | 9 + validate-action/.well-known/ai.txt | 18 + validate-action/.well-known/humans.txt | 14 + validate-action/.well-known/security.txt | 11 + validate-action/0-AI-MANIFEST.a2ml | 121 + validate-action/ARCHITECTURE.md | 47 + validate-action/CHANGELOG.md | 23 + validate-action/CODE_OF_CONDUCT.md | 27 + validate-action/CONTRIBUTING.md | 66 + validate-action/Containerfile | 41 + validate-action/EXPLAINME.adoc | 25 + validate-action/GOVERNANCE.adoc | 94 + validate-action/GOVERNANCE.md | 60 + validate-action/Justfile | 1022 + validate-action/LICENSE | 373 + .../LICENSES/AGPL-3.0-or-later.txt | 661 + validate-action/LICENSES/CC-BY-SA-4.0.txt | 428 + validate-action/LICENSES/MPL-2.0.txt | 373 + validate-action/MAINTAINERS | 43 + validate-action/MAINTAINERS.adoc | 49 + validate-action/PROOF-NEEDS.md | 10 + validate-action/QUICKSTART-DEV.adoc | 39 + validate-action/QUICKSTART-MAINTAINER.adoc | 40 + validate-action/QUICKSTART-USER.adoc | 33 + validate-action/README.md | 93 + validate-action/ROADMAP.adoc | 23 + validate-action/SECURITY.md | 20 + validate-action/TEST-NEEDS.md | 33 + validate-action/TOPOLOGY.md | 29 + validate-action/action.yml | 74 + validate-action/container/.gatekeeper.yaml | 122 + .../container/0.1-AI-MANIFEST.a2ml | 143 + validate-action/container/Containerfile | 136 + validate-action/container/README.adoc | 179 + .../container/compose.example.toml | 135 + validate-action/container/compose.toml | 70 + validate-action/container/ct-build.sh | 162 + validate-action/container/deploy.k9.ncl | 166 + validate-action/container/entrypoint.sh | 63 + validate-action/container/manifest.toml | 62 + validate-action/container/vordr.toml | 100 + validate-action/contractile.just | 75 + validate-action/docs/0.1-AI-MANIFEST.a2ml | 33 + validate-action/docs/QUICKSTART.adoc | 24 + validate-action/docs/README.adoc | 14 + validate-action/docs/RSR_OUTLINE.adoc | 290 + validate-action/docs/STATE-VISUALIZER.adoc | 128 + .../docs/architecture/0.2-AI-MANIFEST.a2ml | 17 + .../docs/architecture/THREAT-MODEL.adoc | 162 + .../docs/attribution/0.2-AI-MANIFEST.a2ml | 11 + validate-action/docs/attribution/CITATION.cff | 17 + .../docs/attribution/CITATIONS.adoc | 35 + .../docs/attribution/CODEOWNERS.adoc | 19 + .../docs/attribution/MAINTAINERS.adoc | 47 + validate-action/docs/attribution/README.adoc | 1 + .../docs/decisions/0.2-AI-MANIFEST.a2ml | 11 + .../docs/decisions/0000-template.adoc | 35 + .../decisions/0001-adopt-rsr-standard.adoc | 86 + validate-action/docs/decisions/README.adoc | 1 + .../docs/developer/0.2-AI-MANIFEST.a2ml | 11 + .../docs/developer/ABI-FFI-README.adoc | 384 + validate-action/docs/developer/README.adoc | 1 + .../docs/governance/0.1-AI-MANIFEST.a2ml | 21 + .../docs/governance/CRG-CRITERIA.a2ml | 108 + .../docs/governance/CRG-CRITERIA.adoc | 39 + .../governance/MAINTENANCE-CHECKLIST.a2ml | 159 + .../governance/MAINTENANCE-CHECKLIST.adoc | 569 + validate-action/docs/governance/README.adoc | 1 + .../SOFTWARE-DEVELOPMENT-APPROACH.a2ml | 53 + .../SOFTWARE-DEVELOPMENT-APPROACH.adoc | 63 + validate-action/docs/governance/TSDM.a2ml | 22 + validate-action/docs/governance/TSDM.adoc | 26 + .../governance/audit/0.2-AI-MANIFEST.a2ml | 11 + .../docs/governance/audit/README.adoc | 1 + .../audit/compliance/0.3-AI-MANIFEST.a2ml | 11 + .../governance/audit/compliance/README.adoc | 1 + .../audit/effects/0.3-AI-MANIFEST.a2ml | 11 + .../docs/governance/audit/effects/README.adoc | 1 + .../audit/systems/0.3-AI-MANIFEST.a2ml | 11 + .../docs/governance/audit/systems/README.adoc | 1 + .../maintenance/0.2-AI-MANIFEST.a2ml | 11 + .../docs/governance/maintenance/README.adoc | 1 + .../maintenance/adaptive/0.3-AI-MANIFEST.a2ml | 11 + .../maintenance/adaptive/README.adoc | 1 + .../corrective/0.3-AI-MANIFEST.a2ml | 11 + .../maintenance/corrective/README.adoc | 1 + .../perfective/0.3-AI-MANIFEST.a2ml | 11 + .../maintenance/perfective/README.adoc | 1 + .../governance/planning/0.2-AI-MANIFEST.a2ml | 11 + .../docs/governance/planning/README.adoc | 1 + .../planning/could/0.3-AI-MANIFEST.a2ml | 11 + .../governance/planning/could/README.adoc | 1 + .../planning/must/0.3-AI-MANIFEST.a2ml | 11 + .../docs/governance/planning/must/README.adoc | 1 + .../planning/should/0.3-AI-MANIFEST.a2ml | 11 + .../governance/planning/should/README.adoc | 1 + .../docs/legal/0.2-AI-MANIFEST.a2ml | 16 + .../docs/legal/EXHIBIT-A-ETHICAL-USE.txt | 68 + .../docs/legal/EXHIBIT-B-QUANTUM-SAFE.txt | 102 + validate-action/docs/practice/.gitkeep | 0 .../docs/practice/0.2-AI-MANIFEST.a2ml | 11 + .../docs/practice/AI-CONVENTIONS.adoc | 85 + validate-action/docs/practice/README.adoc | 1 + .../docs/practice/STATE-VISUALIZER-GUIDE.adoc | 155 + .../docs/reports/0.2-AI-MANIFEST.a2ml | 19 + validate-action/docs/reports/README.adoc | 1 + .../reports/compliance/0.3-AI-MANIFEST.a2ml | 11 + .../docs/reports/compliance/README.adoc | 1 + .../reports/maintenance/0.3-AI-MANIFEST.a2ml | 11 + .../docs/reports/maintenance/README.adoc | 1 + .../reports/performance/0.3-AI-MANIFEST.a2ml | 11 + .../docs/reports/performance/README.adoc | 1 + .../docs/reports/quality/0.3-AI-MANIFEST.a2ml | 11 + .../docs/reports/quality/README.adoc | 1 + .../reports/security/0.3-AI-MANIFEST.a2ml | 11 + .../docs/reports/security/README.adoc | 1 + .../docs/standards/0.2-AI-MANIFEST.a2ml | 11 + validate-action/docs/standards/README.adoc | 1 + validate-action/docs/theory/.gitkeep | 0 .../docs/theory/0.2-AI-MANIFEST.a2ml | 23 + validate-action/docs/theory/README.adoc | 1 + .../theory/computing/0.3-AI-MANIFEST.a2ml | 11 + .../docs/theory/computing/README.adoc | 1 + .../theory/formalisms/0.3-AI-MANIFEST.a2ml | 11 + .../docs/theory/formalisms/README.adoc | 1 + .../theory/mathematics/0.3-AI-MANIFEST.a2ml | 11 + .../docs/theory/mathematics/README.adoc | 1 + .../theory/ontologies/0.3-AI-MANIFEST.a2ml | 11 + .../docs/theory/ontologies/README.adoc | 1 + .../docs/theory/other/0.3-AI-MANIFEST.a2ml | 11 + validate-action/docs/theory/other/README.adoc | 1 + .../socio-technical/0.3-AI-MANIFEST.a2ml | 11 + .../docs/theory/socio-technical/README.adoc | 1 + .../docs/whitepapers/0.2-AI-MANIFEST.a2ml | 20 + validate-action/docs/whitepapers/README.adoc | 1 + .../docs/whitepapers/academic/.gitkeep | 0 .../whitepapers/academic/0.3-AI-MANIFEST.a2ml | 11 + .../docs/whitepapers/academic/README.adoc | 1 + .../docs/whitepapers/industry/.gitkeep | 0 .../whitepapers/industry/0.3-AI-MANIFEST.a2ml | 11 + .../docs/whitepapers/industry/README.adoc | 1 + .../whitepapers/outreach/0.3-AI-MANIFEST.a2ml | 16 + .../docs/whitepapers/outreach/README.adoc | 17 + .../docs/wikis/0.2-AI-MANIFEST.a2ml | 15 + validate-action/docs/wikis/README.adoc | 15 + validate-action/eclexiaiser.toml | 19 + validate-action/examples/0.1-AI-MANIFEST.a2ml | 1 + validate-action/examples/README.adoc | 1 + .../examples/web-project-deno.json | 20 + validate-action/features/0.1-AI-MANIFEST.a2ml | 17 + validate-action/features/README.adoc | 1 + .../features/boj-server/0.2-AI-MANIFEST.a2ml | 11 + .../features/boj-server/README.adoc | 14 + .../panic-attacker/0.2-AI-MANIFEST.a2ml | 11 + .../features/panic-attacker/README.adoc | 25 + .../features/ssg/0.2-AI-MANIFEST.a2ml | 11 + validate-action/features/ssg/README.adoc | 1 + validate-action/features/ssg/ssg-bootstrap.sh | 48 + validate-action/guix.scm | 71 + validate-action/hooks/install.sh | 15 + validate-action/hooks/pre-commit | 71 + validate-action/k9iser.toml | 32 + validate-action/llm-warmup-dev.md | 16 + validate-action/llm-warmup-user.md | 16 + validate-action/mise.toml | 57 + validate-action/selur-compose.toml | 17 + validate-action/setup.sh | 64 + validate-action/src/0.1-AI-MANIFEST.a2ml | 27 + validate-action/src/README.adoc | 1 + .../src/aspects/0.2-AI-MANIFEST.a2ml | 17 + validate-action/src/aspects/README.adoc | 1 + .../aspects/integrity/0.3-AI-MANIFEST.a2ml | 11 + .../src/aspects/integrity/README.adoc | 1 + .../observability/0.3-AI-MANIFEST.a2ml | 11 + .../src/aspects/observability/README.adoc | 1 + .../src/aspects/security/0.3-AI-MANIFEST.a2ml | 11 + .../src/aspects/security/README.adoc | 1 + .../src/bridges/0.2-AI-MANIFEST.a2ml | 11 + .../src/contracts/0.2-AI-MANIFEST.a2ml | 11 + validate-action/src/contracts/README.adoc | 1 + validate-action/src/core/0.2-AI-MANIFEST.a2ml | 11 + .../src/definitions/0.2-AI-MANIFEST.a2ml | 11 + validate-action/src/definitions/README.adoc | 1 + .../src/errors/0.2-AI-MANIFEST.a2ml | 11 + validate-action/src/errors/README.adoc | 1 + .../src/interface/0.2-AI-MANIFEST.a2ml | 24 + validate-action/src/interface/README.adoc | 1 + .../src/interface/abi/0.3-AI-MANIFEST.a2ml | 11 + validate-action/src/interface/abi/README.adoc | 1 + .../src/interface/ffi/0.3-AI-MANIFEST.a2ml | 11 + validate-action/src/interface/ffi/README.adoc | 1 + validate-action/src/interface/ffi/build.zig | 94 + .../interface/ffi/src/0.4-AI-MANIFEST.a2ml | 11 + .../src/interface/ffi/src/README.adoc | 1 + .../src/interface/ffi/src/main.zig | 274 + .../interface/ffi/test/0.4-AI-MANIFEST.a2ml | 11 + .../src/interface/ffi/test/README.adoc | 1 + .../interface/ffi/test/integration_test.zig | 182 + .../interface/generated/0.3-AI-MANIFEST.a2ml | 11 + .../src/interface/generated/README.adoc | 1 + .../src/interface/generated/abi/.gitkeep | 0 .../generated/abi/0.4-AI-MANIFEST.a2ml | 11 + .../src/interface/generated/abi/README.adoc | 1 + validate-action/stapeln.toml | 87 + validate-action/tests/fuzz/placeholder.txt | 1 + validate-action/validate-a2ml.sh | 350 + .../verification/0.1-AI-MANIFEST.a2ml | 27 + validate-action/verification/README.adoc | 1 + .../benchmarks/0.2-AI-MANIFEST.a2ml | 11 + .../verification/benchmarks/README.adoc | 1 + .../coverage/0.2-AI-MANIFEST.a2ml | 12 + .../verification/coverage/README.adoc | 1 + .../verification/fuzzing/0.2-AI-MANIFEST.a2ml | 11 + .../verification/fuzzing/README.adoc | 1 + .../verification/proofs/0.2-AI-MANIFEST.a2ml | 11 + .../verification/proofs/README.adoc | 1 + .../safety_case/0.2-AI-MANIFEST.a2ml | 12 + .../verification/safety_case/README.adoc | 1 + .../simulations/0.2-AI-MANIFEST.a2ml | 11 + .../verification/simulations/README.adoc | 1 + .../verification/tests/0.2-AI-MANIFEST.a2ml | 1 + .../verification/tests/README.adoc | 1 + .../traceability/0.2-AI-MANIFEST.a2ml | 12 + .../verification/traceability/README.adoc | 1 + 1462 files changed, 127928 insertions(+) create mode 100644 deno/.devcontainer/Containerfile create mode 100644 deno/.devcontainer/README.adoc create mode 100644 deno/.devcontainer/devcontainer.json create mode 100644 deno/.editorconfig create mode 100644 deno/.envrc create mode 100644 deno/.guix-channel create mode 100644 deno/.hypatia-ignore create mode 100644 deno/.machine_readable/0.1-AI-MANIFEST.a2ml create mode 100644 deno/.machine_readable/6a2/AGENTIC.a2ml create mode 100644 deno/.machine_readable/6a2/ECOSYSTEM.a2ml create mode 100644 deno/.machine_readable/6a2/META.a2ml create mode 100644 deno/.machine_readable/6a2/NEUROSYM.a2ml create mode 100644 deno/.machine_readable/6a2/PLAYBOOK.a2ml create mode 100644 deno/.machine_readable/6a2/STATE.a2ml create mode 100644 deno/.machine_readable/ADJUST.contractile create mode 100644 deno/.machine_readable/CLADE.a2ml create mode 100644 deno/.machine_readable/ENSAID_CONFIG.a2ml create mode 100644 deno/.machine_readable/INTENT.contractile create mode 100644 deno/.machine_readable/MUST.contractile create mode 100644 deno/.machine_readable/README.adoc create mode 100644 deno/.machine_readable/TRUST.contractile create mode 100644 deno/.machine_readable/agent_instructions/README.adoc create mode 100644 deno/.machine_readable/agent_instructions/coverage.a2ml create mode 100644 deno/.machine_readable/agent_instructions/debt.a2ml create mode 100644 deno/.machine_readable/agent_instructions/methodology.a2ml create mode 100644 deno/.machine_readable/ai/.clinerules create mode 100644 deno/.machine_readable/ai/.cursorrules create mode 100644 deno/.machine_readable/ai/.windsurfrules create mode 100644 deno/.machine_readable/ai/0.2-AI-MANIFEST.a2ml create mode 100644 deno/.machine_readable/ai/AI.a2ml create mode 100644 deno/.machine_readable/ai/PLACEHOLDERS.adoc create mode 100644 deno/.machine_readable/ai/README.adoc create mode 100644 deno/.machine_readable/anchors/0.2-AI-MANIFEST.a2ml create mode 100644 deno/.machine_readable/anchors/ANCHOR.a2ml create mode 100644 deno/.machine_readable/anchors/README.adoc create mode 100644 deno/.machine_readable/compliance/reuse/dep5 create mode 100644 deno/.machine_readable/compliance/rust/deny.toml create mode 100644 deno/.machine_readable/configs/0.2-AI-MANIFEST.a2ml create mode 100644 deno/.machine_readable/configs/README.adoc create mode 100644 deno/.machine_readable/configs/git-cliff/cliff.toml create mode 100644 deno/.machine_readable/contractiles/README.adoc create mode 100644 deno/.machine_readable/contractiles/adjust/Adjustfile.a2ml create mode 100644 deno/.machine_readable/contractiles/bust/Bustfile.a2ml create mode 100644 deno/.machine_readable/contractiles/bust/bust.ncl create mode 100644 deno/.machine_readable/contractiles/dust/Dustfile.a2ml create mode 100644 deno/.machine_readable/contractiles/intend/Intentfile.a2ml create mode 100644 deno/.machine_readable/contractiles/must/Mustfile.a2ml create mode 100644 deno/.machine_readable/contractiles/trust/Trustfile.a2ml create mode 100644 deno/.machine_readable/contractiles/trust/Trustfille.a2ml create mode 100644 deno/.machine_readable/integrations/feedback-o-tron.a2ml create mode 100644 deno/.machine_readable/integrations/proven.a2ml create mode 100644 deno/.machine_readable/integrations/verisimdb.a2ml create mode 100644 deno/.machine_readable/integrations/vexometer.a2ml create mode 100644 deno/.machine_readable/policies/.maintenance-perms-ignore create mode 100644 deno/.machine_readable/policies/0.2-AI-MANIFEST.a2ml create mode 100644 deno/.machine_readable/policies/MAINTENANCE-AXES.a2ml create mode 100644 deno/.machine_readable/policies/MAINTENANCE-CHECKLIST.a2ml create mode 100644 deno/.machine_readable/policies/README.adoc create mode 100644 deno/.machine_readable/policies/SOFTWARE-DEVELOPMENT-APPROACH.a2ml create mode 100644 deno/.machine_readable/root-allow.txt create mode 100644 deno/.machine_readable/scripts/0.2-AI-MANIFEST.a2ml create mode 100644 deno/.machine_readable/scripts/forge/0.3-AI-MANIFEST.a2ml create mode 100644 deno/.machine_readable/scripts/forge/README.adoc create mode 100755 deno/.machine_readable/scripts/forge/forge-sync.sh create mode 100755 deno/.machine_readable/scripts/forge/git-cleanup.sh create mode 100644 deno/.machine_readable/scripts/lifecycle/0.3-AI-MANIFEST.a2ml create mode 100644 deno/.machine_readable/scripts/lifecycle/README.adoc create mode 100755 deno/.machine_readable/scripts/lifecycle/install-tools.sh create mode 100644 deno/.machine_readable/scripts/maintenance/maint-assault.sh create mode 100644 deno/.machine_readable/scripts/verification/0.3-AI-MANIFEST.a2ml create mode 100644 deno/.machine_readable/scripts/verification/README.adoc create mode 100644 deno/.machine_readable/svc/k9/README.adoc create mode 100644 deno/.machine_readable/svc/k9/burble-metadata.k9.ncl create mode 100644 deno/.machine_readable/svc/k9/examples/ci-config.k9.ncl create mode 100644 deno/.machine_readable/svc/k9/examples/project-metadata.k9.ncl create mode 100644 deno/.machine_readable/svc/k9/examples/setup-repo.k9.ncl create mode 100644 deno/.machine_readable/svc/k9/template-hunt.k9.ncl create mode 100644 deno/.machine_readable/svc/k9/template-kennel.k9.ncl create mode 100644 deno/.machine_readable/svc/k9/template-yard.k9.ncl create mode 100644 deno/.tool-versions create mode 100644 deno/.well-known/ai.txt create mode 100644 deno/.well-known/humans.txt create mode 100644 deno/.well-known/security.txt create mode 100644 deno/0-AI-MANIFEST.a2ml create mode 100644 deno/ARCHITECTURE.md create mode 100644 deno/CHANGELOG.md create mode 100644 deno/CODE_OF_CONDUCT.md create mode 100644 deno/CONTRIBUTING.md create mode 100644 deno/Containerfile create mode 100644 deno/EXPLAINME.adoc create mode 100644 deno/GOVERNANCE.md create mode 100644 deno/Justfile create mode 100644 deno/LICENSE create mode 100644 deno/LICENSES/AGPL-3.0-or-later.txt create mode 100644 deno/LICENSES/CC-BY-SA-4.0.txt create mode 100644 deno/LICENSES/MPL-2.0.txt create mode 100644 deno/MAINTAINERS create mode 100644 deno/PROOF-NEEDS.md create mode 100644 deno/QUICKSTART-DEV.adoc create mode 100644 deno/QUICKSTART-MAINTAINER.adoc create mode 100644 deno/QUICKSTART-USER.adoc create mode 100644 deno/README.md create mode 100644 deno/ROADMAP.adoc create mode 100644 deno/SECURITY.md create mode 100644 deno/TEST-NEEDS.md create mode 100644 deno/TOPOLOGY.md create mode 100644 deno/container/.gatekeeper.yaml create mode 100644 deno/container/0.1-AI-MANIFEST.a2ml create mode 100644 deno/container/Containerfile create mode 100644 deno/container/README.adoc create mode 100644 deno/container/compose.example.toml create mode 100644 deno/container/compose.toml create mode 100755 deno/container/ct-build.sh create mode 100644 deno/container/deploy.k9.ncl create mode 100755 deno/container/entrypoint.sh create mode 100644 deno/container/manifest.toml create mode 100644 deno/container/vordr.toml create mode 100644 deno/contractile.just create mode 100644 deno/contractiles/intend/Intentfile.a2ml create mode 100644 deno/contractiles/must/Mustfile.a2ml create mode 100644 deno/contractiles/trust/Trustfile.a2ml create mode 100644 deno/deno.json create mode 100644 deno/docs/0.1-AI-MANIFEST.a2ml create mode 100644 deno/docs/QUICKSTART.adoc create mode 100644 deno/docs/README.adoc create mode 100644 deno/docs/RSR_OUTLINE.adoc create mode 100644 deno/docs/STATE-VISUALIZER.adoc create mode 100644 deno/docs/accessibility/README.adoc create mode 100644 deno/docs/architecture/0.2-AI-MANIFEST.a2ml create mode 100644 deno/docs/architecture/THREAT-MODEL.adoc create mode 100644 deno/docs/attribution/0.2-AI-MANIFEST.a2ml create mode 100644 deno/docs/attribution/CITATION.cff create mode 100644 deno/docs/attribution/CITATIONS.adoc create mode 100644 deno/docs/attribution/CODEOWNERS.adoc create mode 100644 deno/docs/attribution/MAINTAINERS.adoc create mode 100644 deno/docs/attribution/README.adoc create mode 100644 deno/docs/compliance/ACCESSIBILITY.adoc create mode 100644 deno/docs/decisions/0.2-AI-MANIFEST.a2ml create mode 100644 deno/docs/decisions/0000-template.adoc create mode 100644 deno/docs/decisions/0001-adopt-rsr-standard.adoc create mode 100644 deno/docs/decisions/README.adoc create mode 100644 deno/docs/developer/0.2-AI-MANIFEST.a2ml create mode 100644 deno/docs/developer/ABI-FFI-README.adoc create mode 100644 deno/docs/developer/README.adoc create mode 100644 deno/docs/governance/0.1-AI-MANIFEST.a2ml create mode 100644 deno/docs/governance/CRG-CRITERIA.a2ml create mode 100644 deno/docs/governance/CRG-CRITERIA.adoc create mode 100644 deno/docs/governance/MAINTENANCE-CHECKLIST.a2ml create mode 100644 deno/docs/governance/MAINTENANCE-CHECKLIST.adoc create mode 100644 deno/docs/governance/README.adoc create mode 100644 deno/docs/governance/SOFTWARE-DEVELOPMENT-APPROACH.a2ml create mode 100644 deno/docs/governance/SOFTWARE-DEVELOPMENT-APPROACH.adoc create mode 100644 deno/docs/governance/TSDM.a2ml create mode 100644 deno/docs/governance/TSDM.adoc create mode 100644 deno/docs/governance/audit/0.2-AI-MANIFEST.a2ml create mode 100644 deno/docs/governance/audit/README.adoc create mode 100644 deno/docs/governance/audit/compliance/0.3-AI-MANIFEST.a2ml create mode 100644 deno/docs/governance/audit/compliance/README.adoc create mode 100644 deno/docs/governance/audit/effects/0.3-AI-MANIFEST.a2ml create mode 100644 deno/docs/governance/audit/effects/README.adoc create mode 100644 deno/docs/governance/audit/systems/0.3-AI-MANIFEST.a2ml create mode 100644 deno/docs/governance/audit/systems/README.adoc create mode 100644 deno/docs/governance/maintenance/0.2-AI-MANIFEST.a2ml create mode 100644 deno/docs/governance/maintenance/README.adoc create mode 100644 deno/docs/governance/maintenance/adaptive/0.3-AI-MANIFEST.a2ml create mode 100644 deno/docs/governance/maintenance/adaptive/README.adoc create mode 100644 deno/docs/governance/maintenance/corrective/0.3-AI-MANIFEST.a2ml create mode 100644 deno/docs/governance/maintenance/corrective/README.adoc create mode 100644 deno/docs/governance/maintenance/perfective/0.3-AI-MANIFEST.a2ml create mode 100644 deno/docs/governance/maintenance/perfective/README.adoc create mode 100644 deno/docs/governance/planning/0.2-AI-MANIFEST.a2ml create mode 100644 deno/docs/governance/planning/README.adoc create mode 100644 deno/docs/governance/planning/could/0.3-AI-MANIFEST.a2ml create mode 100644 deno/docs/governance/planning/could/README.adoc create mode 100644 deno/docs/governance/planning/must/0.3-AI-MANIFEST.a2ml create mode 100644 deno/docs/governance/planning/must/README.adoc create mode 100644 deno/docs/governance/planning/should/0.3-AI-MANIFEST.a2ml create mode 100644 deno/docs/governance/planning/should/README.adoc create mode 100644 deno/docs/legal/0.2-AI-MANIFEST.a2ml create mode 100644 deno/docs/legal/EXHIBIT-A-ETHICAL-USE.txt create mode 100644 deno/docs/legal/EXHIBIT-B-QUANTUM-SAFE.txt create mode 100644 deno/docs/practice/.gitkeep create mode 100644 deno/docs/practice/0.2-AI-MANIFEST.a2ml create mode 100644 deno/docs/practice/AI-CONVENTIONS.adoc create mode 100644 deno/docs/practice/README.adoc create mode 100644 deno/docs/practice/STATE-VISUALIZER-GUIDE.adoc create mode 100644 deno/docs/reports/0.2-AI-MANIFEST.a2ml create mode 100644 deno/docs/reports/README.adoc create mode 100644 deno/docs/reports/audit/audit-2026-04-15-post.md create mode 100644 deno/docs/reports/compliance/0.3-AI-MANIFEST.a2ml create mode 100644 deno/docs/reports/compliance/README.adoc create mode 100644 deno/docs/reports/maintenance/0.3-AI-MANIFEST.a2ml create mode 100644 deno/docs/reports/maintenance/README.adoc create mode 100644 deno/docs/reports/performance/0.3-AI-MANIFEST.a2ml create mode 100644 deno/docs/reports/performance/README.adoc create mode 100644 deno/docs/reports/quality/0.3-AI-MANIFEST.a2ml create mode 100644 deno/docs/reports/quality/README.adoc create mode 100644 deno/docs/reports/security/0.3-AI-MANIFEST.a2ml create mode 100644 deno/docs/reports/security/README.adoc create mode 100644 deno/docs/standards/0.2-AI-MANIFEST.a2ml create mode 100644 deno/docs/standards/README.adoc create mode 100644 deno/docs/templates/contractiles/README.adoc create mode 100644 deno/docs/templates/contractiles/dust/Dustfile.a2ml create mode 100644 deno/docs/templates/contractiles/must/Mustfile.a2ml create mode 100644 deno/docs/templates/contractiles/trust/Trustfile.a2ml create mode 100644 deno/docs/theory/.gitkeep create mode 100644 deno/docs/theory/0.2-AI-MANIFEST.a2ml create mode 100644 deno/docs/theory/README.adoc create mode 100644 deno/docs/theory/computing/0.3-AI-MANIFEST.a2ml create mode 100644 deno/docs/theory/computing/README.adoc create mode 100644 deno/docs/theory/formalisms/0.3-AI-MANIFEST.a2ml create mode 100644 deno/docs/theory/formalisms/README.adoc create mode 100644 deno/docs/theory/mathematics/0.3-AI-MANIFEST.a2ml create mode 100644 deno/docs/theory/mathematics/README.adoc create mode 100644 deno/docs/theory/ontologies/0.3-AI-MANIFEST.a2ml create mode 100644 deno/docs/theory/ontologies/README.adoc create mode 100644 deno/docs/theory/other/0.3-AI-MANIFEST.a2ml create mode 100644 deno/docs/theory/other/README.adoc create mode 100644 deno/docs/theory/socio-technical/0.3-AI-MANIFEST.a2ml create mode 100644 deno/docs/theory/socio-technical/README.adoc create mode 100644 deno/docs/whitepapers/0.2-AI-MANIFEST.a2ml create mode 100644 deno/docs/whitepapers/README.adoc create mode 100644 deno/docs/whitepapers/academic/.gitkeep create mode 100644 deno/docs/whitepapers/academic/0.3-AI-MANIFEST.a2ml create mode 100644 deno/docs/whitepapers/academic/README.adoc create mode 100644 deno/docs/whitepapers/industry/.gitkeep create mode 100644 deno/docs/whitepapers/industry/0.3-AI-MANIFEST.a2ml create mode 100644 deno/docs/whitepapers/industry/README.adoc create mode 100644 deno/docs/whitepapers/outreach/0.3-AI-MANIFEST.a2ml create mode 100644 deno/docs/whitepapers/outreach/README.adoc create mode 100644 deno/docs/wikis/0.2-AI-MANIFEST.a2ml create mode 100644 deno/docs/wikis/README.adoc create mode 100644 deno/eclexiaiser.toml create mode 100644 deno/examples/0.1-AI-MANIFEST.a2ml create mode 100644 deno/examples/README.adoc create mode 100644 deno/examples/SafeDOMExample.res create mode 100644 deno/examples/web-project-deno.json create mode 100644 deno/features/0.1-AI-MANIFEST.a2ml create mode 100644 deno/features/README.adoc create mode 100644 deno/features/boj-server/0.2-AI-MANIFEST.a2ml create mode 100644 deno/features/boj-server/README.adoc create mode 100644 deno/features/panic-attacker/0.2-AI-MANIFEST.a2ml create mode 100644 deno/features/panic-attacker/README.adoc create mode 100644 deno/features/ssg/0.2-AI-MANIFEST.a2ml create mode 100644 deno/features/ssg/README.adoc create mode 100755 deno/features/ssg/ssg-bootstrap.sh create mode 100644 deno/guix.scm create mode 100644 deno/jsr.json create mode 100644 deno/k9iser.toml create mode 100644 deno/llm-warmup-dev.md create mode 100644 deno/llm-warmup-user.md create mode 100644 deno/mise.toml create mode 100644 deno/mod.ts create mode 100644 deno/rescript.json create mode 100644 deno/selur-compose.toml create mode 100755 deno/setup.sh create mode 100644 deno/src/0.1-AI-MANIFEST.a2ml create mode 100644 deno/src/A2ML.res create mode 100644 deno/src/A2ML_Parser.res create mode 100644 deno/src/A2ML_Renderer.res create mode 100644 deno/src/A2ML_Types.res create mode 100644 deno/src/README.adoc create mode 100644 deno/src/aspects/0.2-AI-MANIFEST.a2ml create mode 100644 deno/src/aspects/README.adoc create mode 100644 deno/src/aspects/integrity/0.3-AI-MANIFEST.a2ml create mode 100644 deno/src/aspects/integrity/README.adoc create mode 100644 deno/src/aspects/observability/0.3-AI-MANIFEST.a2ml create mode 100644 deno/src/aspects/observability/README.adoc create mode 100644 deno/src/aspects/security/0.3-AI-MANIFEST.a2ml create mode 100644 deno/src/aspects/security/README.adoc create mode 100644 deno/src/bridges/0.2-AI-MANIFEST.a2ml create mode 100644 deno/src/contracts/0.2-AI-MANIFEST.a2ml create mode 100644 deno/src/contracts/README.adoc create mode 100644 deno/src/core/0.2-AI-MANIFEST.a2ml create mode 100644 deno/src/definitions/0.2-AI-MANIFEST.a2ml create mode 100644 deno/src/definitions/README.adoc create mode 100644 deno/src/errors/0.2-AI-MANIFEST.a2ml create mode 100644 deno/src/errors/README.adoc create mode 100644 deno/src/interface/0.2-AI-MANIFEST.a2ml create mode 100644 deno/src/interface/README.adoc create mode 100644 deno/src/interface/abi/0.3-AI-MANIFEST.a2ml create mode 100644 deno/src/interface/abi/README.adoc create mode 100644 deno/src/interface/ffi/0.3-AI-MANIFEST.a2ml create mode 100644 deno/src/interface/ffi/README.adoc create mode 100644 deno/src/interface/ffi/build.zig create mode 100644 deno/src/interface/ffi/src/0.4-AI-MANIFEST.a2ml create mode 100644 deno/src/interface/ffi/src/README.adoc create mode 100644 deno/src/interface/ffi/src/main.zig create mode 100644 deno/src/interface/ffi/test/0.4-AI-MANIFEST.a2ml create mode 100644 deno/src/interface/ffi/test/README.adoc create mode 100644 deno/src/interface/ffi/test/integration_test.zig create mode 100644 deno/src/interface/generated/0.3-AI-MANIFEST.a2ml create mode 100644 deno/src/interface/generated/README.adoc create mode 100644 deno/src/interface/generated/abi/.gitkeep create mode 100644 deno/src/interface/generated/abi/0.4-AI-MANIFEST.a2ml create mode 100644 deno/src/interface/generated/abi/README.adoc create mode 100644 deno/stapeln.toml create mode 100644 deno/tests/bench_test.mjs create mode 100644 deno/tests/e2e_test.mjs create mode 100644 deno/tests/fuzz/placeholder.txt create mode 100644 deno/tests/property_test.mjs create mode 100644 deno/tests/unit_test.mjs create mode 100644 deno/verification/0.1-AI-MANIFEST.a2ml create mode 100644 deno/verification/README.adoc create mode 100644 deno/verification/benchmarks/0.2-AI-MANIFEST.a2ml create mode 100644 deno/verification/benchmarks/README.adoc create mode 100644 deno/verification/coverage/0.2-AI-MANIFEST.a2ml create mode 100644 deno/verification/coverage/README.adoc create mode 100644 deno/verification/fuzzing/0.2-AI-MANIFEST.a2ml create mode 100644 deno/verification/fuzzing/README.adoc create mode 100644 deno/verification/proofs/0.2-AI-MANIFEST.a2ml create mode 100644 deno/verification/proofs/README.adoc create mode 100644 deno/verification/safety_case/0.2-AI-MANIFEST.a2ml create mode 100644 deno/verification/safety_case/README.adoc create mode 100644 deno/verification/simulations/0.2-AI-MANIFEST.a2ml create mode 100644 deno/verification/simulations/README.adoc create mode 100644 deno/verification/tests/0.2-AI-MANIFEST.a2ml create mode 100644 deno/verification/tests/README.adoc create mode 100644 deno/verification/traceability/0.2-AI-MANIFEST.a2ml create mode 100644 deno/verification/traceability/README.adoc create mode 100644 ex/.editorconfig create mode 100644 ex/.formatter.exs create mode 100644 ex/.machine_readable/ADJUST.contractile create mode 100644 ex/.machine_readable/INTENT.contractile create mode 100644 ex/.machine_readable/MUST.contractile create mode 100644 ex/.machine_readable/TRUST.contractile create mode 100644 ex/.machine_readable/agent_instructions/README.adoc create mode 100644 ex/.machine_readable/agent_instructions/coverage.a2ml create mode 100644 ex/.machine_readable/agent_instructions/debt.a2ml create mode 100644 ex/.machine_readable/agent_instructions/methodology.a2ml create mode 100644 ex/.machine_readable/anchors/ANCHOR.a2ml create mode 100644 ex/.machine_readable/contractiles/bust/Bustfile.a2ml create mode 100644 ex/.machine_readable/contractiles/bust/bust.ncl create mode 100644 ex/.machine_readable/contractiles/dust/Dustfile.a2ml create mode 100644 ex/.machine_readable/contractiles/trust/Trustfile.a2ml create mode 100644 ex/.machine_readable/integrations/feedback-o-tron.a2ml create mode 100644 ex/.machine_readable/integrations/proven.a2ml create mode 100644 ex/.machine_readable/integrations/verisimdb.a2ml create mode 100644 ex/.machine_readable/integrations/vexometer.a2ml create mode 100644 ex/.tool-versions create mode 100644 ex/.well-known/ai.txt create mode 100644 ex/.well-known/humans.txt create mode 100644 ex/.well-known/security.txt create mode 100644 ex/0-AI-MANIFEST.a2ml create mode 100644 ex/ARCHITECTURE.md create mode 100644 ex/CHANGELOG.md create mode 100644 ex/CODE_OF_CONDUCT.md create mode 100644 ex/CONTRIBUTING.md create mode 100644 ex/EXPLAINME.adoc create mode 100644 ex/GOVERNANCE.md create mode 100644 ex/Justfile create mode 100644 ex/LICENSE create mode 100644 ex/LICENSES/AGPL-3.0-or-later.txt create mode 100644 ex/LICENSES/CC-BY-SA-4.0.txt create mode 100644 ex/LICENSES/MPL-2.0.txt create mode 100644 ex/MAINTAINERS create mode 100644 ex/QUICKSTART-DEV.adoc create mode 100644 ex/QUICKSTART-MAINTAINER.adoc create mode 100644 ex/QUICKSTART-USER.adoc create mode 100644 ex/README.md create mode 100644 ex/SECURITY.md create mode 100644 ex/TEST-NEEDS.md create mode 100644 ex/TOPOLOGY.md create mode 100644 ex/a2ml_ex-0.1.0/.formatter.exs create mode 100644 ex/a2ml_ex-0.1.0/LICENSE create mode 100644 ex/a2ml_ex-0.1.0/README.adoc create mode 100644 ex/a2ml_ex-0.1.0/hex_metadata.config create mode 100644 ex/a2ml_ex-0.1.0/lib/a2_ml.ex create mode 100644 ex/a2ml_ex-0.1.0/lib/a2ml/parser.ex create mode 100644 ex/a2ml_ex-0.1.0/lib/a2ml/renderer.ex create mode 100644 ex/a2ml_ex-0.1.0/lib/a2ml/types.ex create mode 100644 ex/a2ml_ex-0.1.0/mix.exs create mode 100644 ex/contractile.just create mode 100644 ex/contractiles/intend/Intentfile.a2ml create mode 100644 ex/contractiles/must/Mustfile.a2ml create mode 100644 ex/contractiles/trust/Trustfile.a2ml create mode 100644 ex/docs/architecture.adoc create mode 100644 ex/docs/contributing.adoc create mode 100644 ex/docs/decisions/0001-template.adoc create mode 100644 ex/docs/tech-debt-2026-05-26.md create mode 100644 ex/docs/troubleshooting.adoc create mode 100644 ex/docs/usage.adoc create mode 100644 ex/erl_crash.dump create mode 100644 ex/guix.scm create mode 100644 ex/k9iser.toml create mode 100644 ex/lib/a2_ml.ex create mode 100644 ex/lib/a2ml/parser.ex create mode 100644 ex/lib/a2ml/renderer.ex create mode 100644 ex/lib/a2ml/types.ex create mode 100644 ex/llm-warmup-dev.md create mode 100644 ex/llm-warmup-user.md create mode 100644 ex/mise.toml create mode 100644 ex/mix.exs create mode 100644 ex/mix.lock create mode 100755 ex/setup.sh create mode 100644 ex/stapeln.toml create mode 100644 ex/test/a2_ml_test.exs create mode 100644 ex/test/a2ml_aspect_test.exs create mode 100644 ex/test/a2ml_bench_test.exs create mode 100644 ex/test/a2ml_contract_test.exs create mode 100644 ex/test/a2ml_property_test.exs create mode 100644 ex/test/test_helper.exs create mode 100644 ex/tests/fuzz/placeholder.txt create mode 100644 gleam/.editorconfig create mode 100644 gleam/.machine_readable/ADJUST.contractile create mode 100644 gleam/.machine_readable/INTENT.contractile create mode 100644 gleam/.machine_readable/MUST.contractile create mode 100644 gleam/.machine_readable/TRUST.contractile create mode 100644 gleam/.machine_readable/agent_instructions/README.adoc create mode 100644 gleam/.machine_readable/agent_instructions/coverage.a2ml create mode 100644 gleam/.machine_readable/agent_instructions/debt.a2ml create mode 100644 gleam/.machine_readable/agent_instructions/methodology.a2ml create mode 100644 gleam/.machine_readable/anchors/ANCHOR.a2ml create mode 100644 gleam/.machine_readable/contractiles/dust/Dustfile.a2ml create mode 100644 gleam/.machine_readable/contractiles/trust/Trustfile.a2ml create mode 100644 gleam/.machine_readable/descriptiles/STATE.a2ml create mode 100644 gleam/.machine_readable/integrations/feedback-o-tron.a2ml create mode 100644 gleam/.machine_readable/integrations/proven.a2ml create mode 100644 gleam/.machine_readable/integrations/verisimdb.a2ml create mode 100644 gleam/.machine_readable/integrations/vexometer.a2ml create mode 100644 gleam/.machine_readable/root-allow.txt create mode 100644 gleam/.tool-versions create mode 100644 gleam/.well-known/ai.txt create mode 100644 gleam/.well-known/humans.txt create mode 100644 gleam/.well-known/security.txt create mode 100644 gleam/0-AI-MANIFEST.a2ml create mode 100644 gleam/ARCHITECTURE.md create mode 100644 gleam/CHANGELOG.md create mode 100644 gleam/CODE_OF_CONDUCT.md create mode 100644 gleam/CONTRIBUTING.md create mode 100644 gleam/EXPLAINME.adoc create mode 100644 gleam/GOVERNANCE.md create mode 100644 gleam/Justfile create mode 100644 gleam/LICENSE create mode 100644 gleam/LICENSES/CC-BY-SA-4.0.txt create mode 100644 gleam/LICENSES/MPL-2.0.txt create mode 100644 gleam/MAINTAINERS create mode 100644 gleam/QUICKSTART-DEV.adoc create mode 100644 gleam/QUICKSTART-MAINTAINER.adoc create mode 100644 gleam/QUICKSTART-USER.adoc create mode 100644 gleam/README.md create mode 100644 gleam/SECURITY.md create mode 100644 gleam/TEST-NEEDS.md create mode 100644 gleam/TOPOLOGY.md create mode 100644 gleam/contractile.just create mode 100644 gleam/contractiles/intend/Intentfile.a2ml create mode 100644 gleam/contractiles/must/Mustfile.a2ml create mode 100644 gleam/contractiles/trust/Trustfile.a2ml create mode 100644 gleam/docs/architecture.adoc create mode 100644 gleam/docs/contributing.adoc create mode 100644 gleam/docs/decisions/0001-template.adoc create mode 100644 gleam/docs/tech-debt-2026-05-26.md create mode 100644 gleam/docs/troubleshooting.adoc create mode 100644 gleam/docs/usage.adoc create mode 100644 gleam/gleam.toml create mode 100644 gleam/guix.scm create mode 100644 gleam/llm-warmup-dev.md create mode 100644 gleam/llm-warmup-user.md create mode 100644 gleam/manifest.toml create mode 100644 gleam/mise.toml create mode 100644 gleam/scripts/check-no-md-in-docs.sh create mode 100644 gleam/scripts/check-no-vlang.sh create mode 100644 gleam/scripts/check-root-shape.sh create mode 100755 gleam/scripts/invariant-path.sh create mode 100755 gleam/scripts/validate-template.sh create mode 100755 gleam/setup.sh create mode 100644 gleam/sonar-project.properties create mode 100644 gleam/src/a2ml_gleam.gleam create mode 100644 gleam/src/a2ml_gleam/parser.gleam create mode 100644 gleam/src/a2ml_gleam/renderer.gleam create mode 100644 gleam/src/a2ml_gleam/types.gleam create mode 100644 gleam/stapeln.toml create mode 100644 gleam/test/a2ml_gleam_aspect_test.gleam create mode 100644 gleam/test/a2ml_gleam_bench_test.gleam create mode 100644 gleam/test/a2ml_gleam_contract_test.gleam create mode 100644 gleam/test/a2ml_gleam_property_test.gleam create mode 100644 gleam/test/a2ml_gleam_test.gleam create mode 100644 gleam/tests/fuzz/placeholder.txt create mode 100644 haskell/.devcontainer/Containerfile create mode 100644 haskell/.devcontainer/README.adoc create mode 100644 haskell/.devcontainer/devcontainer.json create mode 100644 haskell/.editorconfig create mode 100644 haskell/.envrc create mode 100644 haskell/.guix-channel create mode 100644 haskell/.hypatia-ignore create mode 100644 haskell/.machine_readable/0.1-AI-MANIFEST.a2ml create mode 100644 haskell/.machine_readable/6a2/AGENTIC.a2ml create mode 100644 haskell/.machine_readable/6a2/ECOSYSTEM.a2ml create mode 100644 haskell/.machine_readable/6a2/META.a2ml create mode 100644 haskell/.machine_readable/6a2/NEUROSYM.a2ml create mode 100644 haskell/.machine_readable/6a2/PLAYBOOK.a2ml create mode 100644 haskell/.machine_readable/6a2/STATE.a2ml create mode 100644 haskell/.machine_readable/ADJUST.contractile create mode 100644 haskell/.machine_readable/CLADE.a2ml create mode 100644 haskell/.machine_readable/ENSAID_CONFIG.a2ml create mode 100644 haskell/.machine_readable/INTENT.contractile create mode 100644 haskell/.machine_readable/MUST.contractile create mode 100644 haskell/.machine_readable/README.adoc create mode 100644 haskell/.machine_readable/TRUST.contractile create mode 100644 haskell/.machine_readable/agent_instructions/README.adoc create mode 100644 haskell/.machine_readable/agent_instructions/coverage.a2ml create mode 100644 haskell/.machine_readable/agent_instructions/debt.a2ml create mode 100644 haskell/.machine_readable/agent_instructions/methodology.a2ml create mode 100644 haskell/.machine_readable/ai/.clinerules create mode 100644 haskell/.machine_readable/ai/.cursorrules create mode 100644 haskell/.machine_readable/ai/.windsurfrules create mode 100644 haskell/.machine_readable/ai/0.2-AI-MANIFEST.a2ml create mode 100644 haskell/.machine_readable/ai/AI.a2ml create mode 100644 haskell/.machine_readable/ai/PLACEHOLDERS.adoc create mode 100644 haskell/.machine_readable/ai/README.adoc create mode 100644 haskell/.machine_readable/anchors/0.2-AI-MANIFEST.a2ml create mode 100644 haskell/.machine_readable/anchors/ANCHOR.a2ml create mode 100644 haskell/.machine_readable/anchors/README.adoc create mode 100644 haskell/.machine_readable/compliance/reuse/dep5 create mode 100644 haskell/.machine_readable/compliance/rust/deny.toml create mode 100644 haskell/.machine_readable/configs/0.2-AI-MANIFEST.a2ml create mode 100644 haskell/.machine_readable/configs/README.adoc create mode 100644 haskell/.machine_readable/configs/git-cliff/cliff.toml create mode 100644 haskell/.machine_readable/contractiles/README.adoc create mode 100644 haskell/.machine_readable/contractiles/dust/Dustfile.a2ml create mode 100644 haskell/.machine_readable/contractiles/k9/README.adoc create mode 100644 haskell/.machine_readable/contractiles/k9/examples/ci-config.k9.ncl create mode 100644 haskell/.machine_readable/contractiles/k9/examples/project-metadata.k9.ncl create mode 100644 haskell/.machine_readable/contractiles/k9/examples/setup-repo.k9.ncl create mode 100644 haskell/.machine_readable/contractiles/k9/template-hunt.k9.ncl create mode 100644 haskell/.machine_readable/contractiles/k9/template-kennel.k9.ncl create mode 100644 haskell/.machine_readable/contractiles/k9/template-yard.k9.ncl create mode 100644 haskell/.machine_readable/contractiles/lust/Intentfile.a2ml create mode 100644 haskell/.machine_readable/contractiles/must/Mustfile.a2ml create mode 100644 haskell/.machine_readable/contractiles/trust/Trustfile.a2ml create mode 100644 haskell/.machine_readable/integrations/feedback-o-tron.a2ml create mode 100644 haskell/.machine_readable/integrations/proven.a2ml create mode 100644 haskell/.machine_readable/integrations/verisimdb.a2ml create mode 100644 haskell/.machine_readable/integrations/vexometer.a2ml create mode 100644 haskell/.machine_readable/policies/.maintenance-perms-ignore create mode 100644 haskell/.machine_readable/policies/0.2-AI-MANIFEST.a2ml create mode 100644 haskell/.machine_readable/policies/MAINTENANCE-AXES.a2ml create mode 100644 haskell/.machine_readable/policies/MAINTENANCE-CHECKLIST.a2ml create mode 100644 haskell/.machine_readable/policies/README.adoc create mode 100644 haskell/.machine_readable/policies/SOFTWARE-DEVELOPMENT-APPROACH.a2ml create mode 100644 haskell/.machine_readable/root-allow.txt create mode 100644 haskell/.machine_readable/scripts/0.2-AI-MANIFEST.a2ml create mode 100644 haskell/.machine_readable/scripts/forge/0.3-AI-MANIFEST.a2ml create mode 100644 haskell/.machine_readable/scripts/forge/README.adoc create mode 100755 haskell/.machine_readable/scripts/forge/forge-sync.sh create mode 100755 haskell/.machine_readable/scripts/forge/git-cleanup.sh create mode 100644 haskell/.machine_readable/scripts/lifecycle/0.3-AI-MANIFEST.a2ml create mode 100644 haskell/.machine_readable/scripts/lifecycle/README.adoc create mode 100755 haskell/.machine_readable/scripts/lifecycle/install-tools.sh create mode 100644 haskell/.machine_readable/scripts/maintenance/maint-assault.sh create mode 100644 haskell/.machine_readable/scripts/verification/0.3-AI-MANIFEST.a2ml create mode 100644 haskell/.machine_readable/scripts/verification/README.adoc create mode 100644 haskell/.tool-versions create mode 100644 haskell/.well-known/ai.txt create mode 100644 haskell/.well-known/humans.txt create mode 100644 haskell/.well-known/security.txt create mode 100644 haskell/0-AI-MANIFEST.a2ml create mode 100644 haskell/ARCHITECTURE.md create mode 100644 haskell/CHANGELOG.md create mode 100644 haskell/CODE_OF_CONDUCT.md create mode 100644 haskell/CONTRIBUTING.md create mode 100644 haskell/Containerfile create mode 100644 haskell/EXPLAINME.adoc create mode 100644 haskell/GOVERNANCE.md create mode 100644 haskell/Justfile create mode 100644 haskell/LICENSE create mode 100644 haskell/LICENSE-MPL-2.0 create mode 100644 haskell/LICENSES/AGPL-3.0-or-later.txt create mode 100644 haskell/LICENSES/CC-BY-SA-4.0.txt create mode 100644 haskell/LICENSES/MPL-2.0.txt create mode 100644 haskell/MAINTAINERS create mode 100644 haskell/PROOF-NEEDS.md create mode 100644 haskell/QUICKSTART-DEV.adoc create mode 100644 haskell/QUICKSTART-MAINTAINER.adoc create mode 100644 haskell/QUICKSTART-USER.adoc create mode 100644 haskell/README.md create mode 100644 haskell/ROADMAP.adoc create mode 100644 haskell/SECURITY.md create mode 100644 haskell/Setup.hs create mode 100644 haskell/TEST-NEEDS.md create mode 100644 haskell/TOPOLOGY.md create mode 100644 haskell/a2ml-haskell.cabal create mode 100644 haskell/bench/Main.hs create mode 100644 haskell/container/.gatekeeper.yaml create mode 100644 haskell/container/0.1-AI-MANIFEST.a2ml create mode 100644 haskell/container/Containerfile create mode 100644 haskell/container/README.adoc create mode 100644 haskell/container/compose.example.toml create mode 100644 haskell/container/compose.toml create mode 100755 haskell/container/ct-build.sh create mode 100644 haskell/container/deploy.k9.ncl create mode 100755 haskell/container/entrypoint.sh create mode 100644 haskell/container/manifest.toml create mode 100644 haskell/container/vordr.toml create mode 100644 haskell/contractile.just create mode 100644 haskell/contractiles/intend/Intentfile.a2ml create mode 100644 haskell/contractiles/must/Mustfile.a2ml create mode 100644 haskell/contractiles/trust/Trustfile.a2ml create mode 100644 haskell/docs/0.1-AI-MANIFEST.a2ml create mode 100644 haskell/docs/QUICKSTART.adoc create mode 100644 haskell/docs/README.adoc create mode 100644 haskell/docs/RSR_OUTLINE.adoc create mode 100644 haskell/docs/STATE-VISUALIZER.adoc create mode 100644 haskell/docs/accessibility/README.adoc create mode 100644 haskell/docs/architecture/0.2-AI-MANIFEST.a2ml create mode 100644 haskell/docs/architecture/THREAT-MODEL.adoc create mode 100644 haskell/docs/attribution/0.2-AI-MANIFEST.a2ml create mode 100644 haskell/docs/attribution/CITATION.cff create mode 100644 haskell/docs/attribution/CITATIONS.adoc create mode 100644 haskell/docs/attribution/CODEOWNERS.adoc create mode 100644 haskell/docs/attribution/MAINTAINERS.adoc create mode 100644 haskell/docs/attribution/README.adoc create mode 100644 haskell/docs/compliance/ACCESSIBILITY.adoc create mode 100644 haskell/docs/decisions/0.2-AI-MANIFEST.a2ml create mode 100644 haskell/docs/decisions/0000-template.adoc create mode 100644 haskell/docs/decisions/0001-adopt-rsr-standard.adoc create mode 100644 haskell/docs/decisions/README.adoc create mode 100644 haskell/docs/developer/0.2-AI-MANIFEST.a2ml create mode 100644 haskell/docs/developer/ABI-FFI-README.adoc create mode 100644 haskell/docs/developer/README.adoc create mode 100644 haskell/docs/governance/0.1-AI-MANIFEST.a2ml create mode 100644 haskell/docs/governance/CRG-CRITERIA.a2ml create mode 100644 haskell/docs/governance/CRG-CRITERIA.adoc create mode 100644 haskell/docs/governance/MAINTENANCE-CHECKLIST.a2ml create mode 100644 haskell/docs/governance/MAINTENANCE-CHECKLIST.adoc create mode 100644 haskell/docs/governance/README.adoc create mode 100644 haskell/docs/governance/SOFTWARE-DEVELOPMENT-APPROACH.a2ml create mode 100644 haskell/docs/governance/SOFTWARE-DEVELOPMENT-APPROACH.adoc create mode 100644 haskell/docs/governance/TSDM.a2ml create mode 100644 haskell/docs/governance/TSDM.adoc create mode 100644 haskell/docs/governance/audit/0.2-AI-MANIFEST.a2ml create mode 100644 haskell/docs/governance/audit/README.adoc create mode 100644 haskell/docs/governance/audit/compliance/0.3-AI-MANIFEST.a2ml create mode 100644 haskell/docs/governance/audit/compliance/README.adoc create mode 100644 haskell/docs/governance/audit/effects/0.3-AI-MANIFEST.a2ml create mode 100644 haskell/docs/governance/audit/effects/README.adoc create mode 100644 haskell/docs/governance/audit/systems/0.3-AI-MANIFEST.a2ml create mode 100644 haskell/docs/governance/audit/systems/README.adoc create mode 100644 haskell/docs/governance/maintenance/0.2-AI-MANIFEST.a2ml create mode 100644 haskell/docs/governance/maintenance/README.adoc create mode 100644 haskell/docs/governance/maintenance/adaptive/0.3-AI-MANIFEST.a2ml create mode 100644 haskell/docs/governance/maintenance/adaptive/README.adoc create mode 100644 haskell/docs/governance/maintenance/corrective/0.3-AI-MANIFEST.a2ml create mode 100644 haskell/docs/governance/maintenance/corrective/README.adoc create mode 100644 haskell/docs/governance/maintenance/perfective/0.3-AI-MANIFEST.a2ml create mode 100644 haskell/docs/governance/maintenance/perfective/README.adoc create mode 100644 haskell/docs/governance/planning/0.2-AI-MANIFEST.a2ml create mode 100644 haskell/docs/governance/planning/README.adoc create mode 100644 haskell/docs/governance/planning/could/0.3-AI-MANIFEST.a2ml create mode 100644 haskell/docs/governance/planning/could/README.adoc create mode 100644 haskell/docs/governance/planning/must/0.3-AI-MANIFEST.a2ml create mode 100644 haskell/docs/governance/planning/must/README.adoc create mode 100644 haskell/docs/governance/planning/should/0.3-AI-MANIFEST.a2ml create mode 100644 haskell/docs/governance/planning/should/README.adoc create mode 100644 haskell/docs/legal/0.2-AI-MANIFEST.a2ml create mode 100644 haskell/docs/legal/EXHIBIT-A-ETHICAL-USE.txt create mode 100644 haskell/docs/legal/EXHIBIT-B-QUANTUM-SAFE.txt create mode 100644 haskell/docs/practice/.gitkeep create mode 100644 haskell/docs/practice/0.2-AI-MANIFEST.a2ml create mode 100644 haskell/docs/practice/AI-CONVENTIONS.adoc create mode 100644 haskell/docs/practice/README.adoc create mode 100644 haskell/docs/practice/STATE-VISUALIZER-GUIDE.adoc create mode 100644 haskell/docs/reports/0.2-AI-MANIFEST.a2ml create mode 100644 haskell/docs/reports/README.adoc create mode 100644 haskell/docs/reports/compliance/0.3-AI-MANIFEST.a2ml create mode 100644 haskell/docs/reports/compliance/README.adoc create mode 100644 haskell/docs/reports/maintenance/0.3-AI-MANIFEST.a2ml create mode 100644 haskell/docs/reports/maintenance/README.adoc create mode 100644 haskell/docs/reports/performance/0.3-AI-MANIFEST.a2ml create mode 100644 haskell/docs/reports/performance/README.adoc create mode 100644 haskell/docs/reports/quality/0.3-AI-MANIFEST.a2ml create mode 100644 haskell/docs/reports/quality/README.adoc create mode 100644 haskell/docs/reports/security/0.3-AI-MANIFEST.a2ml create mode 100644 haskell/docs/reports/security/README.adoc create mode 100644 haskell/docs/standards/0.2-AI-MANIFEST.a2ml create mode 100644 haskell/docs/standards/README.adoc create mode 100644 haskell/docs/templates/contractiles/README.adoc create mode 100644 haskell/docs/templates/contractiles/dust/Dustfile.a2ml create mode 100644 haskell/docs/templates/contractiles/lust/Intentfile.a2ml create mode 100644 haskell/docs/templates/contractiles/must/Mustfile.a2ml create mode 100644 haskell/docs/templates/contractiles/trust/Trustfile.a2ml create mode 100644 haskell/docs/theory/.gitkeep create mode 100644 haskell/docs/theory/0.2-AI-MANIFEST.a2ml create mode 100644 haskell/docs/theory/README.adoc create mode 100644 haskell/docs/theory/computing/0.3-AI-MANIFEST.a2ml create mode 100644 haskell/docs/theory/computing/README.adoc create mode 100644 haskell/docs/theory/formalisms/0.3-AI-MANIFEST.a2ml create mode 100644 haskell/docs/theory/formalisms/README.adoc create mode 100644 haskell/docs/theory/mathematics/0.3-AI-MANIFEST.a2ml create mode 100644 haskell/docs/theory/mathematics/README.adoc create mode 100644 haskell/docs/theory/ontologies/0.3-AI-MANIFEST.a2ml create mode 100644 haskell/docs/theory/ontologies/README.adoc create mode 100644 haskell/docs/theory/other/0.3-AI-MANIFEST.a2ml create mode 100644 haskell/docs/theory/other/README.adoc create mode 100644 haskell/docs/theory/socio-technical/0.3-AI-MANIFEST.a2ml create mode 100644 haskell/docs/theory/socio-technical/README.adoc create mode 100644 haskell/docs/whitepapers/0.2-AI-MANIFEST.a2ml create mode 100644 haskell/docs/whitepapers/README.adoc create mode 100644 haskell/docs/whitepapers/academic/.gitkeep create mode 100644 haskell/docs/whitepapers/academic/0.3-AI-MANIFEST.a2ml create mode 100644 haskell/docs/whitepapers/academic/README.adoc create mode 100644 haskell/docs/whitepapers/industry/.gitkeep create mode 100644 haskell/docs/whitepapers/industry/0.3-AI-MANIFEST.a2ml create mode 100644 haskell/docs/whitepapers/industry/README.adoc create mode 100644 haskell/docs/whitepapers/outreach/0.3-AI-MANIFEST.a2ml create mode 100644 haskell/docs/whitepapers/outreach/README.adoc create mode 100644 haskell/docs/wikis/0.2-AI-MANIFEST.a2ml create mode 100644 haskell/docs/wikis/README.adoc create mode 100644 haskell/eclexiaiser.toml create mode 100644 haskell/examples/0.1-AI-MANIFEST.a2ml create mode 100644 haskell/examples/README.adoc create mode 100644 haskell/examples/SafeDOMExample.res create mode 100644 haskell/examples/web-project-deno.json create mode 100644 haskell/features/0.1-AI-MANIFEST.a2ml create mode 100644 haskell/features/README.adoc create mode 100644 haskell/features/boj-server/0.2-AI-MANIFEST.a2ml create mode 100644 haskell/features/boj-server/README.adoc create mode 100644 haskell/features/panic-attacker/0.2-AI-MANIFEST.a2ml create mode 100644 haskell/features/panic-attacker/README.adoc create mode 100644 haskell/features/ssg/0.2-AI-MANIFEST.a2ml create mode 100644 haskell/features/ssg/README.adoc create mode 100755 haskell/features/ssg/ssg-bootstrap.sh create mode 100644 haskell/guix.scm create mode 100644 haskell/k9iser.toml create mode 100644 haskell/llm-warmup-dev.md create mode 100644 haskell/llm-warmup-user.md create mode 100644 haskell/mise.toml create mode 100644 haskell/selur-compose.toml create mode 100755 haskell/setup.sh create mode 100644 haskell/src/0.1-AI-MANIFEST.a2ml create mode 100644 haskell/src/Data/A2ML.hs create mode 100644 haskell/src/Data/A2ML/Parser.hs create mode 100644 haskell/src/Data/A2ML/Renderer.hs create mode 100644 haskell/src/Data/A2ML/Types.hs create mode 100644 haskell/src/README.adoc create mode 100644 haskell/src/aspects/0.2-AI-MANIFEST.a2ml create mode 100644 haskell/src/aspects/README.adoc create mode 100644 haskell/src/aspects/integrity/0.3-AI-MANIFEST.a2ml create mode 100644 haskell/src/aspects/integrity/README.adoc create mode 100644 haskell/src/aspects/observability/0.3-AI-MANIFEST.a2ml create mode 100644 haskell/src/aspects/observability/README.adoc create mode 100644 haskell/src/aspects/security/0.3-AI-MANIFEST.a2ml create mode 100644 haskell/src/aspects/security/README.adoc create mode 100644 haskell/src/bridges/0.2-AI-MANIFEST.a2ml create mode 100644 haskell/src/contracts/0.2-AI-MANIFEST.a2ml create mode 100644 haskell/src/contracts/README.adoc create mode 100644 haskell/src/core/0.2-AI-MANIFEST.a2ml create mode 100644 haskell/src/definitions/0.2-AI-MANIFEST.a2ml create mode 100644 haskell/src/definitions/README.adoc create mode 100644 haskell/src/errors/0.2-AI-MANIFEST.a2ml create mode 100644 haskell/src/errors/README.adoc create mode 100644 haskell/src/interface/0.2-AI-MANIFEST.a2ml create mode 100644 haskell/src/interface/README.adoc create mode 100644 haskell/src/interface/abi/0.3-AI-MANIFEST.a2ml create mode 100644 haskell/src/interface/abi/README.adoc create mode 100644 haskell/src/interface/ffi/0.3-AI-MANIFEST.a2ml create mode 100644 haskell/src/interface/ffi/README.adoc create mode 100644 haskell/src/interface/ffi/build.zig create mode 100644 haskell/src/interface/ffi/src/0.4-AI-MANIFEST.a2ml create mode 100644 haskell/src/interface/ffi/src/README.adoc create mode 100644 haskell/src/interface/ffi/src/main.zig create mode 100644 haskell/src/interface/ffi/test/0.4-AI-MANIFEST.a2ml create mode 100644 haskell/src/interface/ffi/test/README.adoc create mode 100644 haskell/src/interface/ffi/test/integration_test.zig create mode 100644 haskell/src/interface/generated/0.3-AI-MANIFEST.a2ml create mode 100644 haskell/src/interface/generated/README.adoc create mode 100644 haskell/src/interface/generated/abi/.gitkeep create mode 100644 haskell/src/interface/generated/abi/0.4-AI-MANIFEST.a2ml create mode 100644 haskell/src/interface/generated/abi/README.adoc create mode 100644 haskell/stapeln.toml create mode 100644 haskell/tests/E2ESpec.hs create mode 100644 haskell/tests/PropertySpec.hs create mode 100644 haskell/tests/Spec.hs create mode 100644 haskell/tests/UnitSpec.hs create mode 100644 haskell/tests/fuzz/placeholder.txt create mode 100644 haskell/verification/0.1-AI-MANIFEST.a2ml create mode 100644 haskell/verification/README.adoc create mode 100644 haskell/verification/benchmarks/0.2-AI-MANIFEST.a2ml create mode 100644 haskell/verification/benchmarks/README.adoc create mode 100644 haskell/verification/coverage/0.2-AI-MANIFEST.a2ml create mode 100644 haskell/verification/coverage/README.adoc create mode 100644 haskell/verification/fuzzing/0.2-AI-MANIFEST.a2ml create mode 100644 haskell/verification/fuzzing/README.adoc create mode 100644 haskell/verification/proofs/0.2-AI-MANIFEST.a2ml create mode 100644 haskell/verification/proofs/README.adoc create mode 100644 haskell/verification/safety_case/0.2-AI-MANIFEST.a2ml create mode 100644 haskell/verification/safety_case/README.adoc create mode 100644 haskell/verification/simulations/0.2-AI-MANIFEST.a2ml create mode 100644 haskell/verification/simulations/README.adoc create mode 100644 haskell/verification/tests/0.2-AI-MANIFEST.a2ml create mode 100644 haskell/verification/tests/README.adoc create mode 100644 haskell/verification/traceability/0.2-AI-MANIFEST.a2ml create mode 100644 haskell/verification/traceability/README.adoc create mode 100644 rs/.devcontainer/Containerfile create mode 100644 rs/.devcontainer/README.adoc create mode 100644 rs/.devcontainer/devcontainer.json create mode 100644 rs/.editorconfig create mode 100644 rs/.envrc create mode 100644 rs/.guix-channel create mode 100644 rs/.machine_readable/0.1-AI-MANIFEST.a2ml create mode 100644 rs/.machine_readable/6a2/AGENTIC.a2ml create mode 100644 rs/.machine_readable/6a2/ECOSYSTEM.a2ml create mode 100644 rs/.machine_readable/6a2/META.a2ml create mode 100644 rs/.machine_readable/6a2/NEUROSYM.a2ml create mode 100644 rs/.machine_readable/6a2/PLAYBOOK.a2ml create mode 100644 rs/.machine_readable/6a2/STATE.a2ml create mode 100644 rs/.machine_readable/ADJUST.contractile create mode 100644 rs/.machine_readable/CLADE.a2ml create mode 100644 rs/.machine_readable/ENSAID_CONFIG.a2ml create mode 100644 rs/.machine_readable/INTENT.contractile create mode 100644 rs/.machine_readable/MUST.contractile create mode 100644 rs/.machine_readable/README.adoc create mode 100644 rs/.machine_readable/TRUST.contractile create mode 100644 rs/.machine_readable/agent_instructions/README.adoc create mode 100644 rs/.machine_readable/agent_instructions/coverage.a2ml create mode 100644 rs/.machine_readable/agent_instructions/debt.a2ml create mode 100644 rs/.machine_readable/agent_instructions/methodology.a2ml create mode 100644 rs/.machine_readable/ai/.clinerules create mode 100644 rs/.machine_readable/ai/.cursorrules create mode 100644 rs/.machine_readable/ai/.windsurfrules create mode 100644 rs/.machine_readable/ai/0.2-AI-MANIFEST.a2ml create mode 100644 rs/.machine_readable/ai/AI.a2ml create mode 100644 rs/.machine_readable/ai/PLACEHOLDERS.adoc create mode 100644 rs/.machine_readable/ai/README.adoc create mode 100644 rs/.machine_readable/anchors/0.2-AI-MANIFEST.a2ml create mode 100644 rs/.machine_readable/anchors/ANCHOR.a2ml create mode 100644 rs/.machine_readable/anchors/README.adoc create mode 100644 rs/.machine_readable/compliance/reuse/dep5 create mode 100644 rs/.machine_readable/compliance/rust/deny.toml create mode 100644 rs/.machine_readable/configs/0.2-AI-MANIFEST.a2ml create mode 100644 rs/.machine_readable/configs/README.adoc create mode 100644 rs/.machine_readable/configs/git-cliff/cliff.toml create mode 100644 rs/.machine_readable/contractiles/README.adoc create mode 100644 rs/.machine_readable/contractiles/bust/Bustfile.a2ml create mode 100644 rs/.machine_readable/contractiles/bust/bust.ncl create mode 100644 rs/.machine_readable/contractiles/dust/Dustfile.a2ml create mode 100644 rs/.machine_readable/contractiles/must/Mustfile.a2ml create mode 100644 rs/.machine_readable/contractiles/trust/Trustfile.a2ml create mode 100644 rs/.machine_readable/integrations/feedback-o-tron.a2ml create mode 100644 rs/.machine_readable/integrations/proven.a2ml create mode 100644 rs/.machine_readable/integrations/verisimdb.a2ml create mode 100644 rs/.machine_readable/integrations/vexometer.a2ml create mode 100644 rs/.machine_readable/policies/.maintenance-perms-ignore create mode 100644 rs/.machine_readable/policies/0.2-AI-MANIFEST.a2ml create mode 100644 rs/.machine_readable/policies/MAINTENANCE-AXES.a2ml create mode 100644 rs/.machine_readable/policies/MAINTENANCE-CHECKLIST.a2ml create mode 100644 rs/.machine_readable/policies/README.adoc create mode 100644 rs/.machine_readable/policies/SOFTWARE-DEVELOPMENT-APPROACH.a2ml create mode 100644 rs/.machine_readable/scripts/0.2-AI-MANIFEST.a2ml create mode 100644 rs/.machine_readable/scripts/forge/0.3-AI-MANIFEST.a2ml create mode 100644 rs/.machine_readable/scripts/forge/README.adoc create mode 100755 rs/.machine_readable/scripts/forge/forge-sync.sh create mode 100755 rs/.machine_readable/scripts/forge/git-cleanup.sh create mode 100644 rs/.machine_readable/scripts/lifecycle/0.3-AI-MANIFEST.a2ml create mode 100644 rs/.machine_readable/scripts/lifecycle/README.adoc create mode 100755 rs/.machine_readable/scripts/lifecycle/install-tools.sh create mode 100644 rs/.machine_readable/scripts/maintenance/maint-assault.sh create mode 100644 rs/.machine_readable/scripts/verification/0.3-AI-MANIFEST.a2ml create mode 100644 rs/.machine_readable/scripts/verification/README.adoc create mode 100644 rs/.machine_readable/svc/k9/README.adoc create mode 100644 rs/.machine_readable/svc/k9/examples/ci-config.k9.ncl create mode 100644 rs/.machine_readable/svc/k9/examples/project-metadata.k9.ncl create mode 100644 rs/.machine_readable/svc/k9/examples/setup-repo.k9.ncl create mode 100644 rs/.machine_readable/svc/k9/template-hunt.k9.ncl create mode 100644 rs/.machine_readable/svc/k9/template-kennel.k9.ncl create mode 100644 rs/.machine_readable/svc/k9/template-yard.k9.ncl create mode 100644 rs/.tool-versions create mode 100644 rs/.well-known/ai.txt create mode 100644 rs/.well-known/humans.txt create mode 100644 rs/.well-known/security.txt create mode 100644 rs/0-AI-MANIFEST.a2ml create mode 100644 rs/ARCHITECTURE.md create mode 100644 rs/CHANGELOG.md create mode 100644 rs/CODE_OF_CONDUCT.md create mode 100644 rs/CONTRIBUTING.md create mode 100644 rs/Cargo.lock create mode 100644 rs/Cargo.toml create mode 100644 rs/Containerfile create mode 100644 rs/EXPLAINME.adoc create mode 100644 rs/GOVERNANCE.md create mode 100644 rs/Justfile create mode 100644 rs/LICENSE create mode 100644 rs/LICENSES/AGPL-3.0-or-later.txt create mode 100644 rs/LICENSES/CC-BY-SA-4.0.txt create mode 100644 rs/LICENSES/MPL-2.0.txt create mode 100644 rs/MAINTAINERS create mode 100644 rs/QUICKSTART-DEV.adoc create mode 100644 rs/QUICKSTART-MAINTAINER.adoc create mode 100644 rs/QUICKSTART-USER.adoc create mode 100644 rs/README.md create mode 100644 rs/ROADMAP.adoc create mode 100644 rs/SECURITY.md create mode 100644 rs/TEST-NEEDS.md create mode 100644 rs/TOPOLOGY.md create mode 100644 rs/benches/a2ml_bench.rs create mode 100644 rs/container/.gatekeeper.yaml create mode 100644 rs/container/0.1-AI-MANIFEST.a2ml create mode 100644 rs/container/Containerfile create mode 100644 rs/container/README.adoc create mode 100644 rs/container/compose.example.toml create mode 100644 rs/container/compose.toml create mode 100755 rs/container/ct-build.sh create mode 100644 rs/container/deploy.k9.ncl create mode 100755 rs/container/entrypoint.sh create mode 100644 rs/container/manifest.toml create mode 100644 rs/container/vordr.toml create mode 100644 rs/contractile.just create mode 100644 rs/contractiles/intend/Intentfile.a2ml create mode 100644 rs/contractiles/must/Mustfile.a2ml create mode 100644 rs/contractiles/trust/Trustfile.a2ml create mode 100644 rs/docs/0.1-AI-MANIFEST.a2ml create mode 100644 rs/docs/QUICKSTART.adoc create mode 100644 rs/docs/README.adoc create mode 100644 rs/docs/RSR_OUTLINE.adoc create mode 100644 rs/docs/STATE-VISUALIZER.adoc create mode 100644 rs/docs/architecture/0.2-AI-MANIFEST.a2ml create mode 100644 rs/docs/architecture/THREAT-MODEL.adoc create mode 100644 rs/docs/attribution/0.2-AI-MANIFEST.a2ml create mode 100644 rs/docs/attribution/CITATION.cff create mode 100644 rs/docs/attribution/CITATIONS.adoc create mode 100644 rs/docs/attribution/CODEOWNERS.adoc create mode 100644 rs/docs/attribution/MAINTAINERS.adoc create mode 100644 rs/docs/attribution/README.adoc create mode 100644 rs/docs/decisions/0.2-AI-MANIFEST.a2ml create mode 100644 rs/docs/decisions/0000-template.adoc create mode 100644 rs/docs/decisions/0001-adopt-rsr-standard.adoc create mode 100644 rs/docs/decisions/README.adoc create mode 100644 rs/docs/developer/0.2-AI-MANIFEST.a2ml create mode 100644 rs/docs/developer/ABI-FFI-README.adoc create mode 100644 rs/docs/developer/README.adoc create mode 100644 rs/docs/governance/0.1-AI-MANIFEST.a2ml create mode 100644 rs/docs/governance/CRG-CRITERIA.a2ml create mode 100644 rs/docs/governance/CRG-CRITERIA.adoc create mode 100644 rs/docs/governance/MAINTENANCE-CHECKLIST.a2ml create mode 100644 rs/docs/governance/MAINTENANCE-CHECKLIST.adoc create mode 100644 rs/docs/governance/README.adoc create mode 100644 rs/docs/governance/SOFTWARE-DEVELOPMENT-APPROACH.a2ml create mode 100644 rs/docs/governance/SOFTWARE-DEVELOPMENT-APPROACH.adoc create mode 100644 rs/docs/governance/TSDM.a2ml create mode 100644 rs/docs/governance/TSDM.adoc create mode 100644 rs/docs/governance/audit/0.2-AI-MANIFEST.a2ml create mode 100644 rs/docs/governance/audit/README.adoc create mode 100644 rs/docs/governance/audit/compliance/0.3-AI-MANIFEST.a2ml create mode 100644 rs/docs/governance/audit/compliance/README.adoc create mode 100644 rs/docs/governance/audit/effects/0.3-AI-MANIFEST.a2ml create mode 100644 rs/docs/governance/audit/effects/README.adoc create mode 100644 rs/docs/governance/audit/systems/0.3-AI-MANIFEST.a2ml create mode 100644 rs/docs/governance/audit/systems/README.adoc create mode 100644 rs/docs/governance/maintenance/0.2-AI-MANIFEST.a2ml create mode 100644 rs/docs/governance/maintenance/README.adoc create mode 100644 rs/docs/governance/maintenance/adaptive/0.3-AI-MANIFEST.a2ml create mode 100644 rs/docs/governance/maintenance/adaptive/README.adoc create mode 100644 rs/docs/governance/maintenance/corrective/0.3-AI-MANIFEST.a2ml create mode 100644 rs/docs/governance/maintenance/corrective/README.adoc create mode 100644 rs/docs/governance/maintenance/perfective/0.3-AI-MANIFEST.a2ml create mode 100644 rs/docs/governance/maintenance/perfective/README.adoc create mode 100644 rs/docs/governance/planning/0.2-AI-MANIFEST.a2ml create mode 100644 rs/docs/governance/planning/README.adoc create mode 100644 rs/docs/governance/planning/could/0.3-AI-MANIFEST.a2ml create mode 100644 rs/docs/governance/planning/could/README.adoc create mode 100644 rs/docs/governance/planning/must/0.3-AI-MANIFEST.a2ml create mode 100644 rs/docs/governance/planning/must/README.adoc create mode 100644 rs/docs/governance/planning/should/0.3-AI-MANIFEST.a2ml create mode 100644 rs/docs/governance/planning/should/README.adoc create mode 100644 rs/docs/legal/0.2-AI-MANIFEST.a2ml create mode 100644 rs/docs/legal/EXHIBIT-A-ETHICAL-USE.txt create mode 100644 rs/docs/legal/EXHIBIT-B-QUANTUM-SAFE.txt create mode 100644 rs/docs/practice/.gitkeep create mode 100644 rs/docs/practice/0.2-AI-MANIFEST.a2ml create mode 100644 rs/docs/practice/AI-CONVENTIONS.adoc create mode 100644 rs/docs/practice/README.adoc create mode 100644 rs/docs/practice/STATE-VISUALIZER-GUIDE.adoc create mode 100644 rs/docs/reports/0.2-AI-MANIFEST.a2ml create mode 100644 rs/docs/reports/README.adoc create mode 100644 rs/docs/reports/compliance/0.3-AI-MANIFEST.a2ml create mode 100644 rs/docs/reports/compliance/README.adoc create mode 100644 rs/docs/reports/maintenance/0.3-AI-MANIFEST.a2ml create mode 100644 rs/docs/reports/maintenance/README.adoc create mode 100644 rs/docs/reports/performance/0.3-AI-MANIFEST.a2ml create mode 100644 rs/docs/reports/performance/README.adoc create mode 100644 rs/docs/reports/quality/0.3-AI-MANIFEST.a2ml create mode 100644 rs/docs/reports/quality/README.adoc create mode 100644 rs/docs/reports/security/0.3-AI-MANIFEST.a2ml create mode 100644 rs/docs/reports/security/README.adoc create mode 100644 rs/docs/standards/0.2-AI-MANIFEST.a2ml create mode 100644 rs/docs/standards/README.adoc create mode 100644 rs/docs/templates/contractiles/README.adoc create mode 100644 rs/docs/templates/contractiles/dust/Dustfile.a2ml create mode 100644 rs/docs/templates/contractiles/must/Mustfile.a2ml create mode 100644 rs/docs/templates/contractiles/trust/Trustfile.a2ml create mode 100644 rs/docs/theory/.gitkeep create mode 100644 rs/docs/theory/0.2-AI-MANIFEST.a2ml create mode 100644 rs/docs/theory/README.adoc create mode 100644 rs/docs/theory/computing/0.3-AI-MANIFEST.a2ml create mode 100644 rs/docs/theory/computing/README.adoc create mode 100644 rs/docs/theory/formalisms/0.3-AI-MANIFEST.a2ml create mode 100644 rs/docs/theory/formalisms/README.adoc create mode 100644 rs/docs/theory/mathematics/0.3-AI-MANIFEST.a2ml create mode 100644 rs/docs/theory/mathematics/README.adoc create mode 100644 rs/docs/theory/ontologies/0.3-AI-MANIFEST.a2ml create mode 100644 rs/docs/theory/ontologies/README.adoc create mode 100644 rs/docs/theory/other/0.3-AI-MANIFEST.a2ml create mode 100644 rs/docs/theory/other/README.adoc create mode 100644 rs/docs/theory/socio-technical/0.3-AI-MANIFEST.a2ml create mode 100644 rs/docs/theory/socio-technical/README.adoc create mode 100644 rs/docs/whitepapers/0.2-AI-MANIFEST.a2ml create mode 100644 rs/docs/whitepapers/README.adoc create mode 100644 rs/docs/whitepapers/academic/.gitkeep create mode 100644 rs/docs/whitepapers/academic/0.3-AI-MANIFEST.a2ml create mode 100644 rs/docs/whitepapers/academic/README.adoc create mode 100644 rs/docs/whitepapers/industry/.gitkeep create mode 100644 rs/docs/whitepapers/industry/0.3-AI-MANIFEST.a2ml create mode 100644 rs/docs/whitepapers/industry/README.adoc create mode 100644 rs/docs/whitepapers/outreach/0.3-AI-MANIFEST.a2ml create mode 100644 rs/docs/whitepapers/outreach/README.adoc create mode 100644 rs/docs/wikis/0.2-AI-MANIFEST.a2ml create mode 100644 rs/docs/wikis/README.adoc create mode 100644 rs/eclexiaiser.toml create mode 100644 rs/examples/0.1-AI-MANIFEST.a2ml create mode 100644 rs/examples/README.adoc create mode 100644 rs/examples/SafeDOMExample.res create mode 100644 rs/examples/web-project-deno.json create mode 100644 rs/features/0.1-AI-MANIFEST.a2ml create mode 100644 rs/features/README.adoc create mode 100644 rs/features/boj-server/0.2-AI-MANIFEST.a2ml create mode 100644 rs/features/boj-server/README.adoc create mode 100644 rs/features/panic-attacker/0.2-AI-MANIFEST.a2ml create mode 100644 rs/features/panic-attacker/README.adoc create mode 100644 rs/features/ssg/0.2-AI-MANIFEST.a2ml create mode 100644 rs/features/ssg/README.adoc create mode 100755 rs/features/ssg/ssg-bootstrap.sh create mode 100644 rs/generated/idrisiser/a2ml_rs_verified.ipkg create mode 100755 rs/generated/idrisiser/build.sh create mode 100644 rs/generated/idrisiser/idris2/A2ml/Verified/document_parser.idr create mode 100644 rs/generated/idrisiser/idris2/A2ml/Verified/document_types.idr create mode 100644 rs/generated/idrisiser/idris2/A2ml/Verified/round_trip.idr create mode 100644 rs/generated/idrisiser/zig/a2ml_rs_ffi.zig create mode 100644 rs/guix.scm create mode 100644 rs/idrisiser.toml create mode 100644 rs/idrisiser/parser.tsig create mode 100644 rs/idrisiser/round-trip.tsig create mode 100644 rs/idrisiser/types.tsig create mode 100644 rs/k9iser.toml create mode 100644 rs/llm-warmup-dev.md create mode 100644 rs/llm-warmup-user.md create mode 100644 rs/mise.toml create mode 100644 rs/selur-compose.toml create mode 100755 rs/setup.sh create mode 100644 rs/src/error.rs create mode 100644 rs/src/lib.rs create mode 100644 rs/src/parser.rs create mode 100644 rs/src/renderer.rs create mode 100644 rs/src/types.rs create mode 100644 rs/stapeln.toml create mode 100644 rs/tests/aspect_test.rs create mode 100644 rs/tests/e2e_test.rs create mode 100644 rs/tests/fuzz/placeholder.txt create mode 100644 rs/tests/property_test.rs create mode 100644 rs/verification/0.1-AI-MANIFEST.a2ml create mode 100644 rs/verification/README.adoc create mode 100644 rs/verification/benchmarks/0.2-AI-MANIFEST.a2ml create mode 100644 rs/verification/benchmarks/README.adoc create mode 100644 rs/verification/coverage/0.2-AI-MANIFEST.a2ml create mode 100644 rs/verification/coverage/README.adoc create mode 100644 rs/verification/fuzzing/0.2-AI-MANIFEST.a2ml create mode 100644 rs/verification/fuzzing/README.adoc create mode 100644 rs/verification/proofs/0.2-AI-MANIFEST.a2ml create mode 100644 rs/verification/proofs/README.adoc create mode 100644 rs/verification/safety_case/0.2-AI-MANIFEST.a2ml create mode 100644 rs/verification/safety_case/README.adoc create mode 100644 rs/verification/simulations/0.2-AI-MANIFEST.a2ml create mode 100644 rs/verification/simulations/README.adoc create mode 100644 rs/verification/tests/0.2-AI-MANIFEST.a2ml create mode 100644 rs/verification/tests/README.adoc create mode 100644 rs/verification/traceability/0.2-AI-MANIFEST.a2ml create mode 100644 rs/verification/traceability/README.adoc create mode 100644 showcase/.editorconfig create mode 100644 showcase/.machine_readable/6a2/STATE.a2ml create mode 100644 showcase/.machine_readable/ADJUST.contractile create mode 100644 showcase/.machine_readable/INTENT.contractile create mode 100644 showcase/.machine_readable/MUST.contractile create mode 100644 showcase/.machine_readable/STATE.a2ml create mode 100644 showcase/.machine_readable/TRUST.contractile create mode 100644 showcase/.machine_readable/agent_instructions/README.adoc create mode 100644 showcase/.machine_readable/agent_instructions/coverage.a2ml create mode 100644 showcase/.machine_readable/agent_instructions/debt.a2ml create mode 100644 showcase/.machine_readable/agent_instructions/methodology.a2ml create mode 100644 showcase/.machine_readable/anchors/ANCHOR.a2ml create mode 100644 showcase/.machine_readable/contractiles/adjust/adjustfile.a2ml create mode 100644 showcase/.machine_readable/contractiles/bust/Bustfile.a2ml create mode 100644 showcase/.machine_readable/contractiles/bust/bust.ncl create mode 100644 showcase/.machine_readable/contractiles/dust/Dustfile.a2ml create mode 100644 showcase/.machine_readable/contractiles/dust/dustfile.a2ml create mode 100644 showcase/.machine_readable/contractiles/intend/intendfile.a2ml create mode 100644 showcase/.machine_readable/contractiles/lust/lustfile.a2ml create mode 100644 showcase/.machine_readable/contractiles/must/mustfile.a2ml create mode 100644 showcase/.machine_readable/contractiles/trust/Trustfile.a2ml create mode 100644 showcase/.machine_readable/contractiles/trust/trustfile.a2ml create mode 100644 showcase/.machine_readable/integrations/feedback-o-tron.a2ml create mode 100644 showcase/.machine_readable/integrations/proven.a2ml create mode 100644 showcase/.machine_readable/integrations/verisimdb.a2ml create mode 100644 showcase/.machine_readable/integrations/vexometer.a2ml create mode 100644 showcase/.well-known/ai.txt create mode 100644 showcase/.well-known/humans.txt create mode 100644 showcase/.well-known/security.txt create mode 100644 showcase/0-AI-MANIFEST.a2ml create mode 100644 showcase/ARCHITECTURE.md create mode 100644 showcase/CODE_OF_CONDUCT.md create mode 100644 showcase/CONTRIBUTING.md create mode 100644 showcase/EXPLAINME.adoc create mode 100644 showcase/GOVERNANCE.md create mode 100644 showcase/Justfile create mode 100644 showcase/LICENSE create mode 100644 showcase/LICENSES/AGPL-3.0-or-later.txt create mode 100644 showcase/LICENSES/CC-BY-SA-4.0.txt create mode 100644 showcase/LICENSES/MPL-2.0.txt create mode 100644 showcase/MAINTAINERS create mode 100644 showcase/QUICKSTART-DEV.adoc create mode 100644 showcase/QUICKSTART-MAINTAINER.adoc create mode 100644 showcase/QUICKSTART-USER.adoc create mode 100644 showcase/README.md create mode 100644 showcase/SECURITY.md create mode 100644 showcase/TEST-NEEDS.md create mode 100644 showcase/TOPOLOGY.md create mode 100644 showcase/a2ml-showcase-tests.ipkg create mode 100644 showcase/content/examples.md create mode 100644 showcase/content/getting-started.md create mode 100644 showcase/content/index.md create mode 100644 showcase/content/integrations.md create mode 100644 showcase/content/specification.md create mode 100644 showcase/contractile.just create mode 100644 showcase/contractiles/intend/Intentfile.a2ml create mode 100644 showcase/contractiles/must/Mustfile.a2ml create mode 100644 showcase/contractiles/trust/Trustfile.a2ml create mode 100644 showcase/docs/accessibility/README.adoc create mode 100644 showcase/docs/accessibility/STANDARD.a2ml create mode 100644 showcase/docs/compliance/ACCESSIBILITY.adoc create mode 100644 showcase/guix.scm create mode 100644 showcase/k9iser.toml create mode 100644 showcase/llm-warmup-dev.md create mode 100644 showcase/llm-warmup-user.md create mode 100644 showcase/mise.toml create mode 100644 showcase/output/.well-known/security.txt create mode 100644 showcase/output/examples.html create mode 100644 showcase/output/getting-started.html create mode 100644 showcase/output/index.html create mode 100644 showcase/output/integrations.html create mode 100644 showcase/output/specification.html create mode 100755 showcase/setup.sh create mode 100644 showcase/stapeln.toml create mode 100644 showcase/template.html create mode 100644 showcase/tests/README.md create mode 100644 showcase/tests/fuzz/placeholder.txt create mode 100644 showcase/tests/idris2/Main.idr create mode 100644 showcase/tests/idris2/Test/Spec.idr create mode 100644 showcase/tests/idris2/ValidateTest.idr create mode 100644 validate-action/.devcontainer/Containerfile create mode 100644 validate-action/.devcontainer/README.adoc create mode 100644 validate-action/.devcontainer/devcontainer.json create mode 100644 validate-action/.editorconfig create mode 100644 validate-action/.envrc create mode 100644 validate-action/.guix-channel create mode 100644 validate-action/.machine_readable/0.1-AI-MANIFEST.a2ml create mode 100644 validate-action/.machine_readable/CLADE.a2ml create mode 100644 validate-action/.machine_readable/ENSAID_CONFIG.a2ml create mode 100644 validate-action/.machine_readable/README.adoc create mode 100644 validate-action/.machine_readable/ai/.clinerules create mode 100644 validate-action/.machine_readable/ai/.cursorrules create mode 100644 validate-action/.machine_readable/ai/.windsurfrules create mode 100644 validate-action/.machine_readable/ai/0.2-AI-MANIFEST.a2ml create mode 100644 validate-action/.machine_readable/ai/AI.a2ml create mode 100644 validate-action/.machine_readable/ai/PLACEHOLDERS.adoc create mode 100644 validate-action/.machine_readable/ai/README.adoc create mode 100644 validate-action/.machine_readable/bot_directives/README.adoc create mode 100644 validate-action/.machine_readable/bot_directives/coverage.a2ml create mode 100644 validate-action/.machine_readable/bot_directives/debt.a2ml create mode 100644 validate-action/.machine_readable/bot_directives/methodology.a2ml create mode 100644 validate-action/.machine_readable/compliance/reuse/dep5 create mode 100644 validate-action/.machine_readable/compliance/rust/deny.toml create mode 100644 validate-action/.machine_readable/configs/0.2-AI-MANIFEST.a2ml create mode 100644 validate-action/.machine_readable/configs/README.adoc create mode 100644 validate-action/.machine_readable/configs/git-cliff/cliff.toml create mode 100644 validate-action/.machine_readable/contractiles/INDEX.a2ml create mode 100644 validate-action/.machine_readable/contractiles/_base.ncl create mode 100644 validate-action/.machine_readable/contractiles/adjust/Adjustfile.a2ml create mode 100644 validate-action/.machine_readable/contractiles/adjust/adjust.k9.ncl create mode 100644 validate-action/.machine_readable/contractiles/adjust/adjust.manifest.a2ml create mode 100644 validate-action/.machine_readable/contractiles/adjust/adjust.ncl create mode 100644 validate-action/.machine_readable/contractiles/bust/Bustfile.a2ml create mode 100644 validate-action/.machine_readable/contractiles/bust/bust.k9.ncl create mode 100644 validate-action/.machine_readable/contractiles/bust/bust.manifest.a2ml create mode 100644 validate-action/.machine_readable/contractiles/bust/bust.ncl create mode 100644 validate-action/.machine_readable/contractiles/dust/Dustfile.a2ml create mode 100644 validate-action/.machine_readable/contractiles/dust/dust.k9.ncl create mode 100644 validate-action/.machine_readable/contractiles/dust/dust.manifest.a2ml create mode 100644 validate-action/.machine_readable/contractiles/dust/dust.ncl create mode 100644 validate-action/.machine_readable/contractiles/intend/Intentfile.a2ml create mode 100644 validate-action/.machine_readable/contractiles/intend/intend.k9.ncl create mode 100644 validate-action/.machine_readable/contractiles/intend/intend.manifest.a2ml create mode 100644 validate-action/.machine_readable/contractiles/intend/intend.ncl create mode 100644 validate-action/.machine_readable/contractiles/must/Mustfile.a2ml create mode 100644 validate-action/.machine_readable/contractiles/must/must.k9.ncl create mode 100644 validate-action/.machine_readable/contractiles/must/must.manifest.a2ml create mode 100644 validate-action/.machine_readable/contractiles/must/must.ncl create mode 100644 validate-action/.machine_readable/contractiles/trust/Trustfile.a2ml create mode 100644 validate-action/.machine_readable/contractiles/trust/trust.k9.ncl create mode 100644 validate-action/.machine_readable/contractiles/trust/trust.manifest.a2ml create mode 100644 validate-action/.machine_readable/contractiles/trust/trust.ncl create mode 100644 validate-action/.machine_readable/descriptiles/AGENTIC.a2ml create mode 100644 validate-action/.machine_readable/descriptiles/ECOSYSTEM.a2ml create mode 100644 validate-action/.machine_readable/descriptiles/META.a2ml create mode 100644 validate-action/.machine_readable/descriptiles/NEUROSYM.a2ml create mode 100644 validate-action/.machine_readable/descriptiles/PLAYBOOK.a2ml create mode 100644 validate-action/.machine_readable/descriptiles/STATE.a2ml create mode 100644 validate-action/.machine_readable/descriptiles/anchors/0.2-AI-MANIFEST.a2ml create mode 100644 validate-action/.machine_readable/descriptiles/anchors/ANCHOR.a2ml create mode 100644 validate-action/.machine_readable/descriptiles/anchors/README.adoc create mode 100644 validate-action/.machine_readable/integrations/feedback-o-tron.a2ml create mode 100644 validate-action/.machine_readable/integrations/proven.a2ml create mode 100644 validate-action/.machine_readable/integrations/verisimdb.a2ml create mode 100644 validate-action/.machine_readable/integrations/vexometer.a2ml create mode 100644 validate-action/.machine_readable/policies/.maintenance-perms-ignore create mode 100644 validate-action/.machine_readable/policies/0.2-AI-MANIFEST.a2ml create mode 100644 validate-action/.machine_readable/policies/MAINTENANCE-AXES.a2ml create mode 100644 validate-action/.machine_readable/policies/MAINTENANCE-CHECKLIST.a2ml create mode 100644 validate-action/.machine_readable/policies/README.adoc create mode 100644 validate-action/.machine_readable/policies/SOFTWARE-DEVELOPMENT-APPROACH.a2ml create mode 100644 validate-action/.machine_readable/scripts/0.2-AI-MANIFEST.a2ml create mode 100644 validate-action/.machine_readable/scripts/forge/0.3-AI-MANIFEST.a2ml create mode 100644 validate-action/.machine_readable/scripts/forge/README.adoc create mode 100755 validate-action/.machine_readable/scripts/forge/forge-sync.sh create mode 100755 validate-action/.machine_readable/scripts/forge/git-cleanup.sh create mode 100644 validate-action/.machine_readable/scripts/lifecycle/0.3-AI-MANIFEST.a2ml create mode 100644 validate-action/.machine_readable/scripts/lifecycle/README.adoc create mode 100755 validate-action/.machine_readable/scripts/lifecycle/install-tools.sh create mode 100644 validate-action/.machine_readable/scripts/maintenance/maint-assault.sh create mode 100644 validate-action/.machine_readable/scripts/verification/0.3-AI-MANIFEST.a2ml create mode 100644 validate-action/.machine_readable/scripts/verification/README.adoc create mode 100644 validate-action/.tool-versions create mode 100644 validate-action/.well-known/ai.txt create mode 100644 validate-action/.well-known/humans.txt create mode 100644 validate-action/.well-known/security.txt create mode 100644 validate-action/0-AI-MANIFEST.a2ml create mode 100644 validate-action/ARCHITECTURE.md create mode 100644 validate-action/CHANGELOG.md create mode 100644 validate-action/CODE_OF_CONDUCT.md create mode 100644 validate-action/CONTRIBUTING.md create mode 100644 validate-action/Containerfile create mode 100644 validate-action/EXPLAINME.adoc create mode 100644 validate-action/GOVERNANCE.adoc create mode 100644 validate-action/GOVERNANCE.md create mode 100644 validate-action/Justfile create mode 100644 validate-action/LICENSE create mode 100644 validate-action/LICENSES/AGPL-3.0-or-later.txt create mode 100644 validate-action/LICENSES/CC-BY-SA-4.0.txt create mode 100644 validate-action/LICENSES/MPL-2.0.txt create mode 100644 validate-action/MAINTAINERS create mode 100644 validate-action/MAINTAINERS.adoc create mode 100644 validate-action/PROOF-NEEDS.md create mode 100644 validate-action/QUICKSTART-DEV.adoc create mode 100644 validate-action/QUICKSTART-MAINTAINER.adoc create mode 100644 validate-action/QUICKSTART-USER.adoc create mode 100644 validate-action/README.md create mode 100644 validate-action/ROADMAP.adoc create mode 100644 validate-action/SECURITY.md create mode 100644 validate-action/TEST-NEEDS.md create mode 100644 validate-action/TOPOLOGY.md create mode 100644 validate-action/action.yml create mode 100644 validate-action/container/.gatekeeper.yaml create mode 100644 validate-action/container/0.1-AI-MANIFEST.a2ml create mode 100644 validate-action/container/Containerfile create mode 100644 validate-action/container/README.adoc create mode 100644 validate-action/container/compose.example.toml create mode 100644 validate-action/container/compose.toml create mode 100755 validate-action/container/ct-build.sh create mode 100644 validate-action/container/deploy.k9.ncl create mode 100755 validate-action/container/entrypoint.sh create mode 100644 validate-action/container/manifest.toml create mode 100644 validate-action/container/vordr.toml create mode 100644 validate-action/contractile.just create mode 100644 validate-action/docs/0.1-AI-MANIFEST.a2ml create mode 100644 validate-action/docs/QUICKSTART.adoc create mode 100644 validate-action/docs/README.adoc create mode 100644 validate-action/docs/RSR_OUTLINE.adoc create mode 100644 validate-action/docs/STATE-VISUALIZER.adoc create mode 100644 validate-action/docs/architecture/0.2-AI-MANIFEST.a2ml create mode 100644 validate-action/docs/architecture/THREAT-MODEL.adoc create mode 100644 validate-action/docs/attribution/0.2-AI-MANIFEST.a2ml create mode 100644 validate-action/docs/attribution/CITATION.cff create mode 100644 validate-action/docs/attribution/CITATIONS.adoc create mode 100644 validate-action/docs/attribution/CODEOWNERS.adoc create mode 100644 validate-action/docs/attribution/MAINTAINERS.adoc create mode 100644 validate-action/docs/attribution/README.adoc create mode 100644 validate-action/docs/decisions/0.2-AI-MANIFEST.a2ml create mode 100644 validate-action/docs/decisions/0000-template.adoc create mode 100644 validate-action/docs/decisions/0001-adopt-rsr-standard.adoc create mode 100644 validate-action/docs/decisions/README.adoc create mode 100644 validate-action/docs/developer/0.2-AI-MANIFEST.a2ml create mode 100644 validate-action/docs/developer/ABI-FFI-README.adoc create mode 100644 validate-action/docs/developer/README.adoc create mode 100644 validate-action/docs/governance/0.1-AI-MANIFEST.a2ml create mode 100644 validate-action/docs/governance/CRG-CRITERIA.a2ml create mode 100644 validate-action/docs/governance/CRG-CRITERIA.adoc create mode 100644 validate-action/docs/governance/MAINTENANCE-CHECKLIST.a2ml create mode 100644 validate-action/docs/governance/MAINTENANCE-CHECKLIST.adoc create mode 100644 validate-action/docs/governance/README.adoc create mode 100644 validate-action/docs/governance/SOFTWARE-DEVELOPMENT-APPROACH.a2ml create mode 100644 validate-action/docs/governance/SOFTWARE-DEVELOPMENT-APPROACH.adoc create mode 100644 validate-action/docs/governance/TSDM.a2ml create mode 100644 validate-action/docs/governance/TSDM.adoc create mode 100644 validate-action/docs/governance/audit/0.2-AI-MANIFEST.a2ml create mode 100644 validate-action/docs/governance/audit/README.adoc create mode 100644 validate-action/docs/governance/audit/compliance/0.3-AI-MANIFEST.a2ml create mode 100644 validate-action/docs/governance/audit/compliance/README.adoc create mode 100644 validate-action/docs/governance/audit/effects/0.3-AI-MANIFEST.a2ml create mode 100644 validate-action/docs/governance/audit/effects/README.adoc create mode 100644 validate-action/docs/governance/audit/systems/0.3-AI-MANIFEST.a2ml create mode 100644 validate-action/docs/governance/audit/systems/README.adoc create mode 100644 validate-action/docs/governance/maintenance/0.2-AI-MANIFEST.a2ml create mode 100644 validate-action/docs/governance/maintenance/README.adoc create mode 100644 validate-action/docs/governance/maintenance/adaptive/0.3-AI-MANIFEST.a2ml create mode 100644 validate-action/docs/governance/maintenance/adaptive/README.adoc create mode 100644 validate-action/docs/governance/maintenance/corrective/0.3-AI-MANIFEST.a2ml create mode 100644 validate-action/docs/governance/maintenance/corrective/README.adoc create mode 100644 validate-action/docs/governance/maintenance/perfective/0.3-AI-MANIFEST.a2ml create mode 100644 validate-action/docs/governance/maintenance/perfective/README.adoc create mode 100644 validate-action/docs/governance/planning/0.2-AI-MANIFEST.a2ml create mode 100644 validate-action/docs/governance/planning/README.adoc create mode 100644 validate-action/docs/governance/planning/could/0.3-AI-MANIFEST.a2ml create mode 100644 validate-action/docs/governance/planning/could/README.adoc create mode 100644 validate-action/docs/governance/planning/must/0.3-AI-MANIFEST.a2ml create mode 100644 validate-action/docs/governance/planning/must/README.adoc create mode 100644 validate-action/docs/governance/planning/should/0.3-AI-MANIFEST.a2ml create mode 100644 validate-action/docs/governance/planning/should/README.adoc create mode 100644 validate-action/docs/legal/0.2-AI-MANIFEST.a2ml create mode 100644 validate-action/docs/legal/EXHIBIT-A-ETHICAL-USE.txt create mode 100644 validate-action/docs/legal/EXHIBIT-B-QUANTUM-SAFE.txt create mode 100644 validate-action/docs/practice/.gitkeep create mode 100644 validate-action/docs/practice/0.2-AI-MANIFEST.a2ml create mode 100644 validate-action/docs/practice/AI-CONVENTIONS.adoc create mode 100644 validate-action/docs/practice/README.adoc create mode 100644 validate-action/docs/practice/STATE-VISUALIZER-GUIDE.adoc create mode 100644 validate-action/docs/reports/0.2-AI-MANIFEST.a2ml create mode 100644 validate-action/docs/reports/README.adoc create mode 100644 validate-action/docs/reports/compliance/0.3-AI-MANIFEST.a2ml create mode 100644 validate-action/docs/reports/compliance/README.adoc create mode 100644 validate-action/docs/reports/maintenance/0.3-AI-MANIFEST.a2ml create mode 100644 validate-action/docs/reports/maintenance/README.adoc create mode 100644 validate-action/docs/reports/performance/0.3-AI-MANIFEST.a2ml create mode 100644 validate-action/docs/reports/performance/README.adoc create mode 100644 validate-action/docs/reports/quality/0.3-AI-MANIFEST.a2ml create mode 100644 validate-action/docs/reports/quality/README.adoc create mode 100644 validate-action/docs/reports/security/0.3-AI-MANIFEST.a2ml create mode 100644 validate-action/docs/reports/security/README.adoc create mode 100644 validate-action/docs/standards/0.2-AI-MANIFEST.a2ml create mode 100644 validate-action/docs/standards/README.adoc create mode 100644 validate-action/docs/theory/.gitkeep create mode 100644 validate-action/docs/theory/0.2-AI-MANIFEST.a2ml create mode 100644 validate-action/docs/theory/README.adoc create mode 100644 validate-action/docs/theory/computing/0.3-AI-MANIFEST.a2ml create mode 100644 validate-action/docs/theory/computing/README.adoc create mode 100644 validate-action/docs/theory/formalisms/0.3-AI-MANIFEST.a2ml create mode 100644 validate-action/docs/theory/formalisms/README.adoc create mode 100644 validate-action/docs/theory/mathematics/0.3-AI-MANIFEST.a2ml create mode 100644 validate-action/docs/theory/mathematics/README.adoc create mode 100644 validate-action/docs/theory/ontologies/0.3-AI-MANIFEST.a2ml create mode 100644 validate-action/docs/theory/ontologies/README.adoc create mode 100644 validate-action/docs/theory/other/0.3-AI-MANIFEST.a2ml create mode 100644 validate-action/docs/theory/other/README.adoc create mode 100644 validate-action/docs/theory/socio-technical/0.3-AI-MANIFEST.a2ml create mode 100644 validate-action/docs/theory/socio-technical/README.adoc create mode 100644 validate-action/docs/whitepapers/0.2-AI-MANIFEST.a2ml create mode 100644 validate-action/docs/whitepapers/README.adoc create mode 100644 validate-action/docs/whitepapers/academic/.gitkeep create mode 100644 validate-action/docs/whitepapers/academic/0.3-AI-MANIFEST.a2ml create mode 100644 validate-action/docs/whitepapers/academic/README.adoc create mode 100644 validate-action/docs/whitepapers/industry/.gitkeep create mode 100644 validate-action/docs/whitepapers/industry/0.3-AI-MANIFEST.a2ml create mode 100644 validate-action/docs/whitepapers/industry/README.adoc create mode 100644 validate-action/docs/whitepapers/outreach/0.3-AI-MANIFEST.a2ml create mode 100644 validate-action/docs/whitepapers/outreach/README.adoc create mode 100644 validate-action/docs/wikis/0.2-AI-MANIFEST.a2ml create mode 100644 validate-action/docs/wikis/README.adoc create mode 100644 validate-action/eclexiaiser.toml create mode 100644 validate-action/examples/0.1-AI-MANIFEST.a2ml create mode 100644 validate-action/examples/README.adoc create mode 100644 validate-action/examples/web-project-deno.json create mode 100644 validate-action/features/0.1-AI-MANIFEST.a2ml create mode 100644 validate-action/features/README.adoc create mode 100644 validate-action/features/boj-server/0.2-AI-MANIFEST.a2ml create mode 100644 validate-action/features/boj-server/README.adoc create mode 100644 validate-action/features/panic-attacker/0.2-AI-MANIFEST.a2ml create mode 100644 validate-action/features/panic-attacker/README.adoc create mode 100644 validate-action/features/ssg/0.2-AI-MANIFEST.a2ml create mode 100644 validate-action/features/ssg/README.adoc create mode 100755 validate-action/features/ssg/ssg-bootstrap.sh create mode 100644 validate-action/guix.scm create mode 100755 validate-action/hooks/install.sh create mode 100755 validate-action/hooks/pre-commit create mode 100644 validate-action/k9iser.toml create mode 100644 validate-action/llm-warmup-dev.md create mode 100644 validate-action/llm-warmup-user.md create mode 100644 validate-action/mise.toml create mode 100644 validate-action/selur-compose.toml create mode 100755 validate-action/setup.sh create mode 100644 validate-action/src/0.1-AI-MANIFEST.a2ml create mode 100644 validate-action/src/README.adoc create mode 100644 validate-action/src/aspects/0.2-AI-MANIFEST.a2ml create mode 100644 validate-action/src/aspects/README.adoc create mode 100644 validate-action/src/aspects/integrity/0.3-AI-MANIFEST.a2ml create mode 100644 validate-action/src/aspects/integrity/README.adoc create mode 100644 validate-action/src/aspects/observability/0.3-AI-MANIFEST.a2ml create mode 100644 validate-action/src/aspects/observability/README.adoc create mode 100644 validate-action/src/aspects/security/0.3-AI-MANIFEST.a2ml create mode 100644 validate-action/src/aspects/security/README.adoc create mode 100644 validate-action/src/bridges/0.2-AI-MANIFEST.a2ml create mode 100644 validate-action/src/contracts/0.2-AI-MANIFEST.a2ml create mode 100644 validate-action/src/contracts/README.adoc create mode 100644 validate-action/src/core/0.2-AI-MANIFEST.a2ml create mode 100644 validate-action/src/definitions/0.2-AI-MANIFEST.a2ml create mode 100644 validate-action/src/definitions/README.adoc create mode 100644 validate-action/src/errors/0.2-AI-MANIFEST.a2ml create mode 100644 validate-action/src/errors/README.adoc create mode 100644 validate-action/src/interface/0.2-AI-MANIFEST.a2ml create mode 100644 validate-action/src/interface/README.adoc create mode 100644 validate-action/src/interface/abi/0.3-AI-MANIFEST.a2ml create mode 100644 validate-action/src/interface/abi/README.adoc create mode 100644 validate-action/src/interface/ffi/0.3-AI-MANIFEST.a2ml create mode 100644 validate-action/src/interface/ffi/README.adoc create mode 100644 validate-action/src/interface/ffi/build.zig create mode 100644 validate-action/src/interface/ffi/src/0.4-AI-MANIFEST.a2ml create mode 100644 validate-action/src/interface/ffi/src/README.adoc create mode 100644 validate-action/src/interface/ffi/src/main.zig create mode 100644 validate-action/src/interface/ffi/test/0.4-AI-MANIFEST.a2ml create mode 100644 validate-action/src/interface/ffi/test/README.adoc create mode 100644 validate-action/src/interface/ffi/test/integration_test.zig create mode 100644 validate-action/src/interface/generated/0.3-AI-MANIFEST.a2ml create mode 100644 validate-action/src/interface/generated/README.adoc create mode 100644 validate-action/src/interface/generated/abi/.gitkeep create mode 100644 validate-action/src/interface/generated/abi/0.4-AI-MANIFEST.a2ml create mode 100644 validate-action/src/interface/generated/abi/README.adoc create mode 100644 validate-action/stapeln.toml create mode 100644 validate-action/tests/fuzz/placeholder.txt create mode 100755 validate-action/validate-a2ml.sh create mode 100644 validate-action/verification/0.1-AI-MANIFEST.a2ml create mode 100644 validate-action/verification/README.adoc create mode 100644 validate-action/verification/benchmarks/0.2-AI-MANIFEST.a2ml create mode 100644 validate-action/verification/benchmarks/README.adoc create mode 100644 validate-action/verification/coverage/0.2-AI-MANIFEST.a2ml create mode 100644 validate-action/verification/coverage/README.adoc create mode 100644 validate-action/verification/fuzzing/0.2-AI-MANIFEST.a2ml create mode 100644 validate-action/verification/fuzzing/README.adoc create mode 100644 validate-action/verification/proofs/0.2-AI-MANIFEST.a2ml create mode 100644 validate-action/verification/proofs/README.adoc create mode 100644 validate-action/verification/safety_case/0.2-AI-MANIFEST.a2ml create mode 100644 validate-action/verification/safety_case/README.adoc create mode 100644 validate-action/verification/simulations/0.2-AI-MANIFEST.a2ml create mode 100644 validate-action/verification/simulations/README.adoc create mode 100644 validate-action/verification/tests/0.2-AI-MANIFEST.a2ml create mode 100644 validate-action/verification/tests/README.adoc create mode 100644 validate-action/verification/traceability/0.2-AI-MANIFEST.a2ml create mode 100644 validate-action/verification/traceability/README.adoc diff --git a/deno/.devcontainer/Containerfile b/deno/.devcontainer/Containerfile new file mode 100644 index 0000000..b0a6fd1 --- /dev/null +++ b/deno/.devcontainer/Containerfile @@ -0,0 +1,32 @@ +# SPDX-License-Identifier: MPL-2.0 +# Copyright (c) {{CURRENT_YEAR}} {{AUTHOR}} ({{OWNER}}) <{{AUTHOR_EMAIL}}> +# +# Dev Container image for {{PROJECT_NAME}} +# Base: Chainguard Wolfi (minimal, supply-chain-secure) +# Build: podman build -t {{PROJECT_NAME}}-dev -f .devcontainer/Containerfile . + +FROM cgr.dev/chainguard/wolfi-base:latest + +# Install common development tools +RUN apk update && apk add --no-cache \ + bash \ + curl \ + git \ + openssh-client \ + ca-certificates \ + build-base \ + posix-libc-utils \ + shadow \ + && rm -rf /var/cache/apk/* + +# Create non-root dev user (matches devcontainer.json remoteUser) +RUN groupadd -g 1000 nonroot || true \ + && useradd -m -u 1000 -g 1000 -s /bin/bash nonroot || true + +# Set workspace directory +WORKDIR /workspaces/{{PROJECT_NAME}} + +# Default shell +ENV SHELL=/bin/bash + +USER nonroot diff --git a/deno/.devcontainer/README.adoc b/deno/.devcontainer/README.adoc new file mode 100644 index 0000000..3bfb50e --- /dev/null +++ b/deno/.devcontainer/README.adoc @@ -0,0 +1,27 @@ +// SPDX-License-Identifier: CC-BY-SA-4.0 += Dev Container Usage +:author: {{AUTHOR}} <{{AUTHOR_EMAIL}}> + +== Overview + +This dev container uses `cgr.dev/chainguard/wolfi-base` with git, curl, bash, and just pre-installed. Dev container features add git, just, and nickel automatically. + +== VS Code (Local) + +. Install the *Dev Containers* extension (`ms-vscode-remote.remote-containers`). +. Set `dev.containers.dockerPath` to `podman` in VS Code settings. +. Open the repo folder, then choose **Reopen in Container** from the command palette. + +== GitHub Codespaces + +. From the repository on GitHub, click **Code > Codespaces > New codespace**. +. The container builds automatically from this configuration. + +== Gitpod + +. Prefix the repo URL with `https://gitpod.io/#` to launch a workspace. +. Gitpod reads `devcontainer.json` and builds the environment. + +== Customization + +Replace `{{PROJECT_NAME}}` placeholders in both `devcontainer.json` and `Containerfile` with your actual project name. Run `just deps` to verify the environment after first launch. diff --git a/deno/.devcontainer/devcontainer.json b/deno/.devcontainer/devcontainer.json new file mode 100644 index 0000000..a4b33e0 --- /dev/null +++ b/deno/.devcontainer/devcontainer.json @@ -0,0 +1,69 @@ +// SPDX-License-Identifier: MPL-2.0 +// Copyright (c) {{CURRENT_YEAR}} {{AUTHOR}} ({{OWNER}}) <{{AUTHOR_EMAIL}}> +// +// Dev Container configuration for {{PROJECT_NAME}} +// Works with: VS Code Dev Containers, GitHub Codespaces, Gitpod +// Container runtime: Podman (recommended) or any OCI-compliant runtime +{ + "name": "{{PROJECT_NAME}}", + + "build": { + "dockerfile": "Containerfile", + "context": ".." + }, + + "features": { + "ghcr.io/devcontainers/features/git:1": { + "ppa": false, + "version": "latest" + }, + "ghcr.io/jdx/devcontainer-features/just:1": {}, + "ghcr.io/nickel-lang/devcontainer-feature:0": {} + }, + + "postCreateCommand": "just deps", + + "remoteUser": "nonroot", + + "containerEnv": { + "EDITOR": "code --wait", + "LANG": "C.UTF-8" + }, + + "customizations": { + "vscode": { + "extensions": [ + "EditorConfig.EditorConfig", + "eamodio.gitlens", + "streetsidesoftware.code-spell-checker", + "timonwong.shellcheck", + "tamasfe.even-better-toml", + "skellock.just", + "redhat.vscode-yaml", + "DavidAnson.vscode-markdownlint", + "asciidoctor.asciidoctor-vscode", + "usernamehw.errorlens" + ], + "settings": { + "editor.formatOnSave": true, + "editor.insertSpaces": true, + "editor.tabSize": 2, + "files.trimTrailingWhitespace": true, + "files.insertFinalNewline": true, + "files.trimFinalNewlines": true, + "[makefile]": { + "editor.insertSpaces": false + } + } + }, + "codespaces": { + "openFiles": [ + "README.adoc" + ] + } + }, + + "forwardPorts": [], + + "shutdownAction": "stopContainer" +} diff --git a/deno/.editorconfig b/deno/.editorconfig new file mode 100644 index 0000000..bcdbb4d --- /dev/null +++ b/deno/.editorconfig @@ -0,0 +1,65 @@ +# RSR-template-repo - Editor Configuration +# https://editorconfig.org + +root = true + +[*] +charset = utf-8 +end_of_line = lf +indent_size = 2 +indent_style = space +insert_final_newline = true +trim_trailing_whitespace = true + +[*.md] +trim_trailing_whitespace = false + +[*.adoc] +trim_trailing_whitespace = false + +[*.rs] +indent_size = 4 + +[*.ex] +indent_size = 2 + +[*.exs] +indent_size = 2 + +[*.zig] +indent_size = 4 + +[*.ada] +indent_size = 3 + +[*.adb] +indent_size = 3 + +[*.ads] +indent_size = 3 + +[*.hs] +indent_size = 2 + +[*.res] +indent_size = 2 + +[*.resi] +indent_size = 2 + +[*.ncl] +indent_size = 2 + +[*.rkt] +indent_size = 2 + +[*.scm] +indent_size = 2 + +[*.nix] +indent_size = 2 + +[Justfile] +indent_style = space +indent_size = 4 + diff --git a/deno/.envrc b/deno/.envrc new file mode 100644 index 0000000..0b5b702 --- /dev/null +++ b/deno/.envrc @@ -0,0 +1,27 @@ +# SPDX-License-Identifier: MPL-2.0 +# Activate development environment +# Install direnv: https://direnv.net/ + +# Load .tool-versions if asdf is available +if has asdf; then + use asdf +fi + +# Load Guix shell if guix.scm exists +if has guix && [ -f guix.scm ]; then + use guix +fi + +# Load Nix flake if flake.nix exists +if has nix && [ -f flake.nix ]; then + use flake +fi + +# Project environment variables +export PROJECT_NAME="{{PROJECT_NAME}}" +export RSR_TIER="infrastructure" +# export DATABASE_URL="..." +# export API_KEY="..." + +# Source .env if it exists (gitignored) +dotenv_if_exists diff --git a/deno/.guix-channel b/deno/.guix-channel new file mode 100644 index 0000000..f9bdf68 --- /dev/null +++ b/deno/.guix-channel @@ -0,0 +1,22 @@ +;; SPDX-License-Identifier: MPL-2.0 +;; Copyright (c) {{CURRENT_YEAR}} {{AUTHOR}} ({{OWNER}}) <{{AUTHOR_EMAIL}}> +;; +;; Guix channel definition for {{PROJECT_NAME}} +;; +;; To use this channel, add to ~/.config/guix/channels.scm: +;; +;; (channel +;; (name '{{PROJECT_NAME}}) +;; (url "https://github.com/{{OWNER}}/{{PROJECT_NAME}}") +;; (branch "main")) +;; +;; Then: guix pull + +(channel + (version 0) + (url "https://github.com/{{OWNER}}/{{PROJECT_NAME}}") + (dependencies + (channel + (name 'guix) + (url "https://git.savannah.gnu.org/git/guix.git") + (branch "master")))) diff --git a/deno/.hypatia-ignore b/deno/.hypatia-ignore new file mode 100644 index 0000000..c1be67d --- /dev/null +++ b/deno/.hypatia-ignore @@ -0,0 +1,6 @@ +# SPDX-License-Identifier: MPL-2.0 +# .hypatia-ignore + +cicd_rules/banned_language_file:rescript.json +cicd_rules/banned_language_file:jsr.json +cicd_rules/banned_language_file:deno.json diff --git a/deno/.machine_readable/0.1-AI-MANIFEST.a2ml b/deno/.machine_readable/0.1-AI-MANIFEST.a2ml new file mode 100644 index 0000000..9d2bc7a --- /dev/null +++ b/deno/.machine_readable/0.1-AI-MANIFEST.a2ml @@ -0,0 +1,29 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "machine-readable-pillar" +level: 1 +parent: "../0-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Registry for all machine-readable metadata, policies, and internal + automation scripts. + +canonical_locations: + state: "STATE.a2ml" + meta: "META.a2ml" + ecosystem: "ECOSYSTEM.a2ml" + agentic: "AGENTIC.a2ml" + neurosym: "NEUROSYM.a2ml" + playbook: "PLAYBOOK.a2ml" + anchors: "anchors/" + policies: "policies/" + ai_configs: "ai/" + compliance: "compliance/" + scripts: "scripts/" + +invariants: + - "Metadata files MUST follow a2ml format" + - "Internal automation MUST live in scripts/ subfolder" diff --git a/deno/.machine_readable/6a2/AGENTIC.a2ml b/deno/.machine_readable/6a2/AGENTIC.a2ml new file mode 100644 index 0000000..a8f6b17 --- /dev/null +++ b/deno/.machine_readable/6a2/AGENTIC.a2ml @@ -0,0 +1,36 @@ +# SPDX-License-Identifier: MPL-2.0 +# Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) +# +# AGENTIC.a2ml — AI agent constraints and capabilities +# Defines what AI agents can and cannot do in this repository. + +[metadata] +version = "0.1.0" +last-updated = "2026-04-11" + +[agent-permissions] +can-edit-source = true +can-edit-tests = true +can-edit-docs = true +can-edit-config = true +can-create-files = true + +[agent-constraints] +# What AI agents must NOT do: +# - Never use banned language patterns (believe_me, unsafeCoerce, etc.) +# - Never commit secrets or credentials +# - Never use banned languages (TypeScript, Python, Go, etc.) +# - Never place state files in repository root (must be in .machine_readable/) +# - Never use AGPL license (use MPL-2.0) + +[maintenance-integrity] +fail-closed = true +require-evidence-per-step = true +allow-silent-skip = false +require-rerun-after-fix = true +release-claim-requires-hard-pass = true + +[automation-hooks] +# on-enter: Read 0-AI-MANIFEST.a2ml, then STATE.a2ml +# on-exit: Update STATE.a2ml with session outcomes +# on-commit: Run just validate-rsr diff --git a/deno/.machine_readable/6a2/ECOSYSTEM.a2ml b/deno/.machine_readable/6a2/ECOSYSTEM.a2ml new file mode 100644 index 0000000..22945fe --- /dev/null +++ b/deno/.machine_readable/6a2/ECOSYSTEM.a2ml @@ -0,0 +1,26 @@ +# SPDX-License-Identifier: MPL-2.0 +# Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) +# +# ECOSYSTEM.a2ml — Project ecosystem position +# Relationships, dependencies, integration points. + +[metadata] +version = "0.1.0" +last-updated = "2026-04-11" + +[project] +name = "a2ml-deno" +purpose = "" # TODO: describe project purpose +role = "" # TODO: describe project role # e.g. ffi-infrastructure, cli-tool, library, service + +[position-in-ecosystem] +tier = "infrastructure" # 1 | 2 | infrastructure + +[related-projects] +# relationship types: sibling-standard, dependency, dependent, inspiration, potential-consumer +# - { name = "language-bridges", relationship = "sibling-standard" } +# - { name = "hypatia", relationship = "potential-consumer" } + +[integration-points] +# External systems this project connects to +# - { system = "gitbot-fleet", direction = "outbound", protocol = "repository_dispatch" } diff --git a/deno/.machine_readable/6a2/META.a2ml b/deno/.machine_readable/6a2/META.a2ml new file mode 100644 index 0000000..d9b09e6 --- /dev/null +++ b/deno/.machine_readable/6a2/META.a2ml @@ -0,0 +1,53 @@ +# SPDX-License-Identifier: MPL-2.0 +# Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) +# +# META.a2ml — Project meta-level information +# Architecture decisions, design rationale, governance. + +[metadata] +version = "0.1.0" +last-updated = "2026-04-11" + +[project-info] +type = "library" # TODO: update type (library|binary|service|website|monorepo) # library | binary | monorepo | service | website +languages = [] # e.g. ["rust", "zig", "idris2"] +license = "MPL-2.0" +author = "Jonathan D.A. Jewell (hyperpolymath)" + +[architecture-decisions] +# ADR format: status = proposed | accepted | deprecated | superseded | rejected +# - { id = "ADR-001", title = "Use Zig for FFI", status = "accepted", date = "2026-02-14" } + +[development-practices] +build-tool = "just" +container-runtime = "podman" +ci-platform = "github-actions" +package-manager = "guix" # guix | nix | cargo | mix + +[maintenance-axes] +scoping-first = true +execution-order = "axis-1 > axis-2 > axis-3" +axis-1 = "must > intend > like" +axis-2 = "corrective > adaptive > perfective" +axis-3 = "systems > compliance > effects" + +[scoping] +sources = "README, roadmap, status docs, maintenance checklist, CI/security docs" +marker-scan = "TODO/FIXME/XXX/HACK/STUB/PARTIAL" +idris-unsound-scan = "believe_me/assert_total" + +[axis-2-maintenance-rules] +corrective-first = true +adaptive-second = true +adaptive-focus = "scope-change reconciliation, stale-reference removal, obsolete-work culling" +perfective-third = true +perfective-source = "axis-1 honest state after corrective/adaptive updates" + +[axis-3-audit-rules] +audit-focus = "systems in place, documentation explains actual state, safety/security accounted for, observed effects reviewed" +compliance-focus = "seams/compromises/exception register, bounded exceptions, anti-drift checks" +drift-risk-example = "single exception broadening into policy violation (e.g. ReScript->TypeScript spread)" +effects-evidence = "benchmark execution/results and maintainer status dialogue/review" + +[design-rationale] +# Key design decisions and their reasoning diff --git a/deno/.machine_readable/6a2/NEUROSYM.a2ml b/deno/.machine_readable/6a2/NEUROSYM.a2ml new file mode 100644 index 0000000..1acf7a3 --- /dev/null +++ b/deno/.machine_readable/6a2/NEUROSYM.a2ml @@ -0,0 +1,23 @@ +# SPDX-License-Identifier: MPL-2.0 +# Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) +# +# NEUROSYM.a2ml — Neurosymbolic integration metadata +# Configuration for Hypatia scanning and symbolic reasoning. + +[metadata] +version = "0.1.0" +last-updated = "2026-04-11" + +[hypatia-config] +scan-enabled = true +scan-depth = "standard" # quick | standard | deep +report-format = "logtalk" + +[symbolic-rules] +# Custom symbolic rules for this project +# - { name = "no-unsafe-ffi", pattern = "believe_me|unsafeCoerce", severity = "critical" } + +[neural-config] +# Neural pattern detection settings +# confidence-threshold = 0.85 +# model = "hypatia-v2" diff --git a/deno/.machine_readable/6a2/PLAYBOOK.a2ml b/deno/.machine_readable/6a2/PLAYBOOK.a2ml new file mode 100644 index 0000000..6408e1c --- /dev/null +++ b/deno/.machine_readable/6a2/PLAYBOOK.a2ml @@ -0,0 +1,35 @@ +# SPDX-License-Identifier: MPL-2.0 +# Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) +# +# PLAYBOOK.a2ml — Operational playbook +# Runbooks, incident response, deployment procedures. + +[metadata] +version = "0.1.0" +last-updated = "2026-04-11" + +[deployment] +# method = "gitops" # gitops | manual | ci-triggered +# target = "container" # container | binary | library | wasm + +[incident-response] +# 1. Check .machine_readable/STATE.a2ml for current status +# 2. Review recent commits and CI results +# 3. Run `just validate` to check compliance +# 4. Run `just security` to audit for vulnerabilities + +[release-process] +# 1. Update version in STATE.a2ml, META.a2ml, Justfile +# 2. Run `just release-preflight` (validate + quality + security + maint-hard-pass) +# 3. Optional local permission hardening: `just perms-snapshot && just perms-lock` +# 4. Tag and push +# 5. Restore local permissions if needed: `just perms-restore` +# 6. Run `just container-push` if applicable + +[maintenance-operations] +# Baseline audit: +# just maint-audit +# Hard release gate: +# just maint-hard-pass +# Permission audit: +# just perms-audit diff --git a/deno/.machine_readable/6a2/STATE.a2ml b/deno/.machine_readable/6a2/STATE.a2ml new file mode 100644 index 0000000..ddbfda7 --- /dev/null +++ b/deno/.machine_readable/6a2/STATE.a2ml @@ -0,0 +1,64 @@ +# SPDX-License-Identifier: MPL-2.0 +# Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) +# +# STATE.a2ml — Project state checkpoint (META-TEMPLATE) +# +# This is the STATE file for a2ml-deno. +# When consumed by a new project, replace {{PLACEHOLDER}} tokens +# and customize sections below for the target project. + +[metadata] +project = "a2ml-deno" +version = "0.2.0" +last-updated = "2026-02-28" +status = "active" # active | paused | archived + +[project-context] +name = "a2ml-deno" +purpose = "Canonical RSR-compliant repository template providing scaffolding for all hyperpolymath projects — including CI/CD, AI manifests, ABI/FFI standards, container ecosystem, and governance infrastructure." +completion-percentage = 95 + +[position] +phase = "maintenance" # design | implementation | testing | maintenance | archived +maturity = "production" # experimental | alpha | beta | production | lts + +[route-to-mvp] +milestones = [ + { name = "Phase 0: Core scaffolding (justfile, CI/CD, .machine_readable)", completion = 100 }, + { name = "Phase 1: ABI/FFI standard (Idris2/Zig templates)", completion = 100 }, + { name = "Phase 1b: AI Gatekeeper Protocol (0-AI-MANIFEST.a2ml)", completion = 100 }, + { name = "Phase 1c: TOPOLOGY.md standard and guide", completion = 100 }, + { name = "Phase 1d: Maintenance gate (axes, checklist, approach)", completion = 100 }, + { name = "Phase 1e: Trustfile / contractiles", completion = 100 }, + { name = "Phase 2: Container ecosystem templates (stapeln)", completion = 100 }, + { name = "Phase 3: Multi-forge sync hardening", completion = 0 }, + { name = "Phase 4: Nix/Guix reproducible shells", completion = 50 }, +] + +[blockers-and-issues] +# No active blockers + +[critical-next-actions] +actions = [ + "Container templates complete — test with `just container-init`", + "Validate container templates across wolfi-base and static Chainguard images", + "Harden multi-forge sync for GitLab/Bitbucket mirroring edge cases", + "Expand Nix/Guix development shell templates", +] + +[maintenance-status] +last-run-utc = "never" +last-report = "docs/reports/maintenance/latest.json" +last-result = "unknown" # unknown | pass | warn | fail +open-warnings = 0 +open-failures = 0 + +[ecosystem] +part-of = ["RSR Framework", "stapeln ecosystem"] +depends-on = ["stapeln", "selur-compose", "cerro-torre", "svalinn", "vordr", "k9-svc"] + +# --------------------------------------------------------------------------- +# NOTE FOR CONSUMERS: When using this template to create a new repo, reset +# the fields above to your project's values and replace all {{PLACEHOLDER}} +# tokens. The milestones above describe the TEMPLATE's evolution, not yours. +# --------------------------------------------------------------------------- diff --git a/deno/.machine_readable/ADJUST.contractile b/deno/.machine_readable/ADJUST.contractile new file mode 100644 index 0000000..ebbc291 --- /dev/null +++ b/deno/.machine_readable/ADJUST.contractile @@ -0,0 +1,126 @@ +; SPDX-License-Identifier: MPL-2.0 +; ADJUST.contractile — Accessibility invariants for a2ml-deno +; "ADJUST" = Accessibility & Digital Justice for Universal Software & Technology +; +; Part of the contractile family: MUST, TRUST, DUST, INTENT, ADJUST +; This file is machine-readable. LLM/SLM agents MUST NOT violate these invariants. + +; ── Definitions ────────────────────────────────────────────────── +; +; ADJUST (noun/verb) +; The accessibility contractile. Defines how software must adapt to serve +; all users regardless of ability, device, or context. Named for the verb +; "adjust" — to make suitable, to adapt, to accommodate — which is the +; core action of accessible design. +; +; Scope: +; ADJUST governs all user-facing interfaces: GUI, TUI, CLI, web, mobile, +; documentation, error messages, and installation flows. It applies to +; both human users and assistive technologies (screen readers, switch +; devices, braille displays, voice control). +; +; Relationship to other contractiles: +; - MUST: ADJUST invariants are a subset of MUST — violating ADJUST +; is a MUST violation. ADJUST exists separately because accessibility +; rules are numerous enough to warrant their own file, and because +; LLMs frequently forget accessibility unless explicitly reminded. +; - TRUST: ADJUST does not affect trust levels. All trust tiers must +; respect ADJUST invariants equally. +; - DUST: Deprecating a feature does not exempt it from ADJUST until +; it is fully removed. Deprecated UI must remain accessible. +; - INTENT: ADJUST supports the anti-purpose "this software is NOT +; only for able-bodied users with modern hardware." +; +; Standard: WCAG 2.2 Level AA (minimum) +; https://www.w3.org/WAI/WCAG22/quickref/?levels=aaa +; +; Why a separate file: +; Experience shows LLMs and developers alike treat accessibility as an +; afterthought. By placing invariants in a contractile that is loaded +; at session start, we make it structurally impossible to forget. +; +; ── End Definitions ────────────────────────────────────────────── + +(adjust-contractile + (version "1.0.0") + (full-name "Accessibility & Digital Justice for Universal Software & Technology") + (standard "WCAG-2.2-AA") + (repo "a2ml-deno") + + (invariants + ; ── Visual ── + (adjust "colour-contrast-ratio >= 4.5:1 for normal text") + (adjust "colour-contrast-ratio >= 3:1 for large text (18pt+ or 14pt+ bold)") + (adjust "no information conveyed by colour alone") + (adjust "no flashing or strobing content (3 flashes/second max)") + (adjust "text resizable to 200% without loss of content or function") + (adjust "focus indicators visible on all interactive elements") + + ; ── Keyboard ── + (adjust "all interactive elements reachable via keyboard (Tab/Shift+Tab)") + (adjust "no keyboard traps — user can always Tab away") + (adjust "skip navigation link present on pages with repeated blocks") + (adjust "logical focus order follows visual reading order") + + ; ── Screen reader ── + (adjust "all images have meaningful alt text (or alt='' if decorative)") + (adjust "all form inputs have associated labels") + (adjust "ARIA landmarks used for page regions (main, nav, banner, etc.)") + (adjust "dynamic content updates announced via aria-live regions") + (adjust "semantic HTML used (headings, lists, tables) — not div soup") + + ; ── Interactive ── + (adjust "touch targets minimum 44x44px on mobile/touch interfaces") + (adjust "error messages identify the field and describe the error") + (adjust "error messages not conveyed by colour or position alone") + (adjust "form validation provides suggestions for correction") + + ; ── Media ── + (adjust "video has captions (closed or open)") + (adjust "audio-only content has text transcript") + (adjust "no autoplay of media with sound") + + ; ── Motion ── + (adjust "animations respect prefers-reduced-motion media query") + (adjust "no content depends on motion to convey meaning") + + ; ── CLI/TUI ── + (adjust "CLI output must not rely solely on colour (use symbols: [OK] [FAIL])") + (adjust "TUI must support high-contrast mode") + (adjust "all CLI commands support --help with plain-text output") + (adjust "error messages written in plain language, not jargon or codes alone") + + ; ── Documentation ── + (adjust "docs use clear language, short sentences, logical structure") + (adjust "code examples include comments explaining non-obvious steps") + (adjust "diagrams have text descriptions or alt text") + + ; ── Internationalisation (i18n) ── + (adjust "all user-facing strings externalisable for translation") + (adjust "no hardcoded English in error messages — use message keys") + (adjust "date/time/number formats locale-aware") + (adjust "RTL (right-to-left) layout support where applicable") + (adjust "Unicode handled correctly throughout (UTF-8 everywhere)") + ) + + (related-resources + ; LOL — super-parallel corpus crawler for 1500+ languages + ; Use for linguistic data, translation coverage, and i18n validation + (lol "standards/lol — multilingual NLP corpus, see README.adoc") + (polyglot-i18n "polyglot-i18n — i18n framework and WASM translation engine") + ) + + (enforcement + (ci "accessibility linting in quality.yml workflow") + (pr-block "PR blocked if accessibility regression detected") + (tool "axe-core or pa11y for automated checks on web UI") + (tool "CLI output inspected for colour-only signalling") + (manual "manual screen reader test before major releases") + ) + + (notes + "These are MINIMUM requirements. Exceeding them (AAA) is encouraged." + "When in doubt about an accessibility decision, ask — don't guess." + "Accessibility is not optional polish — it is a structural requirement." + ) +) diff --git a/deno/.machine_readable/CLADE.a2ml b/deno/.machine_readable/CLADE.a2ml new file mode 100644 index 0000000..f2ffdc2 --- /dev/null +++ b/deno/.machine_readable/CLADE.a2ml @@ -0,0 +1,47 @@ +# SPDX-License-Identifier: MPL-2.0 +# Clade declaration — part of the gv-clade-index registry +# See: https://github.com/hyperpolymath/gv-clade-index + +[identity] +uuid = "29762172-f22b-532a-a0e7-5d188854e896" +primary-forge = "github" +primary-owner = "hyperpolymath" +canonical-name = "a2ml-deno" +prefixed-name = "rm-a2ml-deno" + +[clade] +primary = "rm" +secondary = ["gv"] +assigned = "2026-03-16" +rationale = "" + +[forges] +github = "hyperpolymath/a2ml-deno" +gitlab = "hyperpolymath/a2ml-deno" +bitbucket = "hyperpolymath/a2ml-deno" + +[lineage] +type = "standalone" +parent = "RSR template — scaffold for new repos" +born = "2026-03-16" + +# Lifecycle status (added by clade-status-backfill; see gv-clade-index ADR 0006). +# Identity (uuid) and status are SEPARATE layers: uuid is immortal; phase is a +# mutable pointer. No phase is terminal (extinct -> active is a legal "Gitassic +# Park" transition on the same uuid). A rename is NOT a phase change — the old +# prefixed-name goes to aliases[], uuid and phase are untouched. +[status] +# One of: reserved incubating active dormant | merged superseded archived extinct +phase = "active" +since = "2026-03-16" +present = true +aliases = [] +merged-into = "" +superseded-by = "" +successors = [] +ended = "" + +[[status.history]] +phase = "active" +since = "2026-03-16" +note = "backfilled default — correct if the true phase differs" diff --git a/deno/.machine_readable/ENSAID_CONFIG.a2ml b/deno/.machine_readable/ENSAID_CONFIG.a2ml new file mode 100644 index 0000000..1384822 --- /dev/null +++ b/deno/.machine_readable/ENSAID_CONFIG.a2ml @@ -0,0 +1,96 @@ +# SPDX-License-Identifier: MPL-2.0 +# Copyright (c) {{CURRENT_YEAR}} {{AUTHOR}} ({{OWNER}}) <{{AUTHOR_EMAIL}}> +# +# ENSAID_CONFIG.a2ml — eNSAID Environment Configuration +# Per-repo configuration for PanLL and eNSAID-compatible tools. +# +# Canonical location: .machine_readable/ENSAID_CONFIG.a2ml +# Spec: https://github.com/hyperpolymath/standards/tree/main/ensaid-config +# +# Naming convention: +# - UPPERCASE + underscore = non-executable machine-readable file +# - Lives in .machine_readable/ alongside STATE.a2ml, META.a2ml, etc. + +# ───────────────────────────────────────────────────────────────── +# [ensaid] — Core eNSAID identity and version +# ───────────────────────────────────────────────────────────────── +[ensaid] +version = "1.0.0" +tool = "panll" + +# ───────────────────────────────────────────────────────────────── +# [workspace] — Workspace mode, protection, and execution policy +# ───────────────────────────────────────────────────────────────── +[workspace] +mode = "rhodium" # rhodium | gold | silver | bronze +protection = "open" # open | guarded | locked +execution = "live" # live | dry-run | approval-required + +# ───────────────────────────────────────────────────────────────── +# [preferences] — User/repo-level display and behaviour preferences +# ───────────────────────────────────────────────────────────────── +[preferences] +humidity = "medium" # high | medium | low (drift aura intensity) +default-arrangement = "default-3-panel" # workspace arrangement ID +auto-connect = true # auto-connect panels to backends on load + +# ───────────────────────────────────────────────────────────────── +# [panels] — Panel visibility, enablement, and isolation overrides +# ───────────────────────────────────────────────────────────────── +[panels] +version = "1.0.0" + +# By default, all panels are available. Uncomment to restrict: +# [[panels.enabled]] +# id = "valence-shell" +# isolation = "native" +# auto-connect = true +# +# [[panels.enabled]] +# id = "editor-bridge" +# isolation = "native" +# auto-connect = true + +# Panels to hide for this repo context: +# [panels.disabled] +# ids = [] + +# ───────────────────────────────────────────────────────────────── +# [workflows] — Automation Router event-driven cross-panel rules +# ───────────────────────────────────────────────────────────────── +[workflows] +version = "1.0.0" + +# Example: rebuild on file save +# [[workflows.rule]] +# name = "build-on-save" +# trigger = { event = "file-changed", pattern = "src/**/*.res" } +# condition = { panel = "build-dashboard", field = "watchMode", equals = true } +# action = { panel = "build-dashboard", message = "TriggerBuild", args = { target = "game" } } +# approval = "auto-fire" # auto-fire | require-approval | approve-once | dry-run-first + +# ───────────────────────────────────────────────────────────────── +# [clades] — Panel clade trait and capability overrides +# ───────────────────────────────────────────────────────────────── +[clades] +version = "1.0.0" + +# Example: add a custom capability to a panel clade +# [[clades.override]] +# id = "build-dashboard" +# traits = { has-work-items = true } +# capabilities-add = ["CustomCheck"] + +# ───────────────────────────────────────────────────────────────── +# [portfolios] — Custom panel bundles for this repo's workflow +# ───────────────────────────────────────────────────────────────── +[portfolios] +version = "1.0.0" + +# Example: a custom portfolio for this project +# [[portfolios.custom]] +# id = "{{project}}-dev" +# name = "{{PROJECT_NAME}} Development" +# description = "Panels for {{PROJECT_NAME}} development" +# panels = ["valence-shell", "editor-bridge", "build-dashboard"] +# default-isolation = "native" diff --git a/deno/.machine_readable/INTENT.contractile b/deno/.machine_readable/INTENT.contractile new file mode 100644 index 0000000..83a26a4 --- /dev/null +++ b/deno/.machine_readable/INTENT.contractile @@ -0,0 +1,72 @@ +; SPDX-License-Identifier: MPL-2.0 +; INTENT.contractile — Purpose and scope for a2ml-deno +; Helps LLM/SLM agents understand what this repo IS and IS NOT. +; +; Part of the contractile family: MUST, TRUST, DUST, INTENT, ADJUST + +; ── Definitions ────────────────────────────────────────────────── +; +; INTENT (noun) +; The purpose contractile. Defines what this repository IS, what it is +; NOT (anti-purpose), and which architectural decisions are load-bearing. +; Without INTENT, LLMs drift into scope creep, reverse key decisions, +; or add features that belong in a different repo. +; +; Scope: +; INTENT governs the conceptual boundaries of the project — its reason +; for existing, its domain, and its relationship to the ecosystem. +; It does NOT specify implementation details (that's MUST and code). +; +; Relationship to other contractiles: +; - MUST: INTENT explains WHY certain MUSTs exist. If you don't +; understand a MUST, read INTENT first. +; - TRUST: The "ask-before-touching" section in INTENT maps directly +; to TRUST.trust-deny for the most sensitive areas. +; - ADJUST: INTENT's anti-purpose should include "this software is +; NOT only for users with perfect vision/hearing/mobility." +; - DUST: When INTENT changes (repo pivots), related DUST entries +; should be created for the abandoned direction. +; +; ── End Definitions ────────────────────────────────────────────── + +(intent-contractile + (version "1.0.0") + (repo "a2ml-deno") + + ; === Purpose (what this repo IS) === + (purpose + "{{ONE_PARAGRAPH_PURPOSE}}" + ) + + ; === Anti-Purpose (what this repo is NOT — prevents scope creep) === + (anti-purpose + "{{ONE_PARAGRAPH_ANTI_PURPOSE}}" + ; Examples: + ; "This is NOT a general-purpose database — it solves one specific problem." + ; "This is NOT a framework — it is a library with a focused API." + ; "This does NOT handle authentication — that is delegated to [other repo]." + ) + + ; === Key Architectural Decisions That Must Not Be Reversed === + (architectural-invariants + ; *REMINDER: List the foundational decisions* + ; ("Idris2 for ABI definitions — dependent types prove interface correctness") + ; ("Zig for FFI — zero-cost C ABI compatibility") + ; ("Elixir for supervision — OTP fault tolerance") + ) + + ; === Sensitive Areas (if in doubt, ask) === + (ask-before-touching + ; *REMINDER: List areas where LLMs should check before modifying* + ; "src/abi/ — formal proofs, changes require re-verification" + ; "ffi/zig/ — C ABI boundary, changes affect all language bindings" + ; ".machine_readable/ — checkpoint files, format is specified" + ) + + ; === Ecosystem Position === + (ecosystem + (belongs-to "{{MONOREPO_OR_STANDALONE}}") + (depends-on ("{{DEP1}}" "{{DEP2}}")) + (depended-on-by ("{{CONSUMER1}}" "{{CONSUMER2}}")) + ) +) diff --git a/deno/.machine_readable/MUST.contractile b/deno/.machine_readable/MUST.contractile new file mode 100644 index 0000000..4a4a60d --- /dev/null +++ b/deno/.machine_readable/MUST.contractile @@ -0,0 +1,91 @@ +; SPDX-License-Identifier: MPL-2.0 +; MUST.contractile — Baseline invariants for a2ml-deno +; These constraints MUST NOT be violated. K9 validators enforce them. +; +; Part of the contractile family: MUST, TRUST, DUST, INTENT, ADJUST + +; ── Definitions ────────────────────────────────────────────────── +; +; MUST (noun/verb) +; The hard-constraint contractile. Defines invariants that are structurally +; required for the repository to function correctly and safely. Violating +; a MUST is always a bug — there are no "soft" MUSTs. +; +; Scope: +; MUST governs code, configuration, CI, and structure. It does NOT govern +; style, preference, or approach — those belong in CLAUDE.md or coding +; standards. MUST is for things that break the project if violated. +; +; Relationship to other contractiles: +; - TRUST: MUST is enforced regardless of trust level. Even maximal-trust +; agents cannot violate MUST constraints. +; - ADJUST: All ADJUST invariants are implicitly MUST invariants too. +; ADJUST exists separately for visibility. +; - INTENT: MUST protects the architectural decisions described in INTENT. +; - DUST: When a feature enters DUST (deprecation), its MUST constraints +; remain active until the feature is fully removed. +; +; Enforcement: +; K9 validators in contractiles/k9/ machine-check MUST constraints. +; CI runs these on every PR. Violations block merge. +; +; ── End Definitions ────────────────────────────────────────────── + +(must-contractile + (version "1.0.0") + (repo "a2ml-deno") + + ; === Universal Invariants (apply to ALL repos) === + + (invariants + ; Paths + (must "no hardcoded absolute paths (/home/*, /mnt/*, /var/mnt/*)") + (must "all paths use env vars, XDG dirs, or relative references") + + ; Language policy + (must "no new TypeScript files") + (must "no new Python files") + (must "no new Go files") + (must "no npm/bun/yarn/pnpm dependencies — Deno only") + + ; Dangerous patterns + (must "no believe_me (Idris2)") + (must "no assert_total (Idris2)") + (must "no Admitted (Coq)") + (must "no sorry (Lean)") + (must "no unsafeCoerce (Haskell)") + (must "no Obj.magic (OCaml)") + (must "no unsafe {} blocks without safety comment (Rust)") + + ; License + (must "SPDX-License-Identifier header on every source file") + (must "no removal or modification of LICENSE file") + + ; Structure + (must ".machine_readable/ directory preserved") + (must "0-AI-MANIFEST.a2ml preserved") + (must "no SCM files in repo root — only in .machine_readable/") + + ; CI + (must "no removal of CI workflows without explicit approval") + (must "all GitHub Actions SHA-pinned") + + ; Code quality + (must "tests must not be deleted or weakened") + (must "generated code in generated/ directory only") + (must "no introduction of OWASP top 10 vulnerabilities") + + ; ABI/FFI (if applicable) + (must "no modification of ABI contracts without proof update") + (must "no removal of formal verification proofs") + ) + + ; === Project-Specific Invariants === + ; *REMINDER: Add invariants specific to this repo* + ; (must "# Add project-specific invariants here") + + (enforcement + (k9-validator "contractiles/k9/must-check.k9.ncl") + (ci "quality.yml runs must-check on every PR") + ) +) diff --git a/deno/.machine_readable/README.adoc b/deno/.machine_readable/README.adoc new file mode 100644 index 0000000..471d6c7 --- /dev/null +++ b/deno/.machine_readable/README.adoc @@ -0,0 +1 @@ += .machine_readable Pillar diff --git a/deno/.machine_readable/TRUST.contractile b/deno/.machine_readable/TRUST.contractile new file mode 100644 index 0000000..675234a --- /dev/null +++ b/deno/.machine_readable/TRUST.contractile @@ -0,0 +1,80 @@ +; SPDX-License-Identifier: MPL-2.0 +; TRUST.contractile — Trust boundaries for a2ml-deno +; Defines what LLM/SLM agents are trusted to do without asking. +; +; Part of the contractile family: MUST, TRUST, DUST, INTENT, ADJUST + +; ── Definitions ────────────────────────────────────────────────── +; +; TRUST (noun/verb) +; The permission contractile. Defines the boundary between what an AI +; agent may do autonomously and what requires human approval. Trust is +; graduated — not binary — with four levels from minimal to maximal. +; +; Trust levels: +; - maximal: Agent may read, build, test, lint, format, heal freely. +; Only destructive/external actions require approval. +; - standard: Agent may read and build. Test/lint need approval. +; - restricted: Agent may read only. All modifications need approval. +; - minimal: Agent may read specific files only. Everything else blocked. +; +; Scope: +; TRUST governs AI agent behaviour only. It does not affect human +; contributors — humans follow CONTRIBUTING.md and GOVERNANCE.adoc. +; +; Relationship to other contractiles: +; - MUST: Trust never overrides MUST. Even at maximal trust, MUST +; violations are blocked. +; - ADJUST: Trust does not exempt from ADJUST. All trust tiers must +; produce accessible output. +; - INTENT: TRUST.trust-deny protects the sensitive areas listed in +; INTENT.ask-before-touching. +; - DUST: Deprecated features have the same trust rules as active ones. +; +; ── End Definitions ────────────────────────────────────────────── + +(trust-contractile + (version "1.0.0") + (repo "a2ml-deno") + + (trust-level "maximal") ; maximal | standard | restricted | minimal + + ; === Maximal Trust (default) === + ; LLM may freely do these without asking: + (trust-actions + "read" ; Read any file in the repo + "build" ; Run build commands + "test" ; Run test suites + "lint" ; Run linters and formatters + "format" ; Auto-format code + "doctor" ; Run self-diagnostics + "heal" ; Attempt automatic repair + "git-status" ; Check git status + "git-diff" ; View diffs + "git-log" ; View history + ) + + ; === Denied Actions (always require human approval) === + (trust-deny + "delete-branch" ; Could lose work + "force-push" ; Overwrites history + "modify-ci-secrets" ; Security sensitive + "publish" ; External visibility + "push-to-main" ; Protected branch + "delete-files-bulk" ; More than 5 files at once + "modify-license" ; Legal implications + "modify-security-policy" ; Security implications + "remove-proofs" ; Formal verification regression + "disable-ci-checks" ; Safety regression + ) + + ; === Trust Boundary === + (trust-boundary "repo") ; LLM confined to this repo unless explicitly told otherwise + + ; === Override === + ; Repos requiring tighter trust override these settings with justification: + ; (override + ; (trust-level "restricted") + ; (reason "Contains production secrets / handles PII / etc.") + ; ) +) diff --git a/deno/.machine_readable/agent_instructions/README.adoc b/deno/.machine_readable/agent_instructions/README.adoc new file mode 100644 index 0000000..1cc7487 --- /dev/null +++ b/deno/.machine_readable/agent_instructions/README.adoc @@ -0,0 +1,41 @@ +// SPDX-License-Identifier: CC-BY-SA-4.0 +// Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) += Agent Instructions +:toc: preamble + +Methodology-aware configuration for AI agents. Read by any AI agent +(Claude, Gemini, Copilot, etc.) at session start. + +== Files + +[cols="1,3"] +|=== +| File | Purpose + +| `methodology.a2ml` +| Default mode, invariants, ring ceiling, priority weights, convergent budget + +| `coverage.a2ml` +| Session coverage tracking — what was visited, what was skipped, what has MUSTs + +| `debt.a2ml` +| Meander debt — things found but not fixed, carried between sessions +|=== + +== How Agents Use These + +1. Read `methodology.a2ml` at session start — know mode, invariants, ceiling +2. Read `coverage.a2ml` — know what was visited last time, what was skipped +3. Read `debt.a2ml` — know what's outstanding from previous sessions +4. At session end, update `coverage.a2ml` and `debt.a2ml` + +== Relationship to Other Files + +* `AGENTIC.a2ml` says WHAT agents can do (permissions, gating) +* `agent_instructions/` says HOW agents should work (methodology) +* `bot_directives/` says what the gitbot-fleet does (fleet-specific) +* `CLAUDE.md` says how Claude specifically should work (Claude-specific) + +== Reference + +ADR-002 in `standards/agentic-a2ml/docs/ADR-002-methodology-layer.adoc` diff --git a/deno/.machine_readable/agent_instructions/coverage.a2ml b/deno/.machine_readable/agent_instructions/coverage.a2ml new file mode 100644 index 0000000..6979664 --- /dev/null +++ b/deno/.machine_readable/agent_instructions/coverage.a2ml @@ -0,0 +1,61 @@ +# SPDX-License-Identifier: MPL-2.0 +# Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) +# +# coverage.a2ml — Session coverage tracking +# Updated at the end of each AI agent session. +# Persists what was visited, what was skipped, and what has MUSTs. +# +# Reference: ADR-002 in standards/agentic-a2ml/docs/ + +[metadata] +version = "1.0.0" +last-updated = "2026-03-24" + +# ============================================================================ +# COVERAGE STATE +# ============================================================================ +# Updated by agents at session end. Tracks which components have been +# visited and which have known MUSTs that were skipped. + +[coverage] +total-components = 0 +visited-components = 0 +coverage-percent = 0 + +# ============================================================================ +# VISITED COMPONENTS +# ============================================================================ +# Component → session date + ring reached +# Agents add entries as they work through components. +# +# Example: +# [coverage.visited.emergency-room] +# date = "2026-03-23" +# ring = 2 +# fixes = 3 +# notes = "boot-guardian built, shutdown-marshal built" + +# ============================================================================ +# SKIPPED COMPONENTS WITH MUSTS +# ============================================================================ +# Components with known MUSTs that were not visited in the most recent session. +# These become P1 inputs for the next session's Phase 0. +# +# Example: +# [coverage.skipped-musts.session-sentinel] +# priority = "P0" +# issue = "56 SIGABRTs in 4 days, D-Bus race condition" +# discovered = "2026-03-23" + +# ============================================================================ +# CHERRY-PICKING AUDIT +# ============================================================================ +# At session end, agents report whether they chose easy work over hard work. +# This is the accountability mechanism for the weighted priority system. +# +# [coverage.cherry-picking] +# easy-high-completed = 3 +# hard-high-completed = 1 +# easy-low-completed = 2 +# hard-low-deferred = 4 +# assessment = "Correctly prioritised — all MUST items addressed before COULDs" diff --git a/deno/.machine_readable/agent_instructions/debt.a2ml b/deno/.machine_readable/agent_instructions/debt.a2ml new file mode 100644 index 0000000..c0238c5 --- /dev/null +++ b/deno/.machine_readable/agent_instructions/debt.a2ml @@ -0,0 +1,49 @@ +# SPDX-License-Identifier: MPL-2.0 +# Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) +# +# debt.a2ml — Meander debt list +# Things found but not fixed. Carried between sessions. +# Becomes the next session's Phase 0 input. +# +# Reference: ADR-002 in standards/agentic-a2ml/docs/ + +[metadata] +version = "1.0.0" +last-updated = "2026-03-24" + +# ============================================================================ +# DEBT ITEMS +# ============================================================================ +# Each item has: component, issue, effort (easy|medium|hard), impact (high|medium|low), +# priority (should|could), and discovered date. +# +# Items are consumed (removed) when fixed. New items are added at session end. +# The debt list prevents the "one more wave" loop — found things are persisted, +# not forgotten, and not used as justification for infinite meandering. + +# ============================================================================ +# SHOULD — would fix next wave +# ============================================================================ +# These are inputs for the next session if the user says "keep going". +# +# Example: +# [[debt.should]] +# component = "system-tools/monitoring/observatory" +# issue = "Stale duplicate of root observatory/" +# effort = "easy" +# impact = "medium" +# discovered = "2026-03-23" + +# ============================================================================ +# COULD — would fix eventually +# ============================================================================ +# These are low-priority items that don't justify a session on their own. +# They get picked up when an agent is in the area for other reasons. +# +# Example: +# [[debt.could]] +# component = "cicada" +# issue = "RSR_OUTLINE.adoc references banned AGPL-3.0" +# effort = "easy" +# impact = "low" +# discovered = "2026-03-23" diff --git a/deno/.machine_readable/agent_instructions/methodology.a2ml b/deno/.machine_readable/agent_instructions/methodology.a2ml new file mode 100644 index 0000000..754f357 --- /dev/null +++ b/deno/.machine_readable/agent_instructions/methodology.a2ml @@ -0,0 +1,107 @@ +# SPDX-License-Identifier: MPL-2.0 +# Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) +# +# methodology.a2ml — AI agent methodology configuration +# Declares how agents should approach work in this repository. +# Read at session start by any AI agent (Claude, Gemini, Copilot, etc.) +# +# Reference: ADR-002 in standards/agentic-a2ml/docs/ + +[metadata] +version = "1.0.0" +last-updated = "2026-03-24" +spec = "https://github.com/hyperpolymath/standards/blob/main/agentic-a2ml/docs/ADR-002-methodology-layer.adoc" + +# ============================================================================ +# MODE SELECTION +# ============================================================================ +# convergent: find gaps, fill them, build infrastructure (default for ops/infra) +# divergent: find what's strongest, push it further (for research/creative) +# hybrid: audit 20% of budget, then focus 80% on top MUSTs (default for most) + +[methodology] +default-mode = "hybrid" +ring-ceiling = 2 # Hard ceiling for ring expansion (0-3) +wave-cap = 2 # Max waves before requiring user "keep going" +spike-required = true # Every session must ship code, not just designs + +# ============================================================================ +# PRIORITY WEIGHTS +# ============================================================================ +# MUST (3x): Blocking the current work → fix immediately +# SHOULD (2x): Degrading quality of current work → fix if in zone +# COULD (1x): Improving quality of adjacent work → add to debt list + +[methodology.priority-weights] +must = 3 +should = 2 +could = 1 + +# ============================================================================ +# CONVERGENT BUDGET (when mode = convergent or hybrid) +# ============================================================================ +# How to allocate effort across work types. +# Prevents over-polishing docs while structural work waits. + +[methodology.convergent-budget] +structural = 70 # % for new modules, compilation fixes, wiring, integration +corrective = 20 # % for bugs found, broken imports, stale references +perfective = 10 # % for SPDX headers, doc updates, formatting, style + +# ============================================================================ +# UNIQUE STRENGTH (when mode = divergent) +# ============================================================================ +# What makes this project special. Agents should DEEPEN this, not broaden it. +# Customise this per project — the template default is generic. + +[methodology.unique-strength] +description = "{{PROJECT_UNIQUE_STRENGTH}}" +deepen-not-broaden = true + +# ============================================================================ +# DIVERGENT INVARIANTS +# ============================================================================ +# Constraints that divergent mode must NOT violate. +# These are the riverbanks — diverge within them, not across. +# "Amplify uniqueness" means deepen, not broaden. +# +# Test before any divergent action: +# "Does this deepen the existing strength, or add a parallel strength?" +# If parallel → stop. Note as cross-project insight. + +[methodology.divergent-invariants] +rules = [ + # Customise per project. Examples: + # "Idris2 only for formal verification — no Lean4, Coq, Agda", + # "believe_me count must remain zero", + # "FFI architecture: Idris2 → RefC → Zig → C ABI (no shortcuts)", +] + +# Optional: language invariant for the core strength +# If set, divergent mode will not introduce other languages for this purpose +# language-invariant = "idris2" + +# ============================================================================ +# CONSTRAINT HINTS +# ============================================================================ +# Help Phase 0 find the critical chain faster. +# Updated at session end with newly discovered constraints. + +[methodology.known-constraints] +constraints = [ + # Customise per project. Examples: + # "End-to-end build has never been verified", + # "libproject.so does not exist yet — all bindings call stubs", +] + +# ============================================================================ +# STATE FILE VALIDATION +# ============================================================================ +# Phase 0 reads STATE.a2ml first but it may be broken. +# These rules detect corrupt/template/stale state files. + +[methodology.state-validation] +reject-if-contains = ["{{PLACEHOLDER}}", "{{PROJECT}}", "rsr-template-repo"] +reject-if-project-name-mismatch = true +staleness-threshold-days = 90 +fallback-files = ["TODO.md", "TODO.adoc", "ROADMAP.adoc", "README.adoc"] diff --git a/deno/.machine_readable/ai/.clinerules b/deno/.machine_readable/ai/.clinerules new file mode 100644 index 0000000..a29ed5f --- /dev/null +++ b/deno/.machine_readable/ai/.clinerules @@ -0,0 +1,43 @@ +# SPDX-License-Identifier: MPL-2.0 +# Copyright (c) {{CURRENT_YEAR}} {{AUTHOR}} ({{OWNER}}) <{{AUTHOR_EMAIL}}> +# Authoritative source: docs/AI-CONVENTIONS.md + +# STARTUP: Read 0-AI-MANIFEST.a2ml first, then .machine_readable/STATE.a2ml. + +# LICENSE +# All original code: MPL-2.0. +# Never AGPL-3.0. MPL-2.0 only as platform-required fallback. +# SPDX header required on every source file. +# Copyright: {{AUTHOR}} ({{OWNER}}) <{{AUTHOR_EMAIL}}> + +# STATE FILES (.machine_readable/ ONLY) +# Never create in repo root: STATE.a2ml, META.a2ml, ECOSYSTEM.a2ml, +# AGENTIC.a2ml, NEUROSYM.a2ml, PLAYBOOK.a2ml. +# The .machine_readable/ directory is the single source of truth. + +# BANNED PATTERNS +# Idris2: believe_me, assert_total, assert_smaller, unsafePerformIO +# Haskell: unsafeCoerce, unsafePerformIO, undefined, error +# OCaml: Obj.magic, Obj.repr, Obj.obj +# Coq: Admitted +# Lean: sorry +# Rust: transmute (unless FFI with // SAFETY: comment) + +# BANNED LANGUAGES +# TypeScript -> ReScript +# Node.js / npm / bun -> Deno +# Go -> Rust +# Python -> Julia or Rust + +# CONTAINERS +# Runtime: Podman (never Docker). +# File: Containerfile (never Dockerfile). +# Base: cgr.dev/chainguard/wolfi-base:latest or cgr.dev/chainguard/static:latest. + +# ABI/FFI +# ABI: Idris2 with dependent types (src/interface/abi/). +# FFI: Zig with C ABI (src/interface/ffi/). +# Headers: src/interface/generated/. + +# BUILD: Use just (justfile) for all tasks. +# STYLE: Descriptive names. Document all files. SPDX headers everywhere. diff --git a/deno/.machine_readable/ai/.cursorrules b/deno/.machine_readable/ai/.cursorrules new file mode 100644 index 0000000..c13b393 --- /dev/null +++ b/deno/.machine_readable/ai/.cursorrules @@ -0,0 +1,47 @@ +# SPDX-License-Identifier: MPL-2.0 +# Copyright (c) {{CURRENT_YEAR}} {{AUTHOR}} ({{OWNER}}) <{{AUTHOR_EMAIL}}> +# Authoritative source: docs/AI-CONVENTIONS.md + +# Read 0-AI-MANIFEST.a2ml in the repo root FIRST for canonical file locations. + +# LICENSE +# All original code: MPL-2.0 (SPDX header required on every file). +# Never use AGPL-3.0. Fallback to MPL-2.0 only when platform requires it. +# Copyright: {{AUTHOR}} ({{OWNER}}) <{{AUTHOR_EMAIL}}> + +# STATE FILES +# .a2ml metadata files go in .machine_readable/ ONLY. +# Never create STATE.a2ml, META.a2ml, ECOSYSTEM.a2ml, AGENTIC.a2ml, +# NEUROSYM.a2ml, or PLAYBOOK.a2ml in the repository root. + +# BANNED PATTERNS +# Idris2: believe_me, assert_total, assert_smaller, unsafePerformIO +# Haskell: unsafeCoerce, unsafePerformIO, undefined, error +# OCaml: Obj.magic, Obj.repr, Obj.obj +# Coq: Admitted +# Lean: sorry +# Rust: transmute (unless FFI with // SAFETY: comment) + +# BANNED LANGUAGES +# TypeScript -> use ReScript +# Node.js / npm / bun -> use Deno +# Go -> use Rust +# Python -> use Julia or Rust + +# CONTAINERS +# Runtime: Podman (never Docker) +# File: Containerfile (never Dockerfile) +# Base: cgr.dev/chainguard/wolfi-base:latest + +# ABI/FFI STANDARD +# ABI definitions: Idris2 with dependent types (src/interface/abi/) +# FFI implementation: Zig with C ABI (src/interface/ffi/) +# Generated C headers: src/interface/generated/ + +# BUILD SYSTEM +# Use just (justfile) for all build, test, lint, and format tasks. + +# CODE STYLE +# Use descriptive variable names. +# Annotate and document all files. +# Add SPDX-License-Identifier header to every source file. diff --git a/deno/.machine_readable/ai/.windsurfrules b/deno/.machine_readable/ai/.windsurfrules new file mode 100644 index 0000000..a29ed5f --- /dev/null +++ b/deno/.machine_readable/ai/.windsurfrules @@ -0,0 +1,43 @@ +# SPDX-License-Identifier: MPL-2.0 +# Copyright (c) {{CURRENT_YEAR}} {{AUTHOR}} ({{OWNER}}) <{{AUTHOR_EMAIL}}> +# Authoritative source: docs/AI-CONVENTIONS.md + +# STARTUP: Read 0-AI-MANIFEST.a2ml first, then .machine_readable/STATE.a2ml. + +# LICENSE +# All original code: MPL-2.0. +# Never AGPL-3.0. MPL-2.0 only as platform-required fallback. +# SPDX header required on every source file. +# Copyright: {{AUTHOR}} ({{OWNER}}) <{{AUTHOR_EMAIL}}> + +# STATE FILES (.machine_readable/ ONLY) +# Never create in repo root: STATE.a2ml, META.a2ml, ECOSYSTEM.a2ml, +# AGENTIC.a2ml, NEUROSYM.a2ml, PLAYBOOK.a2ml. +# The .machine_readable/ directory is the single source of truth. + +# BANNED PATTERNS +# Idris2: believe_me, assert_total, assert_smaller, unsafePerformIO +# Haskell: unsafeCoerce, unsafePerformIO, undefined, error +# OCaml: Obj.magic, Obj.repr, Obj.obj +# Coq: Admitted +# Lean: sorry +# Rust: transmute (unless FFI with // SAFETY: comment) + +# BANNED LANGUAGES +# TypeScript -> ReScript +# Node.js / npm / bun -> Deno +# Go -> Rust +# Python -> Julia or Rust + +# CONTAINERS +# Runtime: Podman (never Docker). +# File: Containerfile (never Dockerfile). +# Base: cgr.dev/chainguard/wolfi-base:latest or cgr.dev/chainguard/static:latest. + +# ABI/FFI +# ABI: Idris2 with dependent types (src/interface/abi/). +# FFI: Zig with C ABI (src/interface/ffi/). +# Headers: src/interface/generated/. + +# BUILD: Use just (justfile) for all tasks. +# STYLE: Descriptive names. Document all files. SPDX headers everywhere. diff --git a/deno/.machine_readable/ai/0.2-AI-MANIFEST.a2ml b/deno/.machine_readable/ai/0.2-AI-MANIFEST.a2ml new file mode 100644 index 0000000..869cbee --- /dev/null +++ b/deno/.machine_readable/ai/0.2-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "ai-registry" +level: 2 +parent: "../0.1-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Sub-registry for ai metadata. diff --git a/deno/.machine_readable/ai/AI.a2ml b/deno/.machine_readable/ai/AI.a2ml new file mode 100644 index 0000000..c683d30 --- /dev/null +++ b/deno/.machine_readable/ai/AI.a2ml @@ -0,0 +1,16 @@ + +# AI Assistant Instructions + +## Repository Focus +- `rsr-template-repo` is treated as a Rhodium Standard Repository; obey the Rhodium policies and keep `.machine_readable/` authoritative. +- All machine-readable content lives under `.machine_readable/` — state files (a2ml), bot directives, and contractiles. +- Prefer to keep generated files out of source control, and regenerate them with the documented commands before committing. + +## Workflow +1. Inspect `.machine_readable/STATE.a2ml` for blockers and next actions. +2. Respect any constraints listed inside `.machine_readable/AGENTIC.a2ml` when tooling changes are requested. +3. After finishing edits, update STATE with your outcomes and commit with a concise, imperative message. + +## Delivery Promises +- Mention in summaries whether STATE, `.machine_readable/contractiles/`, or `.machine_readable/bot_directives/` changed. +- Keep this file in sync with the repository's status; update it if the governance changes. diff --git a/deno/.machine_readable/ai/PLACEHOLDERS.adoc b/deno/.machine_readable/ai/PLACEHOLDERS.adoc new file mode 100644 index 0000000..02bc8b4 --- /dev/null +++ b/deno/.machine_readable/ai/PLACEHOLDERS.adoc @@ -0,0 +1,142 @@ += Template Placeholders +# Template Placeholders + +All placeholders in this template follow the `{{PLACEHOLDER}}` pattern. +After cloning, replace them with your project-specific values. + +## Recommended: Interactive Bootstrap + +```bash +just init +``` + +This interactively prompts for all values, replaces every placeholder, +validates the result, and runs k9-svc checks if available. + +## Manual Replace + +```bash +# If you prefer manual replacement (run from repo root) + +sed -i 's/{{AUTHOR}}/Jane Doe/g' $(grep -rl '{{AUTHOR}}' .) +sed -i 's/{{AUTHOR_EMAIL}}/jane@example.org/g' $(grep -rl '{{AUTHOR_EMAIL}}' .) +sed -i 's/{{OWNER}}/my-org/g' $(grep -rl '{{OWNER}}' .) +sed -i 's/{{PROJECT_NAME}}/my-project/g' $(grep -rl '{{PROJECT_NAME}}' .) +sed -i 's/{{PROJECT}}/MY_PROJECT/g' $(grep -rl '{{PROJECT}}' .) +sed -i 's/{{project}}/my_project/g' $(grep -rl '{{project}}' .) +sed -i 's/{{REPO}}/my-project/g' $(grep -rl '{{REPO}}' .) +sed -i 's/{{FORGE}}/github.com/g' $(grep -rl '{{FORGE}}' .) +sed -i "s/{{CURRENT_YEAR}}/$(date +%Y)/g" $(grep -rl '{{CURRENT_YEAR}}' .) +sed -i "s/{{CURRENT_DATE}}/$(date +%Y-%m-%d)/g" $(grep -rl '{{CURRENT_DATE}}' .) +``` + +## Placeholder Reference + +### Author & Copyright + +| Placeholder | Description | Example | Files | +|---|---|---|---| +| `{{AUTHOR}}` | Full legal name | `Jane Doe` | SPDX headers (all files), MAINTAINERS.md, .mailmap, .reuse/dep5, docs/AI-CONVENTIONS.md | +| `{{AUTHOR_EMAIL}}` | Primary contact email | `jane@example.org` | SPDX headers (all files), .mailmap, .reuse/dep5, .well-known/humans.txt | +| `{{AUTHOR_EMAIL_ALT}}` | Previous/secondary email (for .mailmap) | `old@example.com` | .mailmap | +| `{{AUTHOR_ORG}}` | Author's organization/affiliation | `Acme University` | project-metadata.k9.ncl | +| `{{AUTHOR_LAST}}` | Author surname (for citations) | `Doe` | docs/CITATIONS.adoc | +| `{{AUTHOR_FIRST}}` | Author first name (for citations) | `Jane` | docs/CITATIONS.adoc | +| `{{AUTHOR_INITIALS}}` | Author initials (for citations) | `J.` | docs/CITATIONS.adoc | + +### Project Identity + +| Placeholder | Description | Example | Files | +|---|---|---|---| +| `{{PROJECT_NAME}}` | Human-readable project name | `My Project` | SECURITY.md, CODE_OF_CONDUCT.md, TOPOLOGY.md, STATE.a2ml, Justfile, GOVERNANCE.md, MAINTAINERS.md, flake.nix, devcontainer.json | +| `{{PROJECT_DESCRIPTION}}` | One-line description | `A tool for X` | flake.nix | +| `{{PROJECT}}` | Uppercase identifier (for Idris2 modules, C macros) | `MY_PROJECT` | ABI-FFI-README.md, src/interface/abi/*.idr, src/interface/ffi/*.zig | +| `{{project}}` | Lowercase identifier (for C symbols, filenames) | `my_project` | ABI-FFI-README.md, src/interface/ffi/*.zig | +| `{{REPO}}` | Repository name (slug) | `my-project` | CONTRIBUTING.md, SECURITY.md, CODE_OF_CONDUCT.md, cliff.toml | +| `{{OWNER}}` | GitHub/GitLab org or username | `my-org` | SPDX headers, CONTRIBUTING.md, SECURITY.md, GOVERNANCE.md, MAINTAINERS.md, CODEOWNERS, mirror.yml, cliff.toml | +| `{{FORGE}}` | Git forge domain | `github.com` | CONTRIBUTING.md | + +### Dates + +| Placeholder | Description | Example | Files | +|---|---|---|---| +| `{{CURRENT_YEAR}}` | Current year | `2026` | SPDX headers (all files), GOVERNANCE.md, MAINTAINERS.md | +| `{{CURRENT_DATE}}` | Current date (ISO) | `2026-02-14` | STATE.a2ml, MAINTAINERS.md | +| `{{DATE}}` | Last updated date | `2026-02-14` | TOPOLOGY.md, THREAT-MODEL.md | + +### Contact & Security + +| Placeholder | Description | Example | Files | +|---|---|---|---| +| `{{SECURITY_EMAIL}}` | Security contact email | `security@example.org` | SECURITY.md | +| `{{PGP_FINGERPRINT}}` | 40-char PGP fingerprint | `ABCD 1234 ...` | SECURITY.md | +| `{{PGP_KEY_URL}}` | URL to public PGP key | `https://keys.openpgp.org/...` | SECURITY.md | +| `{{WEBSITE}}` | Project website | `https://example.org` | SECURITY.md | +| `{{CONDUCT_EMAIL}}` | Conduct reports email | `conduct@example.org` | CODE_OF_CONDUCT.md | +| `{{CONDUCT_TEAM}}` | Conduct committee name | `Code of Conduct Committee` | CODE_OF_CONDUCT.md | +| `{{RESPONSE_TIME}}` | SLA for initial response | `48 hours` | CODE_OF_CONDUCT.md | + +### Git + +| Placeholder | Description | Example | Files | +|---|---|---|---| +| `{{MAIN_BRANCH}}` | Main branch name | `main` | CONTRIBUTING.md | + +### Build + +| Placeholder | Description | Example | Files | +|---|---|---|---| +| `{{LICENSE}}` | License name | `MPL-2.0` | ABI-FFI-README.md | +| `{{PROJECT_PURPOSE}}` | One-line project description | `FFI bridges between languages` | STATE.a2ml | + +### AI Manifest + +| Placeholder | Description | Example | Files | +|---|---|---|---| +| `[YOUR-REPO-NAME]` | Repository name | `my-project` | 0-AI-MANIFEST.a2ml | +| `[DATE]` | Creation date | `2026-02-14` | 0-AI-MANIFEST.a2ml | +| `[YOUR-NAME/ORG]` | Maintainer name | `hyperpolymath` | 0-AI-MANIFEST.a2ml | + +### AI Installation Guide + +| Marker | Description | Files | +|---|---|---| +| `[TODO-AI-INSTALL]` | Unfilled section in AI installation guide | `docs/AI_INSTALLATION_GUIDE.adoc`, `docs/AI-INSTALL-README-SECTION.adoc`, `README.adoc` | + +These are **not** standard `{{PLACEHOLDER}}` markers -- they are TODO markers +that must be replaced with project-specific content before release. They mark +sections where the developer (or AI) must fill in: + +- What questions the AI should ask the user +- Exact prerequisite check and install commands +- Privacy notice specific to this project +- Complete installation command block +- Credential setup instructions (URLs, scopes, env vars) +- Verification commands and expected output +- Error handling table +- Example conversation + +**finishbot checks:** `just validate-ai-install` verifies no `[TODO-AI-INSTALL]` markers remain. + +## Deletion Markers + +Some files contain deletion instructions: + +| Marker | Meaning | File | +|---|---|---| +| `{{~ ... ~}}` | Delete this entire line after reading | ABI-FFI-README.md (line 1) | + +## Verification + +After replacing all placeholders, verify none remain: + +```bash +grep -rn '{{' . --include='*.md' --include='*.adoc' --include='*.a2ml' \ + --include='*.scm' --include='*.idr' --include='*.zig' --include='*.res' \ + --include='Justfile' --include='*.nix' --include='*.toml' --include='*.yml' \ + --include='*.yaml' --include='*.hs' --include='*.ncl' --include='*.txt' \ + --include='*.json' --include='Containerfile' --include='dep5' \ + | grep -v 'PLACEHOLDERS.md' | grep -v 'node_modules' +``` + +If the above command produces no output, all placeholders have been replaced. diff --git a/deno/.machine_readable/ai/README.adoc b/deno/.machine_readable/ai/README.adoc new file mode 100644 index 0000000..121bbc8 --- /dev/null +++ b/deno/.machine_readable/ai/README.adoc @@ -0,0 +1,22 @@ += AI Guidance Directory + +Put AI-facing instructions in this folder. + +Examples: + +* `CLAUDE.md` +* `COPILOT.md` +* `GEMINI.md` +* `AI.a2ml` +* `AI.djot` + +Avoid scattering agent instruction files around the repo root. + +Recommended machine read order: + +* `.machine_readable/anchors/ANCHOR.a2ml` +* `.machine_readable/policies/MAINTENANCE-AXES.a2ml` +* `.machine_readable/policies/MAINTENANCE-CHECKLIST.a2ml` +* `.machine_readable/policies/SOFTWARE-DEVELOPMENT-APPROACH.a2ml` +* `.machine_readable/STATE.a2ml` +* `.machine_readable/META.a2ml` diff --git a/deno/.machine_readable/anchors/0.2-AI-MANIFEST.a2ml b/deno/.machine_readable/anchors/0.2-AI-MANIFEST.a2ml new file mode 100644 index 0000000..45038e1 --- /dev/null +++ b/deno/.machine_readable/anchors/0.2-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "anchors-registry" +level: 2 +parent: "../0.1-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Sub-registry for anchors metadata. diff --git a/deno/.machine_readable/anchors/ANCHOR.a2ml b/deno/.machine_readable/anchors/ANCHOR.a2ml new file mode 100644 index 0000000..8723899 --- /dev/null +++ b/deno/.machine_readable/anchors/ANCHOR.a2ml @@ -0,0 +1,62 @@ +# SPDX-License-Identifier: MPL-2.0 +# Copyright (c) {{CURRENT_YEAR}} {{AUTHOR}} ({{OWNER}}) <{{AUTHOR_EMAIL}}> +# +# ANCHOR.a2ml - authoritative anchor for this repository + +[metadata] +version = "1.0.0" +last-updated = "{{CURRENT_DATE}}" + +[anchor] +schema = "hyperpolymath.anchor/1" +repo = "{{OWNER}}/{{REPO}}" +authority = "upstream-canonical" + +purpose = [ + "Define canonical semantics and policy boundaries for this repository.", + "Declare what downstream/satellite repos can extend but not redefine.", + "Provide a stable golden path and invariant contract for release readiness.", +] + +[identity] +project = "{{PROJECT_NAME}}" +kind = "{{PROJECT_KIND}}" # language | library | service | tool +one-sentence = "{{PROJECT_PURPOSE}}" +domain = "{{PROJECT_DOMAIN}}" + +[semantic-authority] +policy = "canonical" + +owns = [ + "Project semantics and specification", + "Invariant definitions and contractiles", + "Reference implementation behavior", +] + +[implementation-policy] +allowed = ["Rust", "Idris2", "Zig", "Scheme", "Shell", "Just", "AsciiDoc", "Markdown"] +forbidden = ["Node.js", "npm"] + +[golden-path] +smoke-test-command = [ + "just test", + "just quality", +] + +success-criteria = [ + "Core tests pass", + "Quality gates pass", + "No unresolved critical security findings", +] + +[satellite-policy] +must-pin-upstream = true +must-declare-authority = true +must-have-anchor = true +must-have-golden-path = true + +[semantic-authority-files] +language-spec = "SPECIFICATION.md" +formal-proofs = "docs/proofs/PROOFS.adoc" +type-theory = "docs/theory/THEORY.adoc" +algorithms = "docs/theory/ALGORITHMS.adoc" diff --git a/deno/.machine_readable/anchors/README.adoc b/deno/.machine_readable/anchors/README.adoc new file mode 100644 index 0000000..1b27c02 --- /dev/null +++ b/deno/.machine_readable/anchors/README.adoc @@ -0,0 +1 @@ += anchors Registry diff --git a/deno/.machine_readable/compliance/reuse/dep5 b/deno/.machine_readable/compliance/reuse/dep5 new file mode 100644 index 0000000..49aaed6 --- /dev/null +++ b/deno/.machine_readable/compliance/reuse/dep5 @@ -0,0 +1,54 @@ +Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ +Upstream-Name: {{PROJECT_NAME}} +Upstream-Contact: {{AUTHOR}} <{{AUTHOR_EMAIL}}> +Source: https://github.com/{{OWNER}}/{{REPO}} + +# Default: all files are MPL-2.0 +Files: * +Copyright: {{CURRENT_YEAR}} {{AUTHOR}} ({{OWNER}}) <{{AUTHOR_EMAIL}}> +License: MPL-2.0 + +# Configuration files that cannot carry headers +Files: .editorconfig .gitignore .gitattributes .tool-versions .mailmap +Copyright: {{CURRENT_YEAR}} {{AUTHOR}} ({{OWNER}}) <{{AUTHOR_EMAIL}}> +License: MPL-2.0 + +# Machine-readable state files +Files: .machine_readable/*.a2ml +Copyright: {{CURRENT_YEAR}} {{AUTHOR}} ({{OWNER}}) <{{AUTHOR_EMAIL}}> +License: MPL-2.0 + +# Bot directives +Files: .machine_readable/bot_directives/* +Copyright: {{CURRENT_YEAR}} {{AUTHOR}} ({{OWNER}}) <{{AUTHOR_EMAIL}}> +License: MPL-2.0 + +# Contractiles +Files: .machine_readable/contractiles/* +Copyright: {{CURRENT_YEAR}} {{AUTHOR}} ({{OWNER}}) <{{AUTHOR_EMAIL}}> +License: MPL-2.0 + +# GitHub/CI configuration +Files: .github/* .github/**/* +Copyright: {{CURRENT_YEAR}} {{AUTHOR}} ({{OWNER}}) <{{AUTHOR_EMAIL}}> +License: MPL-2.0 + +# Generated files +Files: generated/* +Copyright: {{CURRENT_YEAR}} {{AUTHOR}} ({{OWNER}}) <{{AUTHOR_EMAIL}}> +License: MPL-2.0 + +# Lockfiles and auto-generated +Files: *.lock Cargo.lock flake.lock +Copyright: {{CURRENT_YEAR}} {{AUTHOR}} ({{OWNER}}) <{{AUTHOR_EMAIL}}> +License: MPL-2.0 + +# Devcontainer config (JSON, no comments) +Files: .devcontainer/*.json +Copyright: {{CURRENT_YEAR}} {{AUTHOR}} ({{OWNER}}) <{{AUTHOR_EMAIL}}> +License: MPL-2.0 + +# Git-cliff config +Files: cliff.toml +Copyright: {{CURRENT_YEAR}} {{AUTHOR}} ({{OWNER}}) <{{AUTHOR_EMAIL}}> +License: MPL-2.0 diff --git a/deno/.machine_readable/compliance/rust/deny.toml b/deno/.machine_readable/compliance/rust/deny.toml new file mode 100644 index 0000000..0534a85 --- /dev/null +++ b/deno/.machine_readable/compliance/rust/deny.toml @@ -0,0 +1,65 @@ +# SPDX-License-Identifier: MPL-2.0 +# cargo-deny configuration for RSR-compliant repositories +# Run: cargo deny check +# Docs: https://embarkstudios.github.io/cargo-deny/ + +[graph] +targets = [] +all-features = true + +# --- Advisory database --------------------------------------------------- +[advisories] +db-path = "~/.cargo/advisory-db" +db-urls = ["https://github.com/rustsec/advisory-db"] +# Fail on any known vulnerability +vulnerability = "deny" +unmaintained = "warn" +yanked = "warn" +notice = "warn" + +# --- License policy ------------------------------------------------------- +[licenses] +unlicensed = "deny" +confidence-threshold = 0.8 + +allow = [ + "MPL-2.0", + "MPL-2.0", + "MIT", + "Apache-2.0", + "BSD-2-Clause", + "BSD-3-Clause", + "ISC", + "Zlib", + "Unicode-3.0", + "Unicode-DFS-2016", +] + +deny = [ + "AGPL-3.0-only", + "AGPL-3.0-or-later", +] + +copyleft = "warn" + +[[licenses.exceptions]] +allow = ["OpenSSL"] +name = "ring" + +# --- Crate bans ------------------------------------------------------------ +[bans] +multiple-versions = "warn" +wildcards = "allow" +highlight = "all" + +deny = [ + # Known-bad crates + { name = "openssl", wrappers = ["openssl-sys"] }, +] + +# --- Source restrictions ---------------------------------------------------- +[sources] +unknown-registry = "deny" +unknown-git = "warn" +allow-registry = ["https://github.com/rust-lang/crates.io-index"] +allow-git = [] diff --git a/deno/.machine_readable/configs/0.2-AI-MANIFEST.a2ml b/deno/.machine_readable/configs/0.2-AI-MANIFEST.a2ml new file mode 100644 index 0000000..6e41e6c --- /dev/null +++ b/deno/.machine_readable/configs/0.2-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "configs-registry" +level: 2 +parent: "../0.1-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Sub-registry for configs metadata. diff --git a/deno/.machine_readable/configs/README.adoc b/deno/.machine_readable/configs/README.adoc new file mode 100644 index 0000000..616b9e7 --- /dev/null +++ b/deno/.machine_readable/configs/README.adoc @@ -0,0 +1 @@ += configs Registry diff --git a/deno/.machine_readable/configs/git-cliff/cliff.toml b/deno/.machine_readable/configs/git-cliff/cliff.toml new file mode 100644 index 0000000..5c39b48 --- /dev/null +++ b/deno/.machine_readable/configs/git-cliff/cliff.toml @@ -0,0 +1,119 @@ +# SPDX-License-Identifier: MPL-2.0 +# Copyright (c) {{CURRENT_YEAR}} {{AUTHOR}} ({{OWNER}}) <{{AUTHOR_EMAIL}}> +# +# git-cliff configuration for conventional commit changelog generation. +# https://git-cliff.org/docs/configuration +# +# Placeholders — replace before first use: +# {{OWNER}} — GitHub organization or username +# {{REPO}} — GitHub repository name + +[changelog] +# Changelog header +header = """ +# Changelog\n +All notable changes to this project will be documented in this file.\n +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).\n +\n +""" +# Template for the changelog body +# https://keats.github.io/tera/docs/#introduction +body = """ +{%- macro remote_url() -%} + https://github.com/{{OWNER}}/{{REPO}} +{%- endmacro -%} + +{% if version -%} + ## [{{ version | trim_start_matches(pat="v") }}] - {{ timestamp | date(format="%Y-%m-%d") }} +{% else -%} + ## [Unreleased] +{% endif -%} + +{% for group, commits in commits | group_by(attribute="group") %} + ### {{ group | striptags | trim }} + {% for commit in commits %} + - {% if commit.scope %}**{{ commit.scope }}:** {% endif %}\ + {% if commit.breaking %}[**BREAKING**] {% endif %}\ + {{ commit.message | upper_first }}\ + {%- if commit.links %} \ + ({% for link in commit.links %}[{{ link.text }}]({{ link.href }}){% endfor %}){% endif -%} + {% endfor %} +{% endfor %} + +{%- if github -%} +{% if github.contributors | filter(attribute="is_first_time", value=true) | length != 0 %} + ### New Contributors +{%- for contributor in github.contributors | filter(attribute="is_first_time", value=true) %} + * @{{ contributor.username }} made their first contribution + {%- if contributor.pr_number %} in \ + [#{{ contributor.pr_number }}]({{ self::remote_url() }}/pull/{{ contributor.pr_number }}) + {%- endif %} +{%- endfor %} +{% endif -%} +{% endif -%} + +""" +# Template for the changelog footer +footer = """ +{%- macro remote_url() -%} + https://github.com/{{OWNER}}/{{REPO}} +{%- endmacro -%} + +{% for release in releases -%} + {% if release.version -%} + {% if release.previous.version -%} + [{{ release.version | trim_start_matches(pat="v") }}]: \ + {{ self::remote_url() }}/compare/{{ release.previous.version }}...{{ release.version }} + {% endif -%} + {% else -%} + {% if release.previous.version -%} + [Unreleased]: {{ self::remote_url() }}/compare/{{ release.previous.version }}...HEAD + {% endif -%} + {% endif -%} +{% endfor %} + +""" +# Remove leading and trailing whitespace from templates +trim = true + +[git] +# Parse conventional commits +# https://www.conventionalcommits.org +conventional_commits = true +# Filter out unconventional commits +filter_unconventional = true +# Process each line of a commit as an individual commit +split_commits = false +# Regex for commit preprocessing +commit_preprocessors = [ + # Remove issue numbers from commit messages + { pattern = '\((\w+\s)?#([0-9]+)\)', replace = "" }, +] +# Regex for parsing and grouping commits +commit_parsers = [ + { message = "^feat", group = "Features" }, + { message = "^fix", group = "Bug Fixes" }, + { message = "^security", group = "Security" }, + { message = "^perf", group = "Performance" }, + { message = "^refactor", group = "Refactoring" }, + { message = "^docs", group = "Documentation" }, + { message = "^style", group = "Styling" }, + { message = "^test", group = "Testing" }, + { message = "^ci", group = "CI/CD" }, + { message = "^chore\\(release\\)", skip = true }, + { message = "^chore\\(deps.*\\)", skip = true }, + { message = "^chore\\(pr\\)", skip = true }, + { message = "^chore", group = "Miscellaneous" }, + { body = ".*security", group = "Security" }, +] +# Protect breaking changes from being skipped by a commit parser +protect_breaking_commits = false +# Filter out merge commits +filter_merge_commits = true +# Filter out commits by tag pattern (skip pre-releases) +# tag_pattern = "v[0-9].*" +# Regex for skipping tags +# skip_tags = "beta|alpha" +# Sort commits within each group by oldest first +sort_commits = "oldest" diff --git a/deno/.machine_readable/contractiles/README.adoc b/deno/.machine_readable/contractiles/README.adoc new file mode 100644 index 0000000..d40fcd1 --- /dev/null +++ b/deno/.machine_readable/contractiles/README.adoc @@ -0,0 +1,19 @@ += Contractiles Template Set +:toc: +:sectnums: + +This directory contains the generalized contractiles templates. Copy the `.machine_readable/contractiles/` directory into a new repo to establish a consistent operational, validation, trust, recovery, and intent framework. + +== Fill-In Instructions + +1. Update the Mustfile to reflect your real invariants (paths, schema versions, ports). +2. Replace Trustfile.hs placeholders with your actual key paths and verification commands. +3. Adjust Dustfile handlers to match your rollback and recovery tooling. +4. Update Intentfile to mirror the roadmap you want the system to evolve toward. + +== Contents + +* `must/Mustfile` - required invariants and validations. +* `trust/Trustfile.hs` - cryptographic verification steps. +* `dust/Dustfile` - rollback and recovery semantics. +* `lust/Intentfile` - future intent and roadmap direction. diff --git a/deno/.machine_readable/contractiles/adjust/Adjustfile.a2ml b/deno/.machine_readable/contractiles/adjust/Adjustfile.a2ml new file mode 100644 index 0000000..6cce3fe --- /dev/null +++ b/deno/.machine_readable/contractiles/adjust/Adjustfile.a2ml @@ -0,0 +1,211 @@ +# SPDX-License-Identifier: MPL-2.0 +# Adjustfile — Accessibility Contract for Burble +# Author: Jonathan D.A. Jewell +# +# Accessibility requirements and compliance for Burble. +# Voice-first design must be inclusive for all users. +# +# Run with: adjust check +# Fix with: adjust fix (where deterministic fix exists) + +@abstract: +Accessibility requirements and compliance for the Burble voice-first communications platform. +These requirements ensure Burble is usable by everyone, regardless of ability. +@end + +## Keyboard Accessibility + +### keyboard-navigation +- description: All features accessible via keyboard +- status: partial +- probe: test -f server/lib/burble/accessibility/keyboard.ex +- compliance: WCAG 2.1 AA +- notes: Basic navigation implemented. Full keyboard-only flow needed. +- fix: Port PanLL's comprehensive keyboard navigation system + +### custom-keybindings +- description: User-configurable keybindings +- status: implemented +- probe: test -f server/lib/burble/accessibility/keyboard.ex +- compliance: WCAG 2.1 AAA +- notes: Users can remap PTT, mute, deafen, volume, and room navigation keys + +### keyboard-shortcuts-discoverable +- description: Keyboard shortcuts are documented and discoverable +- status: missing +- compliance: WCAG 2.1 A +- fix: Add keyboard shortcuts help modal in web client + +## Visual Accessibility + +### high-contrast-mode +- description: High contrast UI theme +- status: missing +- compliance: WCAG 2.1 AA +- fix: Port PanLL's high-contrast theme system +- target: CSS variables for contrast ratios >= 4.5:1 + +### colorblind-support +- description: Colorblind-friendly color schemes +- status: missing +- compliance: WCAG 2.1 AA +- fix: Implement deuteranopia, protanopia, and tritanopia palettes +- reference: PanLL's palette system + +### font-size-adjustment +- description: Resizable UI fonts (4 levels: 14-20px) +- status: missing +- compliance: WCAG 2.1 AA +- fix: Port PanLL's font size adjustment system +- target: User preference persists across sessions + +### theme-switching +- description: Dark/Light/System theme support +- status: missing +- compliance: WCAG 2.1 AA +- fix: Port PanLL's theme system +- target: Respects OS preference, user override + +## Auditory Accessibility + +### screen-reader-support +- description: Full screen reader compatibility +- status: partial +- probe: test -f server/lib/burble/accessibility/screen_reader.ex +- compliance: WCAG 2.1 AA +- notes: Basic announcements implemented. Needs ARIA attributes and live regions. +- fix: Complete ARIA implementation in web client + +### closed-captions +- description: Real-time captioning for voice chat +- status: missing +- compliance: WCAG 2.1 AA +- notes: Requires Web Speech API or external STT integration +- target: 90%+ accuracy for English, configurable display + +### visual-notifications +- description: Visual indicators for audio events +- status: missing +- compliance: WCAG 2.1 A +- notes: Speaking indicators, mute status, connection status +- fix: Add visual cues that duplicate audio information + +### volume-normalization +- description: Consistent volume levels across users +- status: missing +- compliance: WCAG 2.1 AA +- notes: Prevents sudden loud sounds for sensitive users +- target: -23 LUFS normalization per EBU R128 + +## Motor Accessibility + +### voice-commands +- description: Voice-controlled interface +- status: missing +- compliance: WCAG 2.1 AAA +- notes: "Mute", "Deafen", "Join room X", "Volume up/down" +- target: Web Speech API with fallback to keyboard + +### reduced-motion +- description: Reduced animation options +- status: missing +- compliance: WCAG 2.1 AA +- fix: Port PanLL's animation control (on/reduced/off) +- target: Respects prefers-reduced-motion media query + +### hover-alternatives +- description: All hover interactions have click alternatives +- status: partial +- compliance: WCAG 2.1 AA +- notes: Some hover tooltips need click-to-show option +- fix: Audit and add click alternatives + +## Cognitive Accessibility + +### clear-language +- description: Simple, consistent terminology +- status: partial +- compliance: WCAG 2.1 AAA +- notes: Technical terms need plain language explanations +- fix: Add tooltips/glossary for jargon + +### predictable-navigation +- description: Consistent navigation patterns +- status: partial +- compliance: WCAG 2.1 AA +- notes: Navigation structure varies between pages +- fix: Standardize navigation layout + +### error-prevention +- description: Confirmation for destructive actions +- status: partial +- compliance: WCAG 2.1 AA +- notes: Room deletion has confirmation, others may not +- fix: Audit all destructive actions + +### help-availability +- description: Context-sensitive help always available +- status: missing +- compliance: WCAG 2.1 AAA +- notes: No persistent help system +- fix: Add help button with contextual guidance + +## Compliance Targets + +### wcag-2.1-aa +- description: WCAG 2.1 AA compliance +- status: partial +- target: Full compliance by Q4 2026 +- tracking: https://github.com/hyperpolymath/burble/issues/XXX + +### section-508 +- description: U.S. Section 508 compliance +- status: partial +- target: Full compliance by Q4 2026 +- notes: Aligns with WCAG 2.1 AA for most requirements + +### en-301-549 +- description: EU EN 301 549 compliance +- status: partial +- target: Full compliance by Q4 2026 +- notes: EU public sector procurement requirement + +## Integration Requirements + +### panll-accessibility-port +- description: Port PanLL's accessibility engine to Burble +- status: planned +- reference: /var/mnt/eclipse/repos/verification-ecosystem/panll/tests/accessibility_engine_test.js +- target: Q2 2026 + +### k9-accessibility-validator +- description: Integrate K9 accessibility validator +- status: planned +- reference: /var/mnt/eclipse/repos/verification-ecosystem/panll/contractiles/k9/validators/accessibility-baseline.k9.ncl +- target: Q2 2026 + +### accessibility-testing +- description: Add accessibility tests to CI/CD +- status: planned +- target: pa11y or axe-core integration +- compliance: Automated WCAG testing + +## Documentation Requirements + +### accessibility-guide +- description: User-facing accessibility guide +- status: missing +- target: docs/accessibility/USER-GUIDE.adoc +- notes: Keyboard shortcuts, screen reader setup, theme switching + +### developer-accessibility +- description: Developer accessibility guidelines +- status: missing +- target: docs/accessibility/DEVELOPER.adoc +- notes: Coding standards, testing requirements, compliance checklist + +### compliance-report +- description: Accessibility compliance report +- status: missing +- target: docs/compliance/ACCESSIBILITY.adoc +- notes: VPAT (Voluntary Product Accessibility Template) diff --git a/deno/.machine_readable/contractiles/bust/Bustfile.a2ml b/deno/.machine_readable/contractiles/bust/Bustfile.a2ml new file mode 100644 index 0000000..9bb37f5 --- /dev/null +++ b/deno/.machine_readable/contractiles/bust/Bustfile.a2ml @@ -0,0 +1,28 @@ +// Bustfile.a2ml — meta-repo bust contractile (breakage / rollback) +// SPDX-License-Identifier: MPL-2.0 + +Bust { + name: "a2ml-deno" + version: "1.0.0" + description: "Rollback procedures when something breaks in the meta-repo" + + scenarios: { + "bad-pointer-bump": "git revert in meta-repo; child repo itself untouched" + "submodule-pointer-points-at-missing-sha": "git submodule update --init --checkout resets child to parent-recorded SHA; OR revert the stale bump commit" + "submodule-orphan-after-local-only-commit": "roll back locally with git reset to before the stranded commit; fix remote situation before re-attempting" + "accidental-private-repo-content-leaked-to-public-submodule": "hard-rotate the leaked secret immediately; git-filter-repo or BFG on the submodule's own history; public re-publication only after rotation complete" + } + + escalation-ladder: [ + "1. revert the meta-repo commit (reversible, low blast radius)", + "2. reset the local submodule clone (affects only local workspace)", + "3. force-push to main — PROHIBITED without explicit user confirmation (violates branch protection)", + "4. registry-level (delete/archive the GitHub repo) — human-only action, never by AI" + ] + + backup-points: [ + "GitHub serves as the durable backup for every submodule's own history", + "Meta-repo history on origin/main is the durable backup for pointer state", + "Local backup tags (backup/pre--) retained on risky rewrites" + ] +} diff --git a/deno/.machine_readable/contractiles/bust/bust.ncl b/deno/.machine_readable/contractiles/bust/bust.ncl new file mode 100644 index 0000000..fc8cb8c --- /dev/null +++ b/deno/.machine_readable/contractiles/bust/bust.ncl @@ -0,0 +1,66 @@ +# SPDX-License-Identifier: MPL-2.0 +# Bust — error-handling / failure-recovery runner +# +# Pairs with: Bustfile.a2ml (same directory) +# Verb: bust +# Semantics: every declared failure mode must have a recovery path that has +# been exercised. Runner injects failures (via declared probes) +# and verifies the recovery path works. Hard gate on any +# failure-mode with missing or broken recovery. +# CLI: `contractile bust check` → list failure modes + recovery status +# `contractile bust drill` → inject declared failures, verify recovery +# +# Anything else in this directory is human-only notes/archive; machines ignore. +# +# Base: ../_base.ncl provides pedigree_schema, run_defaults, probe_schema. +# See: docs/CONTRACTILE-SPEC.adoc + +let base = import "../_base.ncl" in + +{ + pedigree = base.pedigree_schema & { + contractile_verb = "bust", + semantics = "error handling + failure recovery", + security = { + leash = 'Kennel, + trust_level = "controlled failure injection; scoped to system-under-test", + allow_network = false, + allow_filesystem_write = true, # drills may write transient state (tmp dirs, test DBs) + allow_subprocess = true, + injection_scope = "system-under-test-only", + }, + metadata = { + name = "bust-runner", + version = "1.0.0", + description = "Exercises declared failure modes and verifies recovery paths. Hard-gates on any failure mode without working recovery.", + paired_xfile = "Bustfile.a2ml", + author = "Jonathan D.A. Jewell ", + }, + }, + + schema = { + failure_modes + | Array { + id | String, + description | String, + class | [| 'network, 'disk_full, 'oom, 'timeout, 'partial_write, 'panic, 'crash, 'rollback, 'concurrency |], + # TODO: migrate to base.probe_schema (structured probe) when CLI supports it + injection_probe | String, # command that deterministically causes this failure + # TODO: migrate to base.probe_schema (structured probe) when CLI supports it + recovery_probe | String, # command that verifies recovery (exit 0 = recovered) + expected_recovery_time_seconds | Number | default = 30, + # status_core values: 'declared, 'verified, 'failing; bust adds 'drilled + status | [| 'declared, 'drilled, 'verified, 'failing |] | default = 'declared, + notes | String | optional, + }, + }, + + # Runner behaviour — inherits from base.run_defaults. + # bust adds record_recovery_times for performance tier feeding. + run = base.run_defaults & { + on_any_fail = "exit-nonzero", # missing or broken recovery blocks merge + report_format = "a2ml", + emit_summary = true, + record_recovery_times = true, # feeds the performance tier + }, +} diff --git a/deno/.machine_readable/contractiles/dust/Dustfile.a2ml b/deno/.machine_readable/contractiles/dust/Dustfile.a2ml new file mode 100644 index 0000000..40c8482 --- /dev/null +++ b/deno/.machine_readable/contractiles/dust/Dustfile.a2ml @@ -0,0 +1,78 @@ +# SPDX-License-Identifier: MPL-2.0 +# Dustfile — Cleanup and hygiene contract for Burble +# Author: Jonathan D.A. Jewell +# +# What should be cleaned up. Housekeeping, not blockers. +# Run with: dust status +# Roll back with: dust rollback + +@abstract: +Cleanup and hygiene items for the Burble voice platform. +These are maintenance tasks — not blocking, but should be addressed. +@end + +## Stale Files + +### no-stale-snapshots +- description: No dated status/completion files in root +- run: test -z "$(ls *-STATUS-*.md *-COMPLETION-*.md 2>/dev/null)" +- severity: info + +### no-ai-djot +- description: AI.djot is superseded by 0-AI-MANIFEST.a2ml +- run: test ! -f AI.djot +- severity: warning + +### no-next-steps +- description: NEXT_STEPS.md superseded by ROADMAP +- run: test ! -f NEXT_STEPS.md +- severity: info + +## Build Artifacts + +### no-tracked-elixir-build +- description: No Elixir build artifacts tracked in git +- run: test -z "$(git ls-files server/_build/ server/deps/ 2>/dev/null)" +- severity: warning + +### no-tracked-rescript-build +- description: No ReScript build artifacts tracked in git +- run: test -z "$(git ls-files 'client/web/src/**/*.res.mjs' client/web/lib/ 2>/dev/null)" +- severity: warning + +## Burble-Specific Cleanup + +### stale-room-processes +- description: Room processes should auto-terminate after idle timeout +- verification: Burble.Rooms.Room uses @idle_timeout_ms (5 minutes) +- severity: info +- notes: Not a file check — design verification that idle rooms are cleaned up + +### expired-invite-tokens +- description: Expired invite tokens should be purged periodically +- verification: Scheduled task purges tokens past expires_at +- severity: info +- notes: Planned — not yet implemented + +### orphaned-turn-credentials +- description: TURN credentials expire after 1 hour +- verification: Burble.Media.Privacy.generate_turn_credential sets TTL +- severity: info + +### template-example-trustfile +- description: Remove the example Trustfile (keep only the real one) +- run: test ! -f .machine_readable/contractiles/trust/Trustfile_just_an_example.a2ml +- severity: info +- rollback: git checkout HEAD -- .machine_readable/contractiles/trust/Trustfile_just_an_example.a2ml + +## Format Duplicates + +### no-duplicate-contributing +- description: Only one CONTRIBUTING format +- run: test -z "$(test -f CONTRIBUTING.md && test -f CONTRIBUTING.adoc && echo dup)" +- severity: warning + +### no-duplicate-readme +- description: Only one README format +- run: test ! -f README.md || test ! -f README.adoc +- severity: warning diff --git a/deno/.machine_readable/contractiles/intend/Intentfile.a2ml b/deno/.machine_readable/contractiles/intend/Intentfile.a2ml new file mode 100644 index 0000000..908e832 --- /dev/null +++ b/deno/.machine_readable/contractiles/intend/Intentfile.a2ml @@ -0,0 +1,22 @@ +# SPDX-License-Identifier: MPL-2.0 +# Intentfile (A2ML Canonical) +# Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) + +@abstract: +Declared intent and purpose for Burble. +@end + +## Purpose + +Burble — // SPDX-License-Identifier: MPL-2.0 + +## Anti-Purpose + +This project is NOT: +- A fork or wrapper around another tool +- A monorepo (unless explicitly structured as one) + +## If In Doubt + +If you are unsure whether a change is in scope, ask. +Sensitive areas: ABI definitions, license headers, CI workflows. diff --git a/deno/.machine_readable/contractiles/must/Mustfile.a2ml b/deno/.machine_readable/contractiles/must/Mustfile.a2ml new file mode 100644 index 0000000..bf03f7b --- /dev/null +++ b/deno/.machine_readable/contractiles/must/Mustfile.a2ml @@ -0,0 +1,144 @@ +# SPDX-License-Identifier: MPL-2.0 +# Mustfile — Physical state contract for Burble +# Author: Jonathan D.A. Jewell +# +# What MUST be true about this repository. Hard requirements. +# Run with: must check +# Fix with: must fix (where deterministic fix exists) + +@abstract: +Physical state invariants for the Burble voice platform. +These are hard requirements — CI and pre-commit hooks fail if any check fails. +@end + +## File Presence + +### license-present +- description: LICENSE file must exist +- run: test -f LICENSE +- severity: critical + +### readme-present +- description: README.adoc must exist +- run: test -f README.adoc +- severity: critical + +### security-policy +- description: SECURITY.md must exist +- run: test -f SECURITY.md +- severity: critical + +### ai-manifest +- description: 0-AI-MANIFEST.a2ml must exist +- run: test -f 0-AI-MANIFEST.a2ml +- severity: critical + +### contributing +- description: CONTRIBUTING guide must exist +- run: test -f CONTRIBUTING.adoc || test -f .github/CONTRIBUTING.md +- severity: warning + +### editorconfig +- description: .editorconfig must exist +- run: test -f .editorconfig +- severity: warning + +## Elixir Server + +### mix-exs-present +- description: Elixir mix.exs must exist in server/ +- run: test -f server/mix.exs +- severity: critical + +### elixir-compiles +- description: Elixir server compiles without errors +- run: test -f server/mix.exs +- severity: critical +- notes: Full compile check via CI (mix compile), file presence check here + +### ecto-migrations-exist +- description: Database migrations directory exists +- run: test -d server/priv/repo/migrations +- severity: critical + +### config-files-present +- description: All config files exist +- run: test -f server/config/config.exs && test -f server/config/dev.exs && test -f server/config/prod.exs && test -f server/config/runtime.exs +- severity: critical + +## Web Client + +### rescript-json-present +- description: ReScript config exists for web client +- run: test -f client/web/rescript.json +- severity: warning + +### web-entry-point +- description: Web client entry point exists +- run: test -f server/priv/static/index.html || test -f client/web/index.html +- severity: warning + +## SPDX Compliance + +### spdx-elixir +- description: All Elixir files have SPDX header +- run: test -z "$(find server/lib -name '*.ex' -exec head -1 {} \; 2>/dev/null | grep -cv 'SPDX' | grep -v '^0$')" +- severity: warning + +### no-agpl +- description: No AGPL-3.0 references (replaced by PMPL) +- run: test -z "$(grep -rl 'AGPL-3.0' LICENSE .editorconfig .gitattributes 2>/dev/null)" +- severity: critical + +## Dangerous Patterns + +### no-believe-me +- description: No believe_me in Idris2 code +- run: test -z "$(find . -name '*.idr' -not -path '*/deps/*' -exec grep -l 'believe_me' {} \; 2>/dev/null)" +- severity: critical + +### no-unsafe-coerce +- description: No unsafeCoerce in ReScript/Haskell code +- run: test -z "$(find . \( -name '*.res' -o -name '*.hs' \) -not -path '*/deps/*' -not -path '*/node_modules/*' -exec grep -l 'unsafeCoerce\|Obj.magic' {} \; 2>/dev/null)" +- severity: critical + +## Container Policy + +### containerfile-not-dockerfile +- description: Uses Containerfile, not Dockerfile +- run: test -z "$(find . -name 'Dockerfile' -not -path '*/.clusterfuzzlite/*' 2>/dev/null)" +- severity: warning + +### no-docker-commands +- description: No docker commands in scripts (use podman) +- run: test -z "$(grep -rl 'docker run\|docker build\|docker compose' --include='*.sh' --include='*.yml' . 2>/dev/null | grep -v deps | grep -v node_modules)" +- severity: warning + +## Language Policy + +### no-typescript +- description: No TypeScript files (use ReScript) +- run: test -z "$(find . -name '*.ts' -not -name '*.d.ts' -not -path '*/deps/*' -not -path '*/node_modules/*' 2>/dev/null)" +- severity: warning + +### no-python +- description: No Python files (use Julia/Rust/ReScript) +- run: test -z "$(find . -name '*.py' -not -path '*/deps/*' -not -path '*/node_modules/*' 2>/dev/null)" +- severity: warning + +## Security + +### no-secrets-in-config +- description: No hardcoded secrets in Elixir config +- run: test -z "$(grep -rE '(secret_key_base|password).*=\"[A-Za-z0-9+/]{32,}\"' server/config/ 2>/dev/null | grep -v 'dev_only\|test_only')" +- severity: critical + +### beam-cookie-absent +- description: No Erlang cookie in repository +- run: test -z "$(find . -name '.erlang.cookie' 2>/dev/null)" +- severity: critical + +### env-files-absent +- description: No .env files committed +- run: test ! -f .env && test ! -f server/.env && test ! -f .env.local && test ! -f .env.production +- severity: critical diff --git a/deno/.machine_readable/contractiles/trust/Trustfile.a2ml b/deno/.machine_readable/contractiles/trust/Trustfile.a2ml new file mode 100644 index 0000000..0c95e15 --- /dev/null +++ b/deno/.machine_readable/contractiles/trust/Trustfile.a2ml @@ -0,0 +1,22 @@ +# SPDX-License-Identifier: MPL-2.0 +# Trustfile — Integrity and Provenance Contract + +[trustfile] +version = "1.0.0" +format = "a2ml" + +[provenance] +source-control = "git" +forge = "github" +ci-verified = true +signing-policy = "commit-signing-preferred" + +[integrity] +spdx-compliant = true +license-audit = "required" +dependency-pinning = "sha-pinned" + +[verification] +reproducible-builds = "goal" +sbom-generation = "required" +attestation = "sigstore-preferred" diff --git a/deno/.machine_readable/contractiles/trust/Trustfille.a2ml b/deno/.machine_readable/contractiles/trust/Trustfille.a2ml new file mode 100644 index 0000000..454353d --- /dev/null +++ b/deno/.machine_readable/contractiles/trust/Trustfille.a2ml @@ -0,0 +1,897 @@ +# SPDX-License-Identifier: MPL-2.0 +# ============================================================================= +# A2ML Trustfile Example (Fully Populated Reference) +# This is the complete example. The blank template is Trustfile.a2ml. +# ============================================================================= + +--- +### [META] +id: "did:web:example.com" +version: "2026.2.5-final" +context: + - "https://a2ml.org/ns/v2" + - "https://leanprover-community.github.io/lean4" + - "https://hypatia.scans/ns/v1" + - "https://w3id.org/security/v4" + - "https://w3id.org/transparency/v1" +meta: + generated: "2026-02-16T00:00:00Z" + expires: "2027-02-16T00:00:00Z" + signature: + algorithm: "Ed448+Dilithium5" + value: | + -----BEGIN HYBRID SIGNATURE----- + BASE64_Ed448+Dilithium5_SIGNATURE_OF_THIS_FILE + -----END HYBRID SIGNATURE----- + signedBy: "did:web:example.com#primary-sig" + proof: "https://example.com/proofs/meta.lean" + fallbackSignature: + algorithm: "SPHINCS+" + value: | + -----BEGIN SPHINCS+ SIGNATURE----- + BASE64_SPHINCS+_SIGNATURE_OF_THIS_FILE + -----END SPHINCS+ SIGNATURE----- + integrity: + sha3-512: "HEX_SHA3_512_OF_THIS_FILE" + shake256: "BASE32_SHAKE256_OF_THIS_FILE" + zonemd: "2026021601;SHA512;BASE64_SHA512_OF_ZONE;SHAKE256;BASE32_SHAKE256_OF_ZONE" + ci_cd: + github_actions: "https://github.com/hyperpolymath/example.com/blob/main/.github/workflows/trustfile.yml" + gitbot_fleet: "https://gitbot-fleet.example.com/hooks/trustfile" + hypatia_scan: "https://hypatia.scans/repos/example.com" + automation: + hashing: ["SHA3-512", "SHAKE256", "BLAKE3"] + diffing: "alert-on-unexpected-changes" + integrity: ["zonemd-consistency", "transparency-log-continuity", "lean-proof-validity"] + +--- +### [THREAT_MODEL] +adversaries: + - type: "APT" + mitigations: + - "Capability-based auth → No lateral movement." + - "LEAN4 proofs → No exploit primitives." + - "Transparency logs → Immediate detection." + - type: "Ransomware" + mitigations: + - "Consent-Aware HTTP → No bulk exfiltration." + - "SDP (CAdRE Router) → Resource isolation." + - "Immutable logs → Instant rollback." + - type: "Quantum Adversary" + mitigations: + - "Kyber1024 + Dilithium5 → PQ-resistant crypto." + - "SPHINCS+ fallback → Crypto agility." + - "GitBot-Fleet → Automated key rotation." + - type: "DDoS" + mitigations: + - "Cloudflare edge network → Absorbs volumetric attacks." + - "HTTP DDoS Managed Ruleset → Auto-mitigation at max sensitivity." + - "Challenge Passage TTL → Rate-limits challenge solvers." + - "Security Level → Adjustable based on threat intelligence." + - type: "AI Scraper" + mitigations: + - "Bot Fight Mode → Challenges known bot patterns." + - "Block AI Bots → Blocks verified AI crawlers + similar unverified." + - "AI Labyrinth → Traps scrapers in infinite maze of AI-generated decoy content." + - "AI Crawl Control → Per-crawler blocking and monitoring." + - "Managed robots.txt → Programmatic crawl directives." + - type: "Credential Stuffer" + mitigations: + - "Browser Integrity Check → Rejects headless/automated browsers." + - "Challenge Passage TTL → Forces re-challenge after 30 min." + - "HSTS preload → Prevents SSL-stripping MITM for credential capture." + - "Leaked credentials detection → (Enterprise; noted for upgrade path)." + - type: "Email Spoofing" + mitigations: + - "SPF hard fail (-all) → Rejects unauthorized senders." + - "DMARC p=reject → Instructs receivers to drop spoofed mail." + - "DKIM signing → Cryptographic message authentication." + - "CAA records → Restricts certificate issuance to authorized CAs." + +--- +### [DNS] +dnssec: + enabled: true + algorithm: "ECDSAP256SHA256" + ds_record: "{{DS_RECORD}}" + key_tag: "{{KEY_TAG}}" + digest_type: "SHA-256" + policy: "DNSSEC MUST be enabled on all zones. DS records propagated to registrar." + security: + proof: "DNS.DNSSEC.lean" + ci_cd: "verify-dnssec-propagation" +soa: + mname: "ns1.cloudflare.com." + rname: "admin.example.com." + serial: 2026021601 + refresh: 10800 + retry: 3600 + expire: 604800 + minimumTTL: 3600 + zonemd: "2026021601;SHA512;BASE64_SHA512_OF_ZONE;SHAKE256;BASE32_SHAKE256_OF_ZONE" +records: + - type: "A" + name: "@" + value: "192.0.2.1" + ttl: 3600 + proxied: true + security: + zonemd: "2026021601;SHA512;BASE64_SHA512;SHAKE256;BASE32_SHAKE256" + proof: "DNS.Core.A_Record.lean" + hypatia: "scan-dns-record" + ci_cd: "auto-hash-on-push" + - type: "AAAA" + name: "@" + value: "2001:db8::1" + ttl: 3600 + proxied: true + security: + proof: "DNS.Core.AAAA_Record.lean" + - type: "HTTPS" + name: "@" + value: '1 . alpn="h3,h2" ipv4hint=192.0.2.1 ipv6hint=2001:db8::1' + ttl: 3600 + security: + proof: "DNS.HTTPS.lean" + - type: "SVCB" + name: "@" + value: '1 . alpn="h3,h2" port=443 ipv4hint=192.0.2.1 ipv6hint=2001:db8::1' + ttl: 3600 + security: + proof: "DNS.SVCB.lean" + - type: "TXT" + name: "@" + value: '"v=DMARC1; p=reject; rua=mailto:dmarc@example.com; ruf=mailto:dmarc@example.com"' + ttl: 3600 + security: + proof: "Email.DMARC.lean" + - type: "CAA" + name: "@" + value: '0 issue "letsencrypt.org"' + ttl: 3600 + - type: "CAA" + name: "@" + value: '0 issue "digicert.com"' + ttl: 3600 + - type: "CAA" + name: "@" + value: '0 iodef "mailto:security@example.com"' + ttl: 3600 + - type: "TLSA" + name: "_443._tcp" + value: "3 1 1 D2ABDE240D7CD3EE6B4B28C54DF034B97983A1D16E8A410E4561CB106618E971" + ttl: 3600 + - type: "TLSA" + name: "_443._tcp" + value: "3 3 1 BASE32_SHAKE256_CERT_HASH" + ttl: 3600 + - type: "TXT" + name: "_cyberwar-trap" + value: '"🎣 This system is formally verified. Good luck, script kiddie."' + ttl: 3600 + security: + hypatia: "scan-for-apt-activity" + proof: "Psychological.Warfare.lean" + - type: "TXT" + name: "_capabilities" + value: '"v=OCAP1; endpoint=https://example.com/cap"' + ttl: 3600 + security: + proof: "HTTP.Capabilities.lean" + - type: "TXT" + name: "_consent" + value: '"v=CAdRE1; endpoint=https://example.com/.well-known/consent"' + ttl: 3600 + security: + proof: "HTTP.Consent.lean" + gitbot: "validate-consent-endpoint" + # Email Security Records + - type: "TXT" + name: "@" + value: '"v=spf1 -all"' + ttl: 3600 + notes: "Hard fail. No servers authorized to send. Override per-domain if email is used." + security: + proof: "Email.SPF.lean" + - type: "TXT" + name: "_dmarc" + value: '"v=DMARC1; p=reject; sp=reject; adkim=s; aspf=s; rua=mailto:dmarc@example.com; ruf=mailto:dmarc@example.com; fo=1"' + ttl: 3600 + notes: "Strict alignment. Reject all unauthenticated. Forensic reports on any failure." + security: + proof: "Email.DMARC.lean" + ci_cd: "validate-dmarc-alignment" + - type: "TXT" + name: "*._domainkey" + value: '"v=DKIM1; p="' + ttl: 3600 + notes: "Empty public key = revoked. Prevents DKIM pass on spoofed mail for non-sending domains." + security: + proof: "Email.DKIM.lean" + - type: "TXT" + name: "_mta-sts" + value: '"v=STSv1; id={{MTA_STS_ID}}"' + ttl: 3600 + notes: "MTA-STS policy ID. Rotate on policy change." + - type: "TXT" + name: "_smtp._tls" + value: '"v=TLSRPTv1; rua=mailto:tls-reports@example.com"' + ttl: 3600 + notes: "SMTP TLS Reporting (RFC 8460). Receive reports on TLS failures." + +--- +### [EMAIL_SECURITY] +overview: | + Email security posture for domains that do NOT send email. + All records configured to reject/block spoofed mail. + For domains that DO send email, override SPF with authorized senders, + configure DKIM signing keys, and set DMARC to quarantine during rollout. +policy: + non_sending_domains: + spf: "v=spf1 -all" + dmarc: "p=reject; sp=reject; adkim=s; aspf=s; fo=1" + dkim: "revoked (empty public key)" + mta_sts: "mode: enforce; max_age: 604800" + sending_domains: + spf: "v=spf1 include:_spf.google.com include:_spf.cloudflare.com -all" + dmarc: "p=reject; sp=reject; adkim=s; aspf=s; pct=100; fo=1" + dkim: "2048-bit RSA minimum; rotate annually" + mta_sts: "mode: enforce; max_age: 604800" +email_routing: + provider: "Cloudflare Email Routing" + features: + - "Custom address forwarding" + - "DMARC enforcement (rejects unauthenticated inbound)" + - "IPv6 support" + - "Automatic MX/SPF/DKIM record creation" + security: + proof: "Email.Routing.lean" +security: + proof: "Email.Policy.lean" + ci_cd: "validate-email-records-on-push" + +--- +### [TRUSTFILE] +issuer: "did:web:example.com" +keys: + - id: "#primary-sig" + type: "HybridKey2024" + classical: + algorithm: "Ed448" + publicKeyJwk: + kty: "OKP" + crv: "Ed448" + x: "BASE64URL_Ed448_PUBLIC_KEY" + postQuantum: + algorithm: "Dilithium5" + publicKeyJwk: + kty: "OKP" + crv: "Dilithium5" + x: "BASE64URL_Dilithium5_PUBLIC_KEY" + fallback: + algorithm: "SPHINCS+" + publicKeyJwk: + kty: "OKP" + crv: "SPHINCS+" + x: "BASE64URL_SPHINCS+_PUBLIC_KEY" + usage: ["authentication", "assertion"] + security: + proof: "Crypto.HybridKey.lean" + hypatia: "scan-keys" + ci_cd: "rotate-keys-on-compromise" +algorithms: + hashing: ["SHA3-512", "SHAKE256", "BLAKE3"] + kdf: "HKDF-SHAKE512" + rng: "ChaCha20-DRBG" + passwordHashing: "Argon2id (512 MiB, 8 iter, 4 lanes)" + security: + proof: "Crypto.Algorithms.lean" +policies: + dns: + rego: | + package trustfile.dns + default allow = false + allow { + input.record.security.proof != "" + input.record.security.zonemd != "" + } + lean: "Policies.DNS.lean" + ci_cd: "validate-dns-policies-on-push" + http: + rego: | + package trustfile.http + default allow = false + allow { + input.consent.granted + valid_capability(input.capability) + } + lean: "Policies.HTTP.lean" + php: + rego: | + package trustfile.php + default allow = false + allow { + input.php.aegis_enabled + input.php.sanctify_enabled + } + lean: "Policies.PHP.lean" +fallbacks: + signatures: ["Ed448+Dilithium5", "SPHINCS+"] + keyExchange: ["Kyber1024-X25519", "X25519"] + +--- +### [CI_CD] +github_actions: + name: "Trustfile Validation" + on: ["push", "pull_request"] + jobs: + validate: + runs-on: "ubuntu-latest" + steps: + - uses: "actions/checkout@v4" + - name: "Validate A2ML" + run: "a2ml validate example.com.trustfile.a2ml" + - name: "Run LEAN4 Proofs" + run: "lake build && lake exectest" + - name: "Hypatia Scan" + run: "hypatia scan --config hypatia.yml" + - name: "GitBot-Fleet Passover" + run: "gitbot-fleet passover --file example.com.trustfile.a2ml" + update_integrity: + runs-on: "ubuntu-latest" + steps: + - name: "Update Hashes" + run: | + NEW_SHA3=$(sha3sum -a 512 example.com.trustfile.a2ml | awk '{print $1}') + NEW_SHAKE=$(shake256sum example.com.trustfile.a2ml | awk '{print $1}' | base32) + sed -i "s|sha3-512:.*|sha3-512: \"$NEW_SHA3\"|" example.com.trustfile.a2ml + sed -i "s|shake256:.*|shake256: \"$NEW_SHAKE\"|" example.com.trustfile.a2ml + - name: "Commit and Push" + run: | + git config --global user.name "GitBot-Fleet" + git config --global user.email "gitbot@example.com" + git add example.com.trustfile.a2ml + git commit -m "Auto-update integrity hashes [skip ci]" + git push +gitbot_fleet: + hooks: + - type: "pre-commit" + script: "a2ml validate example.com.trustfile.a2ml" + - type: "post-merge" + script: "gitbot-fleet diff --file example.com.trustfile.a2ml" +hypatia: + config: "hypatia.yml" + scans: + - type: "dns" + frequency: "daily" + - type: "crypto" + frequency: "weekly" + - type: "php" + frequency: "on-push" + +--- +### [LEAN4_PROOFS] +theorems: + - name: "dns_correctness" + file: "DNS.Core.lean" + description: "All DNS records are conflict-free and correctly signed." + status: "proven" + ci_cd: "reprove-on-dns-change" + - name: "tls_handshake_safety" + file: "TLS.Handshake.lean" + description: "TLS 1.3 + Kyber1024 handshake resists downgrade attacks." + status: "proven" + - name: "consent_aware_http_soundness" + file: "HTTP.Consent.lean" + description: "Consent-Aware HTTP (CAdRE) enforces user intent." + status: "proven" + - name: "capability_gateway_correctness" + file: "HTTP.Capabilities.lean" + description: "OCAP-style capability gateway is safe." + status: "proven" + - name: "php_hardening_no_bypasses" + file: "PHP.Hardening.lean" + description: "PHP-Aegis + Sanctify-PHP blocks all unsafe functions." + status: "proven" + - name: "edge_ssl_no_downgrade" + file: "Cloudflare.SSL.lean" + description: "TLS 1.3 + HSTS preload prevents protocol downgrade at edge." + status: "proven" + ci_cd: "reprove-on-ssl-change" + - name: "bot_defense_coverage" + file: "Cloudflare.Bots.lean" + description: "Bot Fight Mode + AI Labyrinth + Block AI Bots covers all free-plan bot vectors." + status: "proven" + - name: "email_anti_spoofing" + file: "Email.Policy.lean" + description: "SPF -all + DMARC reject + revoked DKIM prevents email spoofing on non-sending domains." + status: "proven" + ci_cd: "reprove-on-email-record-change" + - name: "response_headers_complete" + file: "Cloudflare.ResponseHeaders.lean" + description: "All OWASP-recommended response headers enforced at edge." + status: "proven" + - name: "dnssec_chain_valid" + file: "DNS.DNSSEC.lean" + description: "DNSSEC chain of trust from root to zone is valid and signed." + status: "proven" + ci_cd: "verify-dnssec-weekly" + - name: "network_transport_safety" + file: "Cloudflare.Network.lean" + description: "HTTP/3 + 0-RTT replay protection + Onion routing correctly configured." + status: "proven" + +--- +### [AUTOMATION] +hashing: + tool: "GitBot-Fleet" + triggers: ["pre-commit", "post-merge"] + algorithms: ["SHA3-512", "SHAKE256", "BLAKE3"] +diffing: + tool: "GitBot-Fleet" + rules: + - "alert-on-unexpected-changes" + - "require-proof-updates-for-crypto-changes" +integrity: + tool: "Hypatia + LEAN4" + checks: + - "zonemd-consistency" + - "transparency-log-continuity" + - "lean-proof-validity" + +--- +### [CAPABILITY_GATEWAY] +rules: + - resource: "/api/data" + policy: "require Ed448+Dilithium5-signed capability token" + proof: "HTTP.Capabilities.Data.lean" + - resource: "/admin" + policy: "require TPM 2.0 + YubiKey device attestation" + proof: "HTTP.Capabilities.Admin.lean" + +--- +### [SDP_RULES] +services: + - name: "dashboard.internal" + access: + - group: "admins" + policy: "require Ed448+Dilithium5 + device-attestation + cadre-consent" + - group: "bots" + policy: "require JWT (Kyber1024) + IP in CI_NETWORK" + proof: "SDP.Dashboard.lean" + - name: "db.internal" + access: + - group: "apps" + policy: "require mutual TLS (Kyber1024-X25519) + client cert" + proof: "SDP.Database.lean" + +--- +### [TRANSPARENCY_LOG] +rfc9162: + uri: "https://example.com/log/transparency.json" + entries: + - timestamp: "2026-02-16T00:00:00Z" + data: "BASE64_ENCODED_THIS_FILE" + signature: "BASE64_Ed448+Dilithium5_SIGNATURE" + lean_proof: "Transparency.Log.lean" + ci_cd: "append-on-push" + +--- +### [SSL/TLS] +ciphers: + - "TLS_AES_256_GCM_SHA384" + - "TLS_CHACHA20_POLY1305_SHA256" +groups: + - "X25519Kyber768Draft00" + - "secp256r1" +protocols: + - "TLSv1.3" +minimum_version: "1.2" +notes: | + TLS 1.3 preferred with post-quantum key exchange (X25519Kyber768). + Minimum version 1.2 enforced at Cloudflare edge for clients that + don't support 1.3 yet. TLS 1.0 and 1.1 are BANNED. Cipher preference + is server-side (Cloudflare-controlled on free plan). +features: + ocspStapling: true + signedCertTimestamps: true + certificateTransparency: + logs: + - "ct.googleapis.com/aviator" + - "ct.googleapis.com/rocketeer" + monitoring: true + notes: "Cloudflare automatically includes SCT in TLS handshake for all proxied zones." + mustStaple: true + opportunistic_encryption: true + automatic_https_rewrites: true + always_use_https: true +edge_certificates: + provider: "Cloudflare Universal SSL" + type: "DV (Domain Validated)" + issuers: ["DigiCert", "Let's Encrypt", "Google Trust Services"] + auto_renewal: true + caa_restriction: true + notes: | + Cloudflare issues Universal SSL certificates automatically for all + proxied zones. CAA records restrict issuance to authorized CAs only. + Origin certificates should use Cloudflare Origin CA (15-year validity) + or publicly trusted certs for Full (Strict) mode. +security: + proof: "TLS.Configuration.lean" + ci_cd: "verify-tls-settings-drift" + +--- +### [CLOUDFLARE] +waf: + ruleset: "OWASP_ModSecurity_CRS" + sensitivity: "high" + paranoiaLevel: 4 + managed_rulesets: + - name: "Cloudflare Managed Ruleset" + id: "efb7b8c949ac4650a09736fc376e9aee" + action: "execute" + phase: "http_request_firewall_managed" + - name: "Cloudflare OWASP Core Ruleset" + id: "4814384a9e5d4991b9815dcfc25d2f1f" + action: "execute" + phase: "http_request_firewall_managed" + ddos: + http: + sensitivity: "high" + action: "managed_challenge" + ruleset: "Cloudflare HTTP DDoS Attack Protection" + notes: "Always-on, unmetered DDoS protection on all plans." + security: + proof: "Cloudflare.WAF.lean" + ci_cd: "validate-waf-rulesets" +workers: + - name: "consent-aware-http" + script: "https://example.com/workers/consent.js" + routes: + - "example.com/.well-known/consent*" + - name: "capability-gateway" + script: "https://example.com/workers/cap.js" + routes: + - "example.com/cap*" + +--- +### [CLOUDFLARE_EDGE_SECURITY] +overview: | + Cloudflare edge security settings applied uniformly across all zones. + These are the maximum free-plan configurations. Settings are enforced + via API and validated by Hypatia CI scans. Any drift triggers an alert. + +ssl_tls: + mode: "strict" + min_tls_version: "1.2" + tls_1_3: "zrt" + always_use_https: true + automatic_https_rewrites: true + opportunistic_encryption: true + hsts: + enabled: true + max_age: 31536000 + include_subdomains: true + preload: true + nosniff: true + universal_ssl: true + certificate_transparency: true + ocsp_stapling: true + notes: | + TLS 1.3 with 0-RTT (zrt). HSTS preloaded at 1 year with subdomains. + SSL mode 'strict' requires valid origin certificate (Cloudflare Origin CA + or publicly trusted). Downgrade to 'full' only if origin has self-signed. + security: + proof: "Cloudflare.SSL.lean" + ci_cd: "verify-ssl-settings-drift" + +bot_defense: + bot_fight_mode: true + block_ai_bots: true + ai_labyrinth: true + ai_crawl_control: + default_action: "block" + notes: | + Block all known AI crawlers by default. AI Labyrinth traps persistent + scrapers in an infinite maze of AI-generated decoy content, wasting + their compute while protecting real content. Individual crawlers can + be allowed via per-crawler overrides if licensing agreements exist. + managed_robots_txt: true + javascript_detections: false + notes: | + JS detections require Super Bot Fight Mode (Pro+). On free plan, + Bot Fight Mode uses pattern matching only. AI Labyrinth is the + primary free-plan defense against sophisticated AI scraping. + security: + proof: "Cloudflare.Bots.lean" + ci_cd: "verify-bot-settings" + +scrape_shield: + email_obfuscation: true + hotlink_protection: true + server_side_excludes: true + notes: | + Email obfuscation rewrites email addresses in HTML to prevent + harvesting by scrapers. Hotlink protection prevents other sites + from embedding your images. Server-side excludes hide content + from suspicious visitors. + security: + proof: "Cloudflare.ScrapeShield.lean" + +browser_integrity: + browser_check: true + security_level: "medium" + challenge_ttl: 1800 + notes: | + Browser Integrity Check evaluates HTTP headers for common + characteristics of abusive traffic. Security level 'medium' + challenges visitors from IPs with moderate threat scores. + Challenge TTL of 30 minutes before re-challenge. + security: + proof: "Cloudflare.BrowserIntegrity.lean" + +page_shield: + enabled: true + script_monitoring: true + notes: | + Page Shield monitors client-side JavaScript resources loaded by + your pages. Free tier provides script detection and alerts for + new/changed scripts. Paid tiers add malicious script detection. + security: + proof: "Cloudflare.PageShield.lean" + ci_cd: "review-new-scripts" + +security_txt: + enabled: true + contact: "mailto:j.d.a.jewell@open.ac.uk" + preferred_languages: "en" + expires: "{{SECURITY_TXT_EXPIRES}}" + policy: "https://{{DOMAIN}}/.well-known/security-policy" + acknowledgments: "https://{{DOMAIN}}/.well-known/security-acknowledgments" + encryption: "https://{{DOMAIN}}/.well-known/pgp-key.txt" + canonical: "https://{{DOMAIN}}/.well-known/security.txt" + notes: | + RFC 9116 compliant. Served by Cloudflare at /.well-known/security.txt. + Contact is the author's university email. Expiry set to 1 year from + deployment, auto-renewed by CI. Canonical URL prevents spoofing. + security: + proof: "Cloudflare.SecurityTxt.lean" + ci_cd: "renew-security-txt-before-expiry" + +--- +### [RESPONSE_HEADERS] +overview: | + Security response headers applied at the Cloudflare edge via Managed + Transforms and custom response header modification rules. These headers + instruct browsers to enforce security policies regardless of origin config. + +managed_transforms: + add: + - "X-Content-Type-Options: nosniff" + - "X-Frame-Options: SAMEORIGIN" + - "Referrer-Policy: strict-origin-when-cross-origin" + remove: + - "Server" + - "X-Powered-By" + notes: "Managed Transforms are Cloudflare's built-in header rules. Zero config." + +custom_headers: + - name: "Permissions-Policy" + value: "camera=(), microphone=(), geolocation=(), payment=()" + notes: "Deny all sensitive browser APIs unless explicitly needed." + - name: "Content-Security-Policy" + value: "default-src 'self'; script-src 'self'; style-src 'self' 'unsafe-inline'; img-src 'self' data: https:; frame-ancestors 'self'; base-uri 'self'; form-action 'self'" + notes: "Strict CSP baseline. Override per-project if needed (e.g., for CDN scripts)." + - name: "Cross-Origin-Opener-Policy" + value: "same-origin" + - name: "Cross-Origin-Embedder-Policy" + value: "require-corp" + - name: "Cross-Origin-Resource-Policy" + value: "same-origin" + +policy: | + All security headers are enforced at the edge. Origin servers SHOULD + also set these headers as defense-in-depth. Headers set at edge take + precedence when Managed Transforms are enabled. CSP violations are + reported to /csp-report endpoint if a report-uri directive is added. + +security: + proof: "Cloudflare.ResponseHeaders.lean" + ci_cd: "validate-response-headers" + +--- +### [NETWORK] +overview: | + Network-level settings applied at the Cloudflare edge. + These affect how traffic is transported between clients and edge. + +http2: true +http3: true +quic: true +zero_rtt: true +websockets: true +onion_routing: true +ipv6_compatibility: true +brotli: true + +zero_rtt_policy: | + 0-RTT Connection Resumption is enabled for performance. Note: 0-RTT + data is vulnerable to replay attacks. Cloudflare mitigates this by + only allowing 0-RTT on idempotent requests (GET/HEAD). Non-idempotent + requests (POST/PUT/DELETE) always use full handshake. Applications + MUST NOT rely on 0-RTT for state-changing operations. + +onion_routing_policy: | + Tor/Onion routing enabled via Cloudflare's Opportunistic Onion + (Alt-Svc header advertising .onion endpoint). This allows Tor users + to access sites without exit node MITM risk. Does NOT create a + dedicated .onion address — uses Cloudflare's shared onion service. + +security: + proof: "Cloudflare.Network.lean" + ci_cd: "verify-network-settings" + +--- +### [PERFORMANCE] +overview: | + Performance settings that have security implications. + Applied at the Cloudflare edge for all zones. + +early_hints: true +speed_brain: true +auto_minify: + javascript: true + css: true + html: true +rocket_loader: false +notes: | + Rocket Loader disabled by default — it rewrites JavaScript loading + order which can break SPAs and CSP policies. Enable per-project only + after testing. Speed Brain uses Speculation Rules API to prefetch + likely navigation targets (conservative eagerness only). + +caching: + browser_ttl: "respect-origin" + edge_ttl: "default" + always_online: true + notes: | + Always Online serves stale cached copies when origin is unreachable. + Browser TTL respects origin Cache-Control headers. Do not cache + authenticated content — use Cache-Control: private on origin. + +security: + proof: "Cloudflare.Performance.lean" + +--- +### [PHP_HARDENING] +aegis: + enabled: true + rules: + - "disable_functions=exec,popen,shell_exec,system" + - "expose_php=0" + - "session.cookie_httponly=1" + - "session.cookie_secure=1" +sanctify: + enabled: true + directives: + - "sanctify.globals=1" + - "sanctify.request=1" + - "sanctify.error_reporting=E_ALL" + +--- +### [CONTAINER_SUPPLY_CHAIN] +overview: | + Container supply-chain verification via the stapeln ecosystem. + All container images are built with Podman on Chainguard Wolfi base + images, signed as .ctp bundles via cerro-torre, and governed by + svalinn edge gateway policies. Runtime monitoring provided by vordr. + +runtime: + engine: "Podman" + policy: "Rootless containers only. Never Docker." + socket: "${XDG_RUNTIME_DIR}/podman/podman.sock" + security: + proof: "Container.Runtime.lean" + +base_images: + provider: "Chainguard" + registry: "cgr.dev/chainguard/" + allowed: + - "cgr.dev/chainguard/wolfi-base:latest" + - "cgr.dev/chainguard/static:latest" + policy: "Only Chainguard images permitted as base. Rebuilt daily, CVE-free." + security: + proof: "Container.BaseImages.lean" + ci_cd: "scan-base-images-daily" + +verified_bundles: + format: ".ctp" + tool: "cerro-torre" + operations: + pack: "ct pack -o " + sign: "cerro-sign sign --key-id " + verify: "ct verify " + push: "ct push " + explain: "ct explain " + attestations: + required: ["source-signature", "sbom-complete"] + recommended: ["security-audit", "reproducible-build"] + security: + proof: "Container.Bundles.lean" + hypatia: "scan-ctp-bundles" + +gateway: + tool: "svalinn" + policy_file: "container/.gatekeeper.yaml" + capabilities: + - "JWT/OAuth2 authentication" + - "Rate limiting (per-client, per-endpoint)" + - "Container trust enforcement (.ctp signature verification)" + - "Request validation (body size, NaN/Inf rejection)" + - "CORS policy enforcement" + - "Audit logging for write operations" + - "TLS auto-provisioning" + security: + proof: "Container.Gateway.lean" + ci_cd: "validate-gatekeeper-policy-on-push" + +monitoring: + tool: "vordr" + config_file: "container/vordr.toml" + capabilities: + - "Health endpoint monitoring" + - "Container crash detection" + - "Resource usage thresholds (CPU, memory, disk)" + - "Structured JSON log output" + - "Automatic restart on failure (configurable)" + security: + proof: "Container.Monitoring.lean" + +signing: + algorithm: "Ed25519" + tool: "cerro-torre sign / cerro-sign" + key_management: | + Signing keys are project-specific. Each service has a dedicated + Ed25519 key pair (e.g. -release). Public keys are + distributed in .gatekeeper.yaml trusted_signers section. + security: + proof: "Container.Signing.lean" + ci_cd: "rotate-signing-keys-on-compromise" + +deployment: + tool: "k9-svc" + spec_file: "container/deploy.k9.ncl" + trust_level: "Hunt" + description: | + k9-svc deployment components at Hunt trust level. Full pedigree + (L1-L5: identity, target, security, validation, recipes). + Requires cryptographic handshake before execution. Supports + dev/staging/production environments with rolling deployment. + security: + proof: "Container.Deployment.lean" + ci_cd: "validate-k9-pedigree-on-push" + +--- +### [SIGNATURE_BLOCK] +primary: + algorithm: "Ed448+Dilithium5" + signature: | + -----BEGIN HYBRID SIGNATURE----- + BASE64_Ed448+Dilithium5_SIGNATURE_OF_THIS_FILE + -----END HYBRID SIGNATURE----- + signedBy: "did:web:example.com#primary-sig" + lean_proof: "Signature.Primary.lean" +fallback: + algorithm: "SPHINCS+" + signature: | + -----BEGIN SPHINCS+ SIGNATURE----- + BASE64_SPHINCS+_SIGNATURE_OF_THIS_FILE + -----END SPHINCS+ SIGNATURE----- + lean_proof: "Signature.Fallback.lean" + +--- +### [DEPLOYMENT] +1. Replace all `BASE64_*`, `HEX_*`, and `DID_WEB_ID` placeholders. +2. Generate LEAN4 proofs: + ```bash + lake build && lake exectest diff --git a/deno/.machine_readable/integrations/feedback-o-tron.a2ml b/deno/.machine_readable/integrations/feedback-o-tron.a2ml new file mode 100644 index 0000000..5381604 --- /dev/null +++ b/deno/.machine_readable/integrations/feedback-o-tron.a2ml @@ -0,0 +1,13 @@ +# SPDX-License-Identifier: MPL-2.0 +# Feedback-o-Tron Integration — Autonomous Bug Reporting + +[integration] +name = "feedback-o-tron" +type = "bug-reporter" +repository = "https://github.com/hyperpolymath/feedback-o-tron" + +[reporting-config] +platforms = ["github", "gitlab", "bugzilla"] +deduplication = true +audit-logging = true +auto-file-upstream = "on-external-dependency-failure" diff --git a/deno/.machine_readable/integrations/proven.a2ml b/deno/.machine_readable/integrations/proven.a2ml new file mode 100644 index 0000000..9af33ff --- /dev/null +++ b/deno/.machine_readable/integrations/proven.a2ml @@ -0,0 +1,18 @@ +# SPDX-License-Identifier: MPL-2.0 +# Proven Integration — Formally Verified Safety Library + +[integration] +name = "proven" +type = "safety-library" +repository = "https://github.com/hyperpolymath/proven" +version = "1.2.0" + +[binding-policy] +approach = "thin-ffi-wrapper" +unsafe-patterns = "replace-with-proven-equivalent" +modules-available = ["SafeMath", "SafeString", "SafeJSON", "SafeURL", "SafeRegex", "SafeSQL", "SafeFile", "SafeTemplate", "SafeCrypto"] + +[adoption-guidance] +priority = "high" +scope = "all-string-json-url-crypto-operations" +migration = "incremental — replace unsafe patterns as encountered" diff --git a/deno/.machine_readable/integrations/verisimdb.a2ml b/deno/.machine_readable/integrations/verisimdb.a2ml new file mode 100644 index 0000000..164c522 --- /dev/null +++ b/deno/.machine_readable/integrations/verisimdb.a2ml @@ -0,0 +1,15 @@ +# SPDX-License-Identifier: MPL-2.0 +# VeriSimDB Feed — Cross-Repo Analytics Data Store + +[integration] +name = "verisimdb" +type = "data-feed" +repository = "https://github.com/hyperpolymath/nextgen-databases" +data-store = "verisimdb-data" + +[feed-config] +emit-scan-results = true +emit-build-metrics = true +emit-dependency-graph = true +format = "hexad" +destination = "verisimdb-data/feeds/" diff --git a/deno/.machine_readable/integrations/vexometer.a2ml b/deno/.machine_readable/integrations/vexometer.a2ml new file mode 100644 index 0000000..238b3d2 --- /dev/null +++ b/deno/.machine_readable/integrations/vexometer.a2ml @@ -0,0 +1,18 @@ +# SPDX-License-Identifier: MPL-2.0 +# Vexometer Integration — Irritation Surface Analysis + +[integration] +name = "vexometer" +type = "friction-measurement" +repository = "https://github.com/hyperpolymath/vexometer" + +[measurement-config] +dimensions = 10 +emit-isa-reports = true +lazy-eliminator = true +satellite-interventions = true + +[hooks] +cli-tools = "measure-on-error" +ui-panels = "measure-on-interaction" +build-failures = "measure-on-failure" diff --git a/deno/.machine_readable/policies/.maintenance-perms-ignore b/deno/.machine_readable/policies/.maintenance-perms-ignore new file mode 100644 index 0000000..2c8c409 --- /dev/null +++ b/deno/.machine_readable/policies/.maintenance-perms-ignore @@ -0,0 +1,5 @@ +# Regex patterns for justified permission-policy exceptions. +# One pattern per line. +# Example: +# ^vendor/ +# ^third_party/ diff --git a/deno/.machine_readable/policies/0.2-AI-MANIFEST.a2ml b/deno/.machine_readable/policies/0.2-AI-MANIFEST.a2ml new file mode 100644 index 0000000..01a1914 --- /dev/null +++ b/deno/.machine_readable/policies/0.2-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "policies-registry" +level: 2 +parent: "../0.1-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Sub-registry for policies metadata. diff --git a/deno/.machine_readable/policies/MAINTENANCE-AXES.a2ml b/deno/.machine_readable/policies/MAINTENANCE-AXES.a2ml new file mode 100644 index 0000000..eeffd27 --- /dev/null +++ b/deno/.machine_readable/policies/MAINTENANCE-AXES.a2ml @@ -0,0 +1,54 @@ +# SPDX-License-Identifier: MPL-2.0 +# Copyright (c) {{CURRENT_YEAR}} {{AUTHOR}} ({{OWNER}}) <{{AUTHOR_EMAIL}}> +# +# Canonical maintenance governance model + +[metadata] +version = "1.0.0" +last-updated = "{{CURRENT_DATE}}" +scope = "repo" + +[discovery] +human-entrypoints = [ + "README.adoc", + "docs/maintenance/MAINTENANCE-CHECKLIST.md", + "docs/practice/SOFTWARE-DEVELOPMENT-APPROACH.adoc", +] +machine-entrypoints = [ + ".machine_readable/policies/MAINTENANCE-AXES.a2ml", + ".machine_readable/policies/MAINTENANCE-CHECKLIST.a2ml", + ".machine_readable/policies/SOFTWARE-DEVELOPMENT-APPROACH.a2ml", + ".machine_readable/META.a2ml", + ".machine_readable/ai/README.adoc", + ".machine_readable/bot_directives/README.scm", +] +bots = ["hypatia", "gitbot-fleet", "repo visitors"] + +[axes] +axis-1 = "must > intend > like" +axis-2 = "corrective > adaptive > perfective" +axis-3 = "systems > compliance > effects" +execution-order = "axis-1 > axis-2 > axis-3" + +[axis-1-scoping] +required = true +sources = "README, roadmap, status docs, maintenance checklist, CI/security docs" +markers = "TODO/FIXME/XXX/HACK/STUB/PARTIAL" +idris-unsound-markers = "believe_me/assert_total" +output = "scoped work assembly in must/intend/like buckets" + +[axis-2-maintenance] +corrective-first = true +adaptive-second = true +adaptive-focus = "scope changes, stale references, obsolete work culling" +perfective-third = true +perfective-source = "honest state from axis-1 after corrective/adaptive updates" + +[axis-3-audit] +systems-check = true +compliance-check = true +effects-check = true +compliance-focus = "seams/compromises/exception register and anti-drift" +compliance-tooling = "panic-attack" +effects-tooling = "ecological checking with sustainabot guidance" +effects-evidence = "benchmark evidence and maintainer dialogue/status review" diff --git a/deno/.machine_readable/policies/MAINTENANCE-CHECKLIST.a2ml b/deno/.machine_readable/policies/MAINTENANCE-CHECKLIST.a2ml new file mode 100644 index 0000000..eaee720 --- /dev/null +++ b/deno/.machine_readable/policies/MAINTENANCE-CHECKLIST.a2ml @@ -0,0 +1,159 @@ +# SPDX-License-Identifier: MPL-2.0 +# Cross-repo maintenance baseline (machine-readable canonical) + +[metadata] +version = "1.1.0" +last-updated = "2026-02-24" +scope = "cross-repo" +source-human = "docs/maintenance/MAINTENANCE-CHECKLIST.adoc" +companion-human = "docs/practice/SOFTWARE-DEVELOPMENT-APPROACH.adoc" +companion-machine = ".machine_readable/policies/SOFTWARE-DEVELOPMENT-APPROACH.a2ml" + +[policy] +single-source = true +notes = "Use this file as canonical machine policy and keep markdown synchronized." + +[maintenance-axes] +scoping-first = true +execution-order = ["scoping", "axis-1", "axis-2", "axis-3"] +axis-1 = "must > intend > like" +axis-2 = "corrective > adaptive > perfective" +axis-3 = "systems > compliance > effects" + +[scoping] +inputs_required = [ + "README", + "roadmap", + "status-docs", + "maintenance-checklist", + "ci-and-security-docs", +] + +marker_scan_required = [ + "TODO", + "FIXME", + "XXX", + "HACK", + "STUB", + "PARTIAL", +] + +idris_unsound_scan_required = [ + "believe_me", + "assert_total", +] + +scope_assembly_buckets = ["must", "intend", "like"] + +[axis-2-maintenance-rules] +corrective-first = true +adaptive-second = true +adaptive_examples = [ + "scope-change reconciliation", + "stale-reference removal", + "obsolete-work culling", +] +perfective-third = true +perfective_source = "axis-1 honest state after corrective/adaptive updates" + +[axis-3-audit-rules] +systems-check = true +documentation-honesty-check = true +safety-security-accounted-check = true +effects-review-check = true +benchmark-evidence-required = true +maintainer-dialogue-review-required = true +compliance-seams-check = true +exception-register-required = true +exception-bounded-scope-required = true +policy-drift-contamination-check = true +example-drift-risk = "single TypeScript exception causing broad ReScript->TypeScript migration" +compliance-tooling = "panic-attack" +effects-tooling = "ecological checking with sustainabot guidance" + +[generic-cleanup-finish-off] +root-cleanup-required = true +stale-work-cull-required = true +docs-parity-required = true +machine-human-sync-required = true +compliance-finish-off-required = true +effects-finish-off-required = true +release-prep-summary-required = true +next-actions-required = ["corrective", "adaptive", "perfective"] + +[must] +root_control_files = [ + ".gitignore", + ".gitattributes", + ".editorconfig", + ".tool-versions", + "Containerfile", + "Justfile", +] + +root_hosting_files = [ + "CNAME", + ".nojekyll", +] + +ownership_files = [ + "MAINTAINER", + ".github/CODEOWNERS", +] + +machine_readable_required = [ + ".machine_readable/anchors/ANCHOR.a2ml", + ".machine_readable/contractiles/", + ".machine_readable/ai/", + ".machine_readable/bot_directives/", +] + +contractiles_required = [ + "Mustfile", + "Trustfile", + "Intentfile", +] + +security_required = [ + ".well-known/security.txt", + "ci-security-scan", +] + +quality_gate_required = [ + "format", + "lint", + "unit-tests", + "integration-tests", + "p2p-tests", + "e2e-tests", + "bench-smoke", + "docs-check", + "security-scan", +] + +abi_ffi_policy = [ + "ABI Idris2 in src/interface/abi/*.idr", + "FFI Zig in ffi/**/*.zig", +] + +[should] +docs_primary_format = "adoc" +docs_structure = [ + "docs/theory", + "docs/practice", + "docs/whitepapers/academic", + "docs/whitepapers/industry", + "docs/proofs", + "docs/reports", +] + +root_minimization = true +well_known_metadata = true +roadmap_honesty_with_dates = true +ci_doc_format_policy = true + +[could] +generate_human_from_machine = true +mode_aware_bots = ["corrective", "adaptive", "perfective", "audit"] +topology_dashboard = true +exception_registry = true diff --git a/deno/.machine_readable/policies/README.adoc b/deno/.machine_readable/policies/README.adoc new file mode 100644 index 0000000..b7e25f5 --- /dev/null +++ b/deno/.machine_readable/policies/README.adoc @@ -0,0 +1 @@ += policies Registry diff --git a/deno/.machine_readable/policies/SOFTWARE-DEVELOPMENT-APPROACH.a2ml b/deno/.machine_readable/policies/SOFTWARE-DEVELOPMENT-APPROACH.a2ml new file mode 100644 index 0000000..093573a --- /dev/null +++ b/deno/.machine_readable/policies/SOFTWARE-DEVELOPMENT-APPROACH.a2ml @@ -0,0 +1,53 @@ +# SPDX-License-Identifier: MPL-2.0 +# General software development approach (machine-readable) + +[metadata] +version = "1.0.0" +last-updated = "2026-02-24" +scope = "cross-repo" +source-human = "docs/practice/SOFTWARE-DEVELOPMENT-APPROACH.adoc" + +[execution] +order = ["axis-1", "axis-2", "axis-3"] + +[axis-1] +name = "scope" +priority = "must > intend > like" +inputs = [ + "README", + "roadmap", + "status-docs", + "ci-and-security-docs", +] +marker-scan = ["TODO", "FIXME", "XXX", "HACK", "STUB", "PARTIAL"] +idris-unsound-scan = ["believe_me", "assert_total"] +output = "scoped-work-assembly" + +[axis-2] +name = "maintenance" +priority = "corrective > adaptive > perfective" +corrective = "defect/regression/safety/security fixes" +adaptive = "scope reconciliation, stale-reference removal, obsolete-work culling" +perfective = "quality improvements derived from axis-1 honest state" + +[axis-3] +name = "audit" +priority = "systems > compliance > effects" +systems = "required systems present and operating" +compliance = "exceptions explicit, bounded, and drift-resistant" +effects = "benchmark/operational impact evidence captured and reviewed" +compliance-tooling = "panic-attack" +effects-tooling = "ecological checking with sustainabot guidance" + +[cleanup-finish-off] +root-cleanup = true +stale-work-cull = true +docs-sync-human-machine = true +compliance-audit = true +effects-audit = true +release-summary = ["must", "should", "could"] +next-actions = ["corrective", "adaptive", "perfective"] + +[collaboration] +maintainer-dialogue-required = true +dialogue-topics = ["what changed", "why", "remaining risks"] diff --git a/deno/.machine_readable/root-allow.txt b/deno/.machine_readable/root-allow.txt new file mode 100644 index 0000000..d96a86b --- /dev/null +++ b/deno/.machine_readable/root-allow.txt @@ -0,0 +1 @@ +.hypatia-ignore diff --git a/deno/.machine_readable/scripts/0.2-AI-MANIFEST.a2ml b/deno/.machine_readable/scripts/0.2-AI-MANIFEST.a2ml new file mode 100644 index 0000000..615df84 --- /dev/null +++ b/deno/.machine_readable/scripts/0.2-AI-MANIFEST.a2ml @@ -0,0 +1,18 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "automation-scripts-unit" +level: 2 +parent: "../0.1-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Internal automation logic for the project lifecycle, forge sync, + verification triggers, and maintenance. + +canonical_locations: + maintenance: "maintenance/" + lifecycle: "lifecycle/" + forge: "forge/" + verification: "verification/" diff --git a/deno/.machine_readable/scripts/forge/0.3-AI-MANIFEST.a2ml b/deno/.machine_readable/scripts/forge/0.3-AI-MANIFEST.a2ml new file mode 100644 index 0000000..4bbd6cf --- /dev/null +++ b/deno/.machine_readable/scripts/forge/0.3-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "automation-unit-forge" +level: 3 +parent: "../0.2-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Internal automation logic for project forge. diff --git a/deno/.machine_readable/scripts/forge/README.adoc b/deno/.machine_readable/scripts/forge/README.adoc new file mode 100644 index 0000000..31adef6 --- /dev/null +++ b/deno/.machine_readable/scripts/forge/README.adoc @@ -0,0 +1 @@ += Forge Scripts diff --git a/deno/.machine_readable/scripts/forge/forge-sync.sh b/deno/.machine_readable/scripts/forge/forge-sync.sh new file mode 100755 index 0000000..330e54b --- /dev/null +++ b/deno/.machine_readable/scripts/forge/forge-sync.sh @@ -0,0 +1,25 @@ +#!/usr/bin/env bash +# SPDX-License-Identifier: MPL-2.0 +# +# forge-sync.sh — Multi-forge mirroring script +# +# Synchronises the local repository with GitHub, GitLab, and Codeberg. +# Usage: ./forge-sync.sh + +set -euo pipefail + +REMOTES=("origin" "gitlab" "codeberg") + +echo "=== RSR Forge Synchronisation ===" + +for remote in "${REMOTES[@]}"; do + if git remote | grep -q "^$remote$"; then + echo "Pushing to $remote..." + git push "$remote" --all + git push "$remote" --tags + else + echo "Skip: Remote '$remote' not configured." + fi +done + +echo "Sync complete." diff --git a/deno/.machine_readable/scripts/forge/git-cleanup.sh b/deno/.machine_readable/scripts/forge/git-cleanup.sh new file mode 100755 index 0000000..4fec1a2 --- /dev/null +++ b/deno/.machine_readable/scripts/forge/git-cleanup.sh @@ -0,0 +1,8 @@ +#!/usr/bin/env bash +# git-cleanup.sh — Repository hygiene script +set -euo pipefail +echo "Cleaning up merged branches..." +git fetch -p +git branch --merged | grep -v "\*" | grep -v "main" | xargs -n 1 git branch -d || echo "No branches to clean." +echo "Pruning remote tracking branches..." +git remote prune origin diff --git a/deno/.machine_readable/scripts/lifecycle/0.3-AI-MANIFEST.a2ml b/deno/.machine_readable/scripts/lifecycle/0.3-AI-MANIFEST.a2ml new file mode 100644 index 0000000..3182d17 --- /dev/null +++ b/deno/.machine_readable/scripts/lifecycle/0.3-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "automation-unit-lifecycle" +level: 3 +parent: "../0.2-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Internal automation logic for project lifecycle. diff --git a/deno/.machine_readable/scripts/lifecycle/README.adoc b/deno/.machine_readable/scripts/lifecycle/README.adoc new file mode 100644 index 0000000..8d262b1 --- /dev/null +++ b/deno/.machine_readable/scripts/lifecycle/README.adoc @@ -0,0 +1 @@ += Lifecycle Scripts diff --git a/deno/.machine_readable/scripts/lifecycle/install-tools.sh b/deno/.machine_readable/scripts/lifecycle/install-tools.sh new file mode 100755 index 0000000..408df64 --- /dev/null +++ b/deno/.machine_readable/scripts/lifecycle/install-tools.sh @@ -0,0 +1,27 @@ +#!/usr/bin/env bash +# SPDX-License-Identifier: MPL-2.0 +# +# install-tools.sh — Developer toolchain installer +# +# Detects and installs the required project toolchain (asdf, nix, or guix). + +set -euo pipefail + +echo "=== RSR Toolchain Installer ===" + +if [ -f "flake.nix" ] && command -v nix &>/dev/null; then + echo "Nix detected. Setting up development shell..." + nix develop --command echo "Nix shell verified." +elif [ -f ".tool-versions" ] && command -v asdf &>/dev/null; then + echo "asdf detected. Installing plugins and tools..." + while read -r line; do + plugin=$(echo "$line" | awk '{print $1}') + asdf plugin add "$plugin" || true + done < .tool-versions + asdf install +else + echo "No standard toolchain (Nix/asdf) detected or installed." + echo "Please refer to README.adoc for manual setup instructions." +fi + +echo "Installer complete." diff --git a/deno/.machine_readable/scripts/maintenance/maint-assault.sh b/deno/.machine_readable/scripts/maintenance/maint-assault.sh new file mode 100644 index 0000000..f170cab --- /dev/null +++ b/deno/.machine_readable/scripts/maintenance/maint-assault.sh @@ -0,0 +1,44 @@ +#!/usr/bin/env bash +# SPDX-License-Identifier: MPL-2.0 +# +# maint-assault.sh — High-rigor stress testing using panic-attacker +# +# This script runs a full assault (static + dynamic) on the project binary +# to detect logic-based bug signatures and environmental vulnerabilities. + +set -euo pipefail + +BINARY_NAME="{{project}}" +REPORT_PATH="docs/reports/security/assault-latest.json" +PA_BIN="${PANIC_ATTACK_BIN:-panic-attack}" + +echo "=== High-Rigor Security Assault ===" + +# 1. Verify environment +if ! command -v "$PA_BIN" &>/dev/null; then + echo "Error: panic-attack tool not found." + echo "Please install it or set PANIC_ATTACK_BIN environment variable." + exit 1 +fi + +if [ ! -f "target/release/$BINARY_NAME" ]; then + echo "Warning: Release binary not found at target/release/$BINARY_NAME" + echo "Running build first..." + just build --release +fi + +# 2. Run Assault +echo "Initiating full assault on $BINARY_NAME..." +mkdir -p "$(dirname "$REPORT_PATH")" + +"$PA_BIN" assault "target/release/$BINARY_NAME" + --source . + --intensity medium + --duration 10 + --output "$REPORT_PATH" + +echo "" +echo "=== Assault Complete ===" +echo "Report generated: $REPORT_PATH" +echo "To review interactively, run:" +echo " $PA_BIN tui $REPORT_PATH" diff --git a/deno/.machine_readable/scripts/verification/0.3-AI-MANIFEST.a2ml b/deno/.machine_readable/scripts/verification/0.3-AI-MANIFEST.a2ml new file mode 100644 index 0000000..460e069 --- /dev/null +++ b/deno/.machine_readable/scripts/verification/0.3-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "automation-unit-verification" +level: 3 +parent: "../0.2-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Internal automation logic for project verification. diff --git a/deno/.machine_readable/scripts/verification/README.adoc b/deno/.machine_readable/scripts/verification/README.adoc new file mode 100644 index 0000000..277b4aa --- /dev/null +++ b/deno/.machine_readable/scripts/verification/README.adoc @@ -0,0 +1 @@ += Verification Scripts diff --git a/deno/.machine_readable/svc/k9/README.adoc b/deno/.machine_readable/svc/k9/README.adoc new file mode 100644 index 0000000..19e8911 --- /dev/null +++ b/deno/.machine_readable/svc/k9/README.adoc @@ -0,0 +1,178 @@ +// SPDX-License-Identifier: CC-BY-SA-4.0 += K9 Contractiles +:toc: left +:icons: font + +== What Are K9 Contractiles? + +K9 contractiles are self-validating components that combine configuration, validation, and deployment logic in a single file format. They implement the RSR principle of "self-describing artifacts" by embedding contracts and orchestration directly in the component. + +== The Three Security Levels + +K9 components declare their trust requirements using "The Leash" security model: + +[horizontal] +`'Kennel`:: Pure data, no execution (safest) +`'Yard`:: Nickel evaluation with contracts (medium trust) +`'Hunt`:: Full execution with Just recipes (requires signature) + +== Example Components + +This directory contains example K9 contractiles for common repository tasks: + +=== Kennel Level (Pure Data) + +**File:** `examples/project-metadata.k9.ncl` + +Pure configuration data with no execution. Safe to include in any repository. + +**Use cases:** +- Project metadata (name, version, description) +- Build configuration +- Tool settings +- Data schemas + +**Security:** No signature required, data-only. + +=== Yard Level (Validated Config) + +**File:** `examples/ci-config.k9.ncl` + +Configuration with Nickel contracts for runtime validation. Evaluated safely without I/O. + +**Use cases:** +- CI/CD configuration with validation +- Deployment parameters +- Database schemas with constraints +- API specifications + +**Security:** Signature recommended, Nickel evaluation only. + +=== Hunt Level (Full Execution) + +**File:** `examples/setup-repo.k9.ncl` + +Full execution with Just recipes. Can run shell commands and modify filesystem. + +**Use cases:** +- Repository setup scripts +- Deployment automation +- System configuration +- Package installation + +**Security:** **Signature required**, full system access. + +== Usage in Your Repository + +=== 1. Create K9 Components + +Choose the appropriate security level for your use case: + +[source,bash] +---- +# Kennel: Pure configuration +cp .machine_readable/contractiles/k9/examples/project-metadata.k9.ncl config/metadata.k9.ncl + +# Yard: Validated configuration +cp .machine_readable/contractiles/k9/examples/ci-config.k9.ncl .github/ci.k9.ncl + +# Hunt: Full automation +cp .machine_readable/contractiles/k9/examples/setup-repo.k9.ncl scripts/setup.k9.ncl +---- + +=== 2. Validate Components + +[source,bash] +---- +# Validate Nickel syntax and contracts +nickel typecheck config/metadata.k9.ncl + +# Verify Hunt-level signature (if signed) +./must verify scripts/setup.k9.ncl +---- + +=== 3. Execute Components + +[source,bash] +---- +# Kennel: Export as JSON +nickel export config/metadata.k9.ncl > metadata.json + +# Yard: Evaluate with validation +nickel eval .github/ci.k9.ncl + +# Hunt: Run with Just (dry-run first!) +./must --dry-run run scripts/setup.k9.ncl +./must run scripts/setup.k9.ncl +---- + +== Integration with RSR + +K9 contractiles integrate with other RSR standards: + +**STATE.a2ml**:: K9 components can generate or validate STATE.a2ml +**ECOSYSTEM.a2ml**:: K9 can automate cross-repo operations +**META.a2ml**:: K9 can enforce architectural decisions + +== Security Best Practices + +=== For Kennel/Yard Components + +✅ **Safe to use without signatures** + +✅ **Review Nickel code before use** + +✅ **Validate contracts match expectations** + +=== For Hunt Components + +⚠️ **ALWAYS verify signatures** + +⚠️ **Review Just recipes carefully** + +⚠️ **Run dry-run mode first** + +⚠️ **Never run as root unless required** + +⚠️ **Sandbox external components** + +**See:** https://github.com/hyperpolymath/standards/blob/main/k9-svc/docs/SECURITY-BEST-PRACTICES.adoc + +== Template Files + +Use these as starting points for your own K9 components: + +- `template-kennel.k9.ncl` - Pure data template +- `template-yard.k9.ncl` - Validated config template +- `template-hunt.k9.ncl` - Full execution template + +== Dependencies + +To use K9 contractiles in your repository: + +[source,bash] +---- +# Install Nickel (configuration language) +curl -L https://github.com/tweag/nickel/releases/latest/download/nickel-linux-x86_64 -o nickel +chmod +x nickel && sudo mv nickel /usr/local/bin/ + +# Install Just (task runner, for Hunt level) +cargo install just + +# Clone K9-SVC (for must shim and tooling) +git clone https://github.com/hyperpolymath/standards.git +# Note: K9-SVC is located in standards/k9-svc +---- + +== Learn More + +- **K9-SVC Specification:** https://github.com/hyperpolymath/standards/blob/main/k9-svc/SPEC.adoc +- **K9 User Guide:** https://github.com/hyperpolymath/standards/blob/main/k9-svc/GUIDE.adoc +- **Security Documentation:** https://github.com/hyperpolymath/standards/blob/main/k9-svc/docs/SECURITY-FAQ.adoc +- **IANA Media Type:** `application/vnd.k9+nickel` + +== Contributing + +When adding K9 contractiles to your repository: + +1. Use appropriate security level (Kennel > Yard > Hunt) +2. Document what each component does +3. Include validation contracts in Yard/Hunt components +4. Sign Hunt-level components before committing +5. Add K9 validation to CI/CD pipeline + +**Questions?** Open an issue on https://github.com/hyperpolymath/standards/tree/main/k9-svc diff --git a/deno/.machine_readable/svc/k9/burble-metadata.k9.ncl b/deno/.machine_readable/svc/k9/burble-metadata.k9.ncl new file mode 100644 index 0000000..a15f999 --- /dev/null +++ b/deno/.machine_readable/svc/k9/burble-metadata.k9.ncl @@ -0,0 +1,83 @@ +K9! +# SPDX-License-Identifier: MPL-2.0 +# Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) +# K9 Kennel-level guard: burble project metadata and media/comms invariants +# Security Level: Kennel (data-only, no execution) +# No signature required + +{ + pedigree = { + schema_version = "1.0.0", + component_type = "comms-platform-metadata", + security = { + leash = 'Kennel, + trust_level = "data-only", + allow_network = false, + allow_filesystem_write = false, + allow_subprocess = false, + }, + metadata = { + name = "burble-metadata", + version = "0.1.0", + description = "Burble: self-hostable WebRTC communications platform — project invariants", + author = "Jonathan D.A. Jewell ", + }, + }, + + # Project configuration + config = { + # Architecture invariants + architecture = { + # Control plane language + control_plane = "elixir", + # Media layer language + media_layer = "zig", + # Signalling language + signalling = "elixir", + }, + + # Security invariants (CRITICAL for comms) + security = { + # No plaintext signalling + encryption_required = true, + # Allowed crypto algorithms + allowed_algorithms = ["AES-256-GCM", "X25519", "Ed25519", "DTLS-SRTP"], + # Banned weak algorithms + banned_algorithms = ["MD5", "SHA1", "RC4", "DES"], + # No cleartext credentials + secrets_in_env_only = true, + }, + + # Safety invariants + safety = { + forbidden_patterns = [ + "unwrap()", + "expect()", + "todo!()", + "unimplemented!()", + ], + }, + + # Test requirements + tests = { + min_unit_tests = 30, + integration_tests_required = true, + media_pipeline_tests_required = true, + }, + + # Language policy + banned_files = ["Makefile", "Dockerfile"], + banned_languages = ["python", "typescript", "javascript", "go"], + }, + + # RSR compliance + rsr = { + explainme = true, + ai_manifest = true, + machine_readable = true, + spdx_headers_required = true, + security_md_required = true, + idris2_abi = true, + zig_ffi = true, + }, +} diff --git a/deno/.machine_readable/svc/k9/examples/ci-config.k9.ncl b/deno/.machine_readable/svc/k9/examples/ci-config.k9.ncl new file mode 100644 index 0000000..1f38e2d --- /dev/null +++ b/deno/.machine_readable/svc/k9/examples/ci-config.k9.ncl @@ -0,0 +1,126 @@ +K9! +# SPDX-License-Identifier: MPL-2.0 +# Example Yard-level K9 component: CI/CD configuration with validation +# Security Level: Yard (Nickel evaluation, contract validation) +# Signature recommended but not required + +{ + pedigree = { + schema_version = "1.0.0", + component_type = "ci-configuration", + security = { + leash = 'Yard, + trust_level = "validated-config", + allow_network = false, + allow_filesystem_write = false, + allow_subprocess = false, + }, + metadata = { + name = "ci-config", + version = "1.0.0", + description = "CI/CD configuration with runtime validation", + author = "{{AUTHOR}} <{{AUTHOR_EMAIL}}>", + }, + }, + + # CI/CD configuration with Nickel contracts + ci = { + # Platform must be a known CI provider + platform + | [| 'GitHubActions, 'GitLabCI, 'CircleCI, 'TravisCI |] + = 'GitHubActions, + + # Build matrix with validation + matrix = { + # Operating systems to test on + os + | Array String + | std.array.NonEmpty + = ["ubuntu-latest", "macos-latest"], + + # Language versions to test + versions + | Array String + | std.array.NonEmpty + = ["stable", "beta"], + }, + + # Workflow steps with validation + steps = [ + { + name = "Checkout", + action = "actions/checkout@v4", + # Version must be SHA-pinned for security + sha | String | std.string.NonEmpty = "b4ffde65f46336ab88eb53be808477a3936bae11", + }, + { + name = "Build", + run = "just build", + }, + { + name = "Test", + run = "just test", + }, + { + name = "Lint", + run = "just lint", + }, + ], + + # Deployment configuration + deploy = { + enabled | Bool = false, + + # Only deploy from main branch + branch + | String + | std.contract.from_predicate (fun b => b == "main" || b == "master") + = "main", + + # Deployment requires manual approval + requires_approval | Bool = true, + }, + + # Security scanning + security = { + enabled | Bool = true, + + scanners = [ + { + name = "CodeQL", + languages = ["rust", "javascript"], + }, + { + name = "OSSF Scorecard", + enabled = true, + }, + { + name = "TruffleHog", + scan_for = "secrets", + }, + ], + }, + + # Notification settings + notifications = { + on_success = "never", + on_failure = "always", + channels = ["email"], + }, + }, + + # Validation rules (enforced by Nickel) + validation = { + # At least one OS must be specified + check_os = std.array.length ci.matrix.os > 0, + + # At least one version must be tested + check_versions = std.array.length ci.matrix.versions > 0, + + # Must have at least build and test steps + check_steps = std.array.length ci.steps >= 2, + + # Security scanning must be enabled + check_security = ci.security.enabled == true, + }, +} diff --git a/deno/.machine_readable/svc/k9/examples/project-metadata.k9.ncl b/deno/.machine_readable/svc/k9/examples/project-metadata.k9.ncl new file mode 100644 index 0000000..7bc6941 --- /dev/null +++ b/deno/.machine_readable/svc/k9/examples/project-metadata.k9.ncl @@ -0,0 +1,57 @@ +K9! +# SPDX-License-Identifier: MPL-2.0 +# Example Kennel-level K9 component: Project metadata +# Security Level: Kennel (pure data, no execution) +# No signature required + +{ + pedigree = { + schema_version = "1.0.0", + component_type = "project-metadata", + security = { + leash = 'Kennel, + trust_level = "data-only", + allow_network = false, + allow_filesystem_write = false, + allow_subprocess = false, + }, + metadata = { + name = "project-metadata", + version = "1.0.0", + description = "Pure data configuration for project metadata", + author = "{{AUTHOR}} <{{AUTHOR_EMAIL}}>", + }, + }, + + # Project configuration + project = { + name = "my-project", + version = "0.1.0", + description = "A project following Rhodium Standard Repositories", + + repository = { + url = "https://github.com/hyperpolymath/my-project", + type = "git", + }, + + author = { + name = "{{AUTHOR}}", + email = "{{AUTHOR_EMAIL}}", + organization = "{{AUTHOR_ORG}}", + }, + + license = "MPL-2.0", + + keywords = [ + "rhodium-standard", + "rsr", + "hyperpolymath", + ], + }, + + # Export as JSON for other tools + export = { + format = "json", + destination = "project-metadata.json", + }, +} diff --git a/deno/.machine_readable/svc/k9/examples/setup-repo.k9.ncl b/deno/.machine_readable/svc/k9/examples/setup-repo.k9.ncl new file mode 100644 index 0000000..d360dcb --- /dev/null +++ b/deno/.machine_readable/svc/k9/examples/setup-repo.k9.ncl @@ -0,0 +1,167 @@ +K9! +# SPDX-License-Identifier: MPL-2.0 +# Example Hunt-level K9 component: Repository setup automation +# Security Level: Hunt (full execution with Just recipes) +# ⚠️ SIGNATURE REQUIRED - DO NOT RUN WITHOUT VERIFICATION + +{ + pedigree = { + schema_version = "1.0.0", + component_type = "repository-setup", + security = { + leash = 'Hunt, + trust_level = "full-system-access", + allow_network = true, + allow_filesystem_write = true, + allow_subprocess = true, + signature_required = true, + }, + metadata = { + name = "setup-repo", + version = "1.0.0", + description = "Automated repository setup with RSR standards", + author = "{{AUTHOR}} <{{AUTHOR_EMAIL}}>", + }, + warnings = [ + "This component has full system access", + "Only run from trusted sources with verified signatures", + "Review Just recipes before execution", + "Use dry-run mode first: ./must --dry-run run setup-repo.k9.ncl", + ], + }, + + # Configuration with contracts + config = { + repo_name + | String + | std.string.NonEmpty + = "my-new-repo", + + repo_type + | [| 'Library, 'Application, 'Tool, 'Specification |] + = 'Application, + + primary_language + | String + | std.string.NonEmpty + = "rust", + + # RSR compliance features to enable + features = { + checkpoint_files | Bool = true, # STATE.a2ml, ECOSYSTEM.a2ml, META.a2ml + security_workflows | Bool = true, # CodeQL, Scorecard, etc. + quality_checks | Bool = true, # Linting, formatting + mirroring | Bool = false, # GitLab/Bitbucket mirrors + }, + + # Git configuration + git = { + default_branch = "main", + initial_commit | Bool = true, + remote_url | String = "", + }, + }, + + # Just recipes for execution + # These run when: ./must run setup-repo.k9.ncl + recipes = { + # Main entry point + default = { + recipe = "setup", + description = "Set up RSR-compliant repository", + }, + + # Individual setup tasks + setup = { + dependencies = ["check-env", "create-structure", "init-git", "setup-workflows"], + commands = [ + "echo '✅ Repository setup complete!'", + "echo 'Run: git status to see changes'", + ], + }, + + "check-env" = { + description = "Verify required tools are installed", + commands = [ + "command -v git || (echo 'ERROR: git not found' && exit 1)", + "command -v just || (echo 'ERROR: just not found' && exit 1)", + "command -v nickel || (echo 'ERROR: nickel not found' && exit 1)", + "echo '✓ All required tools present'", + ], + }, + + "create-structure" = { + description = "Create RSR directory structure", + commands = [ + "mkdir -p src/ docs/ tests/ scripts/", + "mkdir -p .github/workflows/", + "mkdir -p .machine_readable/contractiles/k9/", + "echo '✓ Directory structure created'", + ], + }, + + "init-git" = { + description = "Initialize Git repository", + commands = [ + "git init -b %{config.git.default_branch}", + "git config user.name '{{AUTHOR}}'", + "git config user.email '{{AUTHOR_EMAIL}}'", + "echo '✓ Git initialized'", + ], + }, + + "setup-workflows" = { + description = "Add RSR-compliant workflows", + commands = [ + # This would copy workflow templates + # In a real implementation, would fetch from rsr-template-repo + "echo '✓ Workflows configured'", + ], + }, + + "create-checkpoint-files" = { + description = "Create STATE.a2ml, ECOSYSTEM.a2ml, META.a2ml", + commands = [ + "echo '(state (version \"1.0.0\") (project \"%{config.repo_name}\"))' > STATE.a2ml", + "echo '(ecosystem (version \"1.0.0\") (name \"%{config.repo_name}\"))' > ECOSYSTEM.a2ml", + "echo '(meta (version \"1.0.0\") (project \"%{config.repo_name}\"))' > META.a2ml", + "echo '✓ Checkpoint files created'", + ], + }, + + "add-license" = { + description = "Add MPL-2.0 license", + commands = [ + "curl -sL https://raw.githubusercontent.com/hyperpolymath/pmpl/main/LICENSE -o LICENSE", + "echo '✓ License added'", + ], + }, + + "add-readme" = { + description = "Create README.adoc from template", + commands = [ + "echo '= %{config.repo_name}' > README.adoc", + "echo '' >> README.adoc", + "echo 'Part of the Hyperpolymath ecosystem.' >> README.adoc", + "echo '✓ README created'", + ], + }, + + clean = { + description = "Remove generated files (careful!)", + commands = [ + "echo '⚠️ This will delete all generated files'", + "echo 'Press Ctrl+C to cancel, or wait 5 seconds...'", + "sleep 5", + "rm -f STATE.a2ml ECOSYSTEM.a2ml META.a2ml", + "echo '✓ Cleaned'", + ], + }, + }, + + # Validation (Yard-level checks before Hunt execution) + validation = { + check_repo_name = std.string.length config.repo_name > 0, + check_language = std.string.length config.primary_language > 0, + }, +} diff --git a/deno/.machine_readable/svc/k9/template-hunt.k9.ncl b/deno/.machine_readable/svc/k9/template-hunt.k9.ncl new file mode 100644 index 0000000..a9cc350 --- /dev/null +++ b/deno/.machine_readable/svc/k9/template-hunt.k9.ncl @@ -0,0 +1,136 @@ +K9! +# SPDX-License-Identifier: MPL-2.0 +# K9 Hunt-level template: Full execution with Just recipes +# Security Level: Hunt (full system access) +# ⚠️ SIGNATURE REQUIRED - Review carefully before use + +{ + pedigree = { + schema_version = "1.0.0", + component_type = "TODO: describe component type (e.g., 'deployment', 'setup-script')", + security = { + leash = 'Hunt, + trust_level = "full-system-access", + allow_network = true, + allow_filesystem_write = true, + allow_subprocess = true, + signature_required = true, + }, + metadata = { + name = "TODO: component-name", + version = "1.0.0", + description = "TODO: Detailed description of what this component does", + author = "{{AUTHOR}} <{{AUTHOR_EMAIL}}>", + }, + warnings = [ + "This component has full system access", + "Only run from trusted sources with verified signatures", + "Review all Just recipes before execution", + "Use dry-run mode first: ./must --dry-run run your-file.k9.ncl", + ], + side_effects = [ + "TODO: List what files/directories this creates or modifies", + "TODO: List what commands this executes", + "TODO: List what network access this requires", + ], + }, + + # Configuration with contracts (Yard-level validation) + config = { + # Add your configuration here with appropriate contracts + target_dir + | String + | std.string.NonEmpty + = "/tmp/k9-output", + + dry_run | Bool = false, + + # Add more config as needed + }, + + # Just recipes for execution + # These run when: ./must run your-file.k9.ncl + recipes = { + # Main entry point (runs by default) + default = { + recipe = "TODO: main-task", + description = "TODO: What the default recipe does", + }, + + # Define your recipes here + "main-task" = { + dependencies = ["check-prerequisites"], + commands = [ + "echo 'TODO: Add your commands here'", + # Example: Create directory + # "mkdir -p %{config.target_dir}", + # Example: Run a command + # "just build", + # Example: Conditional execution + # "@if [ \"%{config.dry_run}\" = \"true\" ]; then echo '[DRY-RUN] Would execute'; else actual-command; fi", + ], + }, + + "check-prerequisites" = { + description = "Verify required tools and permissions", + commands = [ + # Example: Check for required tools + # "command -v git || (echo 'ERROR: git not found' && exit 1)", + # Example: Check permissions + # "[ -w %{config.target_dir} ] || (echo 'ERROR: Cannot write to target directory' && exit 1)", + "echo '✓ Prerequisites checked'", + ], + }, + + # Add more recipes as needed + "build" = { + description = "Build the project", + commands = [ + "echo 'TODO: Add build commands'", + ], + }, + + "deploy" = { + description = "Deploy the application", + dependencies = ["build"], + commands = [ + "echo 'TODO: Add deployment commands'", + ], + }, + + "clean" = { + description = "Clean up generated files", + commands = [ + "echo '⚠️ This will delete files - waiting 3 seconds...'", + "sleep 3", + "echo 'TODO: Add cleanup commands'", + # "rm -rf %{config.target_dir}", + ], + }, + }, + + # Validation (Yard-level checks before Hunt execution) + validation = { + check_target_dir = std.string.length config.target_dir > 0, + # Add more validation as needed + }, +} + +# Usage: +# 1. Fill in TODO items above +# 2. Define configuration with contracts +# 3. Implement Just recipes with your commands +# 4. Test with dry-run: ./must --dry-run run your-file.k9.ncl +# 5. Review dry-run output carefully +# 6. Sign the component: ./must sign your-file.k9.ncl +# 7. Distribute with signature: your-file.k9.ncl.sig +# 8. Users verify and run: ./must verify && ./must run your-file.k9.ncl +# +# Security checklist: +# ✓ All TODO items filled in +# ✓ side_effects documented accurately +# ✓ Commands reviewed for safety +# ✓ No hardcoded secrets or credentials +# ✓ Proper error handling in recipes +# ✓ Tested in dry-run mode +# ✓ Component signed with trusted key diff --git a/deno/.machine_readable/svc/k9/template-kennel.k9.ncl b/deno/.machine_readable/svc/k9/template-kennel.k9.ncl new file mode 100644 index 0000000..fa7e3f3 --- /dev/null +++ b/deno/.machine_readable/svc/k9/template-kennel.k9.ncl @@ -0,0 +1,54 @@ +K9! +# SPDX-License-Identifier: MPL-2.0 +# K9 Kennel-level template: Pure data configuration +# Security Level: Kennel (data-only, no execution) +# No signature required - safe for any use + +{ + pedigree = { + schema_version = "1.0.0", + component_type = "TODO: describe component type (e.g., 'build-config', 'metadata')", + security = { + leash = 'Kennel, + trust_level = "data-only", + allow_network = false, + allow_filesystem_write = false, + allow_subprocess = false, + }, + metadata = { + name = "TODO: component-name", + version = "1.0.0", + description = "TODO: Brief description of what this component contains", + author = "{{AUTHOR}} <{{AUTHOR_EMAIL}}>", + }, + }, + + # Your configuration data here + config = { + # Example: Pure data values + setting_1 = "value", + setting_2 = 42, + setting_3 = true, + + nested = { + key = "value", + }, + + list = [ + "item1", + "item2", + ], + }, + + # Optional: Export format specification + export = { + format = "json", # or "yaml", "toml" + destination = "output.json", + }, +} + +# Usage: +# 1. Fill in TODO items above +# 2. Add your configuration data to config = { ... } +# 3. Validate: nickel typecheck your-file.k9.ncl +# 4. Export: nickel export your-file.k9.ncl > output.json diff --git a/deno/.machine_readable/svc/k9/template-yard.k9.ncl b/deno/.machine_readable/svc/k9/template-yard.k9.ncl new file mode 100644 index 0000000..358671c --- /dev/null +++ b/deno/.machine_readable/svc/k9/template-yard.k9.ncl @@ -0,0 +1,84 @@ +K9! +# SPDX-License-Identifier: MPL-2.0 +# K9 Yard-level template: Configuration with validation +# Security Level: Yard (Nickel evaluation with contracts) +# Signature recommended but not required + +{ + pedigree = { + schema_version = "1.0.0", + component_type = "TODO: describe component type (e.g., 'validated-config', 'schema')", + security = { + leash = 'Yard, + trust_level = "validated-config", + allow_network = false, + allow_filesystem_write = false, + allow_subprocess = false, + }, + metadata = { + name = "TODO: component-name", + version = "1.0.0", + description = "TODO: Brief description with validation details", + author = "{{AUTHOR}} <{{AUTHOR_EMAIL}}>", + }, + }, + + # Configuration with Nickel contracts for validation + config = { + # Example: String that cannot be empty + name + | String + | std.string.NonEmpty + = "TODO: default value", + + # Example: Number with range constraint + port + | Number + | std.contract.from_predicate (fun p => p > 0 && p < 65536) + = 8080, + + # Example: Boolean flag + enabled | Bool = true, + + # Example: Enum (one of several values) + environment + | [| 'Development, 'Staging, 'Production |] + = 'Development, + + # Example: List with non-empty constraint + items + | Array String + | std.array.NonEmpty + = ["item1", "item2"], + + # Example: Nested object with contracts + database = { + host | String | std.string.NonEmpty = "localhost", + port | Number | std.contract.from_predicate (fun p => p > 0 && p < 65536) = 5432, + name | String | std.string.NonEmpty = "mydb", + }, + }, + + # Validation rules (additional cross-field checks) + validation = { + # Example: Check that at least one item exists + check_items = std.array.length config.items > 0, + + # Example: Check that production has secure settings + check_production = + if config.environment == 'Production then + config.enabled == true + else + true, + + # Add your custom validation rules here + }, +} + +# Usage: +# 1. Fill in TODO items above +# 2. Define your config with appropriate contracts +# 3. Add validation rules in validation = { ... } +# 4. Validate: nickel typecheck your-file.k9.ncl +# 5. Evaluate: nickel eval your-file.k9.ncl +# 6. If validation passes, use in your application diff --git a/deno/.tool-versions b/deno/.tool-versions new file mode 100644 index 0000000..185ff65 --- /dev/null +++ b/deno/.tool-versions @@ -0,0 +1 @@ +just 1.36.0 diff --git a/deno/.well-known/ai.txt b/deno/.well-known/ai.txt new file mode 100644 index 0000000..94dd799 --- /dev/null +++ b/deno/.well-known/ai.txt @@ -0,0 +1,18 @@ +# SPDX-License-Identifier: MPL-2.0 +# ai.txt - AI interaction policy +# See: https://site.spawning.ai/spawning-ai-txt + +User-Agent: * +Disallow-Training: yes +Disallow-Summarization: no +Disallow-Generation: yes + +# This project's code is licensed under MPL-2.0. +# AI agents may read and analyze this code for assisting contributors. +# AI agents must NOT use this code for model training without explicit consent. +# AI agents must preserve Emotional Lineage. +# +# For AI agent integration instructions, see: +# 0-AI-MANIFEST.a2ml (universal AI entry point) +# AI.a2ml (Claude-specific instructions) +# .machine_readable/ (structured project state) diff --git a/deno/.well-known/humans.txt b/deno/.well-known/humans.txt new file mode 100644 index 0000000..3f96ad3 --- /dev/null +++ b/deno/.well-known/humans.txt @@ -0,0 +1,14 @@ +# SPDX-License-Identifier: MPL-2.0 +# humanstxt.org + +/* TEAM */ +Maintainer: {{AUTHOR}} ({{OWNER}}) +Contact: {{AUTHOR_EMAIL}} +From: United Kingdom + +/* SITE */ +Last update: {{CURRENT_DATE}} +Standards: RSR (Rhodium Standard Repository) +License: MPL-2.0 +Components: Idris2 ABI, Zig FFI +Tools: just, Podman, Guix diff --git a/deno/.well-known/security.txt b/deno/.well-known/security.txt new file mode 100644 index 0000000..5414d50 --- /dev/null +++ b/deno/.well-known/security.txt @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +# RFC 9116 - security.txt +# https://securitytxt.org/ + +Contact: mailto:{{SECURITY_EMAIL}} +Expires: {{CURRENT_YEAR}}-12-31T23:59:59.000Z +Encryption: {{PGP_KEY_URL}} +Preferred-Languages: en +Canonical: https://{{FORGE}}/{{OWNER}}/{{REPO}}/.well-known/security.txt +Policy: https://{{FORGE}}/{{OWNER}}/{{REPO}}/blob/main/SECURITY.md +Hiring: https://{{WEBSITE}}/careers diff --git a/deno/0-AI-MANIFEST.a2ml b/deno/0-AI-MANIFEST.a2ml new file mode 100644 index 0000000..41614b2 --- /dev/null +++ b/deno/0-AI-MANIFEST.a2ml @@ -0,0 +1,121 @@ +# ⚠️ STOP - CRITICAL READING REQUIRED + +**THIS FILE MUST BE READ FIRST BY ALL AI AGENTS** + +## WHAT IS THIS? + +This is the AI manifest for **a2ml-deno**. It declares: +- Canonical file locations (where things MUST be, and nowhere else) +- Critical invariants (rules that must NEVER be violated) +- Repository structure and organization + +## CANONICAL LOCATIONS (UNIVERSAL RULE) + +### Machine-Readable Metadata: `.machine_readable/` ONLY + +These 6 a2ml files MUST exist in `.machine_readable/` directory ONLY: +1. **STATE.a2ml** - Project state, progress, blockers +2. **META.a2ml** - Architecture decisions, governance +3. **ECOSYSTEM.a2ml** - Position in ecosystem, relationships +4. **AGENTIC.a2ml** - AI agent interaction patterns +5. **NEUROSYM.a2ml** - Neurosymbolic integration config +6. **PLAYBOOK.a2ml** - Operational runbook + +**CRITICAL:** If ANY of these files exist in the root directory, this is an ERROR. + +### Anchor File: `.machine_readable/anchors/ANCHOR.a2ml` ONLY + +Canonical authority and semantic-boundary declaration MUST exist at: + +` .machine_readable/anchors/ANCHOR.a2ml ` + +Do not place `ANCHOR.a2ml` at repository root. + +### Maintenance Policies: `.machine_readable/policies/` ONLY + +Canonical maintenance/governance files MUST exist under: + +` .machine_readable/policies/ ` + +Minimum required files: +- `MAINTENANCE-AXES.a2ml` +- `MAINTENANCE-CHECKLIST.a2ml` +- `SOFTWARE-DEVELOPMENT-APPROACH.a2ml` + +Do not place maintenance policy files in repository root. + +### Bot Directives: `.machine_readable/bot_directives/` ONLY + +Bot-specific instructions for your automated agents. + +### Contractiles: `.machine_readable/contractiles/` ONLY + +Policy enforcement contracts (k9, dust, lust, must, trust). + +### AI Configuration & Guides: `.machine_readable/ai/` ONLY + +- `AI.a2ml` - Language-specific or LLM-specific patterns +- `PLACEHOLDERS.md` - Bootstrap guide + +### Community & Forge Metadata: `.github/` ONLY + +- `CODEOWNERS` - Review assignments +- `MAINTAINERS` - Machine-readable contact list +- `SUPPORT` - Support channels +- `SECURITY.md` - Technical security policy +- `CONTRIBUTING.md` - Technical contribution manual +- `CODE_OF_CONDUCT.md` - Conduct rules + +### Agent Instructions + +- `0-AI-MANIFEST.a2ml` - THIS FILE (universal entry point) + +## CORE INVARIANTS + +1. **No state file duplication** - Root must NOT contain STATE.a2ml, META.a2ml, etc. +2. **Single source of truth** - `.machine_readable/` is authoritative +3. **No stale metadata** - If root state files exist, they are OUT OF DATE +4. **License consistency** - All code MPL-2.0 unless platform requires MPL-2.0 +5. **Author attribution** - Always "{{AUTHOR}} <{{AUTHOR_EMAIL}}>" +6. **Container images** - MUST use Chainguard base (`cgr.dev/chainguard/wolfi-base:latest` or `cgr.dev/chainguard/static:latest`) +7. **Container runtime** - Podman, never Docker. Files are `Containerfile`, never `Dockerfile` +8. **Container orchestration** - `selur-compose`, never `docker-compose` + +## REPOSITORY STRUCTURE + +This repo follows the **Dual-Track** architecture: + +``` +a2ml-deno/ +├── 0-AI-MANIFEST.a2ml # THIS FILE (start here) +├── README.adoc # High-level orientation (Rich Human) +├── ROADMAP.adoc # Future direction +├── CONTRIBUTING.adoc # Human contribution guide +├── GOVERNANCE.adoc # Decision-making model +├── Justfile # Task runner +├── Containerfile # OCI build +├── LICENSE # Primary license +├── src/ # Source code +│ └── interface/ # Verified Interface Seams +│ ├── abi/ # Idris2 ABI (The Spec) +│ ├── ffi/ # Zig FFI (The Bridge) +│ └── generated/ # C Headers (The Result) +├── container/ # Stapeln container ecosystem +├── docs/ # Technical depths +│ ├── attribution/ # Citations, owners, maintainers (adoc) +│ ├── architecture/ # Topology, diagrams +│ ├── theory/ # Domain theory +│ └── practice/ # Manuals +├── docs/legal/ # Legal exhibits and full texts +└── .machine_readable/ # ALL machine-readable metadata +``` + +## SESSION STARTUP CHECKLIST + +✅ Read THIS file (0-AI-MANIFEST.a2ml) first +✅ Understand canonical location: `.machine_readable/` +✅ State understanding of canonical locations + +## ATTESTATION PROOF + +**"I have read the AI manifest. All machine-readable content (state files, anchors, policies, bot directives, contractiles, AI guides) is located in `.machine_readable/` ONLY, and community metadata is in `.github/`. I will not create duplicate files in the root directory."** diff --git a/deno/ARCHITECTURE.md b/deno/ARCHITECTURE.md new file mode 100644 index 0000000..607e3d8 --- /dev/null +++ b/deno/ARCHITECTURE.md @@ -0,0 +1,47 @@ +# Architecture + +## Overview + +This repository follows a modular, maintainable architecture designed for clarity, scalability, and long-term sustainability. + +## Directory Structure + +``` +. +├── src/ # Source code +├── tests/ # Test suites +├── docs/ # Documentation +├── scripts/ # Utility scripts +├── config/ # Configuration files +├── LICENSE # License file +├── LICENSES/ # Full license texts +└── README.adoc # Project documentation +``` + +## Design Principles + +- **Separation of Concerns**: Each module has a single responsibility +- **Testability**: Code is written to be easily testable +- **Documentation**: All public APIs are documented +- **Configuration**: Environment-specific settings are externalized + +## Dependencies + +- External dependencies are minimized and clearly declared +- Version pinning is used for reproducibility + +## Security Considerations + +- Sensitive data is never committed to the repository +- Secrets are managed through environment variables or secure vaults +- Regular dependency audits are performed + +## Maintainability + +- Code follows consistent style guidelines +- Pull requests require review and CI checks +- Issues and discussions are tracked transparently + +--- + +*Last updated: 2026-07-18* diff --git a/deno/CHANGELOG.md b/deno/CHANGELOG.md new file mode 100644 index 0000000..8109476 --- /dev/null +++ b/deno/CHANGELOG.md @@ -0,0 +1,11 @@ +# 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] diff --git a/deno/CODE_OF_CONDUCT.md b/deno/CODE_OF_CONDUCT.md new file mode 100644 index 0000000..caeda1c --- /dev/null +++ b/deno/CODE_OF_CONDUCT.md @@ -0,0 +1,27 @@ + +# Contributor Covenant Code of Conduct + +## Our Pledge + +We pledge to make participation a harassment-free experience for everyone. + +## Our Standards + +**Positive behavior:** +* Using welcoming language +* Being respectful of differing viewpoints +* Accepting constructive criticism +* Focusing on what is best for the community + +**Unacceptable behavior:** +* Harassment, trolling, or personal attacks +* Publishing private information without permission + +## Enforcement + +Report issues to the maintainers. All complaints will be reviewed. + +## Attribution + +Adapted from [Contributor Covenant](https://www.contributor-covenant.org/) v2.1. + diff --git a/deno/CONTRIBUTING.md b/deno/CONTRIBUTING.md new file mode 100644 index 0000000..80ecdac --- /dev/null +++ b/deno/CONTRIBUTING.md @@ -0,0 +1,66 @@ + +# Contributing + +Thank you for your interest in contributing! We follow a "Dual-Track" architecture where human-readable documentation lives in the root and machine-readable policies live in `.machine_readable/`. + +## How to Contribute + +We welcome contributions in many forms: + +- **Code:** Improving the core stack or extensions +- **Documentation:** Enhancing docs or AI manifests +- **Testing:** Adding property-based tests or formal proofs +- **Bug reports:** Filing clear, reproducible issues + +## Getting Started + +1. **Read the AI Manifest:** Start with `0-AI-MANIFEST.a2ml` (if present) to understand the repository structure. +2. **Environment:** Use `nix develop` or `direnv allow` to set up your tools. +3. **Task Runner:** Use `just` to see available commands (`just --list`). + +## Development Workflow + +### Branch Naming + +``` +docs/short-description # Documentation +test/what-added # Test additions +feat/short-description # New features +fix/issue-number-description # Bug fixes +refactor/what-changed # Code improvements +security/what-fixed # Security fixes +``` + +### Commit Messages + +We follow [Conventional Commits](https://www.conventionalcommits.org/): + +``` +(): + +[optional body] + +[optional footer] +``` + +Types: `feat`, `fix`, `docs`, `test`, `refactor`, `ci`, `chore`, `security` + +## Reporting Bugs + +Before reporting: +1. Search existing issues +2. Check if it's already fixed in `main` + +When reporting, include: +- Clear, descriptive title +- Environment details (OS, versions, toolchain) +- Steps to reproduce +- Expected vs actual behaviour + +## Code of Conduct + +All contributors are expected to adhere to our [Code of Conduct](CODE_OF_CONDUCT.md). + +## License + +By contributing, you agree that your contributions will be licensed under the same license as the project (see [LICENSE](LICENSE)). diff --git a/deno/Containerfile b/deno/Containerfile new file mode 100644 index 0000000..d7266bc --- /dev/null +++ b/deno/Containerfile @@ -0,0 +1,41 @@ +# SPDX-License-Identifier: MPL-2.0 +# Copyright (c) {{CURRENT_YEAR}} {{AUTHOR}} ({{OWNER}}) <{{AUTHOR_EMAIL}}> +# +# Containerfile for {{PROJECT_NAME}} +# Build: podman build -t {{project}}:latest -f Containerfile . +# Run: podman run --rm -it {{project}}:latest +# Seal: selur seal {{project}}:latest + +# --- Build stage --- +FROM cgr.dev/chainguard/wolfi-base:latest AS build + +# TODO: Install build dependencies for your stack +# Examples: +# RUN apk add --no-cache rust cargo # Rust +# RUN apk add --no-cache elixir erlang # Elixir +# RUN apk add --no-cache zig # Zig + +WORKDIR /build +COPY . . + +# TODO: Replace with your build command +# Examples: +# RUN cargo build --release +# RUN mix deps.get && MIX_ENV=prod mix release +# RUN zig build -Doptimize=ReleaseSafe + +# --- Runtime stage --- +FROM cgr.dev/chainguard/static:latest + +# Copy built artifact from build stage +# TODO: Replace with your binary/artifact path +# Examples: +# COPY --from=build /build/target/release/{{project}} /usr/local/bin/ +# COPY --from=build /build/_build/prod/rel/{{project}} /app/ +# COPY --from=build /build/zig-out/bin/{{project}} /usr/local/bin/ + +# Non-root user (chainguard images default to nonroot) +USER nonroot + +# TODO: Replace with your entrypoint +# ENTRYPOINT ["/usr/local/bin/{{project}}"] diff --git a/deno/EXPLAINME.adoc b/deno/EXPLAINME.adoc new file mode 100644 index 0000000..b20c74d --- /dev/null +++ b/deno/EXPLAINME.adoc @@ -0,0 +1,64 @@ +// SPDX-License-Identifier: CC-BY-SA-4.0 += a2ml-deno — Show Me The Receipts +:toc: +:icons: font + +The README makes claims. This file backs them up. + +== Claims Substantiation + +=== Claim 1: "Complete parser and renderer for A2ML documents with attestation provenance and trust-level tracking" + +**How it works:** The ReScript parser (`src/A2ML_Parser.res`) implements a line-oriented grammar recognizing: headings (`# Title`), paragraphs, inline formatting (bold `**x**`, italic `*x*`, code `` `x` ``), directives (`@key(val):`), attestation blocks (`!attest...!end`), and trust levels (`trust-level: verified|reviewed|automated|unverified`). The AST (in `src/A2ML_Types.res`) represents documents as a tree of blocks and inlines. The `A2ML_Renderer.res` walks the AST and emits back A2ML text, preserving structure (round-trip fidelity: parse then render equals original text). Trust levels are enums tracked in attestation records, enabling queries like "which claims are verified?" + +**Caveat:** Trust level is metadata only—the parser doesn't cryptographically verify attestations. If a `trust-level: verified` claim is false, the parser won't detect it. Verification requires external validation (signature checking, authority lookup). The parser is linear (single pass), so it doesn't detect forward references or cross-attestation consistency. + +**Evidence:** `src/A2ML_Parser.res` implements parse(text): Result with explicit trust-level variants. `src/A2ML_Renderer.res` implements render(doc): String. Tests in `src/tests/` verify round-trip fidelity and all syntax forms. + +=== Claim 2: "Deno-native with zero dependencies, compiled from ReScript to ES6 JavaScript modules" + +**How it works:** The library is written in ReScript (.res files) and compiled to JavaScript ES6 modules using ReScript's toolchain (invoked via `deno task build`). The generated JavaScript has no external dependencies—it uses only Deno's standard library (console for logging, Uint8Array for buffers if needed). The build output is ESM (ECMAScript Modules) with proper import/export statements. Users add the package to their Deno project via `deno add jsr:@hyperpolymath/a2ml`, and Deno's dependency resolver caches it. No package.json, no node_modules, no npm—pure Deno integration. + +**Caveat:** ReScript compilation adds a build step. If Deno directly executes .res files, there's a type-checking overhead. The generated JavaScript is readable but less idiomatic than hand-written JavaScript. ReScript's error messages can be cryptic for beginners. + +**Evidence:** `deno.json` specifies build task (`deno task build` → rescript compile); `src/A2ML.res` exports public API (`parse`, `render`, `parseErrorToString`); generated JS in `lib/` is published to JSR. + +== Technology Choices + +[cols="1,2"] +|=== +| Technology | Learn More + +| **ReScript** | Compiles to ES6 JavaScript, type-safe +| **Deno** | Modern runtime (no Node/npm), JSR package registry +| **A2ML Spec** | Markup language with attestation and trust levels +|=== + +== File Map + +[cols="1,3"] +|=== +| Path | Purpose + +| `src/A2ML.res` | Main module: public API (parse, render, parseErrorToString) +| `src/A2ML_Types.res` | Core types: Document, Block, Inline, Directive, Attestation, TrustLevel +| `src/A2ML_Parser.res` | Line-oriented parser: text → AST with error recovery +| `src/A2ML_Renderer.res` | AST → text renderer: walk tree, emit A2ML syntax +| `src/tests/` | Test suite: parser tests, renderer tests, round-trip validation +| `src/tests/ParserTest.res` | Unit tests: headings, paragraphs, inline, directives, attestations +| `src/tests/RendererTest.res` | Renderer tests: AST → text round-trip fidelity +| `deno.json` | Deno config: build task, JSR metadata, permissions +| `lib/` | Generated JavaScript output (ES6 modules, no build needed for users) +| `jsr.json` | JSR package metadata (version, exports, scope) +|=== + +== Dogfooted Across The Account + +| Project | Integration | +| **panic-attacker** | A2ML manifests in 0-AI-MANIFEST.a2ml can be parsed and analyzed for attestation chain +| **reposystem** | Metadata about repos can be stored in A2ML format with provenance +| **vql-ut** | Proof clauses in queries can be annotated with A2ML attestation blocks + +== Readiness + +**CRG Grade:** C (Beta) - Parser and renderer working, round-trip fidelity tested, Deno integration stable. Production-ready for parsing A2ML documents; cryptographic attestation verification delegated to consumers. diff --git a/deno/GOVERNANCE.md b/deno/GOVERNANCE.md new file mode 100644 index 0000000..e27364c --- /dev/null +++ b/deno/GOVERNANCE.md @@ -0,0 +1,60 @@ +# Governance + +## Overview + +This project is governed by the following principles and structures to ensure transparent, inclusive, and effective decision-making. + +## Roles and Responsibilities + +### Maintainers + +Maintainers are responsible for: +- Reviewing and merging pull requests +- Managing releases and versioning +- Ensuring code quality and standards +- Triaging issues and bug reports +- Community engagement and support + +### Contributors + +Contributors are expected to: +- Follow the code of conduct +- Submit well-documented pull requests +- Write tests for new functionality +- Maintain existing tests +- Update documentation as needed + +## Decision Making + +### Minor Changes +- Can be made by any maintainer +- Include bug fixes, documentation updates, dependency updates + +### Major Changes +- Require discussion in issues or pull requests +- Include new features, architectural changes, API changes +- Need approval from at least 2 maintainers + +### Breaking Changes +- Require RFC (Request for Comments) process +- Need approval from majority of maintainers +- Must include migration guide + +## Code of Conduct + +All participants are expected to follow our Code of Conduct. Violations can be reported to the maintainers. + +## Communication + +- **Issues**: For bug reports and feature requests +- **Discussions**: For questions and general discussion +- **Pull Requests**: For code contributions + +## Licensing + +All contributions are made under the terms of the repository's LICENSE file. +By submitting a pull request, you agree to license your contributions accordingly. + +--- + +*Last updated: 2026-07-18* diff --git a/deno/Justfile b/deno/Justfile new file mode 100644 index 0000000..4d695f9 --- /dev/null +++ b/deno/Justfile @@ -0,0 +1,1042 @@ +# SPDX-License-Identifier: MPL-2.0 +# Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) +# +# RSR Standard Justfile Template +# https://just.systems/man/en/ +# +# Copy this file to new projects and customize the placeholder values. +# +# Run `just` to see all available recipes +# Run `just cookbook` to generate docs/just-cookbook.adoc +# Run `just combinations` to see matrix recipe options + +set shell := ["bash", "-uc"] +set dotenv-load := true +set positional-arguments := true + +# Import auto-generated contractile recipes (must-check, trust-verify, etc.) +# Re-generate with: contractile gen-just +import? "contractile.just" + +# Project metadata — customize these +project := "a2ml-deno" +OWNER := "hyperpolymath" +REPO := "a2ml-deno" +version := "0.1.0" +tier := "infrastructure" # 1 | 2 | infrastructure + +# ═══════════════════════════════════════════════════════════════════════════════ +# DEFAULT & HELP +# ═══════════════════════════════════════════════════════════════════════════════ + +# Show all available recipes with descriptions +default: + @just --list --unsorted + +# Show detailed help for a specific recipe +help recipe="": + #!/usr/bin/env bash + if [ -z "{{recipe}}" ]; then + just --list --unsorted + echo "" + echo "Usage: just help " + echo " just cookbook # Generate full documentation" + echo " just combinations # Show matrix recipes" + else + just --show "{{recipe}}" 2>/dev/null || echo "Recipe '{{recipe}}' not found" + fi + +# Show this project's info +info: + @echo "Project: {{project}}" + @echo "Version: {{version}}" + @echo "RSR Tier: {{tier}}" + @echo "Recipes: $(just --summary | wc -w)" + @[ -f ".machine_readable/STATE.a2ml" ] && grep -oP 'phase\s*=\s*"\K[^"]+' .machine_readable/STATE.a2ml | head -1 | xargs -I{} echo "Phase: {}" || true + +# ═══════════════════════════════════════════════════════════════════════════════ +# INIT — Bootstrap a new project from this template +# ═══════════════════════════════════════════════════════════════════════════════ + +# Interactive project bootstrap — replaces all {{PLACEHOLDER}} tokens +init: + #!/usr/bin/env bash + set -euo pipefail + + echo "═══════════════════════════════════════════════════" + echo " RSR Project Bootstrap" + echo "═══════════════════════════════════════════════════" + echo "" + + # --- Load defaults from config (if exists) --- + # Create yours: ~/.config/rsr/defaults + # Format: OWNER=myorg AUTHOR="My Name" AUTHOR_EMAIL=me@example.org ... + DEFAULTS="${XDG_CONFIG_HOME:-$HOME/.config}/rsr/defaults" + if [ -f "$DEFAULTS" ]; then + echo "Loading defaults from $DEFAULTS" + # shellcheck source=/dev/null + source "$DEFAULTS" + echo "" + fi + + # --- Required values (pre-filled from defaults if available) --- + read -rp "Project name (human-readable, e.g. My Project): " PROJECT_NAME + [ -z "$PROJECT_NAME" ] && echo "Error: project name required" && exit 1 + + read -rp "Repository slug (e.g. my-project): " REPO + [ -z "$REPO" ] && echo "Error: repo slug required" && exit 1 + + read -rp "Owner [${OWNER:-}]: " _OWNER + OWNER="${_OWNER:-${OWNER:-}}" + [ -z "$OWNER" ] && echo "Error: owner required" && exit 1 + + read -rp "Author full name [${AUTHOR:-}]: " _AUTHOR + AUTHOR="${_AUTHOR:-${AUTHOR:-}}" + [ -z "$AUTHOR" ] && echo "Error: author name required" && exit 1 + + read -rp "Author email [${AUTHOR_EMAIL:-}]: " _AUTHOR_EMAIL + AUTHOR_EMAIL="${_AUTHOR_EMAIL:-${AUTHOR_EMAIL:-}}" + [ -z "$AUTHOR_EMAIL" ] && echo "Error: email required" && exit 1 + + # --- Optional values (pre-filled from defaults if available) --- + read -rp "Author organization [${AUTHOR_ORG:-none}]: " _AUTHOR_ORG + AUTHOR_ORG="${_AUTHOR_ORG:-${AUTHOR_ORG:-}}" + + read -rp "Previous/alt email [${AUTHOR_EMAIL_ALT:-none}]: " _AUTHOR_EMAIL_ALT + AUTHOR_EMAIL_ALT="${_AUTHOR_EMAIL_ALT:-${AUTHOR_EMAIL_ALT:-}}" + + read -rp "Project description []: " PROJECT_DESCRIPTION + + read -rp "Forge domain [${FORGE:-github.com}]: " _FORGE + FORGE="${_FORGE:-${FORGE:-github.com}}" + + read -rp "Security contact email [${SECURITY_EMAIL:-$AUTHOR_EMAIL}]: " _SECURITY_EMAIL + SECURITY_EMAIL="${_SECURITY_EMAIL:-${SECURITY_EMAIL:-$AUTHOR_EMAIL}}" + + read -rp "Conduct contact email [${CONDUCT_EMAIL:-$AUTHOR_EMAIL}]: " _CONDUCT_EMAIL + CONDUCT_EMAIL="${_CONDUCT_EMAIL:-${CONDUCT_EMAIL:-$AUTHOR_EMAIL}}" + + read -rp "Project type (library|binary|monorepo|service|website) [library]: " PROJECT_TYPE + PROJECT_TYPE="${PROJECT_TYPE:-library}" + + read -rp "Website URL [https://${FORGE}/${OWNER}/${REPO}]: " WEBSITE + WEBSITE="${WEBSITE:-https://${FORGE}/${OWNER}/${REPO}}" + + # --- Container values (optional — only relevant if container/ exists) --- + if [ -d "container" ]; then + echo "" + echo "── Container configuration (optional) ─────────" + read -rp "Service name [${REPO}]: " _SERVICE_NAME + SERVICE_NAME="${_SERVICE_NAME:-${REPO}}" + read -rp "Primary port [8080]: " _PORT + PORT="${_PORT:-8080}" + read -rp "Container registry [ghcr.io/${OWNER}]: " _REGISTRY + REGISTRY="${_REGISTRY:-ghcr.io/${OWNER}}" + else + SERVICE_NAME="${REPO}" + PORT="8080" + REGISTRY="ghcr.io/${OWNER}" + fi + + # --- Derived values --- + PROJECT_UPPER=$(echo "$REPO" | tr '[:lower:]-' '[:upper:]_') + PROJECT_LOWER=$(echo "$REPO" | tr '[:upper:]-' '[:lower:]_') + CURRENT_YEAR=$(date +%Y) + CURRENT_DATE=$(date +%Y-%m-%d) + VERSION="0.1.0" + + # Derive citation name parts (best-effort split on last space) + AUTHOR_LAST="${AUTHOR##* }" + AUTHOR_FIRST="${AUTHOR% *}" + FIRST_INITIAL="${AUTHOR_FIRST:0:1}." + if [ "$AUTHOR_LAST" = "$AUTHOR_FIRST" ]; then + AUTHOR_FIRST="$AUTHOR" + AUTHOR_LAST="" + FIRST_INITIAL="" + fi + + echo "" + echo "── Summary ──────────────────────────────────────" + echo " Project: $PROJECT_NAME" + echo " Repo: $REPO" + echo " Owner: $OWNER" + echo " Author: $AUTHOR <$AUTHOR_EMAIL>" + [ -n "$AUTHOR_ORG" ] && echo " Organization: $AUTHOR_ORG" + echo " Forge: $FORGE" + echo " Year: $CURRENT_YEAR" + echo "────────────────────────────────────────────────" + echo "" + read -rp "Proceed? [Y/n] " CONFIRM + [[ "${CONFIRM:-Y}" =~ ^[Nn] ]] && echo "Aborted." && exit 0 + + echo "" + echo "Replacing placeholders..." + + # Brace tokens as variables (hex avoids just interpolation) + LB=$(printf '\x7b\x7b') + RB=$(printf '\x7d\x7d') + + # Build the sed expression list + # Note: using | as delimiter since URLs contain / + SED_ARGS=( + -e "s|${LB}PROJECT_NAME${RB}|${PROJECT_NAME}|g" + -e "s|${LB}PROJECT_DESCRIPTION${RB}|${PROJECT_DESCRIPTION}|g" + -e "s|${LB}PROJECT${RB}|${PROJECT_UPPER}|g" + -e "s|${LB}project${RB}|${PROJECT_LOWER}|g" + -e "s|${LB}REPO${RB}|${REPO}|g" + -e "s|${LB}OWNER${RB}|${OWNER}|g" + -e "s|${LB}AUTHOR${RB}|${AUTHOR}|g" + -e "s|${LB}AUTHOR_EMAIL${RB}|${AUTHOR_EMAIL}|g" + -e "s|${LB}AUTHOR_ORG${RB}|${AUTHOR_ORG}|g" + -e "s|${LB}AUTHOR_LAST${RB}|${AUTHOR_LAST}|g" + -e "s|${LB}AUTHOR_FIRST${RB}|${AUTHOR_FIRST}|g" + -e "s|${LB}AUTHOR_INITIALS${RB}|${FIRST_INITIAL}|g" + -e "s|${LB}FORGE${RB}|${FORGE}|g" + -e "s|${LB}CURRENT_YEAR${RB}|${CURRENT_YEAR}|g" + -e "s|${LB}CURRENT_DATE${RB}|${CURRENT_DATE}|g" + -e "s|${LB}DATE${RB}|${CURRENT_DATE}|g" + -e "s|${LB}SECURITY_EMAIL${RB}|${SECURITY_EMAIL}|g" + -e "s|${LB}CONDUCT_EMAIL${RB}|${CONDUCT_EMAIL}|g" + -e "s|${LB}LICENSE${RB}|MPL-2.0|g" + -e "s|${LB}CONDUCT_TEAM${RB}|Code of Conduct Committee|g" + -e "s|${LB}RESPONSE_TIME${RB}|48 hours|g" + -e "s|${LB}MAIN_BRANCH${RB}|main|g" + -e "s|${LB}PROJECT_PURPOSE${RB}|${PROJECT_DESCRIPTION}|g" + -e "s|${LB}PROJECT_ROLE${RB}|${PROJECT_TYPE}|g" + -e "s|${LB}PROJECT_TYPE${RB}|${PROJECT_TYPE}|g" + -e "s|${LB}WEBSITE${RB}|${WEBSITE}|g" + -e "s|${LB}SERVICE_NAME${RB}|${SERVICE_NAME}|g" + -e "s|${LB}PORT${RB}|${PORT}|g" + -e "s|${LB}REGISTRY${RB}|${REGISTRY}|g" + -e "s|${LB}IMAGE${RB}|${REGISTRY}/${SERVICE_NAME}|g" + -e "s|${LB}VERSION${RB}|${VERSION}|g" + -e "s|${LB}EMAIL${RB}|${AUTHOR_EMAIL}|g" + ) + [ -n "$AUTHOR_EMAIL_ALT" ] && SED_ARGS+=(-e "s|${LB}AUTHOR_EMAIL_ALT${RB}|${AUTHOR_EMAIL_ALT}|g") + + # Replace in all text files (skip .git, LICENSE text, and binaries) + find . -type f \ + -not -path './.git/*' \ + -not -name 'MPL-2.0.txt' \ + -not -name '*.png' -not -name '*.jpg' -not -name '*.gif' \ + -not -name '*.woff' -not -name '*.woff2' \ + | while read -r file; do + if file --brief "$file" | grep -qi 'text\|ascii\|utf'; then + sed -i "${SED_ARGS[@]}" "$file" + fi + done + + # Also replace [YOUR-REPO-NAME] and [YOUR-NAME/ORG] in AI manifest + sed -i "s|\[YOUR-REPO-NAME\]|${PROJECT_NAME}|g" 0-AI-MANIFEST.a2ml 2>/dev/null || true + sed -i "s|\[YOUR-NAME/ORG\]|${OWNER}|g" 0-AI-MANIFEST.a2ml 2>/dev/null || true + + echo "" + echo "── Validation ───────────────────────────────────" + + # Check for remaining placeholders + PATTERN="${LB}[A-Z_]*${RB}" + REMAINING=$(grep -rl "$PATTERN" . --include='*.md' --include='*.adoc' --include='*.yml' --include='*.yaml' --include='*.a2ml' --include='*.toml' --include='*.scm' --include='*.ncl' --include='*.nix' --include='*.json' --include='*.sh' 2>/dev/null | grep -v '.git/' | grep -v '.machine_readable/ai/PLACEHOLDERS.adoc' || true) + if [ -n "$REMAINING" ]; then + echo "WARNING: Remaining placeholders in:" + echo "$REMAINING" | sed 's/^/ /' + echo "" + echo "Run: grep -rn '$LB' . --include='*.md' to inspect" + else + echo "All placeholders replaced successfully!" + fi + + # K9-SVC validation (if available) + if command -v k9-svc >/dev/null 2>&1; then + echo "" + echo "Running k9-svc validation..." + k9-svc validate . 2>/dev/null || true + fi + + echo "" + echo "Done! Next steps:" + echo " 1. Review changes: git diff" + echo " 2. Remove template cruft: rm .machine_readable/ai/PLACEHOLDERS.adoc" + echo " 3. Customize README.adoc for your project" + echo " 4. Commit: git add -A && git commit -m 'feat: initialize from RSR template'" + echo " 5. Push: git remote add origin git@${FORGE}:${OWNER}/${REPO}.git && git push -u origin main" + +# ═══════════════════════════════════════════════════════════════════════════════ +# BUILD & COMPILE +# ═══════════════════════════════════════════════════════════════════════════════ + +# Build the project (debug mode) +build *args: + @echo "Building {{project}} (debug)..." + # TODO: Replace with your build command + # Examples: + # cargo build {{args}} # Rust + # mix compile {{args}} # Elixir + # zig build {{args}} # Zig + # deno task build {{args}} # Deno/ReScript + @echo "Build complete" + +# Build in release mode with optimizations +build-release *args: + @echo "Building {{project}} (release)..." + # TODO: Replace with your release build command + # Examples: + # cargo build --release {{args}} + # MIX_ENV=prod mix compile {{args}} + # zig build -Doptimize=ReleaseFast {{args}} + @echo "Release build complete" + +# Build and watch for changes (requires entr or similar) +build-watch: + @echo "Watching for changes..." + # TODO: Customize file patterns for your language + # Examples: + # find src -name '*.rs' | entr -c just build + # mix compile --force --warnings-as-errors + # deno task dev + +# Clean build artifacts [reversible: rebuild with `just build`] +clean: + @echo "Cleaning..." + # TODO: Customize for your build system + rm -rf target/ _build/ build/ dist/ out/ obj/ bin/ + +# Deep clean including caches [reversible: rebuild] +clean-all: clean + rm -rf .cache .tmp + +# ═══════════════════════════════════════════════════════════════════════════════ +# TEST & QUALITY +# ═══════════════════════════════════════════════════════════════════════════════ + +# Run all tests +test *args: + @echo "Running tests..." + # TODO: Replace with your test command + # Examples: + # cargo test {{args}} + # mix test {{args}} + # zig build test {{args}} + # deno test {{args}} + @echo "Tests passed!" + +# Run tests with verbose output +test-verbose: + @echo "Running tests (verbose)..." + # TODO: Replace with verbose test command + +# Smoke test +test-smoke: + @echo "Smoke test..." + # TODO: Add basic sanity checks + +# Run all quality checks +quality: fmt-check lint test + @echo "All quality checks passed!" + +# Fix all auto-fixable issues [reversible: git checkout] +fix: fmt + @echo "Fixed all auto-fixable issues" + +# ═══════════════════════════════════════════════════════════════════════════════ +# LINT & FORMAT +# ═══════════════════════════════════════════════════════════════════════════════ + +# Format all source files [reversible: git checkout] +fmt: + @echo "Formatting source files..." + # TODO: Replace with your formatter + # Examples: + # cargo fmt + # mix format + # gleam format + # deno fmt + +# Check formatting without changes +fmt-check: + @echo "Checking formatting..." + # TODO: Replace with your format check + # Examples: + # cargo fmt --check + # mix format --check-formatted + # gleam format --check + +# Run linter +lint: + @echo "Linting source files..." + # TODO: Replace with your linter + # Examples: + # cargo clippy -- -D warnings + # mix credo --strict + # gleam check + +# ═══════════════════════════════════════════════════════════════════════════════ +# RUN & EXECUTE +# ═══════════════════════════════════════════════════════════════════════════════ + +# Run the application +run *args: build + # TODO: Replace with your run command + echo "Run not configured yet" + +# Run with verbose output +run-verbose *args: build + # TODO: Replace with verbose run command + echo "Run not configured yet" + +# Install to user path +install: build-release + @echo "Installing {{project}}..." + # TODO: Replace with your install command + +# ═══════════════════════════════════════════════════════════════════════════════ +# DEPENDENCIES +# ═══════════════════════════════════════════════════════════════════════════════ + +# Install/check all dependencies +deps: + @echo "Checking dependencies..." + # TODO: Replace with your dependency check + # Examples: + # cargo check + # mix deps.get + # gleam deps download + @echo "All dependencies satisfied" + +# Audit dependencies for vulnerabilities +deps-audit: + @echo "Auditing for vulnerabilities..." + # TODO: Replace with your audit command + # Examples: + # cargo audit + # mix audit + @command -v trivy >/dev/null && trivy fs --severity HIGH,CRITICAL --quiet . || true + @command -v gitleaks >/dev/null && gitleaks detect --source . --no-git --quiet || true + @echo "Audit complete" + +# ═══════════════════════════════════════════════════════════════════════════════ +# DOCUMENTATION +# ═══════════════════════════════════════════════════════════════════════════════ + +# Generate all documentation +docs: + @mkdir -p docs/generated docs/man + just cookbook + just man + @echo "Documentation generated in docs/" + +# Generate justfile cookbook documentation +cookbook: + #!/usr/bin/env bash + mkdir -p docs + OUTPUT="docs/just-cookbook.adoc" + echo "= {{project}} Justfile Cookbook" > "$OUTPUT" + echo ":toc: left" >> "$OUTPUT" + echo ":toclevels: 3" >> "$OUTPUT" + echo "" >> "$OUTPUT" + echo "Generated: $(date -Iseconds)" >> "$OUTPUT" + echo "" >> "$OUTPUT" + echo "== Recipes" >> "$OUTPUT" + echo "" >> "$OUTPUT" + just --list --unsorted | while read -r line; do + if [[ "$line" =~ ^[[:space:]]+([a-z_-]+) ]]; then + recipe="${BASH_REMATCH[1]}" + echo "=== $recipe" >> "$OUTPUT" + echo "" >> "$OUTPUT" + echo "[source,bash]" >> "$OUTPUT" + echo "----" >> "$OUTPUT" + echo "just $recipe" >> "$OUTPUT" + echo "----" >> "$OUTPUT" + echo "" >> "$OUTPUT" + fi + done + echo "Generated: $OUTPUT" + +# Generate man page +man: + #!/usr/bin/env bash + mkdir -p docs/man + cat > docs/man/{{project}}.1 << EOF + .TH {{project}} 1 "$(date +%Y-%m-%d)" "{{version}}" "{{project}} Manual" + .SH NAME + {{project}} \- RSR-compliant project + .SH SYNOPSIS + .B just + [recipe] [args...] + .SH DESCRIPTION + RSR (Rhodium Standard Repository) project managed with just. + .SH AUTHOR + $(git config user.name 2>/dev/null || echo "Author") <$(git config user.email 2>/dev/null || echo "email")> + EOF + echo "Generated: docs/man/{{project}}.1" + +# ═══════════════════════════════════════════════════════════════════════════════ +# CONTAINERS (stapeln ecosystem — Podman + Chainguard Wolfi) +# ═══════════════════════════════════════════════════════════════════════════════ + +# Initialise container templates — substitute placeholders with project values +container-init: + #!/usr/bin/env bash + set -euo pipefail + + if [ ! -d "container" ]; then + echo "Error: container/ directory not found." + echo "This repo may not have been created from rsr-template-repo." + exit 1 + fi + + echo "=== Container Template Initialisation ===" + echo "" + + # Load RSR defaults if available + DEFAULTS="${XDG_CONFIG_HOME:-$HOME/.config}/rsr/defaults" + if [ -f "$DEFAULTS" ]; then + echo "Loading defaults from $DEFAULTS" + # shellcheck source=/dev/null + source "$DEFAULTS" + echo "" + fi + + # Prompt for container-specific values + read -rp "Service name (e.g. my-api) [{{project}}]: " _SERVICE_NAME + SERVICE_NAME="${_SERVICE_NAME:-{{project}}}" + + read -rp "Primary port [8080]: " _PORT + PORT="${_PORT:-8080}" + + read -rp "Container registry [ghcr.io/${OWNER:-{{OWNER}}}]: " _REGISTRY + REGISTRY="${_REGISTRY:-ghcr.io/${OWNER:-{{OWNER}}}}" + + echo "" + echo " Service: $SERVICE_NAME" + echo " Port: $PORT" + echo " Registry: $REGISTRY" + echo "" + read -rp "Proceed? [Y/n] " CONFIRM + [[ "${CONFIRM:-Y}" =~ ^[Nn] ]] && echo "Aborted." && exit 0 + + echo "" + echo "Replacing container placeholders..." + + # Brace tokens as variables (hex escapes avoid just interpolation) + LB=$(printf '\x7b\x7b') + RB=$(printf '\x7d\x7d') + + SED_ARGS=( + -e "s|${LB}SERVICE_NAME${RB}|${SERVICE_NAME}|g" + -e "s|${LB}PORT${RB}|${PORT}|g" + -e "s|${LB}REGISTRY${RB}|${REGISTRY}|g" + ) + + find container/ -type f | while read -r file; do + if file --brief "$file" | grep -qi 'text\|ascii\|utf'; then + sed -i "${SED_ARGS[@]}" "$file" + fi + done + + echo "Container templates initialised." + echo "" + echo "Next steps:" + echo " 1. Edit container/Containerfile — add your build commands" + echo " 2. Edit container/entrypoint.sh — set your application binary" + echo " 3. Review container/compose.toml — adjust services and volumes" + echo " 4. Build: just container-build" + +# Build container image via cerro-torre pipeline +container-build *args: + #!/usr/bin/env bash + if [ -f "container/ct-build.sh" ]; then + cd container && ./ct-build.sh {{args}} + elif [ -f "container/Containerfile" ]; then + podman build -t {{project}}:latest -f container/Containerfile . + elif [ -f "Containerfile" ]; then + podman build -t {{project}}:latest -f Containerfile . + else + echo "No Containerfile found in container/ or project root" + exit 1 + fi + +# Verify compose configuration +container-verify: + #!/usr/bin/env bash + if [ ! -f "container/compose.toml" ]; then + echo "No container/compose.toml found" + exit 1 + fi + cd container + if command -v selur-compose &>/dev/null; then + selur-compose verify + else + echo "selur-compose not found, falling back to podman compose" + podman compose --file compose.toml config + fi + +# Start container stack +container-up *args: + #!/usr/bin/env bash + if [ ! -f "container/compose.toml" ]; then + echo "No container/compose.toml found" + exit 1 + fi + cd container + if command -v selur-compose &>/dev/null; then + selur-compose up {{args}} + else + podman compose --file compose.toml up {{args}} + fi + +# Stop container stack +container-down: + #!/usr/bin/env bash + cd container 2>/dev/null || { echo "No container/ directory"; exit 1; } + if command -v selur-compose &>/dev/null; then + selur-compose down + else + podman compose --file compose.toml down + fi + +# Sign and verify container bundle (build + pack + sign + verify) +container-sign: + #!/usr/bin/env bash + if [ -f "container/ct-build.sh" ]; then + cd container && ./ct-build.sh + else + echo "No container/ct-build.sh found" + exit 1 + fi + +# Push signed bundle to registry +container-push: + #!/usr/bin/env bash + if [ -f "container/ct-build.sh" ]; then + cd container && ./ct-build.sh --push + else + echo "No container/ct-build.sh found — falling back to podman push" + podman push {{project}}:latest + fi + +# Run container interactively (for debugging) +container-run *args: + podman run --rm -it {{project}}:latest {{args}} + +# ═══════════════════════════════════════════════════════════════════════════════ +# CI & AUTOMATION +# ═══════════════════════════════════════════════════════════════════════════════ + +# Run full CI pipeline locally +ci: deps quality + @echo "CI pipeline complete!" + +# Install git hooks +install-hooks: + @mkdir -p .git/hooks + @cat > .git/hooks/pre-commit << 'HOOKEOF' + #!/bin/bash + just fmt-check || exit 1 + just lint || exit 1 + HOOKEOF + @chmod +x .git/hooks/pre-commit + @echo "Git hooks installed" + +# ═══════════════════════════════════════════════════════════════════════════════ +# SECURITY +# ═══════════════════════════════════════════════════════════════════════════════ + +# Run security audit +security: deps-audit + @echo "=== Security Audit ===" + @command -v gitleaks >/dev/null && gitleaks detect --source . --verbose || true + @command -v trivy >/dev/null && trivy fs --severity HIGH,CRITICAL . || true + @echo "Security audit complete" + +# Generate SBOM +sbom: + @mkdir -p docs/security + @command -v syft >/dev/null && syft . -o spdx-json > docs/security/sbom.spdx.json || echo "syft not found" + +# ═══════════════════════════════════════════════════════════════════════════════ +# VALIDATION & COMPLIANCE +# ═══════════════════════════════════════════════════════════════════════════════ + +# Validate RSR compliance +validate-rsr: + #!/usr/bin/env bash + echo "=== RSR Compliance Check ===" + MISSING="" + for f in .editorconfig .gitignore Justfile README.adoc LICENSE 0-AI-MANIFEST.a2ml; do + [ -f "$f" ] || MISSING="$MISSING $f" + done + for f in .machine_readable/STATE.a2ml .machine_readable/META.a2ml .machine_readable/ECOSYSTEM.a2ml .machine_readable/anchors/ANCHOR.a2ml .machine_readable/policies/MAINTENANCE-AXES.a2ml .machine_readable/policies/MAINTENANCE-CHECKLIST.a2ml .machine_readable/policies/SOFTWARE-DEVELOPMENT-APPROACH.a2ml; do + [ -f "$f" ] || MISSING="$MISSING $f" + done + for f in licensing/exhibits/EXHIBIT-A-ETHICAL-USE.txt licensing/exhibits/EXHIBIT-B-QUANTUM-SAFE.txt licensing/texts/MPL-2.0.txt; do + [ -f "$f" ] || MISSING="$MISSING $f" + done + for f in src/interface/abi src/interface/ffi src/interface/generated; do + [ -d "$f" ] || MISSING="$MISSING $f" + done + for f in docs/maintenance/MAINTENANCE-CHECKLIST.adoc docs/practice/SOFTWARE-DEVELOPMENT-APPROACH.adoc; do + [ -f "$f" ] || MISSING="$MISSING $f" + done + if [ -f ".machine_readable/META.a2ml" ]; then + grep -q 'axis-1 = "must > intend > like"' .machine_readable/META.a2ml || MISSING="$MISSING META.a2ml:axis-1" + grep -q 'axis-2 = "corrective > adaptive > perfective"' .machine_readable/META.a2ml || MISSING="$MISSING META.a2ml:axis-2" + grep -q 'axis-3 = "systems > compliance > effects"' .machine_readable/META.a2ml || MISSING="$MISSING META.a2ml:axis-3" + grep -q 'scoping-first = true' .machine_readable/META.a2ml || MISSING="$MISSING META.a2ml:scoping-first" + grep -q 'idris-unsound-scan = "believe_me/assert_total"' .machine_readable/META.a2ml || MISSING="$MISSING META.a2ml:idris-unsound-scan" + grep -q 'audit-focus = "systems in place, documentation explains actual state, safety/security accounted for, observed effects reviewed"' .machine_readable/META.a2ml || MISSING="$MISSING META.a2ml:audit-focus" + grep -q 'compliance-focus = "seams/compromises/exception register, bounded exceptions, anti-drift checks"' .machine_readable/META.a2ml || MISSING="$MISSING META.a2ml:compliance-focus" + grep -q 'effects-evidence = "benchmark execution/results and maintainer status dialogue/review"' .machine_readable/META.a2ml || MISSING="$MISSING META.a2ml:effects-evidence" + grep -q 'compliance-tooling = "panic-attack"' .machine_readable/policies/MAINTENANCE-AXES.a2ml || MISSING="$MISSING MAINTENANCE-AXES.a2ml:compliance-tooling" + grep -q 'effects-tooling = "ecological checking with sustainabot guidance"' .machine_readable/policies/MAINTENANCE-AXES.a2ml || MISSING="$MISSING MAINTENANCE-AXES.a2ml:effects-tooling" + grep -q 'source-human = "docs/maintenance/MAINTENANCE-CHECKLIST.adoc"' .machine_readable/policies/MAINTENANCE-CHECKLIST.a2ml || MISSING="$MISSING MAINTENANCE-CHECKLIST.a2ml:source-human" + grep -q 'source-human = "docs/practice/SOFTWARE-DEVELOPMENT-APPROACH.adoc"' .machine_readable/policies/SOFTWARE-DEVELOPMENT-APPROACH.a2ml || MISSING="$MISSING SOFTWARE-DEVELOPMENT-APPROACH.a2ml:source-human" + fi + if [ -n "$MISSING" ]; then + echo "MISSING:$MISSING" + exit 1 + fi + echo "RSR compliance: PASS" + +# Validate STATE.a2ml syntax +validate-state: + @if [ -f ".machine_readable/STATE.a2ml" ]; then \ + grep -q '^\[metadata\]' .machine_readable/STATE.a2ml && \ + grep -q 'project\s*=' .machine_readable/STATE.a2ml && \ + echo "STATE.a2ml: valid" || echo "STATE.a2ml: INVALID (missing required sections)"; \ + else \ + echo "No .machine_readable/STATE.a2ml found"; \ + fi + +# Validate AI installation guide completeness (finishbot pre-release check) +validate-ai-install: + #!/usr/bin/env bash + echo "=== AI Installation Guide Check ===" + GUIDE="docs/AI_INSTALLATION_GUIDE.adoc" + README="README.adoc" + ERRORS=0 + + # Check guide exists + if [ ! -f "$GUIDE" ]; then + echo "MISSING: $GUIDE (create from template: docs/AI_INSTALLATION_GUIDE.adoc)" + ERRORS=$((ERRORS + 1)) + else + # Check for unfilled TODO markers + TODOS=$(grep -c '\[TODO-AI-INSTALL' "$GUIDE" 2>/dev/null || true) + if [ "$TODOS" -gt 0 ]; then + echo "INCOMPLETE: $GUIDE has $TODOS unfilled [TODO-AI-INSTALL] markers:" + grep -n '\[TODO-AI-INSTALL' "$GUIDE" | head -10 + ERRORS=$((ERRORS + 1)) + else + echo "$GUIDE: complete (no TODO markers)" + fi + + # Check AI implementation section exists + if ! grep -q 'ai-implementation' "$GUIDE" 2>/dev/null; then + echo "MISSING: [[ai-implementation]] anchor in $GUIDE" + ERRORS=$((ERRORS + 1)) + fi + + # Check privacy notice exists + if ! grep -qi 'privacy' "$GUIDE" 2>/dev/null; then + echo "MISSING: Privacy notice in $GUIDE" + ERRORS=$((ERRORS + 1)) + fi + + # Check install commands exist (not just placeholders) + if ! grep -q 'git clone' "$GUIDE" 2>/dev/null; then + echo "WARNING: No git clone command found in $GUIDE -- install commands may be incomplete" + fi + fi + + # Check README has AI install section + if [ -f "$README" ]; then + if ! grep -qi 'AI-Assisted Installation' "$README" 2>/dev/null; then + echo "MISSING: AI-Assisted Installation section in $README" + echo " Copy from docs/AI-INSTALL-README-SECTION.adoc" + ERRORS=$((ERRORS + 1)) + fi + + # Check README for unfilled TODO markers + README_TODOS=$(grep -c '\[TODO-AI-INSTALL' "$README" 2>/dev/null || true) + if [ "$README_TODOS" -gt 0 ]; then + echo "INCOMPLETE: $README has $README_TODOS unfilled [TODO-AI-INSTALL] markers" + ERRORS=$((ERRORS + 1)) + fi + fi + + if [ "$ERRORS" -gt 0 ]; then + echo "" + echo "AI install guide: FAIL ($ERRORS issues)" + exit 1 + fi + echo "AI install guide: PASS" + +# Full validation suite +validate: validate-rsr validate-state validate-ai-install + @echo "All validations passed!" + +# ═══════════════════════════════════════════════════════════════════════════════ +# STATE MANAGEMENT +# ═══════════════════════════════════════════════════════════════════════════════ + +# Update STATE.a2ml timestamp +state-touch: + @if [ -f ".machine_readable/STATE.a2ml" ]; then \ + sed -i 's/last-updated = "[^"]*"/last-updated = "'"$(date +%Y-%m-%d)"'"/' .machine_readable/STATE.a2ml && \ + echo "STATE.a2ml timestamp updated"; \ + fi + +# Show current phase from STATE.a2ml +state-phase: + @grep -oP 'phase\s*=\s*"\K[^"]+' .machine_readable/STATE.a2ml 2>/dev/null | head -1 || echo "unknown" + +# ═══════════════════════════════════════════════════════════════════════════════ +# GUIX & NIX +# ═══════════════════════════════════════════════════════════════════════════════ + +# Enter Guix development shell (primary) +guix-shell: + guix shell -D -f guix.scm + +# Build with Guix +guix-build: + guix build -f guix.scm + +# Enter Nix development shell (fallback) +nix-shell: + @if [ -f "flake.nix" ]; then nix develop; else echo "No flake.nix"; fi + +# ═══════════════════════════════════════════════════════════════════════════════ +# HYBRID AUTOMATION +# ═══════════════════════════════════════════════════════════════════════════════ + +# Run local automation tasks +automate task="all": + #!/usr/bin/env bash + case "{{task}}" in + all) just fmt && just lint && just test && just docs && just state-touch ;; + cleanup) just clean && find . -name "*.orig" -delete && find . -name "*~" -delete ;; + update) just deps && just validate ;; + *) echo "Unknown: {{task}}. Use: all, cleanup, update" && exit 1 ;; + esac + +# ═══════════════════════════════════════════════════════════════════════════════ +# COMBINATORIC MATRIX RECIPES +# ═══════════════════════════════════════════════════════════════════════════════ + +# Build matrix: [debug|release] x [target] x [features] +build-matrix mode="debug" target="" features="": + @echo "Build matrix: mode={{mode}} target={{target}} features={{features}}" + +# Test matrix: [unit|integration|e2e|all] x [verbosity] x [parallel] +test-matrix suite="unit" verbosity="normal" parallel="true": + @echo "Test matrix: suite={{suite}} verbosity={{verbosity}} parallel={{parallel}}" + +# Container matrix: [build|run|push|shell|scan] x [registry] x [tag] +container-matrix action="build" registry="ghcr.io/{{OWNER}}" tag="latest": + @echo "Container matrix: action={{action}} registry={{registry}} tag={{tag}}" + +# CI matrix: [lint|test|build|security|all] x [quick|full] +ci-matrix stage="all" depth="quick": + @echo "CI matrix: stage={{stage}} depth={{depth}}" + +# Show all matrix combinations +combinations: + @echo "=== Combinatoric Matrix Recipes ===" + @echo "" + @echo "Build Matrix: just build-matrix [debug|release] [target] [features]" + @echo "Test Matrix: just test-matrix [unit|integration|e2e|all] [verbosity] [parallel]" + @echo "Container: just container-matrix [build|run|push|shell|scan] [registry] [tag]" + @echo "CI Matrix: just ci-matrix [lint|test|build|security|all] [quick|full]" + +# ═══════════════════════════════════════════════════════════════════════════════ +# VERSION CONTROL +# ═══════════════════════════════════════════════════════════════════════════════ + +# Show git status +status: + @git status --short + +# Show recent commits +log count="20": + @git log --oneline -{{count}} + +# Generate CHANGELOG.md with git-cliff +changelog: + @command -v git-cliff >/dev/null || { echo "git-cliff not found — install: cargo install git-cliff"; exit 1; } + git cliff --config .machine_readable/configs/git-cliff/cliff.toml --output CHANGELOG.md + @echo "Generated CHANGELOG.md" + +# Preview changelog for unreleased commits (does not write) +changelog-preview: + @command -v git-cliff >/dev/null || { echo "git-cliff not found — install: cargo install git-cliff"; exit 1; } + git cliff --config .machine_readable/configs/git-cliff/cliff.toml --unreleased --strip header + +# Tag a new release (usage: just release-tag 1.2.3) +release-tag version: + #!/usr/bin/env bash + TAG="v{{version}}" + if git rev-parse "$TAG" >/dev/null 2>&1; then + echo "Tag $TAG already exists" + exit 1 + fi + just changelog + git add CHANGELOG.md + git commit -m "chore(release): prepare $TAG" + git tag -a "$TAG" -m "Release $TAG" + echo "Created tag $TAG — push with: git push origin main --tags" + +# ═══════════════════════════════════════════════════════════════════════════════ +# UTILITIES +# ═══════════════════════════════════════════════════════════════════════════════ + +# Count lines of code +loc: + @find . \( -name "*.rs" -o -name "*.ex" -o -name "*.exs" -o -name "*.res" -o -name "*.gleam" -o -name "*.zig" -o -name "*.idr" -o -name "*.hs" -o -name "*.ncl" -o -name "*.scm" -o -name "*.adb" -o -name "*.ads" \) -not -path './target/*' -not -path './_build/*' 2>/dev/null | xargs wc -l 2>/dev/null | tail -1 || echo "0" + +# Show TODO comments +todos: + @grep -rn "TODO\|FIXME\|HACK\|XXX" --include="*.rs" --include="*.ex" --include="*.res" --include="*.gleam" --include="*.zig" --include="*.idr" --include="*.hs" . 2>/dev/null || echo "No TODOs" + +# Open in editor +edit: + ${EDITOR:-code} . + +# Run high-rigor security assault using panic-attacker +maint-assault: + @./.machine_readable/scripts/maintenance/maint-assault.sh + +# Run panic-attacker pre-commit scan +assail: + @command -v panic-attack >/dev/null 2>&1 && panic-attack assail . || echo "panic-attack not found — install from https://github.com/hyperpolymath/panic-attacker" + +# ═══════════════════════════════════════════════════════════════════════════════ +# ONBOARDING & DIAGNOSTICS +# ═══════════════════════════════════════════════════════════════════════════════ + +# Check all required toolchain dependencies and report health +doctor: + #!/usr/bin/env bash + echo "═══════════════════════════════════════════════════" + echo " A2Ml Deno Doctor — Toolchain Health Check" + echo "═══════════════════════════════════════════════════" + echo "" + PASS=0; FAIL=0; WARN=0 + check() { + local name="$1" cmd="$2" min="$3" + if command -v "$cmd" >/dev/null 2>&1; then + VER=$("$cmd" --version 2>&1 | head -1) + echo " [OK] $name — $VER" + PASS=$((PASS + 1)) + else + echo " [FAIL] $name — not found (need $min+)" + FAIL=$((FAIL + 1)) + fi + } + check "just" just "1.25" + check "git" git "2.40" + check "Deno" deno "2.0" + check "ReScript (resc)" rescript "12.0" +# Optional tools +if command -v panic-attack >/dev/null 2>&1; then + echo " [OK] panic-attack — available" + PASS=$((PASS + 1)) +else + echo " [WARN] panic-attack — not found (pre-commit scanner)" + WARN=$((WARN + 1)) +fi + echo "" + echo " Result: $PASS passed, $FAIL failed, $WARN warnings" + if [ "$FAIL" -gt 0 ]; then + echo " Run 'just heal' to attempt automatic repair." + exit 1 + fi + echo " All required tools present." + +# Attempt to automatically install missing tools +heal: + #!/usr/bin/env bash + echo "═══════════════════════════════════════════════════" + echo " A2Ml Deno Heal — Automatic Tool Installation" + echo "═══════════════════════════════════════════════════" + echo "" +if ! command -v deno >/dev/null 2>&1; then + echo "Installing Deno..." + curl -fsSL https://deno.land/install.sh | sh +fi +# Install Deno dependencies +echo "Installing Deno dependencies..." +deno install 2>/dev/null || true +if ! command -v just >/dev/null 2>&1; then + echo "Installing just..." + cargo install just 2>/dev/null || echo "Install just from https://just.systems" +fi + echo "" + echo "Heal complete. Run 'just doctor' to verify." + +# Guided tour of the project structure and key concepts +tour: + #!/usr/bin/env bash + echo "═══════════════════════════════════════════════════" + echo " A2Ml Deno — Guided Tour" + echo "═══════════════════════════════════════════════════" + echo "" + echo '**Deno-native parser library for A2ML (Attested Markup Language), written in ReScript.**' + echo "" + echo "Key directories:" + echo " src/ Source code" + echo " lib/ Library modules" + echo " docs/ Documentation" + echo " tests/ Test suite" + echo " .github/workflows/ CI/CD workflows" + echo " .machine_readable/ Machine-readable metadata" + echo " container/ Container configuration" + echo " examples/ Usage examples" + echo "" + echo "Quick commands:" + echo " just doctor Check toolchain health" + echo " just heal Fix missing tools" + echo " just help-me Common workflows" + echo " just default List all recipes" + echo "" + echo "Read more: README.adoc, EXPLAINME.adoc" + +# Show help for common workflows +help-me: + #!/usr/bin/env bash + echo "═══════════════════════════════════════════════════" + echo " A2Ml Deno — Common Workflows" + echo "═══════════════════════════════════════════════════" + echo "" +echo "FIRST TIME SETUP:" +echo " just doctor Check toolchain" +echo " just heal Fix missing tools" +echo "" + echo "DEVELOPMENT:" + echo " deno task dev Development server" + echo " deno test Run tests" + echo "" +echo "PRE-COMMIT:" +echo " just assail Run panic-attacker scan" +echo "" +echo "LEARN:" +echo " just tour Guided project tour" +echo " just default List all recipes" + + +# Print the current CRG grade (reads from READINESS.md '**Current Grade:** X' line) +crg-grade: + @grade=$$(grep -oP '(?<=\*\*Current Grade:\*\* )[A-FX]' READINESS.md 2>/dev/null | head -1); \ + [ -z "$$grade" ] && grade="X"; \ + echo "$$grade" + +# Generate a shields.io badge markdown for the current CRG grade +# Looks for '**Current Grade:** X' in READINESS.md; falls back to X +crg-badge: + @grade=$$(grep -oP '(?<=\*\*Current Grade:\*\* )[A-FX]' READINESS.md 2>/dev/null | head -1); \ + [ -z "$$grade" ] && grade="X"; \ + case "$$grade" in \ + A) color="brightgreen" ;; B) color="green" ;; C) color="yellow" ;; \ + D) color="orange" ;; E) color="red" ;; F) color="critical" ;; \ + *) color="lightgrey" ;; esac; \ + echo "[![CRG $$grade](https://img.shields.io/badge/CRG-$$grade-$$color?style=flat-square)](https://github.com/hyperpolymath/standards/tree/main/component-readiness-grades)" diff --git a/deno/LICENSE b/deno/LICENSE new file mode 100644 index 0000000..14e2f77 --- /dev/null +++ b/deno/LICENSE @@ -0,0 +1,373 @@ +Mozilla Public License Version 2.0 +================================== + +1. Definitions +-------------- + +1.1. "Contributor" + means each individual or legal entity that creates, contributes to + the creation of, or owns Covered Software. + +1.2. "Contributor Version" + means the combination of the Contributions of others (if any) used + by a Contributor and that particular Contributor's Contribution. + +1.3. "Contribution" + means Covered Software of a particular Contributor. + +1.4. "Covered Software" + means Source Code Form to which the initial Contributor has attached + the notice in Exhibit A, the Executable Form of such Source Code + Form, and Modifications of such Source Code Form, in each case + including portions thereof. + +1.5. "Incompatible With Secondary Licenses" + means + + (a) that the initial Contributor has attached the notice described + in Exhibit B to the Covered Software; or + + (b) that the Covered Software was made available under the terms of + version 1.1 or earlier of the License, but not also under the + terms of a Secondary License. + +1.6. "Executable Form" + means any form of the work other than Source Code Form. + +1.7. "Larger Work" + means a work that combines Covered Software with other material, in + a separate file or files, that is not Covered Software. + +1.8. "License" + means this document. + +1.9. "Licensable" + means having the right to grant, to the maximum extent possible, + whether at the time of the initial grant or subsequently, any and + all of the rights conveyed by this License. + +1.10. "Modifications" + means any of the following: + + (a) any file in Source Code Form that results from an addition to, + deletion from, or modification of the contents of Covered + Software; or + + (b) any new file in Source Code Form that contains any Covered + Software. + +1.11. "Patent Claims" of a Contributor + means any patent claim(s), including without limitation, method, + process, and apparatus claims, in any patent Licensable by such + Contributor that would be infringed, but for the grant of the + License, by the making, using, selling, offering for sale, having + made, import, or transfer of either its Contributions or its + Contributor Version. + +1.12. "Secondary License" + means either the GNU General Public License, Version 2.0, the GNU + Lesser General Public License, Version 2.1, the GNU Affero General + Public License, Version 3.0, or any later versions of those + licenses. + +1.13. "Source Code Form" + means the form of the work preferred for making modifications. + +1.14. "You" (or "Your") + means an individual or a legal entity exercising rights under this + License. For legal entities, "You" includes any entity that + controls, is controlled by, or is under common control with You. For + purposes of this definition, "control" means (a) the power, direct + or indirect, to cause the direction or management of such entity, + whether by contract or otherwise, or (b) ownership of more than + fifty percent (50%) of the outstanding shares or beneficial + ownership of such entity. + +2. License Grants and Conditions +-------------------------------- + +2.1. Grants + +Each Contributor hereby grants You a world-wide, royalty-free, +non-exclusive license: + +(a) under intellectual property rights (other than patent or trademark) + Licensable by such Contributor to use, reproduce, make available, + modify, display, perform, distribute, and otherwise exploit its + Contributions, either on an unmodified basis, with Modifications, or + as part of a Larger Work; and + +(b) under Patent Claims of such Contributor to make, use, sell, offer + for sale, have made, import, and otherwise transfer either its + Contributions or its Contributor Version. + +2.2. Effective Date + +The licenses granted in Section 2.1 with respect to any Contribution +become effective for each Contribution on the date the Contributor first +distributes such Contribution. + +2.3. Limitations on Grant Scope + +The licenses granted in this Section 2 are the only rights granted under +this License. No additional rights or licenses will be implied from the +distribution or licensing of Covered Software under this License. +Notwithstanding Section 2.1(b) above, no patent license is granted by a +Contributor: + +(a) for any code that a Contributor has removed from Covered Software; + or + +(b) for infringements caused by: (i) Your and any other third party's + modifications of Covered Software, or (ii) the combination of its + Contributions with other software (except as part of its Contributor + Version); or + +(c) under Patent Claims infringed by Covered Software in the absence of + its Contributions. + +This License does not grant any rights in the trademarks, service marks, +or logos of any Contributor (except as may be necessary to comply with +the notice requirements in Section 3.4). + +2.4. Subsequent Licenses + +No Contributor makes additional grants as a result of Your choice to +distribute the Covered Software under a subsequent version of this +License (see Section 10.2) or under the terms of a Secondary License (if +permitted under the terms of Section 3.3). + +2.5. Representation + +Each Contributor represents that the Contributor believes its +Contributions are its original creation(s) or it has sufficient rights +to grant the rights to its Contributions conveyed by this License. + +2.6. Fair Use + +This License is not intended to limit any rights You have under +applicable copyright doctrines of fair use, fair dealing, or other +equivalents. + +2.7. Conditions + +Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted +in Section 2.1. + +3. Responsibilities +------------------- + +3.1. Distribution of Source Form + +All distribution of Covered Software in Source Code Form, including any +Modifications that You create or to which You contribute, must be under +the terms of this License. You must inform recipients that the Source +Code Form of the Covered Software is governed by the terms of this +License, and how they can obtain a copy of this License. You may not +attempt to alter or restrict the recipients' rights in the Source Code +Form. + +3.2. Distribution of Executable Form + +If You distribute Covered Software in Executable Form then: + +(a) such Covered Software must also be made available in Source Code + Form, as described in Section 3.1, and You must inform recipients of + the Executable Form how they can obtain a copy of such Source Code + Form by reasonable means in a timely manner, at a charge no more + than the cost of distribution to the recipient; and + +(b) You may distribute such Executable Form under the terms of this + License, or sublicense it under different terms, provided that the + license for the Executable Form does not attempt to limit or alter + the recipients' rights in the Source Code Form under this License. + +3.3. Distribution of a Larger Work + +You may create and distribute a Larger Work under terms of Your choice, +provided that You also comply with the requirements of this License for +the Covered Software. If the Larger Work is a combination of Covered +Software with a work governed by one or more Secondary Licenses, and the +Covered Software is not Incompatible With Secondary Licenses, this +License permits You to additionally distribute such Covered Software +under the terms of such Secondary License(s), so that the recipient of +the Larger Work may, at their option, further distribute the Covered +Software under the terms of either this License or such Secondary +License(s). + +3.4. Notices + +You may not remove or alter the substance of any license notices +(including copyright notices, patent notices, disclaimers of warranty, +or limitations of liability) contained within the Source Code Form of +the Covered Software, except that You may alter any license notices to +the extent required to remedy known factual inaccuracies. + +3.5. Application of Additional Terms + +You may choose to offer, and to charge a fee for, warranty, support, +indemnity or liability obligations to one or more recipients of Covered +Software. However, You may do so only on Your own behalf, and not on +behalf of any Contributor. You must make it absolutely clear that any +such warranty, support, indemnity, or liability obligation is offered by +You alone, and You hereby agree to indemnify every Contributor for any +liability incurred by such Contributor as a result of warranty, support, +indemnity or liability terms You offer. You may include additional +disclaimers of warranty and limitations of liability specific to any +jurisdiction. + +4. Inability to Comply Due to Statute or Regulation +--------------------------------------------------- + +If it is impossible for You to comply with any of the terms of this +License with respect to some or all of the Covered Software due to +statute, judicial order, or regulation then You must: (a) comply with +the terms of this License to the maximum extent possible; and (b) +describe the limitations and the code they affect. Such description must +be placed in a text file included with all distributions of the Covered +Software under this License. Except to the extent prohibited by statute +or regulation, such description must be sufficiently detailed for a +recipient of ordinary skill to be able to understand it. + +5. Termination +-------------- + +5.1. The rights granted under this License will terminate automatically +if You fail to comply with any of its terms. However, if You become +compliant, then the rights granted under this License from a particular +Contributor are reinstated (a) provisionally, unless and until such +Contributor explicitly and finally terminates Your grants, and (b) on an +ongoing basis, if such Contributor fails to notify You of the +non-compliance by some reasonable means prior to 60 days after You have +come back into compliance. Moreover, Your grants from a particular +Contributor are reinstated on an ongoing basis if such Contributor +notifies You of the non-compliance by some reasonable means, this is the +first time You have received notice of non-compliance with this License +from such Contributor, and You become compliant prior to 30 days after +Your receipt of the notice. + +5.2. If You initiate litigation against any entity by asserting a patent +infringement claim (excluding declaratory judgment actions, +counter-claims, and cross-claims) alleging that a Contributor Version +directly or indirectly infringes any patent, then the rights granted to +You by any and all Contributors for the Covered Software under Section +2.1 of this License shall terminate. + +5.3. In the event of termination under Sections 5.1 or 5.2 above, all +end user license agreements (excluding distributors and resellers) which +have been validly granted by You or Your distributors under this License +prior to termination shall survive termination. + +************************************************************************ +* * +* 6. Disclaimer of Warranty * +* ------------------------- * +* * +* Covered Software is provided under this License on an "as is" * +* basis, without warranty of any kind, either expressed, implied, or * +* statutory, including, without limitation, warranties that the * +* Covered Software is free of defects, merchantable, fit for a * +* particular purpose or non-infringing. The entire risk as to the * +* quality and performance of the Covered Software is with You. * +* Should any Covered Software prove defective in any respect, You * +* (not any Contributor) assume the cost of any necessary servicing, * +* repair, or correction. This disclaimer of warranty constitutes an * +* essential part of this License. No use of any Covered Software is * +* authorized under this License except under this disclaimer. * +* * +************************************************************************ + +************************************************************************ +* * +* 7. Limitation of Liability * +* -------------------------- * +* * +* Under no circumstances and under no legal theory, whether tort * +* (including negligence), contract, or otherwise, shall any * +* Contributor, or anyone who distributes Covered Software as * +* permitted above, be liable to You for any direct, indirect, * +* special, incidental, or consequential damages of any character * +* including, without limitation, damages for lost profits, loss of * +* goodwill, work stoppage, computer failure or malfunction, or any * +* and all other commercial damages or losses, even if such party * +* shall have been informed of the possibility of such damages. This * +* limitation of liability shall not apply to liability for death or * +* personal injury resulting from such party's negligence to the * +* extent applicable law prohibits such limitation. Some * +* jurisdictions do not allow the exclusion or limitation of * +* incidental or consequential damages, so this exclusion and * +* limitation may not apply to You. * +* * +************************************************************************ + +8. Litigation +------------- + +Any litigation relating to this License may be brought only in the +courts of a jurisdiction where the defendant maintains its principal +place of business and such litigation shall be governed by laws of that +jurisdiction, without reference to its conflict-of-law provisions. +Nothing in this Section shall prevent a party's ability to bring +cross-claims or counter-claims. + +9. Miscellaneous +---------------- + +This License represents the complete agreement concerning the subject +matter hereof. If any provision of this License is held to be +unenforceable, such provision shall be reformed only to the extent +necessary to make it enforceable. Any law or regulation which provides +that the language of a contract shall be construed against the drafter +shall not be used to construe this License against a Contributor. + +10. Versions of the License +--------------------------- + +10.1. New Versions + +Mozilla Foundation is the license steward. Except as provided in Section +10.3, no one other than the license steward has the right to modify or +publish new versions of this License. Each version will be given a +distinguishing version number. + +10.2. Effect of New Versions + +You may distribute the Covered Software under the terms of the version +of the License under which You originally received the Covered Software, +or under the terms of any subsequent version published by the license +steward. + +10.3. Modified Versions + +If you create software not governed by this License, and you want to +create a new license for such software, you may create and use a +modified version of this License if you rename the license and remove +any references to the name of the license steward (except to note that +such modified license differs from this License). + +10.4. Distributing Source Code Form that is Incompatible With Secondary +Licenses + +If You choose to distribute Source Code Form that is Incompatible With +Secondary Licenses under the terms of this version of the License, the +notice described in Exhibit B of this License must be attached. + +Exhibit A - Source Code Form License Notice +------------------------------------------- + + This Source Code Form is subject to the terms of the Mozilla Public + License, v. 2.0. If a copy of the MPL was not distributed with this + file, You can obtain one at http://mozilla.org/MPL/2.0/. + +If it is not possible or desirable to put the notice in a particular +file, then You may include the notice in a location (such as a LICENSE +file in a relevant directory) where a recipient would be likely to look +for such a notice. + +You may add additional accurate notices of copyright ownership. + +Exhibit B - "Incompatible With Secondary Licenses" Notice +--------------------------------------------------------- + + This Source Code Form is "Incompatible With Secondary Licenses", as + defined by the Mozilla Public License, v. 2.0. diff --git a/deno/LICENSES/AGPL-3.0-or-later.txt b/deno/LICENSES/AGPL-3.0-or-later.txt new file mode 100644 index 0000000..be3f7b2 --- /dev/null +++ b/deno/LICENSES/AGPL-3.0-or-later.txt @@ -0,0 +1,661 @@ + GNU AFFERO GENERAL PUBLIC LICENSE + Version 3, 19 November 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU Affero General Public License is a free, copyleft license for +software and other kinds of works, specifically designed to ensure +cooperation with the community in the case of network server software. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +our General Public Licenses are intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + Developers that use our General Public Licenses protect your rights +with two steps: (1) assert copyright on the software, and (2) offer +you this License which gives you legal permission to copy, distribute +and/or modify the software. + + A secondary benefit of defending all users' freedom is that +improvements made in alternate versions of the program, if they +receive widespread use, become available for other developers to +incorporate. Many developers of free software are heartened and +encouraged by the resulting cooperation. However, in the case of +software used on network servers, this result may fail to come about. +The GNU General Public License permits making a modified version and +letting the public access it on a server without ever releasing its +source code to the public. + + The GNU Affero General Public License is designed specifically to +ensure that, in such cases, the modified source code becomes available +to the community. It requires the operator of a network server to +provide the source code of the modified version running there to the +users of that server. Therefore, public use of a modified version, on +a publicly accessible server, gives the public access to the source +code of the modified version. + + An older license, called the Affero General Public License and +published by Affero, was designed to accomplish similar goals. This is +a different license, not a version of the Affero GPL, but Affero has +released a new version of the Affero GPL which permits relicensing under +this license. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU Affero General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Remote Network Interaction; Use with the GNU General Public License. + + Notwithstanding any other provision of this License, if you modify the +Program, your modified version must prominently offer all users +interacting with it remotely through a computer network (if your version +supports such interaction) an opportunity to receive the Corresponding +Source of your version by providing access to the Corresponding Source +from a network server at no charge, through some standard or customary +means of facilitating copying of software. This Corresponding Source +shall include the Corresponding Source for any work covered by version 3 +of the GNU General Public License that is incorporated pursuant to the +following paragraph. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the work with which it is combined will remain governed by version +3 of the GNU General Public License. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU Affero General Public License from time to time. Such new versions +will be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU Affero General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU Affero General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU Affero General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If your software can interact with users remotely through a computer +network, you should also make sure that it provides a way for users to +get its source. For example, if your program is a web application, its +interface could display a "Source" link that leads users to an archive +of the code. There are many ways you could offer source, and different +solutions will be better for different programs; see section 13 for the +specific requirements. + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU AGPL, see +. diff --git a/deno/LICENSES/CC-BY-SA-4.0.txt b/deno/LICENSES/CC-BY-SA-4.0.txt new file mode 100644 index 0000000..2d58298 --- /dev/null +++ b/deno/LICENSES/CC-BY-SA-4.0.txt @@ -0,0 +1,428 @@ +Attribution-ShareAlike 4.0 International + +======================================================================= + +Creative Commons Corporation ("Creative Commons") is not a law firm and +does not provide legal services or legal advice. Distribution of +Creative Commons public licenses does not create a lawyer-client or +other relationship. Creative Commons makes its licenses and related +information available on an "as-is" basis. Creative Commons gives no +warranties regarding its licenses, any material licensed under their +terms and conditions, or any related information. Creative Commons +disclaims all liability for damages resulting from their use to the +fullest extent possible. + +Using Creative Commons Public Licenses + +Creative Commons public licenses provide a standard set of terms and +conditions that creators and other rights holders may use to share +original works of authorship and other material subject to copyright +and certain other rights specified in the public license below. The +following considerations are for informational purposes only, are not +exhaustive, and do not form part of our licenses. + + Considerations for licensors: Our public licenses are + intended for use by those authorized to give the public + permission to use material in ways otherwise restricted by + copyright and certain other rights. Our licenses are + irrevocable. Licensors should read and understand the terms + and conditions of the license they choose before applying it. + Licensors should also secure all rights necessary before + applying our licenses so that the public can reuse the + material as expected. Licensors should clearly mark any + material not subject to the license. This includes other CC- + licensed material, or material used under an exception or + limitation to copyright. More considerations for licensors: + wiki.creativecommons.org/Considerations_for_licensors + + Considerations for the public: By using one of our public + licenses, a licensor grants the public permission to use the + licensed material under specified terms and conditions. If + the licensor's permission is not necessary for any reason--for + example, because of any applicable exception or limitation to + copyright--then that use is not regulated by the license. Our + licenses grant only permissions under copyright and certain + other rights that a licensor has authority to grant. Use of + the licensed material may still be restricted for other + reasons, including because others have copyright or other + rights in the material. A licensor may make special requests, + such as asking that all changes be marked or described. + Although not required by our licenses, you are encouraged to + respect those requests where reasonable. More considerations + for the public: + wiki.creativecommons.org/Considerations_for_licensees + +======================================================================= + +Creative Commons Attribution-ShareAlike 4.0 International Public +License + +By exercising the Licensed Rights (defined below), You accept and agree +to be bound by the terms and conditions of this Creative Commons +Attribution-ShareAlike 4.0 International Public License ("Public +License"). To the extent this Public License may be interpreted as a +contract, You are granted the Licensed Rights in consideration of Your +acceptance of these terms and conditions, and the Licensor grants You +such rights in consideration of benefits the Licensor receives from +making the Licensed Material available under these terms and +conditions. + + +Section 1 -- Definitions. + + a. Adapted Material means material subject to Copyright and Similar + Rights that is derived from or based upon the Licensed Material + and in which the Licensed Material is translated, altered, + arranged, transformed, or otherwise modified in a manner requiring + permission under the Copyright and Similar Rights held by the + Licensor. For purposes of this Public License, where the Licensed + Material is a musical work, performance, or sound recording, + Adapted Material is always produced where the Licensed Material is + synched in timed relation with a moving image. + + b. Adapter's License means the license You apply to Your Copyright + and Similar Rights in Your contributions to Adapted Material in + accordance with the terms and conditions of this Public License. + + c. BY-SA Compatible License means a license listed at + creativecommons.org/compatiblelicenses, approved by Creative + Commons as essentially the equivalent of this Public License. + + d. Copyright and Similar Rights means copyright and/or similar rights + closely related to copyright including, without limitation, + performance, broadcast, sound recording, and Sui Generis Database + Rights, without regard to how the rights are labeled or + categorized. For purposes of this Public License, the rights + specified in Section 2(b)(1)-(2) are not Copyright and Similar + Rights. + + e. Effective Technological Measures means those measures that, in the + absence of proper authority, may not be circumvented under laws + fulfilling obligations under Article 11 of the WIPO Copyright + Treaty adopted on December 20, 1996, and/or similar international + agreements. + + f. Exceptions and Limitations means fair use, fair dealing, and/or + any other exception or limitation to Copyright and Similar Rights + that applies to Your use of the Licensed Material. + + g. License Elements means the license attributes listed in the name + of a Creative Commons Public License. The License Elements of this + Public License are Attribution and ShareAlike. + + h. Licensed Material means the artistic or literary work, database, + or other material to which the Licensor applied this Public + License. + + i. Licensed Rights means the rights granted to You subject to the + terms and conditions of this Public License, which are limited to + all Copyright and Similar Rights that apply to Your use of the + Licensed Material and that the Licensor has authority to license. + + j. Licensor means the individual(s) or entity(ies) granting rights + under this Public License. + + k. Share means to provide material to the public by any means or + process that requires permission under the Licensed Rights, such + as reproduction, public display, public performance, distribution, + dissemination, communication, or importation, and to make material + available to the public including in ways that members of the + public may access the material from a place and at a time + individually chosen by them. + + l. Sui Generis Database Rights means rights other than copyright + resulting from Directive 96/9/EC of the European Parliament and of + the Council of 11 March 1996 on the legal protection of databases, + as amended and/or succeeded, as well as other essentially + equivalent rights anywhere in the world. + + m. You means the individual or entity exercising the Licensed Rights + under this Public License. Your has a corresponding meaning. + + +Section 2 -- Scope. + + a. License grant. + + 1. Subject to the terms and conditions of this Public License, + the Licensor hereby grants You a worldwide, royalty-free, + non-sublicensable, non-exclusive, irrevocable license to + exercise the Licensed Rights in the Licensed Material to: + + a. reproduce and Share the Licensed Material, in whole or + in part; and + + b. produce, reproduce, and Share Adapted Material. + + 2. Exceptions and Limitations. For the avoidance of doubt, where + Exceptions and Limitations apply to Your use, this Public + License does not apply, and You do not need to comply with + its terms and conditions. + + 3. Term. The term of this Public License is specified in Section + 6(a). + + 4. Media and formats; technical modifications allowed. The + Licensor authorizes You to exercise the Licensed Rights in + all media and formats whether now known or hereafter created, + and to make technical modifications necessary to do so. The + Licensor waives and/or agrees not to assert any right or + authority to forbid You from making technical modifications + necessary to exercise the Licensed Rights, including + technical modifications necessary to circumvent Effective + Technological Measures. For purposes of this Public License, + simply making modifications authorized by this Section 2(a) + (4) never produces Adapted Material. + + 5. Downstream recipients. + + a. Offer from the Licensor -- Licensed Material. Every + recipient of the Licensed Material automatically + receives an offer from the Licensor to exercise the + Licensed Rights under the terms and conditions of this + Public License. + + b. Additional offer from the Licensor -- Adapted Material. + Every recipient of Adapted Material from You + automatically receives an offer from the Licensor to + exercise the Licensed Rights in the Adapted Material + under the conditions of the Adapter's License You apply. + + c. No downstream restrictions. You may not offer or impose + any additional or different terms or conditions on, or + apply any Effective Technological Measures to, the + Licensed Material if doing so restricts exercise of the + Licensed Rights by any recipient of the Licensed + Material. + + 6. No endorsement. Nothing in this Public License constitutes or + may be construed as permission to assert or imply that You + are, or that Your use of the Licensed Material is, connected + with, or sponsored, endorsed, or granted official status by, + the Licensor or others designated to receive attribution as + provided in Section 3(a)(1)(A)(i). + + b. Other rights. + + 1. Moral rights, such as the right of integrity, are not + licensed under this Public License, nor are publicity, + privacy, and/or other similar personality rights; however, to + the extent possible, the Licensor waives and/or agrees not to + assert any such rights held by the Licensor to the limited + extent necessary to allow You to exercise the Licensed + Rights, but not otherwise. + + 2. Patent and trademark rights are not licensed under this + Public License. + + 3. To the extent possible, the Licensor waives any right to + collect royalties from You for the exercise of the Licensed + Rights, whether directly or through a collecting society + under any voluntary or waivable statutory or compulsory + licensing scheme. In all other cases the Licensor expressly + reserves any right to collect such royalties. + + +Section 3 -- License Conditions. + +Your exercise of the Licensed Rights is expressly made subject to the +following conditions. + + a. Attribution. + + 1. If You Share the Licensed Material (including in modified + form), You must: + + a. retain the following if it is supplied by the Licensor + with the Licensed Material: + + i. identification of the creator(s) of the Licensed + Material and any others designated to receive + attribution, in any reasonable manner requested by + the Licensor (including by pseudonym if + designated); + + ii. a copyright notice; + + iii. a notice that refers to this Public License; + + iv. a notice that refers to the disclaimer of + warranties; + + v. a URI or hyperlink to the Licensed Material to the + extent reasonably practicable; + + b. indicate if You modified the Licensed Material and + retain an indication of any previous modifications; and + + c. indicate the Licensed Material is licensed under this + Public License, and include the text of, or the URI or + hyperlink to, this Public License. + + 2. You may satisfy the conditions in Section 3(a)(1) in any + reasonable manner based on the medium, means, and context in + which You Share the Licensed Material. For example, it may be + reasonable to satisfy the conditions by providing a URI or + hyperlink to a resource that includes the required + information. + + 3. If requested by the Licensor, You must remove any of the + information required by Section 3(a)(1)(A) to the extent + reasonably practicable. + + b. ShareAlike. + + In addition to the conditions in Section 3(a), if You Share + Adapted Material You produce, the following conditions also apply. + + 1. The Adapter's License You apply must be a Creative Commons + license with the same License Elements, this version or + later, or a BY-SA Compatible License. + + 2. You must include the text of, or the URI or hyperlink to, the + Adapter's License You apply. You may satisfy this condition + in any reasonable manner based on the medium, means, and + context in which You Share Adapted Material. + + 3. You may not offer or impose any additional or different terms + or conditions on, or apply any Effective Technological + Measures to, Adapted Material that restrict exercise of the + rights granted under the Adapter's License You apply. + + +Section 4 -- Sui Generis Database Rights. + +Where the Licensed Rights include Sui Generis Database Rights that +apply to Your use of the Licensed Material: + + a. for the avoidance of doubt, Section 2(a)(1) grants You the right + to extract, reuse, reproduce, and Share all or a substantial + portion of the contents of the database; + + b. if You include all or a substantial portion of the database + contents in a database in which You have Sui Generis Database + Rights, then the database in which You have Sui Generis Database + Rights (but not its individual contents) is Adapted Material, + including for purposes of Section 3(b); and + + c. You must comply with the conditions in Section 3(a) if You Share + all or a substantial portion of the contents of the database. + +For the avoidance of doubt, this Section 4 supplements and does not +replace Your obligations under this Public License where the Licensed +Rights include other Copyright and Similar Rights. + + +Section 5 -- Disclaimer of Warranties and Limitation of Liability. + + a. UNLESS OTHERWISE SEPARATELY UNDERTAKEN BY THE LICENSOR, TO THE + EXTENT POSSIBLE, THE LICENSOR OFFERS THE LICENSED MATERIAL AS-IS + AND AS-AVAILABLE, AND MAKES NO REPRESENTATIONS OR WARRANTIES OF + ANY KIND CONCERNING THE LICENSED MATERIAL, WHETHER EXPRESS, + IMPLIED, STATUTORY, OR OTHER. THIS INCLUDES, WITHOUT LIMITATION, + WARRANTIES OF TITLE, MERCHANTABILITY, FITNESS FOR A PARTICULAR + PURPOSE, NON-INFRINGEMENT, ABSENCE OF LATENT OR OTHER DEFECTS, + ACCURACY, OR THE PRESENCE OR ABSENCE OF ERRORS, WHETHER OR NOT + KNOWN OR DISCOVERABLE. WHERE DISCLAIMERS OF WARRANTIES ARE NOT + ALLOWED IN FULL OR IN PART, THIS DISCLAIMER MAY NOT APPLY TO YOU. + + b. TO THE EXTENT POSSIBLE, IN NO EVENT WILL THE LICENSOR BE LIABLE + TO YOU ON ANY LEGAL THEORY (INCLUDING, WITHOUT LIMITATION, + NEGLIGENCE) OR OTHERWISE FOR ANY DIRECT, SPECIAL, INDIRECT, + INCIDENTAL, CONSEQUENTIAL, PUNITIVE, EXEMPLARY, OR OTHER LOSSES, + COSTS, EXPENSES, OR DAMAGES ARISING OUT OF THIS PUBLIC LICENSE OR + USE OF THE LICENSED MATERIAL, EVEN IF THE LICENSOR HAS BEEN + ADVISED OF THE POSSIBILITY OF SUCH LOSSES, COSTS, EXPENSES, OR + DAMAGES. WHERE A LIMITATION OF LIABILITY IS NOT ALLOWED IN FULL OR + IN PART, THIS LIMITATION MAY NOT APPLY TO YOU. + + c. The disclaimer of warranties and limitation of liability provided + above shall be interpreted in a manner that, to the extent + possible, most closely approximates an absolute disclaimer and + waiver of all liability. + + +Section 6 -- Term and Termination. + + a. This Public License applies for the term of the Copyright and + Similar Rights licensed here. However, if You fail to comply with + this Public License, then Your rights under this Public License + terminate automatically. + + b. Where Your right to use the Licensed Material has terminated under + Section 6(a), it reinstates: + + 1. automatically as of the date the violation is cured, provided + it is cured within 30 days of Your discovery of the + violation; or + + 2. upon express reinstatement by the Licensor. + + For the avoidance of doubt, this Section 6(b) does not affect any + right the Licensor may have to seek remedies for Your violations + of this Public License. + + c. For the avoidance of doubt, the Licensor may also offer the + Licensed Material under separate terms or conditions or stop + distributing the Licensed Material at any time; however, doing so + will not terminate this Public License. + + d. Sections 1, 5, 6, 7, and 8 survive termination of this Public + License. + + +Section 7 -- Other Terms and Conditions. + + a. The Licensor shall not be bound by any additional or different + terms or conditions communicated by You unless expressly agreed. + + b. Any arrangements, understandings, or agreements regarding the + Licensed Material not stated herein are separate from and + independent of the terms and conditions of this Public License. + + +Section 8 -- Interpretation. + + a. For the avoidance of doubt, this Public License does not, and + shall not be interpreted to, reduce, limit, restrict, or impose + conditions on any use of the Licensed Material that could lawfully + be made without permission under this Public License. + + b. To the extent possible, if any provision of this Public License is + deemed unenforceable, it shall be automatically reformed to the + minimum extent necessary to make it enforceable. If the provision + cannot be reformed, it shall be severed from this Public License + without affecting the enforceability of the remaining terms and + conditions. + + c. No term or condition of this Public License will be waived and no + failure to comply consented to unless expressly agreed to by the + Licensor. + + d. Nothing in this Public License constitutes or may be interpreted + as a limitation upon, or waiver of, any privileges and immunities + that apply to the Licensor or You, including from the legal + processes of any jurisdiction or authority. + + +======================================================================= + +Creative Commons is not a party to its public +licenses. Notwithstanding, Creative Commons may elect to apply one of +its public licenses to material it publishes and in those instances +will be considered the “Licensor.” The text of the Creative Commons +public licenses is dedicated to the public domain under the CC0 Public +Domain Dedication. Except for the limited purpose of indicating that +material is shared under a Creative Commons public license or as +otherwise permitted by the Creative Commons policies published at +creativecommons.org/policies, Creative Commons does not authorize the +use of the trademark "Creative Commons" or any other trademark or logo +of Creative Commons without its prior written consent including, +without limitation, in connection with any unauthorized modifications +to any of its public licenses or any other arrangements, +understandings, or agreements concerning use of licensed material. For +the avoidance of doubt, this paragraph does not form part of the +public licenses. + +Creative Commons may be contacted at creativecommons.org. + diff --git a/deno/LICENSES/MPL-2.0.txt b/deno/LICENSES/MPL-2.0.txt new file mode 100644 index 0000000..d0a1fa1 --- /dev/null +++ b/deno/LICENSES/MPL-2.0.txt @@ -0,0 +1,373 @@ +Mozilla Public License Version 2.0 +================================== + +1. Definitions +-------------- + +1.1. "Contributor" + means each individual or legal entity that creates, contributes to + the creation of, or owns Covered Software. + +1.2. "Contributor Version" + means the combination of the Contributions of others (if any) used + by a Contributor and that particular Contributor's Contribution. + +1.3. "Contribution" + means Covered Software of a particular Contributor. + +1.4. "Covered Software" + means Source Code Form to which the initial Contributor has attached + the notice in Exhibit A, the Executable Form of such Source Code + Form, and Modifications of such Source Code Form, in each case + including portions thereof. + +1.5. "Incompatible With Secondary Licenses" + means + + (a) that the initial Contributor has attached the notice described + in Exhibit B to the Covered Software; or + + (b) that the Covered Software was made available under the terms of + version 1.1 or earlier of the License, but not also under the + terms of a Secondary License. + +1.6. "Executable Form" + means any form of the work other than Source Code Form. + +1.7. "Larger Work" + means a work that combines Covered Software with other material, in + a separate file or files, that is not Covered Software. + +1.8. "License" + means this document. + +1.9. "Licensable" + means having the right to grant, to the maximum extent possible, + whether at the time of the initial grant or subsequently, any and + all of the rights conveyed by this License. + +1.10. "Modifications" + means any of the following: + + (a) any file in Source Code Form that results from an addition to, + deletion from, or modification of the contents of Covered + Software; or + + (b) any new file in Source Code Form that contains any Covered + Software. + +1.11. "Patent Claims" of a Contributor + means any patent claim(s), including without limitation, method, + process, and apparatus claims, in any patent Licensable by such + Contributor that would be infringed, but for the grant of the + License, by the making, using, selling, offering for sale, having + made, import, or transfer of either its Contributions or its + Contributor Version. + +1.12. "Secondary License" + means either the GNU General Public License, Version 2.0, the GNU + Lesser General Public License, Version 2.1, the GNU Affero General + Public License, Version 3.0, or any later versions of those + licenses. + +1.13. "Source Code Form" + means the form of the work preferred for making modifications. + +1.14. "You" (or "Your") + means an individual or a legal entity exercising rights under this + License. For legal entities, "You" includes any entity that + controls, is controlled by, or is under common control with You. For + purposes of this definition, "control" means (a) the power, direct + or indirect, to cause the direction or management of such entity, + whether by contract or otherwise, or (b) ownership of more than + fifty percent (50%) of the outstanding shares or beneficial + ownership of such entity. + +2. License Grants and Conditions +-------------------------------- + +2.1. Grants + +Each Contributor hereby grants You a world-wide, royalty-free, +non-exclusive license: + +(a) under intellectual property rights (other than patent or trademark) + Licensable by such Contributor to use, reproduce, make available, + modify, display, perform, distribute, and otherwise exploit its + Contributions, either on an unmodified basis, with Modifications, or + as part of a Larger Work; and + +(b) under Patent Claims of such Contributor to make, use, sell, offer + for sale, have made, import, and otherwise transfer either its + Contributions or its Contributor Version. + +2.2. Effective Date + +The licenses granted in Section 2.1 with respect to any Contribution +become effective for each Contribution on the date the Contributor first +distributes such Contribution. + +2.3. Limitations on Grant Scope + +The licenses granted in this Section 2 are the only rights granted under +this License. No additional rights or licenses will be implied from the +distribution or licensing of Covered Software under this License. +Notwithstanding Section 2.1(b) above, no patent license is granted by a +Contributor: + +(a) for any code that a Contributor has removed from Covered Software; + or + +(b) for infringements caused by: (i) Your and any other third party's + modifications of Covered Software, or (ii) the combination of its + Contributions with other software (except as part of its Contributor + Version); or + +(c) under Patent Claims infringed by Covered Software in the absence of + its Contributions. + +This License does not grant any rights in the trademarks, service marks, +or logos of any Contributor (except as may be necessary to comply with +the notice requirements in Section 3.4). + +2.4. Subsequent Licenses + +No Contributor makes additional grants as a result of Your choice to +distribute the Covered Software under a subsequent version of this +License (see Section 10.2) or under the terms of a Secondary License (if +permitted under the terms of Section 3.3). + +2.5. Representation + +Each Contributor represents that the Contributor believes its +Contributions are its original creation(s) or it has sufficient rights +to grant the rights to its Contributions conveyed by this License. + +2.6. Fair Use + +This License is not intended to limit any rights You have under +applicable copyright doctrines of fair use, fair dealing, or other +equivalents. + +2.7. Conditions + +Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted +in Section 2.1. + +3. Responsibilities +------------------- + +3.1. Distribution of Source Form + +All distribution of Covered Software in Source Code Form, including any +Modifications that You create or to which You contribute, must be under +the terms of this License. You must inform recipients that the Source +Code Form of the Covered Software is governed by the terms of this +License, and how they can obtain a copy of this License. You may not +attempt to alter or restrict the recipients' rights in the Source Code +Form. + +3.2. Distribution of Executable Form + +If You distribute Covered Software in Executable Form then: + +(a) such Covered Software must also be made available in Source Code + Form, as described in Section 3.1, and You must inform recipients of + the Executable Form how they can obtain a copy of such Source Code + Form by reasonable means in a timely manner, at a charge no more + than the cost of distribution to the recipient; and + +(b) You may distribute such Executable Form under the terms of this + License, or sublicense it under different terms, provided that the + license for the Executable Form does not attempt to limit or alter + the recipients' rights in the Source Code Form under this License. + +3.3. Distribution of a Larger Work + +You may create and distribute a Larger Work under terms of Your choice, +provided that You also comply with the requirements of this License for +the Covered Software. If the Larger Work is a combination of Covered +Software with a work governed by one or more Secondary Licenses, and the +Covered Software is not Incompatible With Secondary Licenses, this +License permits You to additionally distribute such Covered Software +under the terms of such Secondary License(s), so that the recipient of +the Larger Work may, at their option, further distribute the Covered +Software under the terms of either this License or such Secondary +License(s). + +3.4. Notices + +You may not remove or alter the substance of any license notices +(including copyright notices, patent notices, disclaimers of warranty, +or limitations of liability) contained within the Source Code Form of +the Covered Software, except that You may alter any license notices to +the extent required to remedy known factual inaccuracies. + +3.5. Application of Additional Terms + +You may choose to offer, and to charge a fee for, warranty, support, +indemnity or liability obligations to one or more recipients of Covered +Software. However, You may do so only on Your own behalf, and not on +behalf of any Contributor. You must make it absolutely clear that any +such warranty, support, indemnity, or liability obligation is offered by +You alone, and You hereby agree to indemnify every Contributor for any +liability incurred by such Contributor as a result of warranty, support, +indemnity or liability terms You offer. You may include additional +disclaimers of warranty and limitations of liability specific to any +jurisdiction. + +4. Inability to Comply Due to Statute or Regulation +--------------------------------------------------- + +If it is impossible for You to comply with any of the terms of this +License with respect to some or all of the Covered Software due to +statute, judicial order, or regulation then You must: (a) comply with +the terms of this License to the maximum extent possible; and (b) +describe the limitations and the code they affect. Such description must +be placed in a text file included with all distributions of the Covered +Software under this License. Except to the extent prohibited by statute +or regulation, such description must be sufficiently detailed for a +recipient of ordinary skill to be able to understand it. + +5. Termination +-------------- + +5.1. The rights granted under this License will terminate automatically +if You fail to comply with any of its terms. However, if You become +compliant, then the rights granted under this License from a particular +Contributor are reinstated (a) provisionally, unless and until such +Contributor explicitly and finally terminates Your grants, and (b) on an +ongoing basis, if such Contributor fails to notify You of the +non-compliance by some reasonable means prior to 60 days after You have +come back into compliance. Moreover, Your grants from a particular +Contributor are reinstated on an ongoing basis if such Contributor +notifies You of the non-compliance by some reasonable means, this is the +first time You have received notice of non-compliance with this License +from such Contributor, and You become compliant prior to 30 days after +Your receipt of the notice. + +5.2. If You initiate litigation against any entity by asserting a patent +infringement claim (excluding declaratory judgment actions, +counter-claims, and cross-claims) alleging that a Contributor Version +directly or indirectly infringes any patent, then the rights granted to +You by any and all Contributors for the Covered Software under Section +2.1 of this License shall terminate. + +5.3. In the event of termination under Sections 5.1 or 5.2 above, all +end user license agreements (excluding distributors and resellers) which +have been validly granted by You or Your distributors under this License +prior to termination shall survive termination. + +************************************************************************ +* * +* 6. Disclaimer of Warranty * +* ------------------------- * +* * +* Covered Software is provided under this License on an "as is" * +* basis, without warranty of any kind, either expressed, implied, or * +* statutory, including, without limitation, warranties that the * +* Covered Software is free of defects, merchantable, fit for a * +* particular purpose or non-infringing. The entire risk as to the * +* quality and performance of the Covered Software is with You. * +* Should any Covered Software prove defective in any respect, You * +* (not any Contributor) assume the cost of any necessary servicing, * +* repair, or correction. This disclaimer of warranty constitutes an * +* essential part of this License. No use of any Covered Software is * +* authorized under this License except under this disclaimer. * +* * +************************************************************************ + +************************************************************************ +* * +* 7. Limitation of Liability * +* -------------------------- * +* * +* Under no circumstances and under no legal theory, whether tort * +* (including negligence), contract, or otherwise, shall any * +* Contributor, or anyone who distributes Covered Software as * +* permitted above, be liable to You for any direct, indirect, * +* special, incidental, or consequential damages of any character * +* including, without limitation, damages for lost profits, loss of * +* goodwill, work stoppage, computer failure or malfunction, or any * +* and all other commercial damages or losses, even if such party * +* shall have been informed of the possibility of such damages. This * +* limitation of liability shall not apply to liability for death or * +* personal injury resulting from such party's negligence to the * +* extent applicable law prohibits such limitation. Some * +* jurisdictions do not allow the exclusion or limitation of * +* incidental or consequential damages, so this exclusion and * +* limitation may not apply to You. * +* * +************************************************************************ + +8. Litigation +------------- + +Any litigation relating to this License may be brought only in the +courts of a jurisdiction where the defendant maintains its principal +place of business and such litigation shall be governed by laws of that +jurisdiction, without reference to its conflict-of-law provisions. +Nothing in this Section shall prevent a party's ability to bring +cross-claims or counter-claims. + +9. Miscellaneous +---------------- + +This License represents the complete agreement concerning the subject +matter hereof. If any provision of this License is held to be +unenforceable, such provision shall be reformed only to the extent +necessary to make it enforceable. Any law or regulation which provides +that the language of a contract shall be construed against the drafter +shall not be used to construe this License against a Contributor. + +10. Versions of the License +--------------------------- + +10.1. New Versions + +Mozilla Foundation is the license steward. Except as provided in Section +10.3, no one other than the license steward has the right to modify or +publish new versions of this License. Each version will be given a +distinguishing version number. + +10.2. Effect of New Versions + +You may distribute the Covered Software under the terms of the version +of the License under which You originally received the Covered Software, +or under the terms of any subsequent version published by the license +steward. + +10.3. Modified Versions + +If you create software not governed by this License, and you want to +create a new license for such software, you may create and use a +modified version of this License if you rename the license and remove +any references to the name of the license steward (except to note that +such modified license differs from this License). + +10.4. Distributing Source Code Form that is Incompatible With Secondary +Licenses + +If You choose to distribute Source Code Form that is Incompatible With +Secondary Licenses under the terms of this version of the License, the +notice described in Exhibit B of this License must be attached. + +Exhibit A - Source Code Form License Notice +------------------------------------------- + + This Source Code Form is subject to the terms of the Mozilla Public + License, v. 2.0. If a copy of the MPL was not distributed with this + file, You can obtain one at https://mozilla.org/MPL/2.0/. + +If it is not possible or desirable to put the notice in a particular +file, then You may include the notice in a location (such as a LICENSE +file in a relevant directory) where a recipient would be likely to look +for such a notice. + +You may add additional accurate notices of copyright ownership. + +Exhibit B - "Incompatible With Secondary Licenses" Notice +--------------------------------------------------------- + + This Source Code Form is "Incompatible With Secondary Licenses", as + defined by the Mozilla Public License, v. 2.0. diff --git a/deno/MAINTAINERS b/deno/MAINTAINERS new file mode 100644 index 0000000..37f6411 --- /dev/null +++ b/deno/MAINTAINERS @@ -0,0 +1,43 @@ +# Maintainers + +This file lists the current maintainers of this project. + +## Active Maintainers + +| Name | GitHub | Role | Since | +|------|--------|------|-------| +| Metadatastician | @metadatastician | Primary | Project Start | + +## Emeritus Maintainers + +None at this time. + +## Becoming a Maintainer + +To become a maintainer: + +1. Demonstrate consistent, high-quality contributions +2. Show understanding of the project's goals and architecture +3. Be active in code reviews and community discussions +4. Be nominated by an existing maintainer +5. Be approved by consensus of existing maintainers + +## Maintainer Responsibilities + +- Reviewing and merging pull requests +- Managing releases +- Triaging issues +- Enforcing code standards +- Mentoring new contributors +- Participating in decision-making + +## Maintainer Expectations + +- Respond to issues and PRs in a timely manner +- Follow the code of conduct +- Be transparent in decision-making +- Communicate clearly and respectfully + +--- + +*Last updated: 2026-07-18* diff --git a/deno/PROOF-NEEDS.md b/deno/PROOF-NEEDS.md new file mode 100644 index 0000000..967f815 --- /dev/null +++ b/deno/PROOF-NEEDS.md @@ -0,0 +1,23 @@ +# Proof Requirements + +## Current state +- ABI directory exists (template-level) +- No dangerous patterns found +- 2.2K lines; ReScript-based A2ML parser with trust-level hierarchy + +## What needs proving +- **Trust-level ordering**: Prove the trust hierarchy (Unverified < Automated < Reviewed < Verified) forms a total order and that attestation operations never silently upgrade trust level +- **Parser round-trip**: Prove parse-then-render produces semantically equivalent A2ML (no silent attribute loss) +- **Attestation chain validity**: Prove attestation chains cannot be forged or reordered without detection + +## Recommended prover +- **Idris2** — Trust-level lattice is a natural fit for dependent types with `DecEq` and `Ord` proofs + +## Priority +- **LOW** — A2ML is a markup format, not safety-critical infrastructure. However, if attestation trust levels are relied upon by downstream security decisions (e.g., Hypatia), the trust-level ordering proof becomes MEDIUM priority. + +## Template ABI Cleanup (2026-03-29) + +Template ABI removed -- was creating false impression of formal verification. +The removed files (Types.idr, Layout.idr, Foreign.idr) contained only RSR template +scaffolding with unresolved {{PROJECT}}/{{AUTHOR}} placeholders and no domain-specific proofs. diff --git a/deno/QUICKSTART-DEV.adoc b/deno/QUICKSTART-DEV.adoc new file mode 100644 index 0000000..051a290 --- /dev/null +++ b/deno/QUICKSTART-DEV.adoc @@ -0,0 +1,39 @@ += A2Ml Deno — Developer Quickstart +:toc: preamble + +Clone, build, test, contribute. + +== Prerequisites + +* Git 2.40+ +* just (command runner) +* See `just doctor` output for language-specific requirements + +== Setup + +[source,bash] +---- +git clone https://github.com/hyperpolymath/a2ml-deno +cd a2ml-deno +just doctor # verify toolchain +just heal # auto-install missing tools +---- + +== Development Workflow + +[source,bash] +---- +just tour # understand the codebase +just help-me # see available commands +---- + +== Before Committing + +[source,bash] +---- +just assail # run panic-attacker security scan +---- + +== Contributing + +See link:CONTRIBUTING.md[CONTRIBUTING.md] for guidelines. diff --git a/deno/QUICKSTART-MAINTAINER.adoc b/deno/QUICKSTART-MAINTAINER.adoc new file mode 100644 index 0000000..e2176c2 --- /dev/null +++ b/deno/QUICKSTART-MAINTAINER.adoc @@ -0,0 +1,40 @@ += A2Ml Deno — Maintainer Quickstart +:toc: preamble + +Packaging, deployment, and release management. + +== Prerequisites + +* Git 2.40+ +* just (command runner) +* Familiarity with the project (run `just tour` first) + +== CI/CD + +This project uses GitHub Actions. Workflows are in `.github/workflows/`. + +Key workflows: + +* `hypatia-scan.yml` — Neurosymbolic security scanning +* `codeql.yml` — Code analysis +* `scorecard.yml` — OpenSSF Scorecard +* `mirror.yml` — GitLab/Bitbucket mirroring + +== Releasing + +1. Update version in project config +2. Update CHANGELOG.md +3. Tag: `git tag -s v` +4. Push: `git push origin main --tags` + +== Container Build (if applicable) + +[source,bash] +---- +podman build -f Containerfile -t a2ml-deno:latest . +---- + +== Mirrors + +This repo is mirrored to GitLab and Bitbucket (hyperpolymath accounts) +via the `mirror.yml` workflow. diff --git a/deno/QUICKSTART-USER.adoc b/deno/QUICKSTART-USER.adoc new file mode 100644 index 0000000..5a7c791 --- /dev/null +++ b/deno/QUICKSTART-USER.adoc @@ -0,0 +1,33 @@ += A2Ml Deno — User Quickstart +:toc: preamble + +Get up and running in 60 seconds. + +== Prerequisites + +* Git 2.40+ +* just (command runner) — https://just.systems + +== Install + +[source,bash] +---- +git clone https://github.com/hyperpolymath/a2ml-deno +cd a2ml-deno +just doctor # check toolchain +just heal # auto-install missing tools +---- + +== First Run + +[source,bash] +---- +just tour # guided project tour +just help-me # see common workflows +---- + +== Get Help + +* `just help-me` — common workflows +* `just doctor` — diagnose toolchain issues +* https://github.com/hyperpolymath/a2ml-deno/issues — report bugs diff --git a/deno/README.md b/deno/README.md new file mode 100644 index 0000000..5f2e84b --- /dev/null +++ b/deno/README.md @@ -0,0 +1,119 @@ + + +# Overview + +**Deno-native parser library for A2ML (Attested Markup Language), +written in ReScript.** + +A2ML is a structured markup language with built-in attestation +provenance, directive metadata, and trust-level tracking. This library +provides a complete parser and renderer for A2ML documents, compiled +from ReScript to JavaScript ES modules for use with Deno. + +# Features + +- Parse A2ML documents from strings or files + +- Render AST back to A2ML surface syntax (round-trip support) + +- Typed AST with variant types for blocks, inlines, directives, and + attestations + +- Trust-level hierarchy: Unverified, Automated, Reviewed, Verified + +- Directive blocks with key-value attributes + +- Attestation provenance chain + +- Zero dependencies beyond ReScript standard library + +# Quick Start + +```bash +# Build ReScript to JS +deno task build + +# Use in your Deno project +deno add jsr:@hyperpolymath/a2ml +``` + +```javascript +import { parse, render, parseErrorToString } from "@hyperpolymath/a2ml"; + +const result = parse("# Hello World\n\nSome **bold** text.\n"); +// result is Ok(document) or Error(parseError) +``` + +# Module Structure + +| Module | Purpose | +|----|----| +| `A2ML.res` | Main module — re-exports all public API | +| `A2ML_Types.res` | Core data types: document, block, inline, directive, attestation, trustLevel | +| `A2ML_Parser.res` | Line-oriented parser: A2ML text to typed AST | +| `A2ML_Renderer.res` | Renderer: typed AST back to A2ML text | + +# A2ML Syntax Reference + + # Heading + + Paragraph with **bold**, *italic*, `code`, [link](url), and @ref(id). + + @directive-name(key=val): single line value + + @multi-line: + Content spanning + multiple lines + @end + + !attest + identity: Jonathan D.A. Jewell + role: author + trust-level: verified + timestamp: 2026-03-16T00:00:00Z + !end + + - Bullet list item + - Another item + + > Block quote text + + ```rescript + let x = 42 + ``` + +# Development + +```bash +deno task build # Compile ReScript +deno task clean # Clean build artifacts +deno task test # Run tests +``` + +# Related Libraries + +- [a2ml-rs](https://github.com/hyperpolymath/a2ml-rs) — Rust + implementation + +- [a2ml-haskell](https://github.com/hyperpolymath/a2ml-haskell) — + Haskell implementation + +- [a2ml_gleam](https://github.com/hyperpolymath/a2ml_gleam) — Gleam + implementation + +- [tree-sitter-a2ml](https://github.com/hyperpolymath/tree-sitter-a2ml) + — Tree-sitter grammar + +- [vscode-a2ml](https://github.com/hyperpolymath/vscode-a2ml) — VS Code + extension + +# License + +SPDX-License-Identifier: CC-BY-SA-4.0 + +Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) + +See [LICENSE](LICENSE) for details. diff --git a/deno/ROADMAP.adoc b/deno/ROADMAP.adoc new file mode 100644 index 0000000..afb3e51 --- /dev/null +++ b/deno/ROADMAP.adoc @@ -0,0 +1,22 @@ +// SPDX-License-Identifier: CC-BY-SA-4.0 += A2ml Deno Roadmap + +== Current Status + +Initial development phase. + +== Milestones + +=== v0.1.0 - Foundation +* [ ] Core functionality +* [ ] Basic documentation +* [ ] CI/CD pipeline + +=== v1.0.0 - Stable Release +* [ ] Full feature set +* [ ] Comprehensive tests +* [ ] Production ready + +== Future Directions + +_To be determined based on community feedback._ diff --git a/deno/SECURITY.md b/deno/SECURITY.md new file mode 100644 index 0000000..5c4d5e9 --- /dev/null +++ b/deno/SECURITY.md @@ -0,0 +1,20 @@ + +# Security Policy + +## Reporting a Vulnerability + +If you discover a security vulnerability, please report it responsibly. + +**Email:** j.d.a.jewell@open.ac.uk + +**Please include:** +- Description of the vulnerability +- Steps to reproduce +- Potential impact + +**Response timeline:** +- Acknowledgement within 48 hours +- Initial assessment within 7 days +- Fix or mitigation within 90 days + +**Safe harbour:** We will not pursue legal action against security researchers who follow responsible disclosure. diff --git a/deno/TEST-NEEDS.md b/deno/TEST-NEEDS.md new file mode 100644 index 0000000..aa44712 --- /dev/null +++ b/deno/TEST-NEEDS.md @@ -0,0 +1,52 @@ +# Test & Benchmark Requirements + +## CRG Grade: C — ACHIEVED 2026-04-04 + +## Current State +- Unit tests: NONE (no Deno/ReScript test files found) +- Integration tests: 1 Zig integration test (ABI/FFI template) +- E2E tests: NONE +- Benchmarks: NONE (benchmark dir has only README placeholder) +- panic-attack scan: NEVER RUN (feature dir exists but no report) + +## What's Missing +### Point-to-Point (P2P) +- A2ML.res — no tests +- A2ML_Types.res — no tests +- A2ML_Parser.res — no tests +- A2ML_Renderer.res — no tests +- Zig FFI main.zig — only template integration test +- Idris2 ABI definitions (Types.idr, Layout.idr, Foreign.idr) — no verification tests + +### End-to-End (E2E) +- Parse A2ML document and verify output — not tested +- Render A2ML to output format — not tested +- Round-trip (parse then render) fidelity — not tested +- Error handling for malformed A2ML — not tested +- Deno runtime integration — not tested + +### Aspect Tests +- [ ] Security (input sanitisation for untrusted A2ML documents) +- [ ] Performance (parsing large A2ML documents) +- [ ] Concurrency (N/A for parser library) +- [ ] Error handling (malformed input, missing fields, invalid trust levels) +- [ ] Accessibility (N/A) + +### Build & Execution +- [ ] deno check — not verified +- [ ] deno test — not verified +- [ ] ReScript build — not verified +- [ ] Zig build — not verified +- [ ] Self-diagnostic — none + +### Benchmarks Needed +- Parse throughput vs a2ml-rs and a2ml_ex implementations +- Memory usage on large documents +- Zig FFI call overhead measurement + +### Self-Tests +- [ ] panic-attack assail on own repo +- [ ] Built-in doctor/check command (if applicable) + +## Priority +- **HIGH** — A2ML is a critical format in the ecosystem. 4 ReScript source files + 3 Idris2 ABI + 2 Zig FFI files with ZERO functional tests. The fuzz directory contains only a placeholder.txt. As a library consumed by other projects, this needs comprehensive tests. diff --git a/deno/TOPOLOGY.md b/deno/TOPOLOGY.md new file mode 100644 index 0000000..8126648 --- /dev/null +++ b/deno/TOPOLOGY.md @@ -0,0 +1,31 @@ + + +# TOPOLOGY.md — a2ml-deno + +## Purpose + +Deno-native parser and renderer for A2ML (Attested Markup Language), written in ReScript and compiled to JavaScript ES modules. Provides parse-render round-trip support for A2ML documents with trust-level hierarchy and directive blocks. Consumed by Deno runtimes and published to JSR. + +## Module Map + +``` +a2ml-deno/ +├── src/ +│ ├── A2ML.res # Main public API +│ ├── A2ML_Types.res # AST types (ReScript variants) +│ ├── A2ML_Parser.res # Document parser +│ ├── A2ML_Renderer.res # AST-to-surface renderer +│ └── (compiled .mjs files co-located) +├── examples/ # Usage examples +├── deno.json # Deno module config +├── jsr.json # JSR publication config +└── container/ # Containerfile for CI +``` + +## Data Flow + +``` +[A2ML text] ──► [A2ML_Parser] ──► [Typed AST] ──► [A2ML_Renderer] ──► [A2ML text] + │ + [A2ML_Types] +``` diff --git a/deno/container/.gatekeeper.yaml b/deno/container/.gatekeeper.yaml new file mode 100644 index 0000000..4aac671 --- /dev/null +++ b/deno/container/.gatekeeper.yaml @@ -0,0 +1,122 @@ +# SPDX-License-Identifier: MPL-2.0 +# +# Svalinn gatekeeper policy for {{PROJECT_NAME}} +# +# Controls which operations are permitted through the edge gateway. +# This template provides moderate security defaults — not wide-open test +# mode, but not production-hardened either. Tighten the values below +# before deploying to production. +# +# See: stapeln/container-stack/svalinn/ + +version: "1.0" + +# ============================================================================ +# Authentication +# ============================================================================ +# +# Define which endpoints require authentication and at what level. + +auth: + # Public endpoints — no authentication required. + # Health and readiness probes must always be public so that + # orchestrators (selur, Podman, k8s) can check service status. + public: + - path: "/health" + methods: ["GET"] + - path: "/ready" + methods: ["GET"] + - path: "/metrics" + methods: ["GET"] + + # Endpoints requiring JWT or OAuth2 authentication. + # Svalinn validates the token before forwarding the request. + authenticated: + - path: "/api/v1/*" + methods: ["GET", "POST", "PUT", "DELETE"] + +# ============================================================================ +# Rate Limiting +# ============================================================================ +# +# Protects backend services from overload. Values here are moderate +# defaults — adjust based on your service capacity. + +rate_limits: + # Global limit: applied to all authenticated clients. + global: + requests_per_second: 500 + burst: 1000 + + # Write operations: stricter limit to protect data stores. + writes: + paths: ["/api/v1/*"] + methods: ["POST", "PUT", "DELETE"] + requests_per_second: 100 + burst: 200 + +# ============================================================================ +# Container Trust +# ============================================================================ +# +# Svalinn verifies that all .ctp bundles in the stack are signed by +# trusted keys and carry the required attestations. + +trust: + # Only accept .ctp bundles signed by these keys. + trusted_signers: + - key_id: "{{SERVICE_NAME}}-release" + algorithm: "Ed25519" + public_key_file: "/etc/svalinn/keys/{{SERVICE_NAME}}-release.pub" + + # Require these attestations on all .ctp bundles. + required_attestations: + - "source-signature" + - "sbom-complete" + + # Reject unsigned or untrusted images. + reject_unsigned: true + +# ============================================================================ +# Request Validation +# ============================================================================ +# +# Input validation at the gateway layer — catches malformed requests +# before they reach the application. + +validation: + # Maximum request body size. + max_body_size: "8MB" + + # Reject requests with NaN or Infinity in numeric fields. + reject_nan_inf: true + + # Maximum result limit per list/search query. + max_result_limit: 500 + +# ============================================================================ +# CORS +# ============================================================================ +# +# Cross-Origin Resource Sharing policy. The defaults below allow all +# origins — restrict to your frontend domain(s) in production. + +cors: + allow_origins: ["*"] + allow_methods: ["GET", "POST", "PUT", "DELETE", "OPTIONS"] + allow_headers: ["Content-Type", "Authorization"] + max_age: 3600 + +# ============================================================================ +# Logging +# ============================================================================ +# +# Structured logging for svalinn itself. Audit paths log all requests +# (including body hashes) for post-incident investigation. + +logging: + format: "json" + level: "info" + # Log all write operations for audit trail. + audit_paths: + - "/api/v1/*" diff --git a/deno/container/0.1-AI-MANIFEST.a2ml b/deno/container/0.1-AI-MANIFEST.a2ml new file mode 100644 index 0000000..ccb5bc5 --- /dev/null +++ b/deno/container/0.1-AI-MANIFEST.a2ml @@ -0,0 +1,143 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "container-templates" +version: "1.0.0" +context: + - "https://a2ml.org/ns/v2" + - "https://stapeln.dev/ns/v1" + +--- +### [AI_MANIFEST] +description: | + Container templates for the stapeln container ecosystem. This directory + provides Podman-Chainguard-stapeln templates that are customised via + `just container-init` or `just init` during project bootstrap. + + All files use {{PLACEHOLDER}} tokens that are substituted with project- + specific values during initialisation. + +purpose: | + Provide a complete, security-first container deployment story for any + RSR-compliant repository. The templates cover the full lifecycle: + build, sign, verify, deploy, monitor, and govern. + +canonical_locations: + compose: "container/compose.toml" + containerfile: "container/Containerfile" + manifest: "container/manifest.toml" + gatekeeper: "container/.gatekeeper.yaml" + build_pipeline: "container/ct-build.sh" + entrypoint: "container/entrypoint.sh" + monitoring: "container/vordr.toml" + deployment: "container/deploy.k9.ncl" + example: "container/compose.example.toml" + +--- +### [FILE_RELATIONSHIPS] +files: + - name: "compose.toml" + role: "Orchestration" + description: | + selur-compose stack definition. Declares services, volumes, networks, + and health checks. References the Containerfile for image builds and + .gatekeeper.yaml for svalinn policy. + depends_on: ["Containerfile", ".gatekeeper.yaml"] + + - name: "Containerfile" + role: "Image Build" + description: | + Multi-stage OCI container build. Stage 1 compiles the application on + wolfi-base; Stage 2 copies the binary into a minimal runtime image. + Copies entrypoint.sh, .gatekeeper.yaml, and manifest.toml into the + final image. + depends_on: ["entrypoint.sh", ".gatekeeper.yaml", "manifest.toml"] + + - name: "manifest.toml" + role: "Bundle Metadata" + description: | + Cerro-torre .ctp bundle manifest. Describes provenance, dependencies, + attestations, and runtime security profile. Used by `ct pack` and + `ct verify`. + depends_on: [] + + - name: ".gatekeeper.yaml" + role: "Gateway Policy" + description: | + Svalinn edge gateway policy. Controls authentication, rate limiting, + container trust, request validation, CORS, and audit logging. + depends_on: [] + + - name: "ct-build.sh" + role: "Build Pipeline" + description: | + Shell script implementing the 5-stage pipeline: build (Podman), + pack (cerro-torre .ctp), sign (Ed25519), verify, push (optional). + Degrades gracefully when cerro-torre tools are not installed. + depends_on: ["Containerfile", "manifest.toml"] + + - name: "entrypoint.sh" + role: "Container Entrypoint" + description: | + Startup script with signal handling (SIGTERM, SIGINT), logging, and + exec into the main application process. + depends_on: [] + + - name: "vordr.toml" + role: "Runtime Monitoring" + description: | + Vordr monitoring configuration. Health endpoint probing, crash + detection, resource thresholds, and structured log output. + depends_on: [] + + - name: "deploy.k9.ncl" + role: "Deployment Component" + description: | + k9-svc deployment specification at Hunt trust level. Full pedigree + (L1-L5), environment configs, container config, and rolling + deployment strategy. + depends_on: ["compose.toml", "ct-build.sh"] + + - name: "compose.example.toml" + role: "Example" + description: | + Fully-commented multi-service example (Rust API + Elixir worker + + svalinn gateway). Copy to compose.toml and customise. + depends_on: [] + +--- +### [STAPELN_ECOSYSTEM] +overview: | + The stapeln container ecosystem comprises six tools: + + selur — Container orchestration with zero-copy IPC. Reads compose.toml. + cerro-torre — Verified container packaging (.ctp bundles), Ed25519 signing. + svalinn — Policy-driven edge gateway (auth, rate limits, CORS, trust). + vordr — Runtime monitoring (health, crashes, resources, logs). + rokur — Secrets management (runtime injection, no baked secrets). + k9-svc — Nickel deployment components (Kennel/Yard/Hunt trust levels). + +invariants: + - "Base images MUST be cgr.dev/chainguard/wolfi-base or cgr.dev/chainguard/static" + - "Container runtime is Podman — never Docker" + - "Containerfile — never Dockerfile" + - "All images run as non-root (appuser or project-specific user)" + - ".ctp bundles are signed with Ed25519 via cerro-torre" + - "Health endpoints (/health, /ready) must always be public (no auth)" + +--- +### [USAGE] +initialisation: | + Run `just container-init` to substitute all {{PLACEHOLDER}} tokens with + project-specific values. This is also run as part of `just init`. + +development: | + 1. `just container-build` — Build the container image + 2. `just container-verify` — Verify compose configuration + 3. `just container-up` — Start the stack locally + 4. `just container-down` — Stop the stack + +production: | + 1. `just container-sign` — Build, sign, verify .ctp bundle + 2. `just container-push` — Push signed bundle to registry + 3. `selur-compose up` — Deploy on target host diff --git a/deno/container/Containerfile b/deno/container/Containerfile new file mode 100644 index 0000000..ba85260 --- /dev/null +++ b/deno/container/Containerfile @@ -0,0 +1,136 @@ +# SPDX-License-Identifier: MPL-2.0 +# {{PROJECT_NAME}} Container Image +# +# Multi-stage build template for Chainguard Wolfi base images. +# Customise the builder stage for your language and copy the +# resulting binary/release into the minimal runtime stage. +# +# Build with Podman: +# podman build -t {{SERVICE_NAME}}:latest -f container/Containerfile . +# +# Run: +# podman run -p {{PORT}}:{{PORT}} {{SERVICE_NAME}}:latest +# +# Run with persistent volume: +# podman run -p {{PORT}}:{{PORT}} -v {{SERVICE_NAME}}-data:/data {{SERVICE_NAME}}:latest + +# ============================================================================ +# Stage 1: Builder +# ============================================================================ +# +# Install build tools and compile the application. +# This stage is discarded after the build — only the compiled output +# is copied into the runtime stage. +# +# Language-specific examples (uncomment the one you need): +# +# --- Rust --- +# RUN apk add --no-cache rust pkgconf build-base +# COPY Cargo.toml Cargo.lock ./ +# COPY src/ ./src/ +# RUN cargo build --release +# # Output: /build/target/release/{{SERVICE_NAME}} +# +# --- Elixir --- +# RUN apk add --no-cache erl27-elixir-1.18 erlang-27 erlang-27-dev git build-base +# COPY mix.exs mix.lock ./ +# COPY lib/ ./lib/ +# COPY config/ ./config/ +# ENV MIX_ENV=prod +# RUN mix local.hex --force && mix local.rebar --force && \ +# mix deps.get --only prod && mix compile && mix release +# # Output: /build/_build/prod/rel/{{SERVICE_NAME}}/ +# +# --- Zig --- +# RUN apk add --no-cache zig build-base +# COPY build.zig build.zig.zon ./ +# COPY src/ ./src/ +# RUN zig build -Doptimize=ReleaseFast +# # Output: /build/zig-out/bin/{{SERVICE_NAME}} +# +FROM cgr.dev/chainguard/wolfi-base:latest AS builder + +# TODO: Install your language toolchain +RUN apk add --no-cache build-base + +WORKDIR /build + +# TODO: Copy source files and build +COPY . . +# RUN + +# ============================================================================ +# Stage 2: Runtime +# ============================================================================ +# +# Minimal production image. Only the compiled binary/release and runtime +# dependencies are included. No compilers, no source code, no build tools. +# +FROM cgr.dev/chainguard/wolfi-base:latest + +# OCI image labels (compatible with cerro-torre .ctp bundle metadata) +LABEL org.opencontainers.image.title="{{PROJECT_NAME}}" \ + org.opencontainers.image.description="{{PROJECT_DESCRIPTION}}" \ + org.opencontainers.image.url="https://{{FORGE}}/{{OWNER}}/{{REPO}}" \ + org.opencontainers.image.source="https://{{FORGE}}/{{OWNER}}/{{REPO}}" \ + org.opencontainers.image.vendor="{{OWNER}}" \ + org.opencontainers.image.licenses="{{LICENSE}}" \ + org.opencontainers.image.authors="{{AUTHOR}} <{{AUTHOR_EMAIL}}>" \ + dev.cerrotorre.manifest="container/manifest.toml" \ + dev.cerrotorre.gatekeeper="container/.gatekeeper.yaml" \ + dev.stapeln.compose="container/compose.toml" + +# Install minimal runtime dependencies. +# Adjust this list for your application: +# - ca-certificates: TLS root certificates +# - curl: health check probe +# - libstdc++: C++ standard library (if needed by native deps) +# - ncurses: terminal UI (if needed, e.g. Elixir IEx) +RUN apk add --no-cache ca-certificates curl + +# Create non-root user for the application. +# Running as root inside containers is a security anti-pattern. +RUN addgroup -S appuser && adduser -S appuser -G appuser + +WORKDIR /app + +# TODO: Copy compiled binary/release from builder stage. +# Examples: +# COPY --from=builder /build/target/release/{{SERVICE_NAME}} /app/{{SERVICE_NAME}} +# COPY --from=builder /build/_build/prod/rel/{{SERVICE_NAME}} /app/release/ +# COPY --from=builder /build/zig-out/bin/{{SERVICE_NAME}} /app/{{SERVICE_NAME}} + +# Copy entrypoint script +COPY container/entrypoint.sh /app/entrypoint.sh +RUN chmod +x /app/entrypoint.sh + +# Copy stapeln integration files (svalinn gatekeeper policy, cerro-torre manifest) +COPY container/.gatekeeper.yaml /etc/svalinn/gatekeeper.yaml +COPY container/manifest.toml /app/manifest.toml + +# Create data directory for persistent storage (mountable volume) +RUN mkdir -p /data && chown appuser:appuser /data + +# Set ownership of the application directory +RUN chown -R appuser:appuser /app + +# Environment variables — customise for your application +ENV APP_HOST=[::] +ENV APP_PORT={{PORT}} +ENV APP_LOG_FORMAT=json +ENV APP_DATA_DIR=/data + +# Declare /data as a volume for persistent storage +VOLUME ["/data"] + +# Run as non-root +USER appuser + +# Expose the application port +EXPOSE {{PORT}} + +# Health check — the application must respond 2xx at /health +HEALTHCHECK --interval=30s --timeout=5s --start-period=10s --retries=3 \ + CMD curl -sf http://localhost:${APP_PORT}/health || exit 1 + +ENTRYPOINT ["/app/entrypoint.sh"] diff --git a/deno/container/README.adoc b/deno/container/README.adoc new file mode 100644 index 0000000..9f7f7f0 --- /dev/null +++ b/deno/container/README.adoc @@ -0,0 +1,179 @@ +// SPDX-License-Identifier: CC-BY-SA-4.0 +// Copyright (c) {{CURRENT_YEAR}} {{AUTHOR}} ({{OWNER}}) <{{AUTHOR_EMAIL}}> += {{PROJECT_NAME}} Container Templates +:toc: left +:toclevels: 3 +:sectnums: + +== Overview + +This directory contains container templates for the +https://github.com/hyperpolymath/stapeln[stapeln] container ecosystem. +The stapeln stack provides verified container packaging, edge gateway +policies, runtime monitoring, and supply-chain signing for Podman-based +deployments using https://www.chainguard.dev/[Chainguard] Wolfi base images. + +All files use `{{PLACEHOLDER}}` tokens that are replaced by `just container-init` +(or by the top-level `just init` during project bootstrap). + +== File Reference + +[cols="1,3"] +|=== +| File | Purpose + +| `compose.toml` +| **selur-compose** stack definition. Declares services, volumes, networks, + and health checks. The primary orchestration file for local and production + deployment. Use `selur-compose up` or fall back to `podman compose`. + +| `compose.example.toml` +| Concrete multi-service example with detailed comments. Copy and customise + for your own stack. Not used directly by any tooling. + +| `Containerfile` +| Multi-stage OCI container build specification. Stage 1 builds the + application; Stage 2 produces a minimal runtime image on + `cgr.dev/chainguard/wolfi-base`. Uses Podman (never Docker). + +| `manifest.toml` +| **cerro-torre** bundle metadata. Describes the `.ctp` verified container + package: provenance, dependencies, attestations, and runtime security + profile. Used by `ct pack` and `ct verify`. + +| `.gatekeeper.yaml` +| **svalinn** edge gateway policy. Controls authentication, rate limiting, + container trust, request validation, CORS, and audit logging at the + network boundary. + +| `ct-build.sh` +| Build, sign, and verify pipeline script. Five stages: build (Podman), + pack (cerro-torre `.ctp`), sign (Ed25519), verify, and push (optional). + Gracefully degrades when cerro-torre tools are not installed. + +| `entrypoint.sh` +| Container entrypoint with signal handling (SIGTERM, SIGINT), startup + logging, and `exec` into the main application process. + +| `vordr.toml` +| **vordr** runtime monitoring configuration. Defines health endpoints, + crash detection, resource thresholds, and log output. + +| `deploy.k9.ncl` +| **k9-svc** deployment component at Hunt trust level. Full pedigree + (L1--L5), environment configs (dev/staging/prod), container + configuration, and rolling deployment strategy. + +| `0-AI-MANIFEST.a2ml` +| AI-readable manifest describing the container directory, file + interconnections, and the stapeln ecosystem. +|=== + +== The stapeln Ecosystem + +The stapeln container ecosystem comprises six interconnected tools: + +**selur** (compose):: + Container orchestration with zero-copy IPC for co-located services. + Reads `compose.toml` files. Falls back to standard Podman Compose + when the selur driver is unavailable. + +**cerro-torre** (bundles and signing):: + Verified container packaging. Produces `.ctp` bundles from OCI images, + signs them with Ed25519, and verifies the full chain. Tools: `ct pack`, + `ct sign`, `ct verify`, `ct push`, `ct explain`. + +**svalinn** (edge gateway):: + Policy-driven reverse proxy. Enforces authentication, rate limiting, + CORS, and container trust policies defined in `.gatekeeper.yaml`. + +**vordr** (monitoring):: + Runtime container monitoring. Watches health endpoints, detects crashes, + tracks resource usage, and emits structured logs. + +**rokur** (secrets):: + Secrets management for container deployments. Injects secrets at runtime + without baking them into images. Currently a stub/placeholder. + +**k9-svc** (deployment components):: + Nickel-based deployment specification. Components declare their pedigree + (identity, target, security, validation, recipes) and execute at one of + three trust levels: Kennel (data only), Yard (evaluation), Hunt (full + execution with cryptographic handshake). + +== How to Initialise + +[source,bash] +---- +# Option 1: During project bootstrap (includes all placeholders) +just init + +# Option 2: Container-specific initialisation +just container-init +---- + +The `container-init` recipe prompts for container-specific values +(service name, port, registry) and substitutes all `{{PLACEHOLDER}}` +tokens in the `container/` directory. + +== Development Workflow + +[source,bash] +---- +# 1. Build the container image +just container-build + +# 2. Verify the compose configuration +just container-verify + +# 3. Start the stack locally +just container-up --detach + +# 4. Check logs +podman compose --file container/compose.toml logs -f + +# 5. Stop the stack +just container-down +---- + +== Production Deployment + +[source,bash] +---- +# 1. Build, sign, and verify the .ctp bundle +just container-sign + +# 2. Push the signed bundle to the registry +just container-push + +# 3. Deploy on the target host +selur-compose up --detach +---- + +For k9-svc managed deployments: + +[source,bash] +---- +# Validate the deployment component +nickel typecheck container/deploy.k9.ncl + +# Deploy (requires Hunt-level authorisation) +k9-svc deploy container/deploy.k9.ncl --env production +---- + +== Base Images + +All Containerfiles use Chainguard Wolfi base images: + +* **Builder stage:** `cgr.dev/chainguard/wolfi-base:latest` +* **Runtime stage:** `cgr.dev/chainguard/wolfi-base:latest` (or + `cgr.dev/chainguard/static:latest` for statically-linked binaries) + +Chainguard images are minimal, CVE-free, and rebuilt daily. They use the +`apk` package manager (Alpine-compatible). + +== Container Runtime + +This project uses **Podman** (never Docker). All scripts, compose files, +and documentation reference Podman commands. The OCI Containerfile format +is compatible with Podman, Docker, and nerdctl. diff --git a/deno/container/compose.example.toml b/deno/container/compose.example.toml new file mode 100644 index 0000000..d8d717c --- /dev/null +++ b/deno/container/compose.example.toml @@ -0,0 +1,135 @@ +# SPDX-License-Identifier: MPL-2.0 +# +# Example selur-compose configuration — multi-service stack +# +# This is a concrete, fully-commented example showing a Rust API + Elixir +# worker + svalinn gateway deployment. Copy this file to compose.toml and +# customise for your project. +# +# Usage: +# cp compose.example.toml compose.toml +# # Edit service names, ports, images +# selur-compose up --detach + +version = "1.0" + +# ============================================================================ +# Services +# ============================================================================ + +# Rust API service — the primary HTTP/gRPC backend. +# Handles incoming requests, data storage, and core business logic. +[services.rust-api] +image = "ghcr.io/hyperpolymath/myproject-api:latest.ctp" + +# Map host port 8080 to container port 8080. +# Use ["[::]:8080:8080"] for explicit IPv6 binding. +ports = ["8080:8080"] + +# Environment variables passed into the container at startup. +# These override defaults in the Containerfile ENV directives. +environment = { + RUST_LOG = "info", # Rust log level (trace, debug, info, warn, error) + APP_HOST = "[::]", # Listen on all interfaces (IPv4 + IPv6) + APP_PORT = "8080", # Internal container port + APP_LOG_FORMAT = "json", # Structured logging for selur/vordr + APP_DATA_DIR = "/data", # Persistent data directory (matches VOLUME) +} + +# Bind-mount a named volume for persistent data. +# Format: "volume-name:/container/path" +volumes = ["api-data:/data"] + +# Restart policy: "always" ensures the service comes back after crashes. +# Other options: "no", "on-failure", "unless-stopped" +restart = "always" + +# Health check: selur/Podman uses this to determine if the service is ready. +# The service must respond 2xx to this endpoint within the timeout. +healthcheck = { test = "curl -sf http://localhost:8080/health", interval = "30s", timeout = "5s", retries = 3 } + +# --- + +# Elixir worker service — background processing, event handling, coordination. +# Runs as an OTP release with supervision trees for fault tolerance. +[services.elixir-worker] +image = "ghcr.io/hyperpolymath/myproject-worker:latest.ctp" + +# Separate port for the worker's admin/metrics endpoint. +ports = ["4000:4000"] + +# The worker connects to the Rust API over the internal selur network. +# Service names resolve as hostnames within the compose network. +environment = { + API_URL = "http://rust-api:8080/api/v1", # Internal service discovery + MIX_ENV = "prod", # Elixir release mode + APP_LOG_FORMAT = "json", # Match structured logging format + POOL_SIZE = "10", # DB connection pool size +} + +# depends_on ensures the Rust API starts before the worker. +# Note: This only waits for the container to start, not for the health check. +# Use healthcheck + startup probes for true readiness gating. +depends_on = ["rust-api"] + +restart = "always" +healthcheck = { test = "curl -sf http://localhost:4000/health", interval = "30s", timeout = "5s", retries = 3 } + +# --- + +# Svalinn edge gateway — reverse proxy with policy enforcement. +# All external traffic enters through svalinn, which: +# 1. Terminates TLS (auto-provisioned certificates) +# 2. Validates JWT/OAuth2 authentication +# 3. Enforces rate limits from .gatekeeper.yaml +# 4. Routes requests to the appropriate backend service +# 5. Logs all write operations for audit +[services.svalinn] +image = "ghcr.io/hyperpolymath/svalinn:latest.ctp" + +# External-facing ports: HTTPS (443) and HTTP->HTTPS redirect (80). +ports = ["443:443", "80:80"] + +environment = { + # Backend routing: svalinn proxies to internal services. + SVALINN_BACKEND = "http://rust-api:8080", + SVALINN_WORKER_BACKEND = "http://elixir-worker:4000", + + # Policy file: mounted from the svalinn-config volume. + SVALINN_POLICY_FILE = "/etc/svalinn/gatekeeper.yaml", + + # Auto-provision TLS certificates (Let's Encrypt). + SVALINN_TLS_AUTO = "true", +} + +# Mount .gatekeeper.yaml as read-only policy configuration. +volumes = ["svalinn-config:/etc/svalinn:ro"] + +# Svalinn starts last — it needs both backends to be running. +depends_on = ["rust-api", "elixir-worker"] +restart = "always" +healthcheck = { test = "curl -sf http://localhost:80/health", interval = "30s", timeout = "5s", retries = 3 } + +# ============================================================================ +# Volumes +# ============================================================================ + +# Persistent storage for the Rust API (database files, indexes, WAL). +[volumes.api-data] +driver = "local" + +# Read-only policy configuration for svalinn gateway. +# Populate with: cp .gatekeeper.yaml /path/to/svalinn-config/gatekeeper.yaml +[volumes.svalinn-config] +driver = "local" + +# ============================================================================ +# Networks +# ============================================================================ + +# selur network: zero-copy IPC between services on the same host. +# When the selur driver is not installed, falls back to standard bridge +# networking (TCP over localhost). Performance is slightly lower but +# functionality is identical. +[networks.default] +driver = "selur" diff --git a/deno/container/compose.toml b/deno/container/compose.toml new file mode 100644 index 0000000..a14f8a0 --- /dev/null +++ b/deno/container/compose.toml @@ -0,0 +1,70 @@ +# SPDX-License-Identifier: MPL-2.0 +# +# {{PROJECT_NAME}} selur-compose configuration +# +# Orchestrates the container stack as verified container bundles (.ctp). +# Uses selur zero-copy IPC between services on the same host. +# +# Usage: +# selur-compose up # Start all services +# selur-compose up --detach # Start in background +# selur-compose verify # Verify all .ctp signatures +# selur-compose ps # Check status +# selur-compose logs -f {{SERVICE_NAME}} # Stream logs +# selur-compose down # Stop all services +# +# Fallback (when selur is not installed): +# podman compose --file compose.toml up --detach + +version = "1.0" + +# ============================================================================ +# Services +# ============================================================================ + +# Primary application service +[services.{{SERVICE_NAME}}] +image = "{{REGISTRY}}/{{SERVICE_NAME}}:latest.ctp" +ports = ["{{PORT}}:{{PORT}}"] +environment = { + APP_HOST = "[::]", + APP_PORT = "{{PORT}}", + APP_LOG_FORMAT = "json", + APP_DATA_DIR = "/data", +} +volumes = ["{{SERVICE_NAME}}-data:/data"] +restart = "always" +healthcheck = { test = "curl -sf http://localhost:{{PORT}}/health", interval = "30s", timeout = "5s", retries = 3 } + +# Svalinn edge gateway: validates requests, enforces policies, TLS termination +[services.svalinn] +image = "ghcr.io/hyperpolymath/svalinn:latest.ctp" +ports = ["443:443", "80:80"] +environment = { + SVALINN_BACKEND = "http://{{SERVICE_NAME}}:{{PORT}}", + SVALINN_POLICY_FILE = "/etc/svalinn/gatekeeper.yaml", + SVALINN_TLS_AUTO = "true", +} +volumes = ["svalinn-config:/etc/svalinn:ro"] +depends_on = ["{{SERVICE_NAME}}"] +restart = "always" +healthcheck = { test = "curl -sf http://localhost:80/health", interval = "30s", timeout = "5s", retries = 3 } + +# ============================================================================ +# Volumes +# ============================================================================ + +[volumes.{{SERVICE_NAME}}-data] +driver = "local" + +[volumes.svalinn-config] +driver = "local" + +# ============================================================================ +# Networks +# ============================================================================ + +# Use selur zero-copy IPC for inter-service communication on the same host. +# Falls back to standard bridge networking when selur driver is unavailable. +[networks.default] +driver = "selur" diff --git a/deno/container/ct-build.sh b/deno/container/ct-build.sh new file mode 100755 index 0000000..a54a541 --- /dev/null +++ b/deno/container/ct-build.sh @@ -0,0 +1,162 @@ +#!/usr/bin/env bash +# SPDX-License-Identifier: MPL-2.0 +# +# {{PROJECT_NAME}} — Cerro Torre build, sign, and verify pipeline +# +# Builds the container image, packages it as a verified .ctp bundle, +# signs it with Ed25519, and verifies the result. Gracefully degrades +# when cerro-torre tools are not installed. +# +# Prerequisites: +# - podman (container build — required) +# - ct (cerro-torre CLI: pack, sign, verify — optional) +# - cerro-sign (Ed25519 signing — optional, ct sign used as fallback) +# +# Usage: +# ./ct-build.sh # Build + sign (local only) +# ./ct-build.sh --push # Build + sign + push to registry +# CT_KEY_ID=my-key ./ct-build.sh # Use specific signing key +# +# Environment variables: +# CT_KEY_ID — Signing key identifier (default: {{SERVICE_NAME}}-release) +# CT_REGISTRY — OCI registry to push to (default: {{REGISTRY}}) +# CT_TAG — Image tag (default: latest) + +set -euo pipefail + +# --------------------------------------------------------------------------- +# Configuration +# --------------------------------------------------------------------------- + +SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" +REPO_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)" + +PUSH="" +for arg in "$@"; do + if [ "$arg" = "--push" ]; then + PUSH="--push" + fi +done + +CT_KEY_ID="${CT_KEY_ID:-{{SERVICE_NAME}}-release}" +CT_REGISTRY="${CT_REGISTRY:-{{REGISTRY}}}" +CT_TAG="${CT_TAG:-latest}" + +IMAGE_NAME="{{SERVICE_NAME}}" +FULL_IMAGE="${CT_REGISTRY}/${IMAGE_NAME}:${CT_TAG}" +CTP_FILE="${SCRIPT_DIR}/${IMAGE_NAME}-${CT_TAG}.ctp" + +echo "=== {{PROJECT_NAME}} Cerro Torre Build Pipeline ===" +echo " Image: ${FULL_IMAGE}" +echo " Key: ${CT_KEY_ID}" +echo " Bundle: ${CTP_FILE}" +echo "" + +# --------------------------------------------------------------------------- +# Step 1: Build container image with Podman +# --------------------------------------------------------------------------- + +echo "--- Step 1: Building container image ---" + +podman build \ + -t "${FULL_IMAGE}" \ + -f "${SCRIPT_DIR}/Containerfile" \ + "${REPO_ROOT}" + +echo " Built: ${FULL_IMAGE}" +echo "" + +# --------------------------------------------------------------------------- +# Step 2: Pack into .ctp bundle +# --------------------------------------------------------------------------- + +echo "--- Step 2: Packing into .ctp bundle ---" + +if command -v ct &>/dev/null; then + ct pack "${FULL_IMAGE}" -o "${CTP_FILE}" + echo " Packed: ${CTP_FILE}" +else + echo " SKIP: ct not found (install cerro-torre CLI from stapeln/container-stack/cerro-torre)" + echo " The container image is built and tagged but not packed as a .ctp bundle." + echo " To pack manually: ct pack ${FULL_IMAGE} -o ${CTP_FILE}" + echo "" + if [ "$PUSH" = "--push" ]; then + echo "--- Pushing unsigned OCI image (no .ctp) ---" + podman push "${FULL_IMAGE}" + echo " Pushed: ${FULL_IMAGE} (unsigned OCI — not a .ctp bundle)" + fi + echo "" + echo "=== Build complete (without .ctp signing) ===" + exit 0 +fi + +echo "" + +# --------------------------------------------------------------------------- +# Step 3: Sign the .ctp bundle +# --------------------------------------------------------------------------- + +echo "--- Step 3: Signing .ctp bundle ---" + +if command -v cerro-sign &>/dev/null; then + cerro-sign sign "${CTP_FILE}" --key-id "${CT_KEY_ID}" + echo " Signed: ${CTP_FILE} (key: ${CT_KEY_ID})" +elif command -v ct &>/dev/null; then + ct sign "${CTP_FILE}" --key "${CT_KEY_ID}" + echo " Signed: ${CTP_FILE} (key: ${CT_KEY_ID})" +else + echo " SKIP: cerro-sign not found (install from stapeln/container-stack/cerro-torre)" +fi + +echo "" + +# --------------------------------------------------------------------------- +# Step 4: Verify the .ctp bundle +# --------------------------------------------------------------------------- + +echo "--- Step 4: Verifying .ctp bundle ---" + +if command -v ct &>/dev/null; then + ct verify "${CTP_FILE}" + echo " Verified: ${CTP_FILE}" +else + echo " SKIP: ct not found" +fi + +echo "" + +# --------------------------------------------------------------------------- +# Step 5: Push to registry (optional) +# --------------------------------------------------------------------------- + +if [ "$PUSH" = "--push" ]; then + echo "--- Step 5: Pushing to registry ---" + + if command -v ct &>/dev/null; then + ct push "${CTP_FILE}" "${FULL_IMAGE}" + echo " Pushed: ${FULL_IMAGE}" + else + # Fall back to podman push (unsigned OCI image) + echo " ct not available, falling back to podman push (unsigned)" + podman push "${FULL_IMAGE}" + echo " Pushed: ${FULL_IMAGE} (unsigned OCI — not a .ctp bundle)" + fi + echo "" +fi + +# --------------------------------------------------------------------------- +# Summary +# --------------------------------------------------------------------------- + +echo "=== Build pipeline complete ===" +echo " Image: ${FULL_IMAGE}" +echo " Bundle: ${CTP_FILE}" +echo "" +echo " To deploy with selur-compose:" +echo " cd container && selur-compose up" +echo "" +echo " To verify at any time:" +echo " ct verify ${CTP_FILE}" +echo "" +echo " To explain the verification chain:" +echo " ct explain ${CTP_FILE}" diff --git a/deno/container/deploy.k9.ncl b/deno/container/deploy.k9.ncl new file mode 100644 index 0000000..0ad0d04 --- /dev/null +++ b/deno/container/deploy.k9.ncl @@ -0,0 +1,166 @@ +# SPDX-License-Identifier: MPL-2.0 +# deploy.k9.ncl — {{PROJECT_NAME}} deployment component (Hunt level) +# +# k9-svc deployment specification with full pedigree (L1-L5). +# Security Level: 'Hunt (requires cryptographic handshake for execution). +# +# WARNING: This component can execute shell commands! +# It requires explicit authorisation via the Leash system. +# +# Usage: +# nickel typecheck container/deploy.k9.ncl +# k9-svc validate container/deploy.k9.ncl +# k9-svc deploy container/deploy.k9.ncl --env production + +# The component's pedigree (self-description across five layers) +let component_pedigree = { + # ───────────────────────────────────────────────────────────── + # L1: The Snout — Identity + # ───────────────────────────────────────────────────────────── + metadata = { + name = "{{SERVICE_NAME}}-deploy", + version = "{{VERSION}}", + breed = "application/vnd.k9+nickel", + magic_number = "K9!", + description = "{{PROJECT_NAME}} deployment component (Hunt level)", + }, + + # ───────────────────────────────────────────────────────────── + # L2: The Scent — Target Environment + # ───────────────────────────────────────────────────────────── + target = { + os = 'Linux, + is_edge = false, + requires_podman = true, + min_memory_mb = 256, + }, + + # ───────────────────────────────────────────────────────────── + # L3: The Leash — Security + # ───────────────────────────────────────────────────────────── + security = { + trust_level = 'Hunt, + allow_network = true, + allow_filesystem_write = true, + allow_subprocess = true, + # In production, replace with a real Ed25519 signature. + signature = "PLACEHOLDER-SIGNATURE-REQUIRED-FOR-HUNT", + }, + + # ───────────────────────────────────────────────────────────── + # L4: The Gut — Self-Validation + # ───────────────────────────────────────────────────────────── + validation = { + checksum = "sha256:placeholder", + pedigree_version = "1.0.0", + hunt_authorized = false, # Must be set true after handshake + }, + + # ───────────────────────────────────────────────────────────── + # L5: The Muscle — Deployment Recipes + # ───────────────────────────────────────────────────────────── + recipes = { + install = "just container-build", + validate = "just container-verify", + deploy = "just container-up", + migrate = "just container-build && just container-up", + }, +} in + +# Deployment configuration +let deployment = { + # Target environments (dev / staging / production) + environments = { + dev = { + replicas = 1, + memory = "256Mi", + cpu = "100m", + image_tag = "dev", + }, + staging = { + replicas = 2, + memory = "512Mi", + cpu = "250m", + image_tag = "staging", + }, + production = { + replicas = 3, + memory = "1Gi", + cpu = "500m", + image_tag = "latest", + }, + }, + + # Container configuration + container = { + image = "{{REGISTRY}}/{{SERVICE_NAME}}", + port = {{PORT}}, + health_check = "/health", + readiness_check = "/ready", + }, + + # Deployment strategy + strategy = { + type = "rolling", + max_surge = 1, + max_unavailable = 0, + }, +} in + +# Deployment scripts (executed at Hunt level) +let scripts = { + # Pre-deployment validation + pre_deploy = m%" +#!/bin/sh +set -eu +echo "K9: Pre-deployment validation for {{SERVICE_NAME}}..." +cd container && selur-compose verify || podman compose --file compose.toml config +echo "K9: Validation passed." +"%, + + # Deployment script + deploy = m%" +#!/bin/sh +set -eu +ENV="${1:-dev}" +echo "K9: Deploying {{SERVICE_NAME}} to $ENV environment..." +cd container +./ct-build.sh +selur-compose up --detach || podman compose --file compose.toml up --detach +echo "K9: Deployment to $ENV complete." +"%, + + # Rollback script + rollback = m%" +#!/bin/sh +set -eu +echo "K9: Rolling back {{SERVICE_NAME}} deployment..." +cd container +selur-compose down || podman compose --file compose.toml down +echo "K9: Rollback complete." +"%, +} in + +# Export the component +{ + pedigree = component_pedigree, + deployment = deployment, + scripts = scripts, + + # Security check: this component requires Hunt level + required_level = 'Hunt, + + # Warning for users + warning = m%" +WARNING: This is a Hunt-level component. + +It can execute shell commands and modify your system. +Before running, ensure you have: + +1. Reviewed the deployment scripts above +2. Verified the signature (when implemented) +3. Explicitly authorised Hunt-level execution + +Run with: k9-svc authorize container/deploy.k9.ncl && k9-svc deploy container/deploy.k9.ncl +"%, +} diff --git a/deno/container/entrypoint.sh b/deno/container/entrypoint.sh new file mode 100755 index 0000000..a7a0369 --- /dev/null +++ b/deno/container/entrypoint.sh @@ -0,0 +1,63 @@ +#!/bin/sh +# SPDX-License-Identifier: MPL-2.0 +# {{PROJECT_NAME}} container entrypoint +# +# Handles signal propagation, startup logging, and health check +# preparation before exec-ing into the main application process. + +set -e + +# --------------------------------------------------------------------------- +# Signal handling +# --------------------------------------------------------------------------- +# +# Trap SIGTERM and SIGINT so that the application can shut down gracefully +# when Podman sends stop signals (e.g. `podman stop`, `selur-compose down`). + +cleanup() { + echo "Received shutdown signal — stopping {{SERVICE_NAME}}..." + # If the main process is backgrounded, kill it here: + # kill "$MAIN_PID" 2>/dev/null || true + # wait "$MAIN_PID" 2>/dev/null || true + exit 0 +} +trap cleanup TERM INT + +# --------------------------------------------------------------------------- +# Startup logging +# --------------------------------------------------------------------------- + +echo "Starting {{SERVICE_NAME}}..." +echo " Host: ${APP_HOST:-[::]}" +echo " Port: ${APP_PORT:-{{PORT}}}" +echo " Data: ${APP_DATA_DIR:-/data}" +echo " Log: ${APP_LOG_FORMAT:-json}" + +# --------------------------------------------------------------------------- +# Health check preparation +# --------------------------------------------------------------------------- +# +# Ensure the data directory exists and is writable. +# The VOLUME directive in the Containerfile creates /data, but a bind-mount +# might replace it with an empty directory owned by root. + +if [ -d "${APP_DATA_DIR:-/data}" ]; then + if [ ! -w "${APP_DATA_DIR:-/data}" ]; then + echo "WARNING: ${APP_DATA_DIR:-/data} is not writable by $(whoami)" + fi +fi + +# --------------------------------------------------------------------------- +# Exec into main process +# --------------------------------------------------------------------------- +# +# Replace the entrypoint shell with the application process so that +# signals are delivered directly and PID 1 is the application. +# +# TODO: Replace the command below with your application binary. +# Examples: +# exec /app/{{SERVICE_NAME}} +# exec /app/release/bin/{{SERVICE_NAME}} start +# exec /app/{{SERVICE_NAME}} serve --host "${APP_HOST}" --port "${APP_PORT}" + +exec "$@" diff --git a/deno/container/manifest.toml b/deno/container/manifest.toml new file mode 100644 index 0000000..f55fcb3 --- /dev/null +++ b/deno/container/manifest.toml @@ -0,0 +1,62 @@ +# SPDX-License-Identifier: MPL-2.0 +# +# Cerro Torre manifest for {{PROJECT_NAME}} .ctp bundle +# +# This manifest describes the container image for verified +# container packaging. Used by `ct pack` to create .ctp bundles. + +[metadata] +name = "{{SERVICE_NAME}}" +version = "{{VERSION}}" +revision = 1 +summary = "{{PROJECT_DESCRIPTION}}" +description = """ +{{PROJECT_NAME}} — containerised service packaged as a verified +cerro-torre .ctp bundle with Ed25519 signing and full provenance +tracking. +""" +license = "{{LICENSE}}" +homepage = "https://{{FORGE}}/{{OWNER}}/{{REPO}}" +maintainer = "{{AUTHOR}} <{{EMAIL}}>" + +[provenance] +upstream = "https://{{FORGE}}/{{OWNER}}/{{REPO}}" +import_date = {{CURRENT_DATE}}T00:00:00Z + +[dependencies] +runtime = ["ca-certificates", "curl"] +build = [] + +[build] +system = "podman" + +[build.environment] +APP_HOST = "[::]" +APP_PORT = "{{PORT}}" + +[outputs] +primary = "{{SERVICE_NAME}}" +split = [] + +[attestations] +require = ["source-signature", "sbom-complete"] +recommend = ["security-audit", "reproducible-build"] + +# Runtime security profile +[security] +user = "appuser" +group = "appuser" +read_only_root = false +no_new_privileges = true + +[security.capabilities] +drop = ["ALL"] +add = ["NET_BIND_SERVICE"] + +[security.network] +listen_tcp = [{{PORT}}] + +[security.filesystem] +read = ["/app/", "/data/"] +write = ["/data/", "/tmp/"] +execute = ["/app/entrypoint.sh"] diff --git a/deno/container/vordr.toml b/deno/container/vordr.toml new file mode 100644 index 0000000..af38fc5 --- /dev/null +++ b/deno/container/vordr.toml @@ -0,0 +1,100 @@ +# SPDX-License-Identifier: MPL-2.0 +# +# Vordr runtime monitoring configuration for {{PROJECT_NAME}} +# +# Vordr watches container health, detects crashes, tracks resource usage, +# and emits structured logs. It runs alongside the application stack and +# provides runtime observability without requiring in-process agents. +# +# Usage: +# vordr watch --config container/vordr.toml +# vordr status +# vordr report + +[metadata] +name = "{{SERVICE_NAME}}" +version = "{{VERSION}}" + +# ============================================================================ +# Health Monitoring +# ============================================================================ +# +# Vordr periodically probes these endpoints. If a probe fails beyond the +# failure_threshold, vordr emits an alert and (optionally) restarts the +# container via Podman. + +[health] +# Primary health endpoint — must return 2xx. +endpoint = "http://localhost:{{PORT}}/health" +interval = "30s" +timeout = "5s" +failure_threshold = 3 + +# Readiness endpoint — checked during startup and after restarts. +readiness_endpoint = "http://localhost:{{PORT}}/ready" +readiness_timeout = "10s" + +# Action on failure: "alert" (log + notify) or "restart" (alert + podman restart). +on_failure = "alert" + +# ============================================================================ +# Crash Detection +# ============================================================================ +# +# Monitors container state via Podman. Detects OOM kills, segfaults, +# and unexpected exits. + +[crash_detection] +enabled = true +# Maximum restarts within the window before vordr stops restarting. +max_restarts = 5 +restart_window = "10m" + +# ============================================================================ +# Resource Thresholds +# ============================================================================ +# +# Alert when resource usage exceeds these thresholds. Values are percentages +# of the container's cgroup limits (or host limits if uncapped). + +[resources] +cpu_warn = 80 # Percentage — warn at 80% sustained CPU. +cpu_critical = 95 # Percentage — critical alert at 95%. +memory_warn = 75 # Percentage of memory limit. +memory_critical = 90 +disk_warn = 80 # Percentage of volume usage. +disk_critical = 95 + +# Sample interval for resource metrics. +sample_interval = "15s" + +# ============================================================================ +# Log Output +# ============================================================================ +# +# Vordr emits its own logs (not the application's) in structured format. + +[logging] +format = "json" +level = "info" +# Write vordr logs to stdout (captured by Podman) and optionally to file. +output = "stdout" +# file = "/var/log/vordr/{{SERVICE_NAME}}.log" + +# ============================================================================ +# Notifications (optional) +# ============================================================================ +# +# Uncomment and configure to receive alerts via webhook or email. + +# [notifications.webhook] +# url = "https://example.com/hooks/vordr" +# method = "POST" +# headers = { "Content-Type" = "application/json" } +# on = ["failure", "recovery", "resource_critical"] + +# [notifications.email] +# to = "{{EMAIL}}" +# from = "vordr@{{SERVICE_NAME}}.local" +# smtp = "smtp://localhost:25" +# on = ["failure", "resource_critical"] diff --git a/deno/contractile.just b/deno/contractile.just new file mode 100644 index 0000000..9a5827b --- /dev/null +++ b/deno/contractile.just @@ -0,0 +1,75 @@ +# Auto-generated by: contractile gen-just +# Source directory: contractiles +# Re-generate with: contractile gen-just --dir contractiles +# +# SPDX-License-Identifier: MPL-2.0 + +# === DUST (Recovery & Rollback) === +# Source: Dustfile.a2ml + +# List available dust recovery actions +dust-status: + @echo ' dust-source-rollback: Revert all source changes to last commit [rollback]' + +# Revert all source changes to last commit +dust-source-rollback: + @echo 'Executing rollback for source-rollback' + git checkout HEAD -- . + + +# === INTEND (Declared Future Intent) === +# Source: Intentfile.a2ml + +# Display declared future intents +intend-list: + @echo '=== Declared Intent ===' + @echo '' + @echo 'Features:' + @echo '' + @echo 'Quality:' + + +# === MUST (Physical State Checks) === +# Source: Mustfile.a2ml + +# Run all must checks +must-check: must-license-present must-readme-present must-spdx-headers must-no-banned-files + @echo 'All must checks passed' + +# LICENSE file must exist +must-license-present: + test -f LICENSE + +# README must exist +must-readme-present: + test -f README.adoc || test -f README.md + +# Source files should have SPDX license headers +must-spdx-headers: + find . -name '*.rs' -o -name '*.res' -o -name '*.gleam' | head -20 | xargs -r grep -L 'SPDX-License-Identifier' | wc -l | grep -q '^0$' + +# No Dockerfiles or Makefiles +must-no-banned-files: + test ! -f Dockerfile && test ! -f Makefile + + +# === TRUST (Integrity & Provenance Verification) === +# Source: Trustfile.a2ml + +# Run all trust verifications +trust-verify: trust-license-content trust-no-secrets-committed trust-container-images-pinned + @echo 'All trust verifications passed' + +# LICENSE contains expected SPDX identifier +trust-license-content: + grep -q 'SPDX\|License\|MIT\|Apache\|PMPL\|MPL' LICENSE + +# No .env or credential files in repo +trust-no-secrets-committed: + test ! -f .env && test ! -f credentials.json && test ! -f .env.local + +# Containerfile base images use pinned digests +trust-container-images-pinned: + test ! -f Containerfile || grep -q '@sha256:' Containerfile + + diff --git a/deno/contractiles/intend/Intentfile.a2ml b/deno/contractiles/intend/Intentfile.a2ml new file mode 100644 index 0000000..140c017 --- /dev/null +++ b/deno/contractiles/intend/Intentfile.a2ml @@ -0,0 +1,22 @@ +# SPDX-License-Identifier: MPL-2.0 +# Intentfile (A2ML Canonical) +# Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) + +@abstract: +Declared intent and purpose for A2Ml Deno. +@end + +## Purpose + +A2Ml Deno — **Deno-native parser library for A2ML (Attested Markup Language), written in ReScript.** + +## Anti-Purpose + +This project is NOT: +- A fork or wrapper around another tool +- A monorepo (unless explicitly structured as one) + +## If In Doubt + +If you are unsure whether a change is in scope, ask. +Sensitive areas: ABI definitions, license headers, CI workflows. diff --git a/deno/contractiles/must/Mustfile.a2ml b/deno/contractiles/must/Mustfile.a2ml new file mode 100644 index 0000000..809884f --- /dev/null +++ b/deno/contractiles/must/Mustfile.a2ml @@ -0,0 +1,42 @@ +# SPDX-License-Identifier: MPL-2.0 +# Mustfile (A2ML Canonical) +# Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) + +@abstract: +Physical State contract for A2Ml Deno. Baseline UX Manifesto invariants +that MUST hold at all times. +@end + +@requires: +- section: Core-Files +- section: Banned +@end + +## Core-Files + +### license-present +- description: LICENSE file must exist +- run: test -f LICENSE +- severity: critical + +### readme-present +- description: README must exist +- run: test -f README.adoc || test -f README.md +- severity: critical + +## Banned + +### no-hardcoded-paths +- description: No hardcoded developer paths +- run: "! grep -rn '$HOME\|$ECLIPSE_DIR' --include='*.rs' --include='*.res' --include='*.ex' --include='*.gleam' --include='*.zig' --include='*.sh' . 2>/dev/null | grep -v '.git/' | grep -v 'ux-rollout.jl' | head -1" +- severity: critical + +### no-dockerfiles +- description: No Dockerfiles (use Containerfile) +- run: test ! -f Dockerfile +- severity: warning + +### no-makefiles +- description: No Makefiles (use Justfile) +- run: test ! -f Makefile +- severity: warning diff --git a/deno/contractiles/trust/Trustfile.a2ml b/deno/contractiles/trust/Trustfile.a2ml new file mode 100644 index 0000000..bf1ddbd --- /dev/null +++ b/deno/contractiles/trust/Trustfile.a2ml @@ -0,0 +1,25 @@ +# SPDX-License-Identifier: MPL-2.0 +# Trustfile (A2ML Canonical) +# Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) + +@abstract: +Trust and provenance verification for A2Ml Deno. +Maximal trust by default — LLM may read, build, test, lint, format. +@end + +@trust-level: maximal +@trust-boundary: repo +@trust-actions: [read, build, test, lint, format] +@trust-deny: [delete-branch, force-push, modify-ci-secrets, publish] + +## Integrity + +### license-content +- description: LICENSE contains expected SPDX identifier +- run: grep -q 'SPDX\|License\|MIT\|Apache\|PMPL\|MPL' LICENSE +- severity: critical + +### no-secrets-committed +- description: No .env or credential files in repo +- run: test ! -f .env && test ! -f credentials.json && test ! -f .env.local +- severity: critical diff --git a/deno/deno.json b/deno/deno.json new file mode 100644 index 0000000..10396f7 --- /dev/null +++ b/deno/deno.json @@ -0,0 +1,17 @@ +{ + "name": "@hyperpolymath/a2ml", + "version": "0.1.0", + "exports": { + ".": "./mod.ts" + }, + "tasks": { + "build": "deno run -A npm:rescript build", + "clean": "deno run -A npm:rescript clean", + "test": "deno test --allow-read" + }, + "imports": { + "rescript": "npm:rescript@11.*", + "@rescript/core": "npm:@rescript/core@1.*" + }, + "nodeModulesDir": "auto" +} diff --git a/deno/docs/0.1-AI-MANIFEST.a2ml b/deno/docs/0.1-AI-MANIFEST.a2ml new file mode 100644 index 0000000..7f79301 --- /dev/null +++ b/deno/docs/0.1-AI-MANIFEST.a2ml @@ -0,0 +1,33 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "docs-pillar" +level: 1 +parent: "../0-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Technical documentation hub. The root contains high-level orientation + (README, Quickstart, State-Visualizer). Specialized tracks live in + subdirectories. + +canonical_locations: + quickstart: "QUICKSTART.adoc" + state_visualizer: "STATE-VISUALIZER.adoc" + governance: "governance/" + architecture: "architecture/" + decisions: "decisions/" + theory: "theory/" + practice: "practice/" + developer: "developer/" + attribution: "attribution/" + reports: "reports/" + whitepapers: "whitepapers/" + standards: "standards/" + legal: "legal/" + wikis: "wikis/" + +invariants: + - "Primary documentation format MUST be AsciiDoc (.adoc)" + - "Root docs/ MUST only contain pillar entry points" diff --git a/deno/docs/QUICKSTART.adoc b/deno/docs/QUICKSTART.adoc new file mode 100644 index 0000000..d97c31e --- /dev/null +++ b/deno/docs/QUICKSTART.adoc @@ -0,0 +1,24 @@ += Quickstart +:toc: preamble + +Get up and running in 60 seconds. + +== Prerequisites + +* Git 2.40+ +* just (command runner) +* Your language toolchain (see Justfile for details) + +== From Template (New Project) + +[source,bash] +---- +git clone https://github.com/{{OWNER}}/rsr-template-repo my-project +cd my-project +rm -rf .git && git init -b main +just init # interactive placeholder replacement +---- + +== Project Structure + +See README.adoc in the root for the Dual-Track architecture summary. diff --git a/deno/docs/README.adoc b/deno/docs/README.adoc new file mode 100644 index 0000000..df45be7 --- /dev/null +++ b/deno/docs/README.adoc @@ -0,0 +1,14 @@ += Documentation Layout + +Primary tracks: + +* `theory/` for formal and conceptual material +* `practice/` for operational and implementation material +* `maintenance/` for baseline checklists and release hard-pass runbooks +* `whitepapers/academic/` for research-facing whitepapers +* `whitepapers/industry/` for industry/outreach whitepapers + +Core docs: + +* `maintenance/MAINTENANCE-CHECKLIST.md` +* `practice/SOFTWARE-DEVELOPMENT-APPROACH.adoc` diff --git a/deno/docs/RSR_OUTLINE.adoc b/deno/docs/RSR_OUTLINE.adoc new file mode 100644 index 0000000..0e46ef6 --- /dev/null +++ b/deno/docs/RSR_OUTLINE.adoc @@ -0,0 +1,290 @@ += RSR Template Repository + +image:[MPL-2.0,link="https://github.com/hyperpolymath/palimpsest-license"] image:[Palimpsest,link="https://github.com/hyperpolymath/palimpsest-license"] +:toc: +:sectnums: + +// Badges +image:https://img.shields.io/badge/RSR-Infrastructure-cd7f32[RSR Infrastructure] +image:https://img.shields.io/badge/Phase-Maintenance-brightgreen[Phase] +image:https://img.shields.io/badge/Guix-Primary-purple?logo=gnu[Guix] + +== Overview + +**The canonical template for RSR (Rhodium Standard Repository) projects.** + +This repository provides the standardized structure, configuration, and tooling for all RSR-compliant repos. Use it to: + +* Bootstrap new projects with RSR compliance +* Reference the standard directory structure +* Copy configuration templates (Justfile, STATE.a2ml, etc.) + +== Quick Start + +[source,bash] +---- +# Clone the template +git clone https://github.com/hyperpolymath/RSR-template-repo my-project +cd my-project + +# Remove template git history +rm -rf .git +git init + +# Interactive bootstrap — replaces all placeholders +just init + +# Enter development environment +guix shell -D -f guix.scm + +# Validate compliance +just validate-rsr +---- + +== What's Included + +[cols="1,3"] +|=== +|File/Directory |Purpose + +|`.editorconfig` +|Editor configuration (indent, charset) + +|`.gitignore` +|Standard ignore patterns + +|`.gitattributes` +|Line endings, diff drivers, binary detection + +|`.guix-channel` +|Guix channel definition + +|`.well-known/` +|RFC-compliant metadata (security.txt, ai.txt, humans.txt) + +|`.machine_readable/` +|All machine-readable content: state files (6 a2ml), `bot_directives/`, `contractiles/` + +|`docs/` +|Documentation directory + +|`guix.scm` +|Guix package definition + +|`Justfile` +|Task runner with 40+ recipes + +|`Containerfile` +|Container build (Wolfi base, Podman) + +|`LICENSE` +|MPL-2.0 + +|`EXHIBIT-A-ETHICAL-USE.txt` +|Ethical use guidelines (LICENSE Exhibit A) + +|`EXHIBIT-B-QUANTUM-SAFE.txt` +|Quantum-safe provenance spec (LICENSE Exhibit B) + +|`README.adoc` +|Project overview + +|`TOPOLOGY.md` +|Architecture diagram and completion dashboard + +|`PLACEHOLDERS.md` +|Template variable reference and replacement guide + +|`0-AI-MANIFEST.a2ml` +|Universal AI agent entry point + +|`AI.a2ml` +|Claude-specific instructions + +|`src/abi/` +|Idris2 ABI definitions (Types, Layout, Foreign) + +|`ffi/zig/` +|Zig FFI implementation + +|`generated/abi/` +|Auto-generated C headers from Idris2 ABI +|=== + +== Justfile Features + +The template Justfile provides: + +* **Combinatoric matrix recipes** for build, test, container, CI +* **Cookbook generation**: `just cookbook` -> `docs/just-cookbook.adoc` +* **Man page generation**: `just man` -> `docs/man/project.1` +* **RSR validation**: `just validate-rsr` +* **STATE.a2ml management**: `just state-touch`, `just state-phase` +* **Container support**: `just container-build`, `just container-push` +* **CI matrix**: `just ci-matrix [stage] [depth]` + +=== Key Recipes + +[source,bash] +---- +just # Show all recipes +just help # Detailed help +just info # Project info +just combinations # Show matrix options + +just build # Build (debug) +just test # Run tests +just quality # Format + lint + test +just ci # Full CI pipeline + +just validate # RSR + STATE validation +just docs # Generate all docs +just cookbook # Generate Justfile docs + +just guix-shell # Guix dev environment +just container-build # Build container +---- + +== Directory Structure + +[source] +---- +project/ +├── .editorconfig # Editor settings +├── .gitignore # Git ignore +├── .gitattributes # Line endings, diff drivers +├── .guix-channel # Guix channel +├── .well-known/ # RFC metadata +│ ├── ai.txt +│ ├── humans.txt +│ └── security.txt +├── .machine_readable/ # ALL machine-readable content +│ ├── STATE.a2ml # Project state, progress, blockers +│ ├── META.a2ml # Architecture decisions, governance +│ ├── ECOSYSTEM.a2ml # Ecosystem position, relationships +│ ├── AGENTIC.a2ml # AI agent interaction patterns +│ ├── NEUROSYM.a2ml # Neurosymbolic integration config +│ ├── PLAYBOOK.a2ml # Operational runbook +│ ├── bot_directives/ # Per-bot rules and constraints +│ └── contractiles/ # Policy enforcement contracts +│ ├── k9/ # Security levels (Kennel/Yard/Hunt) +│ ├── dust/Dustfile # Recovery and rollback +│ ├── lust/Intentfile # Future intent declarations +│ ├── must/Mustfile # Invariant checks +│ └── trust/Trustfile.hs # Cryptographic verification +├── docs/ # Documentation +│ ├── CITATIONS.adoc +│ ├── TOPOLOGY-GUIDE.adoc +│ ├── generated/ +│ └── man/ +├── src/abi/ # Idris2 ABI definitions +│ ├── Types.idr +│ ├── Layout.idr +│ └── Foreign.idr +├── ffi/zig/ # Zig FFI implementation +│ ├── build.zig +│ ├── src/main.zig +│ └── test/integration_test.zig +├── generated/abi/ # Auto-generated C headers +├── examples/ # Example code +├── guix.scm # Guix package +├── Justfile # Task runner +├── Containerfile # Container build +├── LICENSE # MPL-2.0 +├── EXHIBIT-A-ETHICAL-USE.txt # Ethical use guidelines +├── EXHIBIT-B-QUANTUM-SAFE.txt # Quantum-safe provenance +├── README.adoc # Overview +├── TOPOLOGY.md # Architecture + completion +├── PLACEHOLDERS.md # Template variable guide +├── 0-AI-MANIFEST.a2ml # Universal AI entry point +└── AI.a2ml # Claude-specific instructions +---- + +== RSR Compliance + +=== Language Tiers + +* **Tier 1** (Gold): Rust, Elixir, Zig, Ada, Haskell, ReScript, Gleam +* **Tier 2** (Silver): Nickel, Guile Scheme, Nix, Idris2, OCaml +* **Infrastructure**: Guix channels, derivations, Julia batch scripts + +=== Required Files + +* `.editorconfig` +* `.gitignore` +* `Justfile` +* `README.adoc` +* `LICENSE` (MPL-2.0) +* `.machine_readable/STATE.a2ml` +* `.well-known/security.txt` +* `.well-known/ai.txt` +* `.well-known/humans.txt` +* `guix.scm` OR `flake.nix` + +=== Prohibited + +* Python outside `salt/` directory +* TypeScript/JavaScript (use ReScript) +* CUE (use Guile/Nickel) +* `Dockerfile` (use `Containerfile`) +* npm, Bun, pnpm, yarn (use Deno) +* Go (use Rust) + +== STATE.a2ml + +The STATE.a2ml file tracks project state: + +[source] +---- +# STATE — Project State Checkpoint +# Format: a2ml (AI-readable markup) + +project: v-graphql +version: 0.1.0 +last-updated: 2026-02-14 +status: active + +phase: implementation +maturity: beta + +ecosystem: + part-of: RSR Framework + depends-on: [] + +milestones: + - name: Initial setup + completion: 100 + - name: Core implementation + completion: 0 +---- + +== Badge Schema + +Generate badges from STATE.a2ml: + +[source,bash] +---- +just badges standard +---- + +See `docs/BADGE_SCHEMA.adoc` for the full badge taxonomy. + +== Ecosystem Integration + +This template is part of: + +* **STATE.a2ml Ecosystem**: Conversation checkpoints +* **RSR Framework**: Repository standards +* **Consent-Aware-HTTP**: .well-known compliance +* **Hypatia**: Neurosymbolic security scanning +* **gitbot-fleet**: Bot orchestration + +== License + +SPDX-License-Identifier: CC-BY-SA-4.0 + +== Links + +* https://github.com/hyperpolymath/elegant-STATE[elegant-STATE] - STATE tooling +* https://github.com/hyperpolymath/conative-gating[conative-gating] - Policy enforcement +* https://rhodium.sh[Rhodium Standard] - RSR documentation diff --git a/deno/docs/STATE-VISUALIZER.adoc b/deno/docs/STATE-VISUALIZER.adoc new file mode 100644 index 0000000..2af3297 --- /dev/null +++ b/deno/docs/STATE-VISUALIZER.adoc @@ -0,0 +1,128 @@ += Project State Visualizer +[source] +---- + + + + +# RSR Template Repo — Project Topology + +## System Architecture + +``` + ┌─────────────────────────────────────────┐ + │ NEW REPOSITORY │ + │ (Consumer of this Template) │ + └───────────────────┬─────────────────────┘ + │ Scaffolding + ▼ + ┌─────────────────────────────────────────┐ + │ RSR TEMPLATE HUB │ + │ │ + │ ┌───────────┐ ┌───────────────────┐ │ + │ │ AI Gate- │ │ ABI / FFI │ │ + │ │ keeper │ │ Standard │ │ + │ │ (0-AI-M) │ │ (Idris2/Zig) │ │ + │ └─────┬─────┘ └────────┬──────────┘ │ + │ │ │ │ + │ ┌─────▼─────┐ ┌────────▼──────────┐ │ + │ │ Topology │ │ SCM / 6SCM │ │ + │ │ Guide │ │ Metadata │ │ + │ │ (Visual) │ │ (machine_read) │ │ + │ └─────┬─────┘ └────────┬──────────┘ │ + │ │ │ │ + │ ┌─────▼─────────────────▼──────────┐ │ + │ │ CONTAINER ECOSYSTEM │ │ + │ │ ┌──────────┐ ┌───────────────┐ │ │ + │ │ │ Podman / │ │ selur-compose │ │ │ + │ │ │ OCI │ │ cerro-torre │ │ │ + │ │ │ Build │ │ svalinn/vordr │ │ │ + │ │ └──────────┘ └───────────────┘ │ │ + │ │ ct-build.sh deploy.k9.ncl │ │ + │ └──────────────────────────────────┘ │ + └────────│─────────────────│──────────────┘ + │ │ + ▼ ▼ + ┌─────────────────────────────────────────┐ + │ PLATFORM INTEGRATION │ + │ ┌───────────┐ ┌───────────┐ ┌───────┐│ + │ │ GitHub │ │ GitLab │ │ Nix / ││ + │ │ Workflows │ │ CI/CD │ │ Guix ││ + │ └───────────┘ └───────────┘ └───────┘│ + └─────────────────────────────────────────┘ + + ┌─────────────────────────────────────────┐ + │ REPO INFRASTRUCTURE │ + │ Justfile / Mustfile .machine_readable/ │ + │ Codeowners / Reuse 0-AI-MANIFEST.a2ml │ + └─────────────────────────────────────────┘ +``` + +## Completion Dashboard + +``` +COMPONENT STATUS NOTES +───────────────────────────────── ────────────────── ───────────────────────────────── +CORE STANDARDS + ABI/FFI Standard (Idris2/Zig) ██████████ 100% Universal interface stable + AI Gatekeeper (0-AI-MANIFEST) ██████████ 100% Universal entry point active + TOPOLOGY.md Standard ██████████ 100% Visual summary guide active + 6SCM Metadata Structure ██████████ 100% Machine-readable state stable + +INFRASTRUCTURE + Justfile Automation ██████████ 100% Standard build/verify tasks + CI/CD Workflow Templates ██████████ 100% GH/GL scaffolding verified + Multi-Forge Sync ██████████ 100% Hub-and-spoke mirroring stable + +CONTAINER ECOSYSTEM (Phase 2) + Containerfile (OCI build) ██████████ 100% Multi-stage Chainguard base + selur-compose orchestration ██████████ 100% Template + concrete example + cerro-torre manifest ██████████ 100% Bundle metadata & signing + svalinn gateway policy ██████████ 100% .gatekeeper.yaml active + vordr runtime monitoring ██████████ 100% Runtime config template + k9-svc deployment (Nickel) ██████████ 100% Hunt-level deploy descriptor + ct-build.sh pipeline ██████████ 100% Build/sign/verify script + Justfile container-* recipes ██████████ 100% 8 recipes integrated + Trustfile CONTAINER_SUPPLY_CHAIN ██████████ 100% Supply chain section added + +REPO INFRASTRUCTURE + .machine_readable/ ██████████ 100% STATE/META/ECOSYSTEM active + Governance & License ██████████ 100% PMPL & Ethical use verified + Development Shells (Nix/Guix) ██████████ 100% Reproducible env stable + +───────────────────────────────────────────────────────────────────────────── +OVERALL: ██████████ 100% RSR Template Stable & Certified +``` + +## Key Dependencies + +``` +Philosophy ──────► RSR Standard ──────► Template Scaffolding ──► New Repo + │ │ │ │ + ▼ ▼ ▼ ▼ +CCCP Policy ─────► 0-AI-MANIFEST ────────► Justfile ──────────► Compliance + │ + ▼ + Container Ecosystem + ┌──────────┼──────────┐ + ▼ ▼ ▼ + selur-compose cerro- svalinn/ + (orchestrate) torre vordr + (sign) (monitor) + │ + ▼ + k9-svc deploy +``` + +## Update Protocol + +This file is maintained by both humans and AI agents. When updating: + +1. **After completing a component**: Change its bar and percentage +2. **After adding a component**: Add a new row in the appropriate section +3. **After architectural changes**: Update the ASCII diagram +4. **Date**: Update the `Last updated` comment at the top of this file + +Progress bars use: `█` (filled) and `░` (empty), 10 characters wide. +Percentages: 0%, 10%, 20%, ... 100% (in 10% increments). +---- diff --git a/deno/docs/accessibility/README.adoc b/deno/docs/accessibility/README.adoc new file mode 100644 index 0000000..7415d98 --- /dev/null +++ b/deno/docs/accessibility/README.adoc @@ -0,0 +1,257 @@ +// SPDX-License-Identifier: CC-BY-SA-4.0 += Burble Accessibility +:toc: auto +:icons: font + +== Overview + +Burble is committed to providing an accessible voice-first communication platform that works for everyone, regardless of ability. This document outlines our accessibility features, compliance targets, and roadmap. + +== Current Accessibility Features + +=== Keyboard Accessibility + +[cols="1,3,1", options="header"] +|=== +|Feature |Description |Status + +|Custom Keybindings +|Remappable keyboard shortcuts for all major actions +|✅ Implemented + +|Push-To-Talk +|Space key (configurable) for voice activation +|✅ Implemented + +|Mute/Deafen +|M/D keys for quick audio control +|✅ Implemented + +|Volume Control +|Arrow keys for volume adjustment +|✅ Implemented + +|Room Navigation +|Tab/Shift+Tab for room switching +|✅ Implemented +|=== + +=== Screen Reader Support + +[cols="1,3,1", options="header"] +|=== +|Feature |Description |Status + +|Presence Announcements +|"User joined/left room" audio cues +|✅ Implemented + +|Room Change Announcements +|"Switched to room X" notifications +|✅ Implemented + +|Moderation Announcements +|"User was action by moderator" alerts +|✅ Implemented + +|ARIA Attributes +|Semantic HTML for screen readers +|⚠️ Partial + +|Live Regions +|Dynamic content updates for screen readers +|⚠️ Planned +|=== + +== Planned Accessibility Features + +=== Visual Accessibility (Q2 2026) + +[cols="1,3,1", options="header"] +|=== +|Feature |Description |Target + +|High Contrast Mode +|WCAG 4.5:1 contrast ratios +|Q2 2026 + +|Colorblind Support +|Deuteranopia, Protanopia, Tritanopia palettes +|Q2 2026 + +|Font Size Adjustment +|4 levels (14-20px) with persistence +|Q2 2026 + +|Theme Switching +|Dark/Light/System with OS preference detection +|Q2 2026 + +|Reduced Motion +|Respects `prefers-reduced-motion` +|Q2 2026 +|=== + +=== Auditory Accessibility (Q3 2026) + +[cols="1,3,1", options="header"] +|=== +|Feature |Description |Target + +|Closed Captions +|Real-time voice-to-text (Web Speech API) +|Q3 2026 + +|Visual Notifications +|On-screen indicators for audio events +|Q3 2026 + +|Volume Normalization +|EBU R128 (-23 LUFS) compliance +|Q3 2026 + +|Voice Commands +|Voice-controlled interface +|Q3 2026 +|=== + +=== Cognitive Accessibility (Q4 2026) + +[cols="1,3,1", options="header"] +|=== +|Feature |Description |Target + +|Clear Language Mode +|Simplified terminology with tooltips +|Q4 2026 + +|Predictable Navigation +|Consistent layout across all pages +|Q4 2026 + +|Error Prevention +|Confirmations for all destructive actions +|Q4 2026 + +|Contextual Help +|Persistent help system with guidance +|Q4 2026 +|=== + +== Compliance Targets + +=== WCAG 2.1 Compliance + +[cols="1,2,1", options="header"] +|=== +|Level |Requirements |Target + +|WCAG 2.1 A +|Minimum accessibility +|Q2 2026 + +|WCAG 2.1 AA +|Recommended accessibility +|Q4 2026 + +|WCAG 2.1 AAA +|Enhanced accessibility +|2027 +|=== + +=== Legal Compliance + +[cols="1,3,1", options="header"] +|=== +|Standard |Description |Target + +|Section 508 +|U.S. federal accessibility requirements +|Q4 2026 + +|EN 301 549 +|EU public sector procurement +|Q4 2026 + +|VPAT 2.4 +|Voluntary Product Accessibility Template +|Q4 2026 +|=== + +== Implementation Roadmap + +=== Q2 2026: Foundation + +* Port PanLL's accessibility engine +* Implement theme switching +* Add font size adjustment +* Integrate K9 accessibility validator +* Create basic compliance report + +=== Q3 2026: Enhancement + +* Add closed captions +* Implement visual notifications +* Add colorblind support +* Complete screen reader support +* Add accessibility testing to CI + +=== Q4 2026: Compliance + +* Achieve WCAG 2.1 AA compliance +* Complete legal compliance documentation +* Publish VPAT +* Final accessibility audit + +== Testing & Validation + +=== Automated Testing + +* **pa11y**: Automated WCAG testing +* **axe-core**: Accessibility engine +* **K9-SVC**: Contractile validation +* **CI Integration**: GitHub Actions workflow + +=== Manual Testing + +* Keyboard-only navigation +* Screen reader testing (NVDA, VoiceOver) +* High contrast mode verification +* Colorblind simulation testing + +== Reporting Accessibility Issues + +Found an accessibility issue? Please report it: + +* **GitHub Issues**: https://github.com/hyperpolymath/burble/issues +* **Email**: accessibility@hyperpolymath.dev +* **Matrix**: #hyperpolymath-accessibility:matrix.org + +Include: +- Description of the issue +- Steps to reproduce +- Browser/OS/Assistive technology used +- Suggested fix (if any) + +== Accessibility Statement + +Burble is committed to: + +* Following WCAG 2.1 guidelines +* Providing equivalent alternatives for audio content +* Ensuring keyboard accessibility +* Supporting screen readers and other assistive technologies +* Continuous improvement based on user feedback + +We welcome contributions to improve accessibility. See our link:../CONTRIBUTING.adoc[Contributing Guide] for details. + +== Related Documents + +* link:../ROADMAP.adoc[Project Roadmap] — Accessibility milestones +* link:../../.machine_readable/contractiles/adjust/Adjustfile.a2ml[Adjustfile] — Accessibility contract +* link:https://www.w3.org/WAI/standards-guidelines/wcag/[WCAG Guidelines] — Official standards +* link:https://www.section508.gov/[Section 508] — U.S. federal requirements + +== License + +This document is licensed under MPL-2.0. See link:../../LICENSE[LICENSE] for details. diff --git a/deno/docs/architecture/0.2-AI-MANIFEST.a2ml b/deno/docs/architecture/0.2-AI-MANIFEST.a2ml new file mode 100644 index 0000000..028b503 --- /dev/null +++ b/deno/docs/architecture/0.2-AI-MANIFEST.a2ml @@ -0,0 +1,17 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "architecture-track" +level: 2 +parent: "../0.1-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Documentation track for system architecture and threat models. + +canonical_locations: + threat_model: "THREAT-MODEL.adoc" + +invariants: + - "Visual diagrams MUST include ASCII or Mermaid representations" diff --git a/deno/docs/architecture/THREAT-MODEL.adoc b/deno/docs/architecture/THREAT-MODEL.adoc new file mode 100644 index 0000000..df5e038 --- /dev/null +++ b/deno/docs/architecture/THREAT-MODEL.adoc @@ -0,0 +1,162 @@ += Threat Model + + + +# Threat Model: {{PROJECT_NAME}} + +## Document Info + +| Field | Value | +|---------------|--------------------------------| +| Project | {{PROJECT_NAME}} | +| Version | 1.0 | +| Last Reviewed | {{DATE}} | +| Author | {{AUTHOR}} | +| Methodology | STRIDE | + +## Scope + +### In Scope + +- Application source code and build pipeline +- CI/CD workflows (GitHub Actions) +- Container images and runtime environment +- Secrets and credential management +- Dependencies (direct and transitive) +- Deployment artifacts (binaries, containers, SBOM) + +### Out of Scope + +- Physical security of hosting infrastructure +- GitHub/GitLab platform-level vulnerabilities +- End-user device security +- Social engineering attacks against maintainers (handled by org policy) + +## System Overview + +Brief description of {{PROJECT_NAME}} and its architecture. + +> See [STATE-VISUALIZER.adoc](../STATE-VISUALIZER.adoc) for the full architecture diagram and completion dashboard. + +## Assets + +| Asset | Classification | Owner | Notes | +|----------------------|----------------|-------------|--------------------------------------------| +| Source code | Internal | Maintainers | Public repos are still internal-integrity | +| Signing keys | Restricted | Release lead | Signing keys (e.g., Ed25519), GPG keys | +| CI/CD secrets | Restricted | Maintainers | GITHUB_TOKEN, deploy tokens, PATs | +| User/contributor data | Confidential | Org | Emails, contributor identity | +| Build artifacts | Internal | CI pipeline | Binaries, WASM bundles | +| Container images | Internal | CI pipeline | Chainguard-based, signed via image signing tool | +| SBOM / provenance | Public | CI pipeline | SLSA attestations | +| Dependencies | Public | Lockfile | Cargo.lock, deno.lock, gleam.toml | +| Infrastructure config | Confidential | Maintainers | Containerfiles, compose files, orchestration config | + +## Trust Boundaries + +| Boundary | From (Lower Trust) | To (Higher Trust) | +|-----------------------------|---------------------------|----------------------------| +| Pull request submission | External contributor | Repository codebase | +| CI/CD workflow execution | Workflow definition | Runner with secrets access | +| Container build boundary | Build stage | Runtime stage | +| External API calls | Third-party service | Application internals | +| User input (CLI/Web) | End user | Application logic | +| Dependency resolution | Package registry | Build environment | +| Forge mirroring | GitHub | GitLab / Bitbucket | + +## Threat Actors + +| Actor | Motivation | Capability | +|--------------------------|-------------------------------|------------| +| Script kiddie | Vandalism, clout | Low | +| Disgruntled contributor | Sabotage, backdoor insertion | Medium | +| Supply chain attacker | Wide-impact compromise | High | +| Nation state | Espionage, disruption | Very High | +| Automated bot | Credential stuffing, spam PRs | Low-Medium | + +## STRIDE Analysis + +### Spoofing + +| Threat | Affected Asset | Likelihood | Impact | Risk | Mitigation | +|---------------------------------|-------------------|------------|--------|--------|------------------------------------------------| +| Unsigned commits impersonate maintainer | Source code | Medium | High | High | Require GPG-signed commits; vigilant code review | +| Forged bot actions (automated agents) | CI/CD pipeline | Low | High | Medium | Bot tokens scoped minimally; audit bot activity | +| Spoofed package registry identity | Dependencies | Low | High | Medium | Pin dependencies by hash; verify provenance | + +### Tampering + +| Threat | Affected Asset | Likelihood | Impact | Risk | Mitigation | +|---------------------------------|-------------------|------------|--------|--------|------------------------------------------------| +| Malicious pull request | Source code | Medium | High | High | Branch protection; required reviews; CodeQL | +| Dependency poisoning (typosquat) | Dependencies | Medium | High | High | Lockfiles; secret-scanner; security scans | +| Tampered container base image | Container images | Low | High | Medium | Chainguard images; image signing verification | +| Workflow file modification | CI/CD pipeline | Low | High | Medium | CODEOWNERS on .github/; workflow-linter | + +### Repudiation + +| Threat | Affected Asset | Likelihood | Impact | Risk | Mitigation | +|---------------------------------|-------------------|------------|--------|--------|------------------------------------------------| +| Unlogged deployment | Build artifacts | Medium | Medium | Medium | SLSA provenance; deployment audit trail | +| Denied merge of vulnerable code | Source code | Low | Medium | Low | Git history is immutable; signed commits | +| Secret rotation without record | CI/CD secrets | Low | Low | Low | Secret rotation logged in STATE.a2ml | + +### Information Disclosure + +| Threat | Affected Asset | Likelihood | Impact | Risk | Mitigation | +|---------------------------------|-------------------|------------|--------|--------|------------------------------------------------| +| Secrets leaked in git history | CI/CD secrets | Medium | High | High | TruffleHog in CI; secret-scanner workflow | +| Verbose error messages in prod | Application logic | Medium | Medium | Medium | Sanitize outputs; structured logging | +| SBOM reveals internal structure | Infrastructure | Low | Low | Low | Accepted risk; SBOM is intentionally public | + +### Denial of Service + +| Threat | Affected Asset | Likelihood | Impact | Risk | Mitigation | +|---------------------------------|-------------------|------------|--------|--------|------------------------------------------------| +| CI resource exhaustion (fork bomb in PR) | CI/CD pipeline | Medium | Medium | Medium | Concurrency limits; timeout on workflows | +| Spam issues/PRs flooding triage | Maintainer time | Medium | Low | Low | GitHub rate limits; bot auto-close stale | +| Large binary commits bloating repo | Source code | Low | Medium | Low | .gitattributes LFS policy; pre-commit hooks | + +### Elevation of Privilege + +| Threat | Affected Asset | Likelihood | Impact | Risk | Mitigation | +|---------------------------------|-------------------|------------|--------|--------|------------------------------------------------| +| Workflow injection via PR title/body | CI/CD pipeline | Medium | High | High | Never interpolate PR fields in `run:`; use env vars | +| GITHUB_TOKEN over-scoped | CI/CD secrets | Medium | High | High | `permissions: read-all` default; per-job scoping | +| Container escape | Runtime environment | Low | High | Medium | Hardened container runtime; read-only rootfs; no-new-privileges | +| Compromised action dependency | CI/CD pipeline | Medium | High | High | SHA-pin all actions; never use `@latest` tags | + +## Mitigations in Place + +- **SLSA Provenance**: Build attestations via slsa-github-generator +- **Secret Scanning**: TruffleHog + secret-scanner workflow on every push +- **Static Analysis**: CodeQL on supported languages +- **Supply Chain**: OpenSSF Scorecard (scorecard.yml + scorecard-enforcer.yml) +- **Container Signing**: Ed25519 signatures on all published images (optional: use your signing tool) +- **Container Runtime**: Hardened container runtime with formal verification (optional) +- **Dependency Pinning**: All GitHub Actions SHA-pinned; lockfiles committed +- **Workflow Validation**: workflow-linter.yml checks all workflow changes +- **Security Scanning**: Neurosymbolic scanning (hypatia-scan.yml, optional) +- **Bot Governance**: Bot orchestration with confidence thresholds (optional) +- **Edge Security**: Gateway with policy enforcement (optional, where applicable) +- **SBOM**: Generated and published with releases + +## Residual Risks + +| Risk | Accepted Because | Review Trigger | +|-----------------------------------------------|---------------------------------------------------|-------------------------| +| Zero-day in GitHub Actions runner | Platform responsibility; no feasible mitigation | GitHub advisory | +| Maintainer account compromise | Mitigated by 2FA requirement; residual remains | Any suspicious activity | +| Transitive dependency vulnerability (0-day) | Lockfiles limit blast radius; scanning catches known CVEs | CVE database update | +| SBOM exposes internal component names | Transparency is a design goal | Policy change | + +## Review Schedule + +This threat model should be reviewed: + +- **Quarterly** as a standing item +- **When architecture changes** (new services, new trust boundaries, new deployment targets) +- **Before major releases** (v1.0, v2.0, etc.) +- **After any security incident** affecting this project or its dependencies + +Reviewer should update the "Last Reviewed" date and version in Document Info above. diff --git a/deno/docs/attribution/0.2-AI-MANIFEST.a2ml b/deno/docs/attribution/0.2-AI-MANIFEST.a2ml new file mode 100644 index 0000000..52beaea --- /dev/null +++ b/deno/docs/attribution/0.2-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "attribution-unit" +level: 2 +parent: "../0.1-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Sub-unit of the docs pillar focusing on attribution. diff --git a/deno/docs/attribution/CITATION.cff b/deno/docs/attribution/CITATION.cff new file mode 100644 index 0000000..05d36d9 --- /dev/null +++ b/deno/docs/attribution/CITATION.cff @@ -0,0 +1,17 @@ +cff-version: 1.2.0 +message: "If you use this software, please cite it as below." +authors: +- family-names: "{{AUTHOR_LAST}}" + given-names: "{{AUTHOR_FIRST}}" + orcid: "https://orcid.org/0000-0000-0000-0000" # Placeholder +title: "{{PROJECT_NAME}}" +version: 0.1.0 +date-released: {{CURRENT_DATE}} +url: "https://{{FORGE}}/{{OWNER}}/{{REPO}}" +repository-code: "https://{{FORGE}}/{{OWNER}}/{{REPO}}" +license: MPL-2.0 +keywords: + - "rsr" + - "formal-verification" + - "neurosymbolic" + - "provenance" diff --git a/deno/docs/attribution/CITATIONS.adoc b/deno/docs/attribution/CITATIONS.adoc new file mode 100644 index 0000000..2ca532e --- /dev/null +++ b/deno/docs/attribution/CITATIONS.adoc @@ -0,0 +1,35 @@ += {{PROJECT_NAME}} - Citation Guide +:toc: + +== BibTeX + +[source,bibtex] +---- +@software{{{PROJECT_NAME}}_{{CURRENT_YEAR}}, + author = {{{AUTHOR_LAST}}, {{AUTHOR_FIRST}}}, + title = {{{PROJECT_NAME}}}, + year = {{{CURRENT_YEAR}}}, + url = {https://github.com/{{OWNER}}/{{PROJECT_NAME}}}, + license = {MPL-2.0} +} +---- + +== Harvard Style + +{{AUTHOR_LAST}}, {{AUTHOR_INITIALS}} ({{CURRENT_YEAR}}) _{{PROJECT_NAME}}_ [Computer software]. Available at: https://github.com/{{OWNER}}/{{PROJECT_NAME}} + +== OSCOLA + +{{AUTHOR}}, '{{PROJECT_NAME}}' ({{CURRENT_YEAR}}) + +== MLA + +{{AUTHOR_LAST}}, {{AUTHOR_FIRST}} "{{PROJECT_NAME}}." {{CURRENT_YEAR}}, github.com/{{OWNER}}/{{PROJECT_NAME}}. + +== APA 7 + +{{AUTHOR_LAST}}, {{AUTHOR_INITIALS}} ({{CURRENT_YEAR}}). _{{PROJECT_NAME}}_ [Computer software]. GitHub. https://github.com/{{OWNER}}/{{PROJECT_NAME}} + +== See Also + +* link:CITATION.cff[CITATION.cff] diff --git a/deno/docs/attribution/CODEOWNERS.adoc b/deno/docs/attribution/CODEOWNERS.adoc new file mode 100644 index 0000000..3714055 --- /dev/null +++ b/deno/docs/attribution/CODEOWNERS.adoc @@ -0,0 +1,19 @@ += Code Ownership +:icons: font + +This project utilizes a formally defined code ownership structure to ensure that specific components are reviewed by domain experts. + +== Authority Model + +Our ownership model is based on the "Perimeter" architecture: +* **Perimeter 1 (Core):** Strictly controlled by Lead Maintainers. +* **Perimeter 2 (Extensions):** Maintained by component owners. +* **Perimeter 3 (Community):** Open for broader community participation. + +== Automated Enforcement + +The technical rules for automatic review assignments are maintained in the machine-readable link:../../.github/CODEOWNERS[.github/CODEOWNERS] file. GitHub uses this to automatically notify owners when changes are proposed to their sections. + +== Component Owners + +A full list of maintainers and their contact information can be found in link:MAINTAINERS.adoc[MAINTAINERS.adoc]. diff --git a/deno/docs/attribution/MAINTAINERS.adoc b/deno/docs/attribution/MAINTAINERS.adoc new file mode 100644 index 0000000..d829dd9 --- /dev/null +++ b/deno/docs/attribution/MAINTAINERS.adoc @@ -0,0 +1,47 @@ +// SPDX-License-Identifier: CC-BY-SA-4.0 += Maintainers +:toc: preamble + +This document lists the maintainers of this project and their responsibilities. + +== Current Maintainers + +[cols="2,3,2",options="header"] +|=== +| Name | Role | Contact + +| {{AUTHOR}} +| Lead Maintainer +| https://github.com/{{OWNER}}[@{{OWNER}}] +|=== + +== Responsibilities + +Maintainers are responsible for: + +* Reviewing and merging pull requests +* Triaging issues and feature requests +* Ensuring code quality and security standards +* Managing releases and versioning +* Upholding the project's code of conduct + +== Becoming a Maintainer + +Contributors who demonstrate: + +* Consistent, high-quality contributions +* Understanding of the project's goals and standards +* Constructive participation in discussions +* Commitment to the project's long-term health + +May be invited to become maintainers at the discretion of existing maintainers. + +== Decision Making + +* Routine decisions (bug fixes, minor improvements) can be made by any maintainer +* Significant changes require discussion and consensus among maintainers +* Breaking changes or major features should be discussed in issues before implementation + +== Contact + +For questions about project governance, open an issue or contact the maintainers listed above. diff --git a/deno/docs/attribution/README.adoc b/deno/docs/attribution/README.adoc new file mode 100644 index 0000000..b095612 --- /dev/null +++ b/deno/docs/attribution/README.adoc @@ -0,0 +1 @@ += attribution Unit diff --git a/deno/docs/compliance/ACCESSIBILITY.adoc b/deno/docs/compliance/ACCESSIBILITY.adoc new file mode 100644 index 0000000..4f94233 --- /dev/null +++ b/deno/docs/compliance/ACCESSIBILITY.adoc @@ -0,0 +1,3 @@ += Accessibility Compliance +Status: Partial +Target: WCAG 2.1 AA diff --git a/deno/docs/decisions/0.2-AI-MANIFEST.a2ml b/deno/docs/decisions/0.2-AI-MANIFEST.a2ml new file mode 100644 index 0000000..ac26298 --- /dev/null +++ b/deno/docs/decisions/0.2-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "decisions-unit" +level: 2 +parent: "../0.1-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Sub-unit of the docs pillar focusing on decisions. diff --git a/deno/docs/decisions/0000-template.adoc b/deno/docs/decisions/0000-template.adoc new file mode 100644 index 0000000..763eab1 --- /dev/null +++ b/deno/docs/decisions/0000-template.adoc @@ -0,0 +1,35 @@ += Architecture Decision Record: 0000-template + + + +# [NUMBER]. [TITLE] + +Date: YYYY-MM-DD + +## Status + +[Proposed | Accepted | Deprecated | Superseded by [ADR-NNNN](NNNN-title.md) | Rejected] + +## Context + +What is the issue that we're seeing that is motivating this decision or change? + +## Decision + +What is the change that we're proposing and/or doing? + +## Consequences + +What becomes easier or more difficult to do because of this change? + +### Positive + +- ... + +### Negative + +- ... + +### Neutral + +- ... diff --git a/deno/docs/decisions/0001-adopt-rsr-standard.adoc b/deno/docs/decisions/0001-adopt-rsr-standard.adoc new file mode 100644 index 0000000..59e845f --- /dev/null +++ b/deno/docs/decisions/0001-adopt-rsr-standard.adoc @@ -0,0 +1,86 @@ += Architecture Decision Record: 0001-adopt-rsr-standard + + + +# 1. Adopt Rhodium Standard Repository (RSR) Template + +Date: 2026-02-14 + +## Status + +Accepted + +## Context + +Managing multiple repositories with an ad-hoc approach led to significant +inconsistencies across the ecosystem. Common problems included: + +- Missing or incomplete configuration files (SECURITY.md, CONTRIBUTING.md, + .editorconfig, etc.) +- State files (STATE.a2ml, META.a2ml, ECOSYSTEM.a2ml) placed in the repository + root instead of the canonical `.machine_readable/` directory +- Duplicate or conflicting workflow definitions across repos +- No standardized entry point for AI agents interacting with repositories +- Inconsistent bot directive configurations leading to unreliable automation +- No contractile enforcement or Justfile automation + +Without a single source of truth for repository structure, each new repo +required manual setup and inevitably drifted from best practices over time. + +## Decision + +Adopt the Rhodium Standard Repository (RSR) template (`rsr-template-repo`) as +the canonical starting point for all new repositories. Existing repositories +will migrate incrementally as they receive active development. + +The RSR template provides: + +- **Machine-readable state files** in `.machine_readable/` (STATE.a2ml, + ECOSYSTEM.a2ml, META.a2ml, AGENTIC.a2ml, NEUROSYM.a2ml, PLAYBOOK.a2ml) +- **AI manifest** (`0-AI-MANIFEST.a2ml`) as a universal entry point for all + AI agents +- **Bot directives** in `.machine_readable/bot_directives/` for bot orchestration integration +- **Contractiles** in `.machine_readable/contractiles/` (k9, dust, lust, must, trust) for + policy enforcement +- **Standardized workflows** (16+ GitHub Actions workflows, all SHA-pinned) +- **Justfile automation** with standard recipes for common tasks +- **Security and governance files**: SECURITY.md, CONTRIBUTING.md, + CODE_OF_CONDUCT.md, LICENSE (MPL-2.0) +- **Architecture Decision Records** in `docs/decisions/` + +New repositories are created by cloning the template: + +```bash +git clone https://github.com/{{OWNER}}/rsr-template-repo new-repo-name +cd new-repo-name +rm -rf .git && git init +``` + +## Consequences + +### Positive + +- Consistency across all repositories, enforced from creation +- Automated compliance checking via `rsr-antipattern.yml` workflow +- Bot fleet can operate reliably across all repos with predictable structure +- AI agents (Claude, Gemini, etc.) have a standardized entry point via + `0-AI-MANIFEST.a2ml` +- New contributors can onboard faster with familiar, documented structure +- Reduced maintenance burden: fix once in template, propagate to all repos +- Machine-readable state enables tooling and automation pipelines + +### Negative + +- Migration effort for existing repos requires time and attention +- Learning curve for contributors unfamiliar with RSR conventions +- Template updates need propagation mechanism to existing repos +- Some repos may have unique needs that do not fit the standard template + without customization + +### Neutral + +- Existing CI/CD pipelines continue to work; RSR workflows are additive +- Third-party dependencies retain their original licenses regardless of + repo structure +- ADR process itself is part of the template, enabling future decisions + to be recorded consistently diff --git a/deno/docs/decisions/README.adoc b/deno/docs/decisions/README.adoc new file mode 100644 index 0000000..153a5e7 --- /dev/null +++ b/deno/docs/decisions/README.adoc @@ -0,0 +1 @@ += decisions Unit diff --git a/deno/docs/developer/0.2-AI-MANIFEST.a2ml b/deno/docs/developer/0.2-AI-MANIFEST.a2ml new file mode 100644 index 0000000..c16fcc7 --- /dev/null +++ b/deno/docs/developer/0.2-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "developer-unit" +level: 2 +parent: "../0.1-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Sub-unit of the docs pillar focusing on developer. diff --git a/deno/docs/developer/ABI-FFI-README.adoc b/deno/docs/developer/ABI-FFI-README.adoc new file mode 100644 index 0000000..65d2afe --- /dev/null +++ b/deno/docs/developer/ABI-FFI-README.adoc @@ -0,0 +1,384 @@ += ABI/FFI Standards +{{~ Aditionally delete this line and fill out the template below ~}} + +# {{PROJECT}} ABI/FFI Documentation + +## Overview + +This library follows the **Hyperpolymath RSR Standard** for ABI and FFI design: + +- **ABI (Application Binary Interface)** defined in **Idris2** with formal proofs +- **FFI (Foreign Function Interface)** implemented in **Zig** for C compatibility +- **Generated C headers** bridge Idris2 ABI to Zig FFI +- **Any language** can call through standard C ABI + +## Architecture + +``` +┌─────────────────────────────────────────────┐ +│ ABI Definitions (Idris2) │ +│ src/abi/ │ +│ - Types.idr (Type definitions) │ +│ - Layout.idr (Memory layout proofs) │ +│ - Foreign.idr (FFI declarations) │ +└─────────────────┬───────────────────────────┘ + │ + │ generates (at compile time) + ▼ +┌─────────────────────────────────────────────┐ +│ C Headers (auto-generated) │ +│ generated/abi/{{project}}.h │ +└─────────────────┬───────────────────────────┘ + │ + │ imported by + ▼ +┌─────────────────────────────────────────────┐ +│ FFI Implementation (Zig) │ +│ ffi/zig/src/main.zig │ +│ - Implements C-compatible functions │ +│ - Zero-cost abstractions │ +│ - Memory-safe by default │ +└─────────────────┬───────────────────────────┘ + │ + │ compiled to lib{{project}}.so/.a + ▼ +┌─────────────────────────────────────────────┐ +│ Any Language via C ABI │ +│ - Rust, ReScript, Julia, Python, etc. │ +└─────────────────────────────────────────────┘ +``` + +## Directory Structure + +``` +{{project}}/ +├── src/ +│ ├── abi/ # ABI definitions (Idris2) +│ │ ├── Types.idr # Core type definitions with proofs +│ │ ├── Layout.idr # Memory layout verification +│ │ └── Foreign.idr # FFI function declarations +│ └── lib/ # Core library (any language) +│ +├── ffi/ +│ └── zig/ # FFI implementation (Zig) +│ ├── build.zig # Build configuration +│ ├── build.zig.zon # Dependencies +│ ├── src/ +│ │ └── main.zig # C-compatible FFI implementation +│ ├── test/ +│ │ └── integration_test.zig +│ └── include/ +│ └── {{project}}.h # C header (optional, can be generated) +│ +├── generated/ # Auto-generated files +│ └── abi/ +│ └── {{project}}.h # Generated from Idris2 ABI +│ +└── bindings/ # Language-specific wrappers (optional) + ├── rust/ + ├── rescript/ + └── julia/ +``` + +## Why Idris2 for ABI? + +### 1. **Formal Verification** + +Idris2's dependent types allow proving properties about the ABI at compile-time: + +```idris +-- Prove struct size is correct +public export +exampleStructSize : HasSize ExampleStruct 16 + +-- Prove field alignment is correct +public export +fieldAligned : Divides 8 (offsetOf ExampleStruct.field) + +-- Prove ABI is platform-compatible +public export +abiCompatible : Compatible (ABI 1) (ABI 2) +``` + +### 2. **Type Safety** + +Encode invariants that C/Zig cannot express: + +```idris +-- Non-null pointer guaranteed at type level +data Handle : Type where + MkHandle : (ptr : Bits64) -> {auto 0 nonNull : So (ptr /= 0)} -> Handle + +-- Array with length proof +data Buffer : (n : Nat) -> Type where + MkBuffer : Vect n Byte -> Buffer n +``` + +### 3. **Platform Abstraction** + +Platform-specific types with compile-time selection: + +```idris +CInt : Platform -> Type +CInt Linux = Bits32 +CInt Windows = Bits32 + +CSize : Platform -> Type +CSize Linux = Bits64 +CSize Windows = Bits64 +``` + +### 4. **Safe Evolution** + +Prove that new ABI versions are backward-compatible: + +```idris +-- Compiler enforces compatibility +abiUpgrade : ABI 1 -> ABI 2 +abiUpgrade old = MkABI2 { + -- Must preserve all v1 fields + v1_compat = old, + -- Can add new fields + new_features = defaults +} +``` + +## Why Zig for FFI? + +### 1. **C ABI Compatibility** + +Zig exports C-compatible functions naturally: + +```zig +export fn library_function(param: i32) i32 { + return param * 2; +} +``` + +### 2. **Memory Safety** + +Compile-time safety without runtime overhead: + +```zig +// Null check enforced at compile time +const handle = init() orelse return error.InitFailed; +defer free(handle); +``` + +### 3. **Cross-Compilation** + +Built-in cross-compilation to any platform: + +```bash +zig build -Dtarget=x86_64-linux +zig build -Dtarget=aarch64-macos +zig build -Dtarget=x86_64-windows +``` + +### 4. **Zero Dependencies** + +No runtime, no libc required (unless explicitly needed): + +```zig +// Minimal binary size +pub const lib = @import("std"); +// Only includes what you use +``` + +## Building + +### Build FFI Library + +```bash +cd ffi/zig +zig build # Build debug +zig build -Doptimize=ReleaseFast # Build optimized +zig build test # Run tests +``` + +### Generate C Header from Idris2 ABI + +```bash +cd src/abi +idris2 --cg c-header Types.idr -o ../../generated/abi/{{project}}.h +``` + +### Cross-Compile + +```bash +cd ffi/zig + +# Linux x86_64 +zig build -Dtarget=x86_64-linux + +# macOS ARM64 +zig build -Dtarget=aarch64-macos + +# Windows x86_64 +zig build -Dtarget=x86_64-windows +``` + +## Usage + +### From C + +```c +#include "{{project}}.h" + +int main() { + void* handle = {{project}}_init(); + if (!handle) return 1; + + int result = {{project}}_process(handle, 42); + if (result != 0) { + const char* err = {{project}}_last_error(); + fprintf(stderr, "Error: %s\n", err); + } + + {{project}}_free(handle); + return 0; +} +``` + +Compile with: +```bash +gcc -o example example.c -l{{project}} -L./zig-out/lib +``` + +### From Idris2 + +```idris +import {{PROJECT}}.ABI.Foreign + +main : IO () +main = do + Just handle <- init + | Nothing => putStrLn "Failed to initialize" + + Right result <- process handle 42 + | Left err => putStrLn $ "Error: " ++ errorDescription err + + free handle + putStrLn "Success" +``` + +### From Rust + +```rust +#[link(name = "{{project}}")] +extern "C" { + fn {{project}}_init() -> *mut std::ffi::c_void; + fn {{project}}_free(handle: *mut std::ffi::c_void); + fn {{project}}_process(handle: *mut std::ffi::c_void, input: u32) -> i32; +} + +fn main() { + unsafe { + let handle = {{project}}_init(); + assert!(!handle.is_null()); + + let result = {{project}}_process(handle, 42); + assert_eq!(result, 0); + + {{project}}_free(handle); + } +} +``` + +### From Julia + +```julia +const lib{{project}} = "lib{{project}}" + +function init() + handle = ccall((:{{project}}_init, lib{{project}}), Ptr{Cvoid}, ()) + handle == C_NULL && error("Failed to initialize") + handle +end + +function process(handle, input) + result = ccall((:{{project}}_process, lib{{project}}), Cint, (Ptr{Cvoid}, UInt32), handle, input) + result +end + +function cleanup(handle) + ccall((:{{project}}_free, lib{{project}}), Cvoid, (Ptr{Cvoid},), handle) +end + +# Usage +handle = init() +try + result = process(handle, 42) + println("Result: $result") +finally + cleanup(handle) +end +``` + +## Testing + +### Unit Tests (Zig) + +```bash +cd ffi/zig +zig build test +``` + +### Integration Tests + +```bash +cd ffi/zig +zig build test-integration +``` + +### ABI Verification (Idris2) + +```idris +-- Compile-time verification +%runElab verifyABI + +-- Runtime checks +main : IO () +main = do + verifyLayoutsCorrect + verifyAlignmentsCorrect + putStrLn "ABI verification passed" +``` + +## Contributing + +When modifying the ABI/FFI: + +1. **Update ABI first** (`src/abi/*.idr`) + - Modify type definitions + - Update proofs + - Ensure backward compatibility + +2. **Generate C header** + ```bash + idris2 --cg c-header src/abi/Types.idr -o generated/abi/{{project}}.h + ``` + +3. **Update FFI implementation** (`ffi/zig/src/main.zig`) + - Implement new functions + - Match ABI types exactly + +4. **Add tests** + - Unit tests in Zig + - Integration tests + - ABI verification tests + +5. **Update documentation** + - Function signatures + - Usage examples + - Migration guide (if breaking changes) + +## License + +{{LICENSE}} + +## See Also + +- [Idris2 Documentation](https://idris2.readthedocs.io) +- [Zig Documentation](https://ziglang.org/documentation/master/) +- [Rhodium Standard Repositories](https://github.com/{{OWNER}}/rhodium-standard-repositories) diff --git a/deno/docs/developer/README.adoc b/deno/docs/developer/README.adoc new file mode 100644 index 0000000..1d00529 --- /dev/null +++ b/deno/docs/developer/README.adoc @@ -0,0 +1 @@ += developer Unit diff --git a/deno/docs/governance/0.1-AI-MANIFEST.a2ml b/deno/docs/governance/0.1-AI-MANIFEST.a2ml new file mode 100644 index 0000000..6e373bd --- /dev/null +++ b/deno/docs/governance/0.1-AI-MANIFEST.a2ml @@ -0,0 +1,21 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "governance-pillar" +level: 1 +parent: "../0-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Primary governance pillar implementing the Triaxial Software Development + Methodology (TSDM). Contains planning, maintenance, and audit tracks. + +canonical_locations: + tsdm_spec: "TSDM.adoc" + planning: "planning/" + maintenance: "maintenance/" + audit: "audit/" + crg: "CRG-CRITERIA.adoc" + checklist: "MAINTENANCE-CHECKLIST.adoc" + approach: "SOFTWARE-DEVELOPMENT-APPROACH.adoc" diff --git a/deno/docs/governance/CRG-CRITERIA.a2ml b/deno/docs/governance/CRG-CRITERIA.a2ml new file mode 100644 index 0000000..6162585 --- /dev/null +++ b/deno/docs/governance/CRG-CRITERIA.a2ml @@ -0,0 +1,108 @@ +; SPDX-License-Identifier: MPL-2.0 +; Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) + +; Component Readiness Grades (CRG) — Machine-readable specification +; Format: A2ML (AI-to-Machine Language) +; Standard: CRG v1.0 + +(standard + (name "Component Readiness Grades") + (abbreviation "CRG") + (version "1.0") + (date "2026-02-28") + (author "Jonathan D.A. Jewell ") + (license "MPL-2.0") + (family "RSR")) + +(grades + (grade + (code X) + (name "Untested") + (release-stage #f) + (ordinal 0) + (description "No testing has been performed. Status unknown.") + (evidence-required "none") + (minimum-for #f)) + (grade + (code F) + (name "Harmful / Wasteful") + (release-stage #f) + (ordinal 1) + (description "Actively harmful, wasteful, or better handled externally. Reject, deprecate, or delegate.") + (evidence-required "documented test results showing harm, waste, or redundancy; comparison with alternatives") + (minimum-for #f)) + (grade + (code E) + (name "Minimal / Salvageable") + (release-stage "pre-alpha") + (ordinal 2) + (description "Does something slight. Barely functional. Needs redesign or major work.") + (evidence-required "at least one successful test case; documented failures and limitations") + (minimum-for #f)) + (grade + (code D) + (name "Partial / Inconsistent") + (release-stage "alpha") + (ordinal 3) + (description "Works on some things but not systematically.") + (evidence-required "matrix of tested scenarios; documented scope vs actual capabilities") + (minimum-for "alpha")) + (grade + (code C) + (name "Self-Validated") + (release-stage "beta") + (ordinal 4) + (description "Tested on the tool/project itself (dogfooding). Reliable in home context.") + (evidence-required "active dogfooding; CI integration or equivalent; no known failures in home context") + (minimum-for "beta")) + (grade + (code B) + (name "Broadly Validated") + (release-stage "release-candidate") + (ordinal 5) + (description "Tested on at least 6 disparate, unrelated targets.") + (evidence-required "list of 6+ diverse targets with test results; evidence of feedback incorporation") + (minimum-for "release-candidate")) + (grade + (code A) + (name "Field-Proven") + (release-stage "stable") + (ordinal 6) + (description "Real-world external feedback confirms value. Does no harm in the wild.") + (evidence-required "real-world usage data; feedback incorporation evidence; no unresolved harm reports") + (minimum-for "stable"))) + +(transitions + (promotion + (from X) (to E) (requirement "Run at least one test. Document results.")) + (promotion + (from X) (to F) (requirement "Evaluate and determine harmful or wasteful.")) + (promotion + (from E) (to D) (requirement "Fix critical failures. Document scope.")) + (promotion + (from D) (to C) (requirement "Dogfood on own project. Fix what breaks.")) + (promotion + (from C) (to B) (requirement "Test on 6+ diverse external targets. Fix what breaks.")) + (promotion + (from B) (to A) (requirement "Ship. Collect external feedback. Demonstrate no harm.")) + (demotion + (from A) (to B) (trigger "External feedback dries up or reveals no longer useful.")) + (demotion + (from A) (to F) (trigger "External feedback reveals component causes harm.")) + (demotion + (from B) (to C) (trigger "Broad validation reveals unfixed failures.")) + (demotion + (from C) (to D) (trigger "Home context changes and component no longer reliable.")) + (demotion + (from C) (to F) (trigger "Dogfooding reveals net negative.")) + (demotion + (from D) (to E) (trigger "Scope narrows to barely functional.")) + (demotion + (from any) (to F) (trigger "Better external alternative makes this pure opportunity cost."))) + +(conformance + (rule "Each assessable component MUST have a grade from {X, F, E, D, C, B, A}.") + (rule "Each grade above X MUST be supported by evidence per section 4.") + (rule "Assessments MUST be recorded in a version-controlled location.") + (rule "Assessments MUST be reviewed at least once per release cycle.") + (rule "Release stages MUST respect minimum grade thresholds.")) diff --git a/deno/docs/governance/CRG-CRITERIA.adoc b/deno/docs/governance/CRG-CRITERIA.adoc new file mode 100644 index 0000000..f8264e6 --- /dev/null +++ b/deno/docs/governance/CRG-CRITERIA.adoc @@ -0,0 +1,39 @@ += Component Readiness Grades (CRG) Criteria +:toc: preamble +:icons: font + +This document defines the quality assessment criteria for individual project components. + +== Grade Definitions + +[cols="1,2,3,4",options="header"] +|=== +| Grade | Name | Release Stage | Meaning + +| **A** | Field-Proven | Stable | Real-world feedback amassed; no harm in wild. +| **B** | Broadly Validated | Release Candidate | Tested on 6+ diverse external targets. +| **C** | Self-Validated | Beta | Reliable in home context (dogfooded). +| **D** | Partial | Alpha | Works on some inputs/cases but not systematically. +| **E** | Minimal | Pre-alpha | Barely functional; needs major work. +| **F** | Harmful/Wasteful | Reject/Delegate | Redundant or negative value. +| **X** | Untested | — | Status completely unknown. +|=== + +== Core Principles + +1. **Assess components, not projects:** Each feature gets its own grade. +2. **Evidence over intuition:** Every grade above X requires documented evidence. +3. **Honest assessment:** Grade the component as it is today, not as you hope it will be. +4. **Grades are earned and can be lost:** Regressions lead to demotion. + +== Assessment Checklist + +1. Has it been tested at all? (No → **X**) +2. Does it cause harm or duplicate something better? (Yes → **F**) +3. Does it do something, however slight? (Barely → **E**) +4. Does it work on some things but not others? (Partial → **D**) +5. Does it work reliably on our own project? (Dogfooded → **C**) +6. Has it been tested on 6+ diverse external targets? (Broad → **B**) +7. Do external users confirm it works and is useful? (Field-proven → **A**) + +See link:READINESS.adoc[READINESS.adoc] for the current project assessment. diff --git a/deno/docs/governance/MAINTENANCE-CHECKLIST.a2ml b/deno/docs/governance/MAINTENANCE-CHECKLIST.a2ml new file mode 100644 index 0000000..eaee720 --- /dev/null +++ b/deno/docs/governance/MAINTENANCE-CHECKLIST.a2ml @@ -0,0 +1,159 @@ +# SPDX-License-Identifier: MPL-2.0 +# Cross-repo maintenance baseline (machine-readable canonical) + +[metadata] +version = "1.1.0" +last-updated = "2026-02-24" +scope = "cross-repo" +source-human = "docs/maintenance/MAINTENANCE-CHECKLIST.adoc" +companion-human = "docs/practice/SOFTWARE-DEVELOPMENT-APPROACH.adoc" +companion-machine = ".machine_readable/policies/SOFTWARE-DEVELOPMENT-APPROACH.a2ml" + +[policy] +single-source = true +notes = "Use this file as canonical machine policy and keep markdown synchronized." + +[maintenance-axes] +scoping-first = true +execution-order = ["scoping", "axis-1", "axis-2", "axis-3"] +axis-1 = "must > intend > like" +axis-2 = "corrective > adaptive > perfective" +axis-3 = "systems > compliance > effects" + +[scoping] +inputs_required = [ + "README", + "roadmap", + "status-docs", + "maintenance-checklist", + "ci-and-security-docs", +] + +marker_scan_required = [ + "TODO", + "FIXME", + "XXX", + "HACK", + "STUB", + "PARTIAL", +] + +idris_unsound_scan_required = [ + "believe_me", + "assert_total", +] + +scope_assembly_buckets = ["must", "intend", "like"] + +[axis-2-maintenance-rules] +corrective-first = true +adaptive-second = true +adaptive_examples = [ + "scope-change reconciliation", + "stale-reference removal", + "obsolete-work culling", +] +perfective-third = true +perfective_source = "axis-1 honest state after corrective/adaptive updates" + +[axis-3-audit-rules] +systems-check = true +documentation-honesty-check = true +safety-security-accounted-check = true +effects-review-check = true +benchmark-evidence-required = true +maintainer-dialogue-review-required = true +compliance-seams-check = true +exception-register-required = true +exception-bounded-scope-required = true +policy-drift-contamination-check = true +example-drift-risk = "single TypeScript exception causing broad ReScript->TypeScript migration" +compliance-tooling = "panic-attack" +effects-tooling = "ecological checking with sustainabot guidance" + +[generic-cleanup-finish-off] +root-cleanup-required = true +stale-work-cull-required = true +docs-parity-required = true +machine-human-sync-required = true +compliance-finish-off-required = true +effects-finish-off-required = true +release-prep-summary-required = true +next-actions-required = ["corrective", "adaptive", "perfective"] + +[must] +root_control_files = [ + ".gitignore", + ".gitattributes", + ".editorconfig", + ".tool-versions", + "Containerfile", + "Justfile", +] + +root_hosting_files = [ + "CNAME", + ".nojekyll", +] + +ownership_files = [ + "MAINTAINER", + ".github/CODEOWNERS", +] + +machine_readable_required = [ + ".machine_readable/anchors/ANCHOR.a2ml", + ".machine_readable/contractiles/", + ".machine_readable/ai/", + ".machine_readable/bot_directives/", +] + +contractiles_required = [ + "Mustfile", + "Trustfile", + "Intentfile", +] + +security_required = [ + ".well-known/security.txt", + "ci-security-scan", +] + +quality_gate_required = [ + "format", + "lint", + "unit-tests", + "integration-tests", + "p2p-tests", + "e2e-tests", + "bench-smoke", + "docs-check", + "security-scan", +] + +abi_ffi_policy = [ + "ABI Idris2 in src/interface/abi/*.idr", + "FFI Zig in ffi/**/*.zig", +] + +[should] +docs_primary_format = "adoc" +docs_structure = [ + "docs/theory", + "docs/practice", + "docs/whitepapers/academic", + "docs/whitepapers/industry", + "docs/proofs", + "docs/reports", +] + +root_minimization = true +well_known_metadata = true +roadmap_honesty_with_dates = true +ci_doc_format_policy = true + +[could] +generate_human_from_machine = true +mode_aware_bots = ["corrective", "adaptive", "perfective", "audit"] +topology_dashboard = true +exception_registry = true diff --git a/deno/docs/governance/MAINTENANCE-CHECKLIST.adoc b/deno/docs/governance/MAINTENANCE-CHECKLIST.adoc new file mode 100644 index 0000000..0b40654 --- /dev/null +++ b/deno/docs/governance/MAINTENANCE-CHECKLIST.adoc @@ -0,0 +1,569 @@ += Maintenance Checklist +# Maintenance Checklist (Cross-Repo) + +Use this as a repeatable maintenance runbook for any repo. + +Companion policy: + +- `docs/practice/SOFTWARE-DEVELOPMENT-APPROACH.adoc` (human-readable) +- `.machine_readable/policies/SOFTWARE-DEVELOPMENT-APPROACH.a2ml` (machine-readable) + +## Canonical Repo Baseline (Final) + +Apply this baseline to every repo unless an explicit exception is recorded. + +### Three-Axis Default Model + +- [ ] Axis 1 (scope priority, runs first): `must > intend > like` +- [ ] Axis 2 (maintenance priority): `corrective > adaptive > perfective` +- [ ] Axis 3 (audit priority): `systems > compliance > effects` +- [ ] Perfective items are derived from Axis 1 honest state (not started independently). + +### Axis 1 Scoping Pass (Mandatory) + +Before Axis 2/3 execution, assemble a scoped worklist from evidence: + +- [ ] Read and reconcile: `README`, roadmap, status docs, maintenance checklist, and current CI/security docs. +- [ ] Scan for unfinished markers: `TODO`, `FIXME`, `XXX`, `HACK`, `STUB`, `PARTIAL`. +- [ ] If Idris is present, scan unsoundness markers: `believe_me`, `assert_total`. +- [ ] Identify declared intent vs actual implementation (docs honesty check). +- [ ] Produce a scope assembly artifact with prioritized entries under: + - `must` (release blockers / safety / correctness) + - `intend` (planned near-term) + - `like` (nice-to-have) + +### Axis 2 Maintenance Execution Rules + +- [ ] Corrective first: fix breakage, defects, regressions, safety issues. +- [ ] Adaptive second: reconcile changed scope, remove stale references, cull no-longer-relevant work. +- [ ] Perfective third: only from current honest state established by Axis 1 and updated by corrective/adaptive actions. + +### Axis 3 Audit Rules + +- [ ] Verify systems are in place and actually operating. +- [ ] Verify documentation explains the real/current state (not aspirational-only), including documented exceptions. +- [ ] Verify safety and security controls are present, active, and evidenced. +- [ ] Verify observed effects/impacts are captured and reviewed. +- [ ] Effects audit includes: + - benchmark execution and recorded results (with before/after where relevant) + - explicit maintainer dialogue/status review on what changed, why, and next risks +- [ ] Audit compliance seams/compromises explicitly: + - policy exceptions are recorded with rationale, scope, and expiry/review + - exception does not silently broaden into general policy drift + - language-policy contamination checks run (example: a single TS exception must not trigger broad TypeScript conversion) + - run `panic-attack` as the compliance-audit scanner + - run ecological checking under effects (using sustainabot guidance as current baseline) + +### Generic Cleanup And Finish-Off Pass + +Run this pass at the end of a corrective/adaptive/perfective cycle: + +- [ ] Root cleanup: + - keep only required control/entry files in root + - move non-essential docs/reports/fixtures to canonical folders +- [ ] Remove or archive stale work: + - close out completed TODO/STUB/PARTIAL items + - cull obsolete references, dead files, and superseded plans +- [ ] Documentation finish-off: + - ensure README, roadmap, status, and wiki match actual implementation state + - ensure machine-readable policy/state files match human docs +- [ ] Security/compliance finish-off: + - run compliance scanner (`panic-attack`) and resolve high-priority findings + - verify exception register and seams/compromises are explicitly bounded +- [ ] Effects finish-off: + - run benchmark/effects checks and record evidence + - conduct explicit maintainer review dialogue (what changed, why, remaining risks) +- [ ] Release-prep finish-off: + - produce Must/Should/Could summary + - produce immediate corrective/adaptive/perfective next-actions list + +### Must + +- [ ] Keep required control files at repository root: + - `.gitignore`, `.gitattributes`, `.editorconfig`, `.tool-versions` + - `Containerfile` + - `.containerignore` (or `.dockerignore` only when required for compatibility) + - `CNAME` and `.nojekyll` when using GitHub Pages/custom domain + - `Justfile` (root by convention) +- [ ] Keep ownership/governance files present: + - `MAINTAINER` in root + - `.github/CODEOWNERS` +- [ ] Keep machine-readable canonical structure under `.machine_readable/`: + - state/meta/ecosystem files (`*.a2ml` or repo standard) + - `anchors/ANCHOR.a2ml` + - `contractiles/` (`must`, `trust`, `lust`, and related) + - `ai/` for AI guidance files + - `bot_directives/` for bot control files +- [ ] Keep contractiles/invariants present and wired: + - root `Mustfile` (or equivalent) with enforceable checks + - `Trustfile` and `Intentfile` present +- [ ] Keep security metadata present: + - `.well-known/security.txt` and relevant policy metadata + - CI security scanning configured and runnable +- [ ] Keep docs and navigation coherent: + - single navigation entry point in root (`NAVIGATION.adoc` or equivalent) + - no duplicate conflicting docs for same purpose (for example both `.md` and `.adoc` in root unless intentionally required) +- [ ] Enforce ABI/FFI purity where the policy applies: + - ABI definitions in Idris2 (`src/abi/*.idr`) + - FFI implementations in Zig (`ffi/**/*.zig`) +- [ ] Ensure quality gate includes: formatting, lint, unit/integration tests, p2p/e2e checks, benchmark smoke, docs checks, security scan. + +### Should + +- [ ] Keep human docs primarily in AsciiDoc (`.adoc`) except where ecosystem rules require other formats (GitHub/community health, legal text, tool-specific files). +- [ ] Keep non-essential root files moved into structured folders: + - `docs/` (theory/practice/whitepapers/proofs/reports) + - `tests/` (fixtures/outputs) + - `docs/legal/` (while retaining root `LICENSE` when forge detection needs it) +- [ ] Maintain `.well-known/` for public metadata where applicable (`security.txt`, `humans.txt`, `ads.txt` mirrors if used). +- [ ] Keep CI policy checks for doc-format conventions and canonical file placement. +- [ ] Keep roadmap/status docs honest with dated evidence. + +### Could + +- [ ] Maintain both human and machine views of maintenance policy from a single source (generate one from the other). +- [ ] Add policy bots for corrective/adaptive/perfective/audit modes. +- [ ] Add repo-level architecture map (`TOPOLOGY.md`) and release-readiness dashboards. +- [ ] Add per-repo exception registry for approved policy deviations. + +### Explicit Root-Placement Rule + +Do **not** move the following out of root if you want default tool behavior: + +- `.gitignore`, `.gitattributes`, `.editorconfig`, `.tool-versions` +- `Containerfile` and ignore file (`.containerignore`/`.dockerignore`) +- `CNAME` and `.nojekyll` for GitHub Pages +- `Justfile` + +## Quick Automated Run (Script) + +Use the helper script first, then use the checklist for deeper/manual follow-up. + +Script locations: +- `/var$REPOS_DIR/run-maintenance.sh` +- `~/Desktop/run-maintenance.sh` + +```bash +~/Desktop/run-maintenance.sh --repo /absolute/path/to/repo --output /tmp/maintenance-report.json +jq . /tmp/maintenance-report.json +``` + +Useful flags: + +```bash +# Strict mode: fail process on failed checks +~/Desktop/run-maintenance.sh --repo /absolute/path/to/repo --strict + +# Skip expensive checks when needed +~/Desktop/run-maintenance.sh --repo /absolute/path/to/repo --skip-panic + +# Explicit language selection +~/Desktop/run-maintenance.sh --repo /absolute/path/to/repo --rust --python + +# Release hard-pass mode (fails on warnings or failures) +~/Desktop/run-maintenance.sh --repo /absolute/path/to/repo --fail-on-warn +``` + +Permission policy in script: +- Flags `g+w/o+w` files/dirs +- Flags suspicious executable files +- Flags shebang scripts missing executable bit +- Supports repo-local exceptions via `.maintenance-perms-ignore` (regex per line) +- **Audit-first by default** (non-mutating) +- `--fix-perms` is explicit opt-in only (never implicit) +- For reversible local hardening, pair snapshot/restore scripts where available: + - `scripts/maintenance/perms-state.sh snapshot` + - `scripts/maintenance/perms-state.sh lock` + - `scripts/maintenance/perms-state.sh restore` + +Important git behavior: +- Git generally tracks execute bit, not full UNIX mode matrix. +- Permission hardening audits do not force collaborators to re-unlock every file on pull. +- Keep lock mode opt-in, with restore path documented. + +```bash +# Audit-only (recommended default) +~/Desktop/run-maintenance.sh --repo /absolute/path/to/repo + +# Opt-in permission fixes (review output before commit) +~/Desktop/run-maintenance.sh --repo /absolute/path/to/repo --fix-perms +``` + +## 0) Setup + +```bash +REPO="/absolute/path/to/repo" +cd "$REPO" +``` + +```bash +date -u +git rev-parse --abbrev-ref HEAD +git rev-parse HEAD +git status --porcelain +``` + +## 1) Preflight + +- [ ] Confirm clean intent: note existing unrelated dirty files before edits. +- [ ] Confirm runtime/toolchain versions. +- [ ] Confirm container mode expectation (`podman`/`podman-compose`) if required. + +```bash +command -v rg git jq || true +command -v podman podman-compose || true +``` + +## 2) Dependency/Env Prereqs + +- [ ] Python deps in active interpreter (for Python paths). +- [ ] Language-specific tooling installed. + +```bash +python -c "import sys; print(sys.executable)" +python -c "import pydantic; print(pydantic.__version__)" || echo "pydantic missing" +``` + +## 3) Corrective Maintenance First + +- [ ] Fix regressions, runtime errors, panics, broken commands, failing tests. +- [ ] Re-run failing checks immediately after each fix. + +## 4) Code Health Scans + +- [ ] `TODO/FIXME/XXX/HACK/STUB/PARTIAL` scan. +- [ ] Permission policy scan (`g+w/o+w`, executable hygiene). +- [ ] ABI/FFI policy scan (if applicable: Idris2 ABI, Zig FFI). + +```bash +rg -n "TODO|FIXME|XXX|HACK|STUB|PARTIAL" -g '!**/.git/**' -g '!**/target/**' . +``` + +```bash +# Optional per-repo exceptions (regex per line): +# .maintenance-perms-ignore +# ^vendor/ +# ^third_party/ +``` + +```bash +# Adjust paths for your repo layout +find . -type f \( -name '*.idr' -o -name '*.idris2' -o -name '*.zig' \) +``` + +## 5) Panic/Safety/Security Pass + +- [ ] Run `panic-attacker` assail/assault. +- [ ] Triage findings by severity. +- [ ] Fix high first, then medium. +- [ ] Re-run until acceptable. + +```bash +PANIC_BIN="/var$REPOS_DIR/panic-attacker/target/release/panic-attack" +"$PANIC_BIN" assail "$REPO" --output /tmp/assail.json --output-format json --quiet +jq -r '.weak_points | length' /tmp/assail.json +jq -r '.weak_points[] | "\(.severity)|\(.location)|\(.description)"' /tmp/assail.json +``` + +```bash +# If repo has production-only source builder, prefer this for baseline checks: +./scripts/ci/build-panic-assail-source.sh /tmp/panic-src +"$PANIC_BIN" assail /tmp/panic-src --output /tmp/assail-prod.json --output-format json --quiet +``` + +## 6) Language-Specific Validation + +### Rust + +- [ ] Format +- [ ] Lint +- [ ] Tests +- [ ] Doc tests +- [ ] Benches (where relevant) + +```bash +cargo fmt --all --check +cargo clippy --workspace --all-targets -- -D warnings +cargo test --workspace +cargo test --workspace --doc +# Optional targeted benchmarks: +cargo bench +``` + +### Python + +- [ ] Format/lint +- [ ] Type check +- [ ] Tests + +```bash +ruff check . +ruff format --check . +mypy . +pytest -q +``` + +### Elixir + +- [ ] Format check +- [ ] Lint/static checks +- [ ] Tests + +```bash +mix format --check-formatted +mix credo --strict +mix test +``` + +## 7) Container/Runtime Checks (Podman) + +- [ ] Build container path. +- [ ] Run smoke tests inside containerized flow. +- [ ] Compare host vs container behavior for parity. + +```bash +podman --version +podman compose version || podman-compose --version +``` + +## 8) Benchmark + Regression Check + +- [ ] Capture before/after metrics for touched hot paths. +- [ ] Record command + sample size + output. +- [ ] Fail change if critical path regresses beyond threshold. + +## 9) Adaptive and Perfective Maintenance + +- [ ] Adaptive: compatibility updates (tooling/API/deprecations/config flags). +- [ ] Perfective: clarity, docs parity, developer workflow improvements. +- [ ] Update roadmap/checklist/docs to match actual implementation state. + +## 10) Final QA and Release Hygiene + +- [ ] Re-run full relevant checks one final time. +- [ ] Confirm no unintended file changes. +- [ ] Commit scoped changes with clear message. +- [ ] Push and capture commit SHA. + +```bash +git status --short +git diff --stat +git add +git commit -m "maint: " +git push +``` + +## 11) Maintenance Report Template + +Copy this block per repo run: + +```text +Repo: +Branch: +Start UTC: +End UTC: + +Scope: +- Corrective: +- Adaptive: +- Perfective: + +Checks Run: +- TODO/FIXME scan: +- Panic-attacker: +- Rust/Python/Elixir checks: +- Container checks: +- Benchmark checks: + +Findings: +- High: +- Medium: +- Low: + +Fixes Applied: +1. +2. +3. + +Validation Results: +- Tests: +- Benchmarks: +- Panic-attacker rerun: + +Artifacts: +- assail report: +- benchmark output: +- logs: + +Commit(s): +- SHA: + +Remaining Risks / Follow-ups: +1. +2. +``` + +## 12) Language-Repo Additions (Eclexia-Specific) + +Add these checks for language/compiler repositories with formal ABI/FFI constraints: + +- [x] README structure restored (index/TOC, audience paths, quickstart sanity). +- [x] Wiki split by audience (laypeople/users/developers) and linked from docs index. +- [x] Root-level clutter reduced (archive, analysis, reports relegated to `docs/` subtrees). +- [x] Machine-readable docs synchronized (`STATE.a2ml`, `META.a2ml`, `ECOSYSTEM.a2ml`, contractiles). +- [x] Human-readable docs synchronized (`README`, `QUICK_STATUS`, roadmap, wiki home). +- [x] `Mustfile` invariants present and enforceable in CI. +- [x] `Trustfile` and `Intentfile` present and complete. +- [x] FFI/ABI purity policy enforced (`*.zig` for FFI, `*.idr`/Idris2 for ABI). +- [x] `panic-attack` findings triaged with explicit severity budget for release. +- [x] Point-to-point, end-to-end, and benchmark checks wired in one quality gate. +- [x] CI workflows include quality + security + docs checks with explicit policy. +- [x] Release audit includes corrective/adaptive/perfective + Must/Should/Could. +- [x] Roadmap/status honesty pass completed (dates and current evidence updated). + +## 13) Latest Execution Record (Eclexia, 2026-02-24) + +Repo: `/tmp/eclexia-releaseprep` (branch `release-prep`, base `533ec9e9447f374135cc9e2e81021624ddb3c0ad`) + +### 13.1 Setup/Preflight + +- [x] Captured UTC timestamp and git state. +- [x] Tooling presence verified (`rg`, `git`, `jq`, `cargo`, `rustc`, `just`). +- [x] Runtime/toolchain versions captured. +- [x] Container tooling checked (`podman`, `podman-compose`). + +### 13.2 Corrective Maintenance + +- [x] Fixed `panic-attack` script path handling (`mktemp` output + local fallback binary detection). +- [x] Removed Idris `believe_me` usage from ABI wrappers. +- [x] Fixed conformance crash-noise path by skipping known intentional stack-overflow case in default runner. +- [x] Re-ran affected checks after each fix. + +### 13.3 Code-Health Scans + +- [x] TODO/FIXME/STUB/PARTIAL scan run on active code paths. +- [x] ABI/FFI file inventory run (`*.idr`, `*.zig`). +- [x] Active-code marker count reduced/triaged; remaining items tracked in release audit. + +### 13.4 Security/Panic Pass + +- [x] `panic-attack` run and triaged. +- [x] Critical findings cleared (Idris unsoundness markers removed). +- [x] Current baseline: 0 weak points (Critical 0, High 0, Medium 0, Low 0). +- [x] High/Medium backlog fully eliminated. + +### 13.5 Language Validation + +- [x] Final `just quality-gate` pass completed (docs, fmt, lint, unit, conformance, integration, p2p, e2e, bench). +- [x] Additional targeted reruns completed (`just test-conformance`, `just panic-attack`, `just docs-check`). + +### 13.6 Adaptive/Perfective/Docs + +- [x] README/wiki/docs structure and indexing restored. +- [x] Root tidy/relegation pass executed. +- [x] Roadmap/status honesty update performed with current date and evidence links. +- [x] Release audit created with corrective/adaptive/perfective + Must/Should/Could. +- [x] Full quality-gate rerun passed after hardening updates. +- [x] ABI/FFI extension lane added without breaking stable symbols (`ecl_abi_get_info`, `ecl_tracker_create_ex`, `ecl_tracker_snapshot`). +- [x] CI quality workflow now validates sibling `proven` repo presence and critical binding files. +- [x] Proven roadmap now includes explicit "critical core, not full rewrite" adoption guidance and flowchart. + +### 13.7 Outstanding Items (Explicit) + +- [x] Stable `v1.0.0` technical gate readiness met (quality + panic scan clean). +- [x] Parser/codegen/runtime panic-path hardening completed for scanner-flagged paths. +- [x] Non-eclexia `proven` library checked: already Idris2-first with Zig ABI bridge; no additional integration changes required in this run. +- [ ] Remote push blocked by token scope: GitHub rejected branch updates (`release-prep`, `release-prep-pushable`) due missing `workflow` OAuth scope. + +### 13.8 Artifacts + +- Release audit: `docs/reports/V1-READINESS-AUDIT-2026-02-24.md` +- Panic report: `/tmp/eclexia-panic-attack.KZ1jpC.json` (0 weak points) +- Final quality gate log: `/tmp/eclexia-quality-gate-final2.log` (plus post-change reruns via terminal sessions) +- Local commits: `88fa2af` (`release-prep`), `baa3d1c` (`release-prep-pushable`) + pending new commit from this pass + +## 12) LLM Operator Instructions + +Use this prompt with an LLM agent when you want the process run end-to-end: + +```text +Run the maintenance workflow for this repo using MAINTENANCE-CHECKLIST.md. + +Required behavior: +1. Run ~/Desktop/run-maintenance.sh first and collect the JSON report. +2. Triage report results by severity: fail > warn > pass. +3. Execute corrective maintenance first (fix regressions, panics, broken tests/commands). +4. Run TODO/FIXME/stub scan and address relevant items. +5. Run panic-attacker and fix findings in priority order; rerun to confirm. +6. Run language-specific checks (Rust/Python/Elixir) relevant to this repo. +7. Run benchmark/regression checks for touched hot paths. +8. Enforce permission policy: + - no group/world writable source files unless justified + - executable bit only where intended + - use .maintenance-perms-ignore for justified exceptions +9. Update docs/roadmap/checklist entries to reflect actual state. +10. Produce a final report using the template in MAINTENANCE-CHECKLIST.md. + +Constraints: +- Do not revert unrelated existing dirty changes. +- Stage and commit only scoped intended files. +- If blocked, state exactly what is blocked and why. +``` + +## 13) AI Execution Integrity Contract (Mandatory) + +Use this when delegating maintenance to any AI (Gemini/Claude/ChatGPT/etc.). + +```text +You must execute this maintenance run with strict integrity. + +Non-negotiable rules: +1. Do not claim any step is complete unless you actually ran it. +2. Do not silently skip checklist items. If skipped, state SKIPPED + exact reason. +3. For every check, provide evidence: + - command executed + - pass/fail/warn + - key output summary + - artifact/log path +4. If a command fails, stop claiming success and report the failure clearly. +5. After each fix, re-run the relevant failing check and report the rerun result. +6. Do not hide uncertainty. If unsure, say so and run additional verification. +7. Never mark “all done” while any fail/warn remains unexplained. +8. Do not make destructive or broad permission changes by default. + - permission changes must be audit-first + - use --fix-perms only with explicit intent +9. Final output must include: + - checklist coverage matrix (each item: PASS/FAIL/WARN/SKIPPED) + - unresolved risks + - exact next actions +10. Prioritize user safety and reputation: no “looks fine” claims without evidence. +``` + +Recommended enforcement line for AI prompts: + +```text +Fail closed: if evidence is missing for any checklist item, treat that item as NOT DONE. +``` + +## 14) Fleet Enrollment Automation (Gitbot + Hypatia) + +For centralized coverage across existing and new repos: + +```bash +cd /var$REPOS_DIR/gitbot-fleet +just enroll-repos +``` + +Optional directive write-back to repos that already have `.machine_readable/`: + +```bash +cd /var$REPOS_DIR/gitbot-fleet +just enroll-repos /var$REPOS_DIR true +``` + +Release hard gate from fleet: + +```bash +cd /var$REPOS_DIR/gitbot-fleet +just maintenance-hard-pass /absolute/path/to/repo +``` diff --git a/deno/docs/governance/README.adoc b/deno/docs/governance/README.adoc new file mode 100644 index 0000000..114ee94 --- /dev/null +++ b/deno/docs/governance/README.adoc @@ -0,0 +1 @@ += Governance Pillar (TSDM) diff --git a/deno/docs/governance/SOFTWARE-DEVELOPMENT-APPROACH.a2ml b/deno/docs/governance/SOFTWARE-DEVELOPMENT-APPROACH.a2ml new file mode 100644 index 0000000..093573a --- /dev/null +++ b/deno/docs/governance/SOFTWARE-DEVELOPMENT-APPROACH.a2ml @@ -0,0 +1,53 @@ +# SPDX-License-Identifier: MPL-2.0 +# General software development approach (machine-readable) + +[metadata] +version = "1.0.0" +last-updated = "2026-02-24" +scope = "cross-repo" +source-human = "docs/practice/SOFTWARE-DEVELOPMENT-APPROACH.adoc" + +[execution] +order = ["axis-1", "axis-2", "axis-3"] + +[axis-1] +name = "scope" +priority = "must > intend > like" +inputs = [ + "README", + "roadmap", + "status-docs", + "ci-and-security-docs", +] +marker-scan = ["TODO", "FIXME", "XXX", "HACK", "STUB", "PARTIAL"] +idris-unsound-scan = ["believe_me", "assert_total"] +output = "scoped-work-assembly" + +[axis-2] +name = "maintenance" +priority = "corrective > adaptive > perfective" +corrective = "defect/regression/safety/security fixes" +adaptive = "scope reconciliation, stale-reference removal, obsolete-work culling" +perfective = "quality improvements derived from axis-1 honest state" + +[axis-3] +name = "audit" +priority = "systems > compliance > effects" +systems = "required systems present and operating" +compliance = "exceptions explicit, bounded, and drift-resistant" +effects = "benchmark/operational impact evidence captured and reviewed" +compliance-tooling = "panic-attack" +effects-tooling = "ecological checking with sustainabot guidance" + +[cleanup-finish-off] +root-cleanup = true +stale-work-cull = true +docs-sync-human-machine = true +compliance-audit = true +effects-audit = true +release-summary = ["must", "should", "could"] +next-actions = ["corrective", "adaptive", "perfective"] + +[collaboration] +maintainer-dialogue-required = true +dialogue-topics = ["what changed", "why", "remaining risks"] diff --git a/deno/docs/governance/SOFTWARE-DEVELOPMENT-APPROACH.adoc b/deno/docs/governance/SOFTWARE-DEVELOPMENT-APPROACH.adoc new file mode 100644 index 0000000..e8805c6 --- /dev/null +++ b/deno/docs/governance/SOFTWARE-DEVELOPMENT-APPROACH.adoc @@ -0,0 +1,63 @@ += Software Development Approach (General) +:toc: left +:toclevels: 2 + +This is the general operating policy for software development across repositories. + +== Core Sequence + +Always run work in this order: + +1. Scope first (Axis 1) +2. Maintenance second (Axis 2) +3. Audit third (Axis 3) + +== Axis Definitions + +=== Axis 1: Scope + +Priority order: `must > intend > like` + +Axis 1 output is a scoped assembly of work based on: + +* README, roadmap, status, CI/security docs +* marker scans (`TODO`, `FIXME`, `XXX`, `HACK`, `STUB`, `PARTIAL`) +* Idris unsoundness scan when Idris exists (`believe_me`, `assert_total`) +* docs honesty check (intent vs actual implementation) + +=== Axis 2: Maintenance + +Priority order: `corrective > adaptive > perfective` + +* Corrective: fix defects, regressions, breakage, security/safety failures +* Adaptive: reconcile scope changes, remove stale references, cull obsolete work +* Perfective: improve quality/clarity/performance only from the honest Axis 1 state + +=== Axis 3: Audit + +Priority order: `systems > compliance > effects` + +* Systems: required mechanisms exist and are operating +* Compliance: seams/compromises/exceptions are explicit, bounded, and do not drift +* Effects: benchmark and operational impact evidence is captured and reviewed + +Compliance scanner baseline: `panic-attack` + +Effects/ecological baseline: sustainabot-guided ecological checking + +== Generic Cleanup And Finish-Off + +At cycle end: + +* reduce root clutter to required control/entry files +* archive/remove stale or superseded work +* synchronize human and machine docs +* run compliance and effects audits with evidence capture +* produce Must/Should/Could summary and immediate next-actions list + +== Collaboration Rule + +Effects review must include explicit maintainer dialogue: + +* what changed +* why it changed +* what risks remain diff --git a/deno/docs/governance/TSDM.a2ml b/deno/docs/governance/TSDM.a2ml new file mode 100644 index 0000000..f27036c --- /dev/null +++ b/deno/docs/governance/TSDM.a2ml @@ -0,0 +1,22 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [TSDM_SPEC] +id: "tsdm-standard" +version: "1.0.0" + +axes: + axis_1: + name: "Planning" + levels: ["must", "should", "could"] + axis_2: + name: "Maintenance" + levels: ["corrective", "adaptive", "perfective"] + axis_3: + name: "Audit" + levels: ["systems", "compliance", "effects"] + +invariants: + - "Every task MUST map to at least one TSDM coordinate" + - "Axis 1 priority governs resource allocation" + - "Axis 2 type governs commit categorisation" + - "Axis 3 focus governs audit depth" diff --git a/deno/docs/governance/TSDM.adoc b/deno/docs/governance/TSDM.adoc new file mode 100644 index 0000000..cbd582c --- /dev/null +++ b/deno/docs/governance/TSDM.adoc @@ -0,0 +1,26 @@ += Triaxial Software Development Methodology (TSDM) +:toc: preamble +:icons: font + +TSDM is a three-dimensional governance framework designed for high-assurance, long-lived software systems. It ensures that every project decision is mapped across three critical axes: Planning, Maintenance, and Audit. + +== The Three Axes + +=== Axis 1: Planning (Scope Priority) +* **Must:** Non-negotiable core invariants and safety requirements. +* **Should:** Essential features and planned improvements. +* **Could:** Desired enhancements and future-proofing. + +=== Axis 2: Maintenance (Execution Type) +* **Corrective:** Fixing bugs, vulnerabilities, and failures. +* **Adaptive:** Responding to environment or dependency changes. +* **Perfective:** Improving performance, refactoring, and documentation. + +=== Axis 3: Audit (Verification Focus) +* **Systems:** Integrity of tools, infrastructure, and automation. +* **Compliance:** Adherence to standards, licenses, and verified seams. +* **Effects:** Real-world impact, ecological footprint, and user feedback. + +== Integration + +TSDM is the operational core of the Rhodium Standard. Every task in the `Justfile` and every state change in `STATE.a2ml` should be justifiable within this framework. diff --git a/deno/docs/governance/audit/0.2-AI-MANIFEST.a2ml b/deno/docs/governance/audit/0.2-AI-MANIFEST.a2ml new file mode 100644 index 0000000..4722486 --- /dev/null +++ b/deno/docs/governance/audit/0.2-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "governance-axis-audit" +level: 2 +parent: "../0.1-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + TSDM Audit track. diff --git a/deno/docs/governance/audit/README.adoc b/deno/docs/governance/audit/README.adoc new file mode 100644 index 0000000..fac3740 --- /dev/null +++ b/deno/docs/governance/audit/README.adoc @@ -0,0 +1 @@ += Audit Axis diff --git a/deno/docs/governance/audit/compliance/0.3-AI-MANIFEST.a2ml b/deno/docs/governance/audit/compliance/0.3-AI-MANIFEST.a2ml new file mode 100644 index 0000000..b13ec69 --- /dev/null +++ b/deno/docs/governance/audit/compliance/0.3-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "governance-unit-compliance" +level: 3 +parent: "../0.2-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + TSDM compliance unit within the Audit axis. diff --git a/deno/docs/governance/audit/compliance/README.adoc b/deno/docs/governance/audit/compliance/README.adoc new file mode 100644 index 0000000..876954f --- /dev/null +++ b/deno/docs/governance/audit/compliance/README.adoc @@ -0,0 +1 @@ += Compliance Unit diff --git a/deno/docs/governance/audit/effects/0.3-AI-MANIFEST.a2ml b/deno/docs/governance/audit/effects/0.3-AI-MANIFEST.a2ml new file mode 100644 index 0000000..0bccae0 --- /dev/null +++ b/deno/docs/governance/audit/effects/0.3-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "governance-unit-effects" +level: 3 +parent: "../0.2-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + TSDM effects unit within the Audit axis. diff --git a/deno/docs/governance/audit/effects/README.adoc b/deno/docs/governance/audit/effects/README.adoc new file mode 100644 index 0000000..3634799 --- /dev/null +++ b/deno/docs/governance/audit/effects/README.adoc @@ -0,0 +1 @@ += Effects Unit diff --git a/deno/docs/governance/audit/systems/0.3-AI-MANIFEST.a2ml b/deno/docs/governance/audit/systems/0.3-AI-MANIFEST.a2ml new file mode 100644 index 0000000..f97bc9c --- /dev/null +++ b/deno/docs/governance/audit/systems/0.3-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "governance-unit-systems" +level: 3 +parent: "../0.2-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + TSDM systems unit within the Audit axis. diff --git a/deno/docs/governance/audit/systems/README.adoc b/deno/docs/governance/audit/systems/README.adoc new file mode 100644 index 0000000..8d179b4 --- /dev/null +++ b/deno/docs/governance/audit/systems/README.adoc @@ -0,0 +1 @@ += Systems Unit diff --git a/deno/docs/governance/maintenance/0.2-AI-MANIFEST.a2ml b/deno/docs/governance/maintenance/0.2-AI-MANIFEST.a2ml new file mode 100644 index 0000000..8e0dff5 --- /dev/null +++ b/deno/docs/governance/maintenance/0.2-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "governance-axis-maintenance" +level: 2 +parent: "../0.1-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + TSDM Maintenance track. diff --git a/deno/docs/governance/maintenance/README.adoc b/deno/docs/governance/maintenance/README.adoc new file mode 100644 index 0000000..0ed2f1b --- /dev/null +++ b/deno/docs/governance/maintenance/README.adoc @@ -0,0 +1 @@ += Maintenance Axis diff --git a/deno/docs/governance/maintenance/adaptive/0.3-AI-MANIFEST.a2ml b/deno/docs/governance/maintenance/adaptive/0.3-AI-MANIFEST.a2ml new file mode 100644 index 0000000..63d1a99 --- /dev/null +++ b/deno/docs/governance/maintenance/adaptive/0.3-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "governance-unit-adaptive" +level: 3 +parent: "../0.2-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + TSDM adaptive unit within the Maintenance axis. diff --git a/deno/docs/governance/maintenance/adaptive/README.adoc b/deno/docs/governance/maintenance/adaptive/README.adoc new file mode 100644 index 0000000..7b60992 --- /dev/null +++ b/deno/docs/governance/maintenance/adaptive/README.adoc @@ -0,0 +1 @@ += Adaptive Unit diff --git a/deno/docs/governance/maintenance/corrective/0.3-AI-MANIFEST.a2ml b/deno/docs/governance/maintenance/corrective/0.3-AI-MANIFEST.a2ml new file mode 100644 index 0000000..05cb89d --- /dev/null +++ b/deno/docs/governance/maintenance/corrective/0.3-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "governance-unit-corrective" +level: 3 +parent: "../0.2-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + TSDM corrective unit within the Maintenance axis. diff --git a/deno/docs/governance/maintenance/corrective/README.adoc b/deno/docs/governance/maintenance/corrective/README.adoc new file mode 100644 index 0000000..ed904a8 --- /dev/null +++ b/deno/docs/governance/maintenance/corrective/README.adoc @@ -0,0 +1 @@ += Corrective Unit diff --git a/deno/docs/governance/maintenance/perfective/0.3-AI-MANIFEST.a2ml b/deno/docs/governance/maintenance/perfective/0.3-AI-MANIFEST.a2ml new file mode 100644 index 0000000..832762f --- /dev/null +++ b/deno/docs/governance/maintenance/perfective/0.3-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "governance-unit-perfective" +level: 3 +parent: "../0.2-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + TSDM perfective unit within the Maintenance axis. diff --git a/deno/docs/governance/maintenance/perfective/README.adoc b/deno/docs/governance/maintenance/perfective/README.adoc new file mode 100644 index 0000000..8759d74 --- /dev/null +++ b/deno/docs/governance/maintenance/perfective/README.adoc @@ -0,0 +1 @@ += Perfective Unit diff --git a/deno/docs/governance/planning/0.2-AI-MANIFEST.a2ml b/deno/docs/governance/planning/0.2-AI-MANIFEST.a2ml new file mode 100644 index 0000000..80339e7 --- /dev/null +++ b/deno/docs/governance/planning/0.2-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "governance-axis-planning" +level: 2 +parent: "../0.1-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + TSDM Planning track. diff --git a/deno/docs/governance/planning/README.adoc b/deno/docs/governance/planning/README.adoc new file mode 100644 index 0000000..62aa375 --- /dev/null +++ b/deno/docs/governance/planning/README.adoc @@ -0,0 +1 @@ += Planning Axis diff --git a/deno/docs/governance/planning/could/0.3-AI-MANIFEST.a2ml b/deno/docs/governance/planning/could/0.3-AI-MANIFEST.a2ml new file mode 100644 index 0000000..fc17a27 --- /dev/null +++ b/deno/docs/governance/planning/could/0.3-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "governance-unit-could" +level: 3 +parent: "../0.2-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + TSDM could unit within the Planning axis. diff --git a/deno/docs/governance/planning/could/README.adoc b/deno/docs/governance/planning/could/README.adoc new file mode 100644 index 0000000..ad5a6b8 --- /dev/null +++ b/deno/docs/governance/planning/could/README.adoc @@ -0,0 +1 @@ += Could Unit diff --git a/deno/docs/governance/planning/must/0.3-AI-MANIFEST.a2ml b/deno/docs/governance/planning/must/0.3-AI-MANIFEST.a2ml new file mode 100644 index 0000000..0987dae --- /dev/null +++ b/deno/docs/governance/planning/must/0.3-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "governance-unit-must" +level: 3 +parent: "../0.2-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + TSDM must unit within the Planning axis. diff --git a/deno/docs/governance/planning/must/README.adoc b/deno/docs/governance/planning/must/README.adoc new file mode 100644 index 0000000..47eb46d --- /dev/null +++ b/deno/docs/governance/planning/must/README.adoc @@ -0,0 +1 @@ += Must Unit diff --git a/deno/docs/governance/planning/should/0.3-AI-MANIFEST.a2ml b/deno/docs/governance/planning/should/0.3-AI-MANIFEST.a2ml new file mode 100644 index 0000000..f492289 --- /dev/null +++ b/deno/docs/governance/planning/should/0.3-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "governance-unit-should" +level: 3 +parent: "../0.2-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + TSDM should unit within the Planning axis. diff --git a/deno/docs/governance/planning/should/README.adoc b/deno/docs/governance/planning/should/README.adoc new file mode 100644 index 0000000..605489c --- /dev/null +++ b/deno/docs/governance/planning/should/README.adoc @@ -0,0 +1 @@ += Should Unit diff --git a/deno/docs/legal/0.2-AI-MANIFEST.a2ml b/deno/docs/legal/0.2-AI-MANIFEST.a2ml new file mode 100644 index 0000000..e547798 --- /dev/null +++ b/deno/docs/legal/0.2-AI-MANIFEST.a2ml @@ -0,0 +1,16 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "legal-track" +level: 2 +parent: "../0.1-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Sub-unit for legal and licensing documentation. Contains framework + exhibits and archival license texts. + +canonical_locations: + exhibits: "exhibits/" + texts: "texts/" diff --git a/deno/docs/legal/EXHIBIT-A-ETHICAL-USE.txt b/deno/docs/legal/EXHIBIT-A-ETHICAL-USE.txt new file mode 100644 index 0000000..0b20fca --- /dev/null +++ b/deno/docs/legal/EXHIBIT-A-ETHICAL-USE.txt @@ -0,0 +1,68 @@ +SPDX-License-Identifier: MPL-2.0 + +================================================================================ +EXHIBIT A — ETHICAL USE GUIDELINES +Palimpsest-MPL License Version 1.0 +================================================================================ + +1. PURPOSE + + These guidelines define ethical use expectations for software distributed + under the Palimpsest-MPL License. They are not legally binding restrictions + but represent the community's shared values and expectations. + +2. PRINCIPLES + + 2.1. Respect for Emotional Lineage + Users and distributors should acknowledge and preserve the cultural, + narrative, and symbolic meaning embedded in Covered Software. This + includes protest traditions, cultural heritage, trauma narratives, + and community stories where documented. + + 2.2. Transparency in Automated Processing + When Covered Software is processed by Non-Interpretive Systems + (AI training, content aggregation, automated summarization), such + use should be documented publicly and not misrepresent the + provenance of outputs. + + 2.3. Good Faith Attribution + Contributors should be credited accurately. Derivative works should + maintain the attribution chain and not obscure the origins of + contributions. + + 2.4. Community Benefit + Commercial use of Covered Software should contribute to the broader + community through bug fixes, documentation, or other improvements + where feasible. + +3. SPECIFIC GUIDANCE + + 3.1. AI and Machine Learning + - Training on Covered Software requires disclosure + - Generated outputs must not claim Emotional Lineage of the original + - Model cards should reference source materials + + 3.2. Content Aggregation + - Aggregators must link back to original sources + - Context must not be stripped in ways that distort meaning + - Cultural and narrative context should be preserved + + 3.3. Commercial Products + - Products built on Covered Software should acknowledge it + - Pricing should not exploit communities that created the work + - Support and improvements should flow back to the community + +4. ENFORCEMENT + + These guidelines are enforced through community norms, not legal action. + Disputes should be raised with the Palimpsest Stewardship Council for + non-binding guidance. + +5. AMENDMENTS + + These guidelines may be updated by the Palimpsest Stewardship Council. + Updates apply to new distributions, not retroactively. + +================================================================================ +END OF EXHIBIT A +================================================================================ diff --git a/deno/docs/legal/EXHIBIT-B-QUANTUM-SAFE.txt b/deno/docs/legal/EXHIBIT-B-QUANTUM-SAFE.txt new file mode 100644 index 0000000..7fba8c9 --- /dev/null +++ b/deno/docs/legal/EXHIBIT-B-QUANTUM-SAFE.txt @@ -0,0 +1,102 @@ +SPDX-License-Identifier: MPL-2.0 + +================================================================================ +EXHIBIT B — QUANTUM-SAFE PROVENANCE SPECIFICATION +Palimpsest-MPL License Version 1.0 +================================================================================ + +1. PURPOSE + + This exhibit specifies the cryptographic algorithms and procedures for + quantum-safe provenance in software distributed under the Palimpsest-MPL + License. + +2. APPROVED ALGORITHMS + + The following post-quantum cryptographic algorithms are approved for + signing Provenance Metadata: + + 2.1. Digital Signatures + - ML-DSA (FIPS 204, formerly CRYSTALS-Dilithium) + Recommended: ML-DSA-65 (security level 3) or ML-DSA-87 (level 5) + - SLH-DSA (FIPS 205, formerly SPHINCS+) + Recommended: SLH-DSA-SHA2-256f or SLH-DSA-SHAKE-256f + - FALCON (NIST Round 3 finalist) + Recommended: FALCON-1024 + + 2.2. Key Encapsulation (for encrypted provenance) + - ML-KEM (FIPS 203, formerly CRYSTALS-Kyber) + Recommended: ML-KEM-1024 + + 2.3. Hash Functions + - SHA-3 (FIPS 202) + Recommended: SHA3-256 or SHA3-512 + - SHAKE (FIPS 202 extendable output) + Recommended: SHAKE-256 + + 2.4. Key Derivation + - Argon2id (RFC 9106) + Parameters: t=3, m=65536, p=4 (minimum) + +3. PROVENANCE METADATA FORMAT + + Provenance Metadata should include: + + 3.1. Required Fields + - author-identity: Contributor name and contact + - timestamp: ISO 8601 with timezone + - content-hash: SHA3-256 hash of the contribution + - signature: Quantum-safe signature over all fields + + 3.2. Optional Fields + - parent-hash: Hash of the previous contribution in the chain + - emotional-lineage: Narrative context markers + - platform: Build/development environment + - witnesses: Third-party attestation signatures + +4. SIGNATURE PROCEDURE + + 4.1. Signing + a. Compute SHA3-256 hash of the contribution content + b. Construct metadata record with all required fields + c. Serialize metadata in canonical JSON form + d. Sign with ML-DSA-65 (or approved alternative) + e. Attach signature to distribution + + 4.2. Verification + a. Extract metadata and signature from distribution + b. Verify signature against contributor's public key + c. Verify content hash matches actual content + d. Verify timestamp is within acceptable range + e. Verify parent-hash chain if present + +5. KEY MANAGEMENT + + 5.1. Contributors should publish quantum-safe public keys via: + - OpenPGP keyservers (with PQ algorithm support) + - Repository .well-known/keys/ directory + - Contributor's personal website + + 5.2. Key rotation should occur: + - At least annually + - When algorithm recommendations change + - When key compromise is suspected + +6. TRANSITION PERIOD + + During the transition to quantum-safe cryptography: + + 6.1. Classical signatures (Ed25519, RSA) remain valid + 6.2. Hybrid signatures (classical + PQ) are encouraged + 6.3. Pure PQ signatures are preferred for new contributions + 6.4. Classical-only signatures will be deprecated in a future version + +7. COMPLIANCE + + Quantum-safe provenance is OPTIONAL under PMPL-1.0. When present, + it must follow this specification. Stripping quantum-safe signatures + from distributions is prohibited per Section 4.1 of the License. + +================================================================================ +END OF EXHIBIT B +================================================================================ diff --git a/deno/docs/practice/.gitkeep b/deno/docs/practice/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/deno/docs/practice/0.2-AI-MANIFEST.a2ml b/deno/docs/practice/0.2-AI-MANIFEST.a2ml new file mode 100644 index 0000000..257f3a4 --- /dev/null +++ b/deno/docs/practice/0.2-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "practice-unit" +level: 2 +parent: "../0.1-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Sub-unit of the docs pillar focusing on practice. diff --git a/deno/docs/practice/AI-CONVENTIONS.adoc b/deno/docs/practice/AI-CONVENTIONS.adoc new file mode 100644 index 0000000..c77617a --- /dev/null +++ b/deno/docs/practice/AI-CONVENTIONS.adoc @@ -0,0 +1,85 @@ += AI Conventions + + + +# AI Conventions (Authoritative Source) + +All AI coding agents working in this repository MUST follow these rules. +Per-tool config files (.cursorrules, .clinerules, etc.) reference this document. + +## Session Startup + +1. Read `0-AI-MANIFEST.a2ml` FIRST (mandatory gatekeeper). +2. Read `.machine_readable/STATE.a2ml` for current status and blockers. +3. Read `.machine_readable/anchors/ANCHOR.a2ml` for canonical authority boundaries. +4. Read `.machine_readable/policies/MAINTENANCE-AXES.a2ml` for maintenance/audit sequencing. +5. Read `.machine_readable/policies/MAINTENANCE-CHECKLIST.a2ml` for baseline controls. +6. Read `.machine_readable/policies/SOFTWARE-DEVELOPMENT-APPROACH.a2ml` for execution order. +7. Read `.machine_readable/AGENTIC.a2ml` for agent constraints. + +## License + +- All original code: **MPL-2.0** +- Fallback (platform-required only): MPL-2.0 with comment explaining why. +- NEVER use AGPL-3.0. +- Preserve third-party licenses verbatim. +- Every source file needs `# SPDX-License-Identifier: CC-BY-SA-4.0`. + +## Author Attribution + +- Name: **{{AUTHOR}}** +- Email: **{{AUTHOR_EMAIL}}** +- Copyright: `Copyright (c) {{CURRENT_YEAR}} {{AUTHOR}} ({{OWNER}}) <{{AUTHOR_EMAIL}}>` + +## State Files + +State/metadata files, anchors, and policies (.a2ml) belong in `.machine_readable/` ONLY. +NEVER create STATE.a2ml, META.a2ml, ECOSYSTEM.a2ml, AGENTIC.a2ml, +NEUROSYM.a2ml, PLAYBOOK.a2ml, ANCHOR.a2ml, MAINTENANCE-AXES.a2ml, +MAINTENANCE-CHECKLIST.a2ml, or SOFTWARE-DEVELOPMENT-APPROACH.a2ml in the repository root. + +## Banned Patterns + +| Language | Banned | Reason | +|----------|-------------------------------------|---------------------------| +| Idris2 | `believe_me`, `assert_total` | Unsound escape hatches | +| Haskell | `unsafeCoerce`, `unsafePerformIO` | Breaks type safety | +| OCaml | `Obj.magic`, `Obj.repr`, `Obj.obj` | Unsafe casting | +| Coq | `Admitted` | Unproven assumption | +| Lean | `sorry` | Unproven assumption | +| Rust | `transmute` (unless FFI + SAFETY:) | Unsound reinterpret | + +## Banned Languages + +| Banned | Use Instead | +|---------------------|--------------------| +| TypeScript | ReScript | +| Node.js / npm / bun | Deno | +| Go | Rust | +| Python | Julia / Rust | + +## Container Standard + +- Runtime: **Podman** (never Docker). +- File: **Containerfile** (never Dockerfile). +- Base images: `cgr.dev/chainguard/wolfi-base:latest` or `cgr.dev/chainguard/static:latest`. + +## ABI/FFI Standard + +- ABI definitions: **Idris2** with dependent types (`src/abi/`). +- FFI implementation: **Zig** with C ABI compatibility (`ffi/zig/`). +- Generated C headers: `generated/abi/`. + +## Build System + +Use `just` (Justfile) for all build, test, lint, and format tasks. + +## References + +- `0-AI-MANIFEST.a2ml` -- universal AI entry point +- `.machine_readable/AGENTIC.a2ml` -- agent permissions and constraints +- `.machine_readable/STATE.a2ml` -- current project state +- `.machine_readable/anchors/ANCHOR.a2ml` -- canonical authority and policy boundary +- `.machine_readable/policies/MAINTENANCE-AXES.a2ml` -- canonical axis sequencing and audit requirements +- `.machine_readable/policies/MAINTENANCE-CHECKLIST.a2ml` -- baseline maintenance checklist policy +- `.machine_readable/policies/SOFTWARE-DEVELOPMENT-APPROACH.a2ml` -- axis execution approach policy diff --git a/deno/docs/practice/README.adoc b/deno/docs/practice/README.adoc new file mode 100644 index 0000000..ae3326b --- /dev/null +++ b/deno/docs/practice/README.adoc @@ -0,0 +1 @@ += practice Unit diff --git a/deno/docs/practice/STATE-VISUALIZER-GUIDE.adoc b/deno/docs/practice/STATE-VISUALIZER-GUIDE.adoc new file mode 100644 index 0000000..b355b46 --- /dev/null +++ b/deno/docs/practice/STATE-VISUALIZER-GUIDE.adoc @@ -0,0 +1,155 @@ +// SPDX-License-Identifier: CC-BY-SA-4.0 += TOPOLOGY.md — Generation Guide +{{AUTHOR}} ({{OWNER}}) <{{AUTHOR_EMAIL}}> +:toc: +:sectnums: + +== What Is TOPOLOGY.md? + +A single-file visual map of any project's architecture and completion status. +It lives in the repo root and contains: + +1. **ASCII architecture diagram** — the full system as it will look when complete +2. **Completion dashboard** — every component with a progress bar and status note +3. **Dependency graph** — what blocks what (the critical path) +4. **Update protocol** — how to keep it current + +It is designed to be readable by humans, AI agents, and rendered cleanly on any +forge (GitHub, GitLab, Codeberg, Bitbucket). + +== Why + +- Gives any contributor (human or AI) an instant picture of the whole project +- Replaces "read 20 files to understand the architecture" with one glance +- The completion dashboard makes project health visible without running anything +- Works offline, no tooling required, just a text file + +== How To Generate One + +=== Option 1: Ask an AI agent + +Use this prompt (works with Claude, Gemini, ChatGPT, or any LLM with repo access): + +[source,text] +---- +Read the entire repository and produce a TOPOLOGY.md file for the repo root. + +The file must contain exactly three sections: + +1. **System Architecture** — An ASCII box diagram showing the complete system + as it will look when finished. Use Unicode box-drawing characters + (┌ ┐ └ ┘ │ ─ ├ ┤ ┬ ┴ ┼), arrows (▲ ▼ ◄ ► → ←), and double lines + (═ ║) for boundaries. Show: + - All external services (DNS, CDN, gateways) at the top + - Application components in the middle + - Data layer (databases, caches, queues) below + - Repo infrastructure (CI, contractiles, SCM files) at the bottom + - Every box labelled, every connection labelled or obvious from context + - The diagram should be BESPOKE to this project, not generic + +2. **Completion Dashboard** — A table in a code block listing every component + from the diagram. For each component show: + - Name (left-aligned, padded to 35 chars) + - Progress bar: 10 characters using █ (done) and ░ (remaining) + - Percentage (0% to 100% in 10% increments) + - A short note explaining the status + Group components by layer/concern. End with an OVERALL summary line. + +3. **Key Dependencies** — An ASCII arrow diagram showing the critical path. + What must finish before what else can start. + +Add a header comment with SPDX-License-Identifier and Last updated date. +End with an "Update Protocol" section explaining how to maintain the file. + +Use the template at TOPOLOGY.md in rsr-template-repo as a structural reference, +but make the content completely specific to THIS project. +---- + +=== Option 2: Copy the template and fill it in + +[source,bash] +---- +cp /path/to/rsr-template-repo/TOPOLOGY.md ./TOPOLOGY.md +# Then edit: replace placeholders, draw the real architecture, fill the dashboard +---- + +=== Option 3: Batch generation across all repos + +[source,bash] +---- +# From the repos root, generate for every repo that lacks one +for repo in /path/to/your/repos/*/; do + if [ ! -f "$repo/TOPOLOGY.md" ]; then + echo "NEEDS TOPOLOGY: $(basename $repo)" + fi +done +---- + +Then feed each repo to an AI agent with the prompt above. Claude Code can do +this with a session per repo, or you can batch it. + +== Conventions + +=== Box-drawing characters + +Use Unicode, not ASCII art. This renders correctly everywhere. + +[cols="1,1", options="header"] +|=== +| Character | Use +| `┌ ┐ └ ┘` | Box corners +| `│ ─` | Vertical / horizontal lines +| `├ ┤ ┬ ┴ ┼` | T-junctions and crosses +| `═ ║` | Double lines for major boundaries +| `▲ ▼ ◄ ►` | Directional arrows +| `→ ← ↑ ↓` | Thin arrows (alternative) +|=== + +=== Progress bars + +Always 10 characters wide. Use full blocks only (no half-blocks). + +[source,text] +---- +░░░░░░░░░░ 0% Not started +█░░░░░░░░░ 10% Stub/skeleton exists +██░░░░░░░░ 20% Early work +███░░░░░░░ 30% Foundation laid +████░░░░░░ 40% Core logic started +█████░░░░░ 50% Half done +██████░░░░ 60% Most logic complete +███████░░░ 70% Working but rough +████████░░ 80% Needs polish/docs +█████████░ 90% Nearly done +██████████ 100% Complete and tested +---- + +=== Component naming + +- Use the actual names from the codebase (file names, service names, tool names) +- Group by architectural layer, not alphabetically +- Include repo infrastructure (CI, contractiles, SCM files) as a layer + +=== When to update + +- After completing a component → change bar + percentage +- After adding a component → add row +- After architectural change → redraw diagram +- After major milestone → update overall percentage +- Always update the `Last updated` date + +== Integration With Other RSR Files + +TOPOLOGY.md complements but does not replace: + +- **STATE.a2ml** — machine-readable state (tasks, blockers, next actions) +- **ECOSYSTEM.a2ml** — position in the wider project ecosystem +- **META.a2ml** — architecture decisions and design rationale +- **0-AI-MANIFEST.a2ml** — AI agent entry point and invariants + +TOPOLOGY.md is the _visual summary_ for humans; the a2ml files are the +_structured data_ for tooling. Both should agree. + +== Copyright + +Copyright (c) {{CURRENT_YEAR}} {{AUTHOR}} ({{OWNER}}) <{{AUTHOR_EMAIL}}> diff --git a/deno/docs/reports/0.2-AI-MANIFEST.a2ml b/deno/docs/reports/0.2-AI-MANIFEST.a2ml new file mode 100644 index 0000000..5eb265d --- /dev/null +++ b/deno/docs/reports/0.2-AI-MANIFEST.a2ml @@ -0,0 +1,19 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "reports-unit" +level: 2 +parent: "../0.1-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Documentation unit for all automated and manual audit reports. Classified + by domain. + +canonical_locations: + maintenance: "maintenance/" + security: "security/" + performance: "performance/" + compliance: "compliance/" + quality: "quality/" diff --git a/deno/docs/reports/README.adoc b/deno/docs/reports/README.adoc new file mode 100644 index 0000000..0c06c31 --- /dev/null +++ b/deno/docs/reports/README.adoc @@ -0,0 +1 @@ += reports Unit diff --git a/deno/docs/reports/audit/audit-2026-04-15-post.md b/deno/docs/reports/audit/audit-2026-04-15-post.md new file mode 100644 index 0000000..5dfbd08 --- /dev/null +++ b/deno/docs/reports/audit/audit-2026-04-15-post.md @@ -0,0 +1,18 @@ +# Post-audit Status Report: a2ml-deno +- **Date:** 2026-04-15 +- **Status:** Complete (M5 Sweep) +- **Repo:** /var/mnt/eclipse/repos/a2ml-deno + +## Actions Taken +1. Standard CI/Workflow Sweep: Added blocker workflows (`ts-blocker.yml`, `npm-bun-blocker.yml`) and updated `Justfile`. +2. SCM-to-A2ML Migration: Staged and committed deletions of legacy `.scm` files. +3. Lockfile Sweep: Generated and tracked missing lockfiles where manifests were present. +4. Static Analysis: Verified with `panic-attack assail`. + +## Findings Summary +- 14 TODO/FIXME/HACK markers in .machine_readable/contractiles/k9/template-hunt.k9.ncl +- flake.nix declares inputs without narHash, rev pinning, or sibling flake.lock — dependency revision is unpinned in flake.nix +- 8 unsafe get calls in src/A2ML_Parser.res + +## Final Grade +- **CRG Grade:** D (Promoted from E/X) - CI and lockfiles are in place. diff --git a/deno/docs/reports/compliance/0.3-AI-MANIFEST.a2ml b/deno/docs/reports/compliance/0.3-AI-MANIFEST.a2ml new file mode 100644 index 0000000..6b39752 --- /dev/null +++ b/deno/docs/reports/compliance/0.3-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "report-unit-compliance" +level: 3 +parent: "../0.2-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Specialised repository for compliance findings and evidence. diff --git a/deno/docs/reports/compliance/README.adoc b/deno/docs/reports/compliance/README.adoc new file mode 100644 index 0000000..c38c66a --- /dev/null +++ b/deno/docs/reports/compliance/README.adoc @@ -0,0 +1 @@ += Compliance Reports diff --git a/deno/docs/reports/maintenance/0.3-AI-MANIFEST.a2ml b/deno/docs/reports/maintenance/0.3-AI-MANIFEST.a2ml new file mode 100644 index 0000000..43eefe2 --- /dev/null +++ b/deno/docs/reports/maintenance/0.3-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "report-unit-maintenance" +level: 3 +parent: "../0.2-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Maintenance reports. diff --git a/deno/docs/reports/maintenance/README.adoc b/deno/docs/reports/maintenance/README.adoc new file mode 100644 index 0000000..f13abf7 --- /dev/null +++ b/deno/docs/reports/maintenance/README.adoc @@ -0,0 +1 @@ += Maintenance Reports diff --git a/deno/docs/reports/performance/0.3-AI-MANIFEST.a2ml b/deno/docs/reports/performance/0.3-AI-MANIFEST.a2ml new file mode 100644 index 0000000..40c0954 --- /dev/null +++ b/deno/docs/reports/performance/0.3-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "report-unit-performance" +level: 3 +parent: "../0.2-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Specialised repository for performance findings and evidence. diff --git a/deno/docs/reports/performance/README.adoc b/deno/docs/reports/performance/README.adoc new file mode 100644 index 0000000..037767d --- /dev/null +++ b/deno/docs/reports/performance/README.adoc @@ -0,0 +1 @@ += Performance Reports diff --git a/deno/docs/reports/quality/0.3-AI-MANIFEST.a2ml b/deno/docs/reports/quality/0.3-AI-MANIFEST.a2ml new file mode 100644 index 0000000..d460edc --- /dev/null +++ b/deno/docs/reports/quality/0.3-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "report-unit-quality" +level: 3 +parent: "../0.2-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Specialised repository for quality findings and evidence. diff --git a/deno/docs/reports/quality/README.adoc b/deno/docs/reports/quality/README.adoc new file mode 100644 index 0000000..d1be848 --- /dev/null +++ b/deno/docs/reports/quality/README.adoc @@ -0,0 +1 @@ += Quality Reports diff --git a/deno/docs/reports/security/0.3-AI-MANIFEST.a2ml b/deno/docs/reports/security/0.3-AI-MANIFEST.a2ml new file mode 100644 index 0000000..696ab59 --- /dev/null +++ b/deno/docs/reports/security/0.3-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "report-unit-security" +level: 3 +parent: "../0.2-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Specialised repository for security findings and evidence. diff --git a/deno/docs/reports/security/README.adoc b/deno/docs/reports/security/README.adoc new file mode 100644 index 0000000..9a78a8b --- /dev/null +++ b/deno/docs/reports/security/README.adoc @@ -0,0 +1 @@ += Security Reports diff --git a/deno/docs/standards/0.2-AI-MANIFEST.a2ml b/deno/docs/standards/0.2-AI-MANIFEST.a2ml new file mode 100644 index 0000000..c147c6f --- /dev/null +++ b/deno/docs/standards/0.2-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "standards-unit" +level: 2 +parent: "../0.1-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Standards unit for high-rigor verification. diff --git a/deno/docs/standards/README.adoc b/deno/docs/standards/README.adoc new file mode 100644 index 0000000..34a94c4 --- /dev/null +++ b/deno/docs/standards/README.adoc @@ -0,0 +1 @@ += Standards Unit diff --git a/deno/docs/templates/contractiles/README.adoc b/deno/docs/templates/contractiles/README.adoc new file mode 100644 index 0000000..4eeac6b --- /dev/null +++ b/deno/docs/templates/contractiles/README.adoc @@ -0,0 +1,11 @@ +// SPDX-License-Identifier: CC-BY-SA-4.0 += Contractile Templates + +Blank templates for projects that want to replace the hyperpolymath +defaults with their own contractile definitions. + +Copy the relevant file to `.machine_readable/contractiles//` +and fill in your project-specific checks. + +The working examples in `.machine_readable/contractiles/` show the +full hyperpolymath setup — use those as reference. diff --git a/deno/docs/templates/contractiles/dust/Dustfile.a2ml b/deno/docs/templates/contractiles/dust/Dustfile.a2ml new file mode 100644 index 0000000..903af2c --- /dev/null +++ b/deno/docs/templates/contractiles/dust/Dustfile.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +# Dustfile.a2ml — BLANK TEMPLATE +# Replace this with your project's contractile. +# See .machine_readable/contractiles/ for a working example. +# +# Copy this file to .machine_readable/contractiles/dust/Dustfile.a2ml +# and fill in your project-specific checks. + +@abstract: +[Your project's DUST contract goes here] +@end diff --git a/deno/docs/templates/contractiles/must/Mustfile.a2ml b/deno/docs/templates/contractiles/must/Mustfile.a2ml new file mode 100644 index 0000000..d08796f --- /dev/null +++ b/deno/docs/templates/contractiles/must/Mustfile.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +# Mustfile.a2ml — BLANK TEMPLATE +# Replace this with your project's contractile. +# See .machine_readable/contractiles/ for a working example. +# +# Copy this file to .machine_readable/contractiles/must/Mustfile.a2ml +# and fill in your project-specific checks. + +@abstract: +[Your project's MUST contract goes here] +@end diff --git a/deno/docs/templates/contractiles/trust/Trustfile.a2ml b/deno/docs/templates/contractiles/trust/Trustfile.a2ml new file mode 100644 index 0000000..842c6b0 --- /dev/null +++ b/deno/docs/templates/contractiles/trust/Trustfile.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +# Trustfile.a2ml — BLANK TEMPLATE +# Replace this with your project's contractile. +# See .machine_readable/contractiles/ for a working example. +# +# Copy this file to .machine_readable/contractiles/trust/Trustfile.a2ml +# and fill in your project-specific checks. + +@abstract: +[Your project's TRUST contract goes here] +@end diff --git a/deno/docs/theory/.gitkeep b/deno/docs/theory/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/deno/docs/theory/0.2-AI-MANIFEST.a2ml b/deno/docs/theory/0.2-AI-MANIFEST.a2ml new file mode 100644 index 0000000..93df187 --- /dev/null +++ b/deno/docs/theory/0.2-AI-MANIFEST.a2ml @@ -0,0 +1,23 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "theory-track" +level: 2 +parent: "../0.1-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Documentation track for domain-specific theory and research foundations. + Categorised by discipline. + +canonical_locations: + ontologies: "ontologies/" + mathematics: "mathematics/" + computing: "computing/" + socio_technical: "socio-technical/" + formalisms: "formalisms/" + other: "other/" + +invariants: + - "Theoretical claims MUST reference established academic or technical formalisms" diff --git a/deno/docs/theory/README.adoc b/deno/docs/theory/README.adoc new file mode 100644 index 0000000..c0ddf28 --- /dev/null +++ b/deno/docs/theory/README.adoc @@ -0,0 +1 @@ += theory Unit diff --git a/deno/docs/theory/computing/0.3-AI-MANIFEST.a2ml b/deno/docs/theory/computing/0.3-AI-MANIFEST.a2ml new file mode 100644 index 0000000..f387d08 --- /dev/null +++ b/deno/docs/theory/computing/0.3-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "theory-unit-computing" +level: 3 +parent: "../0.2-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Theoretical foundation for computing. diff --git a/deno/docs/theory/computing/README.adoc b/deno/docs/theory/computing/README.adoc new file mode 100644 index 0000000..4d0db25 --- /dev/null +++ b/deno/docs/theory/computing/README.adoc @@ -0,0 +1 @@ += Computing Theory diff --git a/deno/docs/theory/formalisms/0.3-AI-MANIFEST.a2ml b/deno/docs/theory/formalisms/0.3-AI-MANIFEST.a2ml new file mode 100644 index 0000000..cdc2baa --- /dev/null +++ b/deno/docs/theory/formalisms/0.3-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "theory-unit-formalisms" +level: 3 +parent: "../0.2-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Theoretical foundation for formalisms. diff --git a/deno/docs/theory/formalisms/README.adoc b/deno/docs/theory/formalisms/README.adoc new file mode 100644 index 0000000..5d064c3 --- /dev/null +++ b/deno/docs/theory/formalisms/README.adoc @@ -0,0 +1 @@ += Formalisms Theory diff --git a/deno/docs/theory/mathematics/0.3-AI-MANIFEST.a2ml b/deno/docs/theory/mathematics/0.3-AI-MANIFEST.a2ml new file mode 100644 index 0000000..677a4da --- /dev/null +++ b/deno/docs/theory/mathematics/0.3-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "theory-unit-mathematics" +level: 3 +parent: "../0.2-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Theoretical foundation for mathematics. diff --git a/deno/docs/theory/mathematics/README.adoc b/deno/docs/theory/mathematics/README.adoc new file mode 100644 index 0000000..356236f --- /dev/null +++ b/deno/docs/theory/mathematics/README.adoc @@ -0,0 +1 @@ += Mathematics Theory diff --git a/deno/docs/theory/ontologies/0.3-AI-MANIFEST.a2ml b/deno/docs/theory/ontologies/0.3-AI-MANIFEST.a2ml new file mode 100644 index 0000000..d888cee --- /dev/null +++ b/deno/docs/theory/ontologies/0.3-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "theory-unit-ontologies" +level: 3 +parent: "../0.2-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Theoretical foundation for ontologies. diff --git a/deno/docs/theory/ontologies/README.adoc b/deno/docs/theory/ontologies/README.adoc new file mode 100644 index 0000000..6d16ecf --- /dev/null +++ b/deno/docs/theory/ontologies/README.adoc @@ -0,0 +1 @@ += Ontologies Theory diff --git a/deno/docs/theory/other/0.3-AI-MANIFEST.a2ml b/deno/docs/theory/other/0.3-AI-MANIFEST.a2ml new file mode 100644 index 0000000..166ed9e --- /dev/null +++ b/deno/docs/theory/other/0.3-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "theory-unit-other" +level: 3 +parent: "../0.2-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Theoretical foundation for other. diff --git a/deno/docs/theory/other/README.adoc b/deno/docs/theory/other/README.adoc new file mode 100644 index 0000000..1861d6d --- /dev/null +++ b/deno/docs/theory/other/README.adoc @@ -0,0 +1 @@ += Other Theory diff --git a/deno/docs/theory/socio-technical/0.3-AI-MANIFEST.a2ml b/deno/docs/theory/socio-technical/0.3-AI-MANIFEST.a2ml new file mode 100644 index 0000000..8919522 --- /dev/null +++ b/deno/docs/theory/socio-technical/0.3-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "theory-unit-socio-technical" +level: 3 +parent: "../0.2-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Theoretical foundation for socio technical. diff --git a/deno/docs/theory/socio-technical/README.adoc b/deno/docs/theory/socio-technical/README.adoc new file mode 100644 index 0000000..9ab4ee0 --- /dev/null +++ b/deno/docs/theory/socio-technical/README.adoc @@ -0,0 +1 @@ += Socio technical Theory diff --git a/deno/docs/whitepapers/0.2-AI-MANIFEST.a2ml b/deno/docs/whitepapers/0.2-AI-MANIFEST.a2ml new file mode 100644 index 0000000..c936101 --- /dev/null +++ b/deno/docs/whitepapers/0.2-AI-MANIFEST.a2ml @@ -0,0 +1,20 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "whitepapers-track" +level: 2 +parent: "../0.1-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Unit for strategic publications and whitepapers. Categorised by target + audience: Academic, Industry, and Outreach. + +canonical_locations: + academic: "academic/" + industry: "industry/" + outreach: "outreach/" + +invariants: + - "Each sub-track MUST have a clear audience definition in its README" diff --git a/deno/docs/whitepapers/README.adoc b/deno/docs/whitepapers/README.adoc new file mode 100644 index 0000000..88e83c5 --- /dev/null +++ b/deno/docs/whitepapers/README.adoc @@ -0,0 +1 @@ += whitepapers Unit diff --git a/deno/docs/whitepapers/academic/.gitkeep b/deno/docs/whitepapers/academic/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/deno/docs/whitepapers/academic/0.3-AI-MANIFEST.a2ml b/deno/docs/whitepapers/academic/0.3-AI-MANIFEST.a2ml new file mode 100644 index 0000000..ceb8a1e --- /dev/null +++ b/deno/docs/whitepapers/academic/0.3-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "academic-unit" +level: 3 +parent: "../0.2-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Academic logic at level 3. diff --git a/deno/docs/whitepapers/academic/README.adoc b/deno/docs/whitepapers/academic/README.adoc new file mode 100644 index 0000000..16c3f45 --- /dev/null +++ b/deno/docs/whitepapers/academic/README.adoc @@ -0,0 +1 @@ += Academic Logic diff --git a/deno/docs/whitepapers/industry/.gitkeep b/deno/docs/whitepapers/industry/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/deno/docs/whitepapers/industry/0.3-AI-MANIFEST.a2ml b/deno/docs/whitepapers/industry/0.3-AI-MANIFEST.a2ml new file mode 100644 index 0000000..20156dd --- /dev/null +++ b/deno/docs/whitepapers/industry/0.3-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "industry-unit" +level: 3 +parent: "../0.2-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Industry logic at level 3. diff --git a/deno/docs/whitepapers/industry/README.adoc b/deno/docs/whitepapers/industry/README.adoc new file mode 100644 index 0000000..7bc7fcd --- /dev/null +++ b/deno/docs/whitepapers/industry/README.adoc @@ -0,0 +1 @@ += Industry Logic diff --git a/deno/docs/whitepapers/outreach/0.3-AI-MANIFEST.a2ml b/deno/docs/whitepapers/outreach/0.3-AI-MANIFEST.a2ml new file mode 100644 index 0000000..ed7e152 --- /dev/null +++ b/deno/docs/whitepapers/outreach/0.3-AI-MANIFEST.a2ml @@ -0,0 +1,16 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "whitepapers-track-outreach" +level: 3 +parent: "../0.2-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Documentation track for outreach, education, and general-audience + engagement. Focuses on accessibility and high-level conceptual clarity. + +invariants: + - "Language MUST be accessible to non-technical audiences" + - "Avoid deep technical jargon without providing clear definitions" diff --git a/deno/docs/whitepapers/outreach/README.adoc b/deno/docs/whitepapers/outreach/README.adoc new file mode 100644 index 0000000..8141463 --- /dev/null +++ b/deno/docs/whitepapers/outreach/README.adoc @@ -0,0 +1,17 @@ += Outreach & Education +:toc: preamble +:icons: font + +This directory contains whitepapers, guides, and presentations tailored for a general audience, including schools, corporate partners, and special interest groups. + +== Target Audiences + +* **Schools & Education:** Introductory material on formal verification and sovereign systems. +* **Corporate:** High-level business value and compliance summaries. +* **Special Interest Groups:** Community-specific impact and ethical use cases. + +== Goals + +* De-mystify high-rigor engineering. +* Promote the adoption of the Rhodium Standard. +* Provide accessible entry points for non-technical stakeholders. diff --git a/deno/docs/wikis/0.2-AI-MANIFEST.a2ml b/deno/docs/wikis/0.2-AI-MANIFEST.a2ml new file mode 100644 index 0000000..f071ca8 --- /dev/null +++ b/deno/docs/wikis/0.2-AI-MANIFEST.a2ml @@ -0,0 +1,15 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "wikis-track" +level: 2 +parent: "../0.1-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Long-form collaborative documentation and project knowledge base. + This directory mirrors the content structure of the project wiki. + +invariants: + - "Primary wiki format MUST be AsciiDoc (.adoc)" diff --git a/deno/docs/wikis/README.adoc b/deno/docs/wikis/README.adoc new file mode 100644 index 0000000..71b60d1 --- /dev/null +++ b/deno/docs/wikis/README.adoc @@ -0,0 +1,15 @@ += Project Wikis +:toc: preamble +:icons: font + +This directory contains the source files for the project wiki. It is intended for long-form documentation, deep-dives, and community-maintained knowledge. + +== Structure + +* **Core Concepts:** Fundamental architectural ideas. +* **Workflows:** Step-by-step guides for contributors. +* **Glossary:** Definitions of project-specific terminology. + +== Wiki Synchronization + +Changes made here should be synchronised with the forge-hosted wiki (GitHub/GitLab) using the project's sync scripts. diff --git a/deno/eclexiaiser.toml b/deno/eclexiaiser.toml new file mode 100644 index 0000000..6eb8cdb --- /dev/null +++ b/deno/eclexiaiser.toml @@ -0,0 +1,19 @@ +# SPDX-License-Identifier: MPL-2.0 +# eclexiaiser manifest for a2ml-deno + +[project] +name = "a2ml-deno" + +[[functions]] +name = "main" +source = "src/main.rs" +energy-budget-mj = 10.0 + +[carbon] +provider = "static" +region = "GB" +static-intensity = 200.0 + +[report] +format = "text" +include-recommendations = true diff --git a/deno/examples/0.1-AI-MANIFEST.a2ml b/deno/examples/0.1-AI-MANIFEST.a2ml new file mode 100644 index 0000000..0d69c90 --- /dev/null +++ b/deno/examples/0.1-AI-MANIFEST.a2ml @@ -0,0 +1 @@ +# AI Manifest - Level 1: examples diff --git a/deno/examples/README.adoc b/deno/examples/README.adoc new file mode 100644 index 0000000..b9cdb48 --- /dev/null +++ b/deno/examples/README.adoc @@ -0,0 +1 @@ += examples Pillar diff --git a/deno/examples/SafeDOMExample.res b/deno/examples/SafeDOMExample.res new file mode 100644 index 0000000..e5c9046 --- /dev/null +++ b/deno/examples/SafeDOMExample.res @@ -0,0 +1,109 @@ +// SPDX-License-Identifier: MPL-2.0 +// Example: Using SafeDOM for formally verified DOM mounting + +open SafeDOM + +// Example 1: Basic mounting with error handling +let mountApp = () => { + mountSafe( + "#app", + "

Hello, World!

Mounted safely with proofs.

", + ~onSuccess=el => { + Console.log("✓ App mounted successfully!") + Console.log("Element:", el) + }, + ~onError=err => { + Console.error("✗ Mount failed:", err) + } + ) +} + +// Example 2: Wait for DOM ready before mounting +let mountWhenDOMReady = () => { + mountWhenReady( + "#app", + "

App Title

", + ~onSuccess=_ => Console.log("✓ Mounted after DOM ready"), + ~onError=err => Console.error("✗ Failed:", err) + ) +} + +// Example 3: Batch mounting (atomic - all or nothing) +let mountMultiple = () => { + let specs = [ + {selector: "#header", html: "

Site Title

"}, + {selector: "#nav", html: ""}, + {selector: "#main", html: "

Content here

"}, + {selector: "#footer", html: "
© 2026
"} + ] + + switch mountBatch(specs) { + | Ok(elements) => { + Console.log(`✓ Successfully mounted ${Array.length(elements)} elements`) + elements->Array.forEach(el => Console.log(" -", el)) + } + | Error(err) => { + Console.error("✗ Batch mount failed:", err) + Console.error(" (None were mounted - atomic operation)") + } + } +} + +// Example 4: Explicit validation before mounting +let mountWithValidation = () => { + // Validate selector first + switch ProvenSelector.validate("#my-app") { + | Error(e) => Console.error(`Invalid selector: ${e}`) + | Ok(validSelector) => { + // Validate HTML + switch ProvenHTML.validate("
Content
") { + | Error(e) => Console.error(`Invalid HTML: ${e}`) + | Ok(validHtml) => { + // Now mount with proven safety + switch mount(validSelector, validHtml) { + | Mounted(el) => Console.log("✓ Mounted with validated inputs:", el) + | MountPointNotFound(s) => Console.error(`✗ Element not found: ${s}`) + | InvalidSelector(_) => Console.error("Impossible - already validated") + | InvalidHTML(_) => Console.error("Impossible - already validated") + } + } + } + } +} + +// Example 5: Integration with TEA +module MyApp = { + type model = {message: string} + type msg = NoOp + + let init = () => {message: "Hello from TEA"} + let update = (model, _msg) => model + let view = model => `

${model.message}

` +} + +let mountTEAApp = () => { + let model = MyApp.init() + let html = MyApp.view(model) + + mountWhenReady( + "#tea-app", + html, + ~onSuccess=el => { + Console.log("✓ TEA app mounted") + // Set up event handlers, subscriptions here + }, + ~onError=err => Console.error(`✗ TEA mount failed: ${err}`) + ) +} + +// Entry point +let main = () => { + Console.log("SafeDOM Examples") + Console.log("================\n") + + // Choose which example to run + mountWhenDOMReady() // Run on DOM ready +} + +// Auto-execute when module loads +main() diff --git a/deno/examples/web-project-deno.json b/deno/examples/web-project-deno.json new file mode 100644 index 0000000..028e4f1 --- /dev/null +++ b/deno/examples/web-project-deno.json @@ -0,0 +1,20 @@ +{ + "// NOTE": "Example deno.json for ReScript web projects", + "tasks": { + "build": "deno run -A npm:rescript", + "clean": "deno run -A npm:rescript clean", + "watch": "deno run -A npm:rescript -w", + "serve": "deno run -A jsr:@std/http/file-server .", + "test": "deno test --allow-all" + }, + "imports": { + "rescript": "^12.0.0", + "@rescript/core": "npm:@rescript/core@^1.6.0", + "safe-dom/": "https://raw.githubusercontent.com/{{OWNER}}/rescript-dom-mounter/main/src/", + "proven/": "../proven/bindings/rescript/src/" + }, + "compilerOptions": { + "allowJs": true, + "checkJs": false + } +} diff --git a/deno/features/0.1-AI-MANIFEST.a2ml b/deno/features/0.1-AI-MANIFEST.a2ml new file mode 100644 index 0000000..dc3e4ee --- /dev/null +++ b/deno/features/0.1-AI-MANIFEST.a2ml @@ -0,0 +1,17 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "features-pillar" +level: 1 +parent: "../0-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Optional project features and ecosystem integrations. Provides bootstrap + guides for high-rigor tools (Panic-Attacker, BoJ-Server, SSGs). + +canonical_locations: + panic_attacker: "panic-attacker/" + boj_server: "boj-server/" + ssg: "ssg/" diff --git a/deno/features/README.adoc b/deno/features/README.adoc new file mode 100644 index 0000000..3899280 --- /dev/null +++ b/deno/features/README.adoc @@ -0,0 +1 @@ += Project Features diff --git a/deno/features/boj-server/0.2-AI-MANIFEST.a2ml b/deno/features/boj-server/0.2-AI-MANIFEST.a2ml new file mode 100644 index 0000000..c77798c --- /dev/null +++ b/deno/features/boj-server/0.2-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "feature-unit-boj-server" +level: 2 +parent: "../0.1-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Bootstrap and integration logic for the boj-server ecosystem component. diff --git a/deno/features/boj-server/README.adoc b/deno/features/boj-server/README.adoc new file mode 100644 index 0000000..0039c37 --- /dev/null +++ b/deno/features/boj-server/README.adoc @@ -0,0 +1,14 @@ += BoJ Server Integration +:icons: font + +This unit provides a "starting hand" for integrating with the **BoJ-Server** (Box of Justice) ecosystem — a high-rigor, verified server infrastructure. + +== Integration Options + +* **Core:** Use BoJ-Server as the primary verified backend for this project. +* **Bridge:** Utilize the BoJ-Server IPC bridge for cross-boundary communication. + +== Related Repository + +For the full specification and source, visit: +https://github.com/hyperpolymath/boj-server diff --git a/deno/features/panic-attacker/0.2-AI-MANIFEST.a2ml b/deno/features/panic-attacker/0.2-AI-MANIFEST.a2ml new file mode 100644 index 0000000..e61ad24 --- /dev/null +++ b/deno/features/panic-attacker/0.2-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "feature-unit-panic-attacker" +level: 2 +parent: "../0.1-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Bootstrap and integration logic for the panic-attacker ecosystem component. diff --git a/deno/features/panic-attacker/README.adoc b/deno/features/panic-attacker/README.adoc new file mode 100644 index 0000000..72d56a4 --- /dev/null +++ b/deno/features/panic-attacker/README.adoc @@ -0,0 +1,25 @@ += Panic Attacker Feature +:icons: font + +This unit integrates the **Panic-Attacker** high-rigor stress testing tool into the project lifecycle. + +== Value Proposition + +Panic-Attacker goes beyond unit testing by applying: +* **Static Analysis (Assail):** Detecting logic-based bug signatures. +* **Multi-Axis Dynamic Attacks (Assault):** Stressing CPU, Memory, Disk, and Network boundaries. + +== Usage in this Template + +This template includes a pre-configured maintenance trigger: + +[source,bash] +---- +just maint-assault +---- + +This runs a medium-intensity assault on the project binary and emits a report to `docs/reports/security/`. + +== Related Repository + +https://github.com/hyperpolymath/panic-attacker diff --git a/deno/features/ssg/0.2-AI-MANIFEST.a2ml b/deno/features/ssg/0.2-AI-MANIFEST.a2ml new file mode 100644 index 0000000..121c5ae --- /dev/null +++ b/deno/features/ssg/0.2-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "feature-unit-ssg" +level: 2 +parent: "../0.1-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Bootstrap and integration logic for the ssg ecosystem component. diff --git a/deno/features/ssg/README.adoc b/deno/features/ssg/README.adoc new file mode 100644 index 0000000..e15687b --- /dev/null +++ b/deno/features/ssg/README.adoc @@ -0,0 +1 @@ += Ssg Feature diff --git a/deno/features/ssg/ssg-bootstrap.sh b/deno/features/ssg/ssg-bootstrap.sh new file mode 100755 index 0000000..89c6fa5 --- /dev/null +++ b/deno/features/ssg/ssg-bootstrap.sh @@ -0,0 +1,48 @@ +#!/usr/bin/env bash +# SPDX-License-Identifier: MPL-2.0 +# +# ssg-bootstrap.sh — Universal SSG Initialisation Helper +# +# Provides a starting hand for creating a documentation site or blog +# using hyperpolymath-approved formal or pretty-formal SSGs. + +set -euo pipefail + +echo "═══════════════════════════════════════════════════" +echo " SSG BOOTSTRAP HELPER" +echo "═══════════════════════════════════════════════════" +echo "" +echo "Select an SSG to initialize in this project:" +echo " [1] Casket-SSG (Haskell) — Pretty-formal, high-rigor default" +echo " [2] Ddraig-SSG (Idris2) — Super-formal, dependent-type proofed" +echo " [3] Serum-SSG (Elixir) — Concurrent, robust, BEAM-based" +echo " [4] Zola (Rust) — Fast, standalone, standard" +echo "" + +read -rp "Enter choice [1-4]: " choice + +case "$choice" in + 1) + echo "Selected: Casket-SSG" + echo "Integration: git clone https://github.com/hyperpolymath/casket-ssg docs/site" + ;; + 2) + echo "Selected: Ddraig-SSG" + echo "Integration: git clone https://github.com/hyperpolymath/ddraig-ssg docs/site" + ;; + 3) + echo "Selected: Serum-SSG" + echo "Integration: mix serum.new docs/site" + ;; + 4) + echo "Selected: Zola" + echo "Integration: zola init docs/site" + ;; + *) + echo "Invalid selection. Aborting." + exit 1 + ;; +esac + +echo "" +echo "Note: For more advanced polystack options, visit: https://github.com/hyperpolymath/polystack" diff --git a/deno/guix.scm b/deno/guix.scm new file mode 100644 index 0000000..33b1a9a --- /dev/null +++ b/deno/guix.scm @@ -0,0 +1,71 @@ +;; SPDX-License-Identifier: MPL-2.0 +;; Copyright (c) {{CURRENT_YEAR}} {{AUTHOR}} ({{OWNER}}) <{{AUTHOR_EMAIL}}> +;; +;; Guix package definition for {{PROJECT_NAME}} +;; +;; Usage: +;; guix shell -D -f guix.scm # Enter development shell +;; guix build -f guix.scm # Build package +;; +;; TODO: Replace {{PROJECT_NAME}} and customize inputs for your language/stack. +;; See: https://guix.gnu.org/manual/en/html_node/Defining-Packages.html + +(use-modules (guix packages) + (guix gexp) + (guix git-download) + (guix build-system gnu) + (guix licenses) + (gnu packages base)) + +(package + (name "{{PROJECT_NAME}}") + (version "0.1.0") + (source (local-file "." "source" + #:recursive? #t + #:select? (lambda (file stat) + (not (string-contains file ".git"))))) + (build-system gnu-build-system) + (arguments + '(#:phases + (modify-phases %standard-phases + ;; TODO: Customize build phases for your project + ;; Examples for common stacks: + ;; + ;; Rust: + ;; (replace 'build (lambda _ (invoke "cargo" "build" "--release"))) + ;; (replace 'check (lambda _ (invoke "cargo" "test"))) + ;; + ;; Elixir: + ;; (replace 'build (lambda _ (invoke "mix" "compile"))) + ;; (replace 'check (lambda _ (invoke "mix" "test"))) + ;; + ;; Zig: + ;; (replace 'build (lambda _ (invoke "zig" "build"))) + ;; (replace 'check (lambda _ (invoke "zig" "build" "test"))) + (delete 'configure) + (delete 'build) + (delete 'check) + (replace 'install + (lambda* (#:key outputs #:allow-other-keys) + (let ((out (assoc-ref outputs "out"))) + (mkdir-p (string-append out "/share/doc")) + (copy-file "README.adoc" + (string-append out "/share/doc/README.adoc")))))))) + (native-inputs + (list + ;; TODO: Add build-time dependencies + ;; Examples: + ;; rust (gnu packages rust) + ;; elixir (gnu packages elixir) + ;; zig (gnu packages zig) + )) + (inputs + (list + ;; TODO: Add runtime dependencies + )) + (home-page "https://github.com/{{OWNER}}/{{PROJECT_NAME}}") + (synopsis "{{PROJECT_PURPOSE}}") + (description "RSR-compliant project. See README.adoc for details.") + (license (list + ;; MPL-2.0 extends MPL-2.0 + mpl2.0))) diff --git a/deno/jsr.json b/deno/jsr.json new file mode 100644 index 0000000..b250113 --- /dev/null +++ b/deno/jsr.json @@ -0,0 +1,18 @@ +{ + "name": "@hyperpolymath/a2ml", + "version": "0.1.0", + "exports": { + ".": "./mod.ts" + }, + "publish": { + "include": [ + "mod.ts", + "src/A2ML.res.mjs", + "src/A2ML_Types.res.mjs", + "src/A2ML_Parser.res.mjs", + "src/A2ML_Renderer.res.mjs", + "LICENSE", + "README.adoc" + ] + } +} diff --git a/deno/k9iser.toml b/deno/k9iser.toml new file mode 100644 index 0000000..5fb96bf --- /dev/null +++ b/deno/k9iser.toml @@ -0,0 +1,41 @@ +# SPDX-License-Identifier: MPL-2.0 +# Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) +# +# k9iser manifest for a2ml-deno +# A2ML Deno implementation — parser and validator for the A2ML format + +[project] +name = "a2ml-deno" +safety_tier = "hunt" + +[[source]] +path = "deno.json" +type = "deno" +output = "generated/k9iser/deno-workspace.k9" + +[[source]] +path = "Justfile" +type = "justfile" +output = "generated/k9iser/justfile-recipes.k9" + +[[source]] +path = "Containerfile" +type = "containerfile" +output = "generated/k9iser/container-build.k9" + +[[source]] +path = ".github/workflows/hypatia-scan.yml" +type = "workflow" +output = "generated/k9iser/ci-security.k9" + +[[constraint]] +rule = "build.dependencies has no banned_packages" +severity = "error" + +[[constraint]] +rule = "deno.imports has no npm: specifiers" +severity = "error" + +[[constraint]] +rule = "container.base_image uses chainguard or distroless" +severity = "warn" diff --git a/deno/llm-warmup-dev.md b/deno/llm-warmup-dev.md new file mode 100644 index 0000000..0c32ade --- /dev/null +++ b/deno/llm-warmup-dev.md @@ -0,0 +1,16 @@ +# LLM Warmup — a2ml-deno (Developer) + +## What is a2ml-deno? +See README.adoc for overview. + +## Key Commands +- `just setup` — set up development environment +- `just build` — build the project +- `just test` — run tests +- `just doctor` — diagnose issues +- `just heal` — attempt auto-repair + +## Quick Context +- License: MPL-2.0 +- Part of hyperpolymath ecosystem +- See EXPLAINME.adoc for architecture diff --git a/deno/llm-warmup-user.md b/deno/llm-warmup-user.md new file mode 100644 index 0000000..1ce93a5 --- /dev/null +++ b/deno/llm-warmup-user.md @@ -0,0 +1,16 @@ +# LLM Warmup — a2ml-deno (User) + +## What is a2ml-deno? +See README.adoc for overview. + +## Key Commands +- `just setup` — set up development environment +- `just build` — build the project +- `just test` — run tests +- `just doctor` — diagnose issues +- `just heal` — attempt auto-repair + +## Quick Context +- License: MPL-2.0 +- Part of hyperpolymath ecosystem +- See EXPLAINME.adoc for architecture diff --git a/deno/mise.toml b/deno/mise.toml new file mode 100644 index 0000000..6dd983f --- /dev/null +++ b/deno/mise.toml @@ -0,0 +1,57 @@ +[tools] +# Language runtimes +node = "latest" +python = "latest" +rust = "latest" +go = "latest" +zig = "latest" +java = "latest" +bun = "latest" +denojs = "latest" + +# Package managers +npm = "latest" +yarn = "latest" +pnpm = "latest" +pip = "latest" +cargo = "latest" +go-task = "latest" + +# Formatting & Linting +gofmt = "latest" +black = "latest" +isort = "latest" +ruff = "latest" +prettier = "latest" +shfmt = "latest" +stylua = "latest" + +# Build tools +cmake = "latest" +make = "latest" +ninja = "latest" + +# Shell tools +git = "latest" +gnu-sed = "latest" +gnu-tar = "latest" +gnu-grep = "latest" + +# Testing +vitest = "latest" +pytest = "latest" +jest = "latest" + +[env] +# Common environment variables +NODE_ENV = "development" +PYTHONDONTWRITEBYTECODE = "1" +PYTHONUNBUFFERED = "1" + +# Task runner alias +[alias] +task = "go-task" +build = "cargo build --release || npm run build || go build" +test = "cargo test || npm test || go test ./..." +lint = "ruff check . || prettier --check . || black --check ." +fmt = "ruff format . || prettier --write . || black ." diff --git a/deno/mod.ts b/deno/mod.ts new file mode 100644 index 0000000..3a146d2 --- /dev/null +++ b/deno/mod.ts @@ -0,0 +1,49 @@ +// SPDX-License-Identifier: MPL-2.0 +// Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) +// +// mod.ts — Deno entry point for the @hyperpolymath/a2ml library. +// +// Re-exports the compiled ReScript modules for use in Deno projects. +// All types and functions are available through this single entry point. + +// @ts-nocheck — ReScript-generated ES modules do not ship .d.ts files + +export { + parse, + parseFile, + render, + renderBlock, + renderInline, + emptyDocument, + makeDirective, + makeAttestation, + manifestFromDocument, + parseErrorToString, + trustLevelFromString, + trustLevelToString, +} from "./src/A2ML.res.mjs"; + +export { + parseA2ML, + parseA2MLFile, + parseInlines, +} from "./src/A2ML_Parser.res.mjs"; + +export { + renderA2ML, + renderInline as renderInlineElement, + renderInlines, + renderDirective, + renderAttestation, +} from "./src/A2ML_Renderer.res.mjs"; + +export type { + trustLevel, + inline, + directive, + attestation, + block, + document, + manifest, + parseError, +} from "./src/A2ML_Types.res.mjs"; diff --git a/deno/rescript.json b/deno/rescript.json new file mode 100644 index 0000000..1f9373b --- /dev/null +++ b/deno/rescript.json @@ -0,0 +1,21 @@ +{ + "name": "@hyperpolymath/a2ml", + "sources": [ + { + "dir": "src", + "subdirs": true + } + ], + "package-specs": [ + { + "module": "esmodule", + "in-source": true + } + ], + "suffix": ".res.mjs", + "bs-dependencies": ["@rescript/core"], + "bsc-flags": ["-open", "RescriptCore"], + "warnings": { + "number": "+a" + } +} diff --git a/deno/selur-compose.toml b/deno/selur-compose.toml new file mode 100644 index 0000000..823e77e --- /dev/null +++ b/deno/selur-compose.toml @@ -0,0 +1,17 @@ +# SPDX-License-Identifier: MPL-2.0 +# Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) +# +# Stapeln service definition for a2ml-deno +# +# Usage: +# podman-compose -f selur-compose.toml up -d +# just stack-up + +[project] +name = "a2ml-deno" + +[services.app] +build = { context = ".", dockerfile = "Containerfile" } +restart = "unless-stopped" +networks = ["default"] +healthcheck = { test = "exit 0", interval = "30s", timeout = "5s", retries = 3 } diff --git a/deno/setup.sh b/deno/setup.sh new file mode 100755 index 0000000..a3f28a6 --- /dev/null +++ b/deno/setup.sh @@ -0,0 +1,64 @@ +#!/usr/bin/env bash +# SPDX-License-Identifier: MPL-2.0 +# Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) +# +# A2Ml Deno — Universal Setup Script +# Detects platform and shell, installs just, then hands off to Justfile. + +set -euo pipefail + +echo "═══════════════════════════════════════════════════" +echo " A2Ml Deno — Setup" +echo "═══════════════════════════════════════════════════" +echo "" + +# Platform detection +OS="$(uname -s)" +ARCH="$(uname -m)" +echo "Platform: $OS $ARCH" + +# Shell detection +CURRENT_SHELL="$(basename "$SHELL" 2>/dev/null || echo "unknown")" +echo "Shell: $CURRENT_SHELL" +echo "" + +# Check for just +if ! command -v just >/dev/null 2>&1; then + echo "just (command runner) is required but not installed." + echo "" + case "$OS" in + Linux) + if command -v cargo >/dev/null 2>&1; then + echo "Installing just via cargo..." + cargo install just + elif command -v brew >/dev/null 2>&1; then + echo "Installing just via Homebrew..." + brew install just + else + echo "Install just from: https://just.systems/man/en/installation.html" + exit 1 + fi + ;; + Darwin) + if command -v brew >/dev/null 2>&1; then + echo "Installing just via Homebrew..." + brew install just + else + echo "Install Homebrew first: https://brew.sh" + echo "Then: brew install just" + exit 1 + fi + ;; + *) + echo "Install just from: https://just.systems/man/en/installation.html" + exit 1 + ;; + esac + echo "" +fi + +echo "Running diagnostics..." +just doctor + +echo "" +echo "Setup complete. Run 'just help-me' for common workflows." diff --git a/deno/src/0.1-AI-MANIFEST.a2ml b/deno/src/0.1-AI-MANIFEST.a2ml new file mode 100644 index 0000000..c92e124 --- /dev/null +++ b/deno/src/0.1-AI-MANIFEST.a2ml @@ -0,0 +1,27 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "source-pillar" +level: 1 +parent: "../0-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Primary source code directory. Organized by role and architectural + aspect. + +canonical_locations: + core: "core/" + interface: "interface/" + bridges: "bridges/" + contracts: "contracts/" + errors: "errors/" + definitions: "definitions/" + aspects: "aspects/" + +invariants: + - "Core logic MUST reside in core/" + - "Verified seams MUST reside in interface/" + - "Safety constraints MUST reside in contracts/" + - "Failure dictionaries MUST reside in errors/" diff --git a/deno/src/A2ML.res b/deno/src/A2ML.res new file mode 100644 index 0000000..e6e6e3b --- /dev/null +++ b/deno/src/A2ML.res @@ -0,0 +1,65 @@ +// SPDX-License-Identifier: MPL-2.0 +// Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) +// +// A2ML — Main module for the A2ML (Attested Markup Language) parser library. +// +// Re-exports the core types, parser, and renderer for convenient access. +// This module serves as the primary entry point for library consumers. +// +// ## Usage +// +// ```rescript +// open A2ML +// +// let result = A2ML_Parser.parseA2ML("# Hello\n\nSome text.") +// switch result { +// | Ok(doc) => Console.log(A2ML_Renderer.renderA2ML(doc)) +// | Error(err) => Console.error(A2ML_Types.parseErrorToString(err)) +// } +// ``` + +// Re-export types for convenience +type trustLevel = A2ML_Types.trustLevel +type inline = A2ML_Types.inline +type directive = A2ML_Types.directive +type attestation = A2ML_Types.attestation +type block = A2ML_Types.block +type document = A2ML_Types.document +type manifest = A2ML_Types.manifest +type parseError = A2ML_Types.parseError + +/// Parse an A2ML document from a string. +let parse = A2ML_Parser.parseA2ML + +/// Parse an A2ML document from a file path. +let parseFile = A2ML_Parser.parseA2MLFile + +/// Render an A2ML document to text. +let render = A2ML_Renderer.renderA2ML + +/// Render a single block to text. +let renderBlock = A2ML_Renderer.renderBlock + +/// Render a single inline element to text. +let renderInline = A2ML_Renderer.renderInline + +/// Create an empty document. +let emptyDocument = A2ML_Types.emptyDocument + +/// Create a simple directive. +let makeDirective = A2ML_Types.makeDirective + +/// Create an attestation. +let makeAttestation = A2ML_Types.makeAttestation + +/// Extract a manifest from a document. +let manifestFromDocument = A2ML_Types.manifestFromDocument + +/// Format a parse error as a diagnostic string. +let parseErrorToString = A2ML_Types.parseErrorToString + +/// Parse a trust level from a string. +let trustLevelFromString = A2ML_Types.trustLevelFromString + +/// Convert a trust level to its canonical string. +let trustLevelToString = A2ML_Types.trustLevelToString diff --git a/deno/src/A2ML_Parser.res b/deno/src/A2ML_Parser.res new file mode 100644 index 0000000..0d7eaab --- /dev/null +++ b/deno/src/A2ML_Parser.res @@ -0,0 +1,501 @@ +// SPDX-License-Identifier: MPL-2.0 +// Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) +// +// A2ML_Parser — Parser for A2ML (Attested Markup Language) documents. +// +// Parses the A2ML surface syntax into the typed AST defined in A2ML_Types. +// The parser is line-oriented and processes: +// - Headings (# through #####) +// - Directive blocks (@name(attrs): ... @end) +// - Attestation blocks (!attest ... !end) +// - Inline formatting (**bold**, *italic*, `code`, [link](url), @ref(id)) +// - Bullet lists (- item) +// - Code blocks (``` fenced blocks) + +open A2ML_Types + +// --------------------------------------------------------------------------- +// Inline parsing helpers +// --------------------------------------------------------------------------- + +/// Parse a single line of text into inline elements. +/// Handles **bold**, *italic*, `code`, [text](url), and @ref(id). +let parseInlines = (text: string): array => { + let result = [] + let len = text->String.length + let i = ref(0) + let buf = ref("") + + // Flush accumulated plain text into the result array + let flushBuf = () => { + if buf.contents->String.length > 0 { + result->Array.push(Text(buf.contents))->ignore + buf := "" + } + } + + while i.contents < len { + let ch = text->String.charAt(i.contents) + let remaining = text->String.sliceToEnd(~start=i.contents) + + // **bold** + if remaining->String.startsWith("**") { + flushBuf() + let closeIdx = text->String.indexOfFrom("**", i.contents + 2) + if closeIdx >= 0 { + let inner = text->String.slice(~start=i.contents + 2, ~end=closeIdx) + result->Array.push(Strong([Text(inner)]))->ignore + i := closeIdx + 2 + } else { + buf := buf.contents ++ ch + i := i.contents + 1 + } + } + // *italic* + else if ch == "*" && !(remaining->String.startsWith("**")) { + flushBuf() + let closeIdx = text->String.indexOfFrom("*", i.contents + 1) + if closeIdx >= 0 { + let inner = text->String.slice(~start=i.contents + 1, ~end=closeIdx) + result->Array.push(Emphasis([Text(inner)]))->ignore + i := closeIdx + 1 + } else { + buf := buf.contents ++ ch + i := i.contents + 1 + } + } + // `code` + else if ch == "`" { + flushBuf() + let closeIdx = text->String.indexOfFrom("`", i.contents + 1) + if closeIdx >= 0 { + let inner = text->String.slice(~start=i.contents + 1, ~end=closeIdx) + result->Array.push(Code(inner))->ignore + i := closeIdx + 1 + } else { + buf := buf.contents ++ ch + i := i.contents + 1 + } + } + // [text](url) + else if ch == "[" { + flushBuf() + let closeBracket = text->String.indexOfFrom("]", i.contents + 1) + if closeBracket >= 0 { + let afterBracket = text->String.charAt(closeBracket + 1) + if afterBracket == "(" { + let closeParen = text->String.indexOfFrom(")", closeBracket + 2) + if closeParen >= 0 { + let linkText = text->String.slice(~start=i.contents + 1, ~end=closeBracket) + let linkUrl = text->String.slice(~start=closeBracket + 2, ~end=closeParen) + result->Array.push(Link({content: [Text(linkText)], url: linkUrl}))->ignore + i := closeParen + 1 + } else { + buf := buf.contents ++ ch + i := i.contents + 1 + } + } else { + buf := buf.contents ++ ch + i := i.contents + 1 + } + } else { + buf := buf.contents ++ ch + i := i.contents + 1 + } + } + // @ref(id) + else if remaining->String.startsWith("@ref(") { + flushBuf() + let closeParen = text->String.indexOfFrom(")", i.contents + 5) + if closeParen >= 0 { + let refId = text->String.slice(~start=i.contents + 5, ~end=closeParen) + result->Array.push(InlineRef(refId))->ignore + i := closeParen + 1 + } else { + buf := buf.contents ++ ch + i := i.contents + 1 + } + } + // Plain text + else { + buf := buf.contents ++ ch + i := i.contents + 1 + } + } + + flushBuf() + result +} + +// --------------------------------------------------------------------------- +// Directive attribute parsing +// --------------------------------------------------------------------------- + +/// Parse directive attributes from a parenthesised string like "(key=val, key2=val2)". +let parseAttributes = (attrStr: string): array<(string, string)> => { + if attrStr->String.length == 0 { + [] + } else { + attrStr + ->String.split(",") + ->Array.filterMap(pair => { + let trimmed = pair->String.trim + let eqIdx = trimmed->String.indexOf("=") + if eqIdx >= 0 { + let key = trimmed->String.slice(~start=0, ~end=eqIdx)->String.trim + let value = trimmed->String.sliceToEnd(~start=eqIdx + 1)->String.trim + Some((key, value)) + } else { + None + } + }) + } +} + +// --------------------------------------------------------------------------- +// Block-level parser +// --------------------------------------------------------------------------- + +/// Internal state for the line-oriented parser. +type parserState = { + mutable lineIndex: int, + lines: array, + blocks: array, + directives: array, + attestations: array, + mutable title: option, +} + +/// Count the number of leading '#' characters on a line. +let countHashes = (line: string): int => { + let count = ref(0) + let len = line->String.length + while count.contents < len && line->String.charAt(count.contents) == "#" { + count := count.contents + 1 + } + count.contents +} + +/// Parse a directive block starting with @name or @name(attrs): +/// Reads lines until @end is encountered. +let parseDirectiveBlock = (state: parserState): result => { + let startLine = state.lineIndex + let line = state.lines->Array.getUnsafe(startLine)->String.trim + + // Extract directive name and optional attributes + // Formats: @name: body or @name(attrs): body or @name:\n multi-line \n @end + let afterAt = line->String.sliceToEnd(~start=1) + + // Check for parenthesised attributes + let (name, attributes) = { + let parenIdx = afterAt->String.indexOf("(") + if parenIdx >= 0 { + let closeParenIdx = afterAt->String.indexOf(")") + if closeParenIdx > parenIdx { + let dirName = afterAt->String.slice(~start=0, ~end=parenIdx)->String.trim + let attrStr = afterAt->String.slice(~start=parenIdx + 1, ~end=closeParenIdx) + (dirName, parseAttributes(attrStr)) + } else { + let colonIdx = afterAt->String.indexOf(":") + let dirName = if colonIdx >= 0 { + afterAt->String.slice(~start=0, ~end=colonIdx)->String.trim + } else { + afterAt->String.trim + } + (dirName, []) + } + } else { + let colonIdx = afterAt->String.indexOf(":") + let dirName = if colonIdx >= 0 { + afterAt->String.slice(~start=0, ~end=colonIdx)->String.trim + } else { + afterAt->String.trim + } + (dirName, []) + } + } + + // Extract inline body (text after the colon on the same line) + let colonIdx = line->String.indexOf(":") + let inlineBody = if colonIdx >= 0 { + line->String.sliceToEnd(~start=colonIdx + 1)->String.trim + } else { + "" + } + + // Check if this is a single-line directive (no @end needed) + if inlineBody->String.length > 0 { + state.lineIndex = state.lineIndex + 1 + Ok({name, value: inlineBody, attributes}) + } else { + // Multi-line directive: read until @end + state.lineIndex = state.lineIndex + 1 + let bodyLines = [] + let found = ref(false) + while state.lineIndex < state.lines->Array.length && !found.contents { + let currentLine = state.lines->Array.getUnsafe(state.lineIndex) + if currentLine->String.trim == "@end" { + found := true + state.lineIndex = state.lineIndex + 1 + } else { + bodyLines->Array.push(currentLine)->ignore + state.lineIndex = state.lineIndex + 1 + } + } + if found.contents { + Ok({name, value: bodyLines->Array.join("\n"), attributes}) + } else { + Error(UnterminatedDirective({line: startLine + 1, name})) + } + } +} + +/// Parse an attestation block starting with !attest. +/// Format: +/// !attest +/// identity: +/// role: +/// trust-level: +/// timestamp: (optional) +/// note: (optional) +/// !end +let parseAttestationBlock = (state: parserState): result => { + let startLine = state.lineIndex + state.lineIndex = state.lineIndex + 1 + + let identity = ref("") + let role = ref("") + let trustLvl = ref(Unverified) + let timestamp = ref(None) + let note = ref(None) + let found = ref(false) + + while state.lineIndex < state.lines->Array.length && !found.contents { + let currentLine = state.lines->Array.getUnsafe(state.lineIndex)->String.trim + if currentLine == "!end" { + found := true + state.lineIndex = state.lineIndex + 1 + } else { + let colonIdx = currentLine->String.indexOf(":") + if colonIdx >= 0 { + let key = currentLine->String.slice(~start=0, ~end=colonIdx)->String.trim + let value = currentLine->String.sliceToEnd(~start=colonIdx + 1)->String.trim + switch key { + | "identity" => identity := value + | "role" => role := value + | "trust-level" => + switch trustLevelFromString(value) { + | Some(lvl) => trustLvl := lvl + | None => () // Default to Unverified if unrecognised + } + | "timestamp" => timestamp := Some(value) + | "note" => note := Some(value) + | _ => () // Ignore unknown fields + } + } + state.lineIndex = state.lineIndex + 1 + } + } + + if found.contents { + Ok({ + identity: identity.contents, + role: role.contents, + trustLevel: trustLvl.contents, + timestamp: timestamp.contents, + note: note.contents, + }) + } else { + Error(UnexpectedToken({line: startLine + 1, token: "unterminated !attest block"})) + } +} + +// --------------------------------------------------------------------------- +// Public API +// --------------------------------------------------------------------------- + +/// Parse an A2ML document from a string. +/// +/// Returns either a parseError or the parsed document. +/// +/// ### Example +/// ``` +/// let result = parseA2ML("# Hello\n\nSome text.\n") +/// ``` +let parseA2ML = (input: string): result => { + let trimmed = input->String.trim + if trimmed->String.length == 0 { + Error(EmptyDocument) + } else { + let lines = input->String.split("\n") + let state: parserState = { + lineIndex: 0, + lines, + blocks: [], + directives: [], + attestations: [], + title: None, + } + + let error = ref(None) + + while state.lineIndex < lines->Array.length && error.contents->Option.isNone { + let line = lines->Array.getUnsafe(state.lineIndex) + let trimmedLine = line->String.trim + + // Blank line + if trimmedLine->String.length == 0 { + state.blocks->Array.push(BlankLine)->ignore + state.lineIndex = state.lineIndex + 1 + } + // Thematic break (--- or ***) + else if trimmedLine == "---" || trimmedLine == "***" || trimmedLine == "___" { + state.blocks->Array.push(ThematicBreak)->ignore + state.lineIndex = state.lineIndex + 1 + } + // Fenced code block (```) + else if trimmedLine->String.startsWith("```") { + let lang = trimmedLine->String.sliceToEnd(~start=3)->String.trim + let language = if lang->String.length > 0 { + Some(lang) + } else { + None + } + state.lineIndex = state.lineIndex + 1 + let codeLines = [] + let closed = ref(false) + while state.lineIndex < lines->Array.length && !closed.contents { + let codeLine = lines->Array.getUnsafe(state.lineIndex) + if codeLine->String.trim->String.startsWith("```") { + closed := true + state.lineIndex = state.lineIndex + 1 + } else { + codeLines->Array.push(codeLine)->ignore + state.lineIndex = state.lineIndex + 1 + } + } + state.blocks + ->Array.push(CodeBlock({language, content: codeLines->Array.join("\n")})) + ->ignore + } + // Heading (# through #####) + else if trimmedLine->String.startsWith("#") { + let level = countHashes(trimmedLine) + if level >= 1 && level <= 5 { + let headingText = trimmedLine->String.sliceToEnd(~start=level)->String.trim + let inlines = parseInlines(headingText) + // Extract title from first H1 heading + if level == 1 && state.title->Option.isNone { + state.title = Some(headingText) + } + state.blocks->Array.push(Heading({level, content: inlines}))->ignore + state.lineIndex = state.lineIndex + 1 + } else { + error := Some(InvalidHeadingLevel({line: state.lineIndex + 1, level})) + } + } + // Directive block (@name...) + else if trimmedLine->String.startsWith("@") && trimmedLine != "@end" { + switch parseDirectiveBlock(state) { + | Ok(dir) => + state.directives->Array.push(dir)->ignore + state.blocks->Array.push(DirectiveBlock(dir))->ignore + | Error(err) => error := Some(err) + } + } + // Attestation block (!attest) + else if trimmedLine->String.startsWith("!attest") { + switch parseAttestationBlock(state) { + | Ok(att) => + state.attestations->Array.push(att)->ignore + state.blocks->Array.push(AttestationBlock(att))->ignore + | Error(err) => error := Some(err) + } + } + // Block quote (> ...) + else if trimmedLine->String.startsWith("> ") { + let quoteLines = [] + let done = ref(false) + while state.lineIndex < lines->Array.length && !done.contents { + let ql = lines->Array.getUnsafe(state.lineIndex)->String.trim + if ql->String.startsWith("> ") { + quoteLines->Array.push(ql->String.sliceToEnd(~start=2))->ignore + state.lineIndex = state.lineIndex + 1 + } else { + done := true + } + } + let quoteText = quoteLines->Array.join("\n") + state.blocks + ->Array.push(BlockQuote([Paragraph(parseInlines(quoteText))])) + ->ignore + } + // Bullet list (- item) + else if trimmedLine->String.startsWith("- ") || trimmedLine->String.startsWith("* ") { + let items = [] + let done = ref(false) + while state.lineIndex < lines->Array.length && !done.contents { + let listLine = lines->Array.getUnsafe(state.lineIndex)->String.trim + if listLine->String.startsWith("- ") || listLine->String.startsWith("* ") { + let itemText = listLine->String.sliceToEnd(~start=2)->String.trim + items->Array.push(parseInlines(itemText))->ignore + state.lineIndex = state.lineIndex + 1 + } else { + done := true + } + } + state.blocks->Array.push(BulletList(items))->ignore + } + // Paragraph (default) + else { + let paraLines = [] + let done = ref(false) + while state.lineIndex < lines->Array.length && !done.contents { + let pl = lines->Array.getUnsafe(state.lineIndex)->String.trim + if ( + pl->String.length > 0 && + !(pl->String.startsWith("#")) && + !(pl->String.startsWith("@")) && + !(pl->String.startsWith("!attest")) && + !(pl->String.startsWith("```")) && + !(pl->String.startsWith("- ")) && + !(pl->String.startsWith("* ")) && + !(pl->String.startsWith("> ")) && + pl != "---" && + pl != "***" && + pl != "___" + ) { + paraLines->Array.push(pl)->ignore + state.lineIndex = state.lineIndex + 1 + } else { + done := true + } + } + let paraText = paraLines->Array.join(" ") + state.blocks->Array.push(Paragraph(parseInlines(paraText)))->ignore + } + } + + switch error.contents { + | Some(err) => Error(err) + | None => + Ok({ + title: state.title, + directives: state.directives, + blocks: state.blocks, + attestations: state.attestations, + }) + } + } +} + +/// Parse an A2ML document from a file path (Deno-compatible). +/// Uses Deno.readTextFile under the hood. +/// Returns a Promise resolving to Result. +@module("node:fs") +external readFileSync: (string, string) => string = "readFileSync" + +let parseA2MLFile = (path: string): result => { + let content = readFileSync(path, "utf-8") + parseA2ML(content) +} diff --git a/deno/src/A2ML_Renderer.res b/deno/src/A2ML_Renderer.res new file mode 100644 index 0000000..20c0ed0 --- /dev/null +++ b/deno/src/A2ML_Renderer.res @@ -0,0 +1,127 @@ +// SPDX-License-Identifier: MPL-2.0 +// Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) +// +// A2ML_Renderer — Render A2ML AST back to A2ML surface syntax. +// +// Converts the typed AST from A2ML_Types into A2ML text format, +// preserving structure and formatting conventions. Produces output +// compatible with the A2ML parser for round-trip fidelity. + +open A2ML_Types + +// --------------------------------------------------------------------------- +// Inline rendering +// --------------------------------------------------------------------------- + +/// Render a single inline element to A2ML text. +let rec renderInline = (inl: inline): string => { + switch inl { + | Text(t) => t + | Emphasis(children) => "*" ++ renderInlines(children) ++ "*" + | Strong(children) => "**" ++ renderInlines(children) ++ "**" + | Code(c) => "`" ++ c ++ "`" + | Link({content, url}) => "[" ++ renderInlines(content) ++ "](" ++ url ++ ")" + | InlineRef(refId) => "@ref(" ++ refId ++ ")" + } +} + +/// Render a list of inline elements to text. +and renderInlines = (inlines: array): string => { + inlines->Array.map(renderInline)->Array.join("") +} + +// --------------------------------------------------------------------------- +// Directive rendering +// --------------------------------------------------------------------------- + +/// Render a directive to A2ML surface syntax. +/// Single-line directives use `@name: value` format. +/// Multi-line directives use `@name:\n...\n@end` format. +let renderDirective = (dir: directive): string => { + let attrStr = if dir.attributes->Array.length > 0 { + let pairs = + dir.attributes + ->Array.map(((k, v)) => k ++ "=" ++ v) + ->Array.join(", ") + "(" ++ pairs ++ ")" + } else { + "" + } + + let hasNewlines = dir.value->String.includes("\n") + if hasNewlines { + "@" ++ dir.name ++ attrStr ++ ":\n" ++ dir.value ++ "\n@end" + } else { + "@" ++ dir.name ++ attrStr ++ ": " ++ dir.value + } +} + +// --------------------------------------------------------------------------- +// Attestation rendering +// --------------------------------------------------------------------------- + +/// Render an attestation block to A2ML surface syntax. +let renderAttestation = (att: attestation): string => { + let lines = [ + "!attest", + "identity: " ++ att.identity, + "role: " ++ att.role, + "trust-level: " ++ trustLevelToString(att.trustLevel), + ] + + switch att.timestamp { + | Some(ts) => lines->Array.push("timestamp: " ++ ts)->ignore + | None => () + } + + switch att.note { + | Some(n) => lines->Array.push("note: " ++ n)->ignore + | None => () + } + + lines->Array.push("!end")->ignore + lines->Array.join("\n") +} + +// --------------------------------------------------------------------------- +// Block rendering +// --------------------------------------------------------------------------- + +/// Render a single block to A2ML text. +let rec renderBlock = (blk: block): string => { + switch blk { + | Heading({level, content}) => + let hashes = Array.make(~length=level, "#")->Array.join("") + hashes ++ " " ++ renderInlines(content) + | Paragraph(inlines) => renderInlines(inlines) + | CodeBlock({language, content}) => + let langTag = switch language { + | Some(l) => l + | None => "" + } + "```" ++ langTag ++ "\n" ++ content ++ "\n```" + | DirectiveBlock(dir) => renderDirective(dir) + | AttestationBlock(att) => renderAttestation(att) + | ThematicBreak => "---" + | BlockQuote(blocks) => + blocks->Array.map(b => "> " ++ renderBlock(b))->Array.join("\n") + | BulletList(items) => + items->Array.map(inlines => "- " ++ renderInlines(inlines))->Array.join("\n") + | BlankLine => "" + } +} + +// --------------------------------------------------------------------------- +// Document rendering +// --------------------------------------------------------------------------- + +/// Render a complete A2ML document to text. +/// +/// ### Example +/// ``` +/// let doc = { title: Some("Hello"), directives: [], blocks: [...], attestations: [] } +/// let text = renderA2ML(doc) +/// ``` +let renderA2ML = (doc: document): string => { + doc.blocks->Array.map(renderBlock)->Array.join("\n") ++ "\n" +} diff --git a/deno/src/A2ML_Types.res b/deno/src/A2ML_Types.res new file mode 100644 index 0000000..a538ba9 --- /dev/null +++ b/deno/src/A2ML_Types.res @@ -0,0 +1,193 @@ +// SPDX-License-Identifier: MPL-2.0 +// Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) +// +// A2ML_Types — Core data types for A2ML (Attested Markup Language) documents. +// +// Defines the abstract syntax tree for A2ML documents including document +// structure, block-level elements, inline formatting, directives, and +// attestation provenance records with trust levels. + +// --------------------------------------------------------------------------- +// Trust levels +// --------------------------------------------------------------------------- + +/// The degree of trust associated with an attestation. +/// Forms an ordered scale from unverified content through to formally verified. +type trustLevel = + | Unverified + | Automated + | Reviewed + | Verified + +/// Parse a trust level from its canonical string representation. +/// Recognised values (case-insensitive): "unverified", "automated", +/// "reviewed", "verified". +let trustLevelFromString = (s: string): option => { + switch s->String.toLowerCase { + | "unverified" => Some(Unverified) + | "automated" => Some(Automated) + | "reviewed" => Some(Reviewed) + | "verified" => Some(Verified) + | _ => None + } +} + +/// Return the canonical string representation of a trust level. +let trustLevelToString = (level: trustLevel): string => { + switch level { + | Unverified => "unverified" + | Automated => "automated" + | Reviewed => "reviewed" + | Verified => "verified" + } +} + +// --------------------------------------------------------------------------- +// Inline-level elements +// --------------------------------------------------------------------------- + +/// An inline-level element within a block. +type rec inline = + | Text(string) + | Emphasis(array) + | Strong(array) + | Code(string) + | Link({content: array, url: string}) + | InlineRef(string) + +// --------------------------------------------------------------------------- +// Directives +// --------------------------------------------------------------------------- + +/// A machine-readable directive that provides metadata or instructions. +/// Directives begin with `@` in the source text, e.g. +/// `@version 1.0` or `@require trust-level:high`. +type directive = { + name: string, + value: string, + attributes: array<(string, string)>, +} + +/// Create a simple directive with a name and value, and no attributes. +let makeDirective = (name: string, value: string): directive => { + name, + value, + attributes: [], +} + +// --------------------------------------------------------------------------- +// Attestations +// --------------------------------------------------------------------------- + +/// An attestation record capturing who produced or reviewed content. +/// Attestation blocks start with `!attest` and record identity, +/// role, trust level, and optional timestamp of an author or reviewer. +type attestation = { + identity: string, + role: string, + trustLevel: trustLevel, + timestamp: option, + note: option, +} + +/// Create a new attestation with the minimum required fields. +let makeAttestation = ( + ~identity: string, + ~role: string, + ~trustLevel: trustLevel, +): attestation => { + identity, + role, + trustLevel, + timestamp: None, + note: None, +} + +// --------------------------------------------------------------------------- +// Block-level elements +// --------------------------------------------------------------------------- + +/// A block-level element in an A2ML document. +/// Blocks are separated by blank lines in the source text. +type rec block = + | Heading({level: int, content: array}) + | Paragraph(array) + | CodeBlock({language: option, content: string}) + | DirectiveBlock(directive) + | AttestationBlock(attestation) + | ThematicBreak + | BlockQuote(array) + | BulletList(array>) + | BlankLine + +// --------------------------------------------------------------------------- +// Top-level document +// --------------------------------------------------------------------------- + +/// A complete A2ML document, containing metadata and a sequence of blocks. +type document = { + title: option, + directives: array, + blocks: array, + attestations: array, +} + +/// Create a new, empty document with no title or content. +let emptyDocument = (): document => { + title: None, + directives: [], + blocks: [], + attestations: [], +} + +// --------------------------------------------------------------------------- +// Manifest (convenience aggregate) +// --------------------------------------------------------------------------- + +/// A high-level manifest extracted from a parsed A2ML document. +/// Collects directives and attestations for convenient programmatic access. +type manifest = { + version: option, + title: option, + directives: array, + attestations: array, +} + +/// Extract a manifest from a parsed document. +let manifestFromDocument = (doc: document): manifest => { + let version = + doc.directives + ->Array.find(d => d.name == "version") + ->Option.map(d => d.value) + + { + version, + title: doc.title, + directives: doc.directives, + attestations: doc.attestations, + } +} + +// --------------------------------------------------------------------------- +// Parse errors +// --------------------------------------------------------------------------- + +/// Errors that can occur during A2ML parsing. +type parseError = + | UnterminatedDirective({line: int, name: string}) + | InvalidHeadingLevel({line: int, level: int}) + | UnexpectedToken({line: int, token: string}) + | EmptyDocument + +/// Format a parse error as a diagnostic string. +let parseErrorToString = (err: parseError): string => { + switch err { + | UnterminatedDirective({line, name}) => + `error[A2ML]: line ${line->Int.toString}: unterminated directive @${name}` + | InvalidHeadingLevel({line, level}) => + `error[A2ML]: line ${line->Int.toString}: invalid heading level ${level->Int.toString} (must be 1-5)` + | UnexpectedToken({line, token}) => + `error[A2ML]: line ${line->Int.toString}: unexpected token "${token}"` + | EmptyDocument => "error[A2ML]: document is empty" + } +} diff --git a/deno/src/README.adoc b/deno/src/README.adoc new file mode 100644 index 0000000..5529f66 --- /dev/null +++ b/deno/src/README.adoc @@ -0,0 +1 @@ += src Pillar diff --git a/deno/src/aspects/0.2-AI-MANIFEST.a2ml b/deno/src/aspects/0.2-AI-MANIFEST.a2ml new file mode 100644 index 0000000..3d5b209 --- /dev/null +++ b/deno/src/aspects/0.2-AI-MANIFEST.a2ml @@ -0,0 +1,17 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "source-unit-aspects" +level: 2 +parent: "../0.1-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Cross-cutting concerns and domain-specific aspects (Security, + Observability, Integrity). + +canonical_locations: + security: "security/" + observability: "observability/" + integrity: "integrity/" diff --git a/deno/src/aspects/README.adoc b/deno/src/aspects/README.adoc new file mode 100644 index 0000000..6456f96 --- /dev/null +++ b/deno/src/aspects/README.adoc @@ -0,0 +1 @@ += Aspects Pillar diff --git a/deno/src/aspects/integrity/0.3-AI-MANIFEST.a2ml b/deno/src/aspects/integrity/0.3-AI-MANIFEST.a2ml new file mode 100644 index 0000000..f114cbd --- /dev/null +++ b/deno/src/aspects/integrity/0.3-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "aspect-unit-integrity" +level: 3 +parent: "../0.2-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Implementation logic for the integrity aspect. diff --git a/deno/src/aspects/integrity/README.adoc b/deno/src/aspects/integrity/README.adoc new file mode 100644 index 0000000..f15d829 --- /dev/null +++ b/deno/src/aspects/integrity/README.adoc @@ -0,0 +1 @@ += Integrity Aspect diff --git a/deno/src/aspects/observability/0.3-AI-MANIFEST.a2ml b/deno/src/aspects/observability/0.3-AI-MANIFEST.a2ml new file mode 100644 index 0000000..e16cbdf --- /dev/null +++ b/deno/src/aspects/observability/0.3-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "aspect-unit-observability" +level: 3 +parent: "../0.2-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Implementation logic for the observability aspect. diff --git a/deno/src/aspects/observability/README.adoc b/deno/src/aspects/observability/README.adoc new file mode 100644 index 0000000..7852ee6 --- /dev/null +++ b/deno/src/aspects/observability/README.adoc @@ -0,0 +1 @@ += Observability Aspect diff --git a/deno/src/aspects/security/0.3-AI-MANIFEST.a2ml b/deno/src/aspects/security/0.3-AI-MANIFEST.a2ml new file mode 100644 index 0000000..0996536 --- /dev/null +++ b/deno/src/aspects/security/0.3-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "aspect-unit-security" +level: 3 +parent: "../0.2-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Implementation logic for the security aspect. diff --git a/deno/src/aspects/security/README.adoc b/deno/src/aspects/security/README.adoc new file mode 100644 index 0000000..3c3536e --- /dev/null +++ b/deno/src/aspects/security/README.adoc @@ -0,0 +1 @@ += Security Aspect diff --git a/deno/src/bridges/0.2-AI-MANIFEST.a2ml b/deno/src/bridges/0.2-AI-MANIFEST.a2ml new file mode 100644 index 0000000..3d3e27a --- /dev/null +++ b/deno/src/bridges/0.2-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "source-unit-bridges" +level: 2 +parent: "../0.1-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Integration logic for external systems (API, Database, RPC, etc.). diff --git a/deno/src/contracts/0.2-AI-MANIFEST.a2ml b/deno/src/contracts/0.2-AI-MANIFEST.a2ml new file mode 100644 index 0000000..0bd9198 --- /dev/null +++ b/deno/src/contracts/0.2-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "source-unit-contracts" +level: 2 +parent: "../0.1-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Contracts unit for high-rigor source code. diff --git a/deno/src/contracts/README.adoc b/deno/src/contracts/README.adoc new file mode 100644 index 0000000..9cfa209 --- /dev/null +++ b/deno/src/contracts/README.adoc @@ -0,0 +1 @@ += Contracts Unit diff --git a/deno/src/core/0.2-AI-MANIFEST.a2ml b/deno/src/core/0.2-AI-MANIFEST.a2ml new file mode 100644 index 0000000..22846c7 --- /dev/null +++ b/deno/src/core/0.2-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "source-unit-core" +level: 2 +parent: "../0.1-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Primary application logic and core domain models. diff --git a/deno/src/definitions/0.2-AI-MANIFEST.a2ml b/deno/src/definitions/0.2-AI-MANIFEST.a2ml new file mode 100644 index 0000000..e54f4da --- /dev/null +++ b/deno/src/definitions/0.2-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "source-unit-definitions" +level: 2 +parent: "../0.1-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Definitions unit for high-rigor source code. diff --git a/deno/src/definitions/README.adoc b/deno/src/definitions/README.adoc new file mode 100644 index 0000000..9548349 --- /dev/null +++ b/deno/src/definitions/README.adoc @@ -0,0 +1 @@ += Definitions Unit diff --git a/deno/src/errors/0.2-AI-MANIFEST.a2ml b/deno/src/errors/0.2-AI-MANIFEST.a2ml new file mode 100644 index 0000000..dddcc6c --- /dev/null +++ b/deno/src/errors/0.2-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "source-unit-errors" +level: 2 +parent: "../0.1-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Errors unit for high-rigor source code. diff --git a/deno/src/errors/README.adoc b/deno/src/errors/README.adoc new file mode 100644 index 0000000..460fc1e --- /dev/null +++ b/deno/src/errors/README.adoc @@ -0,0 +1 @@ += Errors Unit diff --git a/deno/src/interface/0.2-AI-MANIFEST.a2ml b/deno/src/interface/0.2-AI-MANIFEST.a2ml new file mode 100644 index 0000000..7f0f471 --- /dev/null +++ b/deno/src/interface/0.2-AI-MANIFEST.a2ml @@ -0,0 +1,24 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "interface-seams-unit" +level: 2 +parent: "../0.1-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Consolidated "Verified Interface Seams" unit. This directory unifies the + formal specification (ABI), the bridge implementation (FFI), and the + resulting artifacts (Generated). + +canonical_locations: + abi: "abi/" + ffi: "ffi/" + generated: "generated/" + +invariants: + - "ABI MUST be Idris2 (.idr)" + - "FFI MUST be Zig (.zig)" + - "Generated artifacts MUST be C-compatible" + - "The 'Truth' lives in abi/; the 'Implementation' lives in ffi/" diff --git a/deno/src/interface/README.adoc b/deno/src/interface/README.adoc new file mode 100644 index 0000000..8faf0aa --- /dev/null +++ b/deno/src/interface/README.adoc @@ -0,0 +1 @@ += interface Unit diff --git a/deno/src/interface/abi/0.3-AI-MANIFEST.a2ml b/deno/src/interface/abi/0.3-AI-MANIFEST.a2ml new file mode 100644 index 0000000..91cafa0 --- /dev/null +++ b/deno/src/interface/abi/0.3-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "abi-logic" +level: 3 +parent: "../0.2-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Specialised Level 3 logic for abi. diff --git a/deno/src/interface/abi/README.adoc b/deno/src/interface/abi/README.adoc new file mode 100644 index 0000000..2330304 --- /dev/null +++ b/deno/src/interface/abi/README.adoc @@ -0,0 +1 @@ += abi Logic diff --git a/deno/src/interface/ffi/0.3-AI-MANIFEST.a2ml b/deno/src/interface/ffi/0.3-AI-MANIFEST.a2ml new file mode 100644 index 0000000..bf456ae --- /dev/null +++ b/deno/src/interface/ffi/0.3-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "ffi-logic" +level: 3 +parent: "../0.2-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Specialised Level 3 logic for ffi. diff --git a/deno/src/interface/ffi/README.adoc b/deno/src/interface/ffi/README.adoc new file mode 100644 index 0000000..8fe57d3 --- /dev/null +++ b/deno/src/interface/ffi/README.adoc @@ -0,0 +1 @@ += ffi Logic diff --git a/deno/src/interface/ffi/build.zig b/deno/src/interface/ffi/build.zig new file mode 100644 index 0000000..4a2e049 --- /dev/null +++ b/deno/src/interface/ffi/build.zig @@ -0,0 +1,94 @@ +// {{PROJECT}} FFI Build Configuration +// SPDX-License-Identifier: MPL-2.0 + +const std = @import("std"); + +pub fn build(b: *std.Build) void { + const target = b.standardTargetOptions(.{}); + const optimize = b.standardOptimizeOption(.{}); + + // Shared library (.so, .dylib, .dll) + const lib = b.addSharedLibrary(.{ + .name = "{{project}}", + .root_source_file = b.path("src/main.zig"), + .target = target, + .optimize = optimize, + }); + + // Set version + lib.version = .{ .major = 0, .minor = 1, .patch = 0 }; + + // Static library (.a) + const lib_static = b.addStaticLibrary(.{ + .name = "{{project}}", + .root_source_file = b.path("src/main.zig"), + .target = target, + .optimize = optimize, + }); + + // Install artifacts + b.installArtifact(lib); + b.installArtifact(lib_static); + + // Generate header file for C compatibility + const header = b.addInstallHeader( + b.path("include/{{project}}.h"), + "{{project}}.h", + ); + b.getInstallStep().dependOn(&header.step); + + // Unit tests + const lib_tests = b.addTest(.{ + .root_source_file = b.path("src/main.zig"), + .target = target, + .optimize = optimize, + }); + + const run_lib_tests = b.addRunArtifact(lib_tests); + + const test_step = b.step("test", "Run library tests"); + test_step.dependOn(&run_lib_tests.step); + + // Integration tests + const integration_tests = b.addTest(.{ + .root_source_file = b.path("test/integration_test.zig"), + .target = target, + .optimize = optimize, + }); + + integration_tests.linkLibrary(lib); + + const run_integration_tests = b.addRunArtifact(integration_tests); + + const integration_test_step = b.step("test-integration", "Run integration tests"); + integration_test_step.dependOn(&run_integration_tests.step); + + // Documentation + const docs = b.addTest(.{ + .root_source_file = b.path("src/main.zig"), + .target = target, + .optimize = .Debug, + }); + + const docs_step = b.step("docs", "Generate documentation"); + docs_step.dependOn(&b.addInstallDirectory(.{ + .source_dir = docs.getEmittedDocs(), + .install_dir = .prefix, + .install_subdir = "docs", + }).step); + + // Benchmark (if needed) + const bench = b.addExecutable(.{ + .name = "{{project}}-bench", + .root_source_file = b.path("bench/bench.zig"), + .target = target, + .optimize = .ReleaseFast, + }); + + bench.linkLibrary(lib); + + const run_bench = b.addRunArtifact(bench); + + const bench_step = b.step("bench", "Run benchmarks"); + bench_step.dependOn(&run_bench.step); +} diff --git a/deno/src/interface/ffi/src/0.4-AI-MANIFEST.a2ml b/deno/src/interface/ffi/src/0.4-AI-MANIFEST.a2ml new file mode 100644 index 0000000..5b5f1b1 --- /dev/null +++ b/deno/src/interface/ffi/src/0.4-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "src-unit" +level: 4 +parent: "../0.3-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Src logic at level 4. diff --git a/deno/src/interface/ffi/src/README.adoc b/deno/src/interface/ffi/src/README.adoc new file mode 100644 index 0000000..a5c0c6d --- /dev/null +++ b/deno/src/interface/ffi/src/README.adoc @@ -0,0 +1 @@ += Src Logic diff --git a/deno/src/interface/ffi/src/main.zig b/deno/src/interface/ffi/src/main.zig new file mode 100644 index 0000000..6b233bc --- /dev/null +++ b/deno/src/interface/ffi/src/main.zig @@ -0,0 +1,274 @@ +// {{PROJECT}} FFI Implementation +// +// This module implements the C-compatible FFI declared in src/abi/Foreign.idr +// All types and layouts must match the Idris2 ABI definitions. +// +// SPDX-License-Identifier: MPL-2.0 + +const std = @import("std"); + +// Version information (keep in sync with project) +const VERSION = "0.1.0"; +const BUILD_INFO = "{{PROJECT}} built with Zig " ++ @import("builtin").zig_version_string; + +/// Thread-local error storage +threadlocal var last_error: ?[]const u8 = null; + +/// Set the last error message +fn setError(msg: []const u8) void { + last_error = msg; +} + +/// Clear the last error +fn clearError() void { + last_error = null; +} + +//============================================================================== +// Core Types (must match src/abi/Types.idr) +//============================================================================== + +/// Result codes (must match Idris2 Result type) +pub const Result = enum(c_int) { + ok = 0, + @"error" = 1, + invalid_param = 2, + out_of_memory = 3, + null_pointer = 4, +}; + +/// Library handle (opaque to prevent direct access) +pub const Handle = opaque { + // Internal state hidden from C + allocator: std.mem.Allocator, + initialized: bool, + // Add your fields here +}; + +//============================================================================== +// Library Lifecycle +//============================================================================== + +/// Initialize the library +/// Returns a handle, or null on failure +export fn {{project}}_init() ?*Handle { + const allocator = std.heap.c_allocator; + + const handle = allocator.create(Handle) catch { + setError("Failed to allocate handle"); + return null; + }; + + // Initialize handle + handle.* = .{ + .allocator = allocator, + .initialized = true, + }; + + clearError(); + return handle; +} + +/// Free the library handle +export fn {{project}}_free(handle: ?*Handle) void { + const h = handle orelse return; + const allocator = h.allocator; + + // Clean up resources + h.initialized = false; + + allocator.destroy(h); + clearError(); +} + +//============================================================================== +// Core Operations +//============================================================================== + +/// Process data (example operation) +export fn {{project}}_process(handle: ?*Handle, input: u32) Result { + const h = handle orelse { + setError("Null handle"); + return .null_pointer; + }; + + if (!h.initialized) { + setError("Handle not initialized"); + return .@"error"; + } + + // Example processing logic + _ = input; + + clearError(); + return .ok; +} + +//============================================================================== +// String Operations +//============================================================================== + +/// Get a string result (example) +/// Caller must free the returned string +export fn {{project}}_get_string(handle: ?*Handle) ?[*:0]const u8 { + const h = handle orelse { + setError("Null handle"); + return null; + }; + + if (!h.initialized) { + setError("Handle not initialized"); + return null; + } + + // Example: allocate and return a string + const result = h.allocator.dupeZ(u8, "Example result") catch { + setError("Failed to allocate string"); + return null; + }; + + clearError(); + return result.ptr; +} + +/// Free a string allocated by the library +export fn {{project}}_free_string(str: ?[*:0]const u8) void { + const s = str orelse return; + const allocator = std.heap.c_allocator; + + const slice = std.mem.span(s); + allocator.free(slice); +} + +//============================================================================== +// Array/Buffer Operations +//============================================================================== + +/// Process an array of data +export fn {{project}}_process_array( + handle: ?*Handle, + buffer: ?[*]const u8, + len: u32, +) Result { + const h = handle orelse { + setError("Null handle"); + return .null_pointer; + }; + + const buf = buffer orelse { + setError("Null buffer"); + return .null_pointer; + }; + + if (!h.initialized) { + setError("Handle not initialized"); + return .@"error"; + } + + // Access the buffer + const data = buf[0..len]; + _ = data; + + // Process data here + + clearError(); + return .ok; +} + +//============================================================================== +// Error Handling +//============================================================================== + +/// Get the last error message +/// Returns null if no error +export fn {{project}}_last_error() ?[*:0]const u8 { + const err = last_error orelse return null; + + // Return C string (static storage, no need to free) + const allocator = std.heap.c_allocator; + const c_str = allocator.dupeZ(u8, err) catch return null; + return c_str.ptr; +} + +//============================================================================== +// Version Information +//============================================================================== + +/// Get the library version +export fn {{project}}_version() [*:0]const u8 { + return VERSION.ptr; +} + +/// Get build information +export fn {{project}}_build_info() [*:0]const u8 { + return BUILD_INFO.ptr; +} + +//============================================================================== +// Callback Support +//============================================================================== + +/// Callback function type (C ABI) +pub const Callback = *const fn (u64, u32) callconv(.C) u32; + +/// Register a callback +export fn {{project}}_register_callback( + handle: ?*Handle, + callback: ?Callback, +) Result { + const h = handle orelse { + setError("Null handle"); + return .null_pointer; + }; + + const cb = callback orelse { + setError("Null callback"); + return .null_pointer; + }; + + if (!h.initialized) { + setError("Handle not initialized"); + return .@"error"; + } + + // Store callback for later use + _ = cb; + + clearError(); + return .ok; +} + +//============================================================================== +// Utility Functions +//============================================================================== + +/// Check if handle is initialized +export fn {{project}}_is_initialized(handle: ?*Handle) u32 { + const h = handle orelse return 0; + return if (h.initialized) 1 else 0; +} + +//============================================================================== +// Tests +//============================================================================== + +test "lifecycle" { + const handle = {{project}}_init() orelse return error.InitFailed; + defer {{project}}_free(handle); + + try std.testing.expect({{project}}_is_initialized(handle) == 1); +} + +test "error handling" { + const result = {{project}}_process(null, 0); + try std.testing.expectEqual(Result.null_pointer, result); + + const err = {{project}}_last_error(); + try std.testing.expect(err != null); +} + +test "version" { + const ver = {{project}}_version(); + const ver_str = std.mem.span(ver); + try std.testing.expectEqualStrings(VERSION, ver_str); +} diff --git a/deno/src/interface/ffi/test/0.4-AI-MANIFEST.a2ml b/deno/src/interface/ffi/test/0.4-AI-MANIFEST.a2ml new file mode 100644 index 0000000..e02427f --- /dev/null +++ b/deno/src/interface/ffi/test/0.4-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "test-unit" +level: 4 +parent: "../0.3-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Test logic at level 4. diff --git a/deno/src/interface/ffi/test/README.adoc b/deno/src/interface/ffi/test/README.adoc new file mode 100644 index 0000000..f6f38bf --- /dev/null +++ b/deno/src/interface/ffi/test/README.adoc @@ -0,0 +1 @@ += Test Logic diff --git a/deno/src/interface/ffi/test/integration_test.zig b/deno/src/interface/ffi/test/integration_test.zig new file mode 100644 index 0000000..0341994 --- /dev/null +++ b/deno/src/interface/ffi/test/integration_test.zig @@ -0,0 +1,182 @@ +// {{PROJECT}} Integration Tests +// SPDX-License-Identifier: MPL-2.0 +// +// These tests verify that the Zig FFI correctly implements the Idris2 ABI + +const std = @import("std"); +const testing = std.testing; + +// Import FFI functions +extern fn {{project}}_init() ?*opaque {}; +extern fn {{project}}_free(?*opaque {}) void; +extern fn {{project}}_process(?*opaque {}, u32) c_int; +extern fn {{project}}_get_string(?*opaque {}) ?[*:0]const u8; +extern fn {{project}}_free_string(?[*:0]const u8) void; +extern fn {{project}}_last_error() ?[*:0]const u8; +extern fn {{project}}_version() [*:0]const u8; +extern fn {{project}}_is_initialized(?*opaque {}) u32; + +//============================================================================== +// Lifecycle Tests +//============================================================================== + +test "create and destroy handle" { + const handle = {{project}}_init() orelse return error.InitFailed; + defer {{project}}_free(handle); + + try testing.expect(handle != null); +} + +test "handle is initialized" { + const handle = {{project}}_init() orelse return error.InitFailed; + defer {{project}}_free(handle); + + const initialized = {{project}}_is_initialized(handle); + try testing.expectEqual(@as(u32, 1), initialized); +} + +test "null handle is not initialized" { + const initialized = {{project}}_is_initialized(null); + try testing.expectEqual(@as(u32, 0), initialized); +} + +//============================================================================== +// Operation Tests +//============================================================================== + +test "process with valid handle" { + const handle = {{project}}_init() orelse return error.InitFailed; + defer {{project}}_free(handle); + + const result = {{project}}_process(handle, 42); + try testing.expectEqual(@as(c_int, 0), result); // 0 = ok +} + +test "process with null handle returns error" { + const result = {{project}}_process(null, 42); + try testing.expectEqual(@as(c_int, 4), result); // 4 = null_pointer +} + +//============================================================================== +// String Tests +//============================================================================== + +test "get string result" { + const handle = {{project}}_init() orelse return error.InitFailed; + defer {{project}}_free(handle); + + const str = {{project}}_get_string(handle); + defer if (str) |s| {{project}}_free_string(s); + + try testing.expect(str != null); +} + +test "get string with null handle" { + const str = {{project}}_get_string(null); + try testing.expect(str == null); +} + +//============================================================================== +// Error Handling Tests +//============================================================================== + +test "last error after null handle operation" { + _ = {{project}}_process(null, 0); + + const err = {{project}}_last_error(); + try testing.expect(err != null); + + if (err) |e| { + const err_str = std.mem.span(e); + try testing.expect(err_str.len > 0); + } +} + +test "no error after successful operation" { + const handle = {{project}}_init() orelse return error.InitFailed; + defer {{project}}_free(handle); + + _ = {{project}}_process(handle, 0); + + // Error should be cleared after successful operation + // (This depends on implementation) +} + +//============================================================================== +// Version Tests +//============================================================================== + +test "version string is not empty" { + const ver = {{project}}_version(); + const ver_str = std.mem.span(ver); + + try testing.expect(ver_str.len > 0); +} + +test "version string is semantic version format" { + const ver = {{project}}_version(); + const ver_str = std.mem.span(ver); + + // Should be in format X.Y.Z + try testing.expect(std.mem.count(u8, ver_str, ".") >= 1); +} + +//============================================================================== +// Memory Safety Tests +//============================================================================== + +test "multiple handles are independent" { + const h1 = {{project}}_init() orelse return error.InitFailed; + defer {{project}}_free(h1); + + const h2 = {{project}}_init() orelse return error.InitFailed; + defer {{project}}_free(h2); + + try testing.expect(h1 != h2); + + // Operations on h1 should not affect h2 + _ = {{project}}_process(h1, 1); + _ = {{project}}_process(h2, 2); +} + +test "double free is safe" { + const handle = {{project}}_init() orelse return error.InitFailed; + + {{project}}_free(handle); + {{project}}_free(handle); // Should not crash +} + +test "free null is safe" { + {{project}}_free(null); // Should not crash +} + +//============================================================================== +// Thread Safety Tests (if applicable) +//============================================================================== + +test "concurrent operations" { + const handle = {{project}}_init() orelse return error.InitFailed; + defer {{project}}_free(handle); + + const ThreadContext = struct { + h: *opaque {}, + id: u32, + }; + + const thread_fn = struct { + fn run(ctx: ThreadContext) void { + _ = {{project}}_process(ctx.h, ctx.id); + } + }.run; + + var threads: [4]std.Thread = undefined; + for (&threads, 0..) |*thread, i| { + thread.* = try std.Thread.spawn(.{}, thread_fn, .{ + ThreadContext{ .h = handle, .id = @intCast(i) }, + }); + } + + for (threads) |thread| { + thread.join(); + } +} diff --git a/deno/src/interface/generated/0.3-AI-MANIFEST.a2ml b/deno/src/interface/generated/0.3-AI-MANIFEST.a2ml new file mode 100644 index 0000000..0088b80 --- /dev/null +++ b/deno/src/interface/generated/0.3-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "generated-logic" +level: 3 +parent: "../0.2-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Specialised Level 3 logic for generated. diff --git a/deno/src/interface/generated/README.adoc b/deno/src/interface/generated/README.adoc new file mode 100644 index 0000000..3691b06 --- /dev/null +++ b/deno/src/interface/generated/README.adoc @@ -0,0 +1 @@ += generated Logic diff --git a/deno/src/interface/generated/abi/.gitkeep b/deno/src/interface/generated/abi/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/deno/src/interface/generated/abi/0.4-AI-MANIFEST.a2ml b/deno/src/interface/generated/abi/0.4-AI-MANIFEST.a2ml new file mode 100644 index 0000000..4eeb580 --- /dev/null +++ b/deno/src/interface/generated/abi/0.4-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "abi-unit" +level: 4 +parent: "../0.3-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Abi logic at level 4. diff --git a/deno/src/interface/generated/abi/README.adoc b/deno/src/interface/generated/abi/README.adoc new file mode 100644 index 0000000..aff61a9 --- /dev/null +++ b/deno/src/interface/generated/abi/README.adoc @@ -0,0 +1 @@ += Abi Logic diff --git a/deno/stapeln.toml b/deno/stapeln.toml new file mode 100644 index 0000000..8c5357c --- /dev/null +++ b/deno/stapeln.toml @@ -0,0 +1,87 @@ +# SPDX-License-Identifier: MPL-2.0 +# stapeln.toml — Layer-based container build for a2ml-deno +# +# stapeln builds containers as composable layers (German: "to stack"). +# Each layer is independently cacheable, verifiable, and signable. + +[metadata] +name = "a2ml-deno" +version = "0.1.0" +description = "a2ml-deno container service" +author = "Jonathan D.A. Jewell " +license = "MPL-2.0" +registry = "ghcr.io/hyperpolymath" + +[build] +containerfile = "Containerfile" +context = "." +runtime = "podman" + +# ── Layer Definitions ────────────────────────────────────────── + +[layers.base] +description = "Chainguard Wolfi minimal base" +from = "cgr.dev/chainguard/wolfi-base:latest" +cache = true +verify = true + +[layers.toolchain] +description = "Build tools" +extends = "base" +packages = [] +cache = true + +[layers.build] +description = "a2ml-deno build" +extends = "toolchain" +commands = [] + +[layers.runtime] +description = "Minimal runtime" +from = "cgr.dev/chainguard/wolfi-base:latest" +packages = ["ca-certificates", "curl"] +copy-from = [ + { layer = "build", src = "/app/", dst = "/app/" }, +] +entrypoint = ["/app/a2ml-deno"] +user = "nonroot" + +# ── Security ─────────────────────────────────────────────────── + +[security] +non-root = true +read-only-root = false +no-new-privileges = true +cap-drop = ["ALL"] +seccomp-profile = "default" + +[security.signing] +algorithm = "ML-DSA-87" +provider = "cerro-torre" + +[security.sbom] +format = "spdx-json" +output = "sbom.spdx.json" +include-deps = true + +# ── Verification ─────────────────────────────────────────────── + +[verify] +vordr = true +svalinn = true +scan-on-build = true +fail-on = ["critical", "high"] + +# ── Targets ──────────────────────────────────────────────────── + +[targets.development] +layers = ["base", "chainguard-toolchain", "build"] +env = { LOG_LEVEL = "debug" } + +[targets.production] +layers = ["runtime"] +env = { LOG_LEVEL = "info" } + +[targets.test] +layers = ["base", "chainguard-toolchain", "build"] +env = { LOG_LEVEL = "debug" } diff --git a/deno/tests/bench_test.mjs b/deno/tests/bench_test.mjs new file mode 100644 index 0000000..3aa0b9b --- /dev/null +++ b/deno/tests/bench_test.mjs @@ -0,0 +1,121 @@ +// SPDX-License-Identifier: MPL-2.0 +// +// tests/bench_test.mjs — Performance benchmarks for a2ml-deno. +// +// Uses Deno.bench() to measure parser and renderer throughput across +// a range of document sizes and content types. +// +// Run with: deno bench tests/bench_test.mjs + +import { parse, render } from "../src/A2ML.res.mjs"; +import { parseInlines } from "../src/A2ML_Parser.res.mjs"; + +// --------------------------------------------------------------------------- +// Fixtures — pre-built inputs to avoid allocation inside bench loops +// --------------------------------------------------------------------------- + +/** A minimal single-heading document. */ +const SMALL_DOC = "# Hello World\n\nA simple paragraph.\n"; + +/** A medium document with headings, paragraphs, list, and a directive. */ +const MEDIUM_DOC = `# Main Title + +Introduction paragraph with **bold** and *italic* text. + +## Section One + +First section paragraph. This one is longer and contains more words. + +- Bullet item alpha +- Bullet item beta with \`inline code\` +- Bullet item gamma with [a link](https://example.com) + +## Section Two + +@version: 1.2.3 + +Second section with a thematic break below. + +--- + +Footer paragraph. +`; + +/** A large document with 50 headings and paragraphs. */ +const LARGE_DOC = (() => { + const lines = ["# Large Document\n"]; + for (let i = 1; i <= 50; i++) { + lines.push(`\n## Section ${i}\n`); + lines.push(`\nThis is paragraph number ${i} with **bold** and *italic* and \`code\`.\n`); + lines.push(`\n- Item A in section ${i}\n- Item B in section ${i}\n`); + } + return lines.join(""); +})(); + +/** A document with many inline elements. */ +const INLINE_HEAVY_DOC = `# Inline Elements Test + +${"**bold** and *italic* and `code` and [link](https://example.com) and @ref(ref1). ".repeat(20)} +`; + +/** A document with many directives. */ +const DIRECTIVE_HEAVY_DOC = (() => { + const lines = ["# Directive Document\n"]; + for (let i = 1; i <= 20; i++) { + lines.push(`@custom-directive-${i}: value-${i}\n`); + } + return lines.join(""); +})(); + +// --------------------------------------------------------------------------- +// Benchmarks +// --------------------------------------------------------------------------- + +Deno.bench("parse: small document (single heading + paragraph)", () => { + parse(SMALL_DOC); +}); + +Deno.bench("parse: medium document (multi-section with list and directive)", () => { + parse(MEDIUM_DOC); +}); + +Deno.bench("parse: large document (50 sections, paragraphs, lists)", () => { + parse(LARGE_DOC); +}); + +Deno.bench("parse: inline-heavy document (20x repeated inline markup)", () => { + parse(INLINE_HEAVY_DOC); +}); + +Deno.bench("parse: directive-heavy document (20 directives)", () => { + parse(DIRECTIVE_HEAVY_DOC); +}); + +Deno.bench("parseInlines: empty string", () => { + parseInlines(""); +}); + +Deno.bench("parseInlines: plain text only", () => { + parseInlines("Plain text with no markup characters at all"); +}); + +Deno.bench("parseInlines: mixed inline markup", () => { + parseInlines("**bold** and *italic* and `code` and [link](https://example.com) and @ref(id)"); +}); + +Deno.bench("render: medium document", { + fn: () => { + const parsed = parse(MEDIUM_DOC); + if (parsed.TAG === "Ok") { + render(parsed._0); + } + }, +}); + +Deno.bench("roundtrip: parse + render + re-parse (medium document)", () => { + const first = parse(MEDIUM_DOC); + if (first.TAG === "Ok") { + const rendered = render(first._0); + parse(rendered); + } +}); diff --git a/deno/tests/e2e_test.mjs b/deno/tests/e2e_test.mjs new file mode 100644 index 0000000..264eac6 --- /dev/null +++ b/deno/tests/e2e_test.mjs @@ -0,0 +1,106 @@ +// SPDX-License-Identifier: MPL-2.0 +// +// tests/e2e_test.mjs — End-to-end roundtrip tests for a2ml-deno. +// +// Tests the full parse → render → re-parse pipeline to verify that +// the parser and renderer are inverse operations and preserve document +// structure across a complete roundtrip. + +import { parse, render } from "../src/A2ML.res.mjs"; +import { assertEquals, assert } from "jsr:@std/assert"; + +// --------------------------------------------------------------------------- +// Helper: parse-render-reparse roundtrip assertion +// --------------------------------------------------------------------------- + +/** + * Asserts that parsing a document, rendering it, and re-parsing the result + * produces a document with the same number of blocks. + * + * @param {string} input - Raw A2ML text to test + * @param {string} label - Test description + */ +function assertRoundtrip(input, label) { + const parsed = parse(input); + assert(parsed.TAG === "Ok", `${label}: initial parse must succeed`); + const rendered = render(parsed._0); + const reparsed = parse(rendered); + assert(reparsed.TAG === "Ok", `${label}: re-parse of rendered output must succeed`); + assertEquals( + reparsed._0.blocks.length, + parsed._0.blocks.length, + `${label}: block count must match after roundtrip` + ); +} + +// --------------------------------------------------------------------------- +// Roundtrip tests +// --------------------------------------------------------------------------- + +Deno.test("e2e roundtrip: simple heading document", () => { + assertRoundtrip("# Hello World\n", "simple heading"); +}); + +Deno.test("e2e roundtrip: paragraph text", () => { + assertRoundtrip("This is a plain paragraph.\n", "plain paragraph"); +}); + +Deno.test("e2e roundtrip: document with heading and paragraph", () => { + assertRoundtrip("# Title\n\nSome body text.\n", "heading and paragraph"); +}); + +Deno.test("e2e roundtrip: bullet list", () => { + assertRoundtrip("- Item one\n- Item two\n- Item three\n", "bullet list"); +}); + +Deno.test("e2e roundtrip: code block preserved", () => { + const input = "```rust\nfn main() {}\n```\n"; + const parsed = parse(input); + assert(parsed.TAG === "Ok", "code block parse must succeed"); + const rendered = render(parsed._0); + assert(rendered.includes("fn main()"), "rendered output must contain code content"); +}); + +Deno.test("e2e roundtrip: directive block with inline body", () => { + assertRoundtrip("@version: 1.0\n", "inline directive"); +}); + +Deno.test("e2e roundtrip: thematic break", () => { + const input = "---\n"; + const parsed = parse(input); + assert(parsed.TAG === "Ok", "thematic break parse must succeed"); + const rendered = render(parsed._0); + assert(rendered.includes("---"), "rendered output must contain thematic break marker"); +}); + +Deno.test("e2e roundtrip: multi-level headings H1 through H3", () => { + const input = "# Level 1\n## Level 2\n### Level 3\n"; + assertRoundtrip(input, "multi-level headings"); +}); + +Deno.test("e2e roundtrip: bold and emphasis inline markup", () => { + const input = "Some **bold** and *italic* text.\n"; + const parsed = parse(input); + assert(parsed.TAG === "Ok", "inline markup parse must succeed"); + const rendered = render(parsed._0); + assert(rendered.includes("bold"), "rendered output must include bold text"); +}); + +Deno.test("e2e: empty input returns Error not crash", () => { + const result = parse(""); + assertEquals(result.TAG, "Error", "empty input must return Error variant"); +}); + +Deno.test("e2e: whitespace-only input returns Error", () => { + const result = parse(" \n\n "); + assertEquals(result.TAG, "Error", "whitespace-only input must return Error variant"); +}); + +Deno.test("e2e: parse produces directives array on document with directive", () => { + const input = "@version: 2.0\n"; + const parsed = parse(input); + assert(parsed.TAG === "Ok", "directive parse must succeed"); + assert(parsed._0.directives.length > 0, "directives array must be non-empty"); + assertEquals(parsed._0.directives[0].name, "version"); + assertEquals(parsed._0.directives[0].value, "2.0"); +}); diff --git a/deno/tests/fuzz/placeholder.txt b/deno/tests/fuzz/placeholder.txt new file mode 100644 index 0000000..8621280 --- /dev/null +++ b/deno/tests/fuzz/placeholder.txt @@ -0,0 +1 @@ +Scorecard requirement placeholder diff --git a/deno/tests/property_test.mjs b/deno/tests/property_test.mjs new file mode 100644 index 0000000..3018c3c --- /dev/null +++ b/deno/tests/property_test.mjs @@ -0,0 +1,167 @@ +// SPDX-License-Identifier: MPL-2.0 +// +// tests/property_test.mjs — Property-based tests for a2ml-deno. +// +// Tests invariants that must hold for all inputs in a given class, +// iterating over multiple representative inputs to cover the input space. + +import { parse, render } from "../src/A2ML.res.mjs"; +import { parseInlines } from "../src/A2ML_Parser.res.mjs"; +import { assertEquals, assert } from "jsr:@std/assert"; + +// --------------------------------------------------------------------------- +// Property: parse returns Ok or Error, never throws +// --------------------------------------------------------------------------- + +const arbitraryInputs = [ + "", + " ", + "# Title\n", + "## Subtitle\n", + "Plain paragraph text.\n", + "- item\n", + "```\ncode\n```\n", + "@directive: value\n", + "---\n", + "# H1\n## H2\n### H3\n#### H4\n##### H5\n", + "**bold** and *italic*\n", + "[link](https://example.com)\n", + "@ref(some-id)\n", + "First paragraph.\n\nSecond paragraph.\n", + "> A blockquote line\n", + "> Another quote\n> Continued\n", + "- Alpha\n- Beta\n- Gamma\n- Delta\n", + "# Title\n\n- Bullet one\n- Bullet two\n\nParagraph text.\n", + "# Doc\n\n@version: 1.0\n\n---\n\nFooter text.\n", + "`inline code` in a paragraph.\n", +]; + +Deno.test("property: parse never throws for any of the representative inputs", () => { + for (const input of arbitraryInputs) { + // Must not throw — result is either Ok or Error + const result = parse(input); + assert( + result.TAG === "Ok" || result.TAG === "Error", + `parse("${input.slice(0, 40)}") must return Ok or Error, not throw` + ); + } +}); + +Deno.test("property: rendered output of a successful parse is non-empty", () => { + const validInputs = arbitraryInputs.filter((i) => i.trim().length > 0); + for (const input of validInputs) { + const result = parse(input); + if (result.TAG === "Ok") { + const rendered = render(result._0); + assert( + rendered.length > 0, + `render() must produce non-empty output for non-empty document` + ); + } + } +}); + +Deno.test("property: parse result Ok always contains blocks array", () => { + for (const input of arbitraryInputs) { + const result = parse(input); + if (result.TAG === "Ok") { + assert( + Array.isArray(result._0.blocks), + "Ok result must always have a blocks array" + ); + assert( + Array.isArray(result._0.directives), + "Ok result must always have a directives array" + ); + assert( + Array.isArray(result._0.attestations), + "Ok result must always have an attestations array" + ); + } + } +}); + +Deno.test("property: parseInlines never throws and always returns an array", () => { + const inlineInputs = [ + "", + "plain", + "**bold**", + "*italic*", + "`code`", + "[text](url)", + "@ref(id)", + "mix of **bold** and *italic* and `code`", + "no closing bold **oops", + "no closing italic *oops", + ]; + for (const input of inlineInputs) { + const result = parseInlines(input); + assert( + Array.isArray(result), + `parseInlines("${input}") must return an array, not throw` + ); + } +}); + +Deno.test("property: re-parsing rendered output produces same block count as initial parse", () => { + const stableInputs = arbitraryInputs.filter((i) => i.trim().length > 0); + let checkedCount = 0; + for (const input of stableInputs) { + const first = parse(input); + if (first.TAG !== "Ok") continue; + const rendered = render(first._0); + const second = parse(rendered); + if (second.TAG !== "Ok") continue; + assertEquals( + second._0.blocks.length, + first._0.blocks.length, + `Block count must be stable after roundtrip for input: "${input.slice(0, 40)}"` + ); + checkedCount++; + } + assert(checkedCount >= 8, "At least 8 inputs must complete the roundtrip stability check"); +}); + +Deno.test("property: H1 heading always sets document title", () => { + const h1Inputs = [ + "# Simple Title\n", + "# Title With **Bold**\n", + "# First Title\n## Second\n", + ]; + for (const input of h1Inputs) { + const result = parse(input); + assert(result.TAG === "Ok", `H1 parse must succeed for: ${input.trim()}`); + assert( + result._0.title !== undefined, + `H1 document must have a title field set` + ); + } +}); + +Deno.test("property: documents with only directives have non-empty directives array", () => { + const directiveInputs = [ + "@version: 1.0\n", + "@author: Alice\n", + "@license: MPL-2.0\n", + ]; + for (const input of directiveInputs) { + const result = parse(input); + assert(result.TAG === "Ok", `Directive parse must succeed for: ${input.trim()}`); + assert( + result._0.directives.length > 0, + `Document with directive must have non-empty directives array` + ); + } +}); + +Deno.test("property: empty-like inputs always produce Error", () => { + const emptyInputs = ["", " ", "\n", "\t\n\t", " \n \n "]; + for (const input of emptyInputs) { + const result = parse(input); + assertEquals( + result.TAG, + "Error", + `Input "${JSON.stringify(input)}" must parse as Error (EmptyDocument)` + ); + } +}); diff --git a/deno/tests/unit_test.mjs b/deno/tests/unit_test.mjs new file mode 100644 index 0000000..dd3ccb9 --- /dev/null +++ b/deno/tests/unit_test.mjs @@ -0,0 +1,154 @@ +// SPDX-License-Identifier: MPL-2.0 +// +// tests/unit_test.mjs — Unit tests for a2ml-deno parser and renderer. +// +// Tests each parser and renderer function in isolation to verify correct +// behaviour on well-formed and edge-case inputs. + +import { parse, render, renderBlock, renderInline, emptyDocument, makeDirective, makeAttestation, parseErrorToString, trustLevelFromString, trustLevelToString } from "../src/A2ML.res.mjs"; +import { parseInlines, parseAttributes, countHashes, parseA2ML } from "../src/A2ML_Parser.res.mjs"; +import { assertEquals, assertMatch, assert } from "jsr:@std/assert"; + +// --------------------------------------------------------------------------- +// parseInlines — inline element parsing +// --------------------------------------------------------------------------- + +Deno.test("parseInlines: plain text with no markup returns single Text node", () => { + const result = parseInlines("Hello, world!"); + assertEquals(result.length, 1); + assertEquals(result[0].TAG, "Text"); + assertEquals(result[0]._0, "Hello, world!"); +}); + +Deno.test("parseInlines: **bold** produces Strong node", () => { + const result = parseInlines("**bold**"); + assertEquals(result.length, 1); + assertEquals(result[0].TAG, "Strong"); + assertEquals(result[0]._0[0]._0, "bold"); +}); + +Deno.test("parseInlines: *italic* produces Emphasis node", () => { + const result = parseInlines("*italic*"); + assertEquals(result.length, 1); + assertEquals(result[0].TAG, "Emphasis"); + assertEquals(result[0]._0[0]._0, "italic"); +}); + +Deno.test("parseInlines: `code` produces Code node", () => { + const result = parseInlines("`hello`"); + assertEquals(result.length, 1); + assertEquals(result[0].TAG, "Code"); + assertEquals(result[0]._0, "hello"); +}); + +Deno.test("parseInlines: [text](url) produces Link node with correct fields", () => { + const result = parseInlines("[click here](https://example.com)"); + assertEquals(result.length, 1); + assertEquals(result[0].TAG, "Link"); + assertEquals(result[0].url, "https://example.com"); + assertEquals(result[0].content[0]._0, "click here"); +}); + +Deno.test("parseInlines: @ref(id) produces InlineRef node", () => { + const result = parseInlines("@ref(section-1)"); + assertEquals(result.length, 1); + assertEquals(result[0].TAG, "InlineRef"); + assertEquals(result[0]._0, "section-1"); +}); + +Deno.test("parseInlines: empty string returns empty array", () => { + const result = parseInlines(""); + assertEquals(result.length, 0); +}); + +// --------------------------------------------------------------------------- +// parseAttributes — attribute string parsing +// --------------------------------------------------------------------------- + +Deno.test("parseAttributes: empty string returns empty array", () => { + const result = parseAttributes(""); + assertEquals(result.length, 0); +}); + +Deno.test("parseAttributes: single key=value pair", () => { + const result = parseAttributes("lang=en"); + assertEquals(result.length, 1); + assertEquals(result[0][0], "lang"); + assertEquals(result[0][1], "en"); +}); + +Deno.test("parseAttributes: multiple key=value pairs separated by commas", () => { + const result = parseAttributes("lang=en, version=1.0"); + assertEquals(result.length, 2); + assertEquals(result[0][0], "lang"); + assertEquals(result[1][0], "version"); +}); + +// --------------------------------------------------------------------------- +// countHashes — heading level detection +// --------------------------------------------------------------------------- + +Deno.test("countHashes: single hash gives level 1", () => { + assertEquals(countHashes("# Hello"), 1); +}); + +Deno.test("countHashes: five hashes gives level 5", () => { + assertEquals(countHashes("##### Deep"), 5); +}); + +Deno.test("countHashes: no hashes gives 0", () => { + assertEquals(countHashes("Plain text"), 0); +}); + +// --------------------------------------------------------------------------- +// trustLevelFromString / trustLevelToString +// --------------------------------------------------------------------------- + +Deno.test("trustLevelFromString: 'verified' maps to Verified", () => { + assertEquals(trustLevelFromString("verified"), "Verified"); +}); + +Deno.test("trustLevelFromString: case-insensitive 'REVIEWED' maps to Reviewed", () => { + assertEquals(trustLevelFromString("REVIEWED"), "Reviewed"); +}); + +Deno.test("trustLevelToString: Automated maps to 'automated'", () => { + assertEquals(trustLevelToString("Automated"), "automated"); +}); + +// --------------------------------------------------------------------------- +// parseErrorToString — error formatting +// --------------------------------------------------------------------------- + +Deno.test("parseErrorToString: EmptyDocument returns descriptive message", () => { + const msg = parseErrorToString("EmptyDocument"); + assertMatch(msg, /empty/i); +}); + +// --------------------------------------------------------------------------- +// makeDirective / makeAttestation / emptyDocument — factory helpers +// --------------------------------------------------------------------------- + +Deno.test("makeDirective: creates directive with correct name and value", () => { + const dir = makeDirective("version", "1.0"); + assertEquals(dir.name, "version"); + assertEquals(dir.value, "1.0"); + assertEquals(dir.attributes.length, 0); +}); + +Deno.test("makeAttestation: creates attestation with identity and role", () => { + const att = makeAttestation("alice", "author", "Verified"); + assertEquals(att.identity, "alice"); + assertEquals(att.role, "author"); + assertEquals(att.trustLevel, "Verified"); + assertEquals(att.timestamp, undefined); + assertEquals(att.note, undefined); +}); + +Deno.test("emptyDocument: returns document with no blocks or directives", () => { + const doc = emptyDocument(); + assertEquals(doc.blocks.length, 0); + assertEquals(doc.directives.length, 0); + assertEquals(doc.attestations.length, 0); + assertEquals(doc.title, undefined); +}); diff --git a/deno/verification/0.1-AI-MANIFEST.a2ml b/deno/verification/0.1-AI-MANIFEST.a2ml new file mode 100644 index 0000000..3435bdb --- /dev/null +++ b/deno/verification/0.1-AI-MANIFEST.a2ml @@ -0,0 +1,27 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "verification-pillar" +level: 1 +parent: "../0-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Primary verification pillar. Contains evidence for correctness, + performance, formal proofs, randomized testing, and aerospace-grade + high-assurance metrics (MC/DC coverage, traceability, safety cases). + +canonical_locations: + tests: "tests/" + benchmarks: "benchmarks/" + proofs: "proofs/" + fuzzing: "fuzzing/" + simulations: "simulations/" + coverage: "coverage/" + traceability: "traceability/" + safety_case: "safety_case/" + +invariants: + - "Evidence MUST be reproducible and documented" + - "High-assurance deployments MUST satisfy traceability and safety_case requirements" diff --git a/deno/verification/README.adoc b/deno/verification/README.adoc new file mode 100644 index 0000000..f07e7f3 --- /dev/null +++ b/deno/verification/README.adoc @@ -0,0 +1 @@ += Verification Pillar diff --git a/deno/verification/benchmarks/0.2-AI-MANIFEST.a2ml b/deno/verification/benchmarks/0.2-AI-MANIFEST.a2ml new file mode 100644 index 0000000..d922a4c --- /dev/null +++ b/deno/verification/benchmarks/0.2-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "benches-pillar" +level: 2 +parent: "../0.1-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Benches pillar. diff --git a/deno/verification/benchmarks/README.adoc b/deno/verification/benchmarks/README.adoc new file mode 100644 index 0000000..5db7648 --- /dev/null +++ b/deno/verification/benchmarks/README.adoc @@ -0,0 +1 @@ += Benchmarks Unit diff --git a/deno/verification/coverage/0.2-AI-MANIFEST.a2ml b/deno/verification/coverage/0.2-AI-MANIFEST.a2ml new file mode 100644 index 0000000..32b819e --- /dev/null +++ b/deno/verification/coverage/0.2-AI-MANIFEST.a2ml @@ -0,0 +1,12 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "verification-unit-coverage" +level: 2 +parent: "../0.1-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + High-assurance verification unit for coverage. + Critical for safety-of-life and aerospace-grade deployment standards. diff --git a/deno/verification/coverage/README.adoc b/deno/verification/coverage/README.adoc new file mode 100644 index 0000000..2566956 --- /dev/null +++ b/deno/verification/coverage/README.adoc @@ -0,0 +1 @@ += Coverage Unit diff --git a/deno/verification/fuzzing/0.2-AI-MANIFEST.a2ml b/deno/verification/fuzzing/0.2-AI-MANIFEST.a2ml new file mode 100644 index 0000000..5178d40 --- /dev/null +++ b/deno/verification/fuzzing/0.2-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "fuzzing-unit" +level: 2 +parent: "../0.1-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Fuzzing unit for high-rigor verification. diff --git a/deno/verification/fuzzing/README.adoc b/deno/verification/fuzzing/README.adoc new file mode 100644 index 0000000..edeb179 --- /dev/null +++ b/deno/verification/fuzzing/README.adoc @@ -0,0 +1 @@ += Fuzzing Unit diff --git a/deno/verification/proofs/0.2-AI-MANIFEST.a2ml b/deno/verification/proofs/0.2-AI-MANIFEST.a2ml new file mode 100644 index 0000000..135e181 --- /dev/null +++ b/deno/verification/proofs/0.2-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "verification-unit-proofs" +level: 2 +parent: "../0.1-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Sub-unit focusing on proofs. diff --git a/deno/verification/proofs/README.adoc b/deno/verification/proofs/README.adoc new file mode 100644 index 0000000..1ae324d --- /dev/null +++ b/deno/verification/proofs/README.adoc @@ -0,0 +1 @@ += Proofs Unit diff --git a/deno/verification/safety_case/0.2-AI-MANIFEST.a2ml b/deno/verification/safety_case/0.2-AI-MANIFEST.a2ml new file mode 100644 index 0000000..d461915 --- /dev/null +++ b/deno/verification/safety_case/0.2-AI-MANIFEST.a2ml @@ -0,0 +1,12 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "verification-unit-safety_case" +level: 2 +parent: "../0.1-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + High-assurance verification unit for safety case. + Critical for safety-of-life and aerospace-grade deployment standards. diff --git a/deno/verification/safety_case/README.adoc b/deno/verification/safety_case/README.adoc new file mode 100644 index 0000000..47c8e36 --- /dev/null +++ b/deno/verification/safety_case/README.adoc @@ -0,0 +1 @@ += Safety case Unit diff --git a/deno/verification/simulations/0.2-AI-MANIFEST.a2ml b/deno/verification/simulations/0.2-AI-MANIFEST.a2ml new file mode 100644 index 0000000..f890eca --- /dev/null +++ b/deno/verification/simulations/0.2-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "simulations-unit" +level: 2 +parent: "../0.1-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Simulations unit for high-rigor verification. diff --git a/deno/verification/simulations/README.adoc b/deno/verification/simulations/README.adoc new file mode 100644 index 0000000..8e1b13a --- /dev/null +++ b/deno/verification/simulations/README.adoc @@ -0,0 +1 @@ += Simulations Unit diff --git a/deno/verification/tests/0.2-AI-MANIFEST.a2ml b/deno/verification/tests/0.2-AI-MANIFEST.a2ml new file mode 100644 index 0000000..0008fcf --- /dev/null +++ b/deno/verification/tests/0.2-AI-MANIFEST.a2ml @@ -0,0 +1 @@ +# AI Manifest - Level 1: tests diff --git a/deno/verification/tests/README.adoc b/deno/verification/tests/README.adoc new file mode 100644 index 0000000..344bf86 --- /dev/null +++ b/deno/verification/tests/README.adoc @@ -0,0 +1 @@ += Tests Unit diff --git a/deno/verification/traceability/0.2-AI-MANIFEST.a2ml b/deno/verification/traceability/0.2-AI-MANIFEST.a2ml new file mode 100644 index 0000000..9667766 --- /dev/null +++ b/deno/verification/traceability/0.2-AI-MANIFEST.a2ml @@ -0,0 +1,12 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "verification-unit-traceability" +level: 2 +parent: "../0.1-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + High-assurance verification unit for traceability. + Critical for safety-of-life and aerospace-grade deployment standards. diff --git a/deno/verification/traceability/README.adoc b/deno/verification/traceability/README.adoc new file mode 100644 index 0000000..ff23dd7 --- /dev/null +++ b/deno/verification/traceability/README.adoc @@ -0,0 +1 @@ += Traceability Unit diff --git a/ex/.editorconfig b/ex/.editorconfig new file mode 100644 index 0000000..bcdbb4d --- /dev/null +++ b/ex/.editorconfig @@ -0,0 +1,65 @@ +# RSR-template-repo - Editor Configuration +# https://editorconfig.org + +root = true + +[*] +charset = utf-8 +end_of_line = lf +indent_size = 2 +indent_style = space +insert_final_newline = true +trim_trailing_whitespace = true + +[*.md] +trim_trailing_whitespace = false + +[*.adoc] +trim_trailing_whitespace = false + +[*.rs] +indent_size = 4 + +[*.ex] +indent_size = 2 + +[*.exs] +indent_size = 2 + +[*.zig] +indent_size = 4 + +[*.ada] +indent_size = 3 + +[*.adb] +indent_size = 3 + +[*.ads] +indent_size = 3 + +[*.hs] +indent_size = 2 + +[*.res] +indent_size = 2 + +[*.resi] +indent_size = 2 + +[*.ncl] +indent_size = 2 + +[*.rkt] +indent_size = 2 + +[*.scm] +indent_size = 2 + +[*.nix] +indent_size = 2 + +[Justfile] +indent_style = space +indent_size = 4 + diff --git a/ex/.formatter.exs b/ex/.formatter.exs new file mode 100644 index 0000000..d2cda26 --- /dev/null +++ b/ex/.formatter.exs @@ -0,0 +1,4 @@ +# Used by "mix format" +[ + inputs: ["{mix,.formatter}.exs", "{config,lib,test}/**/*.{ex,exs}"] +] diff --git a/ex/.machine_readable/ADJUST.contractile b/ex/.machine_readable/ADJUST.contractile new file mode 100644 index 0000000..7674e55 --- /dev/null +++ b/ex/.machine_readable/ADJUST.contractile @@ -0,0 +1,126 @@ +; SPDX-License-Identifier: MPL-2.0 +; ADJUST.contractile — Accessibility invariants for a2ml_ex +; "ADJUST" = Accessibility & Digital Justice for Universal Software & Technology +; +; Part of the contractile family: MUST, TRUST, DUST, INTENT, ADJUST +; This file is machine-readable. LLM/SLM agents MUST NOT violate these invariants. + +; ── Definitions ────────────────────────────────────────────────── +; +; ADJUST (noun/verb) +; The accessibility contractile. Defines how software must adapt to serve +; all users regardless of ability, device, or context. Named for the verb +; "adjust" — to make suitable, to adapt, to accommodate — which is the +; core action of accessible design. +; +; Scope: +; ADJUST governs all user-facing interfaces: GUI, TUI, CLI, web, mobile, +; documentation, error messages, and installation flows. It applies to +; both human users and assistive technologies (screen readers, switch +; devices, braille displays, voice control). +; +; Relationship to other contractiles: +; - MUST: ADJUST invariants are a subset of MUST — violating ADJUST +; is a MUST violation. ADJUST exists separately because accessibility +; rules are numerous enough to warrant their own file, and because +; LLMs frequently forget accessibility unless explicitly reminded. +; - TRUST: ADJUST does not affect trust levels. All trust tiers must +; respect ADJUST invariants equally. +; - DUST: Deprecating a feature does not exempt it from ADJUST until +; it is fully removed. Deprecated UI must remain accessible. +; - INTENT: ADJUST supports the anti-purpose "this software is NOT +; only for able-bodied users with modern hardware." +; +; Standard: WCAG 2.2 Level AA (minimum) +; https://www.w3.org/WAI/WCAG22/quickref/?levels=aaa +; +; Why a separate file: +; Experience shows LLMs and developers alike treat accessibility as an +; afterthought. By placing invariants in a contractile that is loaded +; at session start, we make it structurally impossible to forget. +; +; ── End Definitions ────────────────────────────────────────────── + +(adjust-contractile + (version "1.0.0") + (full-name "Accessibility & Digital Justice for Universal Software & Technology") + (standard "WCAG-2.2-AA") + (repo "a2ml_ex") + + (invariants + ; ── Visual ── + (adjust "colour-contrast-ratio >= 4.5:1 for normal text") + (adjust "colour-contrast-ratio >= 3:1 for large text (18pt+ or 14pt+ bold)") + (adjust "no information conveyed by colour alone") + (adjust "no flashing or strobing content (3 flashes/second max)") + (adjust "text resizable to 200% without loss of content or function") + (adjust "focus indicators visible on all interactive elements") + + ; ── Keyboard ── + (adjust "all interactive elements reachable via keyboard (Tab/Shift+Tab)") + (adjust "no keyboard traps — user can always Tab away") + (adjust "skip navigation link present on pages with repeated blocks") + (adjust "logical focus order follows visual reading order") + + ; ── Screen reader ── + (adjust "all images have meaningful alt text (or alt='' if decorative)") + (adjust "all form inputs have associated labels") + (adjust "ARIA landmarks used for page regions (main, nav, banner, etc.)") + (adjust "dynamic content updates announced via aria-live regions") + (adjust "semantic HTML used (headings, lists, tables) — not div soup") + + ; ── Interactive ── + (adjust "touch targets minimum 44x44px on mobile/touch interfaces") + (adjust "error messages identify the field and describe the error") + (adjust "error messages not conveyed by colour or position alone") + (adjust "form validation provides suggestions for correction") + + ; ── Media ── + (adjust "video has captions (closed or open)") + (adjust "audio-only content has text transcript") + (adjust "no autoplay of media with sound") + + ; ── Motion ── + (adjust "animations respect prefers-reduced-motion media query") + (adjust "no content depends on motion to convey meaning") + + ; ── CLI/TUI ── + (adjust "CLI output must not rely solely on colour (use symbols: [OK] [FAIL])") + (adjust "TUI must support high-contrast mode") + (adjust "all CLI commands support --help with plain-text output") + (adjust "error messages written in plain language, not jargon or codes alone") + + ; ── Documentation ── + (adjust "docs use clear language, short sentences, logical structure") + (adjust "code examples include comments explaining non-obvious steps") + (adjust "diagrams have text descriptions or alt text") + + ; ── Internationalisation (i18n) ── + (adjust "all user-facing strings externalisable for translation") + (adjust "no hardcoded English in error messages — use message keys") + (adjust "date/time/number formats locale-aware") + (adjust "RTL (right-to-left) layout support where applicable") + (adjust "Unicode handled correctly throughout (UTF-8 everywhere)") + ) + + (related-resources + ; LOL — super-parallel corpus crawler for 1500+ languages + ; Use for linguistic data, translation coverage, and i18n validation + (lol "standards/lol — multilingual NLP corpus, see README.adoc") + (polyglot-i18n "polyglot-i18n — i18n framework and WASM translation engine") + ) + + (enforcement + (ci "accessibility linting in quality.yml workflow") + (pr-block "PR blocked if accessibility regression detected") + (tool "axe-core or pa11y for automated checks on web UI") + (tool "CLI output inspected for colour-only signalling") + (manual "manual screen reader test before major releases") + ) + + (notes + "These are MINIMUM requirements. Exceeding them (AAA) is encouraged." + "When in doubt about an accessibility decision, ask — don't guess." + "Accessibility is not optional polish — it is a structural requirement." + ) +) diff --git a/ex/.machine_readable/INTENT.contractile b/ex/.machine_readable/INTENT.contractile new file mode 100644 index 0000000..090f378 --- /dev/null +++ b/ex/.machine_readable/INTENT.contractile @@ -0,0 +1,72 @@ +; SPDX-License-Identifier: MPL-2.0 +; INTENT.contractile — Purpose and scope for a2ml_ex +; Helps LLM/SLM agents understand what this repo IS and IS NOT. +; +; Part of the contractile family: MUST, TRUST, DUST, INTENT, ADJUST + +; ── Definitions ────────────────────────────────────────────────── +; +; INTENT (noun) +; The purpose contractile. Defines what this repository IS, what it is +; NOT (anti-purpose), and which architectural decisions are load-bearing. +; Without INTENT, LLMs drift into scope creep, reverse key decisions, +; or add features that belong in a different repo. +; +; Scope: +; INTENT governs the conceptual boundaries of the project — its reason +; for existing, its domain, and its relationship to the ecosystem. +; It does NOT specify implementation details (that's MUST and code). +; +; Relationship to other contractiles: +; - MUST: INTENT explains WHY certain MUSTs exist. If you don't +; understand a MUST, read INTENT first. +; - TRUST: The "ask-before-touching" section in INTENT maps directly +; to TRUST.trust-deny for the most sensitive areas. +; - ADJUST: INTENT's anti-purpose should include "this software is +; NOT only for users with perfect vision/hearing/mobility." +; - DUST: When INTENT changes (repo pivots), related DUST entries +; should be created for the abandoned direction. +; +; ── End Definitions ────────────────────────────────────────────── + +(intent-contractile + (version "1.0.0") + (repo "a2ml_ex") + + ; === Purpose (what this repo IS) === + (purpose + "{{ONE_PARAGRAPH_PURPOSE}}" + ) + + ; === Anti-Purpose (what this repo is NOT — prevents scope creep) === + (anti-purpose + "{{ONE_PARAGRAPH_ANTI_PURPOSE}}" + ; Examples: + ; "This is NOT a general-purpose database — it solves one specific problem." + ; "This is NOT a framework — it is a library with a focused API." + ; "This does NOT handle authentication — that is delegated to [other repo]." + ) + + ; === Key Architectural Decisions That Must Not Be Reversed === + (architectural-invariants + ; *REMINDER: List the foundational decisions* + ; ("Idris2 for ABI definitions — dependent types prove interface correctness") + ; ("Zig for FFI — zero-cost C ABI compatibility") + ; ("Elixir for supervision — OTP fault tolerance") + ) + + ; === Sensitive Areas (if in doubt, ask) === + (ask-before-touching + ; *REMINDER: List areas where LLMs should check before modifying* + ; "src/abi/ — formal proofs, changes require re-verification" + ; "ffi/zig/ — C ABI boundary, changes affect all language bindings" + ; ".machine_readable/ — checkpoint files, format is specified" + ) + + ; === Ecosystem Position === + (ecosystem + (belongs-to "{{MONOREPO_OR_STANDALONE}}") + (depends-on ("{{DEP1}}" "{{DEP2}}")) + (depended-on-by ("{{CONSUMER1}}" "{{CONSUMER2}}")) + ) +) diff --git a/ex/.machine_readable/MUST.contractile b/ex/.machine_readable/MUST.contractile new file mode 100644 index 0000000..b2f758f --- /dev/null +++ b/ex/.machine_readable/MUST.contractile @@ -0,0 +1,91 @@ +; SPDX-License-Identifier: MPL-2.0 +; MUST.contractile — Baseline invariants for a2ml_ex +; These constraints MUST NOT be violated. K9 validators enforce them. +; +; Part of the contractile family: MUST, TRUST, DUST, INTENT, ADJUST + +; ── Definitions ────────────────────────────────────────────────── +; +; MUST (noun/verb) +; The hard-constraint contractile. Defines invariants that are structurally +; required for the repository to function correctly and safely. Violating +; a MUST is always a bug — there are no "soft" MUSTs. +; +; Scope: +; MUST governs code, configuration, CI, and structure. It does NOT govern +; style, preference, or approach — those belong in CLAUDE.md or coding +; standards. MUST is for things that break the project if violated. +; +; Relationship to other contractiles: +; - TRUST: MUST is enforced regardless of trust level. Even maximal-trust +; agents cannot violate MUST constraints. +; - ADJUST: All ADJUST invariants are implicitly MUST invariants too. +; ADJUST exists separately for visibility. +; - INTENT: MUST protects the architectural decisions described in INTENT. +; - DUST: When a feature enters DUST (deprecation), its MUST constraints +; remain active until the feature is fully removed. +; +; Enforcement: +; K9 validators in contractiles/k9/ machine-check MUST constraints. +; CI runs these on every PR. Violations block merge. +; +; ── End Definitions ────────────────────────────────────────────── + +(must-contractile + (version "1.0.0") + (repo "a2ml_ex") + + ; === Universal Invariants (apply to ALL repos) === + + (invariants + ; Paths + (must "no hardcoded absolute paths (/home/*, /mnt/*, /var/mnt/*)") + (must "all paths use env vars, XDG dirs, or relative references") + + ; Language policy + (must "no new TypeScript files") + (must "no new Python files") + (must "no new Go files") + (must "no npm/bun/yarn/pnpm dependencies — Deno only") + + ; Dangerous patterns + (must "no believe_me (Idris2)") + (must "no assert_total (Idris2)") + (must "no Admitted (Coq)") + (must "no sorry (Lean)") + (must "no unsafeCoerce (Haskell)") + (must "no Obj.magic (OCaml)") + (must "no unsafe {} blocks without safety comment (Rust)") + + ; License + (must "SPDX-License-Identifier header on every source file") + (must "no removal or modification of LICENSE file") + + ; Structure + (must ".machine_readable/ directory preserved") + (must "0-AI-MANIFEST.a2ml preserved") + (must "no SCM files in repo root — only in .machine_readable/") + + ; CI + (must "no removal of CI workflows without explicit approval") + (must "all GitHub Actions SHA-pinned") + + ; Code quality + (must "tests must not be deleted or weakened") + (must "generated code in generated/ directory only") + (must "no introduction of OWASP top 10 vulnerabilities") + + ; ABI/FFI (if applicable) + (must "no modification of ABI contracts without proof update") + (must "no removal of formal verification proofs") + ) + + ; === Project-Specific Invariants === + ; *REMINDER: Add invariants specific to this repo* + ; (must "# Add project-specific invariants here") + + (enforcement + (k9-validator "contractiles/k9/must-check.k9.ncl") + (ci "quality.yml runs must-check on every PR") + ) +) diff --git a/ex/.machine_readable/TRUST.contractile b/ex/.machine_readable/TRUST.contractile new file mode 100644 index 0000000..de3981c --- /dev/null +++ b/ex/.machine_readable/TRUST.contractile @@ -0,0 +1,80 @@ +; SPDX-License-Identifier: MPL-2.0 +; TRUST.contractile — Trust boundaries for a2ml_ex +; Defines what LLM/SLM agents are trusted to do without asking. +; +; Part of the contractile family: MUST, TRUST, DUST, INTENT, ADJUST + +; ── Definitions ────────────────────────────────────────────────── +; +; TRUST (noun/verb) +; The permission contractile. Defines the boundary between what an AI +; agent may do autonomously and what requires human approval. Trust is +; graduated — not binary — with four levels from minimal to maximal. +; +; Trust levels: +; - maximal: Agent may read, build, test, lint, format, heal freely. +; Only destructive/external actions require approval. +; - standard: Agent may read and build. Test/lint need approval. +; - restricted: Agent may read only. All modifications need approval. +; - minimal: Agent may read specific files only. Everything else blocked. +; +; Scope: +; TRUST governs AI agent behaviour only. It does not affect human +; contributors — humans follow CONTRIBUTING.md and GOVERNANCE.adoc. +; +; Relationship to other contractiles: +; - MUST: Trust never overrides MUST. Even at maximal trust, MUST +; violations are blocked. +; - ADJUST: Trust does not exempt from ADJUST. All trust tiers must +; produce accessible output. +; - INTENT: TRUST.trust-deny protects the sensitive areas listed in +; INTENT.ask-before-touching. +; - DUST: Deprecated features have the same trust rules as active ones. +; +; ── End Definitions ────────────────────────────────────────────── + +(trust-contractile + (version "1.0.0") + (repo "a2ml_ex") + + (trust-level "maximal") ; maximal | standard | restricted | minimal + + ; === Maximal Trust (default) === + ; LLM may freely do these without asking: + (trust-actions + "read" ; Read any file in the repo + "build" ; Run build commands + "test" ; Run test suites + "lint" ; Run linters and formatters + "format" ; Auto-format code + "doctor" ; Run self-diagnostics + "heal" ; Attempt automatic repair + "git-status" ; Check git status + "git-diff" ; View diffs + "git-log" ; View history + ) + + ; === Denied Actions (always require human approval) === + (trust-deny + "delete-branch" ; Could lose work + "force-push" ; Overwrites history + "modify-ci-secrets" ; Security sensitive + "publish" ; External visibility + "push-to-main" ; Protected branch + "delete-files-bulk" ; More than 5 files at once + "modify-license" ; Legal implications + "modify-security-policy" ; Security implications + "remove-proofs" ; Formal verification regression + "disable-ci-checks" ; Safety regression + ) + + ; === Trust Boundary === + (trust-boundary "repo") ; LLM confined to this repo unless explicitly told otherwise + + ; === Override === + ; Repos requiring tighter trust override these settings with justification: + ; (override + ; (trust-level "restricted") + ; (reason "Contains production secrets / handles PII / etc.") + ; ) +) diff --git a/ex/.machine_readable/agent_instructions/README.adoc b/ex/.machine_readable/agent_instructions/README.adoc new file mode 100644 index 0000000..1cc7487 --- /dev/null +++ b/ex/.machine_readable/agent_instructions/README.adoc @@ -0,0 +1,41 @@ +// SPDX-License-Identifier: CC-BY-SA-4.0 +// Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) += Agent Instructions +:toc: preamble + +Methodology-aware configuration for AI agents. Read by any AI agent +(Claude, Gemini, Copilot, etc.) at session start. + +== Files + +[cols="1,3"] +|=== +| File | Purpose + +| `methodology.a2ml` +| Default mode, invariants, ring ceiling, priority weights, convergent budget + +| `coverage.a2ml` +| Session coverage tracking — what was visited, what was skipped, what has MUSTs + +| `debt.a2ml` +| Meander debt — things found but not fixed, carried between sessions +|=== + +== How Agents Use These + +1. Read `methodology.a2ml` at session start — know mode, invariants, ceiling +2. Read `coverage.a2ml` — know what was visited last time, what was skipped +3. Read `debt.a2ml` — know what's outstanding from previous sessions +4. At session end, update `coverage.a2ml` and `debt.a2ml` + +== Relationship to Other Files + +* `AGENTIC.a2ml` says WHAT agents can do (permissions, gating) +* `agent_instructions/` says HOW agents should work (methodology) +* `bot_directives/` says what the gitbot-fleet does (fleet-specific) +* `CLAUDE.md` says how Claude specifically should work (Claude-specific) + +== Reference + +ADR-002 in `standards/agentic-a2ml/docs/ADR-002-methodology-layer.adoc` diff --git a/ex/.machine_readable/agent_instructions/coverage.a2ml b/ex/.machine_readable/agent_instructions/coverage.a2ml new file mode 100644 index 0000000..6979664 --- /dev/null +++ b/ex/.machine_readable/agent_instructions/coverage.a2ml @@ -0,0 +1,61 @@ +# SPDX-License-Identifier: MPL-2.0 +# Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) +# +# coverage.a2ml — Session coverage tracking +# Updated at the end of each AI agent session. +# Persists what was visited, what was skipped, and what has MUSTs. +# +# Reference: ADR-002 in standards/agentic-a2ml/docs/ + +[metadata] +version = "1.0.0" +last-updated = "2026-03-24" + +# ============================================================================ +# COVERAGE STATE +# ============================================================================ +# Updated by agents at session end. Tracks which components have been +# visited and which have known MUSTs that were skipped. + +[coverage] +total-components = 0 +visited-components = 0 +coverage-percent = 0 + +# ============================================================================ +# VISITED COMPONENTS +# ============================================================================ +# Component → session date + ring reached +# Agents add entries as they work through components. +# +# Example: +# [coverage.visited.emergency-room] +# date = "2026-03-23" +# ring = 2 +# fixes = 3 +# notes = "boot-guardian built, shutdown-marshal built" + +# ============================================================================ +# SKIPPED COMPONENTS WITH MUSTS +# ============================================================================ +# Components with known MUSTs that were not visited in the most recent session. +# These become P1 inputs for the next session's Phase 0. +# +# Example: +# [coverage.skipped-musts.session-sentinel] +# priority = "P0" +# issue = "56 SIGABRTs in 4 days, D-Bus race condition" +# discovered = "2026-03-23" + +# ============================================================================ +# CHERRY-PICKING AUDIT +# ============================================================================ +# At session end, agents report whether they chose easy work over hard work. +# This is the accountability mechanism for the weighted priority system. +# +# [coverage.cherry-picking] +# easy-high-completed = 3 +# hard-high-completed = 1 +# easy-low-completed = 2 +# hard-low-deferred = 4 +# assessment = "Correctly prioritised — all MUST items addressed before COULDs" diff --git a/ex/.machine_readable/agent_instructions/debt.a2ml b/ex/.machine_readable/agent_instructions/debt.a2ml new file mode 100644 index 0000000..c0238c5 --- /dev/null +++ b/ex/.machine_readable/agent_instructions/debt.a2ml @@ -0,0 +1,49 @@ +# SPDX-License-Identifier: MPL-2.0 +# Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) +# +# debt.a2ml — Meander debt list +# Things found but not fixed. Carried between sessions. +# Becomes the next session's Phase 0 input. +# +# Reference: ADR-002 in standards/agentic-a2ml/docs/ + +[metadata] +version = "1.0.0" +last-updated = "2026-03-24" + +# ============================================================================ +# DEBT ITEMS +# ============================================================================ +# Each item has: component, issue, effort (easy|medium|hard), impact (high|medium|low), +# priority (should|could), and discovered date. +# +# Items are consumed (removed) when fixed. New items are added at session end. +# The debt list prevents the "one more wave" loop — found things are persisted, +# not forgotten, and not used as justification for infinite meandering. + +# ============================================================================ +# SHOULD — would fix next wave +# ============================================================================ +# These are inputs for the next session if the user says "keep going". +# +# Example: +# [[debt.should]] +# component = "system-tools/monitoring/observatory" +# issue = "Stale duplicate of root observatory/" +# effort = "easy" +# impact = "medium" +# discovered = "2026-03-23" + +# ============================================================================ +# COULD — would fix eventually +# ============================================================================ +# These are low-priority items that don't justify a session on their own. +# They get picked up when an agent is in the area for other reasons. +# +# Example: +# [[debt.could]] +# component = "cicada" +# issue = "RSR_OUTLINE.adoc references banned AGPL-3.0" +# effort = "easy" +# impact = "low" +# discovered = "2026-03-23" diff --git a/ex/.machine_readable/agent_instructions/methodology.a2ml b/ex/.machine_readable/agent_instructions/methodology.a2ml new file mode 100644 index 0000000..754f357 --- /dev/null +++ b/ex/.machine_readable/agent_instructions/methodology.a2ml @@ -0,0 +1,107 @@ +# SPDX-License-Identifier: MPL-2.0 +# Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) +# +# methodology.a2ml — AI agent methodology configuration +# Declares how agents should approach work in this repository. +# Read at session start by any AI agent (Claude, Gemini, Copilot, etc.) +# +# Reference: ADR-002 in standards/agentic-a2ml/docs/ + +[metadata] +version = "1.0.0" +last-updated = "2026-03-24" +spec = "https://github.com/hyperpolymath/standards/blob/main/agentic-a2ml/docs/ADR-002-methodology-layer.adoc" + +# ============================================================================ +# MODE SELECTION +# ============================================================================ +# convergent: find gaps, fill them, build infrastructure (default for ops/infra) +# divergent: find what's strongest, push it further (for research/creative) +# hybrid: audit 20% of budget, then focus 80% on top MUSTs (default for most) + +[methodology] +default-mode = "hybrid" +ring-ceiling = 2 # Hard ceiling for ring expansion (0-3) +wave-cap = 2 # Max waves before requiring user "keep going" +spike-required = true # Every session must ship code, not just designs + +# ============================================================================ +# PRIORITY WEIGHTS +# ============================================================================ +# MUST (3x): Blocking the current work → fix immediately +# SHOULD (2x): Degrading quality of current work → fix if in zone +# COULD (1x): Improving quality of adjacent work → add to debt list + +[methodology.priority-weights] +must = 3 +should = 2 +could = 1 + +# ============================================================================ +# CONVERGENT BUDGET (when mode = convergent or hybrid) +# ============================================================================ +# How to allocate effort across work types. +# Prevents over-polishing docs while structural work waits. + +[methodology.convergent-budget] +structural = 70 # % for new modules, compilation fixes, wiring, integration +corrective = 20 # % for bugs found, broken imports, stale references +perfective = 10 # % for SPDX headers, doc updates, formatting, style + +# ============================================================================ +# UNIQUE STRENGTH (when mode = divergent) +# ============================================================================ +# What makes this project special. Agents should DEEPEN this, not broaden it. +# Customise this per project — the template default is generic. + +[methodology.unique-strength] +description = "{{PROJECT_UNIQUE_STRENGTH}}" +deepen-not-broaden = true + +# ============================================================================ +# DIVERGENT INVARIANTS +# ============================================================================ +# Constraints that divergent mode must NOT violate. +# These are the riverbanks — diverge within them, not across. +# "Amplify uniqueness" means deepen, not broaden. +# +# Test before any divergent action: +# "Does this deepen the existing strength, or add a parallel strength?" +# If parallel → stop. Note as cross-project insight. + +[methodology.divergent-invariants] +rules = [ + # Customise per project. Examples: + # "Idris2 only for formal verification — no Lean4, Coq, Agda", + # "believe_me count must remain zero", + # "FFI architecture: Idris2 → RefC → Zig → C ABI (no shortcuts)", +] + +# Optional: language invariant for the core strength +# If set, divergent mode will not introduce other languages for this purpose +# language-invariant = "idris2" + +# ============================================================================ +# CONSTRAINT HINTS +# ============================================================================ +# Help Phase 0 find the critical chain faster. +# Updated at session end with newly discovered constraints. + +[methodology.known-constraints] +constraints = [ + # Customise per project. Examples: + # "End-to-end build has never been verified", + # "libproject.so does not exist yet — all bindings call stubs", +] + +# ============================================================================ +# STATE FILE VALIDATION +# ============================================================================ +# Phase 0 reads STATE.a2ml first but it may be broken. +# These rules detect corrupt/template/stale state files. + +[methodology.state-validation] +reject-if-contains = ["{{PLACEHOLDER}}", "{{PROJECT}}", "rsr-template-repo"] +reject-if-project-name-mismatch = true +staleness-threshold-days = 90 +fallback-files = ["TODO.md", "TODO.adoc", "ROADMAP.adoc", "README.adoc"] diff --git a/ex/.machine_readable/anchors/ANCHOR.a2ml b/ex/.machine_readable/anchors/ANCHOR.a2ml new file mode 100644 index 0000000..7515b81 --- /dev/null +++ b/ex/.machine_readable/anchors/ANCHOR.a2ml @@ -0,0 +1,18 @@ +# ⚓ ANCHOR: a2ml_ex +# This is the canonical authority for the a2ml_ex repository. + +id: "org.hyperpolymath.a2ml_ex" +version: "1.0.0" +clade: "unknown" +status: "active" + +# SSG Configuration (Unified boj-server build) +ssg: + engine: "casket" + output_dir: "public" + boj_trigger: true + cartridge: "ssg-mcp" + +# Relationships +parents: + - "org.hyperpolymath.boj-server" diff --git a/ex/.machine_readable/contractiles/bust/Bustfile.a2ml b/ex/.machine_readable/contractiles/bust/Bustfile.a2ml new file mode 100644 index 0000000..651602b --- /dev/null +++ b/ex/.machine_readable/contractiles/bust/Bustfile.a2ml @@ -0,0 +1,28 @@ +// Bustfile.a2ml — meta-repo bust contractile (breakage / rollback) +// SPDX-License-Identifier: MPL-2.0 + +Bust { + name: "a2ml_ex" + version: "1.0.0" + description: "Rollback procedures when something breaks in the meta-repo" + + scenarios: { + "bad-pointer-bump": "git revert in meta-repo; child repo itself untouched" + "submodule-pointer-points-at-missing-sha": "git submodule update --init --checkout resets child to parent-recorded SHA; OR revert the stale bump commit" + "submodule-orphan-after-local-only-commit": "roll back locally with git reset to before the stranded commit; fix remote situation before re-attempting" + "accidental-private-repo-content-leaked-to-public-submodule": "hard-rotate the leaked secret immediately; git-filter-repo or BFG on the submodule's own history; public re-publication only after rotation complete" + } + + escalation-ladder: [ + "1. revert the meta-repo commit (reversible, low blast radius)", + "2. reset the local submodule clone (affects only local workspace)", + "3. force-push to main — PROHIBITED without explicit user confirmation (violates branch protection)", + "4. registry-level (delete/archive the GitHub repo) — human-only action, never by AI" + ] + + backup-points: [ + "GitHub serves as the durable backup for every submodule's own history", + "Meta-repo history on origin/main is the durable backup for pointer state", + "Local backup tags (backup/pre--) retained on risky rewrites" + ] +} diff --git a/ex/.machine_readable/contractiles/bust/bust.ncl b/ex/.machine_readable/contractiles/bust/bust.ncl new file mode 100644 index 0000000..fc8cb8c --- /dev/null +++ b/ex/.machine_readable/contractiles/bust/bust.ncl @@ -0,0 +1,66 @@ +# SPDX-License-Identifier: MPL-2.0 +# Bust — error-handling / failure-recovery runner +# +# Pairs with: Bustfile.a2ml (same directory) +# Verb: bust +# Semantics: every declared failure mode must have a recovery path that has +# been exercised. Runner injects failures (via declared probes) +# and verifies the recovery path works. Hard gate on any +# failure-mode with missing or broken recovery. +# CLI: `contractile bust check` → list failure modes + recovery status +# `contractile bust drill` → inject declared failures, verify recovery +# +# Anything else in this directory is human-only notes/archive; machines ignore. +# +# Base: ../_base.ncl provides pedigree_schema, run_defaults, probe_schema. +# See: docs/CONTRACTILE-SPEC.adoc + +let base = import "../_base.ncl" in + +{ + pedigree = base.pedigree_schema & { + contractile_verb = "bust", + semantics = "error handling + failure recovery", + security = { + leash = 'Kennel, + trust_level = "controlled failure injection; scoped to system-under-test", + allow_network = false, + allow_filesystem_write = true, # drills may write transient state (tmp dirs, test DBs) + allow_subprocess = true, + injection_scope = "system-under-test-only", + }, + metadata = { + name = "bust-runner", + version = "1.0.0", + description = "Exercises declared failure modes and verifies recovery paths. Hard-gates on any failure mode without working recovery.", + paired_xfile = "Bustfile.a2ml", + author = "Jonathan D.A. Jewell ", + }, + }, + + schema = { + failure_modes + | Array { + id | String, + description | String, + class | [| 'network, 'disk_full, 'oom, 'timeout, 'partial_write, 'panic, 'crash, 'rollback, 'concurrency |], + # TODO: migrate to base.probe_schema (structured probe) when CLI supports it + injection_probe | String, # command that deterministically causes this failure + # TODO: migrate to base.probe_schema (structured probe) when CLI supports it + recovery_probe | String, # command that verifies recovery (exit 0 = recovered) + expected_recovery_time_seconds | Number | default = 30, + # status_core values: 'declared, 'verified, 'failing; bust adds 'drilled + status | [| 'declared, 'drilled, 'verified, 'failing |] | default = 'declared, + notes | String | optional, + }, + }, + + # Runner behaviour — inherits from base.run_defaults. + # bust adds record_recovery_times for performance tier feeding. + run = base.run_defaults & { + on_any_fail = "exit-nonzero", # missing or broken recovery blocks merge + report_format = "a2ml", + emit_summary = true, + record_recovery_times = true, # feeds the performance tier + }, +} diff --git a/ex/.machine_readable/contractiles/dust/Dustfile.a2ml b/ex/.machine_readable/contractiles/dust/Dustfile.a2ml new file mode 100644 index 0000000..0d619ee --- /dev/null +++ b/ex/.machine_readable/contractiles/dust/Dustfile.a2ml @@ -0,0 +1,22 @@ +# SPDX-License-Identifier: MPL-2.0 +# Dustfile — Cleanup and Hygiene Contract + +[dustfile] +version = "1.0.0" +format = "a2ml" + +[cleanup] +stale-branch-policy = "delete-after-merge" +artifact-retention = "90-days" +cache-policy = "clear-on-release" + +[hygiene] +linting = "required" +formatting = "required" +dead-code-removal = "encouraged" +todo-tracking = "tracked-in-issues" + +[reversibility] +backup-before-destructive = true +rollback-mechanism = "git-revert" +data-retention-policy = "preserve-30-days" diff --git a/ex/.machine_readable/contractiles/trust/Trustfile.a2ml b/ex/.machine_readable/contractiles/trust/Trustfile.a2ml new file mode 100644 index 0000000..0c95e15 --- /dev/null +++ b/ex/.machine_readable/contractiles/trust/Trustfile.a2ml @@ -0,0 +1,22 @@ +# SPDX-License-Identifier: MPL-2.0 +# Trustfile — Integrity and Provenance Contract + +[trustfile] +version = "1.0.0" +format = "a2ml" + +[provenance] +source-control = "git" +forge = "github" +ci-verified = true +signing-policy = "commit-signing-preferred" + +[integrity] +spdx-compliant = true +license-audit = "required" +dependency-pinning = "sha-pinned" + +[verification] +reproducible-builds = "goal" +sbom-generation = "required" +attestation = "sigstore-preferred" diff --git a/ex/.machine_readable/integrations/feedback-o-tron.a2ml b/ex/.machine_readable/integrations/feedback-o-tron.a2ml new file mode 100644 index 0000000..5381604 --- /dev/null +++ b/ex/.machine_readable/integrations/feedback-o-tron.a2ml @@ -0,0 +1,13 @@ +# SPDX-License-Identifier: MPL-2.0 +# Feedback-o-Tron Integration — Autonomous Bug Reporting + +[integration] +name = "feedback-o-tron" +type = "bug-reporter" +repository = "https://github.com/hyperpolymath/feedback-o-tron" + +[reporting-config] +platforms = ["github", "gitlab", "bugzilla"] +deduplication = true +audit-logging = true +auto-file-upstream = "on-external-dependency-failure" diff --git a/ex/.machine_readable/integrations/proven.a2ml b/ex/.machine_readable/integrations/proven.a2ml new file mode 100644 index 0000000..9af33ff --- /dev/null +++ b/ex/.machine_readable/integrations/proven.a2ml @@ -0,0 +1,18 @@ +# SPDX-License-Identifier: MPL-2.0 +# Proven Integration — Formally Verified Safety Library + +[integration] +name = "proven" +type = "safety-library" +repository = "https://github.com/hyperpolymath/proven" +version = "1.2.0" + +[binding-policy] +approach = "thin-ffi-wrapper" +unsafe-patterns = "replace-with-proven-equivalent" +modules-available = ["SafeMath", "SafeString", "SafeJSON", "SafeURL", "SafeRegex", "SafeSQL", "SafeFile", "SafeTemplate", "SafeCrypto"] + +[adoption-guidance] +priority = "high" +scope = "all-string-json-url-crypto-operations" +migration = "incremental — replace unsafe patterns as encountered" diff --git a/ex/.machine_readable/integrations/verisimdb.a2ml b/ex/.machine_readable/integrations/verisimdb.a2ml new file mode 100644 index 0000000..164c522 --- /dev/null +++ b/ex/.machine_readable/integrations/verisimdb.a2ml @@ -0,0 +1,15 @@ +# SPDX-License-Identifier: MPL-2.0 +# VeriSimDB Feed — Cross-Repo Analytics Data Store + +[integration] +name = "verisimdb" +type = "data-feed" +repository = "https://github.com/hyperpolymath/nextgen-databases" +data-store = "verisimdb-data" + +[feed-config] +emit-scan-results = true +emit-build-metrics = true +emit-dependency-graph = true +format = "hexad" +destination = "verisimdb-data/feeds/" diff --git a/ex/.machine_readable/integrations/vexometer.a2ml b/ex/.machine_readable/integrations/vexometer.a2ml new file mode 100644 index 0000000..238b3d2 --- /dev/null +++ b/ex/.machine_readable/integrations/vexometer.a2ml @@ -0,0 +1,18 @@ +# SPDX-License-Identifier: MPL-2.0 +# Vexometer Integration — Irritation Surface Analysis + +[integration] +name = "vexometer" +type = "friction-measurement" +repository = "https://github.com/hyperpolymath/vexometer" + +[measurement-config] +dimensions = 10 +emit-isa-reports = true +lazy-eliminator = true +satellite-interventions = true + +[hooks] +cli-tools = "measure-on-error" +ui-panels = "measure-on-interaction" +build-failures = "measure-on-failure" diff --git a/ex/.tool-versions b/ex/.tool-versions new file mode 100644 index 0000000..2f7c62e --- /dev/null +++ b/ex/.tool-versions @@ -0,0 +1 @@ +elixir 1.19.5-otp-28 diff --git a/ex/.well-known/ai.txt b/ex/.well-known/ai.txt new file mode 100644 index 0000000..94dd799 --- /dev/null +++ b/ex/.well-known/ai.txt @@ -0,0 +1,18 @@ +# SPDX-License-Identifier: MPL-2.0 +# ai.txt - AI interaction policy +# See: https://site.spawning.ai/spawning-ai-txt + +User-Agent: * +Disallow-Training: yes +Disallow-Summarization: no +Disallow-Generation: yes + +# This project's code is licensed under MPL-2.0. +# AI agents may read and analyze this code for assisting contributors. +# AI agents must NOT use this code for model training without explicit consent. +# AI agents must preserve Emotional Lineage. +# +# For AI agent integration instructions, see: +# 0-AI-MANIFEST.a2ml (universal AI entry point) +# AI.a2ml (Claude-specific instructions) +# .machine_readable/ (structured project state) diff --git a/ex/.well-known/humans.txt b/ex/.well-known/humans.txt new file mode 100644 index 0000000..a997582 --- /dev/null +++ b/ex/.well-known/humans.txt @@ -0,0 +1,14 @@ +# SPDX-License-Identifier: MPL-2.0 +# humanstxt.org + +/* TEAM */ +Maintainer: Jonathan D.A. Jewell (hyperpolymath) +Contact: j.d.a.jewell@open.ac.uk +From: United Kingdom + +/* SITE */ +Last update: 2026-03-28 +Standards: RSR (Rhodium Standard Repository) +License: MPL-2.0 +Components: Idris2 ABI, Zig FFI +Tools: just, Podman, Guix diff --git a/ex/.well-known/security.txt b/ex/.well-known/security.txt new file mode 100644 index 0000000..11a6a89 --- /dev/null +++ b/ex/.well-known/security.txt @@ -0,0 +1,9 @@ +# SPDX-License-Identifier: MPL-2.0 +# RFC 9116 - security.txt +# https://securitytxt.org/ + +Contact: mailto:j.d.a.jewell@open.ac.uk +Expires: 2027-12-31T23:59:59.000Z +Preferred-Languages: en +Canonical: https://github.com/hyperpolymath/a2ml_ex/.well-known/security.txt +Policy: https://github.com/hyperpolymath/a2ml_ex/blob/main/SECURITY.md diff --git a/ex/0-AI-MANIFEST.a2ml b/ex/0-AI-MANIFEST.a2ml new file mode 100644 index 0000000..64e26d7 --- /dev/null +++ b/ex/0-AI-MANIFEST.a2ml @@ -0,0 +1,26 @@ +# SPDX-License-Identifier: MPL-2.0 +# 0-AI-MANIFEST.a2ml — Universal AI Agent Entry Point + +[manifest] +version = "0.2" +format = "a2ml" + +[canonical-locations] +machine-readable = ".machine_readable/" +state = ".machine_readable/6a2/STATE.a2ml" +meta = ".machine_readable/6a2/META.a2ml" +ecosystem = ".machine_readable/6a2/ECOSYSTEM.a2ml" +contractiles = ".machine_readable/contractiles/" +bot-directives = ".machine_readable/bot_directives/" + +[invariants] +scm-files-location = ".machine_readable/ ONLY — never root" +container-file = "Containerfile — never Dockerfile" +package-manager = "Deno preferred — never npm" +license = "MPL-2.0" + +[session-startup] +step-1 = "Read this manifest" +step-2 = "Read STATE.a2ml for current project state" +step-3 = "Read META.a2ml for architecture decisions" +step-4 = "Read ECOSYSTEM.a2ml for ecosystem position" diff --git a/ex/ARCHITECTURE.md b/ex/ARCHITECTURE.md new file mode 100644 index 0000000..607e3d8 --- /dev/null +++ b/ex/ARCHITECTURE.md @@ -0,0 +1,47 @@ +# Architecture + +## Overview + +This repository follows a modular, maintainable architecture designed for clarity, scalability, and long-term sustainability. + +## Directory Structure + +``` +. +├── src/ # Source code +├── tests/ # Test suites +├── docs/ # Documentation +├── scripts/ # Utility scripts +├── config/ # Configuration files +├── LICENSE # License file +├── LICENSES/ # Full license texts +└── README.adoc # Project documentation +``` + +## Design Principles + +- **Separation of Concerns**: Each module has a single responsibility +- **Testability**: Code is written to be easily testable +- **Documentation**: All public APIs are documented +- **Configuration**: Environment-specific settings are externalized + +## Dependencies + +- External dependencies are minimized and clearly declared +- Version pinning is used for reproducibility + +## Security Considerations + +- Sensitive data is never committed to the repository +- Secrets are managed through environment variables or secure vaults +- Regular dependency audits are performed + +## Maintainability + +- Code follows consistent style guidelines +- Pull requests require review and CI checks +- Issues and discussions are tracked transparently + +--- + +*Last updated: 2026-07-18* diff --git a/ex/CHANGELOG.md b/ex/CHANGELOG.md new file mode 100644 index 0000000..7fd7ea5 --- /dev/null +++ b/ex/CHANGELOG.md @@ -0,0 +1,52 @@ + + +# Changelog + +All notable changes to `a2ml_ex` will be documented in this file. + +This file is generated from conventional commits by the +[`changelog-reusable.yml`](https://github.com/hyperpolymath/standards/blob/main/.github/workflows/changelog-reusable.yml) +workflow (`hyperpolymath/standards#206`). Adopt the workflow in this repo's CI to keep this file in sync automatically — see +[`templates/cliff.toml`](https://github.com/hyperpolymath/standards/blob/main/templates/cliff.toml) +for the canonical config. + +The format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/); +this project aims to follow [Semantic Versioning](https://semver.org/spec/v2.0.0.html). + +## [Unreleased] + +### Added + +- feat(crg): add crg-grade and crg-badge justfile recipes +- feat: add stapeln.toml container definition +- feat: add UX Justfile with doctor, tour, help-me, assail recipes +- feat: deploy UX Manifesto infrastructure + +### Fixed + +- fix(ci): sync hypatia-scan.yml to canonical (kill cd-scanner build drift) (#9) +- fix(ci): adopt canonical hypatia-scan.yml (env.HOME/scanner-layout + Comment-step gate) (#8) +- fix(scorecard): enforce granular permissions and add fuzzing placeholder + +### Documentation + +- docs: add TOPOLOGY.md +- docs: substantive CRG C annotation (EXPLAINME.adoc) +- docs: add TEST-NEEDS.md and/or PROOF-NEEDS.md from audit +- docs: add SECURITY.md and OpenSSF badge for compliance +- docs: add EXPLAINME.adoc — prove-it file backing README claims + +### CI + +- ci: deploy dogfood-gate, add Groove manifest and CRG tests + +## Pre-history + +Prior commits to this file's introduction are recorded in git history but not formally classified into Keep-a-Changelog sections. To backfill, run `git cliff -o CHANGELOG.md` locally using the canonical [`cliff.toml`](https://github.com/hyperpolymath/standards/blob/main/templates/cliff.toml) — this is one-shot mechanical work. + +--- + + diff --git a/ex/CODE_OF_CONDUCT.md b/ex/CODE_OF_CONDUCT.md new file mode 100644 index 0000000..caeda1c --- /dev/null +++ b/ex/CODE_OF_CONDUCT.md @@ -0,0 +1,27 @@ + +# Contributor Covenant Code of Conduct + +## Our Pledge + +We pledge to make participation a harassment-free experience for everyone. + +## Our Standards + +**Positive behavior:** +* Using welcoming language +* Being respectful of differing viewpoints +* Accepting constructive criticism +* Focusing on what is best for the community + +**Unacceptable behavior:** +* Harassment, trolling, or personal attacks +* Publishing private information without permission + +## Enforcement + +Report issues to the maintainers. All complaints will be reviewed. + +## Attribution + +Adapted from [Contributor Covenant](https://www.contributor-covenant.org/) v2.1. + diff --git a/ex/CONTRIBUTING.md b/ex/CONTRIBUTING.md new file mode 100644 index 0000000..80ecdac --- /dev/null +++ b/ex/CONTRIBUTING.md @@ -0,0 +1,66 @@ + +# Contributing + +Thank you for your interest in contributing! We follow a "Dual-Track" architecture where human-readable documentation lives in the root and machine-readable policies live in `.machine_readable/`. + +## How to Contribute + +We welcome contributions in many forms: + +- **Code:** Improving the core stack or extensions +- **Documentation:** Enhancing docs or AI manifests +- **Testing:** Adding property-based tests or formal proofs +- **Bug reports:** Filing clear, reproducible issues + +## Getting Started + +1. **Read the AI Manifest:** Start with `0-AI-MANIFEST.a2ml` (if present) to understand the repository structure. +2. **Environment:** Use `nix develop` or `direnv allow` to set up your tools. +3. **Task Runner:** Use `just` to see available commands (`just --list`). + +## Development Workflow + +### Branch Naming + +``` +docs/short-description # Documentation +test/what-added # Test additions +feat/short-description # New features +fix/issue-number-description # Bug fixes +refactor/what-changed # Code improvements +security/what-fixed # Security fixes +``` + +### Commit Messages + +We follow [Conventional Commits](https://www.conventionalcommits.org/): + +``` +(): + +[optional body] + +[optional footer] +``` + +Types: `feat`, `fix`, `docs`, `test`, `refactor`, `ci`, `chore`, `security` + +## Reporting Bugs + +Before reporting: +1. Search existing issues +2. Check if it's already fixed in `main` + +When reporting, include: +- Clear, descriptive title +- Environment details (OS, versions, toolchain) +- Steps to reproduce +- Expected vs actual behaviour + +## Code of Conduct + +All contributors are expected to adhere to our [Code of Conduct](CODE_OF_CONDUCT.md). + +## License + +By contributing, you agree that your contributions will be licensed under the same license as the project (see [LICENSE](LICENSE)). diff --git a/ex/EXPLAINME.adoc b/ex/EXPLAINME.adoc new file mode 100644 index 0000000..826d0d3 --- /dev/null +++ b/ex/EXPLAINME.adoc @@ -0,0 +1,67 @@ +// SPDX-License-Identifier: CC-BY-SA-4.0 += a2ml_ex — Show Me The Receipts +:toc: +:icons: font + +The README makes claims. This file backs them up. + +== Real Claims From The README + +**Claim 1: "Parse A2ML documents from strings or files… Render AST back to A2ML surface syntax (round-trip support)"** (README, Features section) + +The parser in `lib/a2ml/parser.ex` reads A2ML-formatted text and emits a typed AST via `A2ML.Parser.parse/1`, which returns `{:ok, Document.t()}` or `{:error, reason}`. The parser extracts: + +* Title from H1 heading (`# Title`) +* Blocks (paragraphs, headings, code blocks, directives, attestations) +* Directives starting with `@` (e.g., `@include(file="chapter1.a2ml")`) +* Attestation provenances blocks starting with `!attest` + +The renderer in `lib/a2ml/renderer.ex` reconstructs the surface syntax from the AST via `A2ML.Renderer.render/1`, returning `{:ok, rendered_string}`. This enables round-trip: parse → modify AST → render produces valid A2ML again. + +*How it works:* The parser splits input by newlines, identifies block boundaries, and classifies each line. The `Attestation` struct stores identity, role, trust level, and timestamp. Directives are key-value pairs in `@name(key=val): value` syntax. The renderer walks the AST and reconstructs each element. Caveat: Whitespace normalization and comment stripping mean the rendered output may not be byte-for-byte identical to the input, though semantic content is preserved. + +**Claim 2: "Trust-level hierarchy: :unverified, :automated, :reviewed, :verified"** (README, Trust Levels section) + +The `A2ML.Types.TrustLevel` enum in `lib/a2ml/types.ex` defines a four-tier hierarchy. The parser extracts trust level from attestation blocks (`trust-level: verified`) and stores it on the `Attestation` struct. The types module enforces the hierarchy: `:unverified` < `:automated` < `:reviewed` < `:verified`. Document-wide trust is derived from the minimum trust level of all attestations. + +*How it works:* Attestation blocks declare `trust-level: `. When rendering, the renderer includes the trust level in the output. Clients can filter documents by minimum trust requirement. Caveat: Trust levels are advisory metadata—the library does not cryptographically verify signatures. Signature verification (mentioned in the README's example) is a future feature; currently `signature:` field is stored as a string literal without validation. + +== Dogfooted Across The Account + +a2ml_ex is part of the A2ML ecosystem, which includes: + +* link:https://github.com/hyperpolymath/a2ml-deno[a2ml-deno] — Deno/ReScript implementation (primary) +* link:https://github.com/hyperpolymath/tree-sitter-a2ml[tree-sitter-a2ml] — Tree-sitter grammar for syntax highlighting +* link:https://github.com/hyperpolymath/a2ml-haskell[a2ml-haskell] — Haskell implementation +* link:https://github.com/hyperpolymath/standards[standards] — A2ML spec (K9 service specification) + +The Elixir implementation enables A2ML parsing in BEAM-based systems (Elixir, Erlang). It follows the same type structure as the Deno version. + +== Technology Choices + +[cols="1,2,3"] +|=== +| Technology | Learn More | Why + +| **Elixir** | https://elixir-lang.org | BEAM runtime, immutable data structures, pattern matching for AST +| **ExUnit** | https://hexdocs.pm/ex_unit | Testing framework (no external test dependency) +| **Hex.pm** | https://hex.pm | Package distribution (MPL-2.0 requirement for Hex ecosystem) +|=== + +== File Map + +[cols="1,2,3"] +|=== +| Path | What's There | Key Details + +| `lib/a2ml/parser.ex` | A2ML text parser | Reads lines, extracts title, parses blocks, directives, attestations +| `lib/a2ml/renderer.ex` | AST-to-text renderer | Reconstructs A2ML surface syntax from `Document` struct +| `lib/a2ml/types.ex` | Type definitions | `Document`, `Block`, `Inline`, `Directive`, `Attestation`, `TrustLevel` structs +| `lib/a2_ml.ex` | Public API | Re-exports parser and renderer functions +| `test/a2ml_test.exs` | Parser tests | Round-trip tests, edge cases, error handling +| `mix.exs` | Build configuration | Elixir version, Hex metadata, dependencies +|=== + +== Questions? + +Open an issue or reach out directly — happy to explain anything in more detail. diff --git a/ex/GOVERNANCE.md b/ex/GOVERNANCE.md new file mode 100644 index 0000000..e27364c --- /dev/null +++ b/ex/GOVERNANCE.md @@ -0,0 +1,60 @@ +# Governance + +## Overview + +This project is governed by the following principles and structures to ensure transparent, inclusive, and effective decision-making. + +## Roles and Responsibilities + +### Maintainers + +Maintainers are responsible for: +- Reviewing and merging pull requests +- Managing releases and versioning +- Ensuring code quality and standards +- Triaging issues and bug reports +- Community engagement and support + +### Contributors + +Contributors are expected to: +- Follow the code of conduct +- Submit well-documented pull requests +- Write tests for new functionality +- Maintain existing tests +- Update documentation as needed + +## Decision Making + +### Minor Changes +- Can be made by any maintainer +- Include bug fixes, documentation updates, dependency updates + +### Major Changes +- Require discussion in issues or pull requests +- Include new features, architectural changes, API changes +- Need approval from at least 2 maintainers + +### Breaking Changes +- Require RFC (Request for Comments) process +- Need approval from majority of maintainers +- Must include migration guide + +## Code of Conduct + +All participants are expected to follow our Code of Conduct. Violations can be reported to the maintainers. + +## Communication + +- **Issues**: For bug reports and feature requests +- **Discussions**: For questions and general discussion +- **Pull Requests**: For code contributions + +## Licensing + +All contributions are made under the terms of the repository's LICENSE file. +By submitting a pull request, you agree to license your contributions accordingly. + +--- + +*Last updated: 2026-07-18* diff --git a/ex/Justfile b/ex/Justfile new file mode 100644 index 0000000..3505388 --- /dev/null +++ b/ex/Justfile @@ -0,0 +1,72 @@ +# SPDX-License-Identifier: MPL-2.0 +# Justfile for a2ml_ex + +# Default recipe — list available commands +import? "contractile.just" + +default: + @just --list + +# Self-diagnostic — checks dependencies, permissions, paths +doctor: + @echo "Running diagnostics for a2ml_ex..." + @echo "Checking required tools..." + @command -v just >/dev/null 2>&1 && echo " [OK] just" || echo " [FAIL] just not found" + @command -v git >/dev/null 2>&1 && echo " [OK] git" || echo " [FAIL] git not found" + @echo "Checking for hardcoded paths..." + @grep -rn '/var/mnt/eclipse' --include='*.rs' --include='*.ex' --include='*.res' --include='*.gleam' --include='*.sh' --include='*.toml' . 2>/dev/null | grep -v 'Justfile' | head -5 || echo " [OK] No hardcoded paths in source" + @echo "Diagnostics complete." + +# Guided tour of key features +tour: + @echo "=== a2ml_ex Tour ===" + @echo "" + @echo "1. Project structure:" + @ls -la + @echo "" + @echo "2. Available commands: just --list" + @echo "" + @echo "3. Read README.adoc or README.md for full overview" + @echo "4. Read EXPLAINME.adoc for architecture decisions" + @echo "5. Run 'just doctor' to check your setup" + @echo "" + @echo "Tour complete! Try 'just --list' to see all available commands." + +# Open feedback channel with diagnostic context +help-me: + @echo "=== a2ml_ex Help ===" + @echo "Platform: $(uname -s) $(uname -m)" + @echo "Shell: $SHELL" + @echo "" + @echo "To report an issue:" + @echo " https://github.com/hyperpolymath/a2ml_ex/issues/new" + @echo "" + @echo "Include the output of 'just doctor' in your report." + +# Run panic-attacker pre-commit scan +assail: + @command -v panic-attack >/dev/null 2>&1 && panic-attack assail . || echo "WARN: panic-attack not found — install from https://github.com/hyperpolymath/panic-attacker" + +# LLM context dump +llm-context: + @echo "Project: a2ml_ex" + @echo "License: MPL-2.0" + @test -f README.adoc && head -30 README.adoc || test -f README.md && head -30 README.md || echo "No README found" + + +# Print the current CRG grade (reads from READINESS.md '**Current Grade:** X' line) +crg-grade: + @grade=$$(grep -oP '(?<=\*\*Current Grade:\*\* )[A-FX]' READINESS.md 2>/dev/null | head -1); \ + [ -z "$$grade" ] && grade="X"; \ + echo "$$grade" + +# Generate a shields.io badge markdown for the current CRG grade +# Looks for '**Current Grade:** X' in READINESS.md; falls back to X +crg-badge: + @grade=$$(grep -oP '(?<=\*\*Current Grade:\*\* )[A-FX]' READINESS.md 2>/dev/null | head -1); \ + [ -z "$$grade" ] && grade="X"; \ + case "$$grade" in \ + A) color="brightgreen" ;; B) color="green" ;; C) color="yellow" ;; \ + D) color="orange" ;; E) color="red" ;; F) color="critical" ;; \ + *) color="lightgrey" ;; esac; \ + echo "[![CRG $$grade](https://img.shields.io/badge/CRG-$$grade-$$color?style=flat-square)](https://github.com/hyperpolymath/standards/tree/main/component-readiness-grades)" diff --git a/ex/LICENSE b/ex/LICENSE new file mode 100644 index 0000000..14e2f77 --- /dev/null +++ b/ex/LICENSE @@ -0,0 +1,373 @@ +Mozilla Public License Version 2.0 +================================== + +1. Definitions +-------------- + +1.1. "Contributor" + means each individual or legal entity that creates, contributes to + the creation of, or owns Covered Software. + +1.2. "Contributor Version" + means the combination of the Contributions of others (if any) used + by a Contributor and that particular Contributor's Contribution. + +1.3. "Contribution" + means Covered Software of a particular Contributor. + +1.4. "Covered Software" + means Source Code Form to which the initial Contributor has attached + the notice in Exhibit A, the Executable Form of such Source Code + Form, and Modifications of such Source Code Form, in each case + including portions thereof. + +1.5. "Incompatible With Secondary Licenses" + means + + (a) that the initial Contributor has attached the notice described + in Exhibit B to the Covered Software; or + + (b) that the Covered Software was made available under the terms of + version 1.1 or earlier of the License, but not also under the + terms of a Secondary License. + +1.6. "Executable Form" + means any form of the work other than Source Code Form. + +1.7. "Larger Work" + means a work that combines Covered Software with other material, in + a separate file or files, that is not Covered Software. + +1.8. "License" + means this document. + +1.9. "Licensable" + means having the right to grant, to the maximum extent possible, + whether at the time of the initial grant or subsequently, any and + all of the rights conveyed by this License. + +1.10. "Modifications" + means any of the following: + + (a) any file in Source Code Form that results from an addition to, + deletion from, or modification of the contents of Covered + Software; or + + (b) any new file in Source Code Form that contains any Covered + Software. + +1.11. "Patent Claims" of a Contributor + means any patent claim(s), including without limitation, method, + process, and apparatus claims, in any patent Licensable by such + Contributor that would be infringed, but for the grant of the + License, by the making, using, selling, offering for sale, having + made, import, or transfer of either its Contributions or its + Contributor Version. + +1.12. "Secondary License" + means either the GNU General Public License, Version 2.0, the GNU + Lesser General Public License, Version 2.1, the GNU Affero General + Public License, Version 3.0, or any later versions of those + licenses. + +1.13. "Source Code Form" + means the form of the work preferred for making modifications. + +1.14. "You" (or "Your") + means an individual or a legal entity exercising rights under this + License. For legal entities, "You" includes any entity that + controls, is controlled by, or is under common control with You. For + purposes of this definition, "control" means (a) the power, direct + or indirect, to cause the direction or management of such entity, + whether by contract or otherwise, or (b) ownership of more than + fifty percent (50%) of the outstanding shares or beneficial + ownership of such entity. + +2. License Grants and Conditions +-------------------------------- + +2.1. Grants + +Each Contributor hereby grants You a world-wide, royalty-free, +non-exclusive license: + +(a) under intellectual property rights (other than patent or trademark) + Licensable by such Contributor to use, reproduce, make available, + modify, display, perform, distribute, and otherwise exploit its + Contributions, either on an unmodified basis, with Modifications, or + as part of a Larger Work; and + +(b) under Patent Claims of such Contributor to make, use, sell, offer + for sale, have made, import, and otherwise transfer either its + Contributions or its Contributor Version. + +2.2. Effective Date + +The licenses granted in Section 2.1 with respect to any Contribution +become effective for each Contribution on the date the Contributor first +distributes such Contribution. + +2.3. Limitations on Grant Scope + +The licenses granted in this Section 2 are the only rights granted under +this License. No additional rights or licenses will be implied from the +distribution or licensing of Covered Software under this License. +Notwithstanding Section 2.1(b) above, no patent license is granted by a +Contributor: + +(a) for any code that a Contributor has removed from Covered Software; + or + +(b) for infringements caused by: (i) Your and any other third party's + modifications of Covered Software, or (ii) the combination of its + Contributions with other software (except as part of its Contributor + Version); or + +(c) under Patent Claims infringed by Covered Software in the absence of + its Contributions. + +This License does not grant any rights in the trademarks, service marks, +or logos of any Contributor (except as may be necessary to comply with +the notice requirements in Section 3.4). + +2.4. Subsequent Licenses + +No Contributor makes additional grants as a result of Your choice to +distribute the Covered Software under a subsequent version of this +License (see Section 10.2) or under the terms of a Secondary License (if +permitted under the terms of Section 3.3). + +2.5. Representation + +Each Contributor represents that the Contributor believes its +Contributions are its original creation(s) or it has sufficient rights +to grant the rights to its Contributions conveyed by this License. + +2.6. Fair Use + +This License is not intended to limit any rights You have under +applicable copyright doctrines of fair use, fair dealing, or other +equivalents. + +2.7. Conditions + +Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted +in Section 2.1. + +3. Responsibilities +------------------- + +3.1. Distribution of Source Form + +All distribution of Covered Software in Source Code Form, including any +Modifications that You create or to which You contribute, must be under +the terms of this License. You must inform recipients that the Source +Code Form of the Covered Software is governed by the terms of this +License, and how they can obtain a copy of this License. You may not +attempt to alter or restrict the recipients' rights in the Source Code +Form. + +3.2. Distribution of Executable Form + +If You distribute Covered Software in Executable Form then: + +(a) such Covered Software must also be made available in Source Code + Form, as described in Section 3.1, and You must inform recipients of + the Executable Form how they can obtain a copy of such Source Code + Form by reasonable means in a timely manner, at a charge no more + than the cost of distribution to the recipient; and + +(b) You may distribute such Executable Form under the terms of this + License, or sublicense it under different terms, provided that the + license for the Executable Form does not attempt to limit or alter + the recipients' rights in the Source Code Form under this License. + +3.3. Distribution of a Larger Work + +You may create and distribute a Larger Work under terms of Your choice, +provided that You also comply with the requirements of this License for +the Covered Software. If the Larger Work is a combination of Covered +Software with a work governed by one or more Secondary Licenses, and the +Covered Software is not Incompatible With Secondary Licenses, this +License permits You to additionally distribute such Covered Software +under the terms of such Secondary License(s), so that the recipient of +the Larger Work may, at their option, further distribute the Covered +Software under the terms of either this License or such Secondary +License(s). + +3.4. Notices + +You may not remove or alter the substance of any license notices +(including copyright notices, patent notices, disclaimers of warranty, +or limitations of liability) contained within the Source Code Form of +the Covered Software, except that You may alter any license notices to +the extent required to remedy known factual inaccuracies. + +3.5. Application of Additional Terms + +You may choose to offer, and to charge a fee for, warranty, support, +indemnity or liability obligations to one or more recipients of Covered +Software. However, You may do so only on Your own behalf, and not on +behalf of any Contributor. You must make it absolutely clear that any +such warranty, support, indemnity, or liability obligation is offered by +You alone, and You hereby agree to indemnify every Contributor for any +liability incurred by such Contributor as a result of warranty, support, +indemnity or liability terms You offer. You may include additional +disclaimers of warranty and limitations of liability specific to any +jurisdiction. + +4. Inability to Comply Due to Statute or Regulation +--------------------------------------------------- + +If it is impossible for You to comply with any of the terms of this +License with respect to some or all of the Covered Software due to +statute, judicial order, or regulation then You must: (a) comply with +the terms of this License to the maximum extent possible; and (b) +describe the limitations and the code they affect. Such description must +be placed in a text file included with all distributions of the Covered +Software under this License. Except to the extent prohibited by statute +or regulation, such description must be sufficiently detailed for a +recipient of ordinary skill to be able to understand it. + +5. Termination +-------------- + +5.1. The rights granted under this License will terminate automatically +if You fail to comply with any of its terms. However, if You become +compliant, then the rights granted under this License from a particular +Contributor are reinstated (a) provisionally, unless and until such +Contributor explicitly and finally terminates Your grants, and (b) on an +ongoing basis, if such Contributor fails to notify You of the +non-compliance by some reasonable means prior to 60 days after You have +come back into compliance. Moreover, Your grants from a particular +Contributor are reinstated on an ongoing basis if such Contributor +notifies You of the non-compliance by some reasonable means, this is the +first time You have received notice of non-compliance with this License +from such Contributor, and You become compliant prior to 30 days after +Your receipt of the notice. + +5.2. If You initiate litigation against any entity by asserting a patent +infringement claim (excluding declaratory judgment actions, +counter-claims, and cross-claims) alleging that a Contributor Version +directly or indirectly infringes any patent, then the rights granted to +You by any and all Contributors for the Covered Software under Section +2.1 of this License shall terminate. + +5.3. In the event of termination under Sections 5.1 or 5.2 above, all +end user license agreements (excluding distributors and resellers) which +have been validly granted by You or Your distributors under this License +prior to termination shall survive termination. + +************************************************************************ +* * +* 6. Disclaimer of Warranty * +* ------------------------- * +* * +* Covered Software is provided under this License on an "as is" * +* basis, without warranty of any kind, either expressed, implied, or * +* statutory, including, without limitation, warranties that the * +* Covered Software is free of defects, merchantable, fit for a * +* particular purpose or non-infringing. The entire risk as to the * +* quality and performance of the Covered Software is with You. * +* Should any Covered Software prove defective in any respect, You * +* (not any Contributor) assume the cost of any necessary servicing, * +* repair, or correction. This disclaimer of warranty constitutes an * +* essential part of this License. No use of any Covered Software is * +* authorized under this License except under this disclaimer. * +* * +************************************************************************ + +************************************************************************ +* * +* 7. Limitation of Liability * +* -------------------------- * +* * +* Under no circumstances and under no legal theory, whether tort * +* (including negligence), contract, or otherwise, shall any * +* Contributor, or anyone who distributes Covered Software as * +* permitted above, be liable to You for any direct, indirect, * +* special, incidental, or consequential damages of any character * +* including, without limitation, damages for lost profits, loss of * +* goodwill, work stoppage, computer failure or malfunction, or any * +* and all other commercial damages or losses, even if such party * +* shall have been informed of the possibility of such damages. This * +* limitation of liability shall not apply to liability for death or * +* personal injury resulting from such party's negligence to the * +* extent applicable law prohibits such limitation. Some * +* jurisdictions do not allow the exclusion or limitation of * +* incidental or consequential damages, so this exclusion and * +* limitation may not apply to You. * +* * +************************************************************************ + +8. Litigation +------------- + +Any litigation relating to this License may be brought only in the +courts of a jurisdiction where the defendant maintains its principal +place of business and such litigation shall be governed by laws of that +jurisdiction, without reference to its conflict-of-law provisions. +Nothing in this Section shall prevent a party's ability to bring +cross-claims or counter-claims. + +9. Miscellaneous +---------------- + +This License represents the complete agreement concerning the subject +matter hereof. If any provision of this License is held to be +unenforceable, such provision shall be reformed only to the extent +necessary to make it enforceable. Any law or regulation which provides +that the language of a contract shall be construed against the drafter +shall not be used to construe this License against a Contributor. + +10. Versions of the License +--------------------------- + +10.1. New Versions + +Mozilla Foundation is the license steward. Except as provided in Section +10.3, no one other than the license steward has the right to modify or +publish new versions of this License. Each version will be given a +distinguishing version number. + +10.2. Effect of New Versions + +You may distribute the Covered Software under the terms of the version +of the License under which You originally received the Covered Software, +or under the terms of any subsequent version published by the license +steward. + +10.3. Modified Versions + +If you create software not governed by this License, and you want to +create a new license for such software, you may create and use a +modified version of this License if you rename the license and remove +any references to the name of the license steward (except to note that +such modified license differs from this License). + +10.4. Distributing Source Code Form that is Incompatible With Secondary +Licenses + +If You choose to distribute Source Code Form that is Incompatible With +Secondary Licenses under the terms of this version of the License, the +notice described in Exhibit B of this License must be attached. + +Exhibit A - Source Code Form License Notice +------------------------------------------- + + This Source Code Form is subject to the terms of the Mozilla Public + License, v. 2.0. If a copy of the MPL was not distributed with this + file, You can obtain one at http://mozilla.org/MPL/2.0/. + +If it is not possible or desirable to put the notice in a particular +file, then You may include the notice in a location (such as a LICENSE +file in a relevant directory) where a recipient would be likely to look +for such a notice. + +You may add additional accurate notices of copyright ownership. + +Exhibit B - "Incompatible With Secondary Licenses" Notice +--------------------------------------------------------- + + This Source Code Form is "Incompatible With Secondary Licenses", as + defined by the Mozilla Public License, v. 2.0. diff --git a/ex/LICENSES/AGPL-3.0-or-later.txt b/ex/LICENSES/AGPL-3.0-or-later.txt new file mode 100644 index 0000000..be3f7b2 --- /dev/null +++ b/ex/LICENSES/AGPL-3.0-or-later.txt @@ -0,0 +1,661 @@ + GNU AFFERO GENERAL PUBLIC LICENSE + Version 3, 19 November 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU Affero General Public License is a free, copyleft license for +software and other kinds of works, specifically designed to ensure +cooperation with the community in the case of network server software. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +our General Public Licenses are intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + Developers that use our General Public Licenses protect your rights +with two steps: (1) assert copyright on the software, and (2) offer +you this License which gives you legal permission to copy, distribute +and/or modify the software. + + A secondary benefit of defending all users' freedom is that +improvements made in alternate versions of the program, if they +receive widespread use, become available for other developers to +incorporate. Many developers of free software are heartened and +encouraged by the resulting cooperation. However, in the case of +software used on network servers, this result may fail to come about. +The GNU General Public License permits making a modified version and +letting the public access it on a server without ever releasing its +source code to the public. + + The GNU Affero General Public License is designed specifically to +ensure that, in such cases, the modified source code becomes available +to the community. It requires the operator of a network server to +provide the source code of the modified version running there to the +users of that server. Therefore, public use of a modified version, on +a publicly accessible server, gives the public access to the source +code of the modified version. + + An older license, called the Affero General Public License and +published by Affero, was designed to accomplish similar goals. This is +a different license, not a version of the Affero GPL, but Affero has +released a new version of the Affero GPL which permits relicensing under +this license. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU Affero General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Remote Network Interaction; Use with the GNU General Public License. + + Notwithstanding any other provision of this License, if you modify the +Program, your modified version must prominently offer all users +interacting with it remotely through a computer network (if your version +supports such interaction) an opportunity to receive the Corresponding +Source of your version by providing access to the Corresponding Source +from a network server at no charge, through some standard or customary +means of facilitating copying of software. This Corresponding Source +shall include the Corresponding Source for any work covered by version 3 +of the GNU General Public License that is incorporated pursuant to the +following paragraph. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the work with which it is combined will remain governed by version +3 of the GNU General Public License. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU Affero General Public License from time to time. Such new versions +will be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU Affero General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU Affero General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU Affero General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If your software can interact with users remotely through a computer +network, you should also make sure that it provides a way for users to +get its source. For example, if your program is a web application, its +interface could display a "Source" link that leads users to an archive +of the code. There are many ways you could offer source, and different +solutions will be better for different programs; see section 13 for the +specific requirements. + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU AGPL, see +. diff --git a/ex/LICENSES/CC-BY-SA-4.0.txt b/ex/LICENSES/CC-BY-SA-4.0.txt new file mode 100644 index 0000000..2d58298 --- /dev/null +++ b/ex/LICENSES/CC-BY-SA-4.0.txt @@ -0,0 +1,428 @@ +Attribution-ShareAlike 4.0 International + +======================================================================= + +Creative Commons Corporation ("Creative Commons") is not a law firm and +does not provide legal services or legal advice. Distribution of +Creative Commons public licenses does not create a lawyer-client or +other relationship. Creative Commons makes its licenses and related +information available on an "as-is" basis. Creative Commons gives no +warranties regarding its licenses, any material licensed under their +terms and conditions, or any related information. Creative Commons +disclaims all liability for damages resulting from their use to the +fullest extent possible. + +Using Creative Commons Public Licenses + +Creative Commons public licenses provide a standard set of terms and +conditions that creators and other rights holders may use to share +original works of authorship and other material subject to copyright +and certain other rights specified in the public license below. The +following considerations are for informational purposes only, are not +exhaustive, and do not form part of our licenses. + + Considerations for licensors: Our public licenses are + intended for use by those authorized to give the public + permission to use material in ways otherwise restricted by + copyright and certain other rights. Our licenses are + irrevocable. Licensors should read and understand the terms + and conditions of the license they choose before applying it. + Licensors should also secure all rights necessary before + applying our licenses so that the public can reuse the + material as expected. Licensors should clearly mark any + material not subject to the license. This includes other CC- + licensed material, or material used under an exception or + limitation to copyright. More considerations for licensors: + wiki.creativecommons.org/Considerations_for_licensors + + Considerations for the public: By using one of our public + licenses, a licensor grants the public permission to use the + licensed material under specified terms and conditions. If + the licensor's permission is not necessary for any reason--for + example, because of any applicable exception or limitation to + copyright--then that use is not regulated by the license. Our + licenses grant only permissions under copyright and certain + other rights that a licensor has authority to grant. Use of + the licensed material may still be restricted for other + reasons, including because others have copyright or other + rights in the material. A licensor may make special requests, + such as asking that all changes be marked or described. + Although not required by our licenses, you are encouraged to + respect those requests where reasonable. More considerations + for the public: + wiki.creativecommons.org/Considerations_for_licensees + +======================================================================= + +Creative Commons Attribution-ShareAlike 4.0 International Public +License + +By exercising the Licensed Rights (defined below), You accept and agree +to be bound by the terms and conditions of this Creative Commons +Attribution-ShareAlike 4.0 International Public License ("Public +License"). To the extent this Public License may be interpreted as a +contract, You are granted the Licensed Rights in consideration of Your +acceptance of these terms and conditions, and the Licensor grants You +such rights in consideration of benefits the Licensor receives from +making the Licensed Material available under these terms and +conditions. + + +Section 1 -- Definitions. + + a. Adapted Material means material subject to Copyright and Similar + Rights that is derived from or based upon the Licensed Material + and in which the Licensed Material is translated, altered, + arranged, transformed, or otherwise modified in a manner requiring + permission under the Copyright and Similar Rights held by the + Licensor. For purposes of this Public License, where the Licensed + Material is a musical work, performance, or sound recording, + Adapted Material is always produced where the Licensed Material is + synched in timed relation with a moving image. + + b. Adapter's License means the license You apply to Your Copyright + and Similar Rights in Your contributions to Adapted Material in + accordance with the terms and conditions of this Public License. + + c. BY-SA Compatible License means a license listed at + creativecommons.org/compatiblelicenses, approved by Creative + Commons as essentially the equivalent of this Public License. + + d. Copyright and Similar Rights means copyright and/or similar rights + closely related to copyright including, without limitation, + performance, broadcast, sound recording, and Sui Generis Database + Rights, without regard to how the rights are labeled or + categorized. For purposes of this Public License, the rights + specified in Section 2(b)(1)-(2) are not Copyright and Similar + Rights. + + e. Effective Technological Measures means those measures that, in the + absence of proper authority, may not be circumvented under laws + fulfilling obligations under Article 11 of the WIPO Copyright + Treaty adopted on December 20, 1996, and/or similar international + agreements. + + f. Exceptions and Limitations means fair use, fair dealing, and/or + any other exception or limitation to Copyright and Similar Rights + that applies to Your use of the Licensed Material. + + g. License Elements means the license attributes listed in the name + of a Creative Commons Public License. The License Elements of this + Public License are Attribution and ShareAlike. + + h. Licensed Material means the artistic or literary work, database, + or other material to which the Licensor applied this Public + License. + + i. Licensed Rights means the rights granted to You subject to the + terms and conditions of this Public License, which are limited to + all Copyright and Similar Rights that apply to Your use of the + Licensed Material and that the Licensor has authority to license. + + j. Licensor means the individual(s) or entity(ies) granting rights + under this Public License. + + k. Share means to provide material to the public by any means or + process that requires permission under the Licensed Rights, such + as reproduction, public display, public performance, distribution, + dissemination, communication, or importation, and to make material + available to the public including in ways that members of the + public may access the material from a place and at a time + individually chosen by them. + + l. Sui Generis Database Rights means rights other than copyright + resulting from Directive 96/9/EC of the European Parliament and of + the Council of 11 March 1996 on the legal protection of databases, + as amended and/or succeeded, as well as other essentially + equivalent rights anywhere in the world. + + m. You means the individual or entity exercising the Licensed Rights + under this Public License. Your has a corresponding meaning. + + +Section 2 -- Scope. + + a. License grant. + + 1. Subject to the terms and conditions of this Public License, + the Licensor hereby grants You a worldwide, royalty-free, + non-sublicensable, non-exclusive, irrevocable license to + exercise the Licensed Rights in the Licensed Material to: + + a. reproduce and Share the Licensed Material, in whole or + in part; and + + b. produce, reproduce, and Share Adapted Material. + + 2. Exceptions and Limitations. For the avoidance of doubt, where + Exceptions and Limitations apply to Your use, this Public + License does not apply, and You do not need to comply with + its terms and conditions. + + 3. Term. The term of this Public License is specified in Section + 6(a). + + 4. Media and formats; technical modifications allowed. The + Licensor authorizes You to exercise the Licensed Rights in + all media and formats whether now known or hereafter created, + and to make technical modifications necessary to do so. The + Licensor waives and/or agrees not to assert any right or + authority to forbid You from making technical modifications + necessary to exercise the Licensed Rights, including + technical modifications necessary to circumvent Effective + Technological Measures. For purposes of this Public License, + simply making modifications authorized by this Section 2(a) + (4) never produces Adapted Material. + + 5. Downstream recipients. + + a. Offer from the Licensor -- Licensed Material. Every + recipient of the Licensed Material automatically + receives an offer from the Licensor to exercise the + Licensed Rights under the terms and conditions of this + Public License. + + b. Additional offer from the Licensor -- Adapted Material. + Every recipient of Adapted Material from You + automatically receives an offer from the Licensor to + exercise the Licensed Rights in the Adapted Material + under the conditions of the Adapter's License You apply. + + c. No downstream restrictions. You may not offer or impose + any additional or different terms or conditions on, or + apply any Effective Technological Measures to, the + Licensed Material if doing so restricts exercise of the + Licensed Rights by any recipient of the Licensed + Material. + + 6. No endorsement. Nothing in this Public License constitutes or + may be construed as permission to assert or imply that You + are, or that Your use of the Licensed Material is, connected + with, or sponsored, endorsed, or granted official status by, + the Licensor or others designated to receive attribution as + provided in Section 3(a)(1)(A)(i). + + b. Other rights. + + 1. Moral rights, such as the right of integrity, are not + licensed under this Public License, nor are publicity, + privacy, and/or other similar personality rights; however, to + the extent possible, the Licensor waives and/or agrees not to + assert any such rights held by the Licensor to the limited + extent necessary to allow You to exercise the Licensed + Rights, but not otherwise. + + 2. Patent and trademark rights are not licensed under this + Public License. + + 3. To the extent possible, the Licensor waives any right to + collect royalties from You for the exercise of the Licensed + Rights, whether directly or through a collecting society + under any voluntary or waivable statutory or compulsory + licensing scheme. In all other cases the Licensor expressly + reserves any right to collect such royalties. + + +Section 3 -- License Conditions. + +Your exercise of the Licensed Rights is expressly made subject to the +following conditions. + + a. Attribution. + + 1. If You Share the Licensed Material (including in modified + form), You must: + + a. retain the following if it is supplied by the Licensor + with the Licensed Material: + + i. identification of the creator(s) of the Licensed + Material and any others designated to receive + attribution, in any reasonable manner requested by + the Licensor (including by pseudonym if + designated); + + ii. a copyright notice; + + iii. a notice that refers to this Public License; + + iv. a notice that refers to the disclaimer of + warranties; + + v. a URI or hyperlink to the Licensed Material to the + extent reasonably practicable; + + b. indicate if You modified the Licensed Material and + retain an indication of any previous modifications; and + + c. indicate the Licensed Material is licensed under this + Public License, and include the text of, or the URI or + hyperlink to, this Public License. + + 2. You may satisfy the conditions in Section 3(a)(1) in any + reasonable manner based on the medium, means, and context in + which You Share the Licensed Material. For example, it may be + reasonable to satisfy the conditions by providing a URI or + hyperlink to a resource that includes the required + information. + + 3. If requested by the Licensor, You must remove any of the + information required by Section 3(a)(1)(A) to the extent + reasonably practicable. + + b. ShareAlike. + + In addition to the conditions in Section 3(a), if You Share + Adapted Material You produce, the following conditions also apply. + + 1. The Adapter's License You apply must be a Creative Commons + license with the same License Elements, this version or + later, or a BY-SA Compatible License. + + 2. You must include the text of, or the URI or hyperlink to, the + Adapter's License You apply. You may satisfy this condition + in any reasonable manner based on the medium, means, and + context in which You Share Adapted Material. + + 3. You may not offer or impose any additional or different terms + or conditions on, or apply any Effective Technological + Measures to, Adapted Material that restrict exercise of the + rights granted under the Adapter's License You apply. + + +Section 4 -- Sui Generis Database Rights. + +Where the Licensed Rights include Sui Generis Database Rights that +apply to Your use of the Licensed Material: + + a. for the avoidance of doubt, Section 2(a)(1) grants You the right + to extract, reuse, reproduce, and Share all or a substantial + portion of the contents of the database; + + b. if You include all or a substantial portion of the database + contents in a database in which You have Sui Generis Database + Rights, then the database in which You have Sui Generis Database + Rights (but not its individual contents) is Adapted Material, + including for purposes of Section 3(b); and + + c. You must comply with the conditions in Section 3(a) if You Share + all or a substantial portion of the contents of the database. + +For the avoidance of doubt, this Section 4 supplements and does not +replace Your obligations under this Public License where the Licensed +Rights include other Copyright and Similar Rights. + + +Section 5 -- Disclaimer of Warranties and Limitation of Liability. + + a. UNLESS OTHERWISE SEPARATELY UNDERTAKEN BY THE LICENSOR, TO THE + EXTENT POSSIBLE, THE LICENSOR OFFERS THE LICENSED MATERIAL AS-IS + AND AS-AVAILABLE, AND MAKES NO REPRESENTATIONS OR WARRANTIES OF + ANY KIND CONCERNING THE LICENSED MATERIAL, WHETHER EXPRESS, + IMPLIED, STATUTORY, OR OTHER. THIS INCLUDES, WITHOUT LIMITATION, + WARRANTIES OF TITLE, MERCHANTABILITY, FITNESS FOR A PARTICULAR + PURPOSE, NON-INFRINGEMENT, ABSENCE OF LATENT OR OTHER DEFECTS, + ACCURACY, OR THE PRESENCE OR ABSENCE OF ERRORS, WHETHER OR NOT + KNOWN OR DISCOVERABLE. WHERE DISCLAIMERS OF WARRANTIES ARE NOT + ALLOWED IN FULL OR IN PART, THIS DISCLAIMER MAY NOT APPLY TO YOU. + + b. TO THE EXTENT POSSIBLE, IN NO EVENT WILL THE LICENSOR BE LIABLE + TO YOU ON ANY LEGAL THEORY (INCLUDING, WITHOUT LIMITATION, + NEGLIGENCE) OR OTHERWISE FOR ANY DIRECT, SPECIAL, INDIRECT, + INCIDENTAL, CONSEQUENTIAL, PUNITIVE, EXEMPLARY, OR OTHER LOSSES, + COSTS, EXPENSES, OR DAMAGES ARISING OUT OF THIS PUBLIC LICENSE OR + USE OF THE LICENSED MATERIAL, EVEN IF THE LICENSOR HAS BEEN + ADVISED OF THE POSSIBILITY OF SUCH LOSSES, COSTS, EXPENSES, OR + DAMAGES. WHERE A LIMITATION OF LIABILITY IS NOT ALLOWED IN FULL OR + IN PART, THIS LIMITATION MAY NOT APPLY TO YOU. + + c. The disclaimer of warranties and limitation of liability provided + above shall be interpreted in a manner that, to the extent + possible, most closely approximates an absolute disclaimer and + waiver of all liability. + + +Section 6 -- Term and Termination. + + a. This Public License applies for the term of the Copyright and + Similar Rights licensed here. However, if You fail to comply with + this Public License, then Your rights under this Public License + terminate automatically. + + b. Where Your right to use the Licensed Material has terminated under + Section 6(a), it reinstates: + + 1. automatically as of the date the violation is cured, provided + it is cured within 30 days of Your discovery of the + violation; or + + 2. upon express reinstatement by the Licensor. + + For the avoidance of doubt, this Section 6(b) does not affect any + right the Licensor may have to seek remedies for Your violations + of this Public License. + + c. For the avoidance of doubt, the Licensor may also offer the + Licensed Material under separate terms or conditions or stop + distributing the Licensed Material at any time; however, doing so + will not terminate this Public License. + + d. Sections 1, 5, 6, 7, and 8 survive termination of this Public + License. + + +Section 7 -- Other Terms and Conditions. + + a. The Licensor shall not be bound by any additional or different + terms or conditions communicated by You unless expressly agreed. + + b. Any arrangements, understandings, or agreements regarding the + Licensed Material not stated herein are separate from and + independent of the terms and conditions of this Public License. + + +Section 8 -- Interpretation. + + a. For the avoidance of doubt, this Public License does not, and + shall not be interpreted to, reduce, limit, restrict, or impose + conditions on any use of the Licensed Material that could lawfully + be made without permission under this Public License. + + b. To the extent possible, if any provision of this Public License is + deemed unenforceable, it shall be automatically reformed to the + minimum extent necessary to make it enforceable. If the provision + cannot be reformed, it shall be severed from this Public License + without affecting the enforceability of the remaining terms and + conditions. + + c. No term or condition of this Public License will be waived and no + failure to comply consented to unless expressly agreed to by the + Licensor. + + d. Nothing in this Public License constitutes or may be interpreted + as a limitation upon, or waiver of, any privileges and immunities + that apply to the Licensor or You, including from the legal + processes of any jurisdiction or authority. + + +======================================================================= + +Creative Commons is not a party to its public +licenses. Notwithstanding, Creative Commons may elect to apply one of +its public licenses to material it publishes and in those instances +will be considered the “Licensor.” The text of the Creative Commons +public licenses is dedicated to the public domain under the CC0 Public +Domain Dedication. Except for the limited purpose of indicating that +material is shared under a Creative Commons public license or as +otherwise permitted by the Creative Commons policies published at +creativecommons.org/policies, Creative Commons does not authorize the +use of the trademark "Creative Commons" or any other trademark or logo +of Creative Commons without its prior written consent including, +without limitation, in connection with any unauthorized modifications +to any of its public licenses or any other arrangements, +understandings, or agreements concerning use of licensed material. For +the avoidance of doubt, this paragraph does not form part of the +public licenses. + +Creative Commons may be contacted at creativecommons.org. + diff --git a/ex/LICENSES/MPL-2.0.txt b/ex/LICENSES/MPL-2.0.txt new file mode 100644 index 0000000..d0a1fa1 --- /dev/null +++ b/ex/LICENSES/MPL-2.0.txt @@ -0,0 +1,373 @@ +Mozilla Public License Version 2.0 +================================== + +1. Definitions +-------------- + +1.1. "Contributor" + means each individual or legal entity that creates, contributes to + the creation of, or owns Covered Software. + +1.2. "Contributor Version" + means the combination of the Contributions of others (if any) used + by a Contributor and that particular Contributor's Contribution. + +1.3. "Contribution" + means Covered Software of a particular Contributor. + +1.4. "Covered Software" + means Source Code Form to which the initial Contributor has attached + the notice in Exhibit A, the Executable Form of such Source Code + Form, and Modifications of such Source Code Form, in each case + including portions thereof. + +1.5. "Incompatible With Secondary Licenses" + means + + (a) that the initial Contributor has attached the notice described + in Exhibit B to the Covered Software; or + + (b) that the Covered Software was made available under the terms of + version 1.1 or earlier of the License, but not also under the + terms of a Secondary License. + +1.6. "Executable Form" + means any form of the work other than Source Code Form. + +1.7. "Larger Work" + means a work that combines Covered Software with other material, in + a separate file or files, that is not Covered Software. + +1.8. "License" + means this document. + +1.9. "Licensable" + means having the right to grant, to the maximum extent possible, + whether at the time of the initial grant or subsequently, any and + all of the rights conveyed by this License. + +1.10. "Modifications" + means any of the following: + + (a) any file in Source Code Form that results from an addition to, + deletion from, or modification of the contents of Covered + Software; or + + (b) any new file in Source Code Form that contains any Covered + Software. + +1.11. "Patent Claims" of a Contributor + means any patent claim(s), including without limitation, method, + process, and apparatus claims, in any patent Licensable by such + Contributor that would be infringed, but for the grant of the + License, by the making, using, selling, offering for sale, having + made, import, or transfer of either its Contributions or its + Contributor Version. + +1.12. "Secondary License" + means either the GNU General Public License, Version 2.0, the GNU + Lesser General Public License, Version 2.1, the GNU Affero General + Public License, Version 3.0, or any later versions of those + licenses. + +1.13. "Source Code Form" + means the form of the work preferred for making modifications. + +1.14. "You" (or "Your") + means an individual or a legal entity exercising rights under this + License. For legal entities, "You" includes any entity that + controls, is controlled by, or is under common control with You. For + purposes of this definition, "control" means (a) the power, direct + or indirect, to cause the direction or management of such entity, + whether by contract or otherwise, or (b) ownership of more than + fifty percent (50%) of the outstanding shares or beneficial + ownership of such entity. + +2. License Grants and Conditions +-------------------------------- + +2.1. Grants + +Each Contributor hereby grants You a world-wide, royalty-free, +non-exclusive license: + +(a) under intellectual property rights (other than patent or trademark) + Licensable by such Contributor to use, reproduce, make available, + modify, display, perform, distribute, and otherwise exploit its + Contributions, either on an unmodified basis, with Modifications, or + as part of a Larger Work; and + +(b) under Patent Claims of such Contributor to make, use, sell, offer + for sale, have made, import, and otherwise transfer either its + Contributions or its Contributor Version. + +2.2. Effective Date + +The licenses granted in Section 2.1 with respect to any Contribution +become effective for each Contribution on the date the Contributor first +distributes such Contribution. + +2.3. Limitations on Grant Scope + +The licenses granted in this Section 2 are the only rights granted under +this License. No additional rights or licenses will be implied from the +distribution or licensing of Covered Software under this License. +Notwithstanding Section 2.1(b) above, no patent license is granted by a +Contributor: + +(a) for any code that a Contributor has removed from Covered Software; + or + +(b) for infringements caused by: (i) Your and any other third party's + modifications of Covered Software, or (ii) the combination of its + Contributions with other software (except as part of its Contributor + Version); or + +(c) under Patent Claims infringed by Covered Software in the absence of + its Contributions. + +This License does not grant any rights in the trademarks, service marks, +or logos of any Contributor (except as may be necessary to comply with +the notice requirements in Section 3.4). + +2.4. Subsequent Licenses + +No Contributor makes additional grants as a result of Your choice to +distribute the Covered Software under a subsequent version of this +License (see Section 10.2) or under the terms of a Secondary License (if +permitted under the terms of Section 3.3). + +2.5. Representation + +Each Contributor represents that the Contributor believes its +Contributions are its original creation(s) or it has sufficient rights +to grant the rights to its Contributions conveyed by this License. + +2.6. Fair Use + +This License is not intended to limit any rights You have under +applicable copyright doctrines of fair use, fair dealing, or other +equivalents. + +2.7. Conditions + +Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted +in Section 2.1. + +3. Responsibilities +------------------- + +3.1. Distribution of Source Form + +All distribution of Covered Software in Source Code Form, including any +Modifications that You create or to which You contribute, must be under +the terms of this License. You must inform recipients that the Source +Code Form of the Covered Software is governed by the terms of this +License, and how they can obtain a copy of this License. You may not +attempt to alter or restrict the recipients' rights in the Source Code +Form. + +3.2. Distribution of Executable Form + +If You distribute Covered Software in Executable Form then: + +(a) such Covered Software must also be made available in Source Code + Form, as described in Section 3.1, and You must inform recipients of + the Executable Form how they can obtain a copy of such Source Code + Form by reasonable means in a timely manner, at a charge no more + than the cost of distribution to the recipient; and + +(b) You may distribute such Executable Form under the terms of this + License, or sublicense it under different terms, provided that the + license for the Executable Form does not attempt to limit or alter + the recipients' rights in the Source Code Form under this License. + +3.3. Distribution of a Larger Work + +You may create and distribute a Larger Work under terms of Your choice, +provided that You also comply with the requirements of this License for +the Covered Software. If the Larger Work is a combination of Covered +Software with a work governed by one or more Secondary Licenses, and the +Covered Software is not Incompatible With Secondary Licenses, this +License permits You to additionally distribute such Covered Software +under the terms of such Secondary License(s), so that the recipient of +the Larger Work may, at their option, further distribute the Covered +Software under the terms of either this License or such Secondary +License(s). + +3.4. Notices + +You may not remove or alter the substance of any license notices +(including copyright notices, patent notices, disclaimers of warranty, +or limitations of liability) contained within the Source Code Form of +the Covered Software, except that You may alter any license notices to +the extent required to remedy known factual inaccuracies. + +3.5. Application of Additional Terms + +You may choose to offer, and to charge a fee for, warranty, support, +indemnity or liability obligations to one or more recipients of Covered +Software. However, You may do so only on Your own behalf, and not on +behalf of any Contributor. You must make it absolutely clear that any +such warranty, support, indemnity, or liability obligation is offered by +You alone, and You hereby agree to indemnify every Contributor for any +liability incurred by such Contributor as a result of warranty, support, +indemnity or liability terms You offer. You may include additional +disclaimers of warranty and limitations of liability specific to any +jurisdiction. + +4. Inability to Comply Due to Statute or Regulation +--------------------------------------------------- + +If it is impossible for You to comply with any of the terms of this +License with respect to some or all of the Covered Software due to +statute, judicial order, or regulation then You must: (a) comply with +the terms of this License to the maximum extent possible; and (b) +describe the limitations and the code they affect. Such description must +be placed in a text file included with all distributions of the Covered +Software under this License. Except to the extent prohibited by statute +or regulation, such description must be sufficiently detailed for a +recipient of ordinary skill to be able to understand it. + +5. Termination +-------------- + +5.1. The rights granted under this License will terminate automatically +if You fail to comply with any of its terms. However, if You become +compliant, then the rights granted under this License from a particular +Contributor are reinstated (a) provisionally, unless and until such +Contributor explicitly and finally terminates Your grants, and (b) on an +ongoing basis, if such Contributor fails to notify You of the +non-compliance by some reasonable means prior to 60 days after You have +come back into compliance. Moreover, Your grants from a particular +Contributor are reinstated on an ongoing basis if such Contributor +notifies You of the non-compliance by some reasonable means, this is the +first time You have received notice of non-compliance with this License +from such Contributor, and You become compliant prior to 30 days after +Your receipt of the notice. + +5.2. If You initiate litigation against any entity by asserting a patent +infringement claim (excluding declaratory judgment actions, +counter-claims, and cross-claims) alleging that a Contributor Version +directly or indirectly infringes any patent, then the rights granted to +You by any and all Contributors for the Covered Software under Section +2.1 of this License shall terminate. + +5.3. In the event of termination under Sections 5.1 or 5.2 above, all +end user license agreements (excluding distributors and resellers) which +have been validly granted by You or Your distributors under this License +prior to termination shall survive termination. + +************************************************************************ +* * +* 6. Disclaimer of Warranty * +* ------------------------- * +* * +* Covered Software is provided under this License on an "as is" * +* basis, without warranty of any kind, either expressed, implied, or * +* statutory, including, without limitation, warranties that the * +* Covered Software is free of defects, merchantable, fit for a * +* particular purpose or non-infringing. The entire risk as to the * +* quality and performance of the Covered Software is with You. * +* Should any Covered Software prove defective in any respect, You * +* (not any Contributor) assume the cost of any necessary servicing, * +* repair, or correction. This disclaimer of warranty constitutes an * +* essential part of this License. No use of any Covered Software is * +* authorized under this License except under this disclaimer. * +* * +************************************************************************ + +************************************************************************ +* * +* 7. Limitation of Liability * +* -------------------------- * +* * +* Under no circumstances and under no legal theory, whether tort * +* (including negligence), contract, or otherwise, shall any * +* Contributor, or anyone who distributes Covered Software as * +* permitted above, be liable to You for any direct, indirect, * +* special, incidental, or consequential damages of any character * +* including, without limitation, damages for lost profits, loss of * +* goodwill, work stoppage, computer failure or malfunction, or any * +* and all other commercial damages or losses, even if such party * +* shall have been informed of the possibility of such damages. This * +* limitation of liability shall not apply to liability for death or * +* personal injury resulting from such party's negligence to the * +* extent applicable law prohibits such limitation. Some * +* jurisdictions do not allow the exclusion or limitation of * +* incidental or consequential damages, so this exclusion and * +* limitation may not apply to You. * +* * +************************************************************************ + +8. Litigation +------------- + +Any litigation relating to this License may be brought only in the +courts of a jurisdiction where the defendant maintains its principal +place of business and such litigation shall be governed by laws of that +jurisdiction, without reference to its conflict-of-law provisions. +Nothing in this Section shall prevent a party's ability to bring +cross-claims or counter-claims. + +9. Miscellaneous +---------------- + +This License represents the complete agreement concerning the subject +matter hereof. If any provision of this License is held to be +unenforceable, such provision shall be reformed only to the extent +necessary to make it enforceable. Any law or regulation which provides +that the language of a contract shall be construed against the drafter +shall not be used to construe this License against a Contributor. + +10. Versions of the License +--------------------------- + +10.1. New Versions + +Mozilla Foundation is the license steward. Except as provided in Section +10.3, no one other than the license steward has the right to modify or +publish new versions of this License. Each version will be given a +distinguishing version number. + +10.2. Effect of New Versions + +You may distribute the Covered Software under the terms of the version +of the License under which You originally received the Covered Software, +or under the terms of any subsequent version published by the license +steward. + +10.3. Modified Versions + +If you create software not governed by this License, and you want to +create a new license for such software, you may create and use a +modified version of this License if you rename the license and remove +any references to the name of the license steward (except to note that +such modified license differs from this License). + +10.4. Distributing Source Code Form that is Incompatible With Secondary +Licenses + +If You choose to distribute Source Code Form that is Incompatible With +Secondary Licenses under the terms of this version of the License, the +notice described in Exhibit B of this License must be attached. + +Exhibit A - Source Code Form License Notice +------------------------------------------- + + This Source Code Form is subject to the terms of the Mozilla Public + License, v. 2.0. If a copy of the MPL was not distributed with this + file, You can obtain one at https://mozilla.org/MPL/2.0/. + +If it is not possible or desirable to put the notice in a particular +file, then You may include the notice in a location (such as a LICENSE +file in a relevant directory) where a recipient would be likely to look +for such a notice. + +You may add additional accurate notices of copyright ownership. + +Exhibit B - "Incompatible With Secondary Licenses" Notice +--------------------------------------------------------- + + This Source Code Form is "Incompatible With Secondary Licenses", as + defined by the Mozilla Public License, v. 2.0. diff --git a/ex/MAINTAINERS b/ex/MAINTAINERS new file mode 100644 index 0000000..37f6411 --- /dev/null +++ b/ex/MAINTAINERS @@ -0,0 +1,43 @@ +# Maintainers + +This file lists the current maintainers of this project. + +## Active Maintainers + +| Name | GitHub | Role | Since | +|------|--------|------|-------| +| Metadatastician | @metadatastician | Primary | Project Start | + +## Emeritus Maintainers + +None at this time. + +## Becoming a Maintainer + +To become a maintainer: + +1. Demonstrate consistent, high-quality contributions +2. Show understanding of the project's goals and architecture +3. Be active in code reviews and community discussions +4. Be nominated by an existing maintainer +5. Be approved by consensus of existing maintainers + +## Maintainer Responsibilities + +- Reviewing and merging pull requests +- Managing releases +- Triaging issues +- Enforcing code standards +- Mentoring new contributors +- Participating in decision-making + +## Maintainer Expectations + +- Respond to issues and PRs in a timely manner +- Follow the code of conduct +- Be transparent in decision-making +- Communicate clearly and respectfully + +--- + +*Last updated: 2026-07-18* diff --git a/ex/QUICKSTART-DEV.adoc b/ex/QUICKSTART-DEV.adoc new file mode 100644 index 0000000..587513e --- /dev/null +++ b/ex/QUICKSTART-DEV.adoc @@ -0,0 +1,39 @@ += A2Ml_Ex — Developer Quickstart +:toc: preamble + +Clone, build, test, contribute. + +== Prerequisites + +* Git 2.40+ +* just (command runner) +* See `just doctor` output for language-specific requirements + +== Setup + +[source,bash] +---- +git clone https://github.com/hyperpolymath/a2ml_ex +cd a2ml_ex +just doctor # verify toolchain +just heal # auto-install missing tools +---- + +== Development Workflow + +[source,bash] +---- +just tour # understand the codebase +just help-me # see available commands +---- + +== Before Committing + +[source,bash] +---- +just assail # run panic-attacker security scan +---- + +== Contributing + +See link:CONTRIBUTING.md[CONTRIBUTING.md] for guidelines. diff --git a/ex/QUICKSTART-MAINTAINER.adoc b/ex/QUICKSTART-MAINTAINER.adoc new file mode 100644 index 0000000..eefc680 --- /dev/null +++ b/ex/QUICKSTART-MAINTAINER.adoc @@ -0,0 +1,40 @@ += A2Ml_Ex — Maintainer Quickstart +:toc: preamble + +Packaging, deployment, and release management. + +== Prerequisites + +* Git 2.40+ +* just (command runner) +* Familiarity with the project (run `just tour` first) + +== CI/CD + +This project uses GitHub Actions. Workflows are in `.github/workflows/`. + +Key workflows: + +* `hypatia-scan.yml` — Neurosymbolic security scanning +* `codeql.yml` — Code analysis +* `scorecard.yml` — OpenSSF Scorecard +* `mirror.yml` — GitLab/Bitbucket mirroring + +== Releasing + +1. Update version in project config +2. Update CHANGELOG.md +3. Tag: `git tag -s v` +4. Push: `git push origin main --tags` + +== Container Build (if applicable) + +[source,bash] +---- +podman build -f Containerfile -t a2ml_ex:latest . +---- + +== Mirrors + +This repo is mirrored to GitLab and Bitbucket (hyperpolymath accounts) +via the `mirror.yml` workflow. diff --git a/ex/QUICKSTART-USER.adoc b/ex/QUICKSTART-USER.adoc new file mode 100644 index 0000000..89b0c06 --- /dev/null +++ b/ex/QUICKSTART-USER.adoc @@ -0,0 +1,33 @@ += A2Ml_Ex — User Quickstart +:toc: preamble + +Get up and running in 60 seconds. + +== Prerequisites + +* Git 2.40+ +* just (command runner) — https://just.systems + +== Install + +[source,bash] +---- +git clone https://github.com/hyperpolymath/a2ml_ex +cd a2ml_ex +just doctor # check toolchain +just heal # auto-install missing tools +---- + +== First Run + +[source,bash] +---- +just tour # guided project tour +just help-me # see common workflows +---- + +== Get Help + +* `just help-me` — common workflows +* `just doctor` — diagnose toolchain issues +* https://github.com/hyperpolymath/a2ml_ex/issues — report bugs diff --git a/ex/README.md b/ex/README.md new file mode 100644 index 0000000..1731866 --- /dev/null +++ b/ex/README.md @@ -0,0 +1,219 @@ + + +[![OpenSSF Best Practices](https://img.shields.io/badge/OpenSSF-Best_Practices-green?logo=opensourcesecurity)](https://www.bestpractices.dev/en/projects/new?repo_url=https://github.com/hyperpolymath/a2ml_ex) + +# Overview + +**Elixir implementation of A2ML (Attested Markup Language) parser and +renderer.** + +A2ML is a structured markup language with built-in attestation +provenance, directive metadata, and trust-level tracking. This library +provides a complete parser and renderer for A2ML documents in pure +Elixir. + +# Features + +- Parse A2ML documents from strings or files + +- Render AST back to A2ML surface syntax (round-trip support) + +- Typed AST with structs for blocks, inlines, directives, and + attestations + +- Trust-level hierarchy: `:unverified`, `:automated`, `:reviewed`, + `:verified` + +- Directive blocks with key-value attributes + +- Attestation provenance chain + +- Zero dependencies beyond Elixir standard library + +# Quick Start + +Add to your `mix.exs`: + +```elixir +defp deps do + [{:a2ml_ex, git: "https://github.com/hyperpolymath/a2ml_ex.git"}] +end +``` + +Then run: + +```bash +mix deps.get +mix compile +``` + +# Usage + +```elixir +# Parse A2ML document +{:ok, document} = A2ML.parse("# Hello World\n\nSome **bold** text.") + +# Render back to A2ML +{:ok, rendered} = A2ML.render(document) + +# Handle parse errors +{:error, %A2ML.ParseError{}} = A2ML.parse("invalid syntax") +``` + +# Module Structure + +| Module | Purpose | +|----|----| +| `A2ML` | Main module - re-exports public API | +| `A2ML.Document` | Document struct and functions | +| `A2ML.Block` | Block-level elements (headings, paragraphs, lists, etc.) | +| `A2ML.Inline` | Inline elements (bold, italic, code, links, etc.) | +| `A2ML.Directive` | Directive blocks with attributes | +| `A2ML.Attestation` | Attestation provenance and trust levels | +| `A2ML.Parser` | Parser implementation (string to AST) | +| `A2ML.Renderer` | Renderer implementation (AST to string) | +| `A2ML.Error` | Error types and handling | + +# A2ML Syntax Reference + + # Heading + + Paragraph with **bold**, *italic*, `code`, [link](url), and @ref(id). + + @directive-name(key=val): single line value + + @multi-line: + Content spanning + multiple lines + @end + + !attest + identity: Jonathan D.A. Jewell + role: author + trust-level: verified + timestamp: 2026-03-16T00:00:00Z + !end + + - Bullet list item + - Another item + + > Block quote text + + ```elixir + defmodule Example do + def hello, do: "world" + end + ``` + +# Development + +```bash +mix deps.get # Install dependencies +mix compile # Compile project +mix test # Run tests +mix format # Format code +mix creds check # Check credentials +``` + +# Configuration + +Add to `config/config.exs`: + +```elixir +config :a2ml_ex, + default_trust_level: :reviewed, + strict_mode: true +``` + +# Related Libraries + +- [a2ml-deno](https://github.com/hyperpolymath/a2ml-deno) — + Deno/ReScript implementation + +- [a2ml-rs](https://github.com/hyperpolymath/a2ml-rs) — Rust + implementation + +- [a2ml-haskell](https://github.com/hyperpolymath/a2ml-haskell) — + Haskell implementation + +- [a2ml_gleam](https://github.com/hyperpolymath/a2ml_gleam) — Gleam + implementation + +- [tree-sitter-a2ml](https://github.com/hyperpolymath/tree-sitter-a2ml) + — Tree-sitter grammar + +- [vscode-a2ml](https://github.com/hyperpolymath/vscode-a2ml) — VS Code + extension + +# Trust Levels + +A2ML supports four trust levels in a hierarchy: + +| Level | Meaning | +|---------------|----------------------------------------------------------| +| `:unverified` | Content has not been reviewed or attested | +| `:automated` | Content generated or verified by automated systems | +| `:reviewed` | Content reviewed by human but not formally verified | +| `:verified` | Content formally verified with cryptographic attestation | + +# Directives + +Directives provide metadata and processing instructions: + + @page-break + + @toc(depth=3): Table of Contents + + @include(file="chapter1.a2ml"): + + @template(name="article"): + # {title} + By {author} + + {content} + @end + +# Attestations + +Attestations provide cryptographic provenance: + + !attest + identity: Alice Smith + role: Editor + trust-level: verified + timestamp: 2026-03-16T12:00:00Z + signature: 0xabc123... + !end + +# Performance + +The Elixir implementation is optimized for: + +- Fast parsing of large documents + +- Memory-efficient AST representation + +- Concurrent rendering capabilities + +- Stream processing support + +# License + +SPDX-License-Identifier: CC-BY-SA-4.0 + +Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) + +See [LICENSE](LICENSE) for full license text. + +# Contributing + +See CONTRIBUTING for +contribution guidelines. + +# Roadmap + +See ROADMAP for planned features +and enhancements. diff --git a/ex/SECURITY.md b/ex/SECURITY.md new file mode 100644 index 0000000..25dd53b --- /dev/null +++ b/ex/SECURITY.md @@ -0,0 +1,64 @@ +# Security Policy + + + + +## Supported Versions + +| Version | Supported | +| ------- | ------------------ | +| 0.x.x | :white_check_mark: | + +## Reporting a Vulnerability + +**Do not report security vulnerabilities through public GitHub issues.** + +Instead, please report them via: + +1. **Email**: security@hyperpolymath.org (preferred) +2. **GitHub Security Advisories**: [Create a private advisory](https://github.com/hyperpolymath/a2ml_ex/security/advisories/new) + +### What to include + +- Type of vulnerability (injection, deserialization, etc.) +- Full path to affected source file(s) +- Step-by-step instructions to reproduce +- Proof-of-concept or exploit code (if available) +- Impact assessment + +### Response Timeline + +- **Acknowledgment**: Within 48 hours +- **Initial assessment**: Within 7 days +- **Resolution target**: Within 90 days (may vary based on severity) + +### Safe Harbor + +We consider security research conducted in accordance with this policy to be: +- Authorized +- Lawful +- Helpful + +We will not pursue legal action against researchers who follow this policy. + +## Security Measures + +This project implements: + +- [x] Dependabot alerts enabled +- [x] CodeQL static analysis +- [x] OpenSSF Scorecard compliance +- [x] Signed commits required +- [x] Branch protection enabled +- [x] Zero runtime dependencies beyond Elixir standard library + +## Known Limitations + +The A2ML parser processes untrusted input. While the Elixir implementation +benefits from BEAM VM memory safety: + +1. **Parser input** may contain maliciously crafted documents +2. **Directive evaluation** does not execute arbitrary code +3. **Trust level assertions** are metadata only — they do not provide cryptographic guarantees without external verification + +Report issues in any layer — we take all security concerns seriously. diff --git a/ex/TEST-NEEDS.md b/ex/TEST-NEEDS.md new file mode 100644 index 0000000..a58a7f8 --- /dev/null +++ b/ex/TEST-NEEDS.md @@ -0,0 +1,49 @@ +# TEST-NEEDS — a2ml_ex + + + + +## CRG Grade: C — ACHIEVED 2026-04-04 + +## CRG C — Test Coverage Achieved + +CRG C gate requires: unit, smoke, build, P2P (property-based), E2E, +reflexive, contract, aspect, and benchmark tests. + +| Category | File | Count | Notes | +|---------------|-------------------------------|-------|---------------------------------------------| +| Unit | `test/a2_ml_test.exs` | 13 | Parser, renderer, trust levels, attestation | +| Smoke | `test/a2_ml_test.exs` | — | Covered by minimal parse/render tests | +| Build | `mix compile` | — | CI gate | +| Property/P2P | `test/a2ml_property_test.exs` | 6 | Determinism, anti-symmetry, round-trips | +| E2E | `test/a2_ml_test.exs` | 1 | Full parse/render/re-parse roundtrip | +| Reflexive | `test/a2ml_property_test.exs` | 1 | `compare(x,x) == :eq` for all levels | +| Contract | `test/a2ml_contract_test.exs` | 11 | Named invariants (error/ok guarantees) | +| Aspect | `test/a2ml_aspect_test.exs` | 11 | Security, correctness, performance, resilience | +| Benchmark | `test/a2ml_bench_test.exs` | 4 | Timing guards (parse/render/roundtrip) | + +**Total: 48 tests, 0 failures** + +## Running Tests + +```bash +mix test +``` + +## Test Taxonomy (Testing Taxonomy v1.0) + +- **Unit**: individual function correctness +- **Smoke**: essential path does not crash +- **Build**: compilation gate (mix compile) +- **Property/P2P**: determinism, algebraic laws, invariants over many inputs +- **E2E**: full parse → render → re-parse pipeline +- **Reflexive**: `compare(x,x) == :eq` identity laws +- **Contract**: named behavioural invariants (error-tuple guarantee, etc.) +- **Aspect**: cross-cutting concerns (security input safety, performance bounds, resilience) +- **Benchmark**: wall-clock regression guards + +## Remaining Gaps (Future Work) + +- Real fuzz harness (the `tests/fuzz/placeholder.txt` is a scorecard placeholder only) +- Cross-implementation comparison benchmarks vs a2ml-rs and a2ml-deno +- Concurrency stress tests (if GenServer is added) diff --git a/ex/TOPOLOGY.md b/ex/TOPOLOGY.md new file mode 100644 index 0000000..ade4a16 --- /dev/null +++ b/ex/TOPOLOGY.md @@ -0,0 +1,28 @@ + + +# TOPOLOGY.md — a2ml_ex + +## Purpose + +Elixir implementation of the A2ML (Attested Markup Language) parser and renderer. Provides a complete parse-render round-trip for A2ML documents using native Elixir structs. Intended for integration with Phoenix/BEAM applications and Elixir toolchains. + +## Module Map + +``` +a2ml_ex/ +├── lib/ +│ ├── a2ml/ +│ │ ├── core/ # Parser core logic +│ │ ├── errors/ # Error structs +│ │ ├── aspects/ # Cross-cutting concerns +│ │ └── (bridges, contracts, definitions) +│ └── a2_ml.ex # Top-level module entry point +├── mix.exs # Mix project config +└── deps/ # Dependencies +``` + +## Data Flow + +``` +[A2ML text] ──► [A2ML.Parser] ──► [Typed structs] ──► [A2ML.Renderer] ──► [A2ML text] +``` diff --git a/ex/a2ml_ex-0.1.0/.formatter.exs b/ex/a2ml_ex-0.1.0/.formatter.exs new file mode 100644 index 0000000..d2cda26 --- /dev/null +++ b/ex/a2ml_ex-0.1.0/.formatter.exs @@ -0,0 +1,4 @@ +# Used by "mix format" +[ + inputs: ["{mix,.formatter}.exs", "{config,lib,test}/**/*.{ex,exs}"] +] diff --git a/ex/a2ml_ex-0.1.0/LICENSE b/ex/a2ml_ex-0.1.0/LICENSE new file mode 100644 index 0000000..f7a3dc8 --- /dev/null +++ b/ex/a2ml_ex-0.1.0/LICENSE @@ -0,0 +1,372 @@ +Mozilla Public License Version 2.0 +================================== + +1. Definitions +-------------- + +1.1. "Contributor" + means each individual or legal entity that creates, contributes to + the creation of, or owns Covered Software. + +1.2. "Contributor Version" + means the combination of the Contributions of others (if any) used + by a Contributor and that particular Contributor's Contribution. + +1.3. "Contribution" + means Covered Software of a particular Contributor. + +1.4. "Covered Software" + means Source Code Form to which the initial Contributor has attached + the notice in Exhibit A, the Executable Form of such Source Code + Form, and Modifications of such Source Code Form, in each case + including portions thereof. + +1.5. "Incompatible With Secondary Licenses" + means + + (a) that the initial Contributor has attached the notice described + in Exhibit B to the Covered Software; or + + (b) that the Covered Software was made available under the terms of + version 1.1 or earlier of the License, but not also under the + terms of a Secondary License. + +1.6. "Executable Form" + means any form of the work other than Source Code Form. + +1.7. "Larger Work" + means a work that combines Covered Software with other material, in + a separate file or files, that is not Covered Software. + +1.8. "License" + means this document. + +1.9. "Licensable" + means having the right to grant, to the maximum extent possible, + whether at the time of the initial grant or subsequently, any and + all of the rights conveyed by this License. + +1.10. "Modifications" + means any of the following: + + (a) any file in Source Code Form that results from an addition to, + deletion from, or modification of the contents of Covered + Software; or + + (b) any new file in Source Code Form that contains any Covered + Software. + +1.11. "Patent Claims" of a Contributor + means any patent claim(s), including without limitation, method, + process, and apparatus claims, in any patent Licensable by such + Contributor that would be infringed, but for the grant of the + License, by the making, using, selling, offering for sale, having + made, import, or transfer of either its Contributions or its + Contributor Version. + +1.12. "Secondary License" + means either the GNU General Public License, Version 2.0, the GNU + Lesser General Public License, Version 2.1, the GNU Affero General + Public License, Version 3.0, or any later versions of those + licenses. + +1.13. "Source Code Form" + means the form of the work preferred for making modifications. + +1.14. "You" (or "Your") + means an individual or a legal entity exercising rights under this + License. For legal entities, "You" includes any entity that + controls, is controlled by, or is under common control with You. For + purposes of this definition, "control" means (a) the power, direct + or indirect, to cause the direction or management of such entity, + whether by contract or otherwise, or (b) ownership of more than + fifty percent (50%) of the outstanding shares or beneficial + ownership of such entity. + +2. License Grants and Conditions +-------------------------------- + +2.1. Grants + +Each Contributor hereby grants You a world-wide, royalty-free, +non-exclusive license: + +(a) under intellectual property rights (other than patent or trademark) + Licensable by such Contributor to use, reproduce, make available, + modify, display, perform, distribute, and otherwise exploit its + Contributions, either on an unmodified basis, with Modifications, or + as part of a Larger Work; and + +(b) under Patent Claims of such Contributor to make, use, sell, offer + for sale, have made, import, and otherwise transfer either its + Contributions or its Contributor Version. + +2.2. Effective Date + +The licenses granted in Section 2.1 with respect to any Contribution +become effective for each Contribution on the date the Contributor first +distributes such Contribution. + +2.3. Limitations on Grant Scope + +The licenses granted in this Section 2 are the only rights granted under +this License. No additional rights or licenses will be implied from the +distribution or licensing of Covered Software under this License. +Notwithstanding Section 2.1(b) above, no patent license is granted by a +Contributor: + +(a) for any code that a Contributor has removed from Covered Software; + or + +(b) for infringements caused by: (i) Your and any other third party's + modifications of Covered Software, or (ii) the combination of its + Contributions with other software (except as part of its Contributor + Version); or + +(c) under Patent Claims infringed by Covered Software in the absence of + its Contributions. + +This License does not grant any rights in the trademarks, service marks, +or logos of any Contributor (except as may be necessary to comply with +the notice requirements in Section 3.4). + +2.4. Subsequent Licenses + +No Contributor makes additional grants as a result of Your choice to +distribute the Covered Software under a subsequent version of this +License (see Section 10.2) or under the terms of a Secondary License (if +permitted under the terms of Section 3.3). + +2.5. Representation + +Each Contributor represents that the Contributor believes its +Contributions are its original creation(s) or it has sufficient rights +to grant the rights to its Contributions conveyed by this License. + +2.6. Fair Use + +This License is not intended to limit any rights You have under +applicable copyright doctrines of fair use, fair dealing, or other +equivalents. + +2.7. Conditions + +Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted +in Section 2.1. + +3. Responsibilities +------------------- + +3.1. Distribution of Source Form + +All distribution of Covered Software in Source Code Form, including any +Modifications that You create or to which You contribute, must be under +the terms of this License. You must inform recipients that the Source +Code Form of the Covered Software is governed by the terms of this +License, and how they can obtain a copy of this License. You may not +attempt to alter or restrict the recipients' rights in the Source Code +Form. + +3.2. Distribution of Executable Form + +If You distribute Covered Software in Executable Form then: + +(a) such Covered Software must also be made available in Source Code + Form, as described in Section 3.1, and You must inform recipients of + the Executable Form how they can obtain a copy of such Source Code + Form by reasonable means in a timely manner, at a charge no more + than the cost of distribution to the recipient; and + +(b) You may distribute such Executable Form under the terms of this + License, or sublicense it under different terms, provided that the + license for the Executable Form does not attempt to limit or alter + the recipients' rights in the Source Code Form under this License. + +3.3. Distribution of a Larger Work + +You may create and distribute a Larger Work under terms of Your choice, +provided that You also comply with the requirements of this License for +the Covered Software. If the Larger Work is a combination of Covered +Software with a work governed by one or more Secondary Licenses, and the +Covered Software is not Incompatible With Secondary Licenses, this +License permits You to additionally distribute such Covered Software +under the terms of such Secondary License(s), so that the recipient of +the Larger Work may, at their option, further distribute the Covered +Software under the terms of either this License or such Secondary +License(s). + +3.4. Notices + +You may not remove or alter the substance of any license notices +(including copyright notices, patent notices, disclaimers of warranty, +or limitations of liability) contained within the Source Code Form of +the Covered Software, except that You may alter any license notices to +the extent required to remedy known factual inaccuracies. + +3.5. Application of Additional Terms + +You may choose to offer, and to charge a fee for, warranty, support, +indemnity or liability obligations to one or more recipients of Covered +Software. However, You may do so only on Your own behalf, and not on +behalf of any Contributor. You must make it absolutely clear that any +such warranty, support, indemnity, or liability obligation is offered by +You alone, and You hereby agree to indemnify every Contributor for any +liability incurred by such Contributor as a result of warranty, support, +indemnity or liability terms You offer. You may include additional +disclaimers of warranty and limitations of liability specific to any +jurisdiction. + +4. Inability to Comply Due to Statute or Regulation +--------------------------------------------------- + +If it is impossible for You to comply with any of the terms of this +License with respect to some or all of the Covered Software due to +statute, judicial order, or regulation then You must: (a) comply with +the terms of this License to the maximum extent possible; and (b) +describe the limitations and the code they affect. Such description must +be placed in a text file included with all distributions of the Covered +Software under the name "LEGAL", and must be included in all +distributions of the Covered Software in Source Code Form. + +5. Termination +-------------- + +5.1. The rights granted under this License will terminate automatically +if You fail to comply with any of its terms. However, if You become +compliant, then the rights granted under this License from a particular +Contributor are reinstated (a) provisionally, unless and until such +Contributor explicitly and finally terminates Your grants, and (b) on an +ongoing basis, if such Contributor fails to notify You of the +non-compliance by some reasonable means prior to 60 days after You have +come back into compliance. Moreover, Your grants from a particular +Contributor are reinstated on an ongoing basis if such Contributor +notifies You of the non-compliance by some reasonable means, this is the +first time You have received notice of non-compliance with this License +from such Contributor, and You become compliant prior to 30 days after +Your receipt of the notice. + +5.2. If You initiate litigation against any entity by asserting a patent +infringement claim (excluding declaratory judgment actions, +counter-claims, and cross-claims) alleging that a Contributor Version +directly or indirectly infringes any patent, then the rights granted to +You by any and all Contributors for the Covered Software under Section +2.1 of this License shall terminate. + +5.3. In the event of termination under Sections 5.1 or 5.2 above, all +end user license agreements (excluding distributors and resellers) which +have been validly granted by You or Your distributors under this License +prior to termination shall survive termination. + +************************************************************************ +* * +* 6. Disclaimer of Warranty * +* ------------------------- * +* * +* Covered Software is provided under this License on an "as is" * +* basis, without warranty of any kind, either expressed, implied, or * +* statutory, including, without limitation, warranties that the * +* Covered Software is free of defects, merchantable, fit for a * +* particular purpose or non-infringing. The entire risk as to the * +* quality and performance of the Covered Software is with You. * +* Should any Covered Software prove defective in any respect, You * +* (not any Contributor) assume the cost of any necessary servicing, * +* repair, or correction. This disclaimer of warranty constitutes an * +* essential part of this License. No use of any Covered Software is * +* authorized under this License except under this disclaimer. * +* * +************************************************************************ + +************************************************************************ +* * +* 7. Limitation of Liability * +* -------------------------- * +* * +* Under no circumstances and under no legal theory, whether tort * +* (including negligence), contract, or otherwise, shall any * +* Contributor, or anyone who distributes Covered Software as * +* permitted above, be liable to You for any direct, indirect, * +* special, incidental, or consequential damages of any character * +* including, without limitation, damages for lost profits, loss of * +* goodwill, work stoppage, computer failure or malfunction, or any * +* and all other commercial damages or losses, even if such party * +* shall have been informed of the possibility of such damages. This * +* limitation of liability shall not apply to liability for death or * +* personal injury resulting from such party's negligence to the * +* extent applicable law prohibits such limitation. Some * +* jurisdictions do not allow the exclusion or limitation of * +* incidental or consequential damages, so this exclusion and * +* limitation may not apply to You. * +* * +************************************************************************ + +8. Litigation +------------- + +Any litigation relating to this License may be brought only in the +courts of a jurisdiction where the defendant maintains its principal +place of business and such litigation shall be governed by laws of that +jurisdiction, without reference to its conflict-of-law provisions. +Nothing in this Section shall prevent a party's ability to bring +cross-claims or counter-claims. + +9. Miscellaneous +---------------- + +This License represents the complete agreement concerning the subject +matter hereof. If any provision of this License is held to be +unenforceable, such provision shall be reformed only to the extent +necessary to make it enforceable. Any law or regulation which provides +that the language of a contract shall be construed against the drafter +shall not be used to construe this License against a Contributor. + +10. Versions of the License +--------------------------- + +10.1. New Versions + +Mozilla Foundation is the license steward. Except as provided in Section +10.3, no one other than the license steward has the right to modify or +publish new versions of this License. Each version will be given a +distinguishing version number. + +10.2. Effect of New Versions + +You may distribute the Covered Software under the terms of the version +of the License under which You originally received the Covered Software, +or under the terms of any subsequent version published by the license +steward. + +10.3. Modified Versions + +If you create software not governed by this License, and you want to +create a new license for such software, you may create and use a +modified version of this License if you rename the license and remove +any references to the name of the license steward (except to note that +such modified license differs from this License). + +10.4. Distributing Source Code Form that is Incompatible With Secondary +Licenses + +If You choose to distribute Source Code Form that is Incompatible With +Secondary Licenses under the terms of this version of the License, the +notice described in Exhibit B of this License must be attached. + +Exhibit A - Source Code Form License Notice +------------------------------------------- + + This Source Code Form is subject to the terms of the Mozilla Public + License, v. 2.0. If a copy of the MPL was not distributed with this + file, You can obtain one at https://mozilla.org/MPL/2.0/. + +If it is not possible or desirable to put the notice in a particular +file, then You may include the notice in a location (such as a LICENSE +file in a relevant directory) where a recipient would be likely to look +for such a notice. + +You may add additional accurate notices of copyright ownership. + +Exhibit B - "Incompatible With Secondary Licenses" Notice +--------------------------------------------------------- + + This Source Code Form is "Incompatible With Secondary Licenses", as + defined by the Mozilla Public License, v. 2.0. diff --git a/ex/a2ml_ex-0.1.0/README.adoc b/ex/a2ml_ex-0.1.0/README.adoc new file mode 100644 index 0000000..0191b94 --- /dev/null +++ b/ex/a2ml_ex-0.1.0/README.adoc @@ -0,0 +1,232 @@ += a2ml_ex +:toc: preamble +:icons: font + +== Overview + +**Elixir implementation of A2ML (Attested Markup Language) parser and renderer.** + +A2ML is a structured markup language with built-in attestation provenance, directive metadata, and trust-level tracking. This library provides a complete parser and renderer for A2ML documents in pure Elixir. + +== Features + +* Parse A2ML documents from strings or files +* Render AST back to A2ML surface syntax (round-trip support) +* Typed AST with structs for blocks, inlines, directives, and attestations +* Trust-level hierarchy: `:unverified`, `:automated`, `:reviewed`, `:verified` +* Directive blocks with key-value attributes +* Attestation provenance chain +* Zero dependencies beyond Elixir standard library + +== Quick Start + +Add to your `mix.exs`: + +[source,elixir] +---- +defp deps do + [{:a2ml_ex, git: "https://github.com/hyperpolymath/a2ml_ex.git"}] +end +---- + +Then run: + +[source,bash] +---- +mix deps.get +mix compile +---- + +== Usage + +[source,elixir] +---- +# Parse A2ML document +{:ok, document} = A2ML.parse("# Hello World\n\nSome **bold** text.") + +# Render back to A2ML +{:ok, rendered} = A2ML.render(document) + +# Handle parse errors +{:error, %A2ML.ParseError{}} = A2ML.parse("invalid syntax") +---- + +== Module Structure + +[cols="1,3"] +|=== +| Module | Purpose + +| `A2ML` +| Main module - re-exports public API + +| `A2ML.Document` +| Document struct and functions + +| `A2ML.Block` +| Block-level elements (headings, paragraphs, lists, etc.) + +| `A2ML.Inline` +| Inline elements (bold, italic, code, links, etc.) + +| `A2ML.Directive` +| Directive blocks with attributes + +| `A2ML.Attestation` +| Attestation provenance and trust levels + +| `A2ML.Parser` +| Parser implementation (string to AST) + +| `A2ML.Renderer` +| Renderer implementation (AST to string) + +| `A2ML.Error` +| Error types and handling +|=== + +== A2ML Syntax Reference + +[source] +---- +# Heading + +Paragraph with **bold**, *italic*, `code`, [link](url), and @ref(id). + +@directive-name(key=val): single line value + +@multi-line: +Content spanning +multiple lines +@end + +!attest +identity: Jonathan D.A. Jewell +role: author +trust-level: verified +timestamp: 2026-03-16T00:00:00Z +!end + +- Bullet list item +- Another item + +> Block quote text + +```elixir +defmodule Example do + def hello, do: "world" +end +``` +---- + +== Development + +[source,bash] +---- +mix deps.get # Install dependencies +mix compile # Compile project +mix test # Run tests +mix format # Format code +mix creds check # Check credentials +---- + +== Configuration + +Add to `config/config.exs`: + +[source,elixir] +---- +config :a2ml_ex, + default_trust_level: :reviewed, + strict_mode: true +---- + +== Related Libraries + +* link:https://github.com/hyperpolymath/a2ml-deno[a2ml-deno] — Deno/ReScript implementation +* link:https://github.com/hyperpolymath/a2ml-rs[a2ml-rs] — Rust implementation +* link:https://github.com/hyperpolymath/a2ml-haskell[a2ml-haskell] — Haskell implementation +* link:https://github.com/hyperpolymath/a2ml_gleam[a2ml_gleam] — Gleam implementation +* link:https://github.com/hyperpolymath/tree-sitter-a2ml[tree-sitter-a2ml] — Tree-sitter grammar +* link:https://github.com/hyperpolymath/vscode-a2ml[vscode-a2ml] — VS Code extension + +== Trust Levels + +A2ML supports four trust levels in a hierarchy: + +[cols="1,3"] +|=== +| Level | Meaning + +| `:unverified` +| Content has not been reviewed or attested + +| `:automated` +| Content generated or verified by automated systems + +| `:reviewed` +| Content reviewed by human but not formally verified + +| `:verified` +| Content formally verified with cryptographic attestation +|=== + +== Directives + +Directives provide metadata and processing instructions: + +[source] +---- +@page-break + +@toc(depth=3): Table of Contents + +@include(file="chapter1.a2ml"): + +@template(name="article"): +# {title} +By {author} + +{content} +@end +---- + +== Attestations + +Attestations provide cryptographic provenance: + +[source] +---- +!attest +identity: Alice Smith +role: Editor +trust-level: verified +timestamp: 2026-03-16T12:00:00Z +signature: 0xabc123... +!end +---- + +== Performance + +The Elixir implementation is optimized for: + +* Fast parsing of large documents +* Memory-efficient AST representation +* Concurrent rendering capabilities +* Stream processing support + +== License + +SPDX-License-Identifier: CC-BY-SA-4.0 + +Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) + +See link:LICENSE[LICENSE] for full license text. + +== Contributing + +See link:CONTRIBUTING.adoc[CONTRIBUTING.adoc] for contribution guidelines. + +== Roadmap + +See link:ROADMAP.adoc[ROADMAP.adoc] for planned features and enhancements. \ No newline at end of file diff --git a/ex/a2ml_ex-0.1.0/hex_metadata.config b/ex/a2ml_ex-0.1.0/hex_metadata.config new file mode 100644 index 0000000..1d1c0b2 --- /dev/null +++ b/ex/a2ml_ex-0.1.0/hex_metadata.config @@ -0,0 +1,17 @@ +{<<"links">>, + [{<<"A2ML Specification">>, + <<"https://github.com/hyperpolymath/a2ml-showcase">>}, + {<<"GitHub">>,<<"https://github.com/hyperpolymath/a2ml_ex">>}]}. +{<<"name">>,<<"a2ml_ex">>}. +{<<"version">>,<<"0.1.0">>}. +{<<"description">>, + <<"A2ML (AI Attestation Markup Language) parser and renderer for Elixir.">>}. +{<<"elixir">>,<<"~> 1.14">>}. +{<<"app">>,<<"a2ml_ex">>}. +{<<"licenses">>,[<<"MPL-2.0">>]}. +{<<"requirements">>,[]}. +{<<"files">>, + [<<"lib">>,<<"lib/a2_ml.ex">>,<<"lib/a2ml">>,<<"lib/a2ml/types.ex">>, + <<"lib/a2ml/parser.ex">>,<<"lib/a2ml/renderer.ex">>,<<".formatter.exs">>, + <<"mix.exs">>,<<"README.adoc">>,<<"LICENSE">>]}. +{<<"build_tools">>,[<<"mix">>]}. diff --git a/ex/a2ml_ex-0.1.0/lib/a2_ml.ex b/ex/a2ml_ex-0.1.0/lib/a2_ml.ex new file mode 100644 index 0000000..c4ff76e --- /dev/null +++ b/ex/a2ml_ex-0.1.0/lib/a2_ml.ex @@ -0,0 +1,42 @@ +# SPDX-License-Identifier: MPL-2.0 +# (MPL-2.0 preferred; MPL-2.0 required for Hex.pm) + +defmodule A2ML do + @moduledoc """ + A2ML (AI Attestation Markup Language) parser and renderer. + + Provides types, parsing, and rendering for A2ML documents — a lightweight + markup format designed for AI-generated content with provenance tracking + through attestation chains and trust levels. + + ## Quick Start + + iex> {:ok, doc} = A2ML.parse("# Hello\\n\\n@version 1.0\\n\\nA paragraph.") + iex> A2ML.render(doc) + + ## Modules + + - `A2ML.Types` — Core data structures (Document, Block, Attestation, etc.) + - `A2ML.Parser` — Parse A2ML text into a Document AST + - `A2ML.Renderer` — Render a Document AST back to A2ML text + """ + + alias A2ML.Parser + alias A2ML.Renderer + + @doc """ + Parse an A2ML-formatted string into a Document. + + Delegates to `A2ML.Parser.parse/1`. + """ + @spec parse(String.t()) :: {:ok, A2ML.Types.Document.t()} | {:error, term()} + defdelegate parse(input), to: Parser + + @doc """ + Render a Document back to A2ML-formatted text. + + Delegates to `A2ML.Renderer.render/1`. + """ + @spec render(A2ML.Types.Document.t()) :: String.t() + defdelegate render(doc), to: Renderer +end diff --git a/ex/a2ml_ex-0.1.0/lib/a2ml/parser.ex b/ex/a2ml_ex-0.1.0/lib/a2ml/parser.ex new file mode 100644 index 0000000..e1dc1ea --- /dev/null +++ b/ex/a2ml_ex-0.1.0/lib/a2ml/parser.ex @@ -0,0 +1,453 @@ +# SPDX-License-Identifier: MPL-2.0 +# (MPL-2.0 preferred; MPL-2.0 required for Hex.pm) + +defmodule A2ML.Parser do + @moduledoc """ + A2ML document parser. + + Parses A2ML-formatted text into a structured `A2ML.Types.Document` AST. + A2ML syntax is similar to Markdown with extensions for directives (`@`) + and attestation blocks (`!attest`). + """ + + alias A2ML.Types.{Attestation, Directive, Document, TrustLevel} + + @doc """ + Parse an A2ML-formatted string into a Document. + + Returns `{:ok, document}` on success or `{:error, reason}` on failure. + + ## Examples + + iex> A2ML.Parser.parse("# Hello\\n\\nA paragraph.") + {:ok, %A2ML.Types.Document{title: "Hello", blocks: [_], ...}} + + """ + @spec parse(String.t()) :: {:ok, Document.t()} | {:error, term()} + def parse(input) when is_binary(input) do + trimmed = String.trim(input) + + case trimmed do + "" -> + {:error, :empty_input} + + _ -> + {:ok, parse_document(trimmed)} + end + end + + # --------------------------------------------------------------------------- + # Internal parsing + # --------------------------------------------------------------------------- + + defp parse_document(input) do + lines = String.split(input, "\n") + {title, rest_lines} = extract_title(lines) + blocks = parse_blocks(rest_lines) + + directives = extract_directives(blocks) + attestations = extract_attestations(blocks) + + %Document{ + title: title, + directives: directives, + blocks: blocks, + attestations: attestations + } + end + + defp extract_title([first | rest]) do + trimmed = String.trim(first) + + case trimmed do + "# " <> title -> {title, rest} + _ -> {nil, [first | rest]} + end + end + + defp extract_title([]), do: {nil, []} + + defp parse_blocks(lines), do: parse_blocks(lines, []) + + defp parse_blocks([], acc), do: Enum.reverse(acc) + + defp parse_blocks([line | rest], acc) do + trimmed = String.trim(line) + + cond do + # Skip blank lines. + trimmed == "" -> + parse_blocks(rest, acc) + + # Thematic break. + trimmed in ["---", "----", "-----"] -> + parse_blocks(rest, [:thematic_break | acc]) + + # Code block. + String.starts_with?(trimmed, "```") -> + lang = String.trim(String.slice(trimmed, 3..-1//1)) + lang = if lang == "", do: nil, else: lang + {code_lines, remaining} = collect_code_block(rest) + content = Enum.join(code_lines, "\n") + parse_blocks(remaining, [{:code_block, lang, content} | acc]) + + # Directive. + String.starts_with?(trimmed, "@") -> + directive = parse_directive_line(trimmed) + parse_blocks(rest, [{:directive, directive} | acc]) + + # Attestation. + String.starts_with?(trimmed, "!attest") -> + {attest_lines, remaining} = collect_indented_block(rest) + attestation = parse_attestation_block([trimmed | attest_lines]) + parse_blocks(remaining, [{:attestation, attestation} | acc]) + + # Heading. + String.starts_with?(trimmed, "#") -> + {level, text} = parse_heading_line(trimmed) + inlines = parse_inlines(text) + parse_blocks(rest, [{:heading, level, inlines} | acc]) + + # Block quote. + String.starts_with?(trimmed, ">") -> + {quote_lines, remaining} = collect_prefixed_block([line | rest], ">") + + stripped = + Enum.map(quote_lines, fn l -> + t = String.trim(l) + + cond do + String.starts_with?(t, "> ") -> String.slice(t, 2..-1//1) + String.starts_with?(t, ">") -> String.slice(t, 1..-1//1) + true -> t + end + end) + + inner_blocks = parse_blocks(stripped) + parse_blocks(remaining, [{:block_quote, inner_blocks} | acc]) + + # Unordered list. + String.starts_with?(trimmed, "- ") or String.starts_with?(trimmed, "* ") -> + {list_lines, remaining} = collect_list_block([line | rest]) + items = parse_list_items(list_lines, false) + parse_blocks(remaining, [{:list_block, false, items} | acc]) + + # Ordered list. + ordered_list_start?(trimmed) -> + {list_lines, remaining} = collect_list_block([line | rest]) + items = parse_list_items(list_lines, true) + parse_blocks(remaining, [{:list_block, true, items} | acc]) + + # Paragraph (default). + true -> + {para_lines, remaining} = collect_paragraph([line | rest]) + text = Enum.join(para_lines, " ") + inlines = parse_inlines(text) + parse_blocks(remaining, [{:paragraph, inlines} | acc]) + end + end + + defp collect_code_block(lines), do: collect_code_block(lines, []) + + defp collect_code_block([], acc), do: {Enum.reverse(acc), []} + + defp collect_code_block([line | rest], acc) do + if String.starts_with?(String.trim(line), "```") do + {Enum.reverse(acc), rest} + else + collect_code_block(rest, [line | acc]) + end + end + + defp collect_indented_block(lines), do: collect_indented_block(lines, []) + + defp collect_indented_block([], acc), do: {Enum.reverse(acc), []} + + defp collect_indented_block([line | rest] = lines, acc) do + if String.starts_with?(line, " ") or String.starts_with?(line, "\t") do + collect_indented_block(rest, [String.trim(line) | acc]) + else + {Enum.reverse(acc), lines} + end + end + + defp collect_prefixed_block(lines, prefix), + do: collect_prefixed_block(lines, prefix, []) + + defp collect_prefixed_block([], _prefix, acc), do: {Enum.reverse(acc), []} + + defp collect_prefixed_block([line | rest] = lines, prefix, acc) do + trimmed = String.trim(line) + + if String.starts_with?(trimmed, prefix) do + collect_prefixed_block(rest, prefix, [line | acc]) + else + {Enum.reverse(acc), lines} + end + end + + defp collect_list_block(lines), do: collect_list_block(lines, []) + + defp collect_list_block([], acc), do: {Enum.reverse(acc), []} + + defp collect_list_block([line | rest] = lines, acc) do + trimmed = String.trim(line) + + cond do + trimmed == "" -> + {Enum.reverse(acc), rest} + + String.starts_with?(trimmed, "- ") or + String.starts_with?(trimmed, "* ") or + ordered_list_start?(trimmed) or + String.starts_with?(line, " ") or + String.starts_with?(line, "\t") -> + collect_list_block(rest, [line | acc]) + + true -> + {Enum.reverse(acc), lines} + end + end + + defp collect_paragraph(lines), do: collect_paragraph(lines, []) + + defp collect_paragraph([], acc), do: {Enum.reverse(acc), []} + + defp collect_paragraph([line | rest] = lines, acc) do + trimmed = String.trim(line) + + cond do + trimmed == "" -> + {Enum.reverse(acc), rest} + + String.starts_with?(trimmed, "#") or + String.starts_with?(trimmed, "@") or + String.starts_with?(trimmed, "!attest") or + String.starts_with?(trimmed, "```") or + String.starts_with?(trimmed, ">") or + trimmed in ["---", "----", "-----"] -> + {Enum.reverse(acc), lines} + + true -> + collect_paragraph(rest, [trimmed | acc]) + end + end + + defp parse_heading_line(line) do + level = count_leading_hashes(line, 0) + text = String.trim(String.slice(line, level..-1//1)) + {level, text} + end + + defp count_leading_hashes("#" <> rest, n), do: count_leading_hashes(rest, n + 1) + defp count_leading_hashes(_, n), do: n + + defp ordered_list_start?(line) do + case String.split(line, ". ", parts: 2) do + [prefix, _rest] when prefix != "" -> String.match?(prefix, ~r/^\d+$/) + _ -> false + end + end + + defp parse_directive_line(line) do + without_at = String.trim(String.slice(line, 1..-1//1)) + + case String.split(without_at, " ", parts: 2) do + [name, value] -> + %Directive{name: String.trim(name), value: String.trim(value)} + + [name] -> + %Directive{name: String.trim(name), value: ""} + end + end + + defp parse_attestation_block(lines) do + fields = parse_key_value_lines(lines) + identity = Map.get(fields, "identity", "") + role = Map.get(fields, "role", "") + + trust_level = + case TrustLevel.from_string(Map.get(fields, "trust-level", "")) do + {:ok, tl} -> tl + {:error, _} -> :unverified + end + + %Attestation{ + identity: identity, + role: role, + trust_level: trust_level, + timestamp: Map.get(fields, "timestamp"), + note: Map.get(fields, "note") + } + end + + defp parse_key_value_lines(lines) do + lines + |> Enum.reduce(%{}, fn line, acc -> + trimmed = String.trim(line) + + case String.split(trimmed, ":", parts: 2) do + [key, value] -> + Map.put(acc, String.downcase(String.trim(key)), String.trim(value)) + + _ -> + acc + end + end) + end + + defp parse_list_items(lines, _ordered) do + lines + |> split_list_items() + |> Enum.map(fn item_lines -> + text = Enum.join(item_lines, " ") + inlines = parse_inlines(text) + [{:paragraph, inlines}] + end) + end + + defp split_list_items(lines), do: split_list_items(lines, [], []) + + defp split_list_items([], current, acc) do + case current do + [] -> Enum.reverse(acc) + _ -> Enum.reverse([Enum.reverse(current) | acc]) + end + end + + defp split_list_items([line | rest], current, acc) do + trimmed = String.trim(line) + + if String.starts_with?(trimmed, "- ") or + String.starts_with?(trimmed, "* ") or + ordered_list_start?(trimmed) do + item_text = strip_list_marker(trimmed) + + new_acc = + case current do + [] -> acc + _ -> [Enum.reverse(current) | acc] + end + + split_list_items(rest, [item_text], new_acc) + else + split_list_items(rest, [trimmed | current], acc) + end + end + + defp strip_list_marker("- " <> rest), do: rest + defp strip_list_marker("* " <> rest), do: rest + + defp strip_list_marker(line) do + case String.split(line, ". ", parts: 2) do + [prefix, rest] -> + if String.match?(prefix, ~r/^\d+$/), do: rest, else: line + + _ -> + line + end + end + + @doc """ + Parse inline elements from a text string. + + Handles: `**bold**`, `*italic*`, `` `code` ``, and `[text](url)` links. + """ + @spec parse_inlines(String.t()) :: [Inline.t()] + def parse_inlines(input), do: parse_inlines_acc(input, []) |> Enum.reverse() + + defp parse_inlines_acc("", acc), do: acc + + defp parse_inlines_acc("**" <> rest, acc) do + case String.split(rest, "**", parts: 2) do + [inner, after_close] -> + children = parse_inlines(inner) + parse_inlines_acc(after_close, [{:strong, children} | acc]) + + _ -> + {text, remaining} = take_until_special("**" <> rest) + parse_inlines_acc(remaining, [{:text, text} | acc]) + end + end + + defp parse_inlines_acc("*" <> rest, acc) do + case String.split(rest, "*", parts: 2) do + [inner, after_close] -> + children = parse_inlines(inner) + parse_inlines_acc(after_close, [{:emphasis, children} | acc]) + + _ -> + {text, remaining} = take_until_special("*" <> rest) + parse_inlines_acc(remaining, [{:text, text} | acc]) + end + end + + defp parse_inlines_acc("`" <> rest, acc) do + case String.split(rest, "`", parts: 2) do + [code, after_close] -> + parse_inlines_acc(after_close, [{:code, code} | acc]) + + _ -> + {text, remaining} = take_until_special("`" <> rest) + parse_inlines_acc(remaining, [{:text, text} | acc]) + end + end + + defp parse_inlines_acc("[" <> rest, acc) do + case String.split(rest, "](", parts: 2) do + [link_text, after_bracket] -> + case String.split(after_bracket, ")", parts: 2) do + [url, after_close] -> + content = parse_inlines(link_text) + parse_inlines_acc(after_close, [{:link, content, url} | acc]) + + _ -> + {text, remaining} = take_until_special("[" <> rest) + parse_inlines_acc(remaining, [{:text, text} | acc]) + end + + _ -> + {text, remaining} = take_until_special("[" <> rest) + parse_inlines_acc(remaining, [{:text, text} | acc]) + end + end + + defp parse_inlines_acc(input, acc) do + {text, remaining} = take_until_special(input) + parse_inlines_acc(remaining, [{:text, text} | acc]) + end + + defp take_until_special(input), do: take_until_special(input, "") + + defp take_until_special("", acc), do: {acc, ""} + + defp take_until_special(<> = input, acc) + when c in [?*, ?`, ?[] do + case acc do + "" -> + # Take one char literally to avoid infinite loop. + {<>, rest} + + _ -> + {acc, input} + end + end + + defp take_until_special(<>, acc) do + take_until_special(rest, acc <> <>) + end + + defp extract_directives(blocks) do + Enum.flat_map(blocks, fn + {:directive, d} -> [d] + _ -> [] + end) + end + + defp extract_attestations(blocks) do + Enum.flat_map(blocks, fn + {:attestation, a} -> [a] + _ -> [] + end) + end +end diff --git a/ex/a2ml_ex-0.1.0/lib/a2ml/renderer.ex b/ex/a2ml_ex-0.1.0/lib/a2ml/renderer.ex new file mode 100644 index 0000000..7479921 --- /dev/null +++ b/ex/a2ml_ex-0.1.0/lib/a2ml/renderer.ex @@ -0,0 +1,149 @@ +# SPDX-License-Identifier: MPL-2.0 +# (MPL-2.0 preferred; MPL-2.0 required for Hex.pm) + +defmodule A2ML.Renderer do + @moduledoc """ + Render an A2ML Document AST back to A2ML text. + + Produces A2ML-formatted output from a parsed Document structure, + suitable for round-tripping through parse -> modify -> render. + """ + + alias A2ML.Types.{Attestation, Document, TrustLevel} + + @doc """ + Render a Document to A2ML-formatted text. + + Produces a complete document string with title, blocks, and + appropriate blank-line separation. + """ + @spec render(Document.t()) :: String.t() + def render(%Document{} = doc) do + parts = + case doc.title do + nil -> [] + title -> ["# #{title}", ""] + end + + block_strings = + doc.blocks + |> Enum.map(&render_block/1) + |> Enum.intersperse("") + + parts = parts ++ block_strings + + parts + |> Enum.join("\n") + |> String.trim() + |> Kernel.<>("\n") + end + + @doc """ + Render a single Block to A2ML text. + """ + @spec render_block(A2ML.Types.Block.t()) :: String.t() + def render_block({:heading, level, inlines}) do + hashes = String.duplicate("#", level) + "#{hashes} #{render_inlines(inlines)}" + end + + def render_block({:paragraph, inlines}) do + render_inlines(inlines) + end + + def render_block({:code_block, lang, content}) do + opener = if lang, do: "```#{lang}", else: "```" + "#{opener}\n#{content}\n```" + end + + def render_block({:directive, d}) do + base = "@#{d.name} #{d.value}" + + case d.attributes do + [] -> + base + + attrs -> + attr_strs = Enum.map(attrs, fn {k, v} -> "#{k}=#{v}" end) + "#{base} [#{Enum.join(attr_strs, ", ")}]" + end + end + + def render_block({:attestation, a}) do + render_attestation(a) + end + + def render_block(:thematic_break) do + "---" + end + + def render_block({:block_quote, blocks}) do + blocks + |> Enum.map(fn b -> + render_block(b) + |> String.split("\n") + |> Enum.map(fn line -> "> #{line}" end) + |> Enum.join("\n") + end) + |> Enum.join("\n>\n") + end + + def render_block({:list_block, ordered, items}) do + items + |> Enum.with_index(1) + |> Enum.map(fn {item, idx} -> + prefix = if ordered, do: "#{idx}. ", else: "- " + + item_text = + item + |> Enum.map(&render_block/1) + |> Enum.join("\n") + + "#{prefix}#{item_text}" + end) + |> Enum.join("\n") + end + + @doc """ + Render an Attestation to its A2ML block format. + """ + @spec render_attestation(Attestation.t()) :: String.t() + def render_attestation(%Attestation{} = a) do + lines = [ + "!attest", + " identity: #{a.identity}", + " role: #{a.role}", + " trust-level: #{TrustLevel.to_string(a.trust_level)}" + ] + + lines = + case a.timestamp do + nil -> lines + ts -> lines ++ [" timestamp: #{ts}"] + end + + lines = + case a.note do + nil -> lines + n -> lines ++ [" note: #{n}"] + end + + Enum.join(lines, "\n") + end + + @doc """ + Render a list of Inline elements to text. + """ + @spec render_inlines([A2ML.Types.Inline.t()]) :: String.t() + def render_inlines(inlines) do + inlines + |> Enum.map(&render_inline/1) + |> Enum.join("") + end + + defp render_inline({:text, v}), do: v + defp render_inline({:emphasis, c}), do: "*#{render_inlines(c)}*" + defp render_inline({:strong, c}), do: "**#{render_inlines(c)}**" + defp render_inline({:code, v}), do: "`#{v}`" + defp render_inline({:link, c, u}), do: "[#{render_inlines(c)}](#{u})" +end diff --git a/ex/a2ml_ex-0.1.0/lib/a2ml/types.ex b/ex/a2ml_ex-0.1.0/lib/a2ml/types.ex new file mode 100644 index 0000000..f85a79d --- /dev/null +++ b/ex/a2ml_ex-0.1.0/lib/a2ml/types.ex @@ -0,0 +1,200 @@ +# SPDX-License-Identifier: MPL-2.0 +# (MPL-2.0 preferred; MPL-2.0 required for Hex.pm) + +defmodule A2ML.Types do + @moduledoc """ + Core data types for A2ML documents. + + An A2ML document consists of a sequence of `Block` elements, each of + which may contain `Inline` content. `Directive` blocks provide + machine-readable metadata, and `Attestation` records capture the + provenance chain for AI-generated or human-reviewed content. + """ +end + +defmodule A2ML.Types.Document do + @moduledoc """ + A complete A2ML document, containing metadata and a sequence of blocks. + """ + + @type t :: %__MODULE__{ + title: String.t() | nil, + directives: [A2ML.Types.Directive.t()], + blocks: [A2ML.Types.Block.t()], + attestations: [A2ML.Types.Attestation.t()] + } + + defstruct title: nil, + directives: [], + blocks: [], + attestations: [] +end + +defmodule A2ML.Types.Block do + @moduledoc """ + A block-level element in an A2ML document. + + Blocks are separated by blank lines in the source text. + """ + + @type t :: + {:heading, non_neg_integer(), [A2ML.Types.Inline.t()]} + | {:paragraph, [A2ML.Types.Inline.t()]} + | {:code_block, String.t() | nil, String.t()} + | {:directive, A2ML.Types.Directive.t()} + | {:attestation, A2ML.Types.Attestation.t()} + | :thematic_break + | {:block_quote, [t()]} + | {:list_block, boolean(), [[t()]]} +end + +defmodule A2ML.Types.Inline do + @moduledoc """ + An inline-level element within a block. + """ + + @type t :: + {:text, String.t()} + | {:emphasis, [t()]} + | {:strong, [t()]} + | {:code, String.t()} + | {:link, [t()], String.t()} +end + +defmodule A2ML.Types.Directive do + @moduledoc """ + A machine-readable directive that provides metadata or instructions. + + Directives begin with `@` in the source text, e.g. + `@version 1.0` or `@require trust-level:high`. + """ + + @type t :: %__MODULE__{ + name: String.t(), + value: String.t(), + attributes: [{String.t(), String.t()}] + } + + defstruct name: "", + value: "", + attributes: [] +end + +defmodule A2ML.Types.Attestation do + @moduledoc """ + An attestation record capturing who produced or reviewed content. + + Attestation blocks start with `!attest` and record the identity, + role, trust level, and optional timestamp of an author or reviewer. + """ + + @type t :: %__MODULE__{ + identity: String.t(), + role: String.t(), + trust_level: A2ML.Types.TrustLevel.t(), + timestamp: String.t() | nil, + note: String.t() | nil + } + + defstruct identity: "", + role: "", + trust_level: :unverified, + timestamp: nil, + note: nil +end + +defmodule A2ML.Types.TrustLevel do + @moduledoc """ + The degree of trust associated with an attestation. + + Trust levels form a simple ordered scale: + - `:unverified` — Content with no verification or review. + - `:automated` — Content reviewed by an automated tool or linter. + - `:reviewed` — Content reviewed by a human. + - `:verified` — Content that has been formally verified or proven. + """ + + @type t :: :unverified | :automated | :reviewed | :verified + + @doc """ + Parse a trust level from its canonical string representation. + + Returns `{:ok, level}` or `{:error, :unknown_trust_level}`. + """ + @spec from_string(String.t()) :: {:ok, t()} | {:error, :unknown_trust_level} + def from_string(s) do + case String.downcase(String.trim(s)) do + "unverified" -> {:ok, :unverified} + "automated" -> {:ok, :automated} + "reviewed" -> {:ok, :reviewed} + "verified" -> {:ok, :verified} + _ -> {:error, :unknown_trust_level} + end + end + + @doc """ + Return the canonical string representation of a trust level. + """ + @spec to_string(t()) :: String.t() + def to_string(:unverified), do: "unverified" + def to_string(:automated), do: "automated" + def to_string(:reviewed), do: "reviewed" + def to_string(:verified), do: "verified" + + @doc """ + Compare two trust levels. Returns `:lt`, `:eq`, or `:gt`. + """ + @spec compare(t(), t()) :: :lt | :eq | :gt + def compare(a, b), do: compare_int(level_to_int(a), level_to_int(b)) + + defp level_to_int(:unverified), do: 0 + defp level_to_int(:automated), do: 1 + defp level_to_int(:reviewed), do: 2 + defp level_to_int(:verified), do: 3 + + defp compare_int(a, b) when a < b, do: :lt + defp compare_int(a, b) when a > b, do: :gt + defp compare_int(_, _), do: :eq +end + +defmodule A2ML.Types.Manifest do + @moduledoc """ + A high-level manifest extracted from a parsed A2ML document. + + Collects the directives and attestations into a single structure + for convenient programmatic access. + """ + + @type t :: %__MODULE__{ + version: String.t() | nil, + title: String.t() | nil, + directives: [A2ML.Types.Directive.t()], + attestations: [A2ML.Types.Attestation.t()] + } + + defstruct version: nil, + title: nil, + directives: [], + attestations: [] + + @doc """ + Extract a manifest from a parsed Document. + """ + @spec from_document(A2ML.Types.Document.t()) :: t() + def from_document(%A2ML.Types.Document{} = doc) do + version = + doc.directives + |> Enum.find(fn d -> d.name == "version" end) + |> case do + nil -> nil + d -> d.value + end + + %__MODULE__{ + version: version, + title: doc.title, + directives: doc.directives, + attestations: doc.attestations + } + end +end diff --git a/ex/a2ml_ex-0.1.0/mix.exs b/ex/a2ml_ex-0.1.0/mix.exs new file mode 100644 index 0000000..16bc42d --- /dev/null +++ b/ex/a2ml_ex-0.1.0/mix.exs @@ -0,0 +1,49 @@ +# SPDX-License-Identifier: MPL-2.0 +# (MPL-2.0 preferred; MPL-2.0 required for Hex.pm) + +defmodule A2ML.MixProject do + use Mix.Project + + @version "0.1.0" + @source_url "https://github.com/hyperpolymath/a2ml_ex" + + def project do + [ + app: :a2ml_ex, + version: @version, + elixir: "~> 1.14", + start_permanent: Mix.env() == :prod, + deps: deps(), + description: description(), + package: package(), + source_url: @source_url + ] + end + + def application do + [ + extra_applications: [:logger] + ] + end + + defp description do + "A2ML (AI Attestation Markup Language) parser and renderer for Elixir." + end + + defp package do + [ + name: "a2ml_ex", + licenses: ["MPL-2.0"], + links: %{ + "GitHub" => @source_url, + "A2ML Specification" => "https://github.com/hyperpolymath/a2ml-showcase" + } + ] + end + + defp deps do + [ + {:ex_doc, "~> 0.34", only: :dev, runtime: false} + ] + end +end diff --git a/ex/contractile.just b/ex/contractile.just new file mode 100644 index 0000000..9a5827b --- /dev/null +++ b/ex/contractile.just @@ -0,0 +1,75 @@ +# Auto-generated by: contractile gen-just +# Source directory: contractiles +# Re-generate with: contractile gen-just --dir contractiles +# +# SPDX-License-Identifier: MPL-2.0 + +# === DUST (Recovery & Rollback) === +# Source: Dustfile.a2ml + +# List available dust recovery actions +dust-status: + @echo ' dust-source-rollback: Revert all source changes to last commit [rollback]' + +# Revert all source changes to last commit +dust-source-rollback: + @echo 'Executing rollback for source-rollback' + git checkout HEAD -- . + + +# === INTEND (Declared Future Intent) === +# Source: Intentfile.a2ml + +# Display declared future intents +intend-list: + @echo '=== Declared Intent ===' + @echo '' + @echo 'Features:' + @echo '' + @echo 'Quality:' + + +# === MUST (Physical State Checks) === +# Source: Mustfile.a2ml + +# Run all must checks +must-check: must-license-present must-readme-present must-spdx-headers must-no-banned-files + @echo 'All must checks passed' + +# LICENSE file must exist +must-license-present: + test -f LICENSE + +# README must exist +must-readme-present: + test -f README.adoc || test -f README.md + +# Source files should have SPDX license headers +must-spdx-headers: + find . -name '*.rs' -o -name '*.res' -o -name '*.gleam' | head -20 | xargs -r grep -L 'SPDX-License-Identifier' | wc -l | grep -q '^0$' + +# No Dockerfiles or Makefiles +must-no-banned-files: + test ! -f Dockerfile && test ! -f Makefile + + +# === TRUST (Integrity & Provenance Verification) === +# Source: Trustfile.a2ml + +# Run all trust verifications +trust-verify: trust-license-content trust-no-secrets-committed trust-container-images-pinned + @echo 'All trust verifications passed' + +# LICENSE contains expected SPDX identifier +trust-license-content: + grep -q 'SPDX\|License\|MIT\|Apache\|PMPL\|MPL' LICENSE + +# No .env or credential files in repo +trust-no-secrets-committed: + test ! -f .env && test ! -f credentials.json && test ! -f .env.local + +# Containerfile base images use pinned digests +trust-container-images-pinned: + test ! -f Containerfile || grep -q '@sha256:' Containerfile + + diff --git a/ex/contractiles/intend/Intentfile.a2ml b/ex/contractiles/intend/Intentfile.a2ml new file mode 100644 index 0000000..a86c36a --- /dev/null +++ b/ex/contractiles/intend/Intentfile.a2ml @@ -0,0 +1,22 @@ +# SPDX-License-Identifier: MPL-2.0 +# Intentfile (A2ML Canonical) +# Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) + +@abstract: +Declared intent and purpose for A2Ml_Ex. +@end + +## Purpose + +A2Ml_Ex — **Elixir implementation of A2ML (Attested Markup Language) parser and renderer.** + +## Anti-Purpose + +This project is NOT: +- A fork or wrapper around another tool +- A monorepo (unless explicitly structured as one) + +## If In Doubt + +If you are unsure whether a change is in scope, ask. +Sensitive areas: ABI definitions, license headers, CI workflows. diff --git a/ex/contractiles/must/Mustfile.a2ml b/ex/contractiles/must/Mustfile.a2ml new file mode 100644 index 0000000..872dad5 --- /dev/null +++ b/ex/contractiles/must/Mustfile.a2ml @@ -0,0 +1,42 @@ +# SPDX-License-Identifier: MPL-2.0 +# Mustfile (A2ML Canonical) +# Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) + +@abstract: +Physical State contract for A2Ml_Ex. Baseline UX Manifesto invariants +that MUST hold at all times. +@end + +@requires: +- section: Core-Files +- section: Banned +@end + +## Core-Files + +### license-present +- description: LICENSE file must exist +- run: test -f LICENSE +- severity: critical + +### readme-present +- description: README must exist +- run: test -f README.adoc || test -f README.md +- severity: critical + +## Banned + +### no-hardcoded-paths +- description: No hardcoded developer paths +- run: "! grep -rn '$HOME\|$ECLIPSE_DIR' --include='*.rs' --include='*.res' --include='*.ex' --include='*.gleam' --include='*.zig' --include='*.sh' . 2>/dev/null | grep -v '.git/' | grep -v 'ux-rollout.jl' | head -1" +- severity: critical + +### no-dockerfiles +- description: No Dockerfiles (use Containerfile) +- run: test ! -f Dockerfile +- severity: warning + +### no-makefiles +- description: No Makefiles (use Justfile) +- run: test ! -f Makefile +- severity: warning diff --git a/ex/contractiles/trust/Trustfile.a2ml b/ex/contractiles/trust/Trustfile.a2ml new file mode 100644 index 0000000..161c6d1 --- /dev/null +++ b/ex/contractiles/trust/Trustfile.a2ml @@ -0,0 +1,25 @@ +# SPDX-License-Identifier: MPL-2.0 +# Trustfile (A2ML Canonical) +# Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) + +@abstract: +Trust and provenance verification for A2Ml_Ex. +Maximal trust by default — LLM may read, build, test, lint, format. +@end + +@trust-level: maximal +@trust-boundary: repo +@trust-actions: [read, build, test, lint, format] +@trust-deny: [delete-branch, force-push, modify-ci-secrets, publish] + +## Integrity + +### license-content +- description: LICENSE contains expected SPDX identifier +- run: grep -q 'SPDX\|License\|MIT\|Apache\|PMPL\|MPL' LICENSE +- severity: critical + +### no-secrets-committed +- description: No .env or credential files in repo +- run: test ! -f .env && test ! -f credentials.json && test ! -f .env.local +- severity: critical diff --git a/ex/docs/architecture.adoc b/ex/docs/architecture.adoc new file mode 100644 index 0000000..71a61f3 --- /dev/null +++ b/ex/docs/architecture.adoc @@ -0,0 +1,78 @@ +// SPDX-License-Identifier: CC-BY-SA-4.0 +// SPDX-FileCopyrightText: 2026 Jonathan D.A. Jewell (hyperpolymath) <6759885+hyperpolymath@users.noreply.github.com> += Architecture — a2ml_ex +:revdate: 2026-MM-DD + +== System overview + +One paragraph: what this project does and what it does not do. State the +*invariant* — the property that, if violated, would make the whole project +pointless. Future maintainers will read this paragraph first. + +== Component diagram + +Replace this section with an ASCII or Mermaid diagram. Keep it under 20 +lines — anything bigger belongs in `architecture/`. + +[source] +---- ++------------------+ +------------------+ +| Component A | ---> | Component B | ++------------------+ +------------------+ + | + v ++------------------+ +| Component C | ++------------------+ +---- + +== Data flow + +For each external input, describe: + +* **Source**: where it comes from. +* **Validation**: what guarantees we enforce on entry. +* **Transformation**: high-level processing stages. +* **Sink**: where the result goes. + +== Key invariants + +Enumerate the load-bearing invariants of the system. Each should have: + +. A one-line statement. +. The code location(s) that enforce it. +. The failure mode if the invariant is violated. + +Example: + +[cols="1,2,2,2", options="header"] +|=== +| # | Invariant | Enforced at | Failure mode + +| 1 +| All HTTP requests carry a valid `X-Request-ID`. +| `src/middleware/request_id.rs` +| Logs become unjoinable; correlation breaks. + +| 2 +| The output buffer is always flushed before exit. +| `src/main.rs:88-92` (Drop impl) +| Last ~16KB of log lost on crash. +|=== + +== Dependencies + +* **Internal**: list other hyperpolymath repos this depends on. +* **External**: SHA-pinned (see `Cargo.lock` / `deno.lock` / etc.). +* **Build-time**: tools required to build (just, deno, cargo, …). + +== Out of scope + +Explicit non-goals. Things we deliberately do *not* do, with a one-line +reason for each. This section saves more time than the rest combined. + +== See also + +* link:./usage.adoc[Usage] — consumer perspective. +* link:./contributing.adoc[Contributing] — developer setup. +* link:./decisions/[ADRs] — historical record of why this shape. diff --git a/ex/docs/contributing.adoc b/ex/docs/contributing.adoc new file mode 100644 index 0000000..091675d --- /dev/null +++ b/ex/docs/contributing.adoc @@ -0,0 +1,90 @@ +// SPDX-License-Identifier: CC-BY-SA-4.0 +// SPDX-FileCopyrightText: 2026 Jonathan D.A. Jewell (hyperpolymath) <6759885+hyperpolymath@users.noreply.github.com> += Contributing — a2ml_ex +:revdate: 2026-MM-DD + +== Audience + +Developers working *on* `a2ml_ex`. For consumers (people calling +or depending on it) see link:./usage.adoc[usage.adoc]. + +== Local-dev setup + +Prerequisites — the minimum versions and where to get them: + +* `` v`` — ``. +* `` v`` — ``. +* GPG signing key configured (estate policy — all commits must be + signed). See + link:https://github.com/hyperpolymath/standards/blob/main/docs/secure-coding-training.md[standards/docs/secure-coding-training.md]. + +One-shot setup: + +[source,bash] +---- +git clone git@github.com:hyperpolymath/a2ml_ex.git +cd a2ml_ex +just setup # installs deps, sets up hooks +just test # runs the full test suite +---- + +== Running tests + +* **Unit**: `just test-unit` — fast, no I/O. +* **Integration**: `just test-int` — uses real services (database, + HTTP, etc.). Estate policy: prefer real over mocked + (see `feedback_integration_tests_real_db` in maintainer's memory). +* **Property**: `just test-prop` — randomised, slower; budget + documented in `docs/proof-debt.md` if applicable. +* **Full**: `just test` — runs all of the above. + +== Code style + +We enforce style via CI (governance-reusable.yml from hyperpolymath/standards). +Locally: + +[source,bash] +---- +just fmt # auto-format +just lint # static checks +---- + +* All commits must be **GPG-signed** (CI enforces; see + link:https://github.com/hyperpolymath/standards[standards]). +* All source files must carry an **SPDX-License-Identifier** header + (CI enforces). +* Conventional commits — `feat`, `fix`, `chore`, `refactor`, `docs`, + `test`, `ci`, `revert` (CHANGELOG is auto-generated from these + via link:https://github.com/hyperpolymath/standards/blob/main/.github/workflows/changelog-reusable.yml[`changelog-reusable.yml`]). + +== Branching & PR workflow + +. Branch off `main` as `claude/` (for AI agents) or + `/` (for humans). +. Make focused, narrow commits — one logical change per commit. +. Open a PR against `main`. +. **Enable auto-merge immediately** on every PR you open + (`gh pr merge --auto --squash`) — estate standing policy + (see standards#196 audit and policies). +. CI must be green. The PR auto-merges when checks pass + reviews land. + +== Adding a new dependency + +. State the *why* in the PR body — what does this dependency unlock? +. Check provenance (maintained, audited, no malicious history). +. Pin to a SHA, not a tag. +. Update `docs/architecture.adoc#Dependencies`. + +== Adding an ADR + +When you make a non-obvious design decision, write it down: + +. Copy `docs/decisions/0001-template.adoc` → `0002-.adoc`. +. Fill in: Context, Decision, Consequences, Alternatives. +. Link the ADR from the README or relevant code as a comment. + +== Reporting issues + +* Bugs in `a2ml_ex`: file at `hyperpolymath/a2ml_ex/issues`. +* Estate-wide concerns (policy, conventions, CI): file at + `hyperpolymath/standards/issues`. diff --git a/ex/docs/decisions/0001-template.adoc b/ex/docs/decisions/0001-template.adoc new file mode 100644 index 0000000..0ebe392 --- /dev/null +++ b/ex/docs/decisions/0001-template.adoc @@ -0,0 +1,53 @@ +// SPDX-License-Identifier: CC-BY-SA-4.0 +// SPDX-FileCopyrightText: 2026 Jonathan D.A. Jewell (hyperpolymath) <6759885+hyperpolymath@users.noreply.github.com> += ADR-0001 — Use Architecture Decision Records +:revdate: 2026-MM-DD +:status: ACCEPTED + +== Context + +We need a lightweight way to record significant architectural decisions +and the reasoning behind them, so future maintainers (and AI agents) +can understand *why* the project is shaped as it is. + +== Decision + +Adopt link:https://adr.github.io/[Architecture Decision Records (ADRs)] +in `docs/decisions/`, numbered sequentially (0001, 0002, ...). + +* Each ADR is a single `.adoc` file. +* The first ADR (this one) records the decision to use ADRs. +* Status values: PROPOSED, ACCEPTED, DEPRECATED, SUPERSEDED. +* When a decision is overturned, the new ADR records the supersession + and updates the old one's status to `SUPERSEDED by 00NN`. + +== Consequences + +. **Positive**: future readers see *why* without git-archaeology. +. **Positive**: design alternatives are documented, not just the + winning choice. +. **Positive**: ADRs are reviewable in PRs — the design discussion + happens alongside the code that implements it. +. **Negative**: maintenance burden — every non-obvious decision now + warrants an ADR. (We mitigate by keeping ADRs short; "non-obvious" + is a judgment call.) +. **Negative**: ADRs can rot. We accept this; the SUPERSEDED chain + is the recovery mechanism. + +== Alternatives considered + +. **Comments in code** — too local; doesn't capture cross-cutting + decisions. +. **Wiki / external doc** — drifts from code; not in PR review. +. **Commit messages** — too transient and not discoverable. +. **No record** — discarded; this is how every project ends up with + "I don't know why we do it this way" debt. + +== Companion ADRs + +* (None yet — this is the first ADR.) + +== References + +* MADR template — `https://adr.github.io/madr/` +* Estate convention — `hyperpolymath/standards/docs/RSR_OUTLINE.adoc` diff --git a/ex/docs/tech-debt-2026-05-26.md b/ex/docs/tech-debt-2026-05-26.md new file mode 100644 index 0000000..693c648 --- /dev/null +++ b/ex/docs/tech-debt-2026-05-26.md @@ -0,0 +1,57 @@ + + +# Tech-Debt Audit — a2ml_ex — 2026-05-26 + +**Source:** estate-wide automated scan 2026-05-26. +**Companion:** [`hyperpolymath/standards` 2026-05-26-estate-*-debt audits](https://github.com/hyperpolymath/standards/tree/main/docs/audits). +**Combined severity:** `MEDIUM`. + +This file records the *raw findings* — it does not by itself fix the debt. Each section ends with a 'Recommended next move' line; closing the debt is follow-up work. + +## 1. Proof debt + +No proof-bearing files (`*.v`, `*.lean`, `*.agda`, `*.idr`, `*.idr2`, `*.fst`, `*.dfy`, `*.tla`, `*.ads`, `*.adb`) found in this repo. + +**Recommended next move:** none. + +## 2. Licence debt + +| Field | Value | +|---|---| +| LICENSE file | `LICENSE` | +| SPDX header | `MPL-2.0` | +| Manifest licence | `MPL-2.0` | +| Body classifier | `Palimp-MPL-2.0` | +| Severity | `ok` | + +**Recommended next move:** none for licence. + +## 3. Documentation debt + +| Field | Value | +|---|---| +| README lines | 233 | +| `docs/` files | 0 | +| `docs/` LoC | 0 | +| CHANGELOG.md | N | +| CONTRIBUTING.md | Y | +| CODE_OF_CONDUCT.md | Y | +| SECURITY.md | Y | +| Severity | `MEDIUM` | + +**Recommended next move:** introduce a `docs/` directory. The README at 233 lines has likely grown to do the work of `docs/` — split it into a thin README + `docs/architecture.md`, `docs/usage.md`, etc. Heavy-wiki exemplars to copy from: `affinescript`, `boj-server`, `echidna`, `hypatia`. + +Additionally: **CHANGELOG.md is missing.** 65% of estate repos lack one — adopting a CHANGELOG (or auto-generating via `git-cliff`) is a recommended estate-wide follow-up. + +## Cross-references + +- Estate proof-debt audit: `hyperpolymath/standards/docs/audits/2026-05-26-estate-proof-debt.md` +- Estate licence-debt audit: `hyperpolymath/standards/docs/audits/2026-05-26-estate-licence-debt.md` +- Estate documentation-debt audit: `hyperpolymath/standards/docs/audits/2026-05-26-estate-documentation-debt.md` + +--- + +🤖 Generated by Claude Code estate-wide tech-debt scan (2026-05-26). This file is informational — closing the debt is follow-up work owned by the maintainer. diff --git a/ex/docs/troubleshooting.adoc b/ex/docs/troubleshooting.adoc new file mode 100644 index 0000000..409d235 --- /dev/null +++ b/ex/docs/troubleshooting.adoc @@ -0,0 +1,57 @@ +// SPDX-License-Identifier: CC-BY-SA-4.0 +// SPDX-FileCopyrightText: 2026 Jonathan D.A. Jewell (hyperpolymath) <6759885+hyperpolymath@users.noreply.github.com> += Troubleshooting — a2ml_ex +:revdate: 2026-MM-DD + +This file is a *living FAQ* — known failure modes and recovery paths. +Add a new entry every time you debug something that took more than 15 +minutes; future-you (and other maintainers) will thank you. + +== Known failure modes + +=== `` + +**Symptom**: short reproduction. What does the user see? + +**Cause**: root cause (one or two sentences). + +**Fix**: +[source,bash] +---- + +---- + +**Avoidance**: how to not hit this again (config setting, doc link, etc.). + +--- + +=== `` + +(Replace this and the above example with real entries as you encounter +them.) + +== Diagnostic toolkit + +When something is wrong, run these first: + +[source,bash] +---- +just doctor # runs all available self-checks +just version # prints the version & build hash +just log-tail # last N lines of logs +---- + +== When to escalate + +. Filed an issue with: version, OS, exact command, full error output, + and the symptom in plain English. +. Linked from the issue: the relevant ADR(s) and any related issues. +. For *security*-relevant findings, see + link:./../SECURITY.md[SECURITY.md] — do **not** file public issues. + +== Where to look for more help + +* `docs/architecture.adoc` — internals. +* `docs/decisions/` — historical record of why things are this shape. +* `https://github.com/hyperpolymath/a2ml_ex/issues?q=is%3Aissue+` — has anyone hit this before? +* `https://github.com/hyperpolymath/standards/issues` — for estate-wide problems. diff --git a/ex/docs/usage.adoc b/ex/docs/usage.adoc new file mode 100644 index 0000000..c49a045 --- /dev/null +++ b/ex/docs/usage.adoc @@ -0,0 +1,81 @@ +// SPDX-License-Identifier: CC-BY-SA-4.0 +// SPDX-FileCopyrightText: 2026 Jonathan D.A. Jewell (hyperpolymath) <6759885+hyperpolymath@users.noreply.github.com> += Usage — a2ml_ex +:revdate: 2026-MM-DD + +== Audience + +This document is for *consumers* of `a2ml_ex` — people who depend +on it, call it, or include it. For developers working *on* it, see +link:./contributing.adoc[contributing.adoc]. + +== Quickstart + +The shortest path from zero to a working call: + +[source,bash] +---- +# 1. Install +just install # or: cargo install --path . / deno task install + +# 2. Configure +cp examples/config.example.toml ./config.toml +# Edit minimal required fields. + +# 3. Run +just run # or the equivalent for your language +---- + +Expected output: + +[source] +---- +a2ml_ex v0.0.0 +Listening on 127.0.0.1:8080 +---- + +== Common use cases + +For each canonical use case, give: + +. A one-line statement of the goal. +. The minimal invocation. +. Expected output / side effect. + +=== Use case 1: + +(Replace with real content.) + +=== Use case 2: + +== Configuration reference + +Document every configurable field. Keep this section authoritative — if +the code grows a new option, this table must grow too (CI can be wired +to enforce this). + +[cols="1,1,1,3", options="header"] +|=== +| Field | Type | Default | Meaning + +| `` | `` | `` | +|=== + +== Stability guarantees + +Be explicit: + +* **Stable**: API surfaces that follow SemVer (breaking change = major bump). +* **Unstable**: behind a flag / pre-1.0 / explicitly marked. +* **Internal**: documented for reference but no compatibility promise. + +== Limits & known constraints + +* Maximum supported ``: ``. +* `` is not yet implemented; track at issue `#`. +* On ``, `` behaves differently because ``. + +== See also + +* link:./architecture.adoc[Architecture] — how it works internally. +* link:./troubleshooting.adoc[Troubleshooting] — when things go wrong. diff --git a/ex/erl_crash.dump b/ex/erl_crash.dump new file mode 100644 index 0000000..e57d73a --- /dev/null +++ b/ex/erl_crash.dump @@ -0,0 +1,40166 @@ +=erl_crash_dump:0.5 +Fri Jul 17 11:25:24 2026 +Slogan: Runtime terminating during boot ({undef,[{init,start_it,1,[]},{init,start_em,1,[]},{init,do_boot,3,[]}]}) +System version: Erlang/OTP 27 [erts-15.2.7] [source] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:1] [jit:ns] +Taints: +Atoms: 9536 +Calling Thread: scheduler:2 +=scheduler:1 +Scheduler Sleep Info Flags: SLEEPING | TSE_SLEEPING | WAITING +Scheduler Sleep Info Aux Work: MISC_THR_PRGR | MISC +Current Port: +Run Queue Max Length: 0 +Run Queue High Length: 0 +Run Queue Normal Length: 0 +Run Queue Low Length: 0 +Run Queue Port Length: 0 +Run Queue Flags: OUT_OF_WORK | HALFTIME_OUT_OF_WORK +Current Process: +=scheduler:2 +Scheduler Sleep Info Flags: +Scheduler Sleep Info Aux Work: DELAYED_AW_WAKEUP | THR_PRGR_LATER_OP +Current Port: +Run Queue Max Length: 0 +Run Queue High Length: 0 +Run Queue Normal Length: 1 +Run Queue Low Length: 0 +Run Queue Port Length: 0 +Run Queue Flags: NONEMPTY_NORMAL | OUT_OF_WORK | HALFTIME_OUT_OF_WORK | NONEMPTY | EXEC +Current Process: <0.0.0> +Current Process State: Running +Current Process Internal State: ACT_PRIO_NORMAL | USR_PRIO_NORMAL | PRQ_PRIO_NORMAL | ACTIVE | RUNNING | ACTIVE_SYS +Current Process Program counter: 0x0000772b50c085b4 (init:boot_loop/2 + 92) +Current Process Limited Stack Trace: +0x0000772b4c29e408:SReturn addr 0x50C72DC4 (erlang:halt/1 + 140) +0x0000772b4c29e420:SReturn addr 0x50C011F8 () +=scheduler:3 +Scheduler Sleep Info Flags: SLEEPING | POLL_SLEEPING | WAITING +Scheduler Sleep Info Aux Work: MISC_THR_PRGR +Current Port: +Run Queue Max Length: 0 +Run Queue High Length: 0 +Run Queue Normal Length: 0 +Run Queue Low Length: 0 +Run Queue Port Length: 0 +Run Queue Flags: OUT_OF_WORK | HALFTIME_OUT_OF_WORK +Current Process: +=scheduler:4 +Scheduler Sleep Info Flags: SLEEPING | TSE_SLEEPING | WAITING +Scheduler Sleep Info Aux Work: MISC +Current Port: +Run Queue Max Length: 0 +Run Queue High Length: 0 +Run Queue Normal Length: 0 +Run Queue Low Length: 0 +Run Queue Port Length: 0 +Run Queue Flags: OUT_OF_WORK | HALFTIME_OUT_OF_WORK +Current Process: +=dirty_cpu_scheduler:5 +Scheduler Sleep Info Flags: SLEEPING | TSE_SLEEPING | WAITING +Scheduler Sleep Info Aux Work: +Current Process: +=dirty_cpu_scheduler:6 +Scheduler Sleep Info Flags: SLEEPING | TSE_SLEEPING | WAITING +Scheduler Sleep Info Aux Work: +Current Process: +=dirty_cpu_scheduler:7 +Scheduler Sleep Info Flags: SLEEPING | TSE_SLEEPING | WAITING +Scheduler Sleep Info Aux Work: +Current Process: +=dirty_cpu_scheduler:8 +Scheduler Sleep Info Flags: SLEEPING | WAITING +Scheduler Sleep Info Aux Work: +Current Process: +=dirty_cpu_run_queue +Run Queue Max Length: 0 +Run Queue High Length: 0 +Run Queue Normal Length: 0 +Run Queue Low Length: 0 +Run Queue Port Length: 0 +Run Queue Flags: OUT_OF_WORK | HALFTIME_OUT_OF_WORK +=dirty_io_scheduler:9 +Scheduler Sleep Info Flags: SLEEPING | TSE_SLEEPING | WAITING +Scheduler Sleep Info Aux Work: +Current Process: +=dirty_io_scheduler:10 +Scheduler Sleep Info Flags: SLEEPING | TSE_SLEEPING | WAITING +Scheduler Sleep Info Aux Work: +Current Process: +=dirty_io_scheduler:11 +Scheduler Sleep Info Flags: SLEEPING | TSE_SLEEPING | WAITING +Scheduler Sleep Info Aux Work: +Current Process: +=dirty_io_scheduler:12 +Scheduler Sleep Info Flags: SLEEPING | WAITING +Scheduler Sleep Info Aux Work: +Current Process: +=dirty_io_scheduler:13 +Scheduler Sleep Info Flags: SLEEPING | TSE_SLEEPING | WAITING +Scheduler Sleep Info Aux Work: +Current Process: +=dirty_io_scheduler:14 +Scheduler Sleep Info Flags: SLEEPING | TSE_SLEEPING | WAITING +Scheduler Sleep Info Aux Work: +Current Process: +=dirty_io_scheduler:15 +Scheduler Sleep Info Flags: SLEEPING | TSE_SLEEPING | WAITING +Scheduler Sleep Info Aux Work: +Current Process: +=dirty_io_scheduler:16 +Scheduler Sleep Info Flags: SLEEPING | TSE_SLEEPING | WAITING +Scheduler Sleep Info Aux Work: +Current Process: +=dirty_io_scheduler:17 +Scheduler Sleep Info Flags: SLEEPING | TSE_SLEEPING | WAITING +Scheduler Sleep Info Aux Work: +Current Process: +=dirty_io_scheduler:18 +Scheduler Sleep Info Flags: SLEEPING | TSE_SLEEPING | WAITING +Scheduler Sleep Info Aux Work: +Current Process: +=dirty_io_run_queue +Run Queue Max Length: 0 +Run Queue High Length: 0 +Run Queue Normal Length: 0 +Run Queue Low Length: 0 +Run Queue Port Length: 0 +Run Queue Flags: OUT_OF_WORK | HALFTIME_OUT_OF_WORK +=memory +total: 44875744 +processes: 13344912 +processes_used: 13339280 +system: 31530832 +atom: 278697 +atom_used: 260571 +binary: 749080 +code: 5183606 +ets: 349056 +=hash_table:atom_tab +size: 8192 +used: 5640 +objs: 9536 +depth: 7 +=index_table:atom_tab +size: 10240 +limit: 1048576 +entries: 9536 +=hash_table:module_code +size: 64 +used: 54 +objs: 100 +depth: 5 +=index_table:module_code +size: 1024 +limit: 65536 +entries: 100 +=hash_table:export_list +size: 4096 +used: 2241 +objs: 3235 +depth: 6 +=index_table:export_list +size: 4096 +limit: 524288 +entries: 3235 +=hash_table:export_list +size: 4096 +used: 2264 +objs: 3299 +depth: 7 +=hash_table:process_reg +size: 32 +used: 17 +objs: 26 +depth: 3 +=hash_table:fun_table +size: 512 +used: 335 +objs: 655 +depth: 5 +=hash_table:node_table +size: 16 +used: 1 +objs: 1 +depth: 1 +=hash_table:dist_table +size: 16 +used: 1 +objs: 1 +depth: 1 +=allocated_areas +sys_misc: 57816 +static: 1053984 +atom_space: 131104 112978 +atom_table: 147593 +module_table: 74976 +export_table: 197028 +export_list: 686192 +register_table: 372 +fun_table: 4210 +module_refs: 4800 +loaded_code: 4216400 +dist_table: 643 +node_table: 291 +bif_timer: 0 +process_table: 12582912 +port_table: 12582912 +ets_misc: 131072 +external_alloc: 4216400 +=allocator:sys_alloc +option e: true +option m: libc +option tt: 131072 +option tp: 0 +=allocator:temp_alloc[0] +versions: 2.1 3.0 +option e: true +option t: 5 +option ramv: false +option atags: false +option sbct: 524288 +option asbcst: 4145152 +option rsbcst: 90 +option rsbcmt: 80 +option rmbcmt: 100 +option mmbcs: 131072 +option mmsbc: 256 +option mmmbc: 18446744073709551615 +option lmbcs: 10485760 +option smbcs: 1048576 +option mbcgs: 10 +option acul: 0 +option acful: 0 +option acnl: 0 +option acfml: 0 +option cp: undefined +option mbsd: 3 +option as: gf +mbcs blocks[sys_alloc] count: 0 0 0 +mbcs blocks[sys_alloc] size: 0 0 0 +mbcs blocks[temp_alloc] count: 0 5 5 +mbcs blocks[temp_alloc] size: 0 11480 11480 +mbcs blocks[sl_alloc] count: 0 0 0 +mbcs blocks[sl_alloc] size: 0 0 0 +mbcs blocks[std_alloc] count: 0 0 0 +mbcs blocks[std_alloc] size: 0 0 0 +mbcs blocks[ll_alloc] count: 0 0 0 +mbcs blocks[ll_alloc] size: 0 0 0 +mbcs blocks[eheap_alloc] count: 0 0 0 +mbcs blocks[eheap_alloc] size: 0 0 0 +mbcs blocks[ets_alloc] count: 0 0 0 +mbcs blocks[ets_alloc] size: 0 0 0 +mbcs blocks[fix_alloc] count: 0 0 0 +mbcs blocks[fix_alloc] size: 0 0 0 +mbcs blocks[literal_alloc] count: 0 0 0 +mbcs blocks[literal_alloc] size: 0 0 0 +mbcs blocks[binary_alloc] count: 0 0 0 +mbcs blocks[binary_alloc] size: 0 0 0 +mbcs blocks[driver_alloc] count: 0 0 0 +mbcs blocks[driver_alloc] size: 0 0 0 +mbcs blocks[test_alloc] count: 0 0 0 +mbcs blocks[test_alloc] size: 0 0 0 +mbcs carriers: 1 1 1 +mbcs mseg carriers: 0 +mbcs sys_alloc carriers: 1 +mbcs carriers size: 131072 131072 131072 +mbcs mseg carriers size: 0 +mbcs sys_alloc carriers size: 131072 +sbcs blocks[sys_alloc] count: 0 0 0 +sbcs blocks[sys_alloc] size: 0 0 0 +sbcs blocks[temp_alloc] count: 0 0 0 +sbcs blocks[temp_alloc] size: 0 0 0 +sbcs blocks[sl_alloc] count: 0 0 0 +sbcs blocks[sl_alloc] size: 0 0 0 +sbcs blocks[std_alloc] count: 0 0 0 +sbcs blocks[std_alloc] size: 0 0 0 +sbcs blocks[ll_alloc] count: 0 0 0 +sbcs blocks[ll_alloc] size: 0 0 0 +sbcs blocks[eheap_alloc] count: 0 0 0 +sbcs blocks[eheap_alloc] size: 0 0 0 +sbcs blocks[ets_alloc] count: 0 0 0 +sbcs blocks[ets_alloc] size: 0 0 0 +sbcs blocks[fix_alloc] count: 0 0 0 +sbcs blocks[fix_alloc] size: 0 0 0 +sbcs blocks[literal_alloc] count: 0 0 0 +sbcs blocks[literal_alloc] size: 0 0 0 +sbcs blocks[binary_alloc] count: 0 0 0 +sbcs blocks[binary_alloc] size: 0 0 0 +sbcs blocks[driver_alloc] count: 0 0 0 +sbcs blocks[driver_alloc] size: 0 0 0 +sbcs blocks[test_alloc] count: 0 0 0 +sbcs blocks[test_alloc] size: 0 0 0 +sbcs carriers: 0 0 0 +sbcs mseg carriers: 0 +sbcs sys_alloc carriers: 0 +sbcs carriers size: 0 0 0 +sbcs mseg carriers size: 0 +sbcs sys_alloc carriers size: 0 +temp_alloc calls: 1065 +temp_free calls: 1065 +temp_realloc calls: 0 +mseg_alloc calls: 0 +mseg_dealloc calls: 0 +mseg_realloc calls: 0 +sys_alloc calls: 1 +sys_free calls: 0 +sys_realloc calls: 0 +=allocator:temp_alloc[1] +versions: 0.9 3.0 +option e: true +option t: 5 +option ramv: false +option atags: false +option sbct: 524288 +option asbcst: 4145152 +option rsbcst: 90 +option rsbcmt: 80 +option rmbcmt: 100 +option mmbcs: 131072 +option mmsbc: 256 +option mmmbc: 18446744073709551615 +option lmbcs: 10485760 +option smbcs: 1048576 +option mbcgs: 10 +option acul: 0 +option acful: 0 +option acnl: 0 +option acfml: 0 +option cp: undefined +option as: af +mbcs blocks[sys_alloc] count: 0 0 0 +mbcs blocks[sys_alloc] size: 0 0 0 +mbcs blocks[temp_alloc] count: 0 5 5 +mbcs blocks[temp_alloc] size: 0 27920 27920 +mbcs blocks[sl_alloc] count: 0 0 0 +mbcs blocks[sl_alloc] size: 0 0 0 +mbcs blocks[std_alloc] count: 0 0 0 +mbcs blocks[std_alloc] size: 0 0 0 +mbcs blocks[ll_alloc] count: 0 0 0 +mbcs blocks[ll_alloc] size: 0 0 0 +mbcs blocks[eheap_alloc] count: 0 0 0 +mbcs blocks[eheap_alloc] size: 0 0 0 +mbcs blocks[ets_alloc] count: 0 0 0 +mbcs blocks[ets_alloc] size: 0 0 0 +mbcs blocks[fix_alloc] count: 0 0 0 +mbcs blocks[fix_alloc] size: 0 0 0 +mbcs blocks[literal_alloc] count: 0 0 0 +mbcs blocks[literal_alloc] size: 0 0 0 +mbcs blocks[binary_alloc] count: 0 0 0 +mbcs blocks[binary_alloc] size: 0 0 0 +mbcs blocks[driver_alloc] count: 0 0 0 +mbcs blocks[driver_alloc] size: 0 0 0 +mbcs blocks[test_alloc] count: 0 0 0 +mbcs blocks[test_alloc] size: 0 0 0 +mbcs carriers: 1 1 1 +mbcs mseg carriers: 0 +mbcs sys_alloc carriers: 1 +mbcs carriers size: 131072 131072 131072 +mbcs mseg carriers size: 0 +mbcs sys_alloc carriers size: 131072 +sbcs blocks[sys_alloc] count: 0 0 0 +sbcs blocks[sys_alloc] size: 0 0 0 +sbcs blocks[temp_alloc] count: 0 0 0 +sbcs blocks[temp_alloc] size: 0 0 0 +sbcs blocks[sl_alloc] count: 0 0 0 +sbcs blocks[sl_alloc] size: 0 0 0 +sbcs blocks[std_alloc] count: 0 0 0 +sbcs blocks[std_alloc] size: 0 0 0 +sbcs blocks[ll_alloc] count: 0 0 0 +sbcs blocks[ll_alloc] size: 0 0 0 +sbcs blocks[eheap_alloc] count: 0 0 0 +sbcs blocks[eheap_alloc] size: 0 0 0 +sbcs blocks[ets_alloc] count: 0 0 0 +sbcs blocks[ets_alloc] size: 0 0 0 +sbcs blocks[fix_alloc] count: 0 0 0 +sbcs blocks[fix_alloc] size: 0 0 0 +sbcs blocks[literal_alloc] count: 0 0 0 +sbcs blocks[literal_alloc] size: 0 0 0 +sbcs blocks[binary_alloc] count: 0 0 0 +sbcs blocks[binary_alloc] size: 0 0 0 +sbcs blocks[driver_alloc] count: 0 0 0 +sbcs blocks[driver_alloc] size: 0 0 0 +sbcs blocks[test_alloc] count: 0 0 0 +sbcs blocks[test_alloc] size: 0 0 0 +sbcs carriers: 0 0 0 +sbcs mseg carriers: 0 +sbcs sys_alloc carriers: 0 +sbcs carriers size: 0 0 0 +sbcs mseg carriers size: 0 +sbcs sys_alloc carriers size: 0 +temp_alloc calls: 2432 +temp_free calls: 2432 +temp_realloc calls: 0 +mseg_alloc calls: 0 +mseg_dealloc calls: 0 +mseg_realloc calls: 0 +sys_alloc calls: 1 +sys_free calls: 0 +sys_realloc calls: 0 +=allocator:temp_alloc[2] +versions: 0.9 3.0 +option e: true +option t: 5 +option ramv: false +option atags: false +option sbct: 524288 +option asbcst: 4145152 +option rsbcst: 90 +option rsbcmt: 80 +option rmbcmt: 100 +option mmbcs: 131072 +option mmsbc: 256 +option mmmbc: 18446744073709551615 +option lmbcs: 10485760 +option smbcs: 1048576 +option mbcgs: 10 +option acul: 0 +option acful: 0 +option acnl: 0 +option acfml: 0 +option cp: undefined +option as: af +mbcs blocks[sys_alloc] count: 0 0 0 +mbcs blocks[sys_alloc] size: 0 0 0 +mbcs blocks[temp_alloc] count: 1 6 6 +mbcs blocks[temp_alloc] size: 65544 65544 65544 +mbcs blocks[sl_alloc] count: 0 0 0 +mbcs blocks[sl_alloc] size: 0 0 0 +mbcs blocks[std_alloc] count: 0 0 0 +mbcs blocks[std_alloc] size: 0 0 0 +mbcs blocks[ll_alloc] count: 0 0 0 +mbcs blocks[ll_alloc] size: 0 0 0 +mbcs blocks[eheap_alloc] count: 0 0 0 +mbcs blocks[eheap_alloc] size: 0 0 0 +mbcs blocks[ets_alloc] count: 0 0 0 +mbcs blocks[ets_alloc] size: 0 0 0 +mbcs blocks[fix_alloc] count: 0 0 0 +mbcs blocks[fix_alloc] size: 0 0 0 +mbcs blocks[literal_alloc] count: 0 0 0 +mbcs blocks[literal_alloc] size: 0 0 0 +mbcs blocks[binary_alloc] count: 0 0 0 +mbcs blocks[binary_alloc] size: 0 0 0 +mbcs blocks[driver_alloc] count: 0 0 0 +mbcs blocks[driver_alloc] size: 0 0 0 +mbcs blocks[test_alloc] count: 0 0 0 +mbcs blocks[test_alloc] size: 0 0 0 +mbcs carriers: 1 1 1 +mbcs mseg carriers: 0 +mbcs sys_alloc carriers: 1 +mbcs carriers size: 131072 131072 131072 +mbcs mseg carriers size: 0 +mbcs sys_alloc carriers size: 131072 +sbcs blocks[sys_alloc] count: 0 0 0 +sbcs blocks[sys_alloc] size: 0 0 0 +sbcs blocks[temp_alloc] count: 0 0 0 +sbcs blocks[temp_alloc] size: 0 0 0 +sbcs blocks[sl_alloc] count: 0 0 0 +sbcs blocks[sl_alloc] size: 0 0 0 +sbcs blocks[std_alloc] count: 0 0 0 +sbcs blocks[std_alloc] size: 0 0 0 +sbcs blocks[ll_alloc] count: 0 0 0 +sbcs blocks[ll_alloc] size: 0 0 0 +sbcs blocks[eheap_alloc] count: 0 0 0 +sbcs blocks[eheap_alloc] size: 0 0 0 +sbcs blocks[ets_alloc] count: 0 0 0 +sbcs blocks[ets_alloc] size: 0 0 0 +sbcs blocks[fix_alloc] count: 0 0 0 +sbcs blocks[fix_alloc] size: 0 0 0 +sbcs blocks[literal_alloc] count: 0 0 0 +sbcs blocks[literal_alloc] size: 0 0 0 +sbcs blocks[binary_alloc] count: 0 0 0 +sbcs blocks[binary_alloc] size: 0 0 0 +sbcs blocks[driver_alloc] count: 0 0 0 +sbcs blocks[driver_alloc] size: 0 0 0 +sbcs blocks[test_alloc] count: 0 0 0 +sbcs blocks[test_alloc] size: 0 0 0 +sbcs carriers: 0 0 0 +sbcs mseg carriers: 0 +sbcs sys_alloc carriers: 0 +sbcs carriers size: 0 0 0 +sbcs mseg carriers size: 0 +sbcs sys_alloc carriers size: 0 +temp_alloc calls: 6037 +temp_free calls: 6036 +temp_realloc calls: 6 +mseg_alloc calls: 0 +mseg_dealloc calls: 0 +mseg_realloc calls: 0 +sys_alloc calls: 1 +sys_free calls: 0 +sys_realloc calls: 0 +=allocator:temp_alloc[3] +versions: 0.9 3.0 +option e: true +option t: 5 +option ramv: false +option atags: false +option sbct: 524288 +option asbcst: 4145152 +option rsbcst: 90 +option rsbcmt: 80 +option rmbcmt: 100 +option mmbcs: 131072 +option mmsbc: 256 +option mmmbc: 18446744073709551615 +option lmbcs: 10485760 +option smbcs: 1048576 +option mbcgs: 10 +option acul: 0 +option acful: 0 +option acnl: 0 +option acfml: 0 +option cp: undefined +option as: af +mbcs blocks[sys_alloc] count: 0 0 0 +mbcs blocks[sys_alloc] size: 0 0 0 +mbcs blocks[temp_alloc] count: 0 1 1 +mbcs blocks[temp_alloc] size: 0 56 56 +mbcs blocks[sl_alloc] count: 0 0 0 +mbcs blocks[sl_alloc] size: 0 0 0 +mbcs blocks[std_alloc] count: 0 0 0 +mbcs blocks[std_alloc] size: 0 0 0 +mbcs blocks[ll_alloc] count: 0 0 0 +mbcs blocks[ll_alloc] size: 0 0 0 +mbcs blocks[eheap_alloc] count: 0 0 0 +mbcs blocks[eheap_alloc] size: 0 0 0 +mbcs blocks[ets_alloc] count: 0 0 0 +mbcs blocks[ets_alloc] size: 0 0 0 +mbcs blocks[fix_alloc] count: 0 0 0 +mbcs blocks[fix_alloc] size: 0 0 0 +mbcs blocks[literal_alloc] count: 0 0 0 +mbcs blocks[literal_alloc] size: 0 0 0 +mbcs blocks[binary_alloc] count: 0 0 0 +mbcs blocks[binary_alloc] size: 0 0 0 +mbcs blocks[driver_alloc] count: 0 0 0 +mbcs blocks[driver_alloc] size: 0 0 0 +mbcs blocks[test_alloc] count: 0 0 0 +mbcs blocks[test_alloc] size: 0 0 0 +mbcs carriers: 1 1 1 +mbcs mseg carriers: 0 +mbcs sys_alloc carriers: 1 +mbcs carriers size: 131072 131072 131072 +mbcs mseg carriers size: 0 +mbcs sys_alloc carriers size: 131072 +sbcs blocks[sys_alloc] count: 0 0 0 +sbcs blocks[sys_alloc] size: 0 0 0 +sbcs blocks[temp_alloc] count: 0 0 0 +sbcs blocks[temp_alloc] size: 0 0 0 +sbcs blocks[sl_alloc] count: 0 0 0 +sbcs blocks[sl_alloc] size: 0 0 0 +sbcs blocks[std_alloc] count: 0 0 0 +sbcs blocks[std_alloc] size: 0 0 0 +sbcs blocks[ll_alloc] count: 0 0 0 +sbcs blocks[ll_alloc] size: 0 0 0 +sbcs blocks[eheap_alloc] count: 0 0 0 +sbcs blocks[eheap_alloc] size: 0 0 0 +sbcs blocks[ets_alloc] count: 0 0 0 +sbcs blocks[ets_alloc] size: 0 0 0 +sbcs blocks[fix_alloc] count: 0 0 0 +sbcs blocks[fix_alloc] size: 0 0 0 +sbcs blocks[literal_alloc] count: 0 0 0 +sbcs blocks[literal_alloc] size: 0 0 0 +sbcs blocks[binary_alloc] count: 0 0 0 +sbcs blocks[binary_alloc] size: 0 0 0 +sbcs blocks[driver_alloc] count: 0 0 0 +sbcs blocks[driver_alloc] size: 0 0 0 +sbcs blocks[test_alloc] count: 0 0 0 +sbcs blocks[test_alloc] size: 0 0 0 +sbcs carriers: 0 0 0 +sbcs mseg carriers: 0 +sbcs sys_alloc carriers: 0 +sbcs carriers size: 0 0 0 +sbcs mseg carriers size: 0 +sbcs sys_alloc carriers size: 0 +temp_alloc calls: 1 +temp_free calls: 1 +temp_realloc calls: 0 +mseg_alloc calls: 0 +mseg_dealloc calls: 0 +mseg_realloc calls: 0 +sys_alloc calls: 1 +sys_free calls: 0 +sys_realloc calls: 0 +=allocator:temp_alloc[4] +versions: 0.9 3.0 +option e: true +option t: 5 +option ramv: false +option atags: false +option sbct: 524288 +option asbcst: 4145152 +option rsbcst: 90 +option rsbcmt: 80 +option rmbcmt: 100 +option mmbcs: 131072 +option mmsbc: 256 +option mmmbc: 18446744073709551615 +option lmbcs: 10485760 +option smbcs: 1048576 +option mbcgs: 10 +option acul: 0 +option acful: 0 +option acnl: 0 +option acfml: 0 +option cp: undefined +option as: af +mbcs blocks[sys_alloc] count: 0 0 0 +mbcs blocks[sys_alloc] size: 0 0 0 +mbcs blocks[temp_alloc] count: 0 1 1 +mbcs blocks[temp_alloc] size: 0 56 56 +mbcs blocks[sl_alloc] count: 0 0 0 +mbcs blocks[sl_alloc] size: 0 0 0 +mbcs blocks[std_alloc] count: 0 0 0 +mbcs blocks[std_alloc] size: 0 0 0 +mbcs blocks[ll_alloc] count: 0 0 0 +mbcs blocks[ll_alloc] size: 0 0 0 +mbcs blocks[eheap_alloc] count: 0 0 0 +mbcs blocks[eheap_alloc] size: 0 0 0 +mbcs blocks[ets_alloc] count: 0 0 0 +mbcs blocks[ets_alloc] size: 0 0 0 +mbcs blocks[fix_alloc] count: 0 0 0 +mbcs blocks[fix_alloc] size: 0 0 0 +mbcs blocks[literal_alloc] count: 0 0 0 +mbcs blocks[literal_alloc] size: 0 0 0 +mbcs blocks[binary_alloc] count: 0 0 0 +mbcs blocks[binary_alloc] size: 0 0 0 +mbcs blocks[driver_alloc] count: 0 0 0 +mbcs blocks[driver_alloc] size: 0 0 0 +mbcs blocks[test_alloc] count: 0 0 0 +mbcs blocks[test_alloc] size: 0 0 0 +mbcs carriers: 1 1 1 +mbcs mseg carriers: 0 +mbcs sys_alloc carriers: 1 +mbcs carriers size: 131072 131072 131072 +mbcs mseg carriers size: 0 +mbcs sys_alloc carriers size: 131072 +sbcs blocks[sys_alloc] count: 0 0 0 +sbcs blocks[sys_alloc] size: 0 0 0 +sbcs blocks[temp_alloc] count: 0 0 0 +sbcs blocks[temp_alloc] size: 0 0 0 +sbcs blocks[sl_alloc] count: 0 0 0 +sbcs blocks[sl_alloc] size: 0 0 0 +sbcs blocks[std_alloc] count: 0 0 0 +sbcs blocks[std_alloc] size: 0 0 0 +sbcs blocks[ll_alloc] count: 0 0 0 +sbcs blocks[ll_alloc] size: 0 0 0 +sbcs blocks[eheap_alloc] count: 0 0 0 +sbcs blocks[eheap_alloc] size: 0 0 0 +sbcs blocks[ets_alloc] count: 0 0 0 +sbcs blocks[ets_alloc] size: 0 0 0 +sbcs blocks[fix_alloc] count: 0 0 0 +sbcs blocks[fix_alloc] size: 0 0 0 +sbcs blocks[literal_alloc] count: 0 0 0 +sbcs blocks[literal_alloc] size: 0 0 0 +sbcs blocks[binary_alloc] count: 0 0 0 +sbcs blocks[binary_alloc] size: 0 0 0 +sbcs blocks[driver_alloc] count: 0 0 0 +sbcs blocks[driver_alloc] size: 0 0 0 +sbcs blocks[test_alloc] count: 0 0 0 +sbcs blocks[test_alloc] size: 0 0 0 +sbcs carriers: 0 0 0 +sbcs mseg carriers: 0 +sbcs sys_alloc carriers: 0 +sbcs carriers size: 0 0 0 +sbcs mseg carriers size: 0 +sbcs sys_alloc carriers size: 0 +temp_alloc calls: 1 +temp_free calls: 1 +temp_realloc calls: 0 +mseg_alloc calls: 0 +mseg_dealloc calls: 0 +mseg_realloc calls: 0 +sys_alloc calls: 1 +sys_free calls: 0 +sys_realloc calls: 0 +=allocator:sl_alloc[0] +versions: 0.9 3.0 +option e: true +option t: 5 +option ramv: false +option atags: false +option sbct: 524288 +option asbcst: 4145152 +option rsbcst: 80 +option rsbcmt: 80 +option rmbcmt: 50 +option mmbcs: 32768 +option mmsbc: 256 +option mmmbc: 18446744073709551615 +option lmbcs: 5242880 +option smbcs: 262144 +option mbcgs: 10 +option acul: 0 +option acful: 0 +option acnl: 0 +option acfml: 0 +option cp: undefined +option as: aoffcbf +mbcs blocks[sys_alloc] count: 0 0 0 +mbcs blocks[sys_alloc] size: 0 0 0 +mbcs blocks[temp_alloc] count: 0 0 0 +mbcs blocks[temp_alloc] size: 0 0 0 +mbcs blocks[sl_alloc] count: 7 82 82 +mbcs blocks[sl_alloc] size: 648 41920 41920 +mbcs blocks[std_alloc] count: 0 0 0 +mbcs blocks[std_alloc] size: 0 0 0 +mbcs blocks[ll_alloc] count: 0 0 0 +mbcs blocks[ll_alloc] size: 0 0 0 +mbcs blocks[eheap_alloc] count: 0 0 0 +mbcs blocks[eheap_alloc] size: 0 0 0 +mbcs blocks[ets_alloc] count: 0 0 0 +mbcs blocks[ets_alloc] size: 0 0 0 +mbcs blocks[fix_alloc] count: 0 0 0 +mbcs blocks[fix_alloc] size: 0 0 0 +mbcs blocks[literal_alloc] count: 0 0 0 +mbcs blocks[literal_alloc] size: 0 0 0 +mbcs blocks[binary_alloc] count: 0 0 0 +mbcs blocks[binary_alloc] size: 0 0 0 +mbcs blocks[driver_alloc] count: 0 0 0 +mbcs blocks[driver_alloc] size: 0 0 0 +mbcs blocks[test_alloc] count: 0 0 0 +mbcs blocks[test_alloc] size: 0 0 0 +mbcs carriers: 1 2 2 +mbcs mseg carriers: 0 +mbcs sys_alloc carriers: 1 +mbcs carriers size: 32768 294912 294912 +mbcs mseg carriers size: 0 +mbcs sys_alloc carriers size: 32768 +sbcs blocks[sys_alloc] count: 0 0 0 +sbcs blocks[sys_alloc] size: 0 0 0 +sbcs blocks[temp_alloc] count: 0 0 0 +sbcs blocks[temp_alloc] size: 0 0 0 +sbcs blocks[sl_alloc] count: 0 0 0 +sbcs blocks[sl_alloc] size: 0 0 0 +sbcs blocks[std_alloc] count: 0 0 0 +sbcs blocks[std_alloc] size: 0 0 0 +sbcs blocks[ll_alloc] count: 0 0 0 +sbcs blocks[ll_alloc] size: 0 0 0 +sbcs blocks[eheap_alloc] count: 0 0 0 +sbcs blocks[eheap_alloc] size: 0 0 0 +sbcs blocks[ets_alloc] count: 0 0 0 +sbcs blocks[ets_alloc] size: 0 0 0 +sbcs blocks[fix_alloc] count: 0 0 0 +sbcs blocks[fix_alloc] size: 0 0 0 +sbcs blocks[literal_alloc] count: 0 0 0 +sbcs blocks[literal_alloc] size: 0 0 0 +sbcs blocks[binary_alloc] count: 0 0 0 +sbcs blocks[binary_alloc] size: 0 0 0 +sbcs blocks[driver_alloc] count: 0 0 0 +sbcs blocks[driver_alloc] size: 0 0 0 +sbcs blocks[test_alloc] count: 0 0 0 +sbcs blocks[test_alloc] size: 0 0 0 +sbcs carriers: 0 0 0 +sbcs mseg carriers: 0 +sbcs sys_alloc carriers: 0 +sbcs carriers size: 0 0 0 +sbcs mseg carriers size: 0 +sbcs sys_alloc carriers size: 0 +sl_alloc calls: 645 +sl_free calls: 638 +sl_realloc calls: 0 +mseg_alloc calls: 3 +mseg_dealloc calls: 3 +mseg_realloc calls: 0 +sys_alloc calls: 1 +sys_free calls: 0 +sys_realloc calls: 0 +=allocator:sl_alloc[1] +versions: 0.9 3.0 +option e: true +option t: 5 +option ramv: false +option atags: false +option sbct: 524288 +option asbcst: 4145152 +option rsbcst: 80 +option rsbcmt: 80 +option rmbcmt: 50 +option mmbcs: 32768 +option mmsbc: 256 +option mmmbc: 18446744073709551615 +option lmbcs: 5242880 +option smbcs: 262144 +option mbcgs: 10 +option acul: 60 +option acful: 0 +option acnl: 1000 +option acfml: 0 +option cp: S +option as: aoffcbf +mbcs blocks[sys_alloc] count: 0 0 0 +mbcs blocks[sys_alloc] size: 0 0 0 +mbcs blocks[temp_alloc] count: 0 0 0 +mbcs blocks[temp_alloc] size: 0 0 0 +mbcs blocks[sl_alloc] count: 0 475 475 +mbcs blocks[sl_alloc] size: 0 418104 418104 +mbcs blocks[std_alloc] count: 0 0 0 +mbcs blocks[std_alloc] size: 0 0 0 +mbcs blocks[ll_alloc] count: 0 0 0 +mbcs blocks[ll_alloc] size: 0 0 0 +mbcs blocks[eheap_alloc] count: 0 0 0 +mbcs blocks[eheap_alloc] size: 0 0 0 +mbcs blocks[ets_alloc] count: 0 0 0 +mbcs blocks[ets_alloc] size: 0 0 0 +mbcs blocks[fix_alloc] count: 0 0 0 +mbcs blocks[fix_alloc] size: 0 0 0 +mbcs blocks[literal_alloc] count: 0 0 0 +mbcs blocks[literal_alloc] size: 0 0 0 +mbcs blocks[binary_alloc] count: 0 0 0 +mbcs blocks[binary_alloc] size: 0 0 0 +mbcs blocks[driver_alloc] count: 0 0 0 +mbcs blocks[driver_alloc] size: 0 0 0 +mbcs blocks[test_alloc] count: 0 0 0 +mbcs blocks[test_alloc] size: 0 0 0 +mbcs carriers: 1 3 3 +mbcs mseg carriers: 0 +mbcs sys_alloc carriers: 1 +mbcs carriers size: 32768 1343488 1343488 +mbcs mseg carriers size: 0 +mbcs sys_alloc carriers size: 32768 +mbcs_pool blocks[sys_alloc] count: 0 +mbcs_pool blocks[sys_alloc] size: 0 +mbcs_pool blocks[temp_alloc] count: 0 +mbcs_pool blocks[temp_alloc] size: 0 +mbcs_pool blocks[sl_alloc] count: 0 +mbcs_pool blocks[sl_alloc] size: 0 +mbcs_pool blocks[std_alloc] count: 0 +mbcs_pool blocks[std_alloc] size: 0 +mbcs_pool blocks[ll_alloc] count: 0 +mbcs_pool blocks[ll_alloc] size: 0 +mbcs_pool blocks[eheap_alloc] count: 0 +mbcs_pool blocks[eheap_alloc] size: 0 +mbcs_pool blocks[ets_alloc] count: 0 +mbcs_pool blocks[ets_alloc] size: 0 +mbcs_pool blocks[fix_alloc] count: 0 +mbcs_pool blocks[fix_alloc] size: 0 +mbcs_pool blocks[literal_alloc] count: 0 +mbcs_pool blocks[literal_alloc] size: 0 +mbcs_pool blocks[binary_alloc] count: 0 +mbcs_pool blocks[binary_alloc] size: 0 +mbcs_pool blocks[driver_alloc] count: 0 +mbcs_pool blocks[driver_alloc] size: 0 +mbcs_pool blocks[test_alloc] count: 0 +mbcs_pool blocks[test_alloc] size: 0 +mbcs_pool carriers: 0 +mbcs_pool carriers size: 0 +sbcs blocks[sys_alloc] count: 0 0 0 +sbcs blocks[sys_alloc] size: 0 0 0 +sbcs blocks[temp_alloc] count: 0 0 0 +sbcs blocks[temp_alloc] size: 0 0 0 +sbcs blocks[sl_alloc] count: 0 0 0 +sbcs blocks[sl_alloc] size: 0 0 0 +sbcs blocks[std_alloc] count: 0 0 0 +sbcs blocks[std_alloc] size: 0 0 0 +sbcs blocks[ll_alloc] count: 0 0 0 +sbcs blocks[ll_alloc] size: 0 0 0 +sbcs blocks[eheap_alloc] count: 0 0 0 +sbcs blocks[eheap_alloc] size: 0 0 0 +sbcs blocks[ets_alloc] count: 0 0 0 +sbcs blocks[ets_alloc] size: 0 0 0 +sbcs blocks[fix_alloc] count: 0 0 0 +sbcs blocks[fix_alloc] size: 0 0 0 +sbcs blocks[literal_alloc] count: 0 0 0 +sbcs blocks[literal_alloc] size: 0 0 0 +sbcs blocks[binary_alloc] count: 0 0 0 +sbcs blocks[binary_alloc] size: 0 0 0 +sbcs blocks[driver_alloc] count: 0 0 0 +sbcs blocks[driver_alloc] size: 0 0 0 +sbcs blocks[test_alloc] count: 0 0 0 +sbcs blocks[test_alloc] size: 0 0 0 +sbcs carriers: 0 0 0 +sbcs mseg carriers: 0 +sbcs sys_alloc carriers: 0 +sbcs carriers size: 0 0 0 +sbcs mseg carriers size: 0 +sbcs sys_alloc carriers size: 0 +sl_alloc calls: 966 +sl_free calls: 966 +sl_realloc calls: 2 +mseg_alloc calls: 2 +mseg_dealloc calls: 2 +mseg_realloc calls: 0 +sys_alloc calls: 1 +sys_free calls: 0 +sys_realloc calls: 0 +=allocator:sl_alloc[2] +versions: 0.9 3.0 +option e: true +option t: 5 +option ramv: false +option atags: false +option sbct: 524288 +option asbcst: 4145152 +option rsbcst: 80 +option rsbcmt: 80 +option rmbcmt: 50 +option mmbcs: 32768 +option mmsbc: 256 +option mmmbc: 18446744073709551615 +option lmbcs: 5242880 +option smbcs: 262144 +option mbcgs: 10 +option acul: 60 +option acful: 0 +option acnl: 1000 +option acfml: 0 +option cp: S +option as: aoffcbf +mbcs blocks[sys_alloc] count: 0 0 0 +mbcs blocks[sys_alloc] size: 0 0 0 +mbcs blocks[temp_alloc] count: 0 0 0 +mbcs blocks[temp_alloc] size: 0 0 0 +mbcs blocks[sl_alloc] count: 1 324 324 +mbcs blocks[sl_alloc] size: 120 276192 276192 +mbcs blocks[std_alloc] count: 0 0 0 +mbcs blocks[std_alloc] size: 0 0 0 +mbcs blocks[ll_alloc] count: 0 0 0 +mbcs blocks[ll_alloc] size: 0 0 0 +mbcs blocks[eheap_alloc] count: 0 0 0 +mbcs blocks[eheap_alloc] size: 0 0 0 +mbcs blocks[ets_alloc] count: 0 0 0 +mbcs blocks[ets_alloc] size: 0 0 0 +mbcs blocks[fix_alloc] count: 0 0 0 +mbcs blocks[fix_alloc] size: 0 0 0 +mbcs blocks[literal_alloc] count: 0 0 0 +mbcs blocks[literal_alloc] size: 0 0 0 +mbcs blocks[binary_alloc] count: 0 0 0 +mbcs blocks[binary_alloc] size: 0 0 0 +mbcs blocks[driver_alloc] count: 0 0 0 +mbcs blocks[driver_alloc] size: 0 0 0 +mbcs blocks[test_alloc] count: 0 0 0 +mbcs blocks[test_alloc] size: 0 0 0 +mbcs carriers: 1 2 2 +mbcs mseg carriers: 0 +mbcs sys_alloc carriers: 1 +mbcs carriers size: 32768 294912 294912 +mbcs mseg carriers size: 0 +mbcs sys_alloc carriers size: 32768 +mbcs_pool blocks[sys_alloc] count: 0 +mbcs_pool blocks[sys_alloc] size: 0 +mbcs_pool blocks[temp_alloc] count: 0 +mbcs_pool blocks[temp_alloc] size: 0 +mbcs_pool blocks[sl_alloc] count: 0 +mbcs_pool blocks[sl_alloc] size: 0 +mbcs_pool blocks[std_alloc] count: 0 +mbcs_pool blocks[std_alloc] size: 0 +mbcs_pool blocks[ll_alloc] count: 0 +mbcs_pool blocks[ll_alloc] size: 0 +mbcs_pool blocks[eheap_alloc] count: 0 +mbcs_pool blocks[eheap_alloc] size: 0 +mbcs_pool blocks[ets_alloc] count: 0 +mbcs_pool blocks[ets_alloc] size: 0 +mbcs_pool blocks[fix_alloc] count: 0 +mbcs_pool blocks[fix_alloc] size: 0 +mbcs_pool blocks[literal_alloc] count: 0 +mbcs_pool blocks[literal_alloc] size: 0 +mbcs_pool blocks[binary_alloc] count: 0 +mbcs_pool blocks[binary_alloc] size: 0 +mbcs_pool blocks[driver_alloc] count: 0 +mbcs_pool blocks[driver_alloc] size: 0 +mbcs_pool blocks[test_alloc] count: 0 +mbcs_pool blocks[test_alloc] size: 0 +mbcs_pool carriers: 0 +mbcs_pool carriers size: 0 +sbcs blocks[sys_alloc] count: 0 0 0 +sbcs blocks[sys_alloc] size: 0 0 0 +sbcs blocks[temp_alloc] count: 0 0 0 +sbcs blocks[temp_alloc] size: 0 0 0 +sbcs blocks[sl_alloc] count: 0 0 0 +sbcs blocks[sl_alloc] size: 0 0 0 +sbcs blocks[std_alloc] count: 0 0 0 +sbcs blocks[std_alloc] size: 0 0 0 +sbcs blocks[ll_alloc] count: 0 0 0 +sbcs blocks[ll_alloc] size: 0 0 0 +sbcs blocks[eheap_alloc] count: 0 0 0 +sbcs blocks[eheap_alloc] size: 0 0 0 +sbcs blocks[ets_alloc] count: 0 0 0 +sbcs blocks[ets_alloc] size: 0 0 0 +sbcs blocks[fix_alloc] count: 0 0 0 +sbcs blocks[fix_alloc] size: 0 0 0 +sbcs blocks[literal_alloc] count: 0 0 0 +sbcs blocks[literal_alloc] size: 0 0 0 +sbcs blocks[binary_alloc] count: 0 0 0 +sbcs blocks[binary_alloc] size: 0 0 0 +sbcs blocks[driver_alloc] count: 0 0 0 +sbcs blocks[driver_alloc] size: 0 0 0 +sbcs blocks[test_alloc] count: 0 0 0 +sbcs blocks[test_alloc] size: 0 0 0 +sbcs carriers: 0 0 0 +sbcs mseg carriers: 0 +sbcs sys_alloc carriers: 0 +sbcs carriers size: 0 0 0 +sbcs mseg carriers size: 0 +sbcs sys_alloc carriers size: 0 +sl_alloc calls: 3207 +sl_free calls: 3206 +sl_realloc calls: 4 +mseg_alloc calls: 14 +mseg_dealloc calls: 14 +mseg_realloc calls: 0 +sys_alloc calls: 1 +sys_free calls: 0 +sys_realloc calls: 0 +=allocator:sl_alloc[3] +versions: 0.9 3.0 +option e: true +option t: 5 +option ramv: false +option atags: false +option sbct: 524288 +option asbcst: 4145152 +option rsbcst: 80 +option rsbcmt: 80 +option rmbcmt: 50 +option mmbcs: 32768 +option mmsbc: 256 +option mmmbc: 18446744073709551615 +option lmbcs: 5242880 +option smbcs: 262144 +option mbcgs: 10 +option acul: 60 +option acful: 0 +option acnl: 1000 +option acfml: 0 +option cp: S +option as: aoffcbf +mbcs blocks[sys_alloc] count: 0 0 0 +mbcs blocks[sys_alloc] size: 0 0 0 +mbcs blocks[temp_alloc] count: 0 0 0 +mbcs blocks[temp_alloc] size: 0 0 0 +mbcs blocks[sl_alloc] count: 0 1 1 +mbcs blocks[sl_alloc] size: 0 64 64 +mbcs blocks[std_alloc] count: 0 0 0 +mbcs blocks[std_alloc] size: 0 0 0 +mbcs blocks[ll_alloc] count: 0 0 0 +mbcs blocks[ll_alloc] size: 0 0 0 +mbcs blocks[eheap_alloc] count: 0 0 0 +mbcs blocks[eheap_alloc] size: 0 0 0 +mbcs blocks[ets_alloc] count: 0 0 0 +mbcs blocks[ets_alloc] size: 0 0 0 +mbcs blocks[fix_alloc] count: 0 0 0 +mbcs blocks[fix_alloc] size: 0 0 0 +mbcs blocks[literal_alloc] count: 0 0 0 +mbcs blocks[literal_alloc] size: 0 0 0 +mbcs blocks[binary_alloc] count: 0 0 0 +mbcs blocks[binary_alloc] size: 0 0 0 +mbcs blocks[driver_alloc] count: 0 0 0 +mbcs blocks[driver_alloc] size: 0 0 0 +mbcs blocks[test_alloc] count: 0 0 0 +mbcs blocks[test_alloc] size: 0 0 0 +mbcs carriers: 1 1 1 +mbcs mseg carriers: 0 +mbcs sys_alloc carriers: 1 +mbcs carriers size: 32768 32768 32768 +mbcs mseg carriers size: 0 +mbcs sys_alloc carriers size: 32768 +mbcs_pool blocks[sys_alloc] count: 0 +mbcs_pool blocks[sys_alloc] size: 0 +mbcs_pool blocks[temp_alloc] count: 0 +mbcs_pool blocks[temp_alloc] size: 0 +mbcs_pool blocks[sl_alloc] count: 0 +mbcs_pool blocks[sl_alloc] size: 0 +mbcs_pool blocks[std_alloc] count: 0 +mbcs_pool blocks[std_alloc] size: 0 +mbcs_pool blocks[ll_alloc] count: 0 +mbcs_pool blocks[ll_alloc] size: 0 +mbcs_pool blocks[eheap_alloc] count: 0 +mbcs_pool blocks[eheap_alloc] size: 0 +mbcs_pool blocks[ets_alloc] count: 0 +mbcs_pool blocks[ets_alloc] size: 0 +mbcs_pool blocks[fix_alloc] count: 0 +mbcs_pool blocks[fix_alloc] size: 0 +mbcs_pool blocks[literal_alloc] count: 0 +mbcs_pool blocks[literal_alloc] size: 0 +mbcs_pool blocks[binary_alloc] count: 0 +mbcs_pool blocks[binary_alloc] size: 0 +mbcs_pool blocks[driver_alloc] count: 0 +mbcs_pool blocks[driver_alloc] size: 0 +mbcs_pool blocks[test_alloc] count: 0 +mbcs_pool blocks[test_alloc] size: 0 +mbcs_pool carriers: 0 +mbcs_pool carriers size: 0 +sbcs blocks[sys_alloc] count: 0 0 0 +sbcs blocks[sys_alloc] size: 0 0 0 +sbcs blocks[temp_alloc] count: 0 0 0 +sbcs blocks[temp_alloc] size: 0 0 0 +sbcs blocks[sl_alloc] count: 0 0 0 +sbcs blocks[sl_alloc] size: 0 0 0 +sbcs blocks[std_alloc] count: 0 0 0 +sbcs blocks[std_alloc] size: 0 0 0 +sbcs blocks[ll_alloc] count: 0 0 0 +sbcs blocks[ll_alloc] size: 0 0 0 +sbcs blocks[eheap_alloc] count: 0 0 0 +sbcs blocks[eheap_alloc] size: 0 0 0 +sbcs blocks[ets_alloc] count: 0 0 0 +sbcs blocks[ets_alloc] size: 0 0 0 +sbcs blocks[fix_alloc] count: 0 0 0 +sbcs blocks[fix_alloc] size: 0 0 0 +sbcs blocks[literal_alloc] count: 0 0 0 +sbcs blocks[literal_alloc] size: 0 0 0 +sbcs blocks[binary_alloc] count: 0 0 0 +sbcs blocks[binary_alloc] size: 0 0 0 +sbcs blocks[driver_alloc] count: 0 0 0 +sbcs blocks[driver_alloc] size: 0 0 0 +sbcs blocks[test_alloc] count: 0 0 0 +sbcs blocks[test_alloc] size: 0 0 0 +sbcs carriers: 0 0 0 +sbcs mseg carriers: 0 +sbcs sys_alloc carriers: 0 +sbcs carriers size: 0 0 0 +sbcs mseg carriers size: 0 +sbcs sys_alloc carriers size: 0 +sl_alloc calls: 1 +sl_free calls: 1 +sl_realloc calls: 0 +mseg_alloc calls: 0 +mseg_dealloc calls: 0 +mseg_realloc calls: 0 +sys_alloc calls: 1 +sys_free calls: 0 +sys_realloc calls: 0 +=allocator:sl_alloc[4] +versions: 0.9 3.0 +option e: true +option t: 5 +option ramv: false +option atags: false +option sbct: 524288 +option asbcst: 4145152 +option rsbcst: 80 +option rsbcmt: 80 +option rmbcmt: 50 +option mmbcs: 32768 +option mmsbc: 256 +option mmmbc: 18446744073709551615 +option lmbcs: 5242880 +option smbcs: 262144 +option mbcgs: 10 +option acul: 60 +option acful: 0 +option acnl: 1000 +option acfml: 0 +option cp: S +option as: aoffcbf +mbcs blocks[sys_alloc] count: 0 0 0 +mbcs blocks[sys_alloc] size: 0 0 0 +mbcs blocks[temp_alloc] count: 0 0 0 +mbcs blocks[temp_alloc] size: 0 0 0 +mbcs blocks[sl_alloc] count: 0 0 0 +mbcs blocks[sl_alloc] size: 0 0 0 +mbcs blocks[std_alloc] count: 0 0 0 +mbcs blocks[std_alloc] size: 0 0 0 +mbcs blocks[ll_alloc] count: 0 0 0 +mbcs blocks[ll_alloc] size: 0 0 0 +mbcs blocks[eheap_alloc] count: 0 0 0 +mbcs blocks[eheap_alloc] size: 0 0 0 +mbcs blocks[ets_alloc] count: 0 0 0 +mbcs blocks[ets_alloc] size: 0 0 0 +mbcs blocks[fix_alloc] count: 0 0 0 +mbcs blocks[fix_alloc] size: 0 0 0 +mbcs blocks[literal_alloc] count: 0 0 0 +mbcs blocks[literal_alloc] size: 0 0 0 +mbcs blocks[binary_alloc] count: 0 0 0 +mbcs blocks[binary_alloc] size: 0 0 0 +mbcs blocks[driver_alloc] count: 0 0 0 +mbcs blocks[driver_alloc] size: 0 0 0 +mbcs blocks[test_alloc] count: 0 0 0 +mbcs blocks[test_alloc] size: 0 0 0 +mbcs carriers: 1 1 1 +mbcs mseg carriers: 0 +mbcs sys_alloc carriers: 1 +mbcs carriers size: 32768 32768 32768 +mbcs mseg carriers size: 0 +mbcs sys_alloc carriers size: 32768 +mbcs_pool blocks[sys_alloc] count: 0 +mbcs_pool blocks[sys_alloc] size: 0 +mbcs_pool blocks[temp_alloc] count: 0 +mbcs_pool blocks[temp_alloc] size: 0 +mbcs_pool blocks[sl_alloc] count: 0 +mbcs_pool blocks[sl_alloc] size: 0 +mbcs_pool blocks[std_alloc] count: 0 +mbcs_pool blocks[std_alloc] size: 0 +mbcs_pool blocks[ll_alloc] count: 0 +mbcs_pool blocks[ll_alloc] size: 0 +mbcs_pool blocks[eheap_alloc] count: 0 +mbcs_pool blocks[eheap_alloc] size: 0 +mbcs_pool blocks[ets_alloc] count: 0 +mbcs_pool blocks[ets_alloc] size: 0 +mbcs_pool blocks[fix_alloc] count: 0 +mbcs_pool blocks[fix_alloc] size: 0 +mbcs_pool blocks[literal_alloc] count: 0 +mbcs_pool blocks[literal_alloc] size: 0 +mbcs_pool blocks[binary_alloc] count: 0 +mbcs_pool blocks[binary_alloc] size: 0 +mbcs_pool blocks[driver_alloc] count: 0 +mbcs_pool blocks[driver_alloc] size: 0 +mbcs_pool blocks[test_alloc] count: 0 +mbcs_pool blocks[test_alloc] size: 0 +mbcs_pool carriers: 0 +mbcs_pool carriers size: 0 +sbcs blocks[sys_alloc] count: 0 0 0 +sbcs blocks[sys_alloc] size: 0 0 0 +sbcs blocks[temp_alloc] count: 0 0 0 +sbcs blocks[temp_alloc] size: 0 0 0 +sbcs blocks[sl_alloc] count: 0 0 0 +sbcs blocks[sl_alloc] size: 0 0 0 +sbcs blocks[std_alloc] count: 0 0 0 +sbcs blocks[std_alloc] size: 0 0 0 +sbcs blocks[ll_alloc] count: 0 0 0 +sbcs blocks[ll_alloc] size: 0 0 0 +sbcs blocks[eheap_alloc] count: 0 0 0 +sbcs blocks[eheap_alloc] size: 0 0 0 +sbcs blocks[ets_alloc] count: 0 0 0 +sbcs blocks[ets_alloc] size: 0 0 0 +sbcs blocks[fix_alloc] count: 0 0 0 +sbcs blocks[fix_alloc] size: 0 0 0 +sbcs blocks[literal_alloc] count: 0 0 0 +sbcs blocks[literal_alloc] size: 0 0 0 +sbcs blocks[binary_alloc] count: 0 0 0 +sbcs blocks[binary_alloc] size: 0 0 0 +sbcs blocks[driver_alloc] count: 0 0 0 +sbcs blocks[driver_alloc] size: 0 0 0 +sbcs blocks[test_alloc] count: 0 0 0 +sbcs blocks[test_alloc] size: 0 0 0 +sbcs carriers: 0 0 0 +sbcs mseg carriers: 0 +sbcs sys_alloc carriers: 0 +sbcs carriers size: 0 0 0 +sbcs mseg carriers size: 0 +sbcs sys_alloc carriers size: 0 +sl_alloc calls: 0 +sl_free calls: 0 +sl_realloc calls: 0 +mseg_alloc calls: 0 +mseg_dealloc calls: 0 +mseg_realloc calls: 0 +sys_alloc calls: 1 +sys_free calls: 0 +sys_realloc calls: 0 +=allocator:std_alloc[0] +versions: 0.9 3.0 +option e: true +option t: 5 +option ramv: false +option atags: false +option sbct: 524288 +option asbcst: 4145152 +option rsbcst: 20 +option rsbcmt: 80 +option rmbcmt: 50 +option mmbcs: 32768 +option mmsbc: 256 +option mmmbc: 18446744073709551615 +option lmbcs: 5242880 +option smbcs: 262144 +option mbcgs: 10 +option acul: 0 +option acful: 0 +option acnl: 0 +option acfml: 0 +option cp: undefined +option as: aoffcbf +mbcs blocks[sys_alloc] count: 0 0 0 +mbcs blocks[sys_alloc] size: 0 0 0 +mbcs blocks[temp_alloc] count: 0 0 0 +mbcs blocks[temp_alloc] size: 0 0 0 +mbcs blocks[sl_alloc] count: 0 0 0 +mbcs blocks[sl_alloc] size: 0 0 0 +mbcs blocks[std_alloc] count: 18 22 22 +mbcs blocks[std_alloc] size: 135096 142992 142992 +mbcs blocks[ll_alloc] count: 0 0 0 +mbcs blocks[ll_alloc] size: 0 0 0 +mbcs blocks[eheap_alloc] count: 0 0 0 +mbcs blocks[eheap_alloc] size: 0 0 0 +mbcs blocks[ets_alloc] count: 0 0 0 +mbcs blocks[ets_alloc] size: 0 0 0 +mbcs blocks[fix_alloc] count: 0 0 0 +mbcs blocks[fix_alloc] size: 0 0 0 +mbcs blocks[literal_alloc] count: 0 0 0 +mbcs blocks[literal_alloc] size: 0 0 0 +mbcs blocks[binary_alloc] count: 0 0 0 +mbcs blocks[binary_alloc] size: 0 0 0 +mbcs blocks[driver_alloc] count: 0 0 0 +mbcs blocks[driver_alloc] size: 0 0 0 +mbcs blocks[test_alloc] count: 0 0 0 +mbcs blocks[test_alloc] size: 0 0 0 +mbcs carriers: 2 2 2 +mbcs mseg carriers: 1 +mbcs sys_alloc carriers: 1 +mbcs carriers size: 294912 294912 294912 +mbcs mseg carriers size: 262144 +mbcs sys_alloc carriers size: 32768 +sbcs blocks[sys_alloc] count: 0 0 0 +sbcs blocks[sys_alloc] size: 0 0 0 +sbcs blocks[temp_alloc] count: 0 0 0 +sbcs blocks[temp_alloc] size: 0 0 0 +sbcs blocks[sl_alloc] count: 0 0 0 +sbcs blocks[sl_alloc] size: 0 0 0 +sbcs blocks[std_alloc] count: 0 0 0 +sbcs blocks[std_alloc] size: 0 0 0 +sbcs blocks[ll_alloc] count: 0 0 0 +sbcs blocks[ll_alloc] size: 0 0 0 +sbcs blocks[eheap_alloc] count: 0 0 0 +sbcs blocks[eheap_alloc] size: 0 0 0 +sbcs blocks[ets_alloc] count: 0 0 0 +sbcs blocks[ets_alloc] size: 0 0 0 +sbcs blocks[fix_alloc] count: 0 0 0 +sbcs blocks[fix_alloc] size: 0 0 0 +sbcs blocks[literal_alloc] count: 0 0 0 +sbcs blocks[literal_alloc] size: 0 0 0 +sbcs blocks[binary_alloc] count: 0 0 0 +sbcs blocks[binary_alloc] size: 0 0 0 +sbcs blocks[driver_alloc] count: 0 0 0 +sbcs blocks[driver_alloc] size: 0 0 0 +sbcs blocks[test_alloc] count: 0 0 0 +sbcs blocks[test_alloc] size: 0 0 0 +sbcs carriers: 0 0 0 +sbcs mseg carriers: 0 +sbcs sys_alloc carriers: 0 +sbcs carriers size: 0 0 0 +sbcs mseg carriers size: 0 +sbcs sys_alloc carriers size: 0 +std_alloc calls: 42 +std_free calls: 24 +std_realloc calls: 1 +mseg_alloc calls: 1 +mseg_dealloc calls: 0 +mseg_realloc calls: 0 +sys_alloc calls: 1 +sys_free calls: 0 +sys_realloc calls: 0 +=allocator:std_alloc[1] +versions: 0.9 3.0 +option e: true +option t: 5 +option ramv: false +option atags: false +option sbct: 524288 +option asbcst: 4145152 +option rsbcst: 20 +option rsbcmt: 80 +option rmbcmt: 50 +option mmbcs: 32768 +option mmsbc: 256 +option mmmbc: 18446744073709551615 +option lmbcs: 5242880 +option smbcs: 262144 +option mbcgs: 10 +option acul: 60 +option acful: 0 +option acnl: 1000 +option acfml: 0 +option cp: D +option as: aoffcbf +mbcs blocks[sys_alloc] count: 0 0 0 +mbcs blocks[sys_alloc] size: 0 0 0 +mbcs blocks[temp_alloc] count: 0 0 0 +mbcs blocks[temp_alloc] size: 0 0 0 +mbcs blocks[sl_alloc] count: 0 0 0 +mbcs blocks[sl_alloc] size: 0 0 0 +mbcs blocks[std_alloc] count: 0 3 3 +mbcs blocks[std_alloc] size: 0 7400 7400 +mbcs blocks[ll_alloc] count: 0 0 0 +mbcs blocks[ll_alloc] size: 0 0 0 +mbcs blocks[eheap_alloc] count: 0 0 0 +mbcs blocks[eheap_alloc] size: 0 0 0 +mbcs blocks[ets_alloc] count: 0 0 0 +mbcs blocks[ets_alloc] size: 0 0 0 +mbcs blocks[fix_alloc] count: 0 0 0 +mbcs blocks[fix_alloc] size: 0 0 0 +mbcs blocks[literal_alloc] count: 0 0 0 +mbcs blocks[literal_alloc] size: 0 0 0 +mbcs blocks[binary_alloc] count: 0 0 0 +mbcs blocks[binary_alloc] size: 0 0 0 +mbcs blocks[driver_alloc] count: 0 0 0 +mbcs blocks[driver_alloc] size: 0 0 0 +mbcs blocks[test_alloc] count: 0 0 0 +mbcs blocks[test_alloc] size: 0 0 0 +mbcs carriers: 1 1 1 +mbcs mseg carriers: 0 +mbcs sys_alloc carriers: 1 +mbcs carriers size: 32768 32768 32768 +mbcs mseg carriers size: 0 +mbcs sys_alloc carriers size: 32768 +mbcs_pool blocks[sys_alloc] count: 0 +mbcs_pool blocks[sys_alloc] size: 0 +mbcs_pool blocks[temp_alloc] count: 0 +mbcs_pool blocks[temp_alloc] size: 0 +mbcs_pool blocks[sl_alloc] count: 0 +mbcs_pool blocks[sl_alloc] size: 0 +mbcs_pool blocks[std_alloc] count: 0 +mbcs_pool blocks[std_alloc] size: 0 +mbcs_pool blocks[ll_alloc] count: 0 +mbcs_pool blocks[ll_alloc] size: 0 +mbcs_pool blocks[eheap_alloc] count: 0 +mbcs_pool blocks[eheap_alloc] size: 0 +mbcs_pool blocks[ets_alloc] count: 0 +mbcs_pool blocks[ets_alloc] size: 0 +mbcs_pool blocks[fix_alloc] count: 0 +mbcs_pool blocks[fix_alloc] size: 0 +mbcs_pool blocks[literal_alloc] count: 0 +mbcs_pool blocks[literal_alloc] size: 0 +mbcs_pool blocks[binary_alloc] count: 0 +mbcs_pool blocks[binary_alloc] size: 0 +mbcs_pool blocks[driver_alloc] count: 0 +mbcs_pool blocks[driver_alloc] size: 0 +mbcs_pool blocks[test_alloc] count: 0 +mbcs_pool blocks[test_alloc] size: 0 +mbcs_pool carriers: 0 +mbcs_pool carriers size: 0 +sbcs blocks[sys_alloc] count: 0 0 0 +sbcs blocks[sys_alloc] size: 0 0 0 +sbcs blocks[temp_alloc] count: 0 0 0 +sbcs blocks[temp_alloc] size: 0 0 0 +sbcs blocks[sl_alloc] count: 0 0 0 +sbcs blocks[sl_alloc] size: 0 0 0 +sbcs blocks[std_alloc] count: 0 0 0 +sbcs blocks[std_alloc] size: 0 0 0 +sbcs blocks[ll_alloc] count: 0 0 0 +sbcs blocks[ll_alloc] size: 0 0 0 +sbcs blocks[eheap_alloc] count: 0 0 0 +sbcs blocks[eheap_alloc] size: 0 0 0 +sbcs blocks[ets_alloc] count: 0 0 0 +sbcs blocks[ets_alloc] size: 0 0 0 +sbcs blocks[fix_alloc] count: 0 0 0 +sbcs blocks[fix_alloc] size: 0 0 0 +sbcs blocks[literal_alloc] count: 0 0 0 +sbcs blocks[literal_alloc] size: 0 0 0 +sbcs blocks[binary_alloc] count: 0 0 0 +sbcs blocks[binary_alloc] size: 0 0 0 +sbcs blocks[driver_alloc] count: 0 0 0 +sbcs blocks[driver_alloc] size: 0 0 0 +sbcs blocks[test_alloc] count: 0 0 0 +sbcs blocks[test_alloc] size: 0 0 0 +sbcs carriers: 0 0 0 +sbcs mseg carriers: 0 +sbcs sys_alloc carriers: 0 +sbcs carriers size: 0 0 0 +sbcs mseg carriers size: 0 +sbcs sys_alloc carriers size: 0 +std_alloc calls: 14 +std_free calls: 14 +std_realloc calls: 0 +mseg_alloc calls: 0 +mseg_dealloc calls: 0 +mseg_realloc calls: 0 +sys_alloc calls: 1 +sys_free calls: 0 +sys_realloc calls: 0 +=allocator:std_alloc[2] +versions: 0.9 3.0 +option e: true +option t: 5 +option ramv: false +option atags: false +option sbct: 524288 +option asbcst: 4145152 +option rsbcst: 20 +option rsbcmt: 80 +option rmbcmt: 50 +option mmbcs: 32768 +option mmsbc: 256 +option mmmbc: 18446744073709551615 +option lmbcs: 5242880 +option smbcs: 262144 +option mbcgs: 10 +option acul: 60 +option acful: 0 +option acnl: 1000 +option acfml: 0 +option cp: D +option as: aoffcbf +mbcs blocks[sys_alloc] count: 0 0 0 +mbcs blocks[sys_alloc] size: 0 0 0 +mbcs blocks[temp_alloc] count: 0 0 0 +mbcs blocks[temp_alloc] size: 0 0 0 +mbcs blocks[sl_alloc] count: 0 0 0 +mbcs blocks[sl_alloc] size: 0 0 0 +mbcs blocks[std_alloc] count: 157 159 159 +mbcs blocks[std_alloc] size: 44480 51696 51696 +mbcs blocks[ll_alloc] count: 0 0 0 +mbcs blocks[ll_alloc] size: 0 0 0 +mbcs blocks[eheap_alloc] count: 0 0 0 +mbcs blocks[eheap_alloc] size: 0 0 0 +mbcs blocks[ets_alloc] count: 0 0 0 +mbcs blocks[ets_alloc] size: 0 0 0 +mbcs blocks[fix_alloc] count: 0 0 0 +mbcs blocks[fix_alloc] size: 0 0 0 +mbcs blocks[literal_alloc] count: 0 0 0 +mbcs blocks[literal_alloc] size: 0 0 0 +mbcs blocks[binary_alloc] count: 0 0 0 +mbcs blocks[binary_alloc] size: 0 0 0 +mbcs blocks[driver_alloc] count: 0 0 0 +mbcs blocks[driver_alloc] size: 0 0 0 +mbcs blocks[test_alloc] count: 0 0 0 +mbcs blocks[test_alloc] size: 0 0 0 +mbcs carriers: 2 2 2 +mbcs mseg carriers: 1 +mbcs sys_alloc carriers: 1 +mbcs carriers size: 294912 294912 294912 +mbcs mseg carriers size: 262144 +mbcs sys_alloc carriers size: 32768 +mbcs_pool blocks[sys_alloc] count: 0 +mbcs_pool blocks[sys_alloc] size: 0 +mbcs_pool blocks[temp_alloc] count: 0 +mbcs_pool blocks[temp_alloc] size: 0 +mbcs_pool blocks[sl_alloc] count: 0 +mbcs_pool blocks[sl_alloc] size: 0 +mbcs_pool blocks[std_alloc] count: 0 +mbcs_pool blocks[std_alloc] size: 0 +mbcs_pool blocks[ll_alloc] count: 0 +mbcs_pool blocks[ll_alloc] size: 0 +mbcs_pool blocks[eheap_alloc] count: 0 +mbcs_pool blocks[eheap_alloc] size: 0 +mbcs_pool blocks[ets_alloc] count: 0 +mbcs_pool blocks[ets_alloc] size: 0 +mbcs_pool blocks[fix_alloc] count: 0 +mbcs_pool blocks[fix_alloc] size: 0 +mbcs_pool blocks[literal_alloc] count: 0 +mbcs_pool blocks[literal_alloc] size: 0 +mbcs_pool blocks[binary_alloc] count: 0 +mbcs_pool blocks[binary_alloc] size: 0 +mbcs_pool blocks[driver_alloc] count: 0 +mbcs_pool blocks[driver_alloc] size: 0 +mbcs_pool blocks[test_alloc] count: 0 +mbcs_pool blocks[test_alloc] size: 0 +mbcs_pool carriers: 0 +mbcs_pool carriers size: 0 +sbcs blocks[sys_alloc] count: 0 0 0 +sbcs blocks[sys_alloc] size: 0 0 0 +sbcs blocks[temp_alloc] count: 0 0 0 +sbcs blocks[temp_alloc] size: 0 0 0 +sbcs blocks[sl_alloc] count: 0 0 0 +sbcs blocks[sl_alloc] size: 0 0 0 +sbcs blocks[std_alloc] count: 0 0 0 +sbcs blocks[std_alloc] size: 0 0 0 +sbcs blocks[ll_alloc] count: 0 0 0 +sbcs blocks[ll_alloc] size: 0 0 0 +sbcs blocks[eheap_alloc] count: 0 0 0 +sbcs blocks[eheap_alloc] size: 0 0 0 +sbcs blocks[ets_alloc] count: 0 0 0 +sbcs blocks[ets_alloc] size: 0 0 0 +sbcs blocks[fix_alloc] count: 0 0 0 +sbcs blocks[fix_alloc] size: 0 0 0 +sbcs blocks[literal_alloc] count: 0 0 0 +sbcs blocks[literal_alloc] size: 0 0 0 +sbcs blocks[binary_alloc] count: 0 0 0 +sbcs blocks[binary_alloc] size: 0 0 0 +sbcs blocks[driver_alloc] count: 0 0 0 +sbcs blocks[driver_alloc] size: 0 0 0 +sbcs blocks[test_alloc] count: 0 0 0 +sbcs blocks[test_alloc] size: 0 0 0 +sbcs carriers: 0 0 0 +sbcs mseg carriers: 0 +sbcs sys_alloc carriers: 0 +sbcs carriers size: 0 0 0 +sbcs mseg carriers size: 0 +sbcs sys_alloc carriers size: 0 +std_alloc calls: 479 +std_free calls: 322 +std_realloc calls: 2 +mseg_alloc calls: 7 +mseg_dealloc calls: 6 +mseg_realloc calls: 0 +sys_alloc calls: 1 +sys_free calls: 0 +sys_realloc calls: 0 +=allocator:std_alloc[3] +versions: 0.9 3.0 +option e: true +option t: 5 +option ramv: false +option atags: false +option sbct: 524288 +option asbcst: 4145152 +option rsbcst: 20 +option rsbcmt: 80 +option rmbcmt: 50 +option mmbcs: 32768 +option mmsbc: 256 +option mmmbc: 18446744073709551615 +option lmbcs: 5242880 +option smbcs: 262144 +option mbcgs: 10 +option acul: 60 +option acful: 0 +option acnl: 1000 +option acfml: 0 +option cp: D +option as: aoffcbf +mbcs blocks[sys_alloc] count: 0 0 0 +mbcs blocks[sys_alloc] size: 0 0 0 +mbcs blocks[temp_alloc] count: 0 0 0 +mbcs blocks[temp_alloc] size: 0 0 0 +mbcs blocks[sl_alloc] count: 0 0 0 +mbcs blocks[sl_alloc] size: 0 0 0 +mbcs blocks[std_alloc] count: 0 0 0 +mbcs blocks[std_alloc] size: 0 0 0 +mbcs blocks[ll_alloc] count: 0 0 0 +mbcs blocks[ll_alloc] size: 0 0 0 +mbcs blocks[eheap_alloc] count: 0 0 0 +mbcs blocks[eheap_alloc] size: 0 0 0 +mbcs blocks[ets_alloc] count: 0 0 0 +mbcs blocks[ets_alloc] size: 0 0 0 +mbcs blocks[fix_alloc] count: 0 0 0 +mbcs blocks[fix_alloc] size: 0 0 0 +mbcs blocks[literal_alloc] count: 0 0 0 +mbcs blocks[literal_alloc] size: 0 0 0 +mbcs blocks[binary_alloc] count: 0 0 0 +mbcs blocks[binary_alloc] size: 0 0 0 +mbcs blocks[driver_alloc] count: 0 0 0 +mbcs blocks[driver_alloc] size: 0 0 0 +mbcs blocks[test_alloc] count: 0 0 0 +mbcs blocks[test_alloc] size: 0 0 0 +mbcs carriers: 1 1 1 +mbcs mseg carriers: 0 +mbcs sys_alloc carriers: 1 +mbcs carriers size: 32768 32768 32768 +mbcs mseg carriers size: 0 +mbcs sys_alloc carriers size: 32768 +mbcs_pool blocks[sys_alloc] count: 0 +mbcs_pool blocks[sys_alloc] size: 0 +mbcs_pool blocks[temp_alloc] count: 0 +mbcs_pool blocks[temp_alloc] size: 0 +mbcs_pool blocks[sl_alloc] count: 0 +mbcs_pool blocks[sl_alloc] size: 0 +mbcs_pool blocks[std_alloc] count: 0 +mbcs_pool blocks[std_alloc] size: 0 +mbcs_pool blocks[ll_alloc] count: 0 +mbcs_pool blocks[ll_alloc] size: 0 +mbcs_pool blocks[eheap_alloc] count: 0 +mbcs_pool blocks[eheap_alloc] size: 0 +mbcs_pool blocks[ets_alloc] count: 0 +mbcs_pool blocks[ets_alloc] size: 0 +mbcs_pool blocks[fix_alloc] count: 0 +mbcs_pool blocks[fix_alloc] size: 0 +mbcs_pool blocks[literal_alloc] count: 0 +mbcs_pool blocks[literal_alloc] size: 0 +mbcs_pool blocks[binary_alloc] count: 0 +mbcs_pool blocks[binary_alloc] size: 0 +mbcs_pool blocks[driver_alloc] count: 0 +mbcs_pool blocks[driver_alloc] size: 0 +mbcs_pool blocks[test_alloc] count: 0 +mbcs_pool blocks[test_alloc] size: 0 +mbcs_pool carriers: 0 +mbcs_pool carriers size: 0 +sbcs blocks[sys_alloc] count: 0 0 0 +sbcs blocks[sys_alloc] size: 0 0 0 +sbcs blocks[temp_alloc] count: 0 0 0 +sbcs blocks[temp_alloc] size: 0 0 0 +sbcs blocks[sl_alloc] count: 0 0 0 +sbcs blocks[sl_alloc] size: 0 0 0 +sbcs blocks[std_alloc] count: 0 0 0 +sbcs blocks[std_alloc] size: 0 0 0 +sbcs blocks[ll_alloc] count: 0 0 0 +sbcs blocks[ll_alloc] size: 0 0 0 +sbcs blocks[eheap_alloc] count: 0 0 0 +sbcs blocks[eheap_alloc] size: 0 0 0 +sbcs blocks[ets_alloc] count: 0 0 0 +sbcs blocks[ets_alloc] size: 0 0 0 +sbcs blocks[fix_alloc] count: 0 0 0 +sbcs blocks[fix_alloc] size: 0 0 0 +sbcs blocks[literal_alloc] count: 0 0 0 +sbcs blocks[literal_alloc] size: 0 0 0 +sbcs blocks[binary_alloc] count: 0 0 0 +sbcs blocks[binary_alloc] size: 0 0 0 +sbcs blocks[driver_alloc] count: 0 0 0 +sbcs blocks[driver_alloc] size: 0 0 0 +sbcs blocks[test_alloc] count: 0 0 0 +sbcs blocks[test_alloc] size: 0 0 0 +sbcs carriers: 0 0 0 +sbcs mseg carriers: 0 +sbcs sys_alloc carriers: 0 +sbcs carriers size: 0 0 0 +sbcs mseg carriers size: 0 +sbcs sys_alloc carriers size: 0 +std_alloc calls: 0 +std_free calls: 0 +std_realloc calls: 0 +mseg_alloc calls: 0 +mseg_dealloc calls: 0 +mseg_realloc calls: 0 +sys_alloc calls: 1 +sys_free calls: 0 +sys_realloc calls: 0 +=allocator:std_alloc[4] +versions: 0.9 3.0 +option e: true +option t: 5 +option ramv: false +option atags: false +option sbct: 524288 +option asbcst: 4145152 +option rsbcst: 20 +option rsbcmt: 80 +option rmbcmt: 50 +option mmbcs: 32768 +option mmsbc: 256 +option mmmbc: 18446744073709551615 +option lmbcs: 5242880 +option smbcs: 262144 +option mbcgs: 10 +option acul: 60 +option acful: 0 +option acnl: 1000 +option acfml: 0 +option cp: D +option as: aoffcbf +mbcs blocks[sys_alloc] count: 0 0 0 +mbcs blocks[sys_alloc] size: 0 0 0 +mbcs blocks[temp_alloc] count: 0 0 0 +mbcs blocks[temp_alloc] size: 0 0 0 +mbcs blocks[sl_alloc] count: 0 0 0 +mbcs blocks[sl_alloc] size: 0 0 0 +mbcs blocks[std_alloc] count: 1 1 1 +mbcs blocks[std_alloc] size: 64 64 64 +mbcs blocks[ll_alloc] count: 0 0 0 +mbcs blocks[ll_alloc] size: 0 0 0 +mbcs blocks[eheap_alloc] count: 0 0 0 +mbcs blocks[eheap_alloc] size: 0 0 0 +mbcs blocks[ets_alloc] count: 0 0 0 +mbcs blocks[ets_alloc] size: 0 0 0 +mbcs blocks[fix_alloc] count: 0 0 0 +mbcs blocks[fix_alloc] size: 0 0 0 +mbcs blocks[literal_alloc] count: 0 0 0 +mbcs blocks[literal_alloc] size: 0 0 0 +mbcs blocks[binary_alloc] count: 0 0 0 +mbcs blocks[binary_alloc] size: 0 0 0 +mbcs blocks[driver_alloc] count: 0 0 0 +mbcs blocks[driver_alloc] size: 0 0 0 +mbcs blocks[test_alloc] count: 0 0 0 +mbcs blocks[test_alloc] size: 0 0 0 +mbcs carriers: 1 1 1 +mbcs mseg carriers: 0 +mbcs sys_alloc carriers: 1 +mbcs carriers size: 32768 32768 32768 +mbcs mseg carriers size: 0 +mbcs sys_alloc carriers size: 32768 +mbcs_pool blocks[sys_alloc] count: 0 +mbcs_pool blocks[sys_alloc] size: 0 +mbcs_pool blocks[temp_alloc] count: 0 +mbcs_pool blocks[temp_alloc] size: 0 +mbcs_pool blocks[sl_alloc] count: 0 +mbcs_pool blocks[sl_alloc] size: 0 +mbcs_pool blocks[std_alloc] count: 0 +mbcs_pool blocks[std_alloc] size: 0 +mbcs_pool blocks[ll_alloc] count: 0 +mbcs_pool blocks[ll_alloc] size: 0 +mbcs_pool blocks[eheap_alloc] count: 0 +mbcs_pool blocks[eheap_alloc] size: 0 +mbcs_pool blocks[ets_alloc] count: 0 +mbcs_pool blocks[ets_alloc] size: 0 +mbcs_pool blocks[fix_alloc] count: 0 +mbcs_pool blocks[fix_alloc] size: 0 +mbcs_pool blocks[literal_alloc] count: 0 +mbcs_pool blocks[literal_alloc] size: 0 +mbcs_pool blocks[binary_alloc] count: 0 +mbcs_pool blocks[binary_alloc] size: 0 +mbcs_pool blocks[driver_alloc] count: 0 +mbcs_pool blocks[driver_alloc] size: 0 +mbcs_pool blocks[test_alloc] count: 0 +mbcs_pool blocks[test_alloc] size: 0 +mbcs_pool carriers: 0 +mbcs_pool carriers size: 0 +sbcs blocks[sys_alloc] count: 0 0 0 +sbcs blocks[sys_alloc] size: 0 0 0 +sbcs blocks[temp_alloc] count: 0 0 0 +sbcs blocks[temp_alloc] size: 0 0 0 +sbcs blocks[sl_alloc] count: 0 0 0 +sbcs blocks[sl_alloc] size: 0 0 0 +sbcs blocks[std_alloc] count: 0 0 0 +sbcs blocks[std_alloc] size: 0 0 0 +sbcs blocks[ll_alloc] count: 0 0 0 +sbcs blocks[ll_alloc] size: 0 0 0 +sbcs blocks[eheap_alloc] count: 0 0 0 +sbcs blocks[eheap_alloc] size: 0 0 0 +sbcs blocks[ets_alloc] count: 0 0 0 +sbcs blocks[ets_alloc] size: 0 0 0 +sbcs blocks[fix_alloc] count: 0 0 0 +sbcs blocks[fix_alloc] size: 0 0 0 +sbcs blocks[literal_alloc] count: 0 0 0 +sbcs blocks[literal_alloc] size: 0 0 0 +sbcs blocks[binary_alloc] count: 0 0 0 +sbcs blocks[binary_alloc] size: 0 0 0 +sbcs blocks[driver_alloc] count: 0 0 0 +sbcs blocks[driver_alloc] size: 0 0 0 +sbcs blocks[test_alloc] count: 0 0 0 +sbcs blocks[test_alloc] size: 0 0 0 +sbcs carriers: 0 0 0 +sbcs mseg carriers: 0 +sbcs sys_alloc carriers: 0 +sbcs carriers size: 0 0 0 +sbcs mseg carriers size: 0 +sbcs sys_alloc carriers size: 0 +std_alloc calls: 1 +std_free calls: 0 +std_realloc calls: 0 +mseg_alloc calls: 0 +mseg_dealloc calls: 0 +mseg_realloc calls: 0 +sys_alloc calls: 1 +sys_free calls: 0 +sys_realloc calls: 0 +=allocator:ll_alloc[0] +versions: 0.9 3.0 +option e: true +option t: 5 +option ramv: false +option atags: false +option sbct: 18446744073709551615 +option asbcst: 0 +option rsbcst: 0 +option rsbcmt: 0 +option rmbcmt: 0 +option mmbcs: 524288 +option mmsbc: 0 +option mmmbc: 18446744073709551615 +option lmbcs: 5242880 +option smbcs: 262144 +option mbcgs: 10 +option acul: 0 +option acful: 0 +option acnl: 0 +option acfml: 0 +option cp: undefined +option as: aoffcbf +mbcs blocks[sys_alloc] count: 0 0 0 +mbcs blocks[sys_alloc] size: 0 0 0 +mbcs blocks[temp_alloc] count: 0 0 0 +mbcs blocks[temp_alloc] size: 0 0 0 +mbcs blocks[sl_alloc] count: 0 0 0 +mbcs blocks[sl_alloc] size: 0 0 0 +mbcs blocks[std_alloc] count: 0 0 0 +mbcs blocks[std_alloc] size: 0 0 0 +mbcs blocks[ll_alloc] count: 4003 4005 4005 +mbcs blocks[ll_alloc] size: 36733136 36766080 36766080 +mbcs blocks[eheap_alloc] count: 0 0 0 +mbcs blocks[eheap_alloc] size: 0 0 0 +mbcs blocks[ets_alloc] count: 0 0 0 +mbcs blocks[ets_alloc] size: 0 0 0 +mbcs blocks[fix_alloc] count: 0 0 0 +mbcs blocks[fix_alloc] size: 0 0 0 +mbcs blocks[literal_alloc] count: 0 0 0 +mbcs blocks[literal_alloc] size: 0 0 0 +mbcs blocks[binary_alloc] count: 0 0 0 +mbcs blocks[binary_alloc] size: 0 0 0 +mbcs blocks[driver_alloc] count: 0 0 0 +mbcs blocks[driver_alloc] size: 0 0 0 +mbcs blocks[test_alloc] count: 0 0 0 +mbcs blocks[test_alloc] size: 0 0 0 +mbcs carriers: 3 3 3 +mbcs mseg carriers: 2 +mbcs sys_alloc carriers: 1 +mbcs carriers size: 67633152 67633152 67633152 +mbcs mseg carriers size: 67108864 +mbcs sys_alloc carriers size: 524288 +sbcs blocks[sys_alloc] count: 0 0 0 +sbcs blocks[sys_alloc] size: 0 0 0 +sbcs blocks[temp_alloc] count: 0 0 0 +sbcs blocks[temp_alloc] size: 0 0 0 +sbcs blocks[sl_alloc] count: 0 0 0 +sbcs blocks[sl_alloc] size: 0 0 0 +sbcs blocks[std_alloc] count: 0 0 0 +sbcs blocks[std_alloc] size: 0 0 0 +sbcs blocks[ll_alloc] count: 0 0 0 +sbcs blocks[ll_alloc] size: 0 0 0 +sbcs blocks[eheap_alloc] count: 0 0 0 +sbcs blocks[eheap_alloc] size: 0 0 0 +sbcs blocks[ets_alloc] count: 0 0 0 +sbcs blocks[ets_alloc] size: 0 0 0 +sbcs blocks[fix_alloc] count: 0 0 0 +sbcs blocks[fix_alloc] size: 0 0 0 +sbcs blocks[literal_alloc] count: 0 0 0 +sbcs blocks[literal_alloc] size: 0 0 0 +sbcs blocks[binary_alloc] count: 0 0 0 +sbcs blocks[binary_alloc] size: 0 0 0 +sbcs blocks[driver_alloc] count: 0 0 0 +sbcs blocks[driver_alloc] size: 0 0 0 +sbcs blocks[test_alloc] count: 0 0 0 +sbcs blocks[test_alloc] size: 0 0 0 +sbcs carriers: 0 0 0 +sbcs mseg carriers: 0 +sbcs sys_alloc carriers: 0 +sbcs carriers size: 0 0 0 +sbcs mseg carriers size: 0 +sbcs sys_alloc carriers size: 0 +ll_alloc calls: 4006 +ll_free calls: 3 +ll_realloc calls: 0 +mseg_alloc calls: 2 +mseg_dealloc calls: 0 +mseg_realloc calls: 0 +sys_alloc calls: 1 +sys_free calls: 0 +sys_realloc calls: 0 +=allocator:ll_alloc[1] +versions: 0.9 3.0 +option e: true +option t: 5 +option ramv: false +option atags: false +option sbct: 18446744073709551615 +option asbcst: 0 +option rsbcst: 0 +option rsbcmt: 0 +option rmbcmt: 0 +option mmbcs: 524288 +option mmsbc: 0 +option mmmbc: 18446744073709551615 +option lmbcs: 5242880 +option smbcs: 262144 +option mbcgs: 10 +option acul: 85 +option acful: 0 +option acnl: 1000 +option acfml: 0 +option cp: L +option as: aoffcbf +mbcs blocks[sys_alloc] count: 0 0 0 +mbcs blocks[sys_alloc] size: 0 0 0 +mbcs blocks[temp_alloc] count: 0 0 0 +mbcs blocks[temp_alloc] size: 0 0 0 +mbcs blocks[sl_alloc] count: 0 0 0 +mbcs blocks[sl_alloc] size: 0 0 0 +mbcs blocks[std_alloc] count: 0 0 0 +mbcs blocks[std_alloc] size: 0 0 0 +mbcs blocks[ll_alloc] count: 2379 2379 2379 +mbcs blocks[ll_alloc] size: 275168 275168 275168 +mbcs blocks[eheap_alloc] count: 0 0 0 +mbcs blocks[eheap_alloc] size: 0 0 0 +mbcs blocks[ets_alloc] count: 0 0 0 +mbcs blocks[ets_alloc] size: 0 0 0 +mbcs blocks[fix_alloc] count: 0 0 0 +mbcs blocks[fix_alloc] size: 0 0 0 +mbcs blocks[literal_alloc] count: 0 0 0 +mbcs blocks[literal_alloc] size: 0 0 0 +mbcs blocks[binary_alloc] count: 0 0 0 +mbcs blocks[binary_alloc] size: 0 0 0 +mbcs blocks[driver_alloc] count: 0 0 0 +mbcs blocks[driver_alloc] size: 0 0 0 +mbcs blocks[test_alloc] count: 0 0 0 +mbcs blocks[test_alloc] size: 0 0 0 +mbcs carriers: 1 1 1 +mbcs mseg carriers: 0 +mbcs sys_alloc carriers: 1 +mbcs carriers size: 524288 524288 524288 +mbcs mseg carriers size: 0 +mbcs sys_alloc carriers size: 524288 +mbcs_pool blocks[sys_alloc] count: 0 +mbcs_pool blocks[sys_alloc] size: 0 +mbcs_pool blocks[temp_alloc] count: 0 +mbcs_pool blocks[temp_alloc] size: 0 +mbcs_pool blocks[sl_alloc] count: 0 +mbcs_pool blocks[sl_alloc] size: 0 +mbcs_pool blocks[std_alloc] count: 0 +mbcs_pool blocks[std_alloc] size: 0 +mbcs_pool blocks[ll_alloc] count: 0 +mbcs_pool blocks[ll_alloc] size: 0 +mbcs_pool blocks[eheap_alloc] count: 0 +mbcs_pool blocks[eheap_alloc] size: 0 +mbcs_pool blocks[ets_alloc] count: 0 +mbcs_pool blocks[ets_alloc] size: 0 +mbcs_pool blocks[fix_alloc] count: 0 +mbcs_pool blocks[fix_alloc] size: 0 +mbcs_pool blocks[literal_alloc] count: 0 +mbcs_pool blocks[literal_alloc] size: 0 +mbcs_pool blocks[binary_alloc] count: 0 +mbcs_pool blocks[binary_alloc] size: 0 +mbcs_pool blocks[driver_alloc] count: 0 +mbcs_pool blocks[driver_alloc] size: 0 +mbcs_pool blocks[test_alloc] count: 0 +mbcs_pool blocks[test_alloc] size: 0 +mbcs_pool carriers: 0 +mbcs_pool carriers size: 0 +sbcs blocks[sys_alloc] count: 0 0 0 +sbcs blocks[sys_alloc] size: 0 0 0 +sbcs blocks[temp_alloc] count: 0 0 0 +sbcs blocks[temp_alloc] size: 0 0 0 +sbcs blocks[sl_alloc] count: 0 0 0 +sbcs blocks[sl_alloc] size: 0 0 0 +sbcs blocks[std_alloc] count: 0 0 0 +sbcs blocks[std_alloc] size: 0 0 0 +sbcs blocks[ll_alloc] count: 0 0 0 +sbcs blocks[ll_alloc] size: 0 0 0 +sbcs blocks[eheap_alloc] count: 0 0 0 +sbcs blocks[eheap_alloc] size: 0 0 0 +sbcs blocks[ets_alloc] count: 0 0 0 +sbcs blocks[ets_alloc] size: 0 0 0 +sbcs blocks[fix_alloc] count: 0 0 0 +sbcs blocks[fix_alloc] size: 0 0 0 +sbcs blocks[literal_alloc] count: 0 0 0 +sbcs blocks[literal_alloc] size: 0 0 0 +sbcs blocks[binary_alloc] count: 0 0 0 +sbcs blocks[binary_alloc] size: 0 0 0 +sbcs blocks[driver_alloc] count: 0 0 0 +sbcs blocks[driver_alloc] size: 0 0 0 +sbcs blocks[test_alloc] count: 0 0 0 +sbcs blocks[test_alloc] size: 0 0 0 +sbcs carriers: 0 0 0 +sbcs mseg carriers: 0 +sbcs sys_alloc carriers: 0 +sbcs carriers size: 0 0 0 +sbcs mseg carriers size: 0 +sbcs sys_alloc carriers size: 0 +ll_alloc calls: 2379 +ll_free calls: 0 +ll_realloc calls: 0 +mseg_alloc calls: 0 +mseg_dealloc calls: 0 +mseg_realloc calls: 0 +sys_alloc calls: 1 +sys_free calls: 0 +sys_realloc calls: 0 +=allocator:ll_alloc[2] +versions: 0.9 3.0 +option e: true +option t: 5 +option ramv: false +option atags: false +option sbct: 18446744073709551615 +option asbcst: 0 +option rsbcst: 0 +option rsbcmt: 0 +option rmbcmt: 0 +option mmbcs: 524288 +option mmsbc: 0 +option mmmbc: 18446744073709551615 +option lmbcs: 5242880 +option smbcs: 262144 +option mbcgs: 10 +option acul: 85 +option acful: 0 +option acnl: 1000 +option acfml: 0 +option cp: L +option as: aoffcbf +mbcs blocks[sys_alloc] count: 0 0 0 +mbcs blocks[sys_alloc] size: 0 0 0 +mbcs blocks[temp_alloc] count: 0 0 0 +mbcs blocks[temp_alloc] size: 0 0 0 +mbcs blocks[sl_alloc] count: 0 0 0 +mbcs blocks[sl_alloc] size: 0 0 0 +mbcs blocks[std_alloc] count: 0 0 0 +mbcs blocks[std_alloc] size: 0 0 0 +mbcs blocks[ll_alloc] count: 7804 7804 7804 +mbcs blocks[ll_alloc] size: 1175888 1175888 1175888 +mbcs blocks[eheap_alloc] count: 0 0 0 +mbcs blocks[eheap_alloc] size: 0 0 0 +mbcs blocks[ets_alloc] count: 0 0 0 +mbcs blocks[ets_alloc] size: 0 0 0 +mbcs blocks[fix_alloc] count: 0 0 0 +mbcs blocks[fix_alloc] size: 0 0 0 +mbcs blocks[literal_alloc] count: 0 0 0 +mbcs blocks[literal_alloc] size: 0 0 0 +mbcs blocks[binary_alloc] count: 0 0 0 +mbcs blocks[binary_alloc] size: 0 0 0 +mbcs blocks[driver_alloc] count: 0 0 0 +mbcs blocks[driver_alloc] size: 0 0 0 +mbcs blocks[test_alloc] count: 0 0 0 +mbcs blocks[test_alloc] size: 0 0 0 +mbcs carriers: 3 3 3 +mbcs mseg carriers: 2 +mbcs sys_alloc carriers: 1 +mbcs carriers size: 1835008 1835008 1835008 +mbcs mseg carriers size: 1310720 +mbcs sys_alloc carriers size: 524288 +mbcs_pool blocks[sys_alloc] count: 0 +mbcs_pool blocks[sys_alloc] size: 0 +mbcs_pool blocks[temp_alloc] count: 0 +mbcs_pool blocks[temp_alloc] size: 0 +mbcs_pool blocks[sl_alloc] count: 0 +mbcs_pool blocks[sl_alloc] size: 0 +mbcs_pool blocks[std_alloc] count: 0 +mbcs_pool blocks[std_alloc] size: 0 +mbcs_pool blocks[ll_alloc] count: 0 +mbcs_pool blocks[ll_alloc] size: 0 +mbcs_pool blocks[eheap_alloc] count: 0 +mbcs_pool blocks[eheap_alloc] size: 0 +mbcs_pool blocks[ets_alloc] count: 0 +mbcs_pool blocks[ets_alloc] size: 0 +mbcs_pool blocks[fix_alloc] count: 0 +mbcs_pool blocks[fix_alloc] size: 0 +mbcs_pool blocks[literal_alloc] count: 0 +mbcs_pool blocks[literal_alloc] size: 0 +mbcs_pool blocks[binary_alloc] count: 0 +mbcs_pool blocks[binary_alloc] size: 0 +mbcs_pool blocks[driver_alloc] count: 0 +mbcs_pool blocks[driver_alloc] size: 0 +mbcs_pool blocks[test_alloc] count: 0 +mbcs_pool blocks[test_alloc] size: 0 +mbcs_pool carriers: 0 +mbcs_pool carriers size: 0 +sbcs blocks[sys_alloc] count: 0 0 0 +sbcs blocks[sys_alloc] size: 0 0 0 +sbcs blocks[temp_alloc] count: 0 0 0 +sbcs blocks[temp_alloc] size: 0 0 0 +sbcs blocks[sl_alloc] count: 0 0 0 +sbcs blocks[sl_alloc] size: 0 0 0 +sbcs blocks[std_alloc] count: 0 0 0 +sbcs blocks[std_alloc] size: 0 0 0 +sbcs blocks[ll_alloc] count: 0 0 0 +sbcs blocks[ll_alloc] size: 0 0 0 +sbcs blocks[eheap_alloc] count: 0 0 0 +sbcs blocks[eheap_alloc] size: 0 0 0 +sbcs blocks[ets_alloc] count: 0 0 0 +sbcs blocks[ets_alloc] size: 0 0 0 +sbcs blocks[fix_alloc] count: 0 0 0 +sbcs blocks[fix_alloc] size: 0 0 0 +sbcs blocks[literal_alloc] count: 0 0 0 +sbcs blocks[literal_alloc] size: 0 0 0 +sbcs blocks[binary_alloc] count: 0 0 0 +sbcs blocks[binary_alloc] size: 0 0 0 +sbcs blocks[driver_alloc] count: 0 0 0 +sbcs blocks[driver_alloc] size: 0 0 0 +sbcs blocks[test_alloc] count: 0 0 0 +sbcs blocks[test_alloc] size: 0 0 0 +sbcs carriers: 0 0 0 +sbcs mseg carriers: 0 +sbcs sys_alloc carriers: 0 +sbcs carriers size: 0 0 0 +sbcs mseg carriers size: 0 +sbcs sys_alloc carriers size: 0 +ll_alloc calls: 7807 +ll_free calls: 3 +ll_realloc calls: 0 +mseg_alloc calls: 2 +mseg_dealloc calls: 0 +mseg_realloc calls: 0 +sys_alloc calls: 1 +sys_free calls: 0 +sys_realloc calls: 0 +=allocator:ll_alloc[3] +versions: 0.9 3.0 +option e: true +option t: 5 +option ramv: false +option atags: false +option sbct: 18446744073709551615 +option asbcst: 0 +option rsbcst: 0 +option rsbcmt: 0 +option rmbcmt: 0 +option mmbcs: 524288 +option mmsbc: 0 +option mmmbc: 18446744073709551615 +option lmbcs: 5242880 +option smbcs: 262144 +option mbcgs: 10 +option acul: 85 +option acful: 0 +option acnl: 1000 +option acfml: 0 +option cp: L +option as: aoffcbf +mbcs blocks[sys_alloc] count: 0 0 0 +mbcs blocks[sys_alloc] size: 0 0 0 +mbcs blocks[temp_alloc] count: 0 0 0 +mbcs blocks[temp_alloc] size: 0 0 0 +mbcs blocks[sl_alloc] count: 0 0 0 +mbcs blocks[sl_alloc] size: 0 0 0 +mbcs blocks[std_alloc] count: 0 0 0 +mbcs blocks[std_alloc] size: 0 0 0 +mbcs blocks[ll_alloc] count: 0 0 0 +mbcs blocks[ll_alloc] size: 0 0 0 +mbcs blocks[eheap_alloc] count: 0 0 0 +mbcs blocks[eheap_alloc] size: 0 0 0 +mbcs blocks[ets_alloc] count: 0 0 0 +mbcs blocks[ets_alloc] size: 0 0 0 +mbcs blocks[fix_alloc] count: 0 0 0 +mbcs blocks[fix_alloc] size: 0 0 0 +mbcs blocks[literal_alloc] count: 0 0 0 +mbcs blocks[literal_alloc] size: 0 0 0 +mbcs blocks[binary_alloc] count: 0 0 0 +mbcs blocks[binary_alloc] size: 0 0 0 +mbcs blocks[driver_alloc] count: 0 0 0 +mbcs blocks[driver_alloc] size: 0 0 0 +mbcs blocks[test_alloc] count: 0 0 0 +mbcs blocks[test_alloc] size: 0 0 0 +mbcs carriers: 1 1 1 +mbcs mseg carriers: 0 +mbcs sys_alloc carriers: 1 +mbcs carriers size: 524288 524288 524288 +mbcs mseg carriers size: 0 +mbcs sys_alloc carriers size: 524288 +mbcs_pool blocks[sys_alloc] count: 0 +mbcs_pool blocks[sys_alloc] size: 0 +mbcs_pool blocks[temp_alloc] count: 0 +mbcs_pool blocks[temp_alloc] size: 0 +mbcs_pool blocks[sl_alloc] count: 0 +mbcs_pool blocks[sl_alloc] size: 0 +mbcs_pool blocks[std_alloc] count: 0 +mbcs_pool blocks[std_alloc] size: 0 +mbcs_pool blocks[ll_alloc] count: 0 +mbcs_pool blocks[ll_alloc] size: 0 +mbcs_pool blocks[eheap_alloc] count: 0 +mbcs_pool blocks[eheap_alloc] size: 0 +mbcs_pool blocks[ets_alloc] count: 0 +mbcs_pool blocks[ets_alloc] size: 0 +mbcs_pool blocks[fix_alloc] count: 0 +mbcs_pool blocks[fix_alloc] size: 0 +mbcs_pool blocks[literal_alloc] count: 0 +mbcs_pool blocks[literal_alloc] size: 0 +mbcs_pool blocks[binary_alloc] count: 0 +mbcs_pool blocks[binary_alloc] size: 0 +mbcs_pool blocks[driver_alloc] count: 0 +mbcs_pool blocks[driver_alloc] size: 0 +mbcs_pool blocks[test_alloc] count: 0 +mbcs_pool blocks[test_alloc] size: 0 +mbcs_pool carriers: 0 +mbcs_pool carriers size: 0 +sbcs blocks[sys_alloc] count: 0 0 0 +sbcs blocks[sys_alloc] size: 0 0 0 +sbcs blocks[temp_alloc] count: 0 0 0 +sbcs blocks[temp_alloc] size: 0 0 0 +sbcs blocks[sl_alloc] count: 0 0 0 +sbcs blocks[sl_alloc] size: 0 0 0 +sbcs blocks[std_alloc] count: 0 0 0 +sbcs blocks[std_alloc] size: 0 0 0 +sbcs blocks[ll_alloc] count: 0 0 0 +sbcs blocks[ll_alloc] size: 0 0 0 +sbcs blocks[eheap_alloc] count: 0 0 0 +sbcs blocks[eheap_alloc] size: 0 0 0 +sbcs blocks[ets_alloc] count: 0 0 0 +sbcs blocks[ets_alloc] size: 0 0 0 +sbcs blocks[fix_alloc] count: 0 0 0 +sbcs blocks[fix_alloc] size: 0 0 0 +sbcs blocks[literal_alloc] count: 0 0 0 +sbcs blocks[literal_alloc] size: 0 0 0 +sbcs blocks[binary_alloc] count: 0 0 0 +sbcs blocks[binary_alloc] size: 0 0 0 +sbcs blocks[driver_alloc] count: 0 0 0 +sbcs blocks[driver_alloc] size: 0 0 0 +sbcs blocks[test_alloc] count: 0 0 0 +sbcs blocks[test_alloc] size: 0 0 0 +sbcs carriers: 0 0 0 +sbcs mseg carriers: 0 +sbcs sys_alloc carriers: 0 +sbcs carriers size: 0 0 0 +sbcs mseg carriers size: 0 +sbcs sys_alloc carriers size: 0 +ll_alloc calls: 0 +ll_free calls: 0 +ll_realloc calls: 0 +mseg_alloc calls: 0 +mseg_dealloc calls: 0 +mseg_realloc calls: 0 +sys_alloc calls: 1 +sys_free calls: 0 +sys_realloc calls: 0 +=allocator:ll_alloc[4] +versions: 0.9 3.0 +option e: true +option t: 5 +option ramv: false +option atags: false +option sbct: 18446744073709551615 +option asbcst: 0 +option rsbcst: 0 +option rsbcmt: 0 +option rmbcmt: 0 +option mmbcs: 524288 +option mmsbc: 0 +option mmmbc: 18446744073709551615 +option lmbcs: 5242880 +option smbcs: 262144 +option mbcgs: 10 +option acul: 85 +option acful: 0 +option acnl: 1000 +option acfml: 0 +option cp: L +option as: aoffcbf +mbcs blocks[sys_alloc] count: 0 0 0 +mbcs blocks[sys_alloc] size: 0 0 0 +mbcs blocks[temp_alloc] count: 0 0 0 +mbcs blocks[temp_alloc] size: 0 0 0 +mbcs blocks[sl_alloc] count: 0 0 0 +mbcs blocks[sl_alloc] size: 0 0 0 +mbcs blocks[std_alloc] count: 0 0 0 +mbcs blocks[std_alloc] size: 0 0 0 +mbcs blocks[ll_alloc] count: 0 0 0 +mbcs blocks[ll_alloc] size: 0 0 0 +mbcs blocks[eheap_alloc] count: 0 0 0 +mbcs blocks[eheap_alloc] size: 0 0 0 +mbcs blocks[ets_alloc] count: 0 0 0 +mbcs blocks[ets_alloc] size: 0 0 0 +mbcs blocks[fix_alloc] count: 0 0 0 +mbcs blocks[fix_alloc] size: 0 0 0 +mbcs blocks[literal_alloc] count: 0 0 0 +mbcs blocks[literal_alloc] size: 0 0 0 +mbcs blocks[binary_alloc] count: 0 0 0 +mbcs blocks[binary_alloc] size: 0 0 0 +mbcs blocks[driver_alloc] count: 0 0 0 +mbcs blocks[driver_alloc] size: 0 0 0 +mbcs blocks[test_alloc] count: 0 0 0 +mbcs blocks[test_alloc] size: 0 0 0 +mbcs carriers: 1 1 1 +mbcs mseg carriers: 0 +mbcs sys_alloc carriers: 1 +mbcs carriers size: 524288 524288 524288 +mbcs mseg carriers size: 0 +mbcs sys_alloc carriers size: 524288 +mbcs_pool blocks[sys_alloc] count: 0 +mbcs_pool blocks[sys_alloc] size: 0 +mbcs_pool blocks[temp_alloc] count: 0 +mbcs_pool blocks[temp_alloc] size: 0 +mbcs_pool blocks[sl_alloc] count: 0 +mbcs_pool blocks[sl_alloc] size: 0 +mbcs_pool blocks[std_alloc] count: 0 +mbcs_pool blocks[std_alloc] size: 0 +mbcs_pool blocks[ll_alloc] count: 0 +mbcs_pool blocks[ll_alloc] size: 0 +mbcs_pool blocks[eheap_alloc] count: 0 +mbcs_pool blocks[eheap_alloc] size: 0 +mbcs_pool blocks[ets_alloc] count: 0 +mbcs_pool blocks[ets_alloc] size: 0 +mbcs_pool blocks[fix_alloc] count: 0 +mbcs_pool blocks[fix_alloc] size: 0 +mbcs_pool blocks[literal_alloc] count: 0 +mbcs_pool blocks[literal_alloc] size: 0 +mbcs_pool blocks[binary_alloc] count: 0 +mbcs_pool blocks[binary_alloc] size: 0 +mbcs_pool blocks[driver_alloc] count: 0 +mbcs_pool blocks[driver_alloc] size: 0 +mbcs_pool blocks[test_alloc] count: 0 +mbcs_pool blocks[test_alloc] size: 0 +mbcs_pool carriers: 0 +mbcs_pool carriers size: 0 +sbcs blocks[sys_alloc] count: 0 0 0 +sbcs blocks[sys_alloc] size: 0 0 0 +sbcs blocks[temp_alloc] count: 0 0 0 +sbcs blocks[temp_alloc] size: 0 0 0 +sbcs blocks[sl_alloc] count: 0 0 0 +sbcs blocks[sl_alloc] size: 0 0 0 +sbcs blocks[std_alloc] count: 0 0 0 +sbcs blocks[std_alloc] size: 0 0 0 +sbcs blocks[ll_alloc] count: 0 0 0 +sbcs blocks[ll_alloc] size: 0 0 0 +sbcs blocks[eheap_alloc] count: 0 0 0 +sbcs blocks[eheap_alloc] size: 0 0 0 +sbcs blocks[ets_alloc] count: 0 0 0 +sbcs blocks[ets_alloc] size: 0 0 0 +sbcs blocks[fix_alloc] count: 0 0 0 +sbcs blocks[fix_alloc] size: 0 0 0 +sbcs blocks[literal_alloc] count: 0 0 0 +sbcs blocks[literal_alloc] size: 0 0 0 +sbcs blocks[binary_alloc] count: 0 0 0 +sbcs blocks[binary_alloc] size: 0 0 0 +sbcs blocks[driver_alloc] count: 0 0 0 +sbcs blocks[driver_alloc] size: 0 0 0 +sbcs blocks[test_alloc] count: 0 0 0 +sbcs blocks[test_alloc] size: 0 0 0 +sbcs carriers: 0 0 0 +sbcs mseg carriers: 0 +sbcs sys_alloc carriers: 0 +sbcs carriers size: 0 0 0 +sbcs mseg carriers size: 0 +sbcs sys_alloc carriers size: 0 +ll_alloc calls: 0 +ll_free calls: 0 +ll_realloc calls: 0 +mseg_alloc calls: 0 +mseg_dealloc calls: 0 +mseg_realloc calls: 0 +sys_alloc calls: 1 +sys_free calls: 0 +sys_realloc calls: 0 +=allocator:eheap_alloc[0] +versions: 0.9 3.0 +option e: true +option t: 5 +option ramv: false +option atags: false +option sbct: 524288 +option asbcst: 4145152 +option rsbcst: 50 +option rsbcmt: 80 +option rmbcmt: 50 +option mmbcs: 131072 +option mmsbc: 256 +option mmmbc: 18446744073709551615 +option lmbcs: 5242880 +option smbcs: 262144 +option mbcgs: 10 +option acul: 0 +option acful: 0 +option acnl: 0 +option acfml: 0 +option cp: undefined +option as: aoffcbf +mbcs blocks[sys_alloc] count: 0 0 0 +mbcs blocks[sys_alloc] size: 0 0 0 +mbcs blocks[temp_alloc] count: 0 0 0 +mbcs blocks[temp_alloc] size: 0 0 0 +mbcs blocks[sl_alloc] count: 0 0 0 +mbcs blocks[sl_alloc] size: 0 0 0 +mbcs blocks[std_alloc] count: 0 0 0 +mbcs blocks[std_alloc] size: 0 0 0 +mbcs blocks[ll_alloc] count: 0 0 0 +mbcs blocks[ll_alloc] size: 0 0 0 +mbcs blocks[eheap_alloc] count: 20 38 38 +mbcs blocks[eheap_alloc] size: 243632 246976 246976 +mbcs blocks[ets_alloc] count: 0 0 0 +mbcs blocks[ets_alloc] size: 0 0 0 +mbcs blocks[fix_alloc] count: 0 0 0 +mbcs blocks[fix_alloc] size: 0 0 0 +mbcs blocks[literal_alloc] count: 0 0 0 +mbcs blocks[literal_alloc] size: 0 0 0 +mbcs blocks[binary_alloc] count: 0 0 0 +mbcs blocks[binary_alloc] size: 0 0 0 +mbcs blocks[driver_alloc] count: 0 0 0 +mbcs blocks[driver_alloc] size: 0 0 0 +mbcs blocks[test_alloc] count: 0 0 0 +mbcs blocks[test_alloc] size: 0 0 0 +mbcs carriers: 2 2 2 +mbcs mseg carriers: 1 +mbcs sys_alloc carriers: 1 +mbcs carriers size: 393216 393216 393216 +mbcs mseg carriers size: 262144 +mbcs sys_alloc carriers size: 131072 +sbcs blocks[sys_alloc] count: 0 0 0 +sbcs blocks[sys_alloc] size: 0 0 0 +sbcs blocks[temp_alloc] count: 0 0 0 +sbcs blocks[temp_alloc] size: 0 0 0 +sbcs blocks[sl_alloc] count: 0 0 0 +sbcs blocks[sl_alloc] size: 0 0 0 +sbcs blocks[std_alloc] count: 0 0 0 +sbcs blocks[std_alloc] size: 0 0 0 +sbcs blocks[ll_alloc] count: 0 0 0 +sbcs blocks[ll_alloc] size: 0 0 0 +sbcs blocks[eheap_alloc] count: 0 0 0 +sbcs blocks[eheap_alloc] size: 0 0 0 +sbcs blocks[ets_alloc] count: 0 0 0 +sbcs blocks[ets_alloc] size: 0 0 0 +sbcs blocks[fix_alloc] count: 0 0 0 +sbcs blocks[fix_alloc] size: 0 0 0 +sbcs blocks[literal_alloc] count: 0 0 0 +sbcs blocks[literal_alloc] size: 0 0 0 +sbcs blocks[binary_alloc] count: 0 0 0 +sbcs blocks[binary_alloc] size: 0 0 0 +sbcs blocks[driver_alloc] count: 0 0 0 +sbcs blocks[driver_alloc] size: 0 0 0 +sbcs blocks[test_alloc] count: 0 0 0 +sbcs blocks[test_alloc] size: 0 0 0 +sbcs carriers: 0 0 0 +sbcs mseg carriers: 0 +sbcs sys_alloc carriers: 0 +sbcs carriers size: 0 0 0 +sbcs mseg carriers size: 0 +sbcs sys_alloc carriers size: 0 +eheap_alloc calls: 46 +eheap_free calls: 26 +eheap_realloc calls: 0 +mseg_alloc calls: 1 +mseg_dealloc calls: 0 +mseg_realloc calls: 0 +sys_alloc calls: 1 +sys_free calls: 0 +sys_realloc calls: 0 +=allocator:eheap_alloc[1] +versions: 0.9 3.0 +option e: true +option t: 5 +option ramv: false +option atags: false +option sbct: 524288 +option asbcst: 4145152 +option rsbcst: 50 +option rsbcmt: 80 +option rmbcmt: 50 +option mmbcs: 131072 +option mmsbc: 256 +option mmmbc: 18446744073709551615 +option lmbcs: 5242880 +option smbcs: 262144 +option mbcgs: 10 +option acul: 45 +option acful: 0 +option acnl: 1000 +option acfml: 0 +option cp: H +option as: aoffcbf +mbcs blocks[sys_alloc] count: 0 0 0 +mbcs blocks[sys_alloc] size: 0 0 0 +mbcs blocks[temp_alloc] count: 0 0 0 +mbcs blocks[temp_alloc] size: 0 0 0 +mbcs blocks[sl_alloc] count: 0 0 0 +mbcs blocks[sl_alloc] size: 0 0 0 +mbcs blocks[std_alloc] count: 0 0 0 +mbcs blocks[std_alloc] size: 0 0 0 +mbcs blocks[ll_alloc] count: 0 0 0 +mbcs blocks[ll_alloc] size: 0 0 0 +mbcs blocks[eheap_alloc] count: 0 11 11 +mbcs blocks[eheap_alloc] size: 0 54184 54184 +mbcs blocks[ets_alloc] count: 0 0 0 +mbcs blocks[ets_alloc] size: 0 0 0 +mbcs blocks[fix_alloc] count: 0 0 0 +mbcs blocks[fix_alloc] size: 0 0 0 +mbcs blocks[literal_alloc] count: 0 0 0 +mbcs blocks[literal_alloc] size: 0 0 0 +mbcs blocks[binary_alloc] count: 0 0 0 +mbcs blocks[binary_alloc] size: 0 0 0 +mbcs blocks[driver_alloc] count: 0 0 0 +mbcs blocks[driver_alloc] size: 0 0 0 +mbcs blocks[test_alloc] count: 0 0 0 +mbcs blocks[test_alloc] size: 0 0 0 +mbcs carriers: 1 1 1 +mbcs mseg carriers: 0 +mbcs sys_alloc carriers: 1 +mbcs carriers size: 131072 131072 131072 +mbcs mseg carriers size: 0 +mbcs sys_alloc carriers size: 131072 +mbcs_pool blocks[sys_alloc] count: 0 +mbcs_pool blocks[sys_alloc] size: 0 +mbcs_pool blocks[temp_alloc] count: 0 +mbcs_pool blocks[temp_alloc] size: 0 +mbcs_pool blocks[sl_alloc] count: 0 +mbcs_pool blocks[sl_alloc] size: 0 +mbcs_pool blocks[std_alloc] count: 0 +mbcs_pool blocks[std_alloc] size: 0 +mbcs_pool blocks[ll_alloc] count: 0 +mbcs_pool blocks[ll_alloc] size: 0 +mbcs_pool blocks[eheap_alloc] count: 0 +mbcs_pool blocks[eheap_alloc] size: 0 +mbcs_pool blocks[ets_alloc] count: 0 +mbcs_pool blocks[ets_alloc] size: 0 +mbcs_pool blocks[fix_alloc] count: 0 +mbcs_pool blocks[fix_alloc] size: 0 +mbcs_pool blocks[literal_alloc] count: 0 +mbcs_pool blocks[literal_alloc] size: 0 +mbcs_pool blocks[binary_alloc] count: 0 +mbcs_pool blocks[binary_alloc] size: 0 +mbcs_pool blocks[driver_alloc] count: 0 +mbcs_pool blocks[driver_alloc] size: 0 +mbcs_pool blocks[test_alloc] count: 0 +mbcs_pool blocks[test_alloc] size: 0 +mbcs_pool carriers: 0 +mbcs_pool carriers size: 0 +sbcs blocks[sys_alloc] count: 0 0 0 +sbcs blocks[sys_alloc] size: 0 0 0 +sbcs blocks[temp_alloc] count: 0 0 0 +sbcs blocks[temp_alloc] size: 0 0 0 +sbcs blocks[sl_alloc] count: 0 0 0 +sbcs blocks[sl_alloc] size: 0 0 0 +sbcs blocks[std_alloc] count: 0 0 0 +sbcs blocks[std_alloc] size: 0 0 0 +sbcs blocks[ll_alloc] count: 0 0 0 +sbcs blocks[ll_alloc] size: 0 0 0 +sbcs blocks[eheap_alloc] count: 0 0 0 +sbcs blocks[eheap_alloc] size: 0 0 0 +sbcs blocks[ets_alloc] count: 0 0 0 +sbcs blocks[ets_alloc] size: 0 0 0 +sbcs blocks[fix_alloc] count: 0 0 0 +sbcs blocks[fix_alloc] size: 0 0 0 +sbcs blocks[literal_alloc] count: 0 0 0 +sbcs blocks[literal_alloc] size: 0 0 0 +sbcs blocks[binary_alloc] count: 0 0 0 +sbcs blocks[binary_alloc] size: 0 0 0 +sbcs blocks[driver_alloc] count: 0 0 0 +sbcs blocks[driver_alloc] size: 0 0 0 +sbcs blocks[test_alloc] count: 0 0 0 +sbcs blocks[test_alloc] size: 0 0 0 +sbcs carriers: 0 0 0 +sbcs mseg carriers: 0 +sbcs sys_alloc carriers: 0 +sbcs carriers size: 0 0 0 +sbcs mseg carriers size: 0 +sbcs sys_alloc carriers size: 0 +eheap_alloc calls: 19 +eheap_free calls: 19 +eheap_realloc calls: 3 +mseg_alloc calls: 0 +mseg_dealloc calls: 0 +mseg_realloc calls: 0 +sys_alloc calls: 1 +sys_free calls: 0 +sys_realloc calls: 0 +=allocator:eheap_alloc[2] +versions: 0.9 3.0 +option e: true +option t: 5 +option ramv: false +option atags: false +option sbct: 524288 +option asbcst: 4145152 +option rsbcst: 50 +option rsbcmt: 80 +option rmbcmt: 50 +option mmbcs: 131072 +option mmsbc: 256 +option mmmbc: 18446744073709551615 +option lmbcs: 5242880 +option smbcs: 262144 +option mbcgs: 10 +option acul: 45 +option acful: 0 +option acnl: 1000 +option acfml: 0 +option cp: H +option as: aoffcbf +mbcs blocks[sys_alloc] count: 0 0 0 +mbcs blocks[sys_alloc] size: 0 0 0 +mbcs blocks[temp_alloc] count: 0 0 0 +mbcs blocks[temp_alloc] size: 0 0 0 +mbcs blocks[sl_alloc] count: 0 0 0 +mbcs blocks[sl_alloc] size: 0 0 0 +mbcs blocks[std_alloc] count: 0 0 0 +mbcs blocks[std_alloc] size: 0 0 0 +mbcs blocks[ll_alloc] count: 0 0 0 +mbcs blocks[ll_alloc] size: 0 0 0 +mbcs blocks[eheap_alloc] count: 55 58 58 +mbcs blocks[eheap_alloc] size: 477624 851424 851424 +mbcs blocks[ets_alloc] count: 0 0 0 +mbcs blocks[ets_alloc] size: 0 0 0 +mbcs blocks[fix_alloc] count: 0 0 0 +mbcs blocks[fix_alloc] size: 0 0 0 +mbcs blocks[literal_alloc] count: 0 0 0 +mbcs blocks[literal_alloc] size: 0 0 0 +mbcs blocks[binary_alloc] count: 0 0 0 +mbcs blocks[binary_alloc] size: 0 0 0 +mbcs blocks[driver_alloc] count: 0 0 0 +mbcs blocks[driver_alloc] size: 0 0 0 +mbcs blocks[test_alloc] count: 0 0 0 +mbcs blocks[test_alloc] size: 0 0 0 +mbcs carriers: 3 3 3 +mbcs mseg carriers: 2 +mbcs sys_alloc carriers: 1 +mbcs carriers size: 1441792 1441792 1441792 +mbcs mseg carriers size: 1310720 +mbcs sys_alloc carriers size: 131072 +mbcs_pool blocks[sys_alloc] count: 0 +mbcs_pool blocks[sys_alloc] size: 0 +mbcs_pool blocks[temp_alloc] count: 0 +mbcs_pool blocks[temp_alloc] size: 0 +mbcs_pool blocks[sl_alloc] count: 0 +mbcs_pool blocks[sl_alloc] size: 0 +mbcs_pool blocks[std_alloc] count: 0 +mbcs_pool blocks[std_alloc] size: 0 +mbcs_pool blocks[ll_alloc] count: 0 +mbcs_pool blocks[ll_alloc] size: 0 +mbcs_pool blocks[eheap_alloc] count: 0 +mbcs_pool blocks[eheap_alloc] size: 0 +mbcs_pool blocks[ets_alloc] count: 0 +mbcs_pool blocks[ets_alloc] size: 0 +mbcs_pool blocks[fix_alloc] count: 0 +mbcs_pool blocks[fix_alloc] size: 0 +mbcs_pool blocks[literal_alloc] count: 0 +mbcs_pool blocks[literal_alloc] size: 0 +mbcs_pool blocks[binary_alloc] count: 0 +mbcs_pool blocks[binary_alloc] size: 0 +mbcs_pool blocks[driver_alloc] count: 0 +mbcs_pool blocks[driver_alloc] size: 0 +mbcs_pool blocks[test_alloc] count: 0 +mbcs_pool blocks[test_alloc] size: 0 +mbcs_pool carriers: 0 +mbcs_pool carriers size: 0 +sbcs blocks[sys_alloc] count: 0 0 0 +sbcs blocks[sys_alloc] size: 0 0 0 +sbcs blocks[temp_alloc] count: 0 0 0 +sbcs blocks[temp_alloc] size: 0 0 0 +sbcs blocks[sl_alloc] count: 0 0 0 +sbcs blocks[sl_alloc] size: 0 0 0 +sbcs blocks[std_alloc] count: 0 0 0 +sbcs blocks[std_alloc] size: 0 0 0 +sbcs blocks[ll_alloc] count: 0 0 0 +sbcs blocks[ll_alloc] size: 0 0 0 +sbcs blocks[eheap_alloc] count: 0 0 0 +sbcs blocks[eheap_alloc] size: 0 0 0 +sbcs blocks[ets_alloc] count: 0 0 0 +sbcs blocks[ets_alloc] size: 0 0 0 +sbcs blocks[fix_alloc] count: 0 0 0 +sbcs blocks[fix_alloc] size: 0 0 0 +sbcs blocks[literal_alloc] count: 0 0 0 +sbcs blocks[literal_alloc] size: 0 0 0 +sbcs blocks[binary_alloc] count: 0 0 0 +sbcs blocks[binary_alloc] size: 0 0 0 +sbcs blocks[driver_alloc] count: 0 0 0 +sbcs blocks[driver_alloc] size: 0 0 0 +sbcs blocks[test_alloc] count: 0 0 0 +sbcs blocks[test_alloc] size: 0 0 0 +sbcs carriers: 0 0 0 +sbcs mseg carriers: 0 +sbcs sys_alloc carriers: 0 +sbcs carriers size: 0 0 0 +sbcs mseg carriers size: 0 +sbcs sys_alloc carriers size: 0 +eheap_alloc calls: 463 +eheap_free calls: 408 +eheap_realloc calls: 19 +mseg_alloc calls: 2 +mseg_dealloc calls: 0 +mseg_realloc calls: 0 +sys_alloc calls: 1 +sys_free calls: 0 +sys_realloc calls: 0 +=allocator:eheap_alloc[3] +versions: 0.9 3.0 +option e: true +option t: 5 +option ramv: false +option atags: false +option sbct: 524288 +option asbcst: 4145152 +option rsbcst: 50 +option rsbcmt: 80 +option rmbcmt: 50 +option mmbcs: 131072 +option mmsbc: 256 +option mmmbc: 18446744073709551615 +option lmbcs: 5242880 +option smbcs: 262144 +option mbcgs: 10 +option acul: 45 +option acful: 0 +option acnl: 1000 +option acfml: 0 +option cp: H +option as: aoffcbf +mbcs blocks[sys_alloc] count: 0 0 0 +mbcs blocks[sys_alloc] size: 0 0 0 +mbcs blocks[temp_alloc] count: 0 0 0 +mbcs blocks[temp_alloc] size: 0 0 0 +mbcs blocks[sl_alloc] count: 0 0 0 +mbcs blocks[sl_alloc] size: 0 0 0 +mbcs blocks[std_alloc] count: 0 0 0 +mbcs blocks[std_alloc] size: 0 0 0 +mbcs blocks[ll_alloc] count: 0 0 0 +mbcs blocks[ll_alloc] size: 0 0 0 +mbcs blocks[eheap_alloc] count: 0 0 0 +mbcs blocks[eheap_alloc] size: 0 0 0 +mbcs blocks[ets_alloc] count: 0 0 0 +mbcs blocks[ets_alloc] size: 0 0 0 +mbcs blocks[fix_alloc] count: 0 0 0 +mbcs blocks[fix_alloc] size: 0 0 0 +mbcs blocks[literal_alloc] count: 0 0 0 +mbcs blocks[literal_alloc] size: 0 0 0 +mbcs blocks[binary_alloc] count: 0 0 0 +mbcs blocks[binary_alloc] size: 0 0 0 +mbcs blocks[driver_alloc] count: 0 0 0 +mbcs blocks[driver_alloc] size: 0 0 0 +mbcs blocks[test_alloc] count: 0 0 0 +mbcs blocks[test_alloc] size: 0 0 0 +mbcs carriers: 1 1 1 +mbcs mseg carriers: 0 +mbcs sys_alloc carriers: 1 +mbcs carriers size: 131072 131072 131072 +mbcs mseg carriers size: 0 +mbcs sys_alloc carriers size: 131072 +mbcs_pool blocks[sys_alloc] count: 0 +mbcs_pool blocks[sys_alloc] size: 0 +mbcs_pool blocks[temp_alloc] count: 0 +mbcs_pool blocks[temp_alloc] size: 0 +mbcs_pool blocks[sl_alloc] count: 0 +mbcs_pool blocks[sl_alloc] size: 0 +mbcs_pool blocks[std_alloc] count: 0 +mbcs_pool blocks[std_alloc] size: 0 +mbcs_pool blocks[ll_alloc] count: 0 +mbcs_pool blocks[ll_alloc] size: 0 +mbcs_pool blocks[eheap_alloc] count: 0 +mbcs_pool blocks[eheap_alloc] size: 0 +mbcs_pool blocks[ets_alloc] count: 0 +mbcs_pool blocks[ets_alloc] size: 0 +mbcs_pool blocks[fix_alloc] count: 0 +mbcs_pool blocks[fix_alloc] size: 0 +mbcs_pool blocks[literal_alloc] count: 0 +mbcs_pool blocks[literal_alloc] size: 0 +mbcs_pool blocks[binary_alloc] count: 0 +mbcs_pool blocks[binary_alloc] size: 0 +mbcs_pool blocks[driver_alloc] count: 0 +mbcs_pool blocks[driver_alloc] size: 0 +mbcs_pool blocks[test_alloc] count: 0 +mbcs_pool blocks[test_alloc] size: 0 +mbcs_pool carriers: 0 +mbcs_pool carriers size: 0 +sbcs blocks[sys_alloc] count: 0 0 0 +sbcs blocks[sys_alloc] size: 0 0 0 +sbcs blocks[temp_alloc] count: 0 0 0 +sbcs blocks[temp_alloc] size: 0 0 0 +sbcs blocks[sl_alloc] count: 0 0 0 +sbcs blocks[sl_alloc] size: 0 0 0 +sbcs blocks[std_alloc] count: 0 0 0 +sbcs blocks[std_alloc] size: 0 0 0 +sbcs blocks[ll_alloc] count: 0 0 0 +sbcs blocks[ll_alloc] size: 0 0 0 +sbcs blocks[eheap_alloc] count: 0 0 0 +sbcs blocks[eheap_alloc] size: 0 0 0 +sbcs blocks[ets_alloc] count: 0 0 0 +sbcs blocks[ets_alloc] size: 0 0 0 +sbcs blocks[fix_alloc] count: 0 0 0 +sbcs blocks[fix_alloc] size: 0 0 0 +sbcs blocks[literal_alloc] count: 0 0 0 +sbcs blocks[literal_alloc] size: 0 0 0 +sbcs blocks[binary_alloc] count: 0 0 0 +sbcs blocks[binary_alloc] size: 0 0 0 +sbcs blocks[driver_alloc] count: 0 0 0 +sbcs blocks[driver_alloc] size: 0 0 0 +sbcs blocks[test_alloc] count: 0 0 0 +sbcs blocks[test_alloc] size: 0 0 0 +sbcs carriers: 0 0 0 +sbcs mseg carriers: 0 +sbcs sys_alloc carriers: 0 +sbcs carriers size: 0 0 0 +sbcs mseg carriers size: 0 +sbcs sys_alloc carriers size: 0 +eheap_alloc calls: 0 +eheap_free calls: 0 +eheap_realloc calls: 0 +mseg_alloc calls: 0 +mseg_dealloc calls: 0 +mseg_realloc calls: 0 +sys_alloc calls: 1 +sys_free calls: 0 +sys_realloc calls: 0 +=allocator:eheap_alloc[4] +versions: 0.9 3.0 +option e: true +option t: 5 +option ramv: false +option atags: false +option sbct: 524288 +option asbcst: 4145152 +option rsbcst: 50 +option rsbcmt: 80 +option rmbcmt: 50 +option mmbcs: 131072 +option mmsbc: 256 +option mmmbc: 18446744073709551615 +option lmbcs: 5242880 +option smbcs: 262144 +option mbcgs: 10 +option acul: 45 +option acful: 0 +option acnl: 1000 +option acfml: 0 +option cp: H +option as: aoffcbf +mbcs blocks[sys_alloc] count: 0 0 0 +mbcs blocks[sys_alloc] size: 0 0 0 +mbcs blocks[temp_alloc] count: 0 0 0 +mbcs blocks[temp_alloc] size: 0 0 0 +mbcs blocks[sl_alloc] count: 0 0 0 +mbcs blocks[sl_alloc] size: 0 0 0 +mbcs blocks[std_alloc] count: 0 0 0 +mbcs blocks[std_alloc] size: 0 0 0 +mbcs blocks[ll_alloc] count: 0 0 0 +mbcs blocks[ll_alloc] size: 0 0 0 +mbcs blocks[eheap_alloc] count: 0 0 0 +mbcs blocks[eheap_alloc] size: 0 0 0 +mbcs blocks[ets_alloc] count: 0 0 0 +mbcs blocks[ets_alloc] size: 0 0 0 +mbcs blocks[fix_alloc] count: 0 0 0 +mbcs blocks[fix_alloc] size: 0 0 0 +mbcs blocks[literal_alloc] count: 0 0 0 +mbcs blocks[literal_alloc] size: 0 0 0 +mbcs blocks[binary_alloc] count: 0 0 0 +mbcs blocks[binary_alloc] size: 0 0 0 +mbcs blocks[driver_alloc] count: 0 0 0 +mbcs blocks[driver_alloc] size: 0 0 0 +mbcs blocks[test_alloc] count: 0 0 0 +mbcs blocks[test_alloc] size: 0 0 0 +mbcs carriers: 1 1 1 +mbcs mseg carriers: 0 +mbcs sys_alloc carriers: 1 +mbcs carriers size: 131072 131072 131072 +mbcs mseg carriers size: 0 +mbcs sys_alloc carriers size: 131072 +mbcs_pool blocks[sys_alloc] count: 0 +mbcs_pool blocks[sys_alloc] size: 0 +mbcs_pool blocks[temp_alloc] count: 0 +mbcs_pool blocks[temp_alloc] size: 0 +mbcs_pool blocks[sl_alloc] count: 0 +mbcs_pool blocks[sl_alloc] size: 0 +mbcs_pool blocks[std_alloc] count: 0 +mbcs_pool blocks[std_alloc] size: 0 +mbcs_pool blocks[ll_alloc] count: 0 +mbcs_pool blocks[ll_alloc] size: 0 +mbcs_pool blocks[eheap_alloc] count: 0 +mbcs_pool blocks[eheap_alloc] size: 0 +mbcs_pool blocks[ets_alloc] count: 0 +mbcs_pool blocks[ets_alloc] size: 0 +mbcs_pool blocks[fix_alloc] count: 0 +mbcs_pool blocks[fix_alloc] size: 0 +mbcs_pool blocks[literal_alloc] count: 0 +mbcs_pool blocks[literal_alloc] size: 0 +mbcs_pool blocks[binary_alloc] count: 0 +mbcs_pool blocks[binary_alloc] size: 0 +mbcs_pool blocks[driver_alloc] count: 0 +mbcs_pool blocks[driver_alloc] size: 0 +mbcs_pool blocks[test_alloc] count: 0 +mbcs_pool blocks[test_alloc] size: 0 +mbcs_pool carriers: 0 +mbcs_pool carriers size: 0 +sbcs blocks[sys_alloc] count: 0 0 0 +sbcs blocks[sys_alloc] size: 0 0 0 +sbcs blocks[temp_alloc] count: 0 0 0 +sbcs blocks[temp_alloc] size: 0 0 0 +sbcs blocks[sl_alloc] count: 0 0 0 +sbcs blocks[sl_alloc] size: 0 0 0 +sbcs blocks[std_alloc] count: 0 0 0 +sbcs blocks[std_alloc] size: 0 0 0 +sbcs blocks[ll_alloc] count: 0 0 0 +sbcs blocks[ll_alloc] size: 0 0 0 +sbcs blocks[eheap_alloc] count: 0 0 0 +sbcs blocks[eheap_alloc] size: 0 0 0 +sbcs blocks[ets_alloc] count: 0 0 0 +sbcs blocks[ets_alloc] size: 0 0 0 +sbcs blocks[fix_alloc] count: 0 0 0 +sbcs blocks[fix_alloc] size: 0 0 0 +sbcs blocks[literal_alloc] count: 0 0 0 +sbcs blocks[literal_alloc] size: 0 0 0 +sbcs blocks[binary_alloc] count: 0 0 0 +sbcs blocks[binary_alloc] size: 0 0 0 +sbcs blocks[driver_alloc] count: 0 0 0 +sbcs blocks[driver_alloc] size: 0 0 0 +sbcs blocks[test_alloc] count: 0 0 0 +sbcs blocks[test_alloc] size: 0 0 0 +sbcs carriers: 0 0 0 +sbcs mseg carriers: 0 +sbcs sys_alloc carriers: 0 +sbcs carriers size: 0 0 0 +sbcs mseg carriers size: 0 +sbcs sys_alloc carriers size: 0 +eheap_alloc calls: 0 +eheap_free calls: 0 +eheap_realloc calls: 0 +mseg_alloc calls: 0 +mseg_dealloc calls: 0 +mseg_realloc calls: 0 +sys_alloc calls: 1 +sys_free calls: 0 +sys_realloc calls: 0 +=allocator:ets_alloc[0] +versions: 0.9 3.0 +option e: true +option t: 5 +option ramv: false +option atags: false +option sbct: 524288 +option asbcst: 4145152 +option rsbcst: 20 +option rsbcmt: 80 +option rmbcmt: 50 +option mmbcs: 32768 +option mmsbc: 256 +option mmmbc: 18446744073709551615 +option lmbcs: 5242880 +option smbcs: 262144 +option mbcgs: 10 +option acul: 0 +option acful: 0 +option acnl: 0 +option acfml: 0 +option cp: undefined +option as: aoffcbf +mbcs blocks[sys_alloc] count: 0 0 0 +mbcs blocks[sys_alloc] size: 0 0 0 +mbcs blocks[temp_alloc] count: 0 0 0 +mbcs blocks[temp_alloc] size: 0 0 0 +mbcs blocks[sl_alloc] count: 0 0 0 +mbcs blocks[sl_alloc] size: 0 0 0 +mbcs blocks[std_alloc] count: 0 0 0 +mbcs blocks[std_alloc] size: 0 0 0 +mbcs blocks[ll_alloc] count: 0 0 0 +mbcs blocks[ll_alloc] size: 0 0 0 +mbcs blocks[eheap_alloc] count: 0 0 0 +mbcs blocks[eheap_alloc] size: 0 0 0 +mbcs blocks[ets_alloc] count: 0 0 0 +mbcs blocks[ets_alloc] size: 0 0 0 +mbcs blocks[fix_alloc] count: 0 0 0 +mbcs blocks[fix_alloc] size: 0 0 0 +mbcs blocks[literal_alloc] count: 0 0 0 +mbcs blocks[literal_alloc] size: 0 0 0 +mbcs blocks[binary_alloc] count: 0 0 0 +mbcs blocks[binary_alloc] size: 0 0 0 +mbcs blocks[driver_alloc] count: 0 0 0 +mbcs blocks[driver_alloc] size: 0 0 0 +mbcs blocks[test_alloc] count: 0 0 0 +mbcs blocks[test_alloc] size: 0 0 0 +mbcs carriers: 0 0 0 +mbcs mseg carriers: 0 +mbcs sys_alloc carriers: 0 +mbcs carriers size: 0 0 0 +mbcs mseg carriers size: 0 +mbcs sys_alloc carriers size: 0 +sbcs blocks[sys_alloc] count: 0 0 0 +sbcs blocks[sys_alloc] size: 0 0 0 +sbcs blocks[temp_alloc] count: 0 0 0 +sbcs blocks[temp_alloc] size: 0 0 0 +sbcs blocks[sl_alloc] count: 0 0 0 +sbcs blocks[sl_alloc] size: 0 0 0 +sbcs blocks[std_alloc] count: 0 0 0 +sbcs blocks[std_alloc] size: 0 0 0 +sbcs blocks[ll_alloc] count: 0 0 0 +sbcs blocks[ll_alloc] size: 0 0 0 +sbcs blocks[eheap_alloc] count: 0 0 0 +sbcs blocks[eheap_alloc] size: 0 0 0 +sbcs blocks[ets_alloc] count: 0 0 0 +sbcs blocks[ets_alloc] size: 0 0 0 +sbcs blocks[fix_alloc] count: 0 0 0 +sbcs blocks[fix_alloc] size: 0 0 0 +sbcs blocks[literal_alloc] count: 0 0 0 +sbcs blocks[literal_alloc] size: 0 0 0 +sbcs blocks[binary_alloc] count: 0 0 0 +sbcs blocks[binary_alloc] size: 0 0 0 +sbcs blocks[driver_alloc] count: 0 0 0 +sbcs blocks[driver_alloc] size: 0 0 0 +sbcs blocks[test_alloc] count: 0 0 0 +sbcs blocks[test_alloc] size: 0 0 0 +sbcs carriers: 0 0 0 +sbcs mseg carriers: 0 +sbcs sys_alloc carriers: 0 +sbcs carriers size: 0 0 0 +sbcs mseg carriers size: 0 +sbcs sys_alloc carriers size: 0 +ets_alloc calls: 0 +ets_free calls: 0 +ets_realloc calls: 0 +mseg_alloc calls: 0 +mseg_dealloc calls: 0 +mseg_realloc calls: 0 +sys_alloc calls: 0 +sys_free calls: 0 +sys_realloc calls: 0 +=allocator:ets_alloc[1] +versions: 0.9 3.0 +option e: true +option t: 5 +option ramv: false +option atags: false +option sbct: 524288 +option asbcst: 4145152 +option rsbcst: 20 +option rsbcmt: 80 +option rmbcmt: 50 +option mmbcs: 32768 +option mmsbc: 256 +option mmmbc: 18446744073709551615 +option lmbcs: 5242880 +option smbcs: 262144 +option mbcgs: 10 +option acul: 60 +option acful: 0 +option acnl: 1000 +option acfml: 0 +option cp: E +option as: aoffcbf +mbcs blocks[sys_alloc] count: 0 0 0 +mbcs blocks[sys_alloc] size: 0 0 0 +mbcs blocks[temp_alloc] count: 0 0 0 +mbcs blocks[temp_alloc] size: 0 0 0 +mbcs blocks[sl_alloc] count: 0 0 0 +mbcs blocks[sl_alloc] size: 0 0 0 +mbcs blocks[std_alloc] count: 0 0 0 +mbcs blocks[std_alloc] size: 0 0 0 +mbcs blocks[ll_alloc] count: 0 0 0 +mbcs blocks[ll_alloc] size: 0 0 0 +mbcs blocks[eheap_alloc] count: 0 0 0 +mbcs blocks[eheap_alloc] size: 0 0 0 +mbcs blocks[ets_alloc] count: 0 0 0 +mbcs blocks[ets_alloc] size: 0 0 0 +mbcs blocks[fix_alloc] count: 0 0 0 +mbcs blocks[fix_alloc] size: 0 0 0 +mbcs blocks[literal_alloc] count: 0 0 0 +mbcs blocks[literal_alloc] size: 0 0 0 +mbcs blocks[binary_alloc] count: 0 0 0 +mbcs blocks[binary_alloc] size: 0 0 0 +mbcs blocks[driver_alloc] count: 0 0 0 +mbcs blocks[driver_alloc] size: 0 0 0 +mbcs blocks[test_alloc] count: 0 0 0 +mbcs blocks[test_alloc] size: 0 0 0 +mbcs carriers: 1 1 1 +mbcs mseg carriers: 0 +mbcs sys_alloc carriers: 1 +mbcs carriers size: 32768 32768 32768 +mbcs mseg carriers size: 0 +mbcs sys_alloc carriers size: 32768 +mbcs_pool blocks[sys_alloc] count: 0 +mbcs_pool blocks[sys_alloc] size: 0 +mbcs_pool blocks[temp_alloc] count: 0 +mbcs_pool blocks[temp_alloc] size: 0 +mbcs_pool blocks[sl_alloc] count: 0 +mbcs_pool blocks[sl_alloc] size: 0 +mbcs_pool blocks[std_alloc] count: 0 +mbcs_pool blocks[std_alloc] size: 0 +mbcs_pool blocks[ll_alloc] count: 0 +mbcs_pool blocks[ll_alloc] size: 0 +mbcs_pool blocks[eheap_alloc] count: 0 +mbcs_pool blocks[eheap_alloc] size: 0 +mbcs_pool blocks[ets_alloc] count: 0 +mbcs_pool blocks[ets_alloc] size: 0 +mbcs_pool blocks[fix_alloc] count: 0 +mbcs_pool blocks[fix_alloc] size: 0 +mbcs_pool blocks[literal_alloc] count: 0 +mbcs_pool blocks[literal_alloc] size: 0 +mbcs_pool blocks[binary_alloc] count: 0 +mbcs_pool blocks[binary_alloc] size: 0 +mbcs_pool blocks[driver_alloc] count: 0 +mbcs_pool blocks[driver_alloc] size: 0 +mbcs_pool blocks[test_alloc] count: 0 +mbcs_pool blocks[test_alloc] size: 0 +mbcs_pool carriers: 0 +mbcs_pool carriers size: 0 +sbcs blocks[sys_alloc] count: 0 0 0 +sbcs blocks[sys_alloc] size: 0 0 0 +sbcs blocks[temp_alloc] count: 0 0 0 +sbcs blocks[temp_alloc] size: 0 0 0 +sbcs blocks[sl_alloc] count: 0 0 0 +sbcs blocks[sl_alloc] size: 0 0 0 +sbcs blocks[std_alloc] count: 0 0 0 +sbcs blocks[std_alloc] size: 0 0 0 +sbcs blocks[ll_alloc] count: 0 0 0 +sbcs blocks[ll_alloc] size: 0 0 0 +sbcs blocks[eheap_alloc] count: 0 0 0 +sbcs blocks[eheap_alloc] size: 0 0 0 +sbcs blocks[ets_alloc] count: 0 0 0 +sbcs blocks[ets_alloc] size: 0 0 0 +sbcs blocks[fix_alloc] count: 0 0 0 +sbcs blocks[fix_alloc] size: 0 0 0 +sbcs blocks[literal_alloc] count: 0 0 0 +sbcs blocks[literal_alloc] size: 0 0 0 +sbcs blocks[binary_alloc] count: 0 0 0 +sbcs blocks[binary_alloc] size: 0 0 0 +sbcs blocks[driver_alloc] count: 0 0 0 +sbcs blocks[driver_alloc] size: 0 0 0 +sbcs blocks[test_alloc] count: 0 0 0 +sbcs blocks[test_alloc] size: 0 0 0 +sbcs carriers: 0 0 0 +sbcs mseg carriers: 0 +sbcs sys_alloc carriers: 0 +sbcs carriers size: 0 0 0 +sbcs mseg carriers size: 0 +sbcs sys_alloc carriers size: 0 +ets_alloc calls: 0 +ets_free calls: 0 +ets_realloc calls: 0 +mseg_alloc calls: 0 +mseg_dealloc calls: 0 +mseg_realloc calls: 0 +sys_alloc calls: 1 +sys_free calls: 0 +sys_realloc calls: 0 +=allocator:ets_alloc[2] +versions: 0.9 3.0 +option e: true +option t: 5 +option ramv: false +option atags: false +option sbct: 524288 +option asbcst: 4145152 +option rsbcst: 20 +option rsbcmt: 80 +option rmbcmt: 50 +option mmbcs: 32768 +option mmsbc: 256 +option mmmbc: 18446744073709551615 +option lmbcs: 5242880 +option smbcs: 262144 +option mbcgs: 10 +option acul: 60 +option acful: 0 +option acnl: 1000 +option acfml: 0 +option cp: E +option as: aoffcbf +mbcs blocks[sys_alloc] count: 0 0 0 +mbcs blocks[sys_alloc] size: 0 0 0 +mbcs blocks[temp_alloc] count: 0 0 0 +mbcs blocks[temp_alloc] size: 0 0 0 +mbcs blocks[sl_alloc] count: 0 0 0 +mbcs blocks[sl_alloc] size: 0 0 0 +mbcs blocks[std_alloc] count: 0 0 0 +mbcs blocks[std_alloc] size: 0 0 0 +mbcs blocks[ll_alloc] count: 0 0 0 +mbcs blocks[ll_alloc] size: 0 0 0 +mbcs blocks[eheap_alloc] count: 0 0 0 +mbcs blocks[eheap_alloc] size: 0 0 0 +mbcs blocks[ets_alloc] count: 501 501 501 +mbcs blocks[ets_alloc] size: 217984 217984 217984 +mbcs blocks[fix_alloc] count: 0 0 0 +mbcs blocks[fix_alloc] size: 0 0 0 +mbcs blocks[literal_alloc] count: 0 0 0 +mbcs blocks[literal_alloc] size: 0 0 0 +mbcs blocks[binary_alloc] count: 0 0 0 +mbcs blocks[binary_alloc] size: 0 0 0 +mbcs blocks[driver_alloc] count: 0 0 0 +mbcs blocks[driver_alloc] size: 0 0 0 +mbcs blocks[test_alloc] count: 0 0 0 +mbcs blocks[test_alloc] size: 0 0 0 +mbcs carriers: 2 2 2 +mbcs mseg carriers: 1 +mbcs sys_alloc carriers: 1 +mbcs carriers size: 294912 294912 294912 +mbcs mseg carriers size: 262144 +mbcs sys_alloc carriers size: 32768 +mbcs_pool blocks[sys_alloc] count: 0 +mbcs_pool blocks[sys_alloc] size: 0 +mbcs_pool blocks[temp_alloc] count: 0 +mbcs_pool blocks[temp_alloc] size: 0 +mbcs_pool blocks[sl_alloc] count: 0 +mbcs_pool blocks[sl_alloc] size: 0 +mbcs_pool blocks[std_alloc] count: 0 +mbcs_pool blocks[std_alloc] size: 0 +mbcs_pool blocks[ll_alloc] count: 0 +mbcs_pool blocks[ll_alloc] size: 0 +mbcs_pool blocks[eheap_alloc] count: 0 +mbcs_pool blocks[eheap_alloc] size: 0 +mbcs_pool blocks[ets_alloc] count: 0 +mbcs_pool blocks[ets_alloc] size: 0 +mbcs_pool blocks[fix_alloc] count: 0 +mbcs_pool blocks[fix_alloc] size: 0 +mbcs_pool blocks[literal_alloc] count: 0 +mbcs_pool blocks[literal_alloc] size: 0 +mbcs_pool blocks[binary_alloc] count: 0 +mbcs_pool blocks[binary_alloc] size: 0 +mbcs_pool blocks[driver_alloc] count: 0 +mbcs_pool blocks[driver_alloc] size: 0 +mbcs_pool blocks[test_alloc] count: 0 +mbcs_pool blocks[test_alloc] size: 0 +mbcs_pool carriers: 0 +mbcs_pool carriers size: 0 +sbcs blocks[sys_alloc] count: 0 0 0 +sbcs blocks[sys_alloc] size: 0 0 0 +sbcs blocks[temp_alloc] count: 0 0 0 +sbcs blocks[temp_alloc] size: 0 0 0 +sbcs blocks[sl_alloc] count: 0 0 0 +sbcs blocks[sl_alloc] size: 0 0 0 +sbcs blocks[std_alloc] count: 0 0 0 +sbcs blocks[std_alloc] size: 0 0 0 +sbcs blocks[ll_alloc] count: 0 0 0 +sbcs blocks[ll_alloc] size: 0 0 0 +sbcs blocks[eheap_alloc] count: 0 0 0 +sbcs blocks[eheap_alloc] size: 0 0 0 +sbcs blocks[ets_alloc] count: 0 0 0 +sbcs blocks[ets_alloc] size: 0 0 0 +sbcs blocks[fix_alloc] count: 0 0 0 +sbcs blocks[fix_alloc] size: 0 0 0 +sbcs blocks[literal_alloc] count: 0 0 0 +sbcs blocks[literal_alloc] size: 0 0 0 +sbcs blocks[binary_alloc] count: 0 0 0 +sbcs blocks[binary_alloc] size: 0 0 0 +sbcs blocks[driver_alloc] count: 0 0 0 +sbcs blocks[driver_alloc] size: 0 0 0 +sbcs blocks[test_alloc] count: 0 0 0 +sbcs blocks[test_alloc] size: 0 0 0 +sbcs carriers: 0 0 0 +sbcs mseg carriers: 0 +sbcs sys_alloc carriers: 0 +sbcs carriers size: 0 0 0 +sbcs mseg carriers size: 0 +sbcs sys_alloc carriers size: 0 +ets_alloc calls: 502 +ets_free calls: 1 +ets_realloc calls: 7 +mseg_alloc calls: 1 +mseg_dealloc calls: 0 +mseg_realloc calls: 0 +sys_alloc calls: 1 +sys_free calls: 0 +sys_realloc calls: 0 +=allocator:ets_alloc[3] +versions: 0.9 3.0 +option e: true +option t: 5 +option ramv: false +option atags: false +option sbct: 524288 +option asbcst: 4145152 +option rsbcst: 20 +option rsbcmt: 80 +option rmbcmt: 50 +option mmbcs: 32768 +option mmsbc: 256 +option mmmbc: 18446744073709551615 +option lmbcs: 5242880 +option smbcs: 262144 +option mbcgs: 10 +option acul: 60 +option acful: 0 +option acnl: 1000 +option acfml: 0 +option cp: E +option as: aoffcbf +mbcs blocks[sys_alloc] count: 0 0 0 +mbcs blocks[sys_alloc] size: 0 0 0 +mbcs blocks[temp_alloc] count: 0 0 0 +mbcs blocks[temp_alloc] size: 0 0 0 +mbcs blocks[sl_alloc] count: 0 0 0 +mbcs blocks[sl_alloc] size: 0 0 0 +mbcs blocks[std_alloc] count: 0 0 0 +mbcs blocks[std_alloc] size: 0 0 0 +mbcs blocks[ll_alloc] count: 0 0 0 +mbcs blocks[ll_alloc] size: 0 0 0 +mbcs blocks[eheap_alloc] count: 0 0 0 +mbcs blocks[eheap_alloc] size: 0 0 0 +mbcs blocks[ets_alloc] count: 0 0 0 +mbcs blocks[ets_alloc] size: 0 0 0 +mbcs blocks[fix_alloc] count: 0 0 0 +mbcs blocks[fix_alloc] size: 0 0 0 +mbcs blocks[literal_alloc] count: 0 0 0 +mbcs blocks[literal_alloc] size: 0 0 0 +mbcs blocks[binary_alloc] count: 0 0 0 +mbcs blocks[binary_alloc] size: 0 0 0 +mbcs blocks[driver_alloc] count: 0 0 0 +mbcs blocks[driver_alloc] size: 0 0 0 +mbcs blocks[test_alloc] count: 0 0 0 +mbcs blocks[test_alloc] size: 0 0 0 +mbcs carriers: 1 1 1 +mbcs mseg carriers: 0 +mbcs sys_alloc carriers: 1 +mbcs carriers size: 32768 32768 32768 +mbcs mseg carriers size: 0 +mbcs sys_alloc carriers size: 32768 +mbcs_pool blocks[sys_alloc] count: 0 +mbcs_pool blocks[sys_alloc] size: 0 +mbcs_pool blocks[temp_alloc] count: 0 +mbcs_pool blocks[temp_alloc] size: 0 +mbcs_pool blocks[sl_alloc] count: 0 +mbcs_pool blocks[sl_alloc] size: 0 +mbcs_pool blocks[std_alloc] count: 0 +mbcs_pool blocks[std_alloc] size: 0 +mbcs_pool blocks[ll_alloc] count: 0 +mbcs_pool blocks[ll_alloc] size: 0 +mbcs_pool blocks[eheap_alloc] count: 0 +mbcs_pool blocks[eheap_alloc] size: 0 +mbcs_pool blocks[ets_alloc] count: 0 +mbcs_pool blocks[ets_alloc] size: 0 +mbcs_pool blocks[fix_alloc] count: 0 +mbcs_pool blocks[fix_alloc] size: 0 +mbcs_pool blocks[literal_alloc] count: 0 +mbcs_pool blocks[literal_alloc] size: 0 +mbcs_pool blocks[binary_alloc] count: 0 +mbcs_pool blocks[binary_alloc] size: 0 +mbcs_pool blocks[driver_alloc] count: 0 +mbcs_pool blocks[driver_alloc] size: 0 +mbcs_pool blocks[test_alloc] count: 0 +mbcs_pool blocks[test_alloc] size: 0 +mbcs_pool carriers: 0 +mbcs_pool carriers size: 0 +sbcs blocks[sys_alloc] count: 0 0 0 +sbcs blocks[sys_alloc] size: 0 0 0 +sbcs blocks[temp_alloc] count: 0 0 0 +sbcs blocks[temp_alloc] size: 0 0 0 +sbcs blocks[sl_alloc] count: 0 0 0 +sbcs blocks[sl_alloc] size: 0 0 0 +sbcs blocks[std_alloc] count: 0 0 0 +sbcs blocks[std_alloc] size: 0 0 0 +sbcs blocks[ll_alloc] count: 0 0 0 +sbcs blocks[ll_alloc] size: 0 0 0 +sbcs blocks[eheap_alloc] count: 0 0 0 +sbcs blocks[eheap_alloc] size: 0 0 0 +sbcs blocks[ets_alloc] count: 0 0 0 +sbcs blocks[ets_alloc] size: 0 0 0 +sbcs blocks[fix_alloc] count: 0 0 0 +sbcs blocks[fix_alloc] size: 0 0 0 +sbcs blocks[literal_alloc] count: 0 0 0 +sbcs blocks[literal_alloc] size: 0 0 0 +sbcs blocks[binary_alloc] count: 0 0 0 +sbcs blocks[binary_alloc] size: 0 0 0 +sbcs blocks[driver_alloc] count: 0 0 0 +sbcs blocks[driver_alloc] size: 0 0 0 +sbcs blocks[test_alloc] count: 0 0 0 +sbcs blocks[test_alloc] size: 0 0 0 +sbcs carriers: 0 0 0 +sbcs mseg carriers: 0 +sbcs sys_alloc carriers: 0 +sbcs carriers size: 0 0 0 +sbcs mseg carriers size: 0 +sbcs sys_alloc carriers size: 0 +ets_alloc calls: 0 +ets_free calls: 0 +ets_realloc calls: 0 +mseg_alloc calls: 0 +mseg_dealloc calls: 0 +mseg_realloc calls: 0 +sys_alloc calls: 1 +sys_free calls: 0 +sys_realloc calls: 0 +=allocator:ets_alloc[4] +versions: 0.9 3.0 +option e: true +option t: 5 +option ramv: false +option atags: false +option sbct: 524288 +option asbcst: 4145152 +option rsbcst: 20 +option rsbcmt: 80 +option rmbcmt: 50 +option mmbcs: 32768 +option mmsbc: 256 +option mmmbc: 18446744073709551615 +option lmbcs: 5242880 +option smbcs: 262144 +option mbcgs: 10 +option acul: 60 +option acful: 0 +option acnl: 1000 +option acfml: 0 +option cp: E +option as: aoffcbf +mbcs blocks[sys_alloc] count: 0 0 0 +mbcs blocks[sys_alloc] size: 0 0 0 +mbcs blocks[temp_alloc] count: 0 0 0 +mbcs blocks[temp_alloc] size: 0 0 0 +mbcs blocks[sl_alloc] count: 0 0 0 +mbcs blocks[sl_alloc] size: 0 0 0 +mbcs blocks[std_alloc] count: 0 0 0 +mbcs blocks[std_alloc] size: 0 0 0 +mbcs blocks[ll_alloc] count: 0 0 0 +mbcs blocks[ll_alloc] size: 0 0 0 +mbcs blocks[eheap_alloc] count: 0 0 0 +mbcs blocks[eheap_alloc] size: 0 0 0 +mbcs blocks[ets_alloc] count: 0 0 0 +mbcs blocks[ets_alloc] size: 0 0 0 +mbcs blocks[fix_alloc] count: 0 0 0 +mbcs blocks[fix_alloc] size: 0 0 0 +mbcs blocks[literal_alloc] count: 0 0 0 +mbcs blocks[literal_alloc] size: 0 0 0 +mbcs blocks[binary_alloc] count: 0 0 0 +mbcs blocks[binary_alloc] size: 0 0 0 +mbcs blocks[driver_alloc] count: 0 0 0 +mbcs blocks[driver_alloc] size: 0 0 0 +mbcs blocks[test_alloc] count: 0 0 0 +mbcs blocks[test_alloc] size: 0 0 0 +mbcs carriers: 1 1 1 +mbcs mseg carriers: 0 +mbcs sys_alloc carriers: 1 +mbcs carriers size: 32768 32768 32768 +mbcs mseg carriers size: 0 +mbcs sys_alloc carriers size: 32768 +mbcs_pool blocks[sys_alloc] count: 0 +mbcs_pool blocks[sys_alloc] size: 0 +mbcs_pool blocks[temp_alloc] count: 0 +mbcs_pool blocks[temp_alloc] size: 0 +mbcs_pool blocks[sl_alloc] count: 0 +mbcs_pool blocks[sl_alloc] size: 0 +mbcs_pool blocks[std_alloc] count: 0 +mbcs_pool blocks[std_alloc] size: 0 +mbcs_pool blocks[ll_alloc] count: 0 +mbcs_pool blocks[ll_alloc] size: 0 +mbcs_pool blocks[eheap_alloc] count: 0 +mbcs_pool blocks[eheap_alloc] size: 0 +mbcs_pool blocks[ets_alloc] count: 0 +mbcs_pool blocks[ets_alloc] size: 0 +mbcs_pool blocks[fix_alloc] count: 0 +mbcs_pool blocks[fix_alloc] size: 0 +mbcs_pool blocks[literal_alloc] count: 0 +mbcs_pool blocks[literal_alloc] size: 0 +mbcs_pool blocks[binary_alloc] count: 0 +mbcs_pool blocks[binary_alloc] size: 0 +mbcs_pool blocks[driver_alloc] count: 0 +mbcs_pool blocks[driver_alloc] size: 0 +mbcs_pool blocks[test_alloc] count: 0 +mbcs_pool blocks[test_alloc] size: 0 +mbcs_pool carriers: 0 +mbcs_pool carriers size: 0 +sbcs blocks[sys_alloc] count: 0 0 0 +sbcs blocks[sys_alloc] size: 0 0 0 +sbcs blocks[temp_alloc] count: 0 0 0 +sbcs blocks[temp_alloc] size: 0 0 0 +sbcs blocks[sl_alloc] count: 0 0 0 +sbcs blocks[sl_alloc] size: 0 0 0 +sbcs blocks[std_alloc] count: 0 0 0 +sbcs blocks[std_alloc] size: 0 0 0 +sbcs blocks[ll_alloc] count: 0 0 0 +sbcs blocks[ll_alloc] size: 0 0 0 +sbcs blocks[eheap_alloc] count: 0 0 0 +sbcs blocks[eheap_alloc] size: 0 0 0 +sbcs blocks[ets_alloc] count: 0 0 0 +sbcs blocks[ets_alloc] size: 0 0 0 +sbcs blocks[fix_alloc] count: 0 0 0 +sbcs blocks[fix_alloc] size: 0 0 0 +sbcs blocks[literal_alloc] count: 0 0 0 +sbcs blocks[literal_alloc] size: 0 0 0 +sbcs blocks[binary_alloc] count: 0 0 0 +sbcs blocks[binary_alloc] size: 0 0 0 +sbcs blocks[driver_alloc] count: 0 0 0 +sbcs blocks[driver_alloc] size: 0 0 0 +sbcs blocks[test_alloc] count: 0 0 0 +sbcs blocks[test_alloc] size: 0 0 0 +sbcs carriers: 0 0 0 +sbcs mseg carriers: 0 +sbcs sys_alloc carriers: 0 +sbcs carriers size: 0 0 0 +sbcs mseg carriers size: 0 +sbcs sys_alloc carriers size: 0 +ets_alloc calls: 0 +ets_free calls: 0 +ets_realloc calls: 0 +mseg_alloc calls: 0 +mseg_dealloc calls: 0 +mseg_realloc calls: 0 +sys_alloc calls: 1 +sys_free calls: 0 +sys_realloc calls: 0 +=allocator:fix_alloc[0] +versions: 0.9 3.0 +option e: true +option t: 5 +option ramv: false +option atags: false +option sbct: 524288 +option asbcst: 4145152 +option rsbcst: 20 +option rsbcmt: 80 +option rmbcmt: 50 +option mmbcs: 32768 +option mmsbc: 256 +option mmmbc: 18446744073709551615 +option lmbcs: 5242880 +option smbcs: 262144 +option mbcgs: 10 +option acul: 0 +option acful: 0 +option acnl: 0 +option acfml: 0 +option cp: undefined +option as: aoffcbf +fix type: enif_select_data_state 0 0 +fix type: driver_select_data_state 0 0 +fix type: link 0 0 +fix type: monitor 0 0 +fix type: sl_thr_q_element 448 16 +fix type: process_signal_queue_buffers 0 0 +fix type: magic_indirection 0 0 +fix type: nsched_pid_ref_entry 0 0 +fix type: nsched_magic_ref_entry 0 0 +fix type: bif_timer 0 0 +fix type: hl_ptimer 0 0 +fix type: ll_ptimer 0 0 +fix type: msg_ref 40 40 +fix type: receive_marker_block 0 0 +fix type: proc 5320 5320 +mbcs blocks[sys_alloc] count: 0 0 0 +mbcs blocks[sys_alloc] size: 0 0 0 +mbcs blocks[temp_alloc] count: 0 0 0 +mbcs blocks[temp_alloc] size: 0 0 0 +mbcs blocks[sl_alloc] count: 0 0 0 +mbcs blocks[sl_alloc] size: 0 0 0 +mbcs blocks[std_alloc] count: 0 0 0 +mbcs blocks[std_alloc] size: 0 0 0 +mbcs blocks[ll_alloc] count: 0 0 0 +mbcs blocks[ll_alloc] size: 0 0 0 +mbcs blocks[eheap_alloc] count: 0 0 0 +mbcs blocks[eheap_alloc] size: 0 0 0 +mbcs blocks[ets_alloc] count: 0 0 0 +mbcs blocks[ets_alloc] size: 0 0 0 +mbcs blocks[fix_alloc] count: 36 36 36 +mbcs blocks[fix_alloc] size: 7232 7232 7232 +mbcs blocks[literal_alloc] count: 0 0 0 +mbcs blocks[literal_alloc] size: 0 0 0 +mbcs blocks[binary_alloc] count: 0 0 0 +mbcs blocks[binary_alloc] size: 0 0 0 +mbcs blocks[driver_alloc] count: 0 0 0 +mbcs blocks[driver_alloc] size: 0 0 0 +mbcs blocks[test_alloc] count: 0 0 0 +mbcs blocks[test_alloc] size: 0 0 0 +mbcs carriers: 1 1 1 +mbcs mseg carriers: 0 +mbcs sys_alloc carriers: 1 +mbcs carriers size: 32768 32768 32768 +mbcs mseg carriers size: 0 +mbcs sys_alloc carriers size: 32768 +sbcs blocks[sys_alloc] count: 0 0 0 +sbcs blocks[sys_alloc] size: 0 0 0 +sbcs blocks[temp_alloc] count: 0 0 0 +sbcs blocks[temp_alloc] size: 0 0 0 +sbcs blocks[sl_alloc] count: 0 0 0 +sbcs blocks[sl_alloc] size: 0 0 0 +sbcs blocks[std_alloc] count: 0 0 0 +sbcs blocks[std_alloc] size: 0 0 0 +sbcs blocks[ll_alloc] count: 0 0 0 +sbcs blocks[ll_alloc] size: 0 0 0 +sbcs blocks[eheap_alloc] count: 0 0 0 +sbcs blocks[eheap_alloc] size: 0 0 0 +sbcs blocks[ets_alloc] count: 0 0 0 +sbcs blocks[ets_alloc] size: 0 0 0 +sbcs blocks[fix_alloc] count: 0 0 0 +sbcs blocks[fix_alloc] size: 0 0 0 +sbcs blocks[literal_alloc] count: 0 0 0 +sbcs blocks[literal_alloc] size: 0 0 0 +sbcs blocks[binary_alloc] count: 0 0 0 +sbcs blocks[binary_alloc] size: 0 0 0 +sbcs blocks[driver_alloc] count: 0 0 0 +sbcs blocks[driver_alloc] size: 0 0 0 +sbcs blocks[test_alloc] count: 0 0 0 +sbcs blocks[test_alloc] size: 0 0 0 +sbcs carriers: 0 0 0 +sbcs mseg carriers: 0 +sbcs sys_alloc carriers: 0 +sbcs carriers size: 0 0 0 +sbcs mseg carriers size: 0 +sbcs sys_alloc carriers size: 0 +fix_alloc calls: 90 +fix_free calls: 81 +fix_realloc calls: 0 +mseg_alloc calls: 0 +mseg_dealloc calls: 0 +mseg_realloc calls: 0 +sys_alloc calls: 1 +sys_free calls: 0 +sys_realloc calls: 0 +=allocator:fix_alloc[1] +versions: 0.9 3.0 +option e: true +option t: 5 +option ramv: false +option atags: false +option sbct: 524288 +option asbcst: 4145152 +option rsbcst: 20 +option rsbcmt: 80 +option rmbcmt: 50 +option mmbcs: 32768 +option mmsbc: 256 +option mmmbc: 18446744073709551615 +option lmbcs: 5242880 +option smbcs: 262144 +option mbcgs: 10 +option acul: 60 +option acful: 0 +option acnl: 1000 +option acfml: 0 +option cp: F +option as: aoffcbf +mbcs blocks[sys_alloc] count: 0 0 0 +mbcs blocks[sys_alloc] size: 0 0 0 +mbcs blocks[temp_alloc] count: 0 0 0 +mbcs blocks[temp_alloc] size: 0 0 0 +mbcs blocks[sl_alloc] count: 0 0 0 +mbcs blocks[sl_alloc] size: 0 0 0 +mbcs blocks[std_alloc] count: 0 0 0 +mbcs blocks[std_alloc] size: 0 0 0 +mbcs blocks[ll_alloc] count: 0 0 0 +mbcs blocks[ll_alloc] size: 0 0 0 +mbcs blocks[eheap_alloc] count: 0 0 0 +mbcs blocks[eheap_alloc] size: 0 0 0 +mbcs blocks[ets_alloc] count: 0 0 0 +mbcs blocks[ets_alloc] size: 0 0 0 +mbcs blocks[fix_alloc] count: 0 0 0 +mbcs blocks[fix_alloc] size: 0 0 0 +mbcs blocks[literal_alloc] count: 0 0 0 +mbcs blocks[literal_alloc] size: 0 0 0 +mbcs blocks[binary_alloc] count: 0 0 0 +mbcs blocks[binary_alloc] size: 0 0 0 +mbcs blocks[driver_alloc] count: 0 0 0 +mbcs blocks[driver_alloc] size: 0 0 0 +mbcs blocks[test_alloc] count: 0 0 0 +mbcs blocks[test_alloc] size: 0 0 0 +mbcs carriers: 1 1 1 +mbcs mseg carriers: 0 +mbcs sys_alloc carriers: 1 +mbcs carriers size: 32768 32768 32768 +mbcs mseg carriers size: 0 +mbcs sys_alloc carriers size: 32768 +mbcs_pool blocks[sys_alloc] count: 0 +mbcs_pool blocks[sys_alloc] size: 0 +mbcs_pool blocks[temp_alloc] count: 0 +mbcs_pool blocks[temp_alloc] size: 0 +mbcs_pool blocks[sl_alloc] count: 0 +mbcs_pool blocks[sl_alloc] size: 0 +mbcs_pool blocks[std_alloc] count: 0 +mbcs_pool blocks[std_alloc] size: 0 +mbcs_pool blocks[ll_alloc] count: 0 +mbcs_pool blocks[ll_alloc] size: 0 +mbcs_pool blocks[eheap_alloc] count: 0 +mbcs_pool blocks[eheap_alloc] size: 0 +mbcs_pool blocks[ets_alloc] count: 0 +mbcs_pool blocks[ets_alloc] size: 0 +mbcs_pool blocks[fix_alloc] count: 0 +mbcs_pool blocks[fix_alloc] size: 0 +mbcs_pool blocks[literal_alloc] count: 0 +mbcs_pool blocks[literal_alloc] size: 0 +mbcs_pool blocks[binary_alloc] count: 0 +mbcs_pool blocks[binary_alloc] size: 0 +mbcs_pool blocks[driver_alloc] count: 0 +mbcs_pool blocks[driver_alloc] size: 0 +mbcs_pool blocks[test_alloc] count: 0 +mbcs_pool blocks[test_alloc] size: 0 +mbcs_pool carriers: 0 +mbcs_pool carriers size: 0 +sbcs blocks[sys_alloc] count: 0 0 0 +sbcs blocks[sys_alloc] size: 0 0 0 +sbcs blocks[temp_alloc] count: 0 0 0 +sbcs blocks[temp_alloc] size: 0 0 0 +sbcs blocks[sl_alloc] count: 0 0 0 +sbcs blocks[sl_alloc] size: 0 0 0 +sbcs blocks[std_alloc] count: 0 0 0 +sbcs blocks[std_alloc] size: 0 0 0 +sbcs blocks[ll_alloc] count: 0 0 0 +sbcs blocks[ll_alloc] size: 0 0 0 +sbcs blocks[eheap_alloc] count: 0 0 0 +sbcs blocks[eheap_alloc] size: 0 0 0 +sbcs blocks[ets_alloc] count: 0 0 0 +sbcs blocks[ets_alloc] size: 0 0 0 +sbcs blocks[fix_alloc] count: 0 0 0 +sbcs blocks[fix_alloc] size: 0 0 0 +sbcs blocks[literal_alloc] count: 0 0 0 +sbcs blocks[literal_alloc] size: 0 0 0 +sbcs blocks[binary_alloc] count: 0 0 0 +sbcs blocks[binary_alloc] size: 0 0 0 +sbcs blocks[driver_alloc] count: 0 0 0 +sbcs blocks[driver_alloc] size: 0 0 0 +sbcs blocks[test_alloc] count: 0 0 0 +sbcs blocks[test_alloc] size: 0 0 0 +sbcs carriers: 0 0 0 +sbcs mseg carriers: 0 +sbcs sys_alloc carriers: 0 +sbcs carriers size: 0 0 0 +sbcs mseg carriers size: 0 +sbcs sys_alloc carriers size: 0 +fix_alloc calls: 0 +fix_free calls: 0 +fix_realloc calls: 0 +mseg_alloc calls: 0 +mseg_dealloc calls: 0 +mseg_realloc calls: 0 +sys_alloc calls: 1 +sys_free calls: 0 +sys_realloc calls: 0 +=allocator:fix_alloc[2] +versions: 0.9 3.0 +option e: true +option t: 5 +option ramv: false +option atags: false +option sbct: 524288 +option asbcst: 4145152 +option rsbcst: 20 +option rsbcmt: 80 +option rmbcmt: 50 +option mmbcs: 32768 +option mmsbc: 256 +option mmmbc: 18446744073709551615 +option lmbcs: 5242880 +option smbcs: 262144 +option mbcgs: 10 +option acul: 60 +option acful: 0 +option acnl: 1000 +option acfml: 0 +option cp: F +option as: aoffcbf +mbcs blocks[sys_alloc] count: 0 0 0 +mbcs blocks[sys_alloc] size: 0 0 0 +mbcs blocks[temp_alloc] count: 0 0 0 +mbcs blocks[temp_alloc] size: 0 0 0 +mbcs blocks[sl_alloc] count: 0 0 0 +mbcs blocks[sl_alloc] size: 0 0 0 +mbcs blocks[std_alloc] count: 0 0 0 +mbcs blocks[std_alloc] size: 0 0 0 +mbcs blocks[ll_alloc] count: 0 0 0 +mbcs blocks[ll_alloc] size: 0 0 0 +mbcs blocks[eheap_alloc] count: 0 0 0 +mbcs blocks[eheap_alloc] size: 0 0 0 +mbcs blocks[ets_alloc] count: 0 0 0 +mbcs blocks[ets_alloc] size: 0 0 0 +mbcs blocks[fix_alloc] count: 157 157 157 +mbcs blocks[fix_alloc] size: 39120 39120 39120 +mbcs blocks[literal_alloc] count: 0 0 0 +mbcs blocks[literal_alloc] size: 0 0 0 +mbcs blocks[binary_alloc] count: 0 0 0 +mbcs blocks[binary_alloc] size: 0 0 0 +mbcs blocks[driver_alloc] count: 0 0 0 +mbcs blocks[driver_alloc] size: 0 0 0 +mbcs blocks[test_alloc] count: 0 0 0 +mbcs blocks[test_alloc] size: 0 0 0 +mbcs carriers: 2 2 2 +mbcs mseg carriers: 1 +mbcs sys_alloc carriers: 1 +mbcs carriers size: 294912 294912 294912 +mbcs mseg carriers size: 262144 +mbcs sys_alloc carriers size: 32768 +mbcs_pool blocks[sys_alloc] count: 0 +mbcs_pool blocks[sys_alloc] size: 0 +mbcs_pool blocks[temp_alloc] count: 0 +mbcs_pool blocks[temp_alloc] size: 0 +mbcs_pool blocks[sl_alloc] count: 0 +mbcs_pool blocks[sl_alloc] size: 0 +mbcs_pool blocks[std_alloc] count: 0 +mbcs_pool blocks[std_alloc] size: 0 +mbcs_pool blocks[ll_alloc] count: 0 +mbcs_pool blocks[ll_alloc] size: 0 +mbcs_pool blocks[eheap_alloc] count: 0 +mbcs_pool blocks[eheap_alloc] size: 0 +mbcs_pool blocks[ets_alloc] count: 0 +mbcs_pool blocks[ets_alloc] size: 0 +mbcs_pool blocks[fix_alloc] count: 0 +mbcs_pool blocks[fix_alloc] size: 0 +mbcs_pool blocks[literal_alloc] count: 0 +mbcs_pool blocks[literal_alloc] size: 0 +mbcs_pool blocks[binary_alloc] count: 0 +mbcs_pool blocks[binary_alloc] size: 0 +mbcs_pool blocks[driver_alloc] count: 0 +mbcs_pool blocks[driver_alloc] size: 0 +mbcs_pool blocks[test_alloc] count: 0 +mbcs_pool blocks[test_alloc] size: 0 +mbcs_pool carriers: 0 +mbcs_pool carriers size: 0 +sbcs blocks[sys_alloc] count: 0 0 0 +sbcs blocks[sys_alloc] size: 0 0 0 +sbcs blocks[temp_alloc] count: 0 0 0 +sbcs blocks[temp_alloc] size: 0 0 0 +sbcs blocks[sl_alloc] count: 0 0 0 +sbcs blocks[sl_alloc] size: 0 0 0 +sbcs blocks[std_alloc] count: 0 0 0 +sbcs blocks[std_alloc] size: 0 0 0 +sbcs blocks[ll_alloc] count: 0 0 0 +sbcs blocks[ll_alloc] size: 0 0 0 +sbcs blocks[eheap_alloc] count: 0 0 0 +sbcs blocks[eheap_alloc] size: 0 0 0 +sbcs blocks[ets_alloc] count: 0 0 0 +sbcs blocks[ets_alloc] size: 0 0 0 +sbcs blocks[fix_alloc] count: 0 0 0 +sbcs blocks[fix_alloc] size: 0 0 0 +sbcs blocks[literal_alloc] count: 0 0 0 +sbcs blocks[literal_alloc] size: 0 0 0 +sbcs blocks[binary_alloc] count: 0 0 0 +sbcs blocks[binary_alloc] size: 0 0 0 +sbcs blocks[driver_alloc] count: 0 0 0 +sbcs blocks[driver_alloc] size: 0 0 0 +sbcs blocks[test_alloc] count: 0 0 0 +sbcs blocks[test_alloc] size: 0 0 0 +sbcs carriers: 0 0 0 +sbcs mseg carriers: 0 +sbcs sys_alloc carriers: 0 +sbcs carriers size: 0 0 0 +sbcs mseg carriers size: 0 +sbcs sys_alloc carriers size: 0 +fix_alloc calls: 292 +fix_free calls: 173 +fix_realloc calls: 0 +mseg_alloc calls: 1 +mseg_dealloc calls: 0 +mseg_realloc calls: 0 +sys_alloc calls: 1 +sys_free calls: 0 +sys_realloc calls: 0 +=allocator:fix_alloc[3] +versions: 0.9 3.0 +option e: true +option t: 5 +option ramv: false +option atags: false +option sbct: 524288 +option asbcst: 4145152 +option rsbcst: 20 +option rsbcmt: 80 +option rmbcmt: 50 +option mmbcs: 32768 +option mmsbc: 256 +option mmmbc: 18446744073709551615 +option lmbcs: 5242880 +option smbcs: 262144 +option mbcgs: 10 +option acul: 60 +option acful: 0 +option acnl: 1000 +option acfml: 0 +option cp: F +option as: aoffcbf +mbcs blocks[sys_alloc] count: 0 0 0 +mbcs blocks[sys_alloc] size: 0 0 0 +mbcs blocks[temp_alloc] count: 0 0 0 +mbcs blocks[temp_alloc] size: 0 0 0 +mbcs blocks[sl_alloc] count: 0 0 0 +mbcs blocks[sl_alloc] size: 0 0 0 +mbcs blocks[std_alloc] count: 0 0 0 +mbcs blocks[std_alloc] size: 0 0 0 +mbcs blocks[ll_alloc] count: 0 0 0 +mbcs blocks[ll_alloc] size: 0 0 0 +mbcs blocks[eheap_alloc] count: 0 0 0 +mbcs blocks[eheap_alloc] size: 0 0 0 +mbcs blocks[ets_alloc] count: 0 0 0 +mbcs blocks[ets_alloc] size: 0 0 0 +mbcs blocks[fix_alloc] count: 0 0 0 +mbcs blocks[fix_alloc] size: 0 0 0 +mbcs blocks[literal_alloc] count: 0 0 0 +mbcs blocks[literal_alloc] size: 0 0 0 +mbcs blocks[binary_alloc] count: 0 0 0 +mbcs blocks[binary_alloc] size: 0 0 0 +mbcs blocks[driver_alloc] count: 0 0 0 +mbcs blocks[driver_alloc] size: 0 0 0 +mbcs blocks[test_alloc] count: 0 0 0 +mbcs blocks[test_alloc] size: 0 0 0 +mbcs carriers: 1 1 1 +mbcs mseg carriers: 0 +mbcs sys_alloc carriers: 1 +mbcs carriers size: 32768 32768 32768 +mbcs mseg carriers size: 0 +mbcs sys_alloc carriers size: 32768 +mbcs_pool blocks[sys_alloc] count: 0 +mbcs_pool blocks[sys_alloc] size: 0 +mbcs_pool blocks[temp_alloc] count: 0 +mbcs_pool blocks[temp_alloc] size: 0 +mbcs_pool blocks[sl_alloc] count: 0 +mbcs_pool blocks[sl_alloc] size: 0 +mbcs_pool blocks[std_alloc] count: 0 +mbcs_pool blocks[std_alloc] size: 0 +mbcs_pool blocks[ll_alloc] count: 0 +mbcs_pool blocks[ll_alloc] size: 0 +mbcs_pool blocks[eheap_alloc] count: 0 +mbcs_pool blocks[eheap_alloc] size: 0 +mbcs_pool blocks[ets_alloc] count: 0 +mbcs_pool blocks[ets_alloc] size: 0 +mbcs_pool blocks[fix_alloc] count: 0 +mbcs_pool blocks[fix_alloc] size: 0 +mbcs_pool blocks[literal_alloc] count: 0 +mbcs_pool blocks[literal_alloc] size: 0 +mbcs_pool blocks[binary_alloc] count: 0 +mbcs_pool blocks[binary_alloc] size: 0 +mbcs_pool blocks[driver_alloc] count: 0 +mbcs_pool blocks[driver_alloc] size: 0 +mbcs_pool blocks[test_alloc] count: 0 +mbcs_pool blocks[test_alloc] size: 0 +mbcs_pool carriers: 0 +mbcs_pool carriers size: 0 +sbcs blocks[sys_alloc] count: 0 0 0 +sbcs blocks[sys_alloc] size: 0 0 0 +sbcs blocks[temp_alloc] count: 0 0 0 +sbcs blocks[temp_alloc] size: 0 0 0 +sbcs blocks[sl_alloc] count: 0 0 0 +sbcs blocks[sl_alloc] size: 0 0 0 +sbcs blocks[std_alloc] count: 0 0 0 +sbcs blocks[std_alloc] size: 0 0 0 +sbcs blocks[ll_alloc] count: 0 0 0 +sbcs blocks[ll_alloc] size: 0 0 0 +sbcs blocks[eheap_alloc] count: 0 0 0 +sbcs blocks[eheap_alloc] size: 0 0 0 +sbcs blocks[ets_alloc] count: 0 0 0 +sbcs blocks[ets_alloc] size: 0 0 0 +sbcs blocks[fix_alloc] count: 0 0 0 +sbcs blocks[fix_alloc] size: 0 0 0 +sbcs blocks[literal_alloc] count: 0 0 0 +sbcs blocks[literal_alloc] size: 0 0 0 +sbcs blocks[binary_alloc] count: 0 0 0 +sbcs blocks[binary_alloc] size: 0 0 0 +sbcs blocks[driver_alloc] count: 0 0 0 +sbcs blocks[driver_alloc] size: 0 0 0 +sbcs blocks[test_alloc] count: 0 0 0 +sbcs blocks[test_alloc] size: 0 0 0 +sbcs carriers: 0 0 0 +sbcs mseg carriers: 0 +sbcs sys_alloc carriers: 0 +sbcs carriers size: 0 0 0 +sbcs mseg carriers size: 0 +sbcs sys_alloc carriers size: 0 +fix_alloc calls: 0 +fix_free calls: 0 +fix_realloc calls: 0 +mseg_alloc calls: 0 +mseg_dealloc calls: 0 +mseg_realloc calls: 0 +sys_alloc calls: 1 +sys_free calls: 0 +sys_realloc calls: 0 +=allocator:fix_alloc[4] +versions: 0.9 3.0 +option e: true +option t: 5 +option ramv: false +option atags: false +option sbct: 524288 +option asbcst: 4145152 +option rsbcst: 20 +option rsbcmt: 80 +option rmbcmt: 50 +option mmbcs: 32768 +option mmsbc: 256 +option mmmbc: 18446744073709551615 +option lmbcs: 5242880 +option smbcs: 262144 +option mbcgs: 10 +option acul: 60 +option acful: 0 +option acnl: 1000 +option acfml: 0 +option cp: F +option as: aoffcbf +mbcs blocks[sys_alloc] count: 0 0 0 +mbcs blocks[sys_alloc] size: 0 0 0 +mbcs blocks[temp_alloc] count: 0 0 0 +mbcs blocks[temp_alloc] size: 0 0 0 +mbcs blocks[sl_alloc] count: 0 0 0 +mbcs blocks[sl_alloc] size: 0 0 0 +mbcs blocks[std_alloc] count: 0 0 0 +mbcs blocks[std_alloc] size: 0 0 0 +mbcs blocks[ll_alloc] count: 0 0 0 +mbcs blocks[ll_alloc] size: 0 0 0 +mbcs blocks[eheap_alloc] count: 0 0 0 +mbcs blocks[eheap_alloc] size: 0 0 0 +mbcs blocks[ets_alloc] count: 0 0 0 +mbcs blocks[ets_alloc] size: 0 0 0 +mbcs blocks[fix_alloc] count: 0 0 0 +mbcs blocks[fix_alloc] size: 0 0 0 +mbcs blocks[literal_alloc] count: 0 0 0 +mbcs blocks[literal_alloc] size: 0 0 0 +mbcs blocks[binary_alloc] count: 0 0 0 +mbcs blocks[binary_alloc] size: 0 0 0 +mbcs blocks[driver_alloc] count: 0 0 0 +mbcs blocks[driver_alloc] size: 0 0 0 +mbcs blocks[test_alloc] count: 0 0 0 +mbcs blocks[test_alloc] size: 0 0 0 +mbcs carriers: 1 1 1 +mbcs mseg carriers: 0 +mbcs sys_alloc carriers: 1 +mbcs carriers size: 32768 32768 32768 +mbcs mseg carriers size: 0 +mbcs sys_alloc carriers size: 32768 +mbcs_pool blocks[sys_alloc] count: 0 +mbcs_pool blocks[sys_alloc] size: 0 +mbcs_pool blocks[temp_alloc] count: 0 +mbcs_pool blocks[temp_alloc] size: 0 +mbcs_pool blocks[sl_alloc] count: 0 +mbcs_pool blocks[sl_alloc] size: 0 +mbcs_pool blocks[std_alloc] count: 0 +mbcs_pool blocks[std_alloc] size: 0 +mbcs_pool blocks[ll_alloc] count: 0 +mbcs_pool blocks[ll_alloc] size: 0 +mbcs_pool blocks[eheap_alloc] count: 0 +mbcs_pool blocks[eheap_alloc] size: 0 +mbcs_pool blocks[ets_alloc] count: 0 +mbcs_pool blocks[ets_alloc] size: 0 +mbcs_pool blocks[fix_alloc] count: 0 +mbcs_pool blocks[fix_alloc] size: 0 +mbcs_pool blocks[literal_alloc] count: 0 +mbcs_pool blocks[literal_alloc] size: 0 +mbcs_pool blocks[binary_alloc] count: 0 +mbcs_pool blocks[binary_alloc] size: 0 +mbcs_pool blocks[driver_alloc] count: 0 +mbcs_pool blocks[driver_alloc] size: 0 +mbcs_pool blocks[test_alloc] count: 0 +mbcs_pool blocks[test_alloc] size: 0 +mbcs_pool carriers: 0 +mbcs_pool carriers size: 0 +sbcs blocks[sys_alloc] count: 0 0 0 +sbcs blocks[sys_alloc] size: 0 0 0 +sbcs blocks[temp_alloc] count: 0 0 0 +sbcs blocks[temp_alloc] size: 0 0 0 +sbcs blocks[sl_alloc] count: 0 0 0 +sbcs blocks[sl_alloc] size: 0 0 0 +sbcs blocks[std_alloc] count: 0 0 0 +sbcs blocks[std_alloc] size: 0 0 0 +sbcs blocks[ll_alloc] count: 0 0 0 +sbcs blocks[ll_alloc] size: 0 0 0 +sbcs blocks[eheap_alloc] count: 0 0 0 +sbcs blocks[eheap_alloc] size: 0 0 0 +sbcs blocks[ets_alloc] count: 0 0 0 +sbcs blocks[ets_alloc] size: 0 0 0 +sbcs blocks[fix_alloc] count: 0 0 0 +sbcs blocks[fix_alloc] size: 0 0 0 +sbcs blocks[literal_alloc] count: 0 0 0 +sbcs blocks[literal_alloc] size: 0 0 0 +sbcs blocks[binary_alloc] count: 0 0 0 +sbcs blocks[binary_alloc] size: 0 0 0 +sbcs blocks[driver_alloc] count: 0 0 0 +sbcs blocks[driver_alloc] size: 0 0 0 +sbcs blocks[test_alloc] count: 0 0 0 +sbcs blocks[test_alloc] size: 0 0 0 +sbcs carriers: 0 0 0 +sbcs mseg carriers: 0 +sbcs sys_alloc carriers: 0 +sbcs carriers size: 0 0 0 +sbcs mseg carriers size: 0 +sbcs sys_alloc carriers size: 0 +fix_alloc calls: 0 +fix_free calls: 0 +fix_realloc calls: 0 +mseg_alloc calls: 0 +mseg_dealloc calls: 0 +mseg_realloc calls: 0 +sys_alloc calls: 1 +sys_free calls: 0 +sys_realloc calls: 0 +=allocator:literal_alloc +versions: 0.9 3.0 +option e: true +option t: false +option ramv: false +option atags: false +option sbct: 18446744073709551615 +option asbcst: 0 +option rsbcst: 0 +option rsbcmt: 0 +option rmbcmt: 0 +option mmbcs: 1048576 +option mmsbc: 0 +option mmmbc: 18446744073709551615 +option lmbcs: 10485760 +option smbcs: 1048576 +option mbcgs: 10 +option acul: 0 +option acful: 0 +option acnl: 0 +option acfml: 0 +option cp: undefined +option as: aobf +mbcs blocks[sys_alloc] count: 0 0 0 +mbcs blocks[sys_alloc] size: 0 0 0 +mbcs blocks[temp_alloc] count: 0 0 0 +mbcs blocks[temp_alloc] size: 0 0 0 +mbcs blocks[sl_alloc] count: 0 0 0 +mbcs blocks[sl_alloc] size: 0 0 0 +mbcs blocks[std_alloc] count: 0 0 0 +mbcs blocks[std_alloc] size: 0 0 0 +mbcs blocks[ll_alloc] count: 0 0 0 +mbcs blocks[ll_alloc] size: 0 0 0 +mbcs blocks[eheap_alloc] count: 0 0 0 +mbcs blocks[eheap_alloc] size: 0 0 0 +mbcs blocks[ets_alloc] count: 0 0 0 +mbcs blocks[ets_alloc] size: 0 0 0 +mbcs blocks[fix_alloc] count: 0 0 0 +mbcs blocks[fix_alloc] size: 0 0 0 +mbcs blocks[literal_alloc] count: 131 131 131 +mbcs blocks[literal_alloc] size: 549096 549096 549096 +mbcs blocks[binary_alloc] count: 0 0 0 +mbcs blocks[binary_alloc] size: 0 0 0 +mbcs blocks[driver_alloc] count: 0 0 0 +mbcs blocks[driver_alloc] size: 0 0 0 +mbcs blocks[test_alloc] count: 0 0 0 +mbcs blocks[test_alloc] size: 0 0 0 +mbcs carriers: 1 1 1 +mbcs mseg carriers: 1 +mbcs sys_alloc carriers: 0 +mbcs carriers size: 1048576 1048576 1048576 +mbcs mseg carriers size: 1048576 +mbcs sys_alloc carriers size: 0 +sbcs blocks[sys_alloc] count: 0 0 0 +sbcs blocks[sys_alloc] size: 0 0 0 +sbcs blocks[temp_alloc] count: 0 0 0 +sbcs blocks[temp_alloc] size: 0 0 0 +sbcs blocks[sl_alloc] count: 0 0 0 +sbcs blocks[sl_alloc] size: 0 0 0 +sbcs blocks[std_alloc] count: 0 0 0 +sbcs blocks[std_alloc] size: 0 0 0 +sbcs blocks[ll_alloc] count: 0 0 0 +sbcs blocks[ll_alloc] size: 0 0 0 +sbcs blocks[eheap_alloc] count: 0 0 0 +sbcs blocks[eheap_alloc] size: 0 0 0 +sbcs blocks[ets_alloc] count: 0 0 0 +sbcs blocks[ets_alloc] size: 0 0 0 +sbcs blocks[fix_alloc] count: 0 0 0 +sbcs blocks[fix_alloc] size: 0 0 0 +sbcs blocks[literal_alloc] count: 0 0 0 +sbcs blocks[literal_alloc] size: 0 0 0 +sbcs blocks[binary_alloc] count: 0 0 0 +sbcs blocks[binary_alloc] size: 0 0 0 +sbcs blocks[driver_alloc] count: 0 0 0 +sbcs blocks[driver_alloc] size: 0 0 0 +sbcs blocks[test_alloc] count: 0 0 0 +sbcs blocks[test_alloc] size: 0 0 0 +sbcs carriers: 0 0 0 +sbcs mseg carriers: 0 +sbcs sys_alloc carriers: 0 +sbcs carriers size: 0 0 0 +sbcs mseg carriers size: 0 +sbcs sys_alloc carriers size: 0 +literal_alloc calls: 134 +literal_free calls: 3 +literal_realloc calls: 0 +mseg_alloc calls: 1 +mseg_dealloc calls: 0 +mseg_realloc calls: 0 +sys_alloc calls: 0 +sys_free calls: 0 +sys_realloc calls: 0 +=allocator:binary_alloc[0] +versions: 0.9 3.0 +option e: true +option t: 5 +option ramv: false +option atags: true +option sbct: 524288 +option asbcst: 4145152 +option rsbcst: 20 +option rsbcmt: 80 +option rmbcmt: 50 +option mmbcs: 32768 +option mmsbc: 256 +option mmmbc: 18446744073709551615 +option lmbcs: 5242880 +option smbcs: 262144 +option mbcgs: 10 +option acul: 0 +option acful: 0 +option acnl: 0 +option acfml: 0 +option cp: undefined +option as: aoffcbf +mbcs blocks[sys_alloc] count: 0 0 0 +mbcs blocks[sys_alloc] size: 0 0 0 +mbcs blocks[temp_alloc] count: 0 0 0 +mbcs blocks[temp_alloc] size: 0 0 0 +mbcs blocks[sl_alloc] count: 0 0 0 +mbcs blocks[sl_alloc] size: 0 0 0 +mbcs blocks[std_alloc] count: 0 0 0 +mbcs blocks[std_alloc] size: 0 0 0 +mbcs blocks[ll_alloc] count: 0 0 0 +mbcs blocks[ll_alloc] size: 0 0 0 +mbcs blocks[eheap_alloc] count: 0 0 0 +mbcs blocks[eheap_alloc] size: 0 0 0 +mbcs blocks[ets_alloc] count: 0 0 0 +mbcs blocks[ets_alloc] size: 0 0 0 +mbcs blocks[fix_alloc] count: 0 0 0 +mbcs blocks[fix_alloc] size: 0 0 0 +mbcs blocks[literal_alloc] count: 0 0 0 +mbcs blocks[literal_alloc] size: 0 0 0 +mbcs blocks[binary_alloc] count: 15 61 61 +mbcs blocks[binary_alloc] size: 727480 1796728 1796728 +mbcs blocks[driver_alloc] count: 0 0 0 +mbcs blocks[driver_alloc] size: 0 0 0 +mbcs blocks[test_alloc] count: 0 0 0 +mbcs blocks[test_alloc] size: 0 0 0 +mbcs carriers: 2 4 4 +mbcs mseg carriers: 1 +mbcs sys_alloc carriers: 1 +mbcs carriers size: 1081344 3440640 3440640 +mbcs mseg carriers size: 1048576 +mbcs sys_alloc carriers size: 32768 +sbcs blocks[sys_alloc] count: 0 0 0 +sbcs blocks[sys_alloc] size: 0 0 0 +sbcs blocks[temp_alloc] count: 0 0 0 +sbcs blocks[temp_alloc] size: 0 0 0 +sbcs blocks[sl_alloc] count: 0 0 0 +sbcs blocks[sl_alloc] size: 0 0 0 +sbcs blocks[std_alloc] count: 0 0 0 +sbcs blocks[std_alloc] size: 0 0 0 +sbcs blocks[ll_alloc] count: 0 0 0 +sbcs blocks[ll_alloc] size: 0 0 0 +sbcs blocks[eheap_alloc] count: 0 0 0 +sbcs blocks[eheap_alloc] size: 0 0 0 +sbcs blocks[ets_alloc] count: 0 0 0 +sbcs blocks[ets_alloc] size: 0 0 0 +sbcs blocks[fix_alloc] count: 0 0 0 +sbcs blocks[fix_alloc] size: 0 0 0 +sbcs blocks[literal_alloc] count: 0 0 0 +sbcs blocks[literal_alloc] size: 0 0 0 +sbcs blocks[binary_alloc] count: 0 1 1 +sbcs blocks[binary_alloc] size: 0 608304 608304 +sbcs blocks[driver_alloc] count: 0 0 0 +sbcs blocks[driver_alloc] size: 0 0 0 +sbcs blocks[test_alloc] count: 0 0 0 +sbcs blocks[test_alloc] size: 0 0 0 +sbcs carriers: 0 1 1 +sbcs mseg carriers: 0 +sbcs sys_alloc carriers: 0 +sbcs carriers size: 0 610304 610304 +sbcs mseg carriers size: 0 +sbcs sys_alloc carriers size: 0 +binary_alloc calls: 193 +binary_free calls: 178 +binary_realloc calls: 4 +mseg_alloc calls: 10 +mseg_dealloc calls: 9 +mseg_realloc calls: 0 +sys_alloc calls: 1 +sys_free calls: 0 +sys_realloc calls: 0 +=allocator:binary_alloc[1] +versions: 0.9 3.0 +option e: true +option t: 5 +option ramv: false +option atags: true +option sbct: 524288 +option asbcst: 4145152 +option rsbcst: 20 +option rsbcmt: 80 +option rmbcmt: 50 +option mmbcs: 32768 +option mmsbc: 256 +option mmmbc: 18446744073709551615 +option lmbcs: 5242880 +option smbcs: 262144 +option mbcgs: 10 +option acul: 60 +option acful: 0 +option acnl: 1000 +option acfml: 0 +option cp: B +option as: aoffcbf +mbcs blocks[sys_alloc] count: 0 0 0 +mbcs blocks[sys_alloc] size: 0 0 0 +mbcs blocks[temp_alloc] count: 0 0 0 +mbcs blocks[temp_alloc] size: 0 0 0 +mbcs blocks[sl_alloc] count: 0 0 0 +mbcs blocks[sl_alloc] size: 0 0 0 +mbcs blocks[std_alloc] count: 0 0 0 +mbcs blocks[std_alloc] size: 0 0 0 +mbcs blocks[ll_alloc] count: 0 0 0 +mbcs blocks[ll_alloc] size: 0 0 0 +mbcs blocks[eheap_alloc] count: 0 0 0 +mbcs blocks[eheap_alloc] size: 0 0 0 +mbcs blocks[ets_alloc] count: 0 0 0 +mbcs blocks[ets_alloc] size: 0 0 0 +mbcs blocks[fix_alloc] count: 0 0 0 +mbcs blocks[fix_alloc] size: 0 0 0 +mbcs blocks[literal_alloc] count: 0 0 0 +mbcs blocks[literal_alloc] size: 0 0 0 +mbcs blocks[binary_alloc] count: 34 35 35 +mbcs blocks[binary_alloc] size: 11136 11312 11312 +mbcs blocks[driver_alloc] count: 0 0 0 +mbcs blocks[driver_alloc] size: 0 0 0 +mbcs blocks[test_alloc] count: 0 0 0 +mbcs blocks[test_alloc] size: 0 0 0 +mbcs carriers: 1 1 1 +mbcs mseg carriers: 0 +mbcs sys_alloc carriers: 1 +mbcs carriers size: 32768 32768 32768 +mbcs mseg carriers size: 0 +mbcs sys_alloc carriers size: 32768 +mbcs_pool blocks[sys_alloc] count: 0 +mbcs_pool blocks[sys_alloc] size: 0 +mbcs_pool blocks[temp_alloc] count: 0 +mbcs_pool blocks[temp_alloc] size: 0 +mbcs_pool blocks[sl_alloc] count: 0 +mbcs_pool blocks[sl_alloc] size: 0 +mbcs_pool blocks[std_alloc] count: 0 +mbcs_pool blocks[std_alloc] size: 0 +mbcs_pool blocks[ll_alloc] count: 0 +mbcs_pool blocks[ll_alloc] size: 0 +mbcs_pool blocks[eheap_alloc] count: 0 +mbcs_pool blocks[eheap_alloc] size: 0 +mbcs_pool blocks[ets_alloc] count: 0 +mbcs_pool blocks[ets_alloc] size: 0 +mbcs_pool blocks[fix_alloc] count: 0 +mbcs_pool blocks[fix_alloc] size: 0 +mbcs_pool blocks[literal_alloc] count: 0 +mbcs_pool blocks[literal_alloc] size: 0 +mbcs_pool blocks[binary_alloc] count: 0 +mbcs_pool blocks[binary_alloc] size: 0 +mbcs_pool blocks[driver_alloc] count: 0 +mbcs_pool blocks[driver_alloc] size: 0 +mbcs_pool blocks[test_alloc] count: 0 +mbcs_pool blocks[test_alloc] size: 0 +mbcs_pool carriers: 0 +mbcs_pool carriers size: 0 +sbcs blocks[sys_alloc] count: 0 0 0 +sbcs blocks[sys_alloc] size: 0 0 0 +sbcs blocks[temp_alloc] count: 0 0 0 +sbcs blocks[temp_alloc] size: 0 0 0 +sbcs blocks[sl_alloc] count: 0 0 0 +sbcs blocks[sl_alloc] size: 0 0 0 +sbcs blocks[std_alloc] count: 0 0 0 +sbcs blocks[std_alloc] size: 0 0 0 +sbcs blocks[ll_alloc] count: 0 0 0 +sbcs blocks[ll_alloc] size: 0 0 0 +sbcs blocks[eheap_alloc] count: 0 0 0 +sbcs blocks[eheap_alloc] size: 0 0 0 +sbcs blocks[ets_alloc] count: 0 0 0 +sbcs blocks[ets_alloc] size: 0 0 0 +sbcs blocks[fix_alloc] count: 0 0 0 +sbcs blocks[fix_alloc] size: 0 0 0 +sbcs blocks[literal_alloc] count: 0 0 0 +sbcs blocks[literal_alloc] size: 0 0 0 +sbcs blocks[binary_alloc] count: 0 0 0 +sbcs blocks[binary_alloc] size: 0 0 0 +sbcs blocks[driver_alloc] count: 0 0 0 +sbcs blocks[driver_alloc] size: 0 0 0 +sbcs blocks[test_alloc] count: 0 0 0 +sbcs blocks[test_alloc] size: 0 0 0 +sbcs carriers: 0 0 0 +sbcs mseg carriers: 0 +sbcs sys_alloc carriers: 0 +sbcs carriers size: 0 0 0 +sbcs mseg carriers size: 0 +sbcs sys_alloc carriers size: 0 +binary_alloc calls: 35 +binary_free calls: 1 +binary_realloc calls: 0 +mseg_alloc calls: 0 +mseg_dealloc calls: 0 +mseg_realloc calls: 0 +sys_alloc calls: 1 +sys_free calls: 0 +sys_realloc calls: 0 +=allocator:binary_alloc[2] +versions: 0.9 3.0 +option e: true +option t: 5 +option ramv: false +option atags: true +option sbct: 524288 +option asbcst: 4145152 +option rsbcst: 20 +option rsbcmt: 80 +option rmbcmt: 50 +option mmbcs: 32768 +option mmsbc: 256 +option mmmbc: 18446744073709551615 +option lmbcs: 5242880 +option smbcs: 262144 +option mbcgs: 10 +option acul: 60 +option acful: 0 +option acnl: 1000 +option acfml: 0 +option cp: B +option as: aoffcbf +mbcs blocks[sys_alloc] count: 0 0 0 +mbcs blocks[sys_alloc] size: 0 0 0 +mbcs blocks[temp_alloc] count: 0 0 0 +mbcs blocks[temp_alloc] size: 0 0 0 +mbcs blocks[sl_alloc] count: 0 0 0 +mbcs blocks[sl_alloc] size: 0 0 0 +mbcs blocks[std_alloc] count: 0 0 0 +mbcs blocks[std_alloc] size: 0 0 0 +mbcs blocks[ll_alloc] count: 0 0 0 +mbcs blocks[ll_alloc] size: 0 0 0 +mbcs blocks[eheap_alloc] count: 0 0 0 +mbcs blocks[eheap_alloc] size: 0 0 0 +mbcs blocks[ets_alloc] count: 0 0 0 +mbcs blocks[ets_alloc] size: 0 0 0 +mbcs blocks[fix_alloc] count: 0 0 0 +mbcs blocks[fix_alloc] size: 0 0 0 +mbcs blocks[literal_alloc] count: 0 0 0 +mbcs blocks[literal_alloc] size: 0 0 0 +mbcs blocks[binary_alloc] count: 27 54 54 +mbcs blocks[binary_alloc] size: 10464 23576 23576 +mbcs blocks[driver_alloc] count: 0 0 0 +mbcs blocks[driver_alloc] size: 0 0 0 +mbcs blocks[test_alloc] count: 0 0 0 +mbcs blocks[test_alloc] size: 0 0 0 +mbcs carriers: 1 1 1 +mbcs mseg carriers: 0 +mbcs sys_alloc carriers: 1 +mbcs carriers size: 32768 32768 32768 +mbcs mseg carriers size: 0 +mbcs sys_alloc carriers size: 32768 +mbcs_pool blocks[sys_alloc] count: 0 +mbcs_pool blocks[sys_alloc] size: 0 +mbcs_pool blocks[temp_alloc] count: 0 +mbcs_pool blocks[temp_alloc] size: 0 +mbcs_pool blocks[sl_alloc] count: 0 +mbcs_pool blocks[sl_alloc] size: 0 +mbcs_pool blocks[std_alloc] count: 0 +mbcs_pool blocks[std_alloc] size: 0 +mbcs_pool blocks[ll_alloc] count: 0 +mbcs_pool blocks[ll_alloc] size: 0 +mbcs_pool blocks[eheap_alloc] count: 0 +mbcs_pool blocks[eheap_alloc] size: 0 +mbcs_pool blocks[ets_alloc] count: 0 +mbcs_pool blocks[ets_alloc] size: 0 +mbcs_pool blocks[fix_alloc] count: 0 +mbcs_pool blocks[fix_alloc] size: 0 +mbcs_pool blocks[literal_alloc] count: 0 +mbcs_pool blocks[literal_alloc] size: 0 +mbcs_pool blocks[binary_alloc] count: 0 +mbcs_pool blocks[binary_alloc] size: 0 +mbcs_pool blocks[driver_alloc] count: 0 +mbcs_pool blocks[driver_alloc] size: 0 +mbcs_pool blocks[test_alloc] count: 0 +mbcs_pool blocks[test_alloc] size: 0 +mbcs_pool carriers: 0 +mbcs_pool carriers size: 0 +sbcs blocks[sys_alloc] count: 0 0 0 +sbcs blocks[sys_alloc] size: 0 0 0 +sbcs blocks[temp_alloc] count: 0 0 0 +sbcs blocks[temp_alloc] size: 0 0 0 +sbcs blocks[sl_alloc] count: 0 0 0 +sbcs blocks[sl_alloc] size: 0 0 0 +sbcs blocks[std_alloc] count: 0 0 0 +sbcs blocks[std_alloc] size: 0 0 0 +sbcs blocks[ll_alloc] count: 0 0 0 +sbcs blocks[ll_alloc] size: 0 0 0 +sbcs blocks[eheap_alloc] count: 0 0 0 +sbcs blocks[eheap_alloc] size: 0 0 0 +sbcs blocks[ets_alloc] count: 0 0 0 +sbcs blocks[ets_alloc] size: 0 0 0 +sbcs blocks[fix_alloc] count: 0 0 0 +sbcs blocks[fix_alloc] size: 0 0 0 +sbcs blocks[literal_alloc] count: 0 0 0 +sbcs blocks[literal_alloc] size: 0 0 0 +sbcs blocks[binary_alloc] count: 0 0 0 +sbcs blocks[binary_alloc] size: 0 0 0 +sbcs blocks[driver_alloc] count: 0 0 0 +sbcs blocks[driver_alloc] size: 0 0 0 +sbcs blocks[test_alloc] count: 0 0 0 +sbcs blocks[test_alloc] size: 0 0 0 +sbcs carriers: 0 0 0 +sbcs mseg carriers: 0 +sbcs sys_alloc carriers: 0 +sbcs carriers size: 0 0 0 +sbcs mseg carriers size: 0 +sbcs sys_alloc carriers size: 0 +binary_alloc calls: 210 +binary_free calls: 183 +binary_realloc calls: 0 +mseg_alloc calls: 0 +mseg_dealloc calls: 0 +mseg_realloc calls: 0 +sys_alloc calls: 1 +sys_free calls: 0 +sys_realloc calls: 0 +=allocator:binary_alloc[3] +versions: 0.9 3.0 +option e: true +option t: 5 +option ramv: false +option atags: true +option sbct: 524288 +option asbcst: 4145152 +option rsbcst: 20 +option rsbcmt: 80 +option rmbcmt: 50 +option mmbcs: 32768 +option mmsbc: 256 +option mmmbc: 18446744073709551615 +option lmbcs: 5242880 +option smbcs: 262144 +option mbcgs: 10 +option acul: 60 +option acful: 0 +option acnl: 1000 +option acfml: 0 +option cp: B +option as: aoffcbf +mbcs blocks[sys_alloc] count: 0 0 0 +mbcs blocks[sys_alloc] size: 0 0 0 +mbcs blocks[temp_alloc] count: 0 0 0 +mbcs blocks[temp_alloc] size: 0 0 0 +mbcs blocks[sl_alloc] count: 0 0 0 +mbcs blocks[sl_alloc] size: 0 0 0 +mbcs blocks[std_alloc] count: 0 0 0 +mbcs blocks[std_alloc] size: 0 0 0 +mbcs blocks[ll_alloc] count: 0 0 0 +mbcs blocks[ll_alloc] size: 0 0 0 +mbcs blocks[eheap_alloc] count: 0 0 0 +mbcs blocks[eheap_alloc] size: 0 0 0 +mbcs blocks[ets_alloc] count: 0 0 0 +mbcs blocks[ets_alloc] size: 0 0 0 +mbcs blocks[fix_alloc] count: 0 0 0 +mbcs blocks[fix_alloc] size: 0 0 0 +mbcs blocks[literal_alloc] count: 0 0 0 +mbcs blocks[literal_alloc] size: 0 0 0 +mbcs blocks[binary_alloc] count: 0 0 0 +mbcs blocks[binary_alloc] size: 0 0 0 +mbcs blocks[driver_alloc] count: 0 0 0 +mbcs blocks[driver_alloc] size: 0 0 0 +mbcs blocks[test_alloc] count: 0 0 0 +mbcs blocks[test_alloc] size: 0 0 0 +mbcs carriers: 1 1 1 +mbcs mseg carriers: 0 +mbcs sys_alloc carriers: 1 +mbcs carriers size: 32768 32768 32768 +mbcs mseg carriers size: 0 +mbcs sys_alloc carriers size: 32768 +mbcs_pool blocks[sys_alloc] count: 0 +mbcs_pool blocks[sys_alloc] size: 0 +mbcs_pool blocks[temp_alloc] count: 0 +mbcs_pool blocks[temp_alloc] size: 0 +mbcs_pool blocks[sl_alloc] count: 0 +mbcs_pool blocks[sl_alloc] size: 0 +mbcs_pool blocks[std_alloc] count: 0 +mbcs_pool blocks[std_alloc] size: 0 +mbcs_pool blocks[ll_alloc] count: 0 +mbcs_pool blocks[ll_alloc] size: 0 +mbcs_pool blocks[eheap_alloc] count: 0 +mbcs_pool blocks[eheap_alloc] size: 0 +mbcs_pool blocks[ets_alloc] count: 0 +mbcs_pool blocks[ets_alloc] size: 0 +mbcs_pool blocks[fix_alloc] count: 0 +mbcs_pool blocks[fix_alloc] size: 0 +mbcs_pool blocks[literal_alloc] count: 0 +mbcs_pool blocks[literal_alloc] size: 0 +mbcs_pool blocks[binary_alloc] count: 0 +mbcs_pool blocks[binary_alloc] size: 0 +mbcs_pool blocks[driver_alloc] count: 0 +mbcs_pool blocks[driver_alloc] size: 0 +mbcs_pool blocks[test_alloc] count: 0 +mbcs_pool blocks[test_alloc] size: 0 +mbcs_pool carriers: 0 +mbcs_pool carriers size: 0 +sbcs blocks[sys_alloc] count: 0 0 0 +sbcs blocks[sys_alloc] size: 0 0 0 +sbcs blocks[temp_alloc] count: 0 0 0 +sbcs blocks[temp_alloc] size: 0 0 0 +sbcs blocks[sl_alloc] count: 0 0 0 +sbcs blocks[sl_alloc] size: 0 0 0 +sbcs blocks[std_alloc] count: 0 0 0 +sbcs blocks[std_alloc] size: 0 0 0 +sbcs blocks[ll_alloc] count: 0 0 0 +sbcs blocks[ll_alloc] size: 0 0 0 +sbcs blocks[eheap_alloc] count: 0 0 0 +sbcs blocks[eheap_alloc] size: 0 0 0 +sbcs blocks[ets_alloc] count: 0 0 0 +sbcs blocks[ets_alloc] size: 0 0 0 +sbcs blocks[fix_alloc] count: 0 0 0 +sbcs blocks[fix_alloc] size: 0 0 0 +sbcs blocks[literal_alloc] count: 0 0 0 +sbcs blocks[literal_alloc] size: 0 0 0 +sbcs blocks[binary_alloc] count: 0 0 0 +sbcs blocks[binary_alloc] size: 0 0 0 +sbcs blocks[driver_alloc] count: 0 0 0 +sbcs blocks[driver_alloc] size: 0 0 0 +sbcs blocks[test_alloc] count: 0 0 0 +sbcs blocks[test_alloc] size: 0 0 0 +sbcs carriers: 0 0 0 +sbcs mseg carriers: 0 +sbcs sys_alloc carriers: 0 +sbcs carriers size: 0 0 0 +sbcs mseg carriers size: 0 +sbcs sys_alloc carriers size: 0 +binary_alloc calls: 0 +binary_free calls: 0 +binary_realloc calls: 0 +mseg_alloc calls: 0 +mseg_dealloc calls: 0 +mseg_realloc calls: 0 +sys_alloc calls: 1 +sys_free calls: 0 +sys_realloc calls: 0 +=allocator:binary_alloc[4] +versions: 0.9 3.0 +option e: true +option t: 5 +option ramv: false +option atags: true +option sbct: 524288 +option asbcst: 4145152 +option rsbcst: 20 +option rsbcmt: 80 +option rmbcmt: 50 +option mmbcs: 32768 +option mmsbc: 256 +option mmmbc: 18446744073709551615 +option lmbcs: 5242880 +option smbcs: 262144 +option mbcgs: 10 +option acul: 60 +option acful: 0 +option acnl: 1000 +option acfml: 0 +option cp: B +option as: aoffcbf +mbcs blocks[sys_alloc] count: 0 0 0 +mbcs blocks[sys_alloc] size: 0 0 0 +mbcs blocks[temp_alloc] count: 0 0 0 +mbcs blocks[temp_alloc] size: 0 0 0 +mbcs blocks[sl_alloc] count: 0 0 0 +mbcs blocks[sl_alloc] size: 0 0 0 +mbcs blocks[std_alloc] count: 0 0 0 +mbcs blocks[std_alloc] size: 0 0 0 +mbcs blocks[ll_alloc] count: 0 0 0 +mbcs blocks[ll_alloc] size: 0 0 0 +mbcs blocks[eheap_alloc] count: 0 0 0 +mbcs blocks[eheap_alloc] size: 0 0 0 +mbcs blocks[ets_alloc] count: 0 0 0 +mbcs blocks[ets_alloc] size: 0 0 0 +mbcs blocks[fix_alloc] count: 0 0 0 +mbcs blocks[fix_alloc] size: 0 0 0 +mbcs blocks[literal_alloc] count: 0 0 0 +mbcs blocks[literal_alloc] size: 0 0 0 +mbcs blocks[binary_alloc] count: 0 0 0 +mbcs blocks[binary_alloc] size: 0 0 0 +mbcs blocks[driver_alloc] count: 0 0 0 +mbcs blocks[driver_alloc] size: 0 0 0 +mbcs blocks[test_alloc] count: 0 0 0 +mbcs blocks[test_alloc] size: 0 0 0 +mbcs carriers: 1 1 1 +mbcs mseg carriers: 0 +mbcs sys_alloc carriers: 1 +mbcs carriers size: 32768 32768 32768 +mbcs mseg carriers size: 0 +mbcs sys_alloc carriers size: 32768 +mbcs_pool blocks[sys_alloc] count: 0 +mbcs_pool blocks[sys_alloc] size: 0 +mbcs_pool blocks[temp_alloc] count: 0 +mbcs_pool blocks[temp_alloc] size: 0 +mbcs_pool blocks[sl_alloc] count: 0 +mbcs_pool blocks[sl_alloc] size: 0 +mbcs_pool blocks[std_alloc] count: 0 +mbcs_pool blocks[std_alloc] size: 0 +mbcs_pool blocks[ll_alloc] count: 0 +mbcs_pool blocks[ll_alloc] size: 0 +mbcs_pool blocks[eheap_alloc] count: 0 +mbcs_pool blocks[eheap_alloc] size: 0 +mbcs_pool blocks[ets_alloc] count: 0 +mbcs_pool blocks[ets_alloc] size: 0 +mbcs_pool blocks[fix_alloc] count: 0 +mbcs_pool blocks[fix_alloc] size: 0 +mbcs_pool blocks[literal_alloc] count: 0 +mbcs_pool blocks[literal_alloc] size: 0 +mbcs_pool blocks[binary_alloc] count: 0 +mbcs_pool blocks[binary_alloc] size: 0 +mbcs_pool blocks[driver_alloc] count: 0 +mbcs_pool blocks[driver_alloc] size: 0 +mbcs_pool blocks[test_alloc] count: 0 +mbcs_pool blocks[test_alloc] size: 0 +mbcs_pool carriers: 0 +mbcs_pool carriers size: 0 +sbcs blocks[sys_alloc] count: 0 0 0 +sbcs blocks[sys_alloc] size: 0 0 0 +sbcs blocks[temp_alloc] count: 0 0 0 +sbcs blocks[temp_alloc] size: 0 0 0 +sbcs blocks[sl_alloc] count: 0 0 0 +sbcs blocks[sl_alloc] size: 0 0 0 +sbcs blocks[std_alloc] count: 0 0 0 +sbcs blocks[std_alloc] size: 0 0 0 +sbcs blocks[ll_alloc] count: 0 0 0 +sbcs blocks[ll_alloc] size: 0 0 0 +sbcs blocks[eheap_alloc] count: 0 0 0 +sbcs blocks[eheap_alloc] size: 0 0 0 +sbcs blocks[ets_alloc] count: 0 0 0 +sbcs blocks[ets_alloc] size: 0 0 0 +sbcs blocks[fix_alloc] count: 0 0 0 +sbcs blocks[fix_alloc] size: 0 0 0 +sbcs blocks[literal_alloc] count: 0 0 0 +sbcs blocks[literal_alloc] size: 0 0 0 +sbcs blocks[binary_alloc] count: 0 0 0 +sbcs blocks[binary_alloc] size: 0 0 0 +sbcs blocks[driver_alloc] count: 0 0 0 +sbcs blocks[driver_alloc] size: 0 0 0 +sbcs blocks[test_alloc] count: 0 0 0 +sbcs blocks[test_alloc] size: 0 0 0 +sbcs carriers: 0 0 0 +sbcs mseg carriers: 0 +sbcs sys_alloc carriers: 0 +sbcs carriers size: 0 0 0 +sbcs mseg carriers size: 0 +sbcs sys_alloc carriers size: 0 +binary_alloc calls: 0 +binary_free calls: 0 +binary_realloc calls: 0 +mseg_alloc calls: 0 +mseg_dealloc calls: 0 +mseg_realloc calls: 0 +sys_alloc calls: 1 +sys_free calls: 0 +sys_realloc calls: 0 +=allocator:driver_alloc[0] +versions: 0.9 3.0 +option e: true +option t: 5 +option ramv: false +option atags: true +option sbct: 524288 +option asbcst: 4145152 +option rsbcst: 20 +option rsbcmt: 80 +option rmbcmt: 50 +option mmbcs: 32768 +option mmsbc: 256 +option mmmbc: 18446744073709551615 +option lmbcs: 5242880 +option smbcs: 262144 +option mbcgs: 10 +option acul: 0 +option acful: 0 +option acnl: 0 +option acfml: 0 +option cp: undefined +option as: aoffcbf +mbcs blocks[sys_alloc] count: 0 0 0 +mbcs blocks[sys_alloc] size: 0 0 0 +mbcs blocks[temp_alloc] count: 0 0 0 +mbcs blocks[temp_alloc] size: 0 0 0 +mbcs blocks[sl_alloc] count: 0 0 0 +mbcs blocks[sl_alloc] size: 0 0 0 +mbcs blocks[std_alloc] count: 0 0 0 +mbcs blocks[std_alloc] size: 0 0 0 +mbcs blocks[ll_alloc] count: 0 0 0 +mbcs blocks[ll_alloc] size: 0 0 0 +mbcs blocks[eheap_alloc] count: 0 0 0 +mbcs blocks[eheap_alloc] size: 0 0 0 +mbcs blocks[ets_alloc] count: 0 0 0 +mbcs blocks[ets_alloc] size: 0 0 0 +mbcs blocks[fix_alloc] count: 0 0 0 +mbcs blocks[fix_alloc] size: 0 0 0 +mbcs blocks[literal_alloc] count: 0 0 0 +mbcs blocks[literal_alloc] size: 0 0 0 +mbcs blocks[binary_alloc] count: 0 0 0 +mbcs blocks[binary_alloc] size: 0 0 0 +mbcs blocks[driver_alloc] count: 30 30 30 +mbcs blocks[driver_alloc] size: 6472 6472 6472 +mbcs blocks[test_alloc] count: 0 0 0 +mbcs blocks[test_alloc] size: 0 0 0 +mbcs carriers: 1 1 1 +mbcs mseg carriers: 0 +mbcs sys_alloc carriers: 1 +mbcs carriers size: 32768 32768 32768 +mbcs mseg carriers size: 0 +mbcs sys_alloc carriers size: 32768 +sbcs blocks[sys_alloc] count: 0 0 0 +sbcs blocks[sys_alloc] size: 0 0 0 +sbcs blocks[temp_alloc] count: 0 0 0 +sbcs blocks[temp_alloc] size: 0 0 0 +sbcs blocks[sl_alloc] count: 0 0 0 +sbcs blocks[sl_alloc] size: 0 0 0 +sbcs blocks[std_alloc] count: 0 0 0 +sbcs blocks[std_alloc] size: 0 0 0 +sbcs blocks[ll_alloc] count: 0 0 0 +sbcs blocks[ll_alloc] size: 0 0 0 +sbcs blocks[eheap_alloc] count: 0 0 0 +sbcs blocks[eheap_alloc] size: 0 0 0 +sbcs blocks[ets_alloc] count: 0 0 0 +sbcs blocks[ets_alloc] size: 0 0 0 +sbcs blocks[fix_alloc] count: 0 0 0 +sbcs blocks[fix_alloc] size: 0 0 0 +sbcs blocks[literal_alloc] count: 0 0 0 +sbcs blocks[literal_alloc] size: 0 0 0 +sbcs blocks[binary_alloc] count: 0 0 0 +sbcs blocks[binary_alloc] size: 0 0 0 +sbcs blocks[driver_alloc] count: 0 0 0 +sbcs blocks[driver_alloc] size: 0 0 0 +sbcs blocks[test_alloc] count: 0 0 0 +sbcs blocks[test_alloc] size: 0 0 0 +sbcs carriers: 0 0 0 +sbcs mseg carriers: 0 +sbcs sys_alloc carriers: 0 +sbcs carriers size: 0 0 0 +sbcs mseg carriers size: 0 +sbcs sys_alloc carriers size: 0 +driver_alloc calls: 31 +driver_free calls: 1 +driver_realloc calls: 0 +mseg_alloc calls: 0 +mseg_dealloc calls: 0 +mseg_realloc calls: 0 +sys_alloc calls: 1 +sys_free calls: 0 +sys_realloc calls: 0 +=allocator:driver_alloc[1] +versions: 0.9 3.0 +option e: true +option t: 5 +option ramv: false +option atags: true +option sbct: 524288 +option asbcst: 4145152 +option rsbcst: 20 +option rsbcmt: 80 +option rmbcmt: 50 +option mmbcs: 32768 +option mmsbc: 256 +option mmmbc: 18446744073709551615 +option lmbcs: 5242880 +option smbcs: 262144 +option mbcgs: 10 +option acul: 60 +option acful: 0 +option acnl: 1000 +option acfml: 0 +option cp: R +option as: aoffcbf +mbcs blocks[sys_alloc] count: 0 0 0 +mbcs blocks[sys_alloc] size: 0 0 0 +mbcs blocks[temp_alloc] count: 0 0 0 +mbcs blocks[temp_alloc] size: 0 0 0 +mbcs blocks[sl_alloc] count: 0 0 0 +mbcs blocks[sl_alloc] size: 0 0 0 +mbcs blocks[std_alloc] count: 0 0 0 +mbcs blocks[std_alloc] size: 0 0 0 +mbcs blocks[ll_alloc] count: 0 0 0 +mbcs blocks[ll_alloc] size: 0 0 0 +mbcs blocks[eheap_alloc] count: 0 0 0 +mbcs blocks[eheap_alloc] size: 0 0 0 +mbcs blocks[ets_alloc] count: 0 0 0 +mbcs blocks[ets_alloc] size: 0 0 0 +mbcs blocks[fix_alloc] count: 0 0 0 +mbcs blocks[fix_alloc] size: 0 0 0 +mbcs blocks[literal_alloc] count: 0 0 0 +mbcs blocks[literal_alloc] size: 0 0 0 +mbcs blocks[binary_alloc] count: 0 0 0 +mbcs blocks[binary_alloc] size: 0 0 0 +mbcs blocks[driver_alloc] count: 0 0 0 +mbcs blocks[driver_alloc] size: 0 0 0 +mbcs blocks[test_alloc] count: 0 0 0 +mbcs blocks[test_alloc] size: 0 0 0 +mbcs carriers: 1 1 1 +mbcs mseg carriers: 0 +mbcs sys_alloc carriers: 1 +mbcs carriers size: 32768 32768 32768 +mbcs mseg carriers size: 0 +mbcs sys_alloc carriers size: 32768 +mbcs_pool blocks[sys_alloc] count: 0 +mbcs_pool blocks[sys_alloc] size: 0 +mbcs_pool blocks[temp_alloc] count: 0 +mbcs_pool blocks[temp_alloc] size: 0 +mbcs_pool blocks[sl_alloc] count: 0 +mbcs_pool blocks[sl_alloc] size: 0 +mbcs_pool blocks[std_alloc] count: 0 +mbcs_pool blocks[std_alloc] size: 0 +mbcs_pool blocks[ll_alloc] count: 0 +mbcs_pool blocks[ll_alloc] size: 0 +mbcs_pool blocks[eheap_alloc] count: 0 +mbcs_pool blocks[eheap_alloc] size: 0 +mbcs_pool blocks[ets_alloc] count: 0 +mbcs_pool blocks[ets_alloc] size: 0 +mbcs_pool blocks[fix_alloc] count: 0 +mbcs_pool blocks[fix_alloc] size: 0 +mbcs_pool blocks[literal_alloc] count: 0 +mbcs_pool blocks[literal_alloc] size: 0 +mbcs_pool blocks[binary_alloc] count: 0 +mbcs_pool blocks[binary_alloc] size: 0 +mbcs_pool blocks[driver_alloc] count: 0 +mbcs_pool blocks[driver_alloc] size: 0 +mbcs_pool blocks[test_alloc] count: 0 +mbcs_pool blocks[test_alloc] size: 0 +mbcs_pool carriers: 0 +mbcs_pool carriers size: 0 +sbcs blocks[sys_alloc] count: 0 0 0 +sbcs blocks[sys_alloc] size: 0 0 0 +sbcs blocks[temp_alloc] count: 0 0 0 +sbcs blocks[temp_alloc] size: 0 0 0 +sbcs blocks[sl_alloc] count: 0 0 0 +sbcs blocks[sl_alloc] size: 0 0 0 +sbcs blocks[std_alloc] count: 0 0 0 +sbcs blocks[std_alloc] size: 0 0 0 +sbcs blocks[ll_alloc] count: 0 0 0 +sbcs blocks[ll_alloc] size: 0 0 0 +sbcs blocks[eheap_alloc] count: 0 0 0 +sbcs blocks[eheap_alloc] size: 0 0 0 +sbcs blocks[ets_alloc] count: 0 0 0 +sbcs blocks[ets_alloc] size: 0 0 0 +sbcs blocks[fix_alloc] count: 0 0 0 +sbcs blocks[fix_alloc] size: 0 0 0 +sbcs blocks[literal_alloc] count: 0 0 0 +sbcs blocks[literal_alloc] size: 0 0 0 +sbcs blocks[binary_alloc] count: 0 0 0 +sbcs blocks[binary_alloc] size: 0 0 0 +sbcs blocks[driver_alloc] count: 0 0 0 +sbcs blocks[driver_alloc] size: 0 0 0 +sbcs blocks[test_alloc] count: 0 0 0 +sbcs blocks[test_alloc] size: 0 0 0 +sbcs carriers: 0 0 0 +sbcs mseg carriers: 0 +sbcs sys_alloc carriers: 0 +sbcs carriers size: 0 0 0 +sbcs mseg carriers size: 0 +sbcs sys_alloc carriers size: 0 +driver_alloc calls: 0 +driver_free calls: 0 +driver_realloc calls: 0 +mseg_alloc calls: 0 +mseg_dealloc calls: 0 +mseg_realloc calls: 0 +sys_alloc calls: 1 +sys_free calls: 0 +sys_realloc calls: 0 +=allocator:driver_alloc[2] +versions: 0.9 3.0 +option e: true +option t: 5 +option ramv: false +option atags: true +option sbct: 524288 +option asbcst: 4145152 +option rsbcst: 20 +option rsbcmt: 80 +option rmbcmt: 50 +option mmbcs: 32768 +option mmsbc: 256 +option mmmbc: 18446744073709551615 +option lmbcs: 5242880 +option smbcs: 262144 +option mbcgs: 10 +option acul: 60 +option acful: 0 +option acnl: 1000 +option acfml: 0 +option cp: R +option as: aoffcbf +mbcs blocks[sys_alloc] count: 0 0 0 +mbcs blocks[sys_alloc] size: 0 0 0 +mbcs blocks[temp_alloc] count: 0 0 0 +mbcs blocks[temp_alloc] size: 0 0 0 +mbcs blocks[sl_alloc] count: 0 0 0 +mbcs blocks[sl_alloc] size: 0 0 0 +mbcs blocks[std_alloc] count: 0 0 0 +mbcs blocks[std_alloc] size: 0 0 0 +mbcs blocks[ll_alloc] count: 0 0 0 +mbcs blocks[ll_alloc] size: 0 0 0 +mbcs blocks[eheap_alloc] count: 0 0 0 +mbcs blocks[eheap_alloc] size: 0 0 0 +mbcs blocks[ets_alloc] count: 0 0 0 +mbcs blocks[ets_alloc] size: 0 0 0 +mbcs blocks[fix_alloc] count: 0 0 0 +mbcs blocks[fix_alloc] size: 0 0 0 +mbcs blocks[literal_alloc] count: 0 0 0 +mbcs blocks[literal_alloc] size: 0 0 0 +mbcs blocks[binary_alloc] count: 0 0 0 +mbcs blocks[binary_alloc] size: 0 0 0 +mbcs blocks[driver_alloc] count: 17 19 19 +mbcs blocks[driver_alloc] size: 4504 17768 17768 +mbcs blocks[test_alloc] count: 0 0 0 +mbcs blocks[test_alloc] size: 0 0 0 +mbcs carriers: 1 1 1 +mbcs mseg carriers: 0 +mbcs sys_alloc carriers: 1 +mbcs carriers size: 32768 32768 32768 +mbcs mseg carriers size: 0 +mbcs sys_alloc carriers size: 32768 +mbcs_pool blocks[sys_alloc] count: 0 +mbcs_pool blocks[sys_alloc] size: 0 +mbcs_pool blocks[temp_alloc] count: 0 +mbcs_pool blocks[temp_alloc] size: 0 +mbcs_pool blocks[sl_alloc] count: 0 +mbcs_pool blocks[sl_alloc] size: 0 +mbcs_pool blocks[std_alloc] count: 0 +mbcs_pool blocks[std_alloc] size: 0 +mbcs_pool blocks[ll_alloc] count: 0 +mbcs_pool blocks[ll_alloc] size: 0 +mbcs_pool blocks[eheap_alloc] count: 0 +mbcs_pool blocks[eheap_alloc] size: 0 +mbcs_pool blocks[ets_alloc] count: 0 +mbcs_pool blocks[ets_alloc] size: 0 +mbcs_pool blocks[fix_alloc] count: 0 +mbcs_pool blocks[fix_alloc] size: 0 +mbcs_pool blocks[literal_alloc] count: 0 +mbcs_pool blocks[literal_alloc] size: 0 +mbcs_pool blocks[binary_alloc] count: 0 +mbcs_pool blocks[binary_alloc] size: 0 +mbcs_pool blocks[driver_alloc] count: 0 +mbcs_pool blocks[driver_alloc] size: 0 +mbcs_pool blocks[test_alloc] count: 0 +mbcs_pool blocks[test_alloc] size: 0 +mbcs_pool carriers: 0 +mbcs_pool carriers size: 0 +sbcs blocks[sys_alloc] count: 0 0 0 +sbcs blocks[sys_alloc] size: 0 0 0 +sbcs blocks[temp_alloc] count: 0 0 0 +sbcs blocks[temp_alloc] size: 0 0 0 +sbcs blocks[sl_alloc] count: 0 0 0 +sbcs blocks[sl_alloc] size: 0 0 0 +sbcs blocks[std_alloc] count: 0 0 0 +sbcs blocks[std_alloc] size: 0 0 0 +sbcs blocks[ll_alloc] count: 0 0 0 +sbcs blocks[ll_alloc] size: 0 0 0 +sbcs blocks[eheap_alloc] count: 0 0 0 +sbcs blocks[eheap_alloc] size: 0 0 0 +sbcs blocks[ets_alloc] count: 0 0 0 +sbcs blocks[ets_alloc] size: 0 0 0 +sbcs blocks[fix_alloc] count: 0 0 0 +sbcs blocks[fix_alloc] size: 0 0 0 +sbcs blocks[literal_alloc] count: 0 0 0 +sbcs blocks[literal_alloc] size: 0 0 0 +sbcs blocks[binary_alloc] count: 0 0 0 +sbcs blocks[binary_alloc] size: 0 0 0 +sbcs blocks[driver_alloc] count: 0 0 0 +sbcs blocks[driver_alloc] size: 0 0 0 +sbcs blocks[test_alloc] count: 0 0 0 +sbcs blocks[test_alloc] size: 0 0 0 +sbcs carriers: 0 0 0 +sbcs mseg carriers: 0 +sbcs sys_alloc carriers: 0 +sbcs carriers size: 0 0 0 +sbcs mseg carriers size: 0 +sbcs sys_alloc carriers size: 0 +driver_alloc calls: 28 +driver_free calls: 11 +driver_realloc calls: 0 +mseg_alloc calls: 0 +mseg_dealloc calls: 0 +mseg_realloc calls: 0 +sys_alloc calls: 1 +sys_free calls: 0 +sys_realloc calls: 0 +=allocator:driver_alloc[3] +versions: 0.9 3.0 +option e: true +option t: 5 +option ramv: false +option atags: true +option sbct: 524288 +option asbcst: 4145152 +option rsbcst: 20 +option rsbcmt: 80 +option rmbcmt: 50 +option mmbcs: 32768 +option mmsbc: 256 +option mmmbc: 18446744073709551615 +option lmbcs: 5242880 +option smbcs: 262144 +option mbcgs: 10 +option acul: 60 +option acful: 0 +option acnl: 1000 +option acfml: 0 +option cp: R +option as: aoffcbf +mbcs blocks[sys_alloc] count: 0 0 0 +mbcs blocks[sys_alloc] size: 0 0 0 +mbcs blocks[temp_alloc] count: 0 0 0 +mbcs blocks[temp_alloc] size: 0 0 0 +mbcs blocks[sl_alloc] count: 0 0 0 +mbcs blocks[sl_alloc] size: 0 0 0 +mbcs blocks[std_alloc] count: 0 0 0 +mbcs blocks[std_alloc] size: 0 0 0 +mbcs blocks[ll_alloc] count: 0 0 0 +mbcs blocks[ll_alloc] size: 0 0 0 +mbcs blocks[eheap_alloc] count: 0 0 0 +mbcs blocks[eheap_alloc] size: 0 0 0 +mbcs blocks[ets_alloc] count: 0 0 0 +mbcs blocks[ets_alloc] size: 0 0 0 +mbcs blocks[fix_alloc] count: 0 0 0 +mbcs blocks[fix_alloc] size: 0 0 0 +mbcs blocks[literal_alloc] count: 0 0 0 +mbcs blocks[literal_alloc] size: 0 0 0 +mbcs blocks[binary_alloc] count: 0 0 0 +mbcs blocks[binary_alloc] size: 0 0 0 +mbcs blocks[driver_alloc] count: 0 0 0 +mbcs blocks[driver_alloc] size: 0 0 0 +mbcs blocks[test_alloc] count: 0 0 0 +mbcs blocks[test_alloc] size: 0 0 0 +mbcs carriers: 1 1 1 +mbcs mseg carriers: 0 +mbcs sys_alloc carriers: 1 +mbcs carriers size: 32768 32768 32768 +mbcs mseg carriers size: 0 +mbcs sys_alloc carriers size: 32768 +mbcs_pool blocks[sys_alloc] count: 0 +mbcs_pool blocks[sys_alloc] size: 0 +mbcs_pool blocks[temp_alloc] count: 0 +mbcs_pool blocks[temp_alloc] size: 0 +mbcs_pool blocks[sl_alloc] count: 0 +mbcs_pool blocks[sl_alloc] size: 0 +mbcs_pool blocks[std_alloc] count: 0 +mbcs_pool blocks[std_alloc] size: 0 +mbcs_pool blocks[ll_alloc] count: 0 +mbcs_pool blocks[ll_alloc] size: 0 +mbcs_pool blocks[eheap_alloc] count: 0 +mbcs_pool blocks[eheap_alloc] size: 0 +mbcs_pool blocks[ets_alloc] count: 0 +mbcs_pool blocks[ets_alloc] size: 0 +mbcs_pool blocks[fix_alloc] count: 0 +mbcs_pool blocks[fix_alloc] size: 0 +mbcs_pool blocks[literal_alloc] count: 0 +mbcs_pool blocks[literal_alloc] size: 0 +mbcs_pool blocks[binary_alloc] count: 0 +mbcs_pool blocks[binary_alloc] size: 0 +mbcs_pool blocks[driver_alloc] count: 0 +mbcs_pool blocks[driver_alloc] size: 0 +mbcs_pool blocks[test_alloc] count: 0 +mbcs_pool blocks[test_alloc] size: 0 +mbcs_pool carriers: 0 +mbcs_pool carriers size: 0 +sbcs blocks[sys_alloc] count: 0 0 0 +sbcs blocks[sys_alloc] size: 0 0 0 +sbcs blocks[temp_alloc] count: 0 0 0 +sbcs blocks[temp_alloc] size: 0 0 0 +sbcs blocks[sl_alloc] count: 0 0 0 +sbcs blocks[sl_alloc] size: 0 0 0 +sbcs blocks[std_alloc] count: 0 0 0 +sbcs blocks[std_alloc] size: 0 0 0 +sbcs blocks[ll_alloc] count: 0 0 0 +sbcs blocks[ll_alloc] size: 0 0 0 +sbcs blocks[eheap_alloc] count: 0 0 0 +sbcs blocks[eheap_alloc] size: 0 0 0 +sbcs blocks[ets_alloc] count: 0 0 0 +sbcs blocks[ets_alloc] size: 0 0 0 +sbcs blocks[fix_alloc] count: 0 0 0 +sbcs blocks[fix_alloc] size: 0 0 0 +sbcs blocks[literal_alloc] count: 0 0 0 +sbcs blocks[literal_alloc] size: 0 0 0 +sbcs blocks[binary_alloc] count: 0 0 0 +sbcs blocks[binary_alloc] size: 0 0 0 +sbcs blocks[driver_alloc] count: 0 0 0 +sbcs blocks[driver_alloc] size: 0 0 0 +sbcs blocks[test_alloc] count: 0 0 0 +sbcs blocks[test_alloc] size: 0 0 0 +sbcs carriers: 0 0 0 +sbcs mseg carriers: 0 +sbcs sys_alloc carriers: 0 +sbcs carriers size: 0 0 0 +sbcs mseg carriers size: 0 +sbcs sys_alloc carriers size: 0 +driver_alloc calls: 0 +driver_free calls: 0 +driver_realloc calls: 0 +mseg_alloc calls: 0 +mseg_dealloc calls: 0 +mseg_realloc calls: 0 +sys_alloc calls: 1 +sys_free calls: 0 +sys_realloc calls: 0 +=allocator:driver_alloc[4] +versions: 0.9 3.0 +option e: true +option t: 5 +option ramv: false +option atags: true +option sbct: 524288 +option asbcst: 4145152 +option rsbcst: 20 +option rsbcmt: 80 +option rmbcmt: 50 +option mmbcs: 32768 +option mmsbc: 256 +option mmmbc: 18446744073709551615 +option lmbcs: 5242880 +option smbcs: 262144 +option mbcgs: 10 +option acul: 60 +option acful: 0 +option acnl: 1000 +option acfml: 0 +option cp: R +option as: aoffcbf +mbcs blocks[sys_alloc] count: 0 0 0 +mbcs blocks[sys_alloc] size: 0 0 0 +mbcs blocks[temp_alloc] count: 0 0 0 +mbcs blocks[temp_alloc] size: 0 0 0 +mbcs blocks[sl_alloc] count: 0 0 0 +mbcs blocks[sl_alloc] size: 0 0 0 +mbcs blocks[std_alloc] count: 0 0 0 +mbcs blocks[std_alloc] size: 0 0 0 +mbcs blocks[ll_alloc] count: 0 0 0 +mbcs blocks[ll_alloc] size: 0 0 0 +mbcs blocks[eheap_alloc] count: 0 0 0 +mbcs blocks[eheap_alloc] size: 0 0 0 +mbcs blocks[ets_alloc] count: 0 0 0 +mbcs blocks[ets_alloc] size: 0 0 0 +mbcs blocks[fix_alloc] count: 0 0 0 +mbcs blocks[fix_alloc] size: 0 0 0 +mbcs blocks[literal_alloc] count: 0 0 0 +mbcs blocks[literal_alloc] size: 0 0 0 +mbcs blocks[binary_alloc] count: 0 0 0 +mbcs blocks[binary_alloc] size: 0 0 0 +mbcs blocks[driver_alloc] count: 0 0 0 +mbcs blocks[driver_alloc] size: 0 0 0 +mbcs blocks[test_alloc] count: 0 0 0 +mbcs blocks[test_alloc] size: 0 0 0 +mbcs carriers: 1 1 1 +mbcs mseg carriers: 0 +mbcs sys_alloc carriers: 1 +mbcs carriers size: 32768 32768 32768 +mbcs mseg carriers size: 0 +mbcs sys_alloc carriers size: 32768 +mbcs_pool blocks[sys_alloc] count: 0 +mbcs_pool blocks[sys_alloc] size: 0 +mbcs_pool blocks[temp_alloc] count: 0 +mbcs_pool blocks[temp_alloc] size: 0 +mbcs_pool blocks[sl_alloc] count: 0 +mbcs_pool blocks[sl_alloc] size: 0 +mbcs_pool blocks[std_alloc] count: 0 +mbcs_pool blocks[std_alloc] size: 0 +mbcs_pool blocks[ll_alloc] count: 0 +mbcs_pool blocks[ll_alloc] size: 0 +mbcs_pool blocks[eheap_alloc] count: 0 +mbcs_pool blocks[eheap_alloc] size: 0 +mbcs_pool blocks[ets_alloc] count: 0 +mbcs_pool blocks[ets_alloc] size: 0 +mbcs_pool blocks[fix_alloc] count: 0 +mbcs_pool blocks[fix_alloc] size: 0 +mbcs_pool blocks[literal_alloc] count: 0 +mbcs_pool blocks[literal_alloc] size: 0 +mbcs_pool blocks[binary_alloc] count: 0 +mbcs_pool blocks[binary_alloc] size: 0 +mbcs_pool blocks[driver_alloc] count: 0 +mbcs_pool blocks[driver_alloc] size: 0 +mbcs_pool blocks[test_alloc] count: 0 +mbcs_pool blocks[test_alloc] size: 0 +mbcs_pool carriers: 0 +mbcs_pool carriers size: 0 +sbcs blocks[sys_alloc] count: 0 0 0 +sbcs blocks[sys_alloc] size: 0 0 0 +sbcs blocks[temp_alloc] count: 0 0 0 +sbcs blocks[temp_alloc] size: 0 0 0 +sbcs blocks[sl_alloc] count: 0 0 0 +sbcs blocks[sl_alloc] size: 0 0 0 +sbcs blocks[std_alloc] count: 0 0 0 +sbcs blocks[std_alloc] size: 0 0 0 +sbcs blocks[ll_alloc] count: 0 0 0 +sbcs blocks[ll_alloc] size: 0 0 0 +sbcs blocks[eheap_alloc] count: 0 0 0 +sbcs blocks[eheap_alloc] size: 0 0 0 +sbcs blocks[ets_alloc] count: 0 0 0 +sbcs blocks[ets_alloc] size: 0 0 0 +sbcs blocks[fix_alloc] count: 0 0 0 +sbcs blocks[fix_alloc] size: 0 0 0 +sbcs blocks[literal_alloc] count: 0 0 0 +sbcs blocks[literal_alloc] size: 0 0 0 +sbcs blocks[binary_alloc] count: 0 0 0 +sbcs blocks[binary_alloc] size: 0 0 0 +sbcs blocks[driver_alloc] count: 0 0 0 +sbcs blocks[driver_alloc] size: 0 0 0 +sbcs blocks[test_alloc] count: 0 0 0 +sbcs blocks[test_alloc] size: 0 0 0 +sbcs carriers: 0 0 0 +sbcs mseg carriers: 0 +sbcs sys_alloc carriers: 0 +sbcs carriers size: 0 0 0 +sbcs mseg carriers size: 0 +sbcs sys_alloc carriers size: 0 +driver_alloc calls: 0 +driver_free calls: 0 +driver_realloc calls: 0 +mseg_alloc calls: 0 +mseg_dealloc calls: 0 +mseg_realloc calls: 0 +sys_alloc calls: 1 +sys_free calls: 0 +sys_realloc calls: 0 +=allocator:test_alloc +option e: false +=allocator:mseg_alloc[0] +version: 0.9 +option amcbf: 4194304 +option rmcbf: 20 +option mcs: 10 +memory kind: all memory +cached_segments: 3 +cache_hits: 9 +segments: 5 8 8 +segments_watermark: 8 +segments_size: 68681728 71651328 71651328 +mseg_alloc calls: 17 +mseg_dealloc calls: 12 +mseg_realloc calls: 0 +mseg_create calls: 8 +mseg_create_resize calls: 0 +mseg_destroy calls: 0 +mseg_recreate calls: 0 +mseg_clear_cache calls: 0 +mseg_check_cache calls: 0 +=allocator:mseg_alloc[1] +version: 0.9 +option amcbf: 4194304 +option rmcbf: 20 +option mcs: 10 +memory kind: all memory +cached_segments: 2 +cache_hits: 0 +segments: 0 2 2 +segments_watermark: 2 +segments_size: 0 1310720 1310720 +mseg_alloc calls: 2 +mseg_dealloc calls: 2 +mseg_realloc calls: 0 +mseg_create calls: 2 +mseg_create_resize calls: 0 +mseg_destroy calls: 0 +mseg_recreate calls: 0 +mseg_clear_cache calls: 0 +mseg_check_cache calls: 0 +=allocator:mseg_alloc[2] +version: 0.9 +option amcbf: 4194304 +option rmcbf: 20 +option mcs: 10 +memory kind: all memory +cached_segments: 1 +cache_hits: 19 +segments: 7 8 8 +segments_watermark: 8 +segments_size: 3407872 3670016 3670016 +mseg_alloc calls: 27 +mseg_dealloc calls: 20 +mseg_realloc calls: 0 +mseg_create calls: 8 +mseg_create_resize calls: 0 +mseg_destroy calls: 0 +mseg_recreate calls: 0 +mseg_clear_cache calls: 0 +mseg_check_cache calls: 0 +=allocator:mseg_alloc[3] +version: 0.9 +option amcbf: 4194304 +option rmcbf: 20 +option mcs: 10 +memory kind: all memory +cached_segments: 0 +cache_hits: 0 +segments: 0 0 0 +segments_watermark: 0 +segments_size: 0 0 0 +mseg_alloc calls: 0 +mseg_dealloc calls: 0 +mseg_realloc calls: 0 +mseg_create calls: 0 +mseg_create_resize calls: 0 +mseg_destroy calls: 0 +mseg_recreate calls: 0 +mseg_clear_cache calls: 0 +mseg_check_cache calls: 0 +=allocator:mseg_alloc[4] +version: 0.9 +option amcbf: 4194304 +option rmcbf: 20 +option mcs: 10 +memory kind: all memory +cached_segments: 0 +cache_hits: 0 +segments: 0 0 0 +segments_watermark: 0 +segments_size: 0 0 0 +mseg_alloc calls: 0 +mseg_dealloc calls: 0 +mseg_realloc calls: 0 +mseg_create calls: 0 +mseg_create_resize calls: 0 +mseg_destroy calls: 0 +mseg_recreate calls: 0 +mseg_clear_cache calls: 0 +mseg_check_cache calls: 0 +=allocator:erts_mmap.default_mmap +option scs: 0 +os mmap size used: 76632064 +=allocator:erts_mmap.literal_mmap +option scs: 1073676288 +option sco: true +option scrpm: false +option scrfsd: 1024 +supercarrier total size: 1073741824 +supercarrier total sa size: 1048576 +supercarrier total sua size: 0 +supercarrier used size: 1114112 +supercarrier used sa size: 1048576 +supercarrier used sua size: 0 +supercarrier used free segs: 0 +supercarrier max free segs: 0 +supercarrier allocated free segs: 0 +supercarrier reserved free segs: 1024 +supercarrier sa free segs: 0 +supercarrier sua free segs: 0 +=allocator:alloc_util +option mmc: 18446744073709551615 +option ycs: 1048576 +option sac: true +=allocator:instr +=proc:<0.0.0> +State: Running +Name: init +Spawned as: erl_init:start/2 +Spawned by: [] +Message queue length: 0 +Number of heap fragments: 0 +Heap fragment data: 28 +Link list: [<0.11.0>, <0.45.0>, <0.43.0>] +Reductions: 5386 +Stack+heap: 1598 +OldHeap: 2586 +Heap unused: 620 +OldHeap unused: 2249 +BinVHeap: 0 +OldBinVHeap: 22 +BinVHeap unused: 46422 +OldBinVHeap unused: 46400 +Memory: 34600 +Program counter: 0x0000772b50c085b4 (init:boot_loop/2 + 92) +Internal State: ACT_PRIO_NORMAL | USR_PRIO_NORMAL | PRQ_PRIO_NORMAL | ACTIVE | RUNNING | ACTIVE_SYS +=proc:<0.1.0> +State: Waiting +Name: erts_code_purger +Spawned as: erts_code_purger:start/0 +Spawned by: <0.0.0> +Message queue length: 0 +Number of heap fragments: 0 +Heap fragment data: 11 +Reductions: 23 +Stack+heap: 233 +OldHeap: 0 +Heap unused: 228 +OldHeap unused: 0 +BinVHeap: 0 +OldBinVHeap: 0 +BinVHeap unused: 46422 +OldBinVHeap unused: 46422 +Memory: 2712 +Program counter: 0x0000772b50c017d4 (erts_code_purger:wait_for_request/0 + 68) +arity = 0 +Internal State: ACT_PRIO_HIGH | USR_PRIO_HIGH | PRQ_PRIO_HIGH | OFF_HEAP_MSGQ +=proc:<0.2.0> +State: Waiting +Spawned as: erts_literal_area_collector:start/0 +Spawned by: <0.0.0> +Message queue length: 0 +Number of heap fragments: 0 +Heap fragment data: 0 +Reductions: 7 +Stack+heap: 233 +OldHeap: 0 +Heap unused: 233 +OldHeap unused: 0 +BinVHeap: 0 +OldBinVHeap: 0 +BinVHeap unused: 46422 +OldBinVHeap unused: 46422 +Memory: 2624 +Program counter: 0x0000772b50c8fe9c (erts_literal_area_collector:msg_loop/4 + 164) +arity = 0 +Internal State: ACT_PRIO_HIGH | USR_PRIO_HIGH | PRQ_PRIO_HIGH | OFF_HEAP_MSGQ +=proc:<0.3.0> +State: Waiting +Spawned as: erts_dirty_process_signal_handler:start/0 +Spawned by: <0.0.0> +Message queue length: 0 +Number of heap fragments: 0 +Heap fragment data: 0 +Reductions: 202 +Stack+heap: 233 +OldHeap: 0 +Heap unused: 233 +OldHeap unused: 0 +BinVHeap: 0 +OldBinVHeap: 0 +BinVHeap unused: 46422 +OldBinVHeap unused: 46422 +Memory: 2624 +Program counter: 0x0000772b50c920f8 (erts_dirty_process_signal_handler:msg_loop/0 + 80) +arity = 0 +Internal State: ACT_PRIO_NORMAL | USR_PRIO_NORMAL | PRQ_PRIO_NORMAL | OFF_HEAP_MSGQ +=proc:<0.4.0> +State: Waiting +Spawned as: erts_dirty_process_signal_handler:start/0 +Spawned by: <0.0.0> +Message queue length: 0 +Number of heap fragments: 0 +Heap fragment data: 0 +Reductions: 7 +Stack+heap: 233 +OldHeap: 0 +Heap unused: 233 +OldHeap unused: 0 +BinVHeap: 0 +OldBinVHeap: 0 +BinVHeap unused: 46422 +OldBinVHeap unused: 46422 +Memory: 2624 +Program counter: 0x0000772b50c920f8 (erts_dirty_process_signal_handler:msg_loop/0 + 80) +arity = 0 +Internal State: ACT_PRIO_HIGH | USR_PRIO_HIGH | PRQ_PRIO_HIGH | OFF_HEAP_MSGQ +=proc:<0.5.0> +State: Waiting +Spawned as: erts_dirty_process_signal_handler:start/0 +Spawned by: <0.0.0> +Message queue length: 0 +Number of heap fragments: 0 +Heap fragment data: 0 +Reductions: 7 +Stack+heap: 233 +OldHeap: 0 +Heap unused: 233 +OldHeap unused: 0 +BinVHeap: 0 +OldBinVHeap: 0 +BinVHeap unused: 46422 +OldBinVHeap unused: 46422 +Memory: 2624 +Program counter: 0x0000772b50c920f8 (erts_dirty_process_signal_handler:msg_loop/0 + 80) +arity = 0 +Internal State: ACT_PRIO_MAX | USR_PRIO_MAX | PRQ_PRIO_MAX | OFF_HEAP_MSGQ +=proc:<0.6.0> +State: Waiting +Spawned as: erts_trace_cleaner:start/0 +Spawned by: <0.0.0> +Message queue length: 0 +Number of heap fragments: 0 +Heap fragment data: 0 +Reductions: 7 +Stack+heap: 233 +OldHeap: 0 +Heap unused: 233 +OldHeap unused: 0 +BinVHeap: 0 +OldBinVHeap: 0 +BinVHeap unused: 46422 +OldBinVHeap unused: 46422 +Memory: 2624 +Program counter: 0x0000772b50c914e4 (erts_trace_cleaner:loop/4 + 276) +arity = 0 +Internal State: ACT_PRIO_NORMAL | USR_PRIO_NORMAL | PRQ_PRIO_NORMAL | OFF_HEAP_MSGQ +=proc:<0.7.0> +State: Waiting +Spawned as: prim_file:start/0 +Spawned by: <0.0.0> +Message queue length: 0 +Number of heap fragments: 0 +Heap fragment data: 0 +Reductions: 6 +Stack+heap: 233 +OldHeap: 0 +Heap unused: 233 +OldHeap unused: 0 +BinVHeap: 0 +OldBinVHeap: 0 +BinVHeap unused: 46422 +OldBinVHeap unused: 46422 +Memory: 2624 +Program counter: 0x0000772b50c355b4 (prim_file:helper_loop/0 + 68) +arity = 0 +Internal State: ACT_PRIO_NORMAL | USR_PRIO_NORMAL | PRQ_PRIO_NORMAL +=proc:<0.8.0> +State: Waiting +Name: socket_registry +Spawned as: socket_registry:start/0 +Spawned by: <0.0.0> +Message queue length: 0 +Number of heap fragments: 0 +Heap fragment data: 0 +Reductions: 8 +Stack+heap: 233 +OldHeap: 0 +Heap unused: 233 +OldHeap unused: 0 +BinVHeap: 0 +OldBinVHeap: 0 +BinVHeap unused: 46422 +OldBinVHeap unused: 46422 +Memory: 2624 +Program counter: 0x0000772b50c4360c (socket_registry:loop/1 + 92) +arity = 0 +Internal State: ACT_PRIO_NORMAL | USR_PRIO_NORMAL | PRQ_PRIO_NORMAL +=proc:<0.11.0> +State: Waiting +Name: erl_prim_loader +Spawned as: erlang:apply/2 +Spawned by: <0.10.0> +Message queue length: 0 +Number of heap fragments: 0 +Heap fragment data: 0 +Link list: [<0.0.0>] +Reductions: 9578 +Stack+heap: 1598 +OldHeap: 1598 +Heap unused: 1137 +OldHeap unused: 813 +BinVHeap: 21 +OldBinVHeap: 0 +BinVHeap unused: 46401 +OldBinVHeap unused: 46422 +Memory: 26472 +Program counter: 0x0000772b50c5fe6c (erl_prim_loader:loop/3 + 116) +arity = 0 +Internal State: ACT_PRIO_NORMAL | USR_PRIO_NORMAL | PRQ_PRIO_NORMAL +=proc:<0.43.0> +State: Waiting +Name: logger +Spawned as: proc_lib:init_p/5 +Spawned by: <0.10.0> +Message queue length: 0 +Number of heap fragments: 0 +Heap fragment data: 0 +Link list: [<0.0.0>] +Reductions: 663 +Stack+heap: 987 +OldHeap: 376 +Heap unused: 574 +OldHeap unused: 342 +BinVHeap: 88 +OldBinVHeap: 4 +BinVHeap unused: 46334 +OldBinVHeap unused: 46418 +Memory: 11896 +Program counter: 0x0000772b50d207d8 (gen_server:loop/7 + 544) +arity = 0 +Internal State: ACT_PRIO_NORMAL | USR_PRIO_NORMAL | PRQ_PRIO_NORMAL +=proc:<0.45.0> +State: Waiting +Name: application_controller +Spawned as: erlang:apply/2 +Spawned by: <0.10.0> +Message queue length: 0 +Number of heap fragments: 0 +Heap fragment data: 0 +Link list: [<0.46.0>, <0.0.0>] +Reductions: 805 +Stack+heap: 2586 +OldHeap: 4185 +Heap unused: 1272 +OldHeap unused: 4177 +BinVHeap: 20 +OldBinVHeap: 0 +BinVHeap unused: 46402 +OldBinVHeap unused: 46422 +Memory: 55208 +Program counter: 0x0000772b50d207d8 (gen_server:loop/7 + 544) +arity = 0 +Internal State: ACT_PRIO_NORMAL | USR_PRIO_NORMAL | PRQ_PRIO_NORMAL +=proc:<0.46.0> +State: Waiting +Spawned as: proc_lib:init_p/5 +Spawned by: <0.45.0> +Message queue length: 0 +Number of heap fragments: 0 +Heap fragment data: 0 +Link list: [<0.47.0>, <0.45.0>] +Reductions: 43 +Stack+heap: 376 +OldHeap: 0 +Heap unused: 13 +OldHeap unused: 0 +BinVHeap: 0 +OldBinVHeap: 0 +BinVHeap unused: 46422 +OldBinVHeap unused: 46422 +Memory: 3952 +Program counter: 0x0000772b50c97414 (application_master:main_loop/2 + 84) +arity = 0 +Internal State: ACT_PRIO_NORMAL | USR_PRIO_NORMAL | PRQ_PRIO_NORMAL +=proc:<0.47.0> +State: Waiting +Spawned as: application_master:start_it/4 +Spawned by: <0.46.0> +Message queue length: 0 +Number of heap fragments: 0 +Heap fragment data: 0 +Link list: [<0.49.0>, <0.46.0>] +Reductions: 892 +Stack+heap: 233 +OldHeap: 0 +Heap unused: 124 +OldHeap unused: 0 +BinVHeap: 0 +OldBinVHeap: 0 +BinVHeap unused: 46422 +OldBinVHeap unused: 46422 +Memory: 2816 +Program counter: 0x0000772b50c9943c (application_master:loop_it/4 + 108) +arity = 0 +Internal State: ACT_PRIO_NORMAL | USR_PRIO_NORMAL | PRQ_PRIO_NORMAL +=proc:<0.49.0> +State: Waiting +Name: kernel_sup +Spawned as: proc_lib:init_p/5 +Spawned by: <0.47.0> +Message queue length: 0 +Number of heap fragments: 0 +Heap fragment data: 4 +Link list: [<0.47.0>, <0.51.0>, <0.50.0>, <0.55.0>, <0.59.0>, <0.57.0>, <0.64.0>, <0.71.0>, <0.76.0>, <0.75.0>, <0.74.0>, <0.65.0>, <0.62.0>, <0.53.0>] +Reductions: 5136 +Stack+heap: 1598 +OldHeap: 2586 +Heap unused: 1349 +OldHeap unused: 2214 +BinVHeap: 0 +OldBinVHeap: 0 +BinVHeap unused: 46422 +OldBinVHeap unused: 46422 +Memory: 35120 +Program counter: 0x0000772b50d207d8 (gen_server:loop/7 + 544) +arity = 0 +Internal State: ACT_PRIO_NORMAL | USR_PRIO_NORMAL | PRQ_PRIO_NORMAL +=proc:<0.50.0> +State: Suspended +Name: code_server +Spawned as: erlang:apply/2 +Current call: erlang:bif_return_trap/2 +Spawned by: <0.49.0> +Message queue length: 0 +Number of heap fragments: 0 +Heap fragment data: 0 +Link list: [<0.49.0>, {from,<0.73.0>,#Ref<0.3919585461.1111490562.235360>}] +Reductions: 120555 +Stack+heap: 6772 +OldHeap: 17731 +Heap unused: 3833 +OldHeap unused: 2471 +BinVHeap: 3237 +OldBinVHeap: 8 +BinVHeap unused: 43185 +OldBinVHeap unused: 46414 +Memory: 197008 +Program counter: 0x0000772b50bff268 (unknown function) +arity = 2 +Internal State: ACT_PRIO_NORMAL | USR_PRIO_NORMAL | PRQ_PRIO_NORMAL | ACTIVE | SUSPENDED +=proc:<0.51.0> +State: Waiting +Name: standard_error_sup +Spawned as: proc_lib:init_p/5 +Spawned by: <0.49.0> +Message queue length: 0 +Number of heap fragments: 0 +Heap fragment data: 0 +Link list: [<0.52.0>, <0.49.0>] +Reductions: 57 +Stack+heap: 233 +OldHeap: 0 +Heap unused: 145 +OldHeap unused: 0 +BinVHeap: 20 +OldBinVHeap: 0 +BinVHeap unused: 46402 +OldBinVHeap unused: 46422 +Memory: 2808 +Program counter: 0x0000772b50d207d8 (gen_server:loop/7 + 544) +arity = 0 +Internal State: ACT_PRIO_NORMAL | USR_PRIO_NORMAL | PRQ_PRIO_NORMAL +=proc:<0.52.0> +State: Waiting +Name: standard_error +Spawned as: erlang:apply/2 +Spawned by: <0.51.0> +Message queue length: 0 +Number of heap fragments: 0 +Heap fragment data: 0 +Link list: [#Port<0.1>, <0.51.0>] +Reductions: 252 +Stack+heap: 376 +OldHeap: 0 +Heap unused: 41 +OldHeap unused: 0 +BinVHeap: 7239 +OldBinVHeap: 0 +BinVHeap unused: 39183 +OldBinVHeap unused: 46422 +Memory: 4048 +Program counter: 0x0000772b50e9b1bc (standard_error:server_loop/1 + 92) +arity = 0 +Internal State: ACT_PRIO_NORMAL | USR_PRIO_NORMAL | PRQ_PRIO_NORMAL +=proc:<0.53.0> +State: Waiting +Name: file_server_2 +Spawned as: proc_lib:init_p/5 +Spawned by: <0.49.0> +Message queue length: 0 +Number of heap fragments: 0 +Heap fragment data: 4 +Link list: [<0.49.0>] +Reductions: 142 +Stack+heap: 376 +OldHeap: 0 +Heap unused: 211 +OldHeap unused: 0 +BinVHeap: 0 +OldBinVHeap: 0 +BinVHeap unused: 46422 +OldBinVHeap unused: 46422 +Memory: 3936 +Program counter: 0x0000772b50d207d8 (gen_server:loop/7 + 544) +arity = 0 +Internal State: ACT_PRIO_NORMAL | USR_PRIO_NORMAL | PRQ_PRIO_NORMAL +=proc:<0.55.0> +State: Waiting +Name: inet_db +Spawned as: proc_lib:init_p/5 +Spawned by: <0.49.0> +Message queue length: 0 +Number of heap fragments: 0 +Heap fragment data: 0 +Link list: [<0.49.0>] +Reductions: 561 +Stack+heap: 376 +OldHeap: 610 +Heap unused: 307 +OldHeap unused: 577 +BinVHeap: 0 +OldBinVHeap: 0 +BinVHeap unused: 46422 +OldBinVHeap unused: 46422 +Memory: 8880 +Program counter: 0x0000772b50d207d8 (gen_server:loop/7 + 544) +arity = 0 +Internal State: ACT_PRIO_NORMAL | USR_PRIO_NORMAL | PRQ_PRIO_NORMAL +=proc:<0.57.0> +State: Waiting +Name: rex +Spawned as: proc_lib:init_p/5 +Spawned by: <0.49.0> +Message queue length: 0 +Number of heap fragments: 0 +Heap fragment data: 0 +Link list: [<0.49.0>, {to,<0.58.0>,#Ref<0.3919585461.1111490562.235159>}] +Reductions: 41 +Stack+heap: 233 +OldHeap: 0 +Heap unused: 164 +OldHeap unused: 0 +BinVHeap: 0 +OldBinVHeap: 0 +BinVHeap unused: 46422 +OldBinVHeap unused: 46422 +Memory: 2832 +Program counter: 0x0000772b50d207d8 (gen_server:loop/7 + 544) +arity = 0 +Internal State: ACT_PRIO_NORMAL | USR_PRIO_NORMAL | PRQ_PRIO_NORMAL | OFF_HEAP_MSGQ +=proc:<0.58.0> +State: Waiting +Spawned as: erlang:apply/2 +Spawned by: <0.57.0> +Message queue length: 0 +Number of heap fragments: 0 +Heap fragment data: 0 +Link list: [{from,<0.57.0>,#Ref<0.3919585461.1111490562.235159>}] +Reductions: 182 +Stack+heap: 376 +OldHeap: 0 +Heap unused: 87 +OldHeap unused: 0 +BinVHeap: 13874 +OldBinVHeap: 0 +BinVHeap unused: 32548 +OldBinVHeap unused: 46422 +Memory: 4004 +Program counter: 0x0000772b50ee7030 (rpc:nodes_observer_loop/1 + 96) +arity = 0 +Internal State: ACT_PRIO_HIGH | USR_PRIO_HIGH | PRQ_PRIO_HIGH +=proc:<0.59.0> +State: Waiting +Name: global_name_server +Spawned as: proc_lib:init_p/5 +Spawned by: <0.49.0> +Message queue length: 0 +Number of heap fragments: 1 +Heap fragment data: 32 +Link list: [<0.49.0>, <0.61.0>, <0.60.0>] +Reductions: 459 +Stack+heap: 610 +OldHeap: 610 +Heap unused: 275 +OldHeap unused: 564 +BinVHeap: 5539 +OldBinVHeap: 0 +BinVHeap unused: 40883 +OldBinVHeap unused: 46422 +Memory: 11172 +Program counter: 0x0000772b50d207d8 (gen_server:loop/7 + 544) +arity = 0 +Internal State: ACT_PRIO_NORMAL | USR_PRIO_NORMAL | PRQ_PRIO_NORMAL +=proc:<0.60.0> +State: Waiting +Spawned as: erlang:apply/2 +Spawned by: <0.59.0> +Message queue length: 0 +Number of heap fragments: 0 +Heap fragment data: 0 +Link list: [<0.59.0>] +Reductions: 39 +Stack+heap: 233 +OldHeap: 0 +Heap unused: 173 +OldHeap unused: 0 +BinVHeap: 0 +OldBinVHeap: 0 +BinVHeap unused: 46422 +OldBinVHeap unused: 46422 +Memory: 2672 +Program counter: 0x0000772b50f12810 (global:loop_the_locker/1 + 512) +arity = 0 +Internal State: ACT_PRIO_NORMAL | USR_PRIO_NORMAL | PRQ_PRIO_NORMAL +=proc:<0.61.0> +State: Waiting +Spawned as: erlang:apply/2 +Spawned by: <0.59.0> +Message queue length: 0 +Number of heap fragments: 0 +Heap fragment data: 0 +Link list: [<0.59.0>] +Reductions: 7 +Stack+heap: 233 +OldHeap: 0 +Heap unused: 231 +OldHeap unused: 0 +BinVHeap: 0 +OldBinVHeap: 0 +BinVHeap unused: 46422 +OldBinVHeap unused: 46422 +Memory: 2672 +Program counter: 0x0000772b50f1a858 (global:loop_the_registrar/0 + 80) +arity = 0 +Internal State: ACT_PRIO_NORMAL | USR_PRIO_NORMAL | PRQ_PRIO_NORMAL +=proc:<0.62.0> +State: Waiting +Name: global_group +Spawned as: proc_lib:init_p/5 +Spawned by: <0.49.0> +Message queue length: 0 +Number of heap fragments: 0 +Heap fragment data: 0 +Link list: [<0.63.0>, <0.49.0>] +Reductions: 219 +Stack+heap: 376 +OldHeap: 0 +Heap unused: 48 +OldHeap unused: 0 +BinVHeap: 8627 +OldBinVHeap: 0 +BinVHeap unused: 37795 +OldBinVHeap unused: 46422 +Memory: 4116 +Program counter: 0x0000772b50d207d8 (gen_server:loop/7 + 544) +arity = 0 +Internal State: ACT_PRIO_MAX | USR_PRIO_MAX | PRQ_PRIO_MAX +=proc:<0.63.0> +State: Waiting +Name: global_group_check +Spawned as: erlang:apply/2 +Spawned by: <0.62.0> +Message queue length: 0 +Number of heap fragments: 0 +Heap fragment data: 0 +Link list: [<0.62.0>] +Reductions: 6 +Stack+heap: 233 +OldHeap: 0 +Heap unused: 231 +OldHeap unused: 0 +BinVHeap: 0 +OldBinVHeap: 0 +BinVHeap unused: 46422 +OldBinVHeap unused: 46422 +Memory: 2672 +Program counter: 0x0000772b50f43844 (global_group:global_group_check_dispatcher/0 + 68) +arity = 0 +Internal State: ACT_PRIO_NORMAL | USR_PRIO_NORMAL | PRQ_PRIO_NORMAL +=proc:<0.64.0> +State: Waiting +Name: erl_signal_server +Spawned as: proc_lib:init_p/5 +Spawned by: <0.49.0> +Message queue length: 0 +Number of heap fragments: 0 +Heap fragment data: 0 +Link list: [<0.49.0>] +Reductions: 48 +Stack+heap: 233 +OldHeap: 0 +Heap unused: 163 +OldHeap unused: 0 +BinVHeap: 0 +OldBinVHeap: 0 +BinVHeap unused: 46422 +OldBinVHeap unused: 46422 +Memory: 2760 +Program counter: 0x0000772b50d85e90 (gen_event:fetch_msg/6 + 112) +arity = 0 +Internal State: ACT_PRIO_NORMAL | USR_PRIO_NORMAL | PRQ_PRIO_NORMAL +=proc:<0.65.0> +State: Waiting +Spawned as: proc_lib:init_p/5 +Spawned by: <0.49.0> +Message queue length: 0 +Number of heap fragments: 0 +Heap fragment data: 0 +Link list: [<0.70.0>, <0.49.0>] +Reductions: 454 +Stack+heap: 1598 +OldHeap: 1598 +Heap unused: 1248 +OldHeap unused: 1575 +BinVHeap: 22137 +OldBinVHeap: 0 +BinVHeap unused: 24285 +OldBinVHeap unused: 46422 +Memory: 26608 +Program counter: 0x0000772b50d207d8 (gen_server:loop/7 + 544) +arity = 0 +Internal State: ACT_PRIO_NORMAL | USR_PRIO_NORMAL | PRQ_PRIO_NORMAL +=proc:<0.66.0> +State: Waiting +Name: user_drv +Spawned as: proc_lib:init_p/5 +Spawned by: <0.65.0> +Message queue length: 0 +Number of heap fragments: 0 +Heap fragment data: 4 +Link list: [<0.70.0>, <0.68.0>] +Reductions: 1009 +Stack+heap: 610 +OldHeap: 610 +Heap unused: 109 +OldHeap unused: 451 +BinVHeap: 4781 +OldBinVHeap: 76 +BinVHeap unused: 41641 +OldBinVHeap unused: 46346 +Memory: 10832 +Program counter: 0x0000772b50f67208 (gen_statem:loop_receive/3 + 144) +arity = 0 +Internal State: ACT_PRIO_NORMAL | USR_PRIO_NORMAL | PRQ_PRIO_NORMAL +=proc:<0.68.0> +State: Waiting +Name: user_drv_writer +Spawned as: proc_lib:init_p/5 +Spawned by: <0.66.0> +Message queue length: 0 +Number of heap fragments: 0 +Heap fragment data: 0 +Link list: [<0.66.0>] +Reductions: 26 +Stack+heap: 233 +OldHeap: 0 +Heap unused: 184 +OldHeap unused: 0 +BinVHeap: 0 +OldBinVHeap: 0 +BinVHeap unused: 46422 +OldBinVHeap unused: 46422 +Memory: 2760 +Program counter: 0x0000772b50f78ecc (prim_tty:writer_loop/2 + 92) +arity = 0 +Internal State: ACT_PRIO_NORMAL | USR_PRIO_NORMAL | PRQ_PRIO_NORMAL +=proc:<0.70.0> +State: Waiting +Name: user +Spawned as: group:server/4 +Spawned by: <0.66.0> +Message queue length: 1 +Number of heap fragments: 0 +Heap fragment data: 0 +Link list: [<0.65.0>, <0.66.0>] +Reductions: 391 +Stack+heap: 233 +OldHeap: 0 +Heap unused: 162 +OldHeap unused: 0 +BinVHeap: 0 +OldBinVHeap: 0 +BinVHeap unused: 46422 +OldBinVHeap unused: 46422 +Memory: 3088 +Program counter: 0x0000772b50f8fbf4 (group:server_loop/3 + 92) +arity = 0 +Internal State: ACT_PRIO_NORMAL | USR_PRIO_NORMAL | PRQ_PRIO_NORMAL +=proc:<0.71.0> +State: Waiting +Name: logger_sup +Spawned as: proc_lib:init_p/5 +Spawned by: <0.49.0> +Message queue length: 0 +Number of heap fragments: 0 +Heap fragment data: 0 +Link list: [<0.49.0>, <0.78.0>, <0.73.0>, <0.72.0>] +Reductions: 561 +Stack+heap: 233 +OldHeap: 376 +Heap unused: 67 +OldHeap unused: 300 +BinVHeap: 0 +OldBinVHeap: 0 +BinVHeap unused: 46422 +OldBinVHeap unused: 46422 +Memory: 6008 +Program counter: 0x0000772b50d207d8 (gen_server:loop/7 + 544) +arity = 0 +Internal State: ACT_PRIO_NORMAL | USR_PRIO_NORMAL | PRQ_PRIO_NORMAL +=proc:<0.72.0> +State: Waiting +Name: logger_handler_watcher +Spawned as: proc_lib:init_p/5 +Spawned by: <0.71.0> +Message queue length: 0 +Number of heap fragments: 0 +Heap fragment data: 0 +Link list: [<0.71.0>, {to,<0.78.0>,#Ref<0.3919585461.1111490562.235312>}] +Reductions: 58 +Stack+heap: 233 +OldHeap: 0 +Heap unused: 139 +OldHeap unused: 0 +BinVHeap: 0 +OldBinVHeap: 0 +BinVHeap unused: 46422 +OldBinVHeap unused: 46422 +Memory: 2832 +Program counter: 0x0000772b50d207d8 (gen_server:loop/7 + 544) +arity = 0 +Internal State: ACT_PRIO_NORMAL | USR_PRIO_NORMAL | PRQ_PRIO_NORMAL +=proc:<0.73.0> +State: Scheduled +Name: logger_proxy +Spawned as: proc_lib:init_p/5 +Spawned by: <0.71.0> +Message queue length: 0 +Number of heap fragments: 0 +Heap fragment data: 0 +Link list: [<0.71.0>, {to,{code_server,'nonode@nohost'},#Ref<0.3919585461.1111490562.235360>}, {from,<0.50.0>,#Ref<0.3919585461.1111490562.235358>}] +Reductions: 446 +Stack+heap: 987 +OldHeap: 610 +Heap unused: 800 +OldHeap unused: 257 +BinVHeap: 15772 +OldBinVHeap: 4 +BinVHeap unused: 30650 +OldBinVHeap unused: 46418 +Memory: 15272 +Program counter: 0x0000772b50ca4788 (code_server:call/1 + 328) +arity = 0 +Internal State: ACT_PRIO_NORMAL | USR_PRIO_NORMAL | PRQ_PRIO_NORMAL | IN_PRQ_NORMAL | MSG_SIG_IN_Q | ACTIVE | IN_RUNQ | NMSG_SIG_IN_Q | ACTIVE_SYS | OFF_HEAP_MSGQ +=proc:<0.74.0> +State: Waiting +Spawned as: proc_lib:init_p/5 +Spawned by: <0.49.0> +Message queue length: 0 +Number of heap fragments: 0 +Heap fragment data: 0 +Link list: [<0.49.0>] +Reductions: 60 +Stack+heap: 233 +OldHeap: 0 +Heap unused: 158 +OldHeap unused: 0 +BinVHeap: 0 +OldBinVHeap: 0 +BinVHeap unused: 46422 +OldBinVHeap unused: 46422 +Memory: 2760 +Program counter: 0x0000772b50d207d8 (gen_server:loop/7 + 544) +arity = 0 +Internal State: ACT_PRIO_NORMAL | USR_PRIO_NORMAL | PRQ_PRIO_NORMAL +=proc:<0.75.0> +State: Waiting +Name: kernel_refc +Spawned as: proc_lib:init_p/5 +Spawned by: <0.49.0> +Message queue length: 0 +Number of heap fragments: 0 +Heap fragment data: 0 +Link list: [<0.49.0>] +Reductions: 60 +Stack+heap: 233 +OldHeap: 0 +Heap unused: 164 +OldHeap unused: 0 +BinVHeap: 0 +OldBinVHeap: 0 +BinVHeap unused: 46422 +OldBinVHeap unused: 46422 +Memory: 2760 +Program counter: 0x0000772b50d207d8 (gen_server:loop/7 + 544) +arity = 0 +Internal State: ACT_PRIO_NORMAL | USR_PRIO_NORMAL | PRQ_PRIO_NORMAL +=proc:<0.76.0> +State: Waiting +Name: kernel_safe_sup +Spawned as: proc_lib:init_p/5 +Current call: erlang:hibernate/3 +Spawned by: <0.49.0> +Message queue length: 0 +Number of heap fragments: 0 +Heap fragment data: 0 +Link list: [<0.49.0>] +Reductions: 92 +Stack+heap: 52 +OldHeap: 0 +Heap unused: 4 +OldHeap unused: 0 +BinVHeap: 0 +OldBinVHeap: 0 +BinVHeap unused: 46422 +OldBinVHeap unused: 46422 +Memory: 1312 +Program counter: 0x0000772b50c01170 (unknown function) +arity = 3 +Internal State: ACT_PRIO_NORMAL | USR_PRIO_NORMAL | PRQ_PRIO_NORMAL +=proc:<0.78.0> +State: Waiting +Name: logger_std_h_default +Spawned as: proc_lib:init_p/5 +Spawned by: <0.71.0> +Message queue length: 0 +Number of heap fragments: 0 +Heap fragment data: 13 +Link list: [<0.79.0>, <0.71.0>, {from,<0.72.0>,#Ref<0.3919585461.1111490562.235312>}] +Reductions: 171 +Stack+heap: 376 +OldHeap: 0 +Heap unused: 28 +OldHeap unused: 0 +BinVHeap: 0 +OldBinVHeap: 0 +BinVHeap unused: 46422 +OldBinVHeap unused: 46422 +Memory: 4128 +Program counter: 0x0000772b50d207d8 (gen_server:loop/7 + 544) +arity = 0 +Internal State: ACT_PRIO_NORMAL | USR_PRIO_NORMAL | PRQ_PRIO_NORMAL | OFF_HEAP_MSGQ +=proc:<0.79.0> +State: Waiting +Spawned as: erlang:apply/2 +Spawned by: <0.78.0> +Message queue length: 0 +Number of heap fragments: 0 +Heap fragment data: 0 +Link list: [<0.78.0>] +Reductions: 9 +Stack+heap: 233 +OldHeap: 0 +Heap unused: 211 +OldHeap unused: 0 +BinVHeap: 0 +OldBinVHeap: 0 +BinVHeap unused: 46422 +OldBinVHeap unused: 46422 +Memory: 2672 +Program counter: 0x0000772b50fcf7f4 (logger_std_h:file_ctrl_loop/1 + 92) +arity = 0 +Internal State: ACT_PRIO_NORMAL | USR_PRIO_NORMAL | PRQ_PRIO_NORMAL +=port:#Port<0.0> +State: CONNECTED +Slot: 0 +Connected: <0.0.0> +Port controls forker process: forker +Input: 0 +Output: 0 +Queue: 0 +=port:#Port<0.1> +State: CONNECTED|BINARY_IO +Slot: 8 +Connected: <0.52.0> +Links: <0.52.0> +Port is UNIX fd not opened by emulator: 2/2 +Input: 0 +Output: 0 +Queue: 0 +=ets:<0.43.0> +Slot: 110302214750656 +Table: logger +Name: logger +Buckets: 256 +Chain Length Avg: 0.011719 +Chain Length Max: 1 +Chain Length Min: 0 +Chain Length Std Dev: 0.107617 +Chain Length Expected Std Dev: 0.108042 +Fixed: false +Objects: 3 +Words: 4624 +Type: set +Protection: protected +Compressed: false +Write Concurrency: true +Read Concurrency: true +=ets:<0.45.0> +Slot: 110302214762368 +Table: ac_tab +Name: ac_tab +Buckets: 256 +Chain Length Avg: 0.046875 +Chain Length Max: 1 +Chain Length Min: 0 +Chain Length Std Dev: 0.211371 +Chain Length Expected Std Dev: 0.216083 +Fixed: false +Objects: 12 +Words: 1109 +Type: set +Protection: public +Compressed: false +Write Concurrency: false +Read Concurrency: true +=ets:<0.50.0> +Slot: 110302214771120 +Table: code_server +Name: code_server +Buckets: 376 +Chain Length Avg: 1.000000 +Chain Length Max: 6 +Chain Length Min: 0 +Chain Length Std Dev: 1.127509 +Chain Length Expected Std Dev: 0.998669 +Fixed: false +Objects: 376 +Words: 14661 +Type: set +Protection: protected +Compressed: false +Write Concurrency: false +Read Concurrency: false +=ets:<0.50.0> +Slot: 110302214782176 +Table: #Ref<0.3919585461.1111621634.235080> +Name: code_names +Buckets: 256 +Chain Length Avg: 0.148438 +Chain Length Max: 2 +Chain Length Min: 0 +Chain Length Std Dev: 0.366355 +Chain Length Expected Std Dev: 0.384523 +Fixed: false +Objects: 38 +Words: 4613 +Type: set +Protection: protected +Compressed: false +Write Concurrency: false +Read Concurrency: false +=ets:<0.55.0> +Slot: 131027737525344 +Table: inet_db +Name: inet_db +Buckets: 256 +Chain Length Avg: 0.121094 +Chain Length Max: 3 +Chain Length Min: 0 +Chain Length Std Dev: 0.360371 +Chain Length Expected Std Dev: 0.347305 +Fixed: false +Objects: 31 +Words: 634 +Type: set +Protection: public +Compressed: false +Write Concurrency: false +Read Concurrency: false +=ets:<0.55.0> +Slot: 131027737529416 +Table: inet_cache +Name: inet_cache +Buckets: 256 +Chain Length Avg: 0.000000 +Chain Length Max: 0 +Chain Length Min: 0 +Chain Length Std Dev: 0.000000 +Chain Length Expected Std Dev: 0.000000 +Fixed: false +Objects: 0 +Words: 305 +Type: bag +Protection: public +Compressed: false +Write Concurrency: false +Read Concurrency: false +=ets:<0.55.0> +Slot: 131027737531872 +Table: inet_hosts_byname +Name: inet_hosts_byname +Buckets: 256 +Chain Length Avg: 0.000000 +Chain Length Max: 0 +Chain Length Min: 0 +Chain Length Std Dev: 0.000000 +Chain Length Expected Std Dev: 0.000000 +Fixed: false +Objects: 0 +Words: 305 +Type: set +Protection: protected +Compressed: false +Write Concurrency: false +Read Concurrency: false +=ets:<0.55.0> +Slot: 131027737534328 +Table: inet_hosts_byaddr +Name: inet_hosts_byaddr +Buckets: 256 +Chain Length Avg: 0.000000 +Chain Length Max: 0 +Chain Length Min: 0 +Chain Length Std Dev: 0.000000 +Chain Length Expected Std Dev: 0.000000 +Fixed: false +Objects: 0 +Words: 305 +Type: set +Protection: protected +Compressed: false +Write Concurrency: false +Read Concurrency: false +=ets:<0.55.0> +Slot: 131027737536784 +Table: inet_hosts_file_byname +Name: inet_hosts_file_byname +Buckets: 256 +Chain Length Avg: 0.000000 +Chain Length Max: 0 +Chain Length Min: 0 +Chain Length Std Dev: 0.000000 +Chain Length Expected Std Dev: 0.000000 +Fixed: false +Objects: 0 +Words: 305 +Type: set +Protection: protected +Compressed: false +Write Concurrency: false +Read Concurrency: false +=ets:<0.55.0> +Slot: 131027737539240 +Table: inet_hosts_file_byaddr +Name: inet_hosts_file_byaddr +Buckets: 256 +Chain Length Avg: 0.000000 +Chain Length Max: 0 +Chain Length Min: 0 +Chain Length Std Dev: 0.000000 +Chain Length Expected Std Dev: 0.000000 +Fixed: false +Objects: 0 +Words: 305 +Type: set +Protection: protected +Compressed: false +Write Concurrency: false +Read Concurrency: false +=ets:<0.55.0> +Slot: 131027737541696 +Table: inet_sockets +Name: inet_sockets +Buckets: 256 +Chain Length Avg: 0.000000 +Chain Length Max: 0 +Chain Length Min: 0 +Chain Length Std Dev: 0.000000 +Chain Length Expected Std Dev: 0.000000 +Fixed: false +Objects: 0 +Words: 305 +Type: set +Protection: protected +Compressed: false +Write Concurrency: false +Read Concurrency: false +=ets:<0.58.0> +Slot: 131027737551096 +Table: #Ref<0.3919585461.1111621634.235160> +Name: rex_nodes_observer +Buckets: 256 +Chain Length Avg: 0.000000 +Chain Length Max: 0 +Chain Length Min: 0 +Chain Length Std Dev: 0.000000 +Chain Length Expected Std Dev: 0.000000 +Fixed: false +Objects: 0 +Words: 353 +Type: set +Protection: protected +Compressed: false +Write Concurrency: false +Read Concurrency: true +=ets:<0.59.0> +Slot: 131027737555408 +Table: global_locks +Name: global_locks +Buckets: 256 +Chain Length Avg: 0.000000 +Chain Length Max: 0 +Chain Length Min: 0 +Chain Length Std Dev: 0.000000 +Chain Length Expected Std Dev: 0.000000 +Fixed: false +Objects: 0 +Words: 305 +Type: set +Protection: protected +Compressed: false +Write Concurrency: false +Read Concurrency: false +=ets:<0.59.0> +Slot: 131027737557864 +Table: global_names +Name: global_names +Buckets: 256 +Chain Length Avg: 0.000000 +Chain Length Max: 0 +Chain Length Min: 0 +Chain Length Std Dev: 0.000000 +Chain Length Expected Std Dev: 0.000000 +Fixed: false +Objects: 0 +Words: 353 +Type: set +Protection: protected +Compressed: false +Write Concurrency: false +Read Concurrency: true +=ets:<0.59.0> +Slot: 131027737560320 +Table: global_names_ext +Name: global_names_ext +Buckets: 256 +Chain Length Avg: 0.000000 +Chain Length Max: 0 +Chain Length Min: 0 +Chain Length Std Dev: 0.000000 +Chain Length Expected Std Dev: 0.000000 +Fixed: false +Objects: 0 +Words: 305 +Type: set +Protection: protected +Compressed: false +Write Concurrency: false +Read Concurrency: false +=ets:<0.59.0> +Slot: 131027737562776 +Table: global_pid_names +Name: global_pid_names +Buckets: 256 +Chain Length Avg: 0.000000 +Chain Length Max: 0 +Chain Length Min: 0 +Chain Length Std Dev: 0.000000 +Chain Length Expected Std Dev: 0.000000 +Fixed: false +Objects: 0 +Words: 305 +Type: bag +Protection: protected +Compressed: false +Write Concurrency: false +Read Concurrency: false +=ets:<0.59.0> +Slot: 131027737565232 +Table: global_pid_ids +Name: global_pid_ids +Buckets: 256 +Chain Length Avg: 0.000000 +Chain Length Max: 0 +Chain Length Min: 0 +Chain Length Std Dev: 0.000000 +Chain Length Expected Std Dev: 0.000000 +Fixed: false +Objects: 0 +Words: 305 +Type: bag +Protection: protected +Compressed: false +Write Concurrency: false +Read Concurrency: false +=ets:<0.59.0> +Slot: 131027737567688 +Table: global_lost_connections +Name: global_lost_connections +Buckets: 256 +Chain Length Avg: 0.000000 +Chain Length Max: 0 +Chain Length Min: 0 +Chain Length Std Dev: 0.000000 +Chain Length Expected Std Dev: 0.000000 +Fixed: false +Objects: 0 +Words: 305 +Type: set +Protection: protected +Compressed: false +Write Concurrency: false +Read Concurrency: false +=ets:<0.59.0> +Slot: 131027737570144 +Table: global_node_resources +Name: global_node_resources +Buckets: 256 +Chain Length Avg: 0.000000 +Chain Length Max: 0 +Chain Length Min: 0 +Chain Length Std Dev: 0.000000 +Chain Length Expected Std Dev: 0.000000 +Fixed: false +Objects: 0 +Words: 305 +Type: set +Protection: protected +Compressed: false +Write Concurrency: false +Read Concurrency: false +=timer:<0.55.0> +Message: refresh_timeout +Time left: 3599675 +=node:'nonode@nohost' +=no_distribution +=loaded_modules +Current code: 4530360 +Old code: 0 +=mod:erts_code_purger +Current size: 16216 +=mod:erl_init +Current size: 2504 +=mod:init +Current size: 78672 +=mod:prim_buffer +Current size: 4936 +=mod:prim_eval +Current size: 1296 +=mod:prim_inet +Current size: 122800 +=mod:prim_file +Current size: 40816 +=mod:zlib +Current size: 17168 +=mod:socket_registry +Current size: 24496 +=mod:prim_socket +Current size: 54448 +=mod:prim_net +Current size: 11792 +=mod:prim_zip +Current size: 27624 +=mod:erl_prim_loader +Current size: 67352 +=mod:erlang +Current size: 116288 +=mod:erts_internal +Current size: 27880 +=mod:erl_tracer +Current size: 3080 +=mod:erts_literal_area_collector +Current size: 5504 +=mod:erts_trace_cleaner +Current size: 3176 +=mod:erts_dirty_process_signal_handler +Current size: 2424 +=mod:atomics +Current size: 3480 +=mod:counters +Current size: 4464 +=mod:persistent_term +Current size: 1448 +=mod:erl_parse +Current size: 386992 +Current attributes: g2wAAAQ8aAJ3A3ZzbmwAAAABbhAA1H6sMEDd+z5ZkmUN+C1qtWpoAncHcmVtb3ZlZGwAAAADaAN3CHNldF9saW5lYQJrABd1c2UgZXJsX2Fubm86c2V0X2xpbmUvMmgDdw5nZXRfYXR0cmlidXRlc2EBawAuZXJsX2Fubm86e2NvbHVtbixsaW5lLGxvY2F0aW9uLHRleHR9LzEgaW5zdGVhZGgDdw1nZXRfYXR0cmlidXRlYQJrAC5lcmxfYW5ubzp7Y29sdW1uLGxpbmUsbG9jYXRpb24sdGV4dH0vMSBpbnN0ZWFkamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdwl5ZWNjcGFyczJhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncLeWVjY3BhcnMyXzBhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncLeWVjY3BhcnMyXzFhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncLeWVjY3BhcnMyXzJhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncLeWVjY3BhcnMyXzNhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncLeWVjY3BhcnMyXzRhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncLeWVjY3BhcnMyXzVhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncLeWVjY3BhcnMyXzZhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncLeWVjY3BhcnMyXzdhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncLeWVjY3BhcnMyXzhhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncLeWVjY3BhcnMyXzlhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncMeWVjY3BhcnMyXzEwYQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DHllY2NwYXJzMl8xMWEHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdwx5ZWNjcGFyczJfMTJhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncMeWVjY3BhcnMyXzEzYQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DHllY2NwYXJzMl8xNGEHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdwx5ZWNjcGFyczJfMTZhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncMeWVjY3BhcnMyXzE3YQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DHllY2NwYXJzMl8xOGEHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdwx5ZWNjcGFyczJfMTlhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncMeWVjY3BhcnMyXzIwYQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DHllY2NwYXJzMl8yMWEHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdwx5ZWNjcGFyczJfMjJhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncMeWVjY3BhcnMyXzIzYQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DHllY2NwYXJzMl8yNWEHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdwx5ZWNjcGFyczJfMjZhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncMeWVjY3BhcnMyXzI3YQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DHllY2NwYXJzMl8yOGEHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdwx5ZWNjcGFyczJfMzBhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncMeWVjY3BhcnMyXzMxYQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DHllY2NwYXJzMl8zMmEHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdwx5ZWNjcGFyczJfMzNhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncMeWVjY3BhcnMyXzM0YQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DHllY2NwYXJzMl8zNWEHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdwx5ZWNjcGFyczJfMzZhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncMeWVjY3BhcnMyXzM3YQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DHllY2NwYXJzMl8zOGEHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdwx5ZWNjcGFyczJfNDBhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncMeWVjY3BhcnMyXzQxYQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DHllY2NwYXJzMl80MmEHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdwx5ZWNjcGFyczJfNDNhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncMeWVjY3BhcnMyXzQ0YQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DHllY2NwYXJzMl80NmEHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdwx5ZWNjcGFyczJfNDdhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncMeWVjY3BhcnMyXzQ4YQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DHllY2NwYXJzMl80OWEHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdwx5ZWNjcGFyczJfNTBhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncMeWVjY3BhcnMyXzUxYQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DHllY2NwYXJzMl81MmEHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdwx5ZWNjcGFyczJfNTNhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncMeWVjY3BhcnMyXzU0YQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DHllY2NwYXJzMl81NWEHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdwx5ZWNjcGFyczJfNTZhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncMeWVjY3BhcnMyXzU3YQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DHllY2NwYXJzMl81OGEHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdwx5ZWNjcGFyczJfNTlhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncMeWVjY3BhcnMyXzYwYQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DHllY2NwYXJzMl82MWEHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdwx5ZWNjcGFyczJfNjJhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncMeWVjY3BhcnMyXzY5YQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DHllY2NwYXJzMl83NGEHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdwx5ZWNjcGFyczJfNzVhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncMeWVjY3BhcnMyXzc3YQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DHllY2NwYXJzMl84MWEHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdwx5ZWNjcGFyczJfODJhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncMeWVjY3BhcnMyXzgzYQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DHllY2NwYXJzMl84NWEHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdwx5ZWNjcGFyczJfODZhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncMeWVjY3BhcnMyXzkwYQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DHllY2NwYXJzMl85M2EHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdwx5ZWNjcGFyczJfOTRhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncMeWVjY3BhcnMyXzk1YQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DHllY2NwYXJzMl85NmEHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdwx5ZWNjcGFyczJfOTdhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncMeWVjY3BhcnMyXzk4YQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DHllY2NwYXJzMl85OWEHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdw15ZWNjcGFyczJfMTAwYQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DXllY2NwYXJzMl8xMDJhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncNeWVjY3BhcnMyXzEwM2EHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdw15ZWNjcGFyczJfMTA0YQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DXllY2NwYXJzMl8xMDVhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncNeWVjY3BhcnMyXzEwNmEHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdw15ZWNjcGFyczJfMTA3YQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DXllY2NwYXJzMl8xMDhhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncNeWVjY3BhcnMyXzExMGEHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdw15ZWNjcGFyczJfMTExYQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DXllY2NwYXJzMl8xMTJhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncNeWVjY3BhcnMyXzExM2EHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdw15ZWNjcGFyczJfMTE0YQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DXllY2NwYXJzMl8xMTVhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncNeWVjY3BhcnMyXzExNmEHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdw15ZWNjcGFyczJfMTE4YQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DXllY2NwYXJzMl8xMjBhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncNeWVjY3BhcnMyXzEyMWEHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdw15ZWNjcGFyczJfMTIyYQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DXllY2NwYXJzMl8xMjRhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncNeWVjY3BhcnMyXzEyNWEHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdw15ZWNjcGFyczJfMTI2YQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DXllY2NwYXJzMl8xMjdhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncNeWVjY3BhcnMyXzEyOGEHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdw15ZWNjcGFyczJfMTI5YQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DXllY2NwYXJzMl8xMzBhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncNeWVjY3BhcnMyXzEzM2EHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdw15ZWNjcGFyczJfMTM0YQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DXllY2NwYXJzMl8xMzVhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncNeWVjY3BhcnMyXzEzNmEHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdw15ZWNjcGFyczJfMTM3YQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DXllY2NwYXJzMl8xMzhhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncNeWVjY3BhcnMyXzEzOWEHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdw15ZWNjcGFyczJfMTQwYQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DXllY2NwYXJzMl8xNDFhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncNeWVjY3BhcnMyXzE0MmEHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdw15ZWNjcGFyczJfMTQzYQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DXllY2NwYXJzMl8xNDRhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncNeWVjY3BhcnMyXzE0NWEHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdw15ZWNjcGFyczJfMTQ2YQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DXllY2NwYXJzMl8xNDdhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncNeWVjY3BhcnMyXzE0OGEHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdw15ZWNjcGFyczJfMTQ5YQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DXllY2NwYXJzMl8xNTBhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncNeWVjY3BhcnMyXzE1MWEHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdw15ZWNjcGFyczJfMTUyYQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DXllY2NwYXJzMl8xNTNhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncNeWVjY3BhcnMyXzE1NGEHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdw15ZWNjcGFyczJfMTU1YQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DXllY2NwYXJzMl8xNTZhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncNeWVjY3BhcnMyXzE1N2EHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdw15ZWNjcGFyczJfMTU4YQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DXllY2NwYXJzMl8xNTlhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncNeWVjY3BhcnMyXzE2MGEHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdw15ZWNjcGFyczJfMTYxYQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DXllY2NwYXJzMl8xNjJhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncNeWVjY3BhcnMyXzE2M2EHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdw15ZWNjcGFyczJfMTY1YQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DXllY2NwYXJzMl8xNjZhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncNeWVjY3BhcnMyXzE2N2EHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdw15ZWNjcGFyczJfMTY4YQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DXllY2NwYXJzMl8xNjlhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncNeWVjY3BhcnMyXzE3MWEHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdw15ZWNjcGFyczJfMTcyYQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DXllY2NwYXJzMl8xNzNhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncNeWVjY3BhcnMyXzE3NGEHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdw15ZWNjcGFyczJfMTc1YQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DXllY2NwYXJzMl8xNzZhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncNeWVjY3BhcnMyXzE3N2EHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdw15ZWNjcGFyczJfMTc4YQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DXllY2NwYXJzMl8xNzlhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncNeWVjY3BhcnMyXzE4MGEHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdw15ZWNjcGFyczJfMTgxYQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DXllY2NwYXJzMl8xODJhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncNeWVjY3BhcnMyXzE4M2EHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdw15ZWNjcGFyczJfMTg0YQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DXllY2NwYXJzMl8xODVhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncNeWVjY3BhcnMyXzE4NmEHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdw15ZWNjcGFyczJfMTg3YQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DXllY2NwYXJzMl8xODhhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncNeWVjY3BhcnMyXzE4OWEHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdw15ZWNjcGFyczJfMTkyYQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DXllY2NwYXJzMl8xOTNhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncNeWVjY3BhcnMyXzE5NGEHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdw15ZWNjcGFyczJfMTk1YQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DXllY2NwYXJzMl8xOTZhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncNeWVjY3BhcnMyXzE5N2EHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdw15ZWNjcGFyczJfMTk4YQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DXllY2NwYXJzMl8xOTlhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncNeWVjY3BhcnMyXzIwMGEHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdw15ZWNjcGFyczJfMjAxYQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DXllY2NwYXJzMl8yMDJhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncNeWVjY3BhcnMyXzIwM2EHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdw15ZWNjcGFyczJfMjA0YQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DXllY2NwYXJzMl8yMDVhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncNeWVjY3BhcnMyXzIwNmEHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdw15ZWNjcGFyczJfMjA3YQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DXllY2NwYXJzMl8yMDhhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncNeWVjY3BhcnMyXzIwOWEHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdw15ZWNjcGFyczJfMjEwYQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DXllY2NwYXJzMl8yMTFhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncNeWVjY3BhcnMyXzIxMmEHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdw15ZWNjcGFyczJfMjE0YQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DXllY2NwYXJzMl8yMTVhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncNeWVjY3BhcnMyXzIxNmEHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdw15ZWNjcGFyczJfMjE3YQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DXllY2NwYXJzMl8yMTlhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncNeWVjY3BhcnMyXzIyMGEHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdw15ZWNjcGFyczJfMjIxYQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DXllY2NwYXJzMl8yMjJhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncNeWVjY3BhcnMyXzIyNGEHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdw15ZWNjcGFyczJfMjI1YQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DXllY2NwYXJzMl8yMjZhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncNeWVjY3BhcnMyXzIyN2EHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdw15ZWNjcGFyczJfMjI4YQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DXllY2NwYXJzMl8yMzFhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncNeWVjY3BhcnMyXzIzMmEHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdw15ZWNjcGFyczJfMjMzYQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DXllY2NwYXJzMl8yMzVhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncNeWVjY3BhcnMyXzIzNmEHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdw15ZWNjcGFyczJfMjM3YQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DXllY2NwYXJzMl8yMzlhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncNeWVjY3BhcnMyXzI0MWEHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdw15ZWNjcGFyczJfMjQyYQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DXllY2NwYXJzMl8yNDRhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncNeWVjY3BhcnMyXzI0NWEHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdw15ZWNjcGFyczJfMjQ2YQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DXllY2NwYXJzMl8yNDdhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncNeWVjY3BhcnMyXzI0OGEHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdw15ZWNjcGFyczJfMjQ5YQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DXllY2NwYXJzMl8yNTBhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncNeWVjY3BhcnMyXzI1MmEHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdw15ZWNjcGFyczJfMjUzYQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DXllY2NwYXJzMl8yNTRhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncNeWVjY3BhcnMyXzI1NWEHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdw15ZWNjcGFyczJfMjU3YQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DXllY2NwYXJzMl8yNTlhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncNeWVjY3BhcnMyXzI2MGEHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdw15ZWNjcGFyczJfMjYxYQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DXllY2NwYXJzMl8yNjNhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncNeWVjY3BhcnMyXzI2NGEHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdw15ZWNjcGFyczJfMjY1YQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DXllY2NwYXJzMl8yNjZhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncNeWVjY3BhcnMyXzI2N2EHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdw15ZWNjcGFyczJfMjY4YQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DXllY2NwYXJzMl8yNjlhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncNeWVjY3BhcnMyXzI3MGEHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdw15ZWNjcGFyczJfMjcxYQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DXllY2NwYXJzMl8yNzJhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncNeWVjY3BhcnMyXzI3M2EHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdw15ZWNjcGFyczJfMjc0YQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DXllY2NwYXJzMl8yNzVhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncNeWVjY3BhcnMyXzI3N2EHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdw15ZWNjcGFyczJfMjc4YQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DXllY2NwYXJzMl8yNzlhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncNeWVjY3BhcnMyXzI4MGEHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdw15ZWNjcGFyczJfMjgxYQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DXllY2NwYXJzMl8yODJhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncNeWVjY3BhcnMyXzI4M2EHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdw15ZWNjcGFyczJfMjg0YQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DXllY2NwYXJzMl8yODVhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncNeWVjY3BhcnMyXzI4NmEHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdw15ZWNjcGFyczJfMjg3YQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DXllY2NwYXJzMl8yODhhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncNeWVjY3BhcnMyXzI5MGEHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdw15ZWNjcGFyczJfMjkxYQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DXllY2NwYXJzMl8yOTZhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncNeWVjY3BhcnMyXzI5OGEHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdw15ZWNjcGFyczJfMjk5YQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DXllY2NwYXJzMl8zMDBhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncNeWVjY3BhcnMyXzMwMWEHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdw15ZWNjcGFyczJfMzAyYQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DXllY2NwYXJzMl8zMDNhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncNeWVjY3BhcnMyXzMwNWEHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdw15ZWNjcGFyczJfMzA3YQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DXllY2NwYXJzMl8zMDhhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncNeWVjY3BhcnMyXzMxMGEHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdw15ZWNjcGFyczJfMzEyYQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DXllY2NwYXJzMl8zMTRhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncNeWVjY3BhcnMyXzMxNmEHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdw15ZWNjcGFyczJfMzE3YQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DXllY2NwYXJzMl8zMThhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncNeWVjY3BhcnMyXzMxOWEHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdw15ZWNjcGFyczJfMzIwYQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DXllY2NwYXJzMl8zMjFhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncNeWVjY3BhcnMyXzMyM2EHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdw15ZWNjcGFyczJfMzI0YQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DXllY2NwYXJzMl8zMjVhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncNeWVjY3BhcnMyXzMyN2EHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdw15ZWNjcGFyczJfMzI5YQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DXllY2NwYXJzMl8zMzBhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncNeWVjY3BhcnMyXzMzMWEHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdw15ZWNjcGFyczJfMzMyYQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DXllY2NwYXJzMl8zMzNhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncNeWVjY3BhcnMyXzMzNmEHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdw15ZWNjcGFyczJfMzM3YQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DXllY2NwYXJzMl8zMzlhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncNeWVjY3BhcnMyXzM0MWEHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdw15ZWNjcGFyczJfMzQyYQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DXllY2NwYXJzMl8zNDNhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncNeWVjY3BhcnMyXzM0NGEHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdw15ZWNjcGFyczJfMzQ1YQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DXllY2NwYXJzMl8zNDdhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncNeWVjY3BhcnMyXzM0OWEHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdw15ZWNjcGFyczJfMzUwYQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DXllY2NwYXJzMl8zNTFhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncNeWVjY3BhcnMyXzM1MmEHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdw15ZWNjcGFyczJfMzUzYQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DXllY2NwYXJzMl8zNTRhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncNeWVjY3BhcnMyXzM1NWEHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdw15ZWNjcGFyczJfMzU2YQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DXllY2NwYXJzMl8zNTdhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncNeWVjY3BhcnMyXzM1OWEHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdw15ZWNjcGFyczJfMzYwYQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DXllY2NwYXJzMl8zNjFhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncNeWVjY3BhcnMyXzM2MmEHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdw15ZWNjcGFyczJfMzYzYQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DXllY2NwYXJzMl8zNjRhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncNeWVjY3BhcnMyXzM2NWEHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdw15ZWNjcGFyczJfMzY2YQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DXllY2NwYXJzMl8zNjdhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncNeWVjY3BhcnMyXzM2OGEHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdw15ZWNjcGFyczJfMzY5YQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DXllY2NwYXJzMl8zNzBhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncNeWVjY3BhcnMyXzM3MWEHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdw15ZWNjcGFyczJfMzczYQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DXllY2NwYXJzMl8zNzVhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncNeWVjY3BhcnMyXzM3NmEHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdw15ZWNjcGFyczJfMzc5YQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DXllY2NwYXJzMl8zODBhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncNeWVjY3BhcnMyXzM4MWEHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdw15ZWNjcGFyczJfMzgyYQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DXllY2NwYXJzMl8zODRhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncNeWVjY3BhcnMyXzM4NWEHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdw15ZWNjcGFyczJfMzg3YQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DXllY2NwYXJzMl8zOTBhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncNeWVjY3BhcnMyXzM5MWEHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdw15ZWNjcGFyczJfMzkyYQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DXllY2NwYXJzMl8zOTNhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncNeWVjY3BhcnMyXzM5NGEHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdw15ZWNjcGFyczJfMzk1YQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DXllY2NwYXJzMl8zOTdhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncNeWVjY3BhcnMyXzM5OWEHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdw15ZWNjcGFyczJfNDAxYQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DXllY2NwYXJzMl80MDJhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncNeWVjY3BhcnMyXzQwNGEHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdw15ZWNjcGFyczJfNDA2YQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DXllY2NwYXJzMl80MDhhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncNeWVjY3BhcnMyXzQxMGEHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdw15ZWNjcGFyczJfNDEyYQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DXllY2NwYXJzMl80MTNhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncNeWVjY3BhcnMyXzQxNGEHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdw15ZWNjcGFyczJfNDE1YQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DXllY2NwYXJzMl80MTZhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncNeWVjY3BhcnMyXzQxN2EHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdw15ZWNjcGFyczJfNDE5YQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DXllY2NwYXJzMl80MjBhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncNeWVjY3BhcnMyXzQyMWEHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdw15ZWNjcGFyczJfNDIzYQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DXllY2NwYXJzMl80MjRhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncNeWVjY3BhcnMyXzQyNmEHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdw15ZWNjcGFyczJfNDI4YQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DXllY2NwYXJzMl80MjlhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncNeWVjY3BhcnMyXzQzMGEHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdw15ZWNjcGFyczJfNDMxYQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DXllY2NwYXJzMl80MzNhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncNeWVjY3BhcnMyXzQzNGEHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdw15ZWNjcGFyczJfNDM1YQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DXllY2NwYXJzMl80MzZhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncNeWVjY3BhcnMyXzQzN2EHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdw15ZWNjcGFyczJfNDM4YQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DXllY2NwYXJzMl80MzlhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncNeWVjY3BhcnMyXzQ0MGEHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdw15ZWNjcGFyczJfNDQxYQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DXllY2NwYXJzMl80NDNhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncNeWVjY3BhcnMyXzQ0NWEHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdw15ZWNjcGFyczJfNDQ2YQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DXllY2NwYXJzMl80NDdhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncNeWVjY3BhcnMyXzQ0OWEHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdw15ZWNjcGFyczJfNDUwYQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DXllY2NwYXJzMl80NTFhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncNeWVjY3BhcnMyXzQ1M2EHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdw15ZWNjcGFyczJfNDU0YQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DXllY2NwYXJzMl80NTVhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncNeWVjY3BhcnMyXzQ1NmEHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdw15ZWNjcGFyczJfNDU3YQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DXllY2NwYXJzMl80NThhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncNeWVjY3BhcnMyXzQ2MGEHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdw15ZWNjcGFyczJfNDYxYQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DXllY2NwYXJzMl80NjJhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncNeWVjY3BhcnMyXzQ2M2EHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdw15ZWNjcGFyczJfNDY0YQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DXllY2NwYXJzMl80NjZhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncNeWVjY3BhcnMyXzQ2N2EHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdw15ZWNjcGFyczJfNDY4YQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DXllY2NwYXJzMl80NjlhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncNeWVjY3BhcnMyXzQ3MGEHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdw15ZWNjcGFyczJfNDcyYQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DXllY2NwYXJzMl80NzRhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncNeWVjY3BhcnMyXzQ3NWEHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdw15ZWNjcGFyczJfNDc2YQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DXllY2NwYXJzMl80NzdhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncNeWVjY3BhcnMyXzQ3OGEHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdw15ZWNjcGFyczJfNDgwYQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DXllY2NwYXJzMl80ODFhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncNeWVjY3BhcnMyXzQ4M2EHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdw15ZWNjcGFyczJfNDg0YQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DXllY2NwYXJzMl80ODVhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncNeWVjY3BhcnMyXzQ4N2EHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdw15ZWNjcGFyczJfNDg4YQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DXllY2NwYXJzMl80ODlhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncNeWVjY3BhcnMyXzQ5MGEHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdw15ZWNjcGFyczJfNDkyYQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DXllY2NwYXJzMl80OTNhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncNeWVjY3BhcnMyXzQ5NGEHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdw15ZWNjcGFyczJfNDk1YQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DXllY2NwYXJzMl80OTZhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncNeWVjY3BhcnMyXzQ5N2EHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdw15ZWNjcGFyczJfNDk4YQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DXllY2NwYXJzMl80OTlhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncNeWVjY3BhcnMyXzUwMGEHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdw15ZWNjcGFyczJfNTAxYQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DXllY2NwYXJzMl81MDJhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncNeWVjY3BhcnMyXzUwM2EHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdw15ZWNjcGFyczJfNTA0YQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DXllY2NwYXJzMl81MDVhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncNeWVjY3BhcnMyXzUwNmEHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdw15ZWNjcGFyczJfNTA5YQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DXllY2NwYXJzMl81MTBhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncNeWVjY3BhcnMyXzUxMWEHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdw15ZWNjcGFyczJfNTEyYQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DXllY2NwYXJzMl81MTNhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncNeWVjY3BhcnMyXzUxNGEHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdw15ZWNjcGFyczJfNTE2YQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DXllY2NwYXJzMl81MTdhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncNeWVjY3BhcnMyXzUxOGEHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdw15ZWNjcGFyczJfNTIwYQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DXllY2NwYXJzMl81MjJhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncNeWVjY3BhcnMyXzUyNGEHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdw15ZWNjcGFyczJfNTI1YQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DXllY2NwYXJzMl81MjZhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncNeWVjY3BhcnMyXzUyN2EHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdw15ZWNjcGFyczJfNTI4YQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DXllY2NwYXJzMl81MjlhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncNeWVjY3BhcnMyXzUzMWEHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdw15ZWNjcGFyczJfNTMyYQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DXllY2NwYXJzMl81MzNhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncNeWVjY3BhcnMyXzUzNGEHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdw15ZWNjcGFyczJfNTM1YQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DXllY2NwYXJzMl81MzZhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncNeWVjY3BhcnMyXzUzN2EHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdw15ZWNjcGFyczJfNTM5YQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DXllY2NwYXJzMl81NDBhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncNeWVjY3BhcnMyXzU0MmEHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdw15ZWNjcGFyczJfNTQzYQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DXllY2NwYXJzMl81NDRhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncNeWVjY3BhcnMyXzU0NmEHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdw15ZWNjcGFyczJfNTQ3YQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DXllY2NwYXJzMl81NDhhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncNeWVjY3BhcnMyXzU0OWEHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdw15ZWNjcGFyczJfNTUwYQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DXllY2NwYXJzMl81NTJhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncNeWVjY3BhcnMyXzU1M2EHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdw15ZWNjcGFyczJfNTU0YQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DXllY2NwYXJzMl81NTZhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncNeWVjY3BhcnMyXzU1N2EHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdw15ZWNjcGFyczJfNTU4YQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DXllY2NwYXJzMl81NTlhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncNeWVjY3BhcnMyXzU2MGEHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdw15ZWNjcGFyczJfNTYyYQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DXllY2NwYXJzMl81NjNhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncNeWVjY3BhcnMyXzU2NWEHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdw15ZWNjcGFyczJfNTY2YQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DXllY2NwYXJzMl81NjdhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncNeWVjY3BhcnMyXzU2OGEHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdw15ZWNjcGFyczJfNTY5YQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DXllY2NwYXJzMl81NzBhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncNeWVjY3BhcnMyXzU3MWEHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdw15ZWNjcGFyczJfNTcyYQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DXllY2NwYXJzMl81NzNhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncNeWVjY3BhcnMyXzU3NGEHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdw15ZWNjcGFyczJfNTc1YQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DXllY2NwYXJzMl81NzZhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncNeWVjY3BhcnMyXzU3N2EHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdw15ZWNjcGFyczJfNTc4YQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DXllY2NwYXJzMl81NzlhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncNeWVjY3BhcnMyXzU4MGEHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdw15ZWNjcGFyczJfNTgyYQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DXllY2NwYXJzMl81ODNhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncNeWVjY3BhcnMyXzU4NWEHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdw15ZWNjcGFyczJfNTg2YQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DXllY2NwYXJzMl81OTBhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncNeWVjY3BhcnMyXzU5MWEHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdw15ZWNjcGFyczJfNTkyYQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DXllY2NwYXJzMl81OTNhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncNeWVjY3BhcnMyXzU5NGEHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdw15ZWNjcGFyczJfNTk1YQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DXllY2NwYXJzMl81OTZhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncNeWVjY3BhcnMyXzU5N2EHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdw15ZWNjcGFyczJfNTk4YQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DXllY2NwYXJzMl81OTlhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncNeWVjY3BhcnMyXzYwMGEHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdw15ZWNjcGFyczJfNjAxYQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DXllY2NwYXJzMl82MDNhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncNeWVjY3BhcnMyXzYwNWEHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdw15ZWNjcGFyczJfNjA2YQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DXllY2NwYXJzMl82MDdhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncNeWVjY3BhcnMyXzYwOGEHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdw15ZWNjcGFyczJfNjEwYQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DXllY2NwYXJzMl82MTFhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncNeWVjY3BhcnMyXzYxMmEHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdw15ZWNjcGFyczJfNjEzYQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DXllY2NwYXJzMl82MTVhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncNeWVjY3BhcnMyXzYxNmEHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdw15ZWNjcGFyczJfNjE5YQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DXllY2NwYXJzMl82MjBhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncNeWVjY3BhcnMyXzYyMWEHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdw15ZWNjcGFyczJfNjIyYQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DXllY2NwYXJzMl82MjNhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncNeWVjY3BhcnMyXzYyNGEHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdw15ZWNjcGFyczJfNjI1YQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DXllY2NwYXJzMl82MjdhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncNeWVjY3BhcnMyXzYyOGEHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdw15ZWNjcGFyczJfNjI5YQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DXllY2NwYXJzMl82MzBhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncNeWVjY3BhcnMyXzYzMWEHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdw15ZWNjcGFyczJfNjMzYQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DXllY2NwYXJzMl82MzRhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncNeWVjY3BhcnMyXzYzNmEHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdw15ZWNjcGFyczJfNjM4YQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DXllY2NwYXJzMl82MzlhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncNeWVjY3BhcnMyXzY0MGEHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdw15ZWNjcGFyczJfNjQxYQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DXllY2NwYXJzMl82NDJhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncNeWVjY3BhcnMyXzY0M2EHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdw15ZWNjcGFyczJfNjQ1YQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DXllY2NwYXJzMl82NDdhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncNeWVjY3BhcnMyXzY0OGEHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdw15ZWNjcGFyczJfNjUwYQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DXllY2NwYXJzMl82NTJhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncNeWVjY3BhcnMyXzY1M2EHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdw15ZWNjcGFyczJfNjU0YQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DXllY2NwYXJzMl82NTVhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncNeWVjY3BhcnMyXzY1NmEHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdw15ZWNjcGFyczJfNjU3YQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DXllY2NwYXJzMl82NThhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncNeWVjY3BhcnMyXzY2MGEHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdw15ZWNjcGFyczJfNjY0YQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DXllY2NwYXJzMl82NjVhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncNeWVjY3BhcnMyXzY2NmEHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdw15ZWNjcGFyczJfNjY4YQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DXllY2NwYXJzMl82NjlhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncNeWVjY3BhcnMyXzY3MGEHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdw15ZWNjcGFyczJfNjczYQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DXllY2NwYXJzMl82NzRhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncNeWVjY3BhcnMyXzY3NmEHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdw15ZWNjcGFyczJfNjc3YQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DXllY2NwYXJzMl82NzhhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncNeWVjY3BhcnMyXzY3OWEHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdw15ZWNjcGFyczJfNjgwYQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DXllY2NwYXJzMl82ODJhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncNeWVjY3BhcnMyXzY4M2EHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdw15ZWNjcGFyczJfNjg0YQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DXllY2NwYXJzMl82ODVhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncNeWVjY3BhcnMyXzY4NmEHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdw95ZWNjZ290b19hZGRfb3BhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncWeWVjY2dvdG9fYXJndW1lbnRfbGlzdGEHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdxR5ZWNjZ290b19hdG9tX29yX3ZhcmEHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdw95ZWNjZ290b19hdG9taWNhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncReWVjY2dvdG9fYXR0cl92YWxhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncSeWVjY2dvdG9fYXR0cmlidXRlYQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3FnllY2Nnb3RvX2Jpbl9iYXNlX3R5cGVhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncUeWVjY2dvdG9fYmluX2VsZW1lbnRhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncVeWVjY2dvdG9fYmluX2VsZW1lbnRzYQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3FnllY2Nnb3RvX2Jpbl91bml0X3R5cGVhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncPeWVjY2dvdG9fYmluYXJ5YQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3HXllY2Nnb3RvX2JpbmFyeV9jb21wcmVoZW5zaW9uYQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3FHllY2Nnb3RvX2JpbmFyeV90eXBlYQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3EXllY2Nnb3RvX2JpdF9leHByYQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3FnllY2Nnb3RvX2JpdF9zaXplX2V4cHJhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncReWVjY2dvdG9fYml0X3R5cGVhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncWeWVjY2dvdG9fYml0X3R5cGVfbGlzdGEHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdxJ5ZWNjZ290b19jYXNlX2V4cHJhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncUeWVjY2dvdG9fY2xhdXNlX2FyZ3NhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncUeWVjY2dvdG9fY2xhdXNlX2JvZHlhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncaeWVjY2dvdG9fY2xhdXNlX2JvZHlfZXhwcnNhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncVeWVjY2dvdG9fY2xhdXNlX2d1YXJkYQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3EHllY2Nnb3RvX2NvbXBfb3BhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncSeWVjY2dvdG9fY3JfY2xhdXNlYQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3E3llY2Nnb3RvX2NyX2NsYXVzZXNhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncNeWVjY2dvdG9fZXhwcmEHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdxF5ZWNjZ290b19leHByX21heGEHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdxR5ZWNjZ290b19leHByX3JlbW90ZWEHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdw55ZWNjZ290b19leHByc2EHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdxN5ZWNjZ290b19maWVsZF90eXBlYQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3FHllY2Nnb3RvX2ZpZWxkX3R5cGVzYQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DXllY2Nnb3RvX2Zvcm1hB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncTeWVjY2dvdG9fZnVuX2NsYXVzZWEHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdxR5ZWNjZ290b19mdW5fY2xhdXNlc2EHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdxF5ZWNjZ290b19mdW5fZXhwcmEHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdxF5ZWNjZ290b19mdW5fdHlwZWEHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdxF5ZWNjZ290b19mdW5jdGlvbmEHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdxZ5ZWNjZ290b19mdW5jdGlvbl9jYWxsYQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3GHllY2Nnb3RvX2Z1bmN0aW9uX2NsYXVzZWEHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdxl5ZWNjZ290b19mdW5jdGlvbl9jbGF1c2VzYQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DnllY2Nnb3RvX2d1YXJkYQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3EnllY2Nnb3RvX2lmX2NsYXVzZWEHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdxN5ZWNjZ290b19pZl9jbGF1c2VzYQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3EHllY2Nnb3RvX2lmX2V4cHJhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncXeWVjY2dvdG9faW50ZWdlcl9vcl92YXJhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncQeWVjY2dvdG9fbGNfZXhwcmEHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdxF5ZWNjZ290b19sY19leHByc2EHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdw15ZWNjZ290b19saXN0YQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3G3llY2Nnb3RvX2xpc3RfY29tcHJlaGVuc2lvbmEHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdxB5ZWNjZ290b19saXN0X29wYQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3GnllY2Nnb3RvX21hcF9jb21wcmVoZW5zaW9uYQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3EXllY2Nnb3RvX21hcF9leHByYQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3EnllY2Nnb3RvX21hcF9maWVsZGEHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdxh5ZWNjZ290b19tYXBfZmllbGRfYXNzb2NhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncYeWVjY2dvdG9fbWFwX2ZpZWxkX2V4YWN0YQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3E3llY2Nnb3RvX21hcF9maWVsZHNhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncQeWVjY2dvdG9fbWFwX2tleWEHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdxZ5ZWNjZ290b19tYXBfcGFpcl90eXBlYQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3F3llY2Nnb3RvX21hcF9wYWlyX3R5cGVzYQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3FXllY2Nnb3RvX21hcF9wYXRfZXhwcmEHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdxJ5ZWNjZ290b19tYXBfdHVwbGVhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncTeWVjY2dvdG9fbWF5YmVfZXhwcmEHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdxR5ZWNjZ290b19tYXliZV9tYXRjaGEHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdxp5ZWNjZ290b19tYXliZV9tYXRjaF9leHByc2EHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdxB5ZWNjZ290b19tdWx0X29wYQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3GnllY2Nnb3RvX29wdF9iaXRfc2l6ZV9leHByYQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3GnllY2Nnb3RvX29wdF9iaXRfdHlwZV9saXN0YQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3GnllY2Nnb3RvX3BhdF9hcmd1bWVudF9saXN0YQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3EXllY2Nnb3RvX3BhdF9leHByYQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3FXllY2Nnb3RvX3BhdF9leHByX21heGEHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdxJ5ZWNjZ290b19wYXRfZXhwcnNhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncSeWVjY2dvdG9fcHJlZml4X29wYQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3FXllY2Nnb3RvX3JlY2VpdmVfZXhwcmEHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdxR5ZWNjZ290b19yZWNvcmRfZXhwcmEHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdxV5ZWNjZ290b19yZWNvcmRfZmllbGRhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncWeWVjY2dvdG9fcmVjb3JkX2ZpZWxkc2EHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdxh5ZWNjZ290b19yZWNvcmRfcGF0X2V4cHJhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncVeWVjY2dvdG9fcmVjb3JkX3R1cGxlYQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DnllY2Nnb3RvX3NpZ2lsYQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3EXllY2Nnb3RvX3NwZWNfZnVuYQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3F3llY2Nnb3RvX3NzYV9jaGVja19hbm5vYQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3HnllY2Nnb3RvX3NzYV9jaGVja19hbm5vX2NsYXVzZWEHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdx95ZWNjZ290b19zc2FfY2hlY2tfYW5ub19jbGF1c2VzYQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3F3llY2Nnb3RvX3NzYV9jaGVja19hcmdzYQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3HXllY2Nnb3RvX3NzYV9jaGVja19iaW5hcnlfbGl0YQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3JnllY2Nnb3RvX3NzYV9jaGVja19iaW5hcnlfbGl0X2J5dGVzX2xzYQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3InllY2Nnb3RvX3NzYV9jaGVja19iaW5hcnlfbGl0X3Jlc3RhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAnceeWVjY2dvdG9fc3NhX2NoZWNrX2NsYXVzZV9hcmdzYQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3IXllY2Nnb3RvX3NzYV9jaGVja19jbGF1c2VfYXJnc19sc2EHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdxd5ZWNjZ290b19zc2FfY2hlY2tfZXhwcmEHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdxh5ZWNjZ290b19zc2FfY2hlY2tfZXhwcnNhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncaeWVjY2dvdG9fc3NhX2NoZWNrX2Z1bl9yZWZhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncbeWVjY2dvdG9fc3NhX2NoZWNrX2xpc3RfbGl0YQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3HnllY2Nnb3RvX3NzYV9jaGVja19saXN0X2xpdF9sc2EHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdxp5ZWNjZ290b19zc2FfY2hlY2tfbWFwX2tleWEHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdyJ5ZWNjZ290b19zc2FfY2hlY2tfbWFwX2tleV9lbGVtZW50YQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3I3llY2Nnb3RvX3NzYV9jaGVja19tYXBfa2V5X2VsZW1lbnRzYQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3H3llY2Nnb3RvX3NzYV9jaGVja19tYXBfa2V5X2xpc3RhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncpeWVjY2dvdG9fc3NhX2NoZWNrX21hcF9rZXlfdHVwbGVfZWxlbWVudHNhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncWeWVjY2dvdG9fc3NhX2NoZWNrX3BhdGEHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdxd5ZWNjZ290b19zc2FfY2hlY2tfcGF0c2EHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdx55ZWNjZ290b19zc2FfY2hlY2tfd2hlbl9jbGF1c2VhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncfeWVjY2dvdG9fc3NhX2NoZWNrX3doZW5fY2xhdXNlc2EHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdxB5ZWNjZ290b19zdHJpbmdzYQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DXllY2Nnb3RvX3RhaWxhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncReWVjY2dvdG9fdG9wX3R5cGVhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncSeWVjY2dvdG9fdG9wX3R5cGVzYQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3EnllY2Nnb3RvX3RyeV9jYXRjaGEHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdxN5ZWNjZ290b190cnlfY2xhdXNlYQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3FHllY2Nnb3RvX3RyeV9jbGF1c2VzYQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3EXllY2Nnb3RvX3RyeV9leHByYQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3G3llY2Nnb3RvX3RyeV9vcHRfc3RhY2t0cmFjZWEHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdw55ZWNjZ290b190dXBsZWEHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdw15ZWNjZ290b190eXBlYQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3E3llY2Nnb3RvX3R5cGVfZ3VhcmRhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncUeWVjY2dvdG9fdHlwZV9ndWFyZHNhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncReWVjY2dvdG9fdHlwZV9zaWdhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncSeWVjY2dvdG9fdHlwZV9zaWdzYQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3EnllY2Nnb3RvX3R5cGVfc3BlY2EHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdxd5ZWNjZ290b190eXBlZF9hdHRyX3ZhbGEHamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdxN5ZWNjZ290b190eXBlZF9leHByYQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3FHllY2Nnb3RvX3R5cGVkX2V4cHJzYQdqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3HHllY2Nnb3RvX3R5cGVkX3JlY29yZF9maWVsZHNhB2poAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncMeWVjY3BhcnMyXzFfYQFqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DHllY2NwYXJzMl8yX2EBamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdwx5ZWNjcGFyczJfOF9hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncMeWVjY3BhcnMyXzlfYQFqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DXllY2NwYXJzMl8xMV9hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncNeWVjY3BhcnMyXzEyX2EBamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdw15ZWNjcGFyczJfMTNfYQFqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DXllY2NwYXJzMl8xNF9hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncNeWVjY3BhcnMyXzE3X2EBamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdw15ZWNjcGFyczJfMThfYQFqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DXllY2NwYXJzMl8xOV9hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncNeWVjY3BhcnMyXzIwX2EBamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdw15ZWNjcGFyczJfMjFfYQFqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DXllY2NwYXJzMl8yMl9hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncNeWVjY3BhcnMyXzI1X2EBamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdw15ZWNjcGFyczJfMjZfYQFqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DXllY2NwYXJzMl8yN19hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncNeWVjY3BhcnMyXzMwX2EBamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdw15ZWNjcGFyczJfMzFfYQFqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DXllY2NwYXJzMl8zMl9hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncNeWVjY3BhcnMyXzMzX2EBamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdw15ZWNjcGFyczJfMzRfYQFqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DXllY2NwYXJzMl8zNV9hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncNeWVjY3BhcnMyXzM3X2EBamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdw15ZWNjcGFyczJfMzhfYQFqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DXllY2NwYXJzMl80MF9hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncNeWVjY3BhcnMyXzQxX2EBamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdw15ZWNjcGFyczJfNDJfYQFqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DXllY2NwYXJzMl80M19hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncNeWVjY3BhcnMyXzQ0X2EBamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdw15ZWNjcGFyczJfNDZfYQFqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DXllY2NwYXJzMl80N19hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncNeWVjY3BhcnMyXzQ4X2EBamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdw15ZWNjcGFyczJfNDlfYQFqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DXllY2NwYXJzMl81MF9hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncNeWVjY3BhcnMyXzUxX2EBamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdw15ZWNjcGFyczJfNTJfYQFqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DXllY2NwYXJzMl81M19hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncNeWVjY3BhcnMyXzU1X2EBamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdw15ZWNjcGFyczJfNTZfYQFqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DXllY2NwYXJzMl81N19hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncNeWVjY3BhcnMyXzU4X2EBamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdw15ZWNjcGFyczJfNTlfYQFqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DXllY2NwYXJzMl82MF9hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncNeWVjY3BhcnMyXzYxX2EBamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdw15ZWNjcGFyczJfNzRfYQFqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DXllY2NwYXJzMl83NV9hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncNeWVjY3BhcnMyXzc3X2EBamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdw15ZWNjcGFyczJfODFfYQFqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DXllY2NwYXJzMl84M19hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncNeWVjY3BhcnMyXzg1X2EBamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdw15ZWNjcGFyczJfODZfYQFqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DXllY2NwYXJzMl85M19hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncNeWVjY3BhcnMyXzk0X2EBamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdw15ZWNjcGFyczJfOTVfYQFqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DXllY2NwYXJzMl85Nl9hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncNeWVjY3BhcnMyXzk3X2EBamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdw15ZWNjcGFyczJfOThfYQFqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DXllY2NwYXJzMl85OV9hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzEwMF9hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzEwMl9hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzEwM19hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzEwNF9hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzEwNV9hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzEwNl9hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzEwN19hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzEwOF9hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzExMF9hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzExMV9hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzExMl9hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzExM19hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzExNF9hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzExNV9hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzExNl9hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzExOF9hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzEyMF9hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzEyMV9hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzEyMl9hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzEyNF9hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzEyNV9hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzEyNl9hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzEyN19hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzEyOF9hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzEyOV9hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzEzMF9hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzEzM19hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzEzNF9hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzEzNV9hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzE0NV9hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzE1MF9hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzE1NF9hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzE1Nl9hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzE1N19hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzE1OF9hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzE1OV9hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzE2MV9hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzE2NV9hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzE2Nl9hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzE2OF9hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzE2OV9hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzE3M19hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzE3NF9hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzE3NV9hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzE4MV9hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzE4Ml9hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzE4NV9hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzE4Nl9hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzE4OF9hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzE4OV9hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzE5Ml9hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzE5M19hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzE5NF9hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzE5N19hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzE5OF9hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzIwMV9hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzIwMl9hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzIwM19hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzIwNF9hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzIwNV9hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzIwNl9hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzIwOV9hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzIxMV9hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzIxNF9hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzIxNV9hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzIxNl9hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzIxN19hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzIxOV9hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzIyMV9hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzIyMl9hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzIyNF9hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzIyNV9hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzIyN19hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzIyOF9hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzIzMV9hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzIzMl9hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzIzM19hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzIzNl9hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzIzN19hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzIzOV9hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzI0MV9hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzI0Ml9hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzI0NF9hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzI0NV9hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzI0Nl9hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzI0N19hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzI0OF9hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzI0OV9hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzI1MF9hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzI1NF9hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzI1N19hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzI1OV9hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzI2MF9hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzI2MV9hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzI2M19hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzI2NF9hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzI2Nl9hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzI2OF9hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzI3MF9hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzI3MV9hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzI3Ml9hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzI3M19hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzI3OF9hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzI3OV9hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzI4MF9hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncPeWVjY3BhcnMyXzI4MV8hYQFqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3D3llY2NwYXJzMl8yODFfKWEBamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdw95ZWNjcGFyczJfMjgxXyxhAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncQeWVjY3BhcnMyXzI4MV8tPmEBamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdxB5ZWNjcGFyczJfMjgxXzo6YQFqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3EHllY2NwYXJzMl8yODFfOj1hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncPeWVjY3BhcnMyXzI4MV87YQFqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3EHllY2NwYXJzMl8yODFfPC1hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncPeWVjY3BhcnMyXzI4MV89YQFqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3EHllY2NwYXJzMl8yODFfPT5hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncQeWVjY3BhcnMyXzI4MV8+PmEBamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdxB5ZWNjcGFyczJfMjgxXz89YQFqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3D3llY2NwYXJzMl8yODFfXWEBamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdxN5ZWNjcGFyczJfMjgxX2FmdGVyYQFqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3FXllY2NwYXJzMl8yODFfYW5kYWxzb2EBamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdxN5ZWNjcGFyczJfMjgxX2NhdGNoYQFqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3EXllY2NwYXJzMl8yODFfZG90YQFqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3EnllY2NwYXJzMl8yODFfZWxzZWEBamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdxF5ZWNjcGFyczJfMjgxX2VuZGEBamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdxB5ZWNjcGFyczJfMjgxX29mYQFqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3FHllY2NwYXJzMl8yODFfb3JlbHNlYQFqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3EnllY2NwYXJzMl8yODFfd2hlbmEBamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdw95ZWNjcGFyczJfMjgxX3xhAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncQeWVjY3BhcnMyXzI4MV98fGEBamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdw95ZWNjcGFyczJfMjgxX31hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzI4Ml9hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzI4M19hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzI4NV9hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzI4Nl9hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzI4N19hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzI4OF9hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzI5MF9hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzI5MV9hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzI5OF9hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzI5OV9hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzMwMF9hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncPeWVjY3BhcnMyXzMwMV8pYQFqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3D3llY2NwYXJzMl8zMDFfLGEBamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdxB5ZWNjcGFyczJfMzAxXy0+YQFqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3D3llY2NwYXJzMl8zMDFfOmEBamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdw95ZWNjcGFyczJfMzAxXz1hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncSeWVjY3BhcnMyXzMwMV93aGVuYQFqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DnllY2NwYXJzMl8zMDJfYQFqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DnllY2NwYXJzMl8zMDNfYQFqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DnllY2NwYXJzMl8zMDVfYQFqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DnllY2NwYXJzMl8zMDdfYQFqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DnllY2NwYXJzMl8zMDhfYQFqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DnllY2NwYXJzMl8zMTBfYQFqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DnllY2NwYXJzMl8zMTJfYQFqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DnllY2NwYXJzMl8zMTRfYQFqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DnllY2NwYXJzMl8zMTZfYQFqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DnllY2NwYXJzMl8zMThfYQFqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DnllY2NwYXJzMl8zMjBfYQFqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DnllY2NwYXJzMl8zMjVfYQFqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DnllY2NwYXJzMl8zMjdfYQFqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DnllY2NwYXJzMl8zMzBfYQFqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DnllY2NwYXJzMl8zMzJfYQFqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DnllY2NwYXJzMl8zMzNfYQFqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DnllY2NwYXJzMl8zMzZfYQFqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DnllY2NwYXJzMl8zMzdfYQFqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DnllY2NwYXJzMl8zMzlfYQFqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DnllY2NwYXJzMl8zNDFfYQFqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DnllY2NwYXJzMl8zNDNfYQFqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DnllY2NwYXJzMl8zNDVfYQFqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DnllY2NwYXJzMl8zNDdfYQFqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DnllY2NwYXJzMl8zNDlfYQFqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DnllY2NwYXJzMl8zNTBfYQFqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DnllY2NwYXJzMl8zNTFfYQFqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DnllY2NwYXJzMl8zNTNfYQFqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DnllY2NwYXJzMl8zNTVfYQFqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DnllY2NwYXJzMl8zNTZfYQFqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DnllY2NwYXJzMl8zNTdfYQFqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DnllY2NwYXJzMl8zNTlfYQFqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DnllY2NwYXJzMl8zNjFfYQFqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DnllY2NwYXJzMl8zNjRfYQFqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DnllY2NwYXJzMl8zNjVfYQFqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DnllY2NwYXJzMl8zNjdfYQFqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DnllY2NwYXJzMl8zNjhfYQFqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DnllY2NwYXJzMl8zNjlfYQFqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DnllY2NwYXJzMl8zNzFfYQFqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DnllY2NwYXJzMl8zNzNfYQFqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DnllY2NwYXJzMl8zNzVfYQFqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DnllY2NwYXJzMl8zNzZfYQFqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DnllY2NwYXJzMl8zODBfYQFqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DnllY2NwYXJzMl8zODJfYQFqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DnllY2NwYXJzMl8zODRfYQFqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DnllY2NwYXJzMl8zODVfYQFqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DnllY2NwYXJzMl8zODdfYQFqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DnllY2NwYXJzMl8zOTNfYQFqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3D3llY2NwYXJzMl8zOTRfLGEBamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdxB5ZWNjcGFyczJfMzk0Xz4+YQFqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3D3llY2NwYXJzMl8zOTRfXWEBamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdw95ZWNjcGFyczJfMzk0X31hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzM5NF9hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzM5NV9hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzM5N19hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzM5OV9hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzQwMV9hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzQwMl9hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzQwNF9hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzQwNl9hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzQwOF9hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzQxMF9hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzQxMl9hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzQxM19hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzQxNV9hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzQxN19hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzQyMV9hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzQyNF9hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzQyNl9hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzQyOF9hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzQyOV9hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzQzMF9hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzQzMV9hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzQzM19hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzQzNF9hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzQzNV9hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzQzN19hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzQzOF9hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzQzOV9hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzQ0MV9hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzQ0M19hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzQ0Nl9hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzQ0N19hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzQ0OV9hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzQ1MF9hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzQ1NV9hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzQ1Nl9hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzQ1N19hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzQ1OF9hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzQ2MF9hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzQ2MV9hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzQ2Ml9hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzQ2M19hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzQ2N19hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzQ3MF9hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzQ3Ml9hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzQ3NF9hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzQ3Nl9hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzQ3N19hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzQ3OF9hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzQ4MF9hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzQ4M19hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzQ4NF9hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzQ4N19hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzQ4OV9hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzQ5MF9hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzQ5M19hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzQ5NF9hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzQ5NV9hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzQ5N19hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzQ5OF9hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzUwMV9hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzUwM19hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzUwNF9hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzUwNl9hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzUwOV9hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzUxMF9hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzUxMl9hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzUxNF9hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzUxNl9hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzUxN19hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzUxOF9hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzUyMF9hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzUyNF9hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzUyN19hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzUyOV9hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzUzMl9hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzUzM19hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzUzNV9hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzUzN19hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzUzOV9hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzU0Nl9hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzU0N19hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzU0OV9hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzU1MF9hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzU1M19hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzU1NF9hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzU1Nl9hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzU1OV9hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzU2MF9hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzU2Nl9hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzU2N19hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzU2OV9hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzU3MF9hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzU3Ml9hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzU3NF9hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzU3Nl9hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzU3OV9hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzU4Ml9hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzU4M19hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzU4NV9hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncOeWVjY3BhcnMyXzU4Nl9hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncPeWVjY3BhcnMyXzU5MF8pYQFqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3D3llY2NwYXJzMl81OTBfLGEBamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdxB5ZWNjcGFyczJfNTkwXzo9YQFqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3D3llY2NwYXJzMl81OTBfO2EBamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdxB5ZWNjcGFyczJfNTkwXz0+YQFqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3EHllY2NwYXJzMl81OTBfPj5hAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncPeWVjY3BhcnMyXzU5MF9dYQFqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3EXllY2NwYXJzMl81OTBfZG90YQFqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3EnllY2NwYXJzMl81OTBfd2hlbmEBamgCdwhkaWFseXplcmwAAAABaAJ3D25vd2Fybl9mdW5jdGlvbmgCdw95ZWNjcGFyczJfNTkwX3xhAWpoAncIZGlhbHl6ZXJsAAAAAWgCdw9ub3dhcm5fZnVuY3Rpb25oAncPeWVjY3BhcnMyXzU5MF99YQFqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DnllY2NwYXJzMl81OTFfYQFqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DnllY2NwYXJzMl81OTJfYQFqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DnllY2NwYXJzMl81OTRfYQFqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DnllY2NwYXJzMl81OTlfYQFqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DnllY2NwYXJzMl82MDBfYQFqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DnllY2NwYXJzMl82MDNfYQFqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DnllY2NwYXJzMl82MDVfYQFqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DnllY2NwYXJzMl82MDdfYQFqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DnllY2NwYXJzMl82MTJfYQFqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DnllY2NwYXJzMl82MTNfYQFqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DnllY2NwYXJzMl82MTVfYQFqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DnllY2NwYXJzMl82MTZfYQFqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DnllY2NwYXJzMl82MTlfYQFqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DnllY2NwYXJzMl82MjBfYQFqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DnllY2NwYXJzMl82MjNfYQFqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DnllY2NwYXJzMl82MjVfYQFqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DnllY2NwYXJzMl82MjdfYQFqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DnllY2NwYXJzMl82MjlfYQFqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DnllY2NwYXJzMl82MzBfYQFqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DnllY2NwYXJzMl82MzFfYQFqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DnllY2NwYXJzMl82MzNfYQFqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DnllY2NwYXJzMl82MzZfYQFqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DnllY2NwYXJzMl82MzhfYQFqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DnllY2NwYXJzMl82NDBfYQFqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DnllY2NwYXJzMl82NDFfYQFqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DnllY2NwYXJzMl82NDVfYQFqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DnllY2NwYXJzMl82NDhfYQFqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DnllY2NwYXJzMl82NTBfYQFqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DnllY2NwYXJzMl82NTJfYQFqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DnllY2NwYXJzMl82NTNfYQFqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DnllY2NwYXJzMl82NTRfYQFqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DnllY2NwYXJzMl82NTVfYQFqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DnllY2NwYXJzMl82NTZfYQFqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DnllY2NwYXJzMl82NTdfYQFqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DnllY2NwYXJzMl82NThfYQFqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DnllY2NwYXJzMl82NjRfYQFqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DnllY2NwYXJzMl82NjVfYQFqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DnllY2NwYXJzMl82NjlfYQFqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DnllY2NwYXJzMl82NzBfYQFqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DnllY2NwYXJzMl82NzNfYQFqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DnllY2NwYXJzMl82NzRfYQFqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DnllY2NwYXJzMl82NzZfYQFqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DnllY2NwYXJzMl82NzdfYQFqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DnllY2NwYXJzMl82NzhfYQFqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DnllY2NwYXJzMl82NzlfYQFqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DnllY2NwYXJzMl82ODBfYQFqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DnllY2NwYXJzMl82ODJfYQFqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DnllY2NwYXJzMl82ODNfYQFqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DnllY2NwYXJzMl82ODRfYQFqaAJ3CGRpYWx5emVybAAAAAFoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DnllY2NwYXJzMl82ODZfYQFqag== +Current compilation info: g2wAAAADaAJ3B3ZlcnNpb25rAAU4LjUuNGgCdwdvcHRpb25zbAAAAAZ3CmRlYnVnX2luZm9oAncBaWsARy9idWlsZC9yZXByb2R1Y2libGUtcGF0aC9lcmxhbmctMjcuMy40LjErZGZzZy9saWIvc3RkbGliL3NyYy8uLi9pbmNsdWRlaAJ3AWlrAFEvYnVpbGQvcmVwcm9kdWNpYmxlLXBhdGgvZXJsYW5nLTI3LjMuNC4xK2Rmc2cvbGliL3N0ZGxpYi9zcmMvLi4vLi4va2VybmVsL2luY2x1ZGV3GXdhcm5fbWlzc2luZ19kb2NfZnVuY3Rpb253GXdhcm5fbWlzc2luZ19kb2NfY2FsbGJhY2t3HHdhcm5fbWlzc2luZ19zcGVjX2RvY3VtZW50ZWRqaAJ3BnNvdXJjZWsASi9idWlsZC9yZXByb2R1Y2libGUtcGF0aC9lcmxhbmctMjcuMy40LjErZGZzZy9saWIvc3RkbGliL3NyYy9lcmxfcGFyc2UuZXJsag== +=mod:erl_eval +Current size: 113008 +Current attributes: g2wAAAABaAJ3A3ZzbmwAAAABbhAAJaJXF3FjJq1DHOnPWwGWm2pq +Current compilation info: g2wAAAADaAJ3B3ZlcnNpb25rAAU4LjUuNGgCdwdvcHRpb25zbAAAAAZ3CmRlYnVnX2luZm9oAncBaWsARy9idWlsZC9yZXByb2R1Y2libGUtcGF0aC9lcmxhbmctMjcuMy40LjErZGZzZy9saWIvc3RkbGliL3NyYy8uLi9pbmNsdWRlaAJ3AWlrAFEvYnVpbGQvcmVwcm9kdWNpYmxlLXBhdGgvZXJsYW5nLTI3LjMuNC4xK2Rmc2cvbGliL3N0ZGxpYi9zcmMvLi4vLi4va2VybmVsL2luY2x1ZGV3GXdhcm5fbWlzc2luZ19kb2NfZnVuY3Rpb253GXdhcm5fbWlzc2luZ19kb2NfY2FsbGJhY2t3HHdhcm5fbWlzc2luZ19zcGVjX2RvY3VtZW50ZWRqaAJ3BnNvdXJjZWsASS9idWlsZC9yZXByb2R1Y2libGUtcGF0aC9lcmxhbmctMjcuMy40LjErZGZzZy9saWIvc3RkbGliL3NyYy9lcmxfZXZhbC5lcmxq +=mod:erl_lint +Current size: 283976 +Current attributes: g2wAAAAGaAJ3A3ZzbmwAAAABbhAAgAiTY3/tfJF61r0b05I3cWpoAncHcmVtb3ZlZGwAAAABaAN3C21vZGlmeV9saW5lYQJrACB1c2UgZXJsX3BhcnNlOm1hcF9hbm5vLzIgaW5zdGVhZGpoAncIZGlhbHl6ZXJsAAAAAWgCdwhub19tYXRjaGgCdxRiZWhhdmlvdXJfZGVwcmVjYXRlZGEFamgCdwhkaWFseXplcmwAAAABaAJ3CG5vX21hdGNoaAJ3CHR5cGVfZGVmYQZqaAJ3CGRpYWx5emVybAAAAAFoAncIbm9fbWF0Y2hoAncTZGVwcmVjYXRlZF9mdW5jdGlvbmEFamgCdwhkaWFseXplcmwAAAABaAJ3CG5vX21hdGNoaAJ3D2RlcHJlY2F0ZWRfdHlwZWEFamo= +Current compilation info: g2wAAAADaAJ3B3ZlcnNpb25rAAU4LjUuNGgCdwdvcHRpb25zbAAAAAZ3CmRlYnVnX2luZm9oAncBaWsARy9idWlsZC9yZXByb2R1Y2libGUtcGF0aC9lcmxhbmctMjcuMy40LjErZGZzZy9saWIvc3RkbGliL3NyYy8uLi9pbmNsdWRlaAJ3AWlrAFEvYnVpbGQvcmVwcm9kdWNpYmxlLXBhdGgvZXJsYW5nLTI3LjMuNC4xK2Rmc2cvbGliL3N0ZGxpYi9zcmMvLi4vLi4va2VybmVsL2luY2x1ZGV3GXdhcm5fbWlzc2luZ19kb2NfZnVuY3Rpb253GXdhcm5fbWlzc2luZ19kb2NfY2FsbGJhY2t3HHdhcm5fbWlzc2luZ19zcGVjX2RvY3VtZW50ZWRqaAJ3BnNvdXJjZWsASS9idWlsZC9yZXByb2R1Y2libGUtcGF0aC9lcmxhbmctMjcuMy40LjErZGZzZy9saWIvc3RkbGliL3NyYy9lcmxfbGludC5lcmxq +=mod:gen_event +Current size: 62976 +Current attributes: g2wAAAADaAJ3A3ZzbmwAAAABbhAAGI8XwK89ElHXwZqdByjhu2poAncJYmVoYXZpb3VybAAAAAF3A3N5c2poAncTZGVwcmVjYXRlZF9jYWxsYmFja2wAAAABaAN3DWZvcm1hdF9zdGF0dXNhAmsAG3VzZSBmb3JtYXRfc3RhdHVzLzEgaW5zdGVhZGpq +Current compilation info: g2wAAAADaAJ3B3ZlcnNpb25rAAU4LjUuNGgCdwdvcHRpb25zbAAAAAZ3CmRlYnVnX2luZm9oAncBaWsARy9idWlsZC9yZXByb2R1Y2libGUtcGF0aC9lcmxhbmctMjcuMy40LjErZGZzZy9saWIvc3RkbGliL3NyYy8uLi9pbmNsdWRlaAJ3AWlrAFEvYnVpbGQvcmVwcm9kdWNpYmxlLXBhdGgvZXJsYW5nLTI3LjMuNC4xK2Rmc2cvbGliL3N0ZGxpYi9zcmMvLi4vLi4va2VybmVsL2luY2x1ZGV3GXdhcm5fbWlzc2luZ19kb2NfZnVuY3Rpb253GXdhcm5fbWlzc2luZ19kb2NfY2FsbGJhY2t3HHdhcm5fbWlzc2luZ19zcGVjX2RvY3VtZW50ZWRqaAJ3BnNvdXJjZWsASi9idWlsZC9yZXByb2R1Y2libGUtcGF0aC9lcmxhbmctMjcuMy40LjErZGZzZy9saWIvc3RkbGliL3NyYy9nZW5fZXZlbnQuZXJsag== +=mod:logger_server +Current size: 35440 +Current attributes: g2wAAAACaAJ3A3ZzbmwAAAABbhAAtKtgXSD851lm9folR5pLhWpoAncJYmVoYXZpb3VybAAAAAF3Cmdlbl9zZXJ2ZXJqag== +Current compilation info: g2wAAAADaAJ3B3ZlcnNpb25rAAU4LjUuNGgCdwdvcHRpb25zbAAAAAV3CmRlYnVnX2luZm9oAncBaWsARy9idWlsZC9yZXByb2R1Y2libGUtcGF0aC9lcmxhbmctMjcuMy40LjErZGZzZy9saWIva2VybmVsL3NyYy8uLi9pbmNsdWRldxl3YXJuX21pc3NpbmdfZG9jX2Z1bmN0aW9udxl3YXJuX21pc3NpbmdfZG9jX2NhbGxiYWNrdxx3YXJuX21pc3Npbmdfc3BlY19kb2N1bWVudGVkamgCdwZzb3VyY2VrAE4vYnVpbGQvcmVwcm9kdWNpYmxlLXBhdGgvZXJsYW5nLTI3LjMuNC4xK2Rmc2cvbGliL2tlcm5lbC9zcmMvbG9nZ2VyX3NlcnZlci5lcmxq +=mod:logger_simple_h +Current size: 17224 +Current attributes: g2wAAAACaAJ3A3ZzbmwAAAABbhAADe4nmM/cwQDRnt2DUkJNYGpoAncJYmVoYXZpb3VybAAAAAF3DmxvZ2dlcl9oYW5kbGVyamo= +Current compilation info: g2wAAAADaAJ3B3ZlcnNpb25rAAU4LjUuNGgCdwdvcHRpb25zbAAAAAV3CmRlYnVnX2luZm9oAncBaWsARy9idWlsZC9yZXByb2R1Y2libGUtcGF0aC9lcmxhbmctMjcuMy40LjErZGZzZy9saWIva2VybmVsL3NyYy8uLi9pbmNsdWRldxl3YXJuX21pc3NpbmdfZG9jX2Z1bmN0aW9udxl3YXJuX21pc3NpbmdfZG9jX2NhbGxiYWNrdxx3YXJuX21pc3Npbmdfc3BlY19kb2N1bWVudGVkamgCdwZzb3VyY2VrAFAvYnVpbGQvcmVwcm9kdWNpYmxlLXBhdGgvZXJsYW5nLTI3LjMuNC4xK2Rmc2cvbGliL2tlcm5lbC9zcmMvbG9nZ2VyX3NpbXBsZV9oLmVybGo= +=mod:lists +Current size: 117944 +Current attributes: g2wAAAACaAJ3A3ZzbmwAAAABbhAAoVewCoYFBN2Dz4P9a60+vWpoAncIZGlhbHl6ZXJsAAAAAWgCdxFub19pbXByb3Blcl9saXN0c2gCdwp1a2V5bWVyZ2VsYQNqag== +Current compilation info: g2wAAAADaAJ3B3ZlcnNpb25rAAU4LjUuNGgCdwdvcHRpb25zbAAAAAZ3CmRlYnVnX2luZm9oAncBaWsARy9idWlsZC9yZXByb2R1Y2libGUtcGF0aC9lcmxhbmctMjcuMy40LjErZGZzZy9saWIvc3RkbGliL3NyYy8uLi9pbmNsdWRlaAJ3AWlrAFEvYnVpbGQvcmVwcm9kdWNpYmxlLXBhdGgvZXJsYW5nLTI3LjMuNC4xK2Rmc2cvbGliL3N0ZGxpYi9zcmMvLi4vLi4va2VybmVsL2luY2x1ZGV3GXdhcm5fbWlzc2luZ19kb2NfZnVuY3Rpb253GXdhcm5fbWlzc2luZ19kb2NfY2FsbGJhY2t3HHdhcm5fbWlzc2luZ19zcGVjX2RvY3VtZW50ZWRqaAJ3BnNvdXJjZWsARi9idWlsZC9yZXByb2R1Y2libGUtcGF0aC9lcmxhbmctMjcuMy40LjErZGZzZy9saWIvc3RkbGliL3NyYy9saXN0cy5lcmxq +=mod:supervisor +Current size: 91192 +Current attributes: g2wAAAACaAJ3A3ZzbmwAAAABbhAAlCrTQo0uamT+lGsRrLlZqGpoAncJYmVoYXZpb3VybAAAAAF3Cmdlbl9zZXJ2ZXJqag== +Current compilation info: g2wAAAADaAJ3B3ZlcnNpb25rAAU4LjUuNGgCdwdvcHRpb25zbAAAAAZ3CmRlYnVnX2luZm9oAncBaWsARy9idWlsZC9yZXByb2R1Y2libGUtcGF0aC9lcmxhbmctMjcuMy40LjErZGZzZy9saWIvc3RkbGliL3NyYy8uLi9pbmNsdWRlaAJ3AWlrAFEvYnVpbGQvcmVwcm9kdWNpYmxlLXBhdGgvZXJsYW5nLTI3LjMuNC4xK2Rmc2cvbGliL3N0ZGxpYi9zcmMvLi4vLi4va2VybmVsL2luY2x1ZGV3GXdhcm5fbWlzc2luZ19kb2NfZnVuY3Rpb253GXdhcm5fbWlzc2luZ19kb2NfY2FsbGJhY2t3HHdhcm5fbWlzc2luZ19zcGVjX2RvY3VtZW50ZWRqaAJ3BnNvdXJjZWsASy9idWlsZC9yZXByb2R1Y2libGUtcGF0aC9lcmxhbmctMjcuMy40LjErZGZzZy9saWIvc3RkbGliL3NyYy9zdXBlcnZpc29yLmVybGo= +=mod:ets +Current size: 69400 +Current attributes: g2wAAAABaAJ3A3ZzbmwAAAABbhAAkzAsqpvPnAZC7NHzKWBozGpq +Current compilation info: g2wAAAADaAJ3B3ZlcnNpb25rAAU4LjUuNGgCdwdvcHRpb25zbAAAAAZ3CmRlYnVnX2luZm9oAncBaWsARy9idWlsZC9yZXByb2R1Y2libGUtcGF0aC9lcmxhbmctMjcuMy40LjErZGZzZy9saWIvc3RkbGliL3NyYy8uLi9pbmNsdWRlaAJ3AWlrAFEvYnVpbGQvcmVwcm9kdWNpYmxlLXBhdGgvZXJsYW5nLTI3LjMuNC4xK2Rmc2cvbGliL3N0ZGxpYi9zcmMvLi4vLi4va2VybmVsL2luY2x1ZGV3GXdhcm5fbWlzc2luZ19kb2NfZnVuY3Rpb253GXdhcm5fbWlzc2luZ19kb2NfY2FsbGJhY2t3HHdhcm5fbWlzc2luZ19zcGVjX2RvY3VtZW50ZWRqaAJ3BnNvdXJjZWsARC9idWlsZC9yZXByb2R1Y2libGUtcGF0aC9lcmxhbmctMjcuMy40LjErZGZzZy9saWIvc3RkbGliL3NyYy9ldHMuZXJsag== +=mod:proc_lib +Current size: 54704 +Current attributes: g2wAAAABaAJ3A3ZzbmwAAAABbhAAJ+bt3R8c8UgFCGWpp5/ctmpq +Current compilation info: g2wAAAADaAJ3B3ZlcnNpb25rAAU4LjUuNGgCdwdvcHRpb25zbAAAAAZ3CmRlYnVnX2luZm9oAncBaWsARy9idWlsZC9yZXByb2R1Y2libGUtcGF0aC9lcmxhbmctMjcuMy40LjErZGZzZy9saWIvc3RkbGliL3NyYy8uLi9pbmNsdWRlaAJ3AWlrAFEvYnVpbGQvcmVwcm9kdWNpYmxlLXBhdGgvZXJsYW5nLTI3LjMuNC4xK2Rmc2cvbGliL3N0ZGxpYi9zcmMvLi4vLi4va2VybmVsL2luY2x1ZGV3GXdhcm5fbWlzc2luZ19kb2NfZnVuY3Rpb253GXdhcm5fbWlzc2luZ19kb2NfY2FsbGJhY2t3HHdhcm5fbWlzc2luZ19zcGVjX2RvY3VtZW50ZWRqaAJ3BnNvdXJjZWsASS9idWlsZC9yZXByb2R1Y2libGUtcGF0aC9lcmxhbmctMjcuMy40LjErZGZzZy9saWIvc3RkbGliL3NyYy9wcm9jX2xpYi5lcmxq +=mod:gen_server +Current size: 74592 +Current attributes: g2wAAAAEaAJ3A3ZzbmwAAAABbhAALdjX3Vs+FD6Lotl59oDoPGpoAncJYmVoYXZpb3VybAAAAAF3A3N5c2poAncTZGVwcmVjYXRlZF9jYWxsYmFja2wAAAABaAN3DWZvcm1hdF9zdGF0dXNhAmsAG3VzZSBmb3JtYXRfc3RhdHVzLzEgaW5zdGVhZGpoAncIZGlhbHl6ZXJsAAAAAWgCdxFub19pbXByb3Blcl9saXN0c2gCdwdtY19zZW5kYQZqag== +Current compilation info: g2wAAAADaAJ3B3ZlcnNpb25rAAU4LjUuNGgCdwdvcHRpb25zbAAAAAZ3CmRlYnVnX2luZm9oAncBaWsARy9idWlsZC9yZXByb2R1Y2libGUtcGF0aC9lcmxhbmctMjcuMy40LjErZGZzZy9saWIvc3RkbGliL3NyYy8uLi9pbmNsdWRlaAJ3AWlrAFEvYnVpbGQvcmVwcm9kdWNpYmxlLXBhdGgvZXJsYW5nLTI3LjMuNC4xK2Rmc2cvbGliL3N0ZGxpYi9zcmMvLi4vLi4va2VybmVsL2luY2x1ZGV3GXdhcm5fbWlzc2luZ19kb2NfZnVuY3Rpb253GXdhcm5fbWlzc2luZ19kb2NfY2FsbGJhY2t3HHdhcm5fbWlzc2luZ19zcGVjX2RvY3VtZW50ZWRqaAJ3BnNvdXJjZWsASy9idWlsZC9yZXByb2R1Y2libGUtcGF0aC9lcmxhbmctMjcuMy40LjErZGZzZy9saWIvc3RkbGliL3NyYy9nZW5fc2VydmVyLmVybGo= +=mod:filename +Current size: 49208 +Current attributes: g2wAAAADaAJ3A3ZzbmwAAAABbhAAmEkxT7O1oJRbECWKPHFvYWpoAncHcmVtb3ZlZGwAAAABaAN3CGZpbmRfc3JjdwFfawAjdXNlIGZpbGVsaWI6ZmluZF9zb3VyY2UvMSwzIGluc3RlYWRqaAJ3B3JlbW92ZWRsAAAAAWgDdxJzYWZlX3JlbGF0aXZlX3BhdGhhAWsAKHVzZSBmaWxlbGliOnNhZmVfcmVsYXRpdmVfcGF0aC8yIGluc3RlYWRqag== +Current compilation info: g2wAAAADaAJ3B3ZlcnNpb25rAAU4LjUuNGgCdwdvcHRpb25zbAAAAAZ3CmRlYnVnX2luZm9oAncBaWsARy9idWlsZC9yZXByb2R1Y2libGUtcGF0aC9lcmxhbmctMjcuMy40LjErZGZzZy9saWIvc3RkbGliL3NyYy8uLi9pbmNsdWRlaAJ3AWlrAFEvYnVpbGQvcmVwcm9kdWNpYmxlLXBhdGgvZXJsYW5nLTI3LjMuNC4xK2Rmc2cvbGliL3N0ZGxpYi9zcmMvLi4vLi4va2VybmVsL2luY2x1ZGV3GXdhcm5fbWlzc2luZ19kb2NfZnVuY3Rpb253GXdhcm5fbWlzc2luZ19kb2NfY2FsbGJhY2t3HHdhcm5fbWlzc2luZ19zcGVjX2RvY3VtZW50ZWRqaAJ3BnNvdXJjZWsASS9idWlsZC9yZXByb2R1Y2libGUtcGF0aC9lcmxhbmctMjcuMy40LjErZGZzZy9saWIvc3RkbGliL3NyYy9maWxlbmFtZS5lcmxq +=mod:logger_config +Current size: 11352 +Current attributes: g2wAAAABaAJ3A3ZzbmwAAAABbhAArU+rD2/XfNsRgD30fbsHS2pq +Current compilation info: g2wAAAADaAJ3B3ZlcnNpb25rAAU4LjUuNGgCdwdvcHRpb25zbAAAAAV3CmRlYnVnX2luZm9oAncBaWsARy9idWlsZC9yZXByb2R1Y2libGUtcGF0aC9lcmxhbmctMjcuMy40LjErZGZzZy9saWIva2VybmVsL3NyYy8uLi9pbmNsdWRldxl3YXJuX21pc3NpbmdfZG9jX2Z1bmN0aW9udxl3YXJuX21pc3NpbmdfZG9jX2NhbGxiYWNrdxx3YXJuX21pc3Npbmdfc3BlY19kb2N1bWVudGVkamgCdwZzb3VyY2VrAE4vYnVpbGQvcmVwcm9kdWNpYmxlLXBhdGgvZXJsYW5nLTI3LjMuNC4xK2Rmc2cvbGliL2tlcm5lbC9zcmMvbG9nZ2VyX2NvbmZpZy5lcmxq +=mod:gen +Current size: 34760 +Current attributes: g2wAAAADaAJ3A3ZzbmwAAAABbhAAN84ak2r6xelNxgccMfDHhmpoAncIZGlhbHl6ZXJsAAAAAWgCdxFub19pbXByb3Blcl9saXN0c2gCdwdkb19jYWxsYQRqaAJ3CGRpYWx5emVybAAAAAFoAncRbm9faW1wcm9wZXJfbGlzdHNoAncPZG9fc2VuZF9yZXF1ZXN0YQNqag== +Current compilation info: g2wAAAADaAJ3B3ZlcnNpb25rAAU4LjUuNGgCdwdvcHRpb25zbAAAAAZ3CmRlYnVnX2luZm9oAncBaWsARy9idWlsZC9yZXByb2R1Y2libGUtcGF0aC9lcmxhbmctMjcuMy40LjErZGZzZy9saWIvc3RkbGliL3NyYy8uLi9pbmNsdWRlaAJ3AWlrAFEvYnVpbGQvcmVwcm9kdWNpYmxlLXBhdGgvZXJsYW5nLTI3LjMuNC4xK2Rmc2cvbGliL3N0ZGxpYi9zcmMvLi4vLi4va2VybmVsL2luY2x1ZGV3GXdhcm5fbWlzc2luZ19kb2NfZnVuY3Rpb253GXdhcm5fbWlzc2luZ19kb2NfY2FsbGJhY2t3HHdhcm5fbWlzc2luZ19zcGVjX2RvY3VtZW50ZWRqaAJ3BnNvdXJjZWsARC9idWlsZC9yZXByb2R1Y2libGUtcGF0aC9lcmxhbmctMjcuMy40LjErZGZzZy9saWIvc3RkbGliL3NyYy9nZW4uZXJsag== +=mod:application_controller +Current size: 127728 +Current attributes: g2wAAAABaAJ3A3ZzbmwAAAABbhAAHSe+PUgF1u9kKUPsiffHhmpq +Current compilation info: g2wAAAADaAJ3B3ZlcnNpb25rAAU4LjUuNGgCdwdvcHRpb25zbAAAAAV3CmRlYnVnX2luZm9oAncBaWsARy9idWlsZC9yZXByb2R1Y2libGUtcGF0aC9lcmxhbmctMjcuMy40LjErZGZzZy9saWIva2VybmVsL3NyYy8uLi9pbmNsdWRldxl3YXJuX21pc3NpbmdfZG9jX2Z1bmN0aW9udxl3YXJuX21pc3NpbmdfZG9jX2NhbGxiYWNrdxx3YXJuX21pc3Npbmdfc3BlY19kb2N1bWVudGVkamgCdwZzb3VyY2VrAFcvYnVpbGQvcmVwcm9kdWNpYmxlLXBhdGgvZXJsYW5nLTI3LjMuNC4xK2Rmc2cvbGliL2tlcm5lbC9zcmMvYXBwbGljYXRpb25fY29udHJvbGxlci5lcmxq +=mod:logger_filters +Current size: 5320 +Current attributes: g2wAAAABaAJ3A3ZzbmwAAAABbhAAis5/rj5up1rbyjSjBSe7B2pq +Current compilation info: g2wAAAADaAJ3B3ZlcnNpb25rAAU4LjUuNGgCdwdvcHRpb25zbAAAAAV3CmRlYnVnX2luZm9oAncBaWsARy9idWlsZC9yZXByb2R1Y2libGUtcGF0aC9lcmxhbmctMjcuMy40LjErZGZzZy9saWIva2VybmVsL3NyYy8uLi9pbmNsdWRldxl3YXJuX21pc3NpbmdfZG9jX2Z1bmN0aW9udxl3YXJuX21pc3NpbmdfZG9jX2NhbGxiYWNrdxx3YXJuX21pc3Npbmdfc3BlY19kb2N1bWVudGVkamgCdwZzb3VyY2VrAE8vYnVpbGQvcmVwcm9kdWNpYmxlLXBhdGgvZXJsYW5nLTI3LjMuNC4xK2Rmc2cvbGliL2tlcm5lbC9zcmMvbG9nZ2VyX2ZpbHRlcnMuZXJsag== +=mod:logger +Current size: 57088 +Current attributes: g2wAAAABaAJ3A3ZzbmwAAAABbhAAuex0xhwB3WzeUovENbfnW2pq +Current compilation info: g2wAAAADaAJ3B3ZlcnNpb25rAAU4LjUuNGgCdwdvcHRpb25zbAAAAAV3CmRlYnVnX2luZm9oAncBaWsARy9idWlsZC9yZXByb2R1Y2libGUtcGF0aC9lcmxhbmctMjcuMy40LjErZGZzZy9saWIva2VybmVsL3NyYy8uLi9pbmNsdWRldxl3YXJuX21pc3NpbmdfZG9jX2Z1bmN0aW9udxl3YXJuX21pc3NpbmdfZG9jX2NhbGxiYWNrdxx3YXJuX21pc3Npbmdfc3BlY19kb2N1bWVudGVkamgCdwZzb3VyY2VrAEcvYnVpbGQvcmVwcm9kdWNpYmxlLXBhdGgvZXJsYW5nLTI3LjMuNC4xK2Rmc2cvbGliL2tlcm5lbC9zcmMvbG9nZ2VyLmVybGo= +=mod:kernel +Current size: 17576 +Current attributes: g2wAAAACaAJ3A3ZzbmwAAAABbhAAFfK4msve+mX5aNMWb2mcCGpoAncJYmVoYXZpb3VybAAAAAF3CnN1cGVydmlzb3Jqag== +Current compilation info: g2wAAAADaAJ3B3ZlcnNpb25rAAU4LjUuNGgCdwdvcHRpb25zbAAAAAV3CmRlYnVnX2luZm9oAncBaWsARy9idWlsZC9yZXByb2R1Y2libGUtcGF0aC9lcmxhbmctMjcuMy40LjErZGZzZy9saWIva2VybmVsL3NyYy8uLi9pbmNsdWRldxl3YXJuX21pc3NpbmdfZG9jX2Z1bmN0aW9udxl3YXJuX21pc3NpbmdfZG9jX2NhbGxiYWNrdxx3YXJuX21pc3Npbmdfc3BlY19kb2N1bWVudGVkamgCdwZzb3VyY2VrAEcvYnVpbGQvcmVwcm9kdWNpYmxlLXBhdGgvZXJsYW5nLTI3LjMuNC4xK2Rmc2cvbGliL2tlcm5lbC9zcmMva2VybmVsLmVybGo= +=mod:file_io_server +Current size: 51344 +Current attributes: g2wAAAABaAJ3A3ZzbmwAAAABbhAAxmpKAp1G4aMqirmcOVmHY2pq +Current compilation info: g2wAAAADaAJ3B3ZlcnNpb25rAAU4LjUuNGgCdwdvcHRpb25zbAAAAAV3CmRlYnVnX2luZm9oAncBaWsARy9idWlsZC9yZXByb2R1Y2libGUtcGF0aC9lcmxhbmctMjcuMy40LjErZGZzZy9saWIva2VybmVsL3NyYy8uLi9pbmNsdWRldxl3YXJuX21pc3NpbmdfZG9jX2Z1bmN0aW9udxl3YXJuX21pc3NpbmdfZG9jX2NhbGxiYWNrdxx3YXJuX21pc3Npbmdfc3BlY19kb2N1bWVudGVkamgCdwZzb3VyY2VrAE8vYnVpbGQvcmVwcm9kdWNpYmxlLXBhdGgvZXJsYW5nLTI3LjMuNC4xK2Rmc2cvbGliL2tlcm5lbC9zcmMvZmlsZV9pb19zZXJ2ZXIuZXJsag== +=mod:file_server +Current size: 14864 +Current attributes: g2wAAAACaAJ3A3ZzbmwAAAABbhAADSpzj10rRpUd6+v9flrR1GpoAncJYmVoYXZpb3VybAAAAAF3Cmdlbl9zZXJ2ZXJqag== +Current compilation info: g2wAAAADaAJ3B3ZlcnNpb25rAAU4LjUuNGgCdwdvcHRpb25zbAAAAAV3CmRlYnVnX2luZm9oAncBaWsARy9idWlsZC9yZXByb2R1Y2libGUtcGF0aC9lcmxhbmctMjcuMy40LjErZGZzZy9saWIva2VybmVsL3NyYy8uLi9pbmNsdWRldxl3YXJuX21pc3NpbmdfZG9jX2Z1bmN0aW9udxl3YXJuX21pc3NpbmdfZG9jX2NhbGxiYWNrdxx3YXJuX21pc3Npbmdfc3BlY19kb2N1bWVudGVkamgCdwZzb3VyY2VrAEwvYnVpbGQvcmVwcm9kdWNpYmxlLXBhdGgvZXJsYW5nLTI3LjMuNC4xK2Rmc2cvbGliL2tlcm5lbC9zcmMvZmlsZV9zZXJ2ZXIuZXJsag== +=mod:file +Current size: 48504 +Current attributes: g2wAAAACaAJ3A3ZzbmwAAAABbhAALL6moop0CkukiqY+9Z/0SmpoAncHcmVtb3ZlZGwAAAABaAN3CHBpZDJuYW1lYQFrACl0aGlzIGZ1bmN0aW9uYWxpdHkgaXMgbm8gbG9uZ2VyIHN1cHBvcnRlZGpq +Current compilation info: g2wAAAADaAJ3B3ZlcnNpb25rAAU4LjUuNGgCdwdvcHRpb25zbAAAAAV3CmRlYnVnX2luZm9oAncBaWsARy9idWlsZC9yZXByb2R1Y2libGUtcGF0aC9lcmxhbmctMjcuMy40LjErZGZzZy9saWIva2VybmVsL3NyYy8uLi9pbmNsdWRldxl3YXJuX21pc3NpbmdfZG9jX2Z1bmN0aW9udxl3YXJuX21pc3NpbmdfZG9jX2NhbGxiYWNrdxx3YXJuX21pc3Npbmdfc3BlY19kb2N1bWVudGVkamgCdwZzb3VyY2VrAEUvYnVpbGQvcmVwcm9kdWNpYmxlLXBhdGgvZXJsYW5nLTI3LjMuNC4xK2Rmc2cvbGliL2tlcm5lbC9zcmMvZmlsZS5lcmxq +=mod:code +Current size: 52032 +Current attributes: g2wAAAAEaAJ3A3ZzbmwAAAABbhAARgdio5wVnpFiKPGp7AGQr2poAncHcmVtb3ZlZGwAAAABaAN3BnJlaGFzaGEAawAsdGhlIGNvZGUgcGF0aCBjYWNoZSBmZWF0dXJlIGhhcyBiZWVuIHJlbW92ZWRqaAJ3B3JlbW92ZWRsAAAAAWgDdxBpc19tb2R1bGVfbmF0aXZlYQFrABVIaVBFIGhhcyBiZWVuIHJlbW92ZWRqaAJ3CmRlcHJlY2F0ZWRsAAAAAWgDdwdsaWJfZGlyYQJrADZ0aGlzIGZ1bmN0aW9uYWxpdHkgd2lsbCBiZSByZW1vdmVkIGluIGEgZnV0dXJlIHJlbGVhc2Vqag== +Current compilation info: g2wAAAADaAJ3B3ZlcnNpb25rAAU4LjUuNGgCdwdvcHRpb25zbAAAAAV3CmRlYnVnX2luZm9oAncBaWsARy9idWlsZC9yZXByb2R1Y2libGUtcGF0aC9lcmxhbmctMjcuMy40LjErZGZzZy9saWIva2VybmVsL3NyYy8uLi9pbmNsdWRldxl3YXJuX21pc3NpbmdfZG9jX2Z1bmN0aW9udxl3YXJuX21pc3NpbmdfZG9jX2NhbGxiYWNrdxx3YXJuX21pc3Npbmdfc3BlY19kb2N1bWVudGVkamgCdwZzb3VyY2VrAEUvYnVpbGQvcmVwcm9kdWNpYmxlLXBhdGgvZXJsYW5nLTI3LjMuNC4xK2Rmc2cvbGliL2tlcm5lbC9zcmMvY29kZS5lcmxq +=mod:error_logger +Current size: 18720 +Current attributes: g2wAAAABaAJ3A3ZzbmwAAAABbhAA7vOZAT0uiGjbb+kYzeJp9Wpq +Current compilation info: g2wAAAADaAJ3B3ZlcnNpb25rAAU4LjUuNGgCdwdvcHRpb25zbAAAAAV3CmRlYnVnX2luZm9oAncBaWsARy9idWlsZC9yZXByb2R1Y2libGUtcGF0aC9lcmxhbmctMjcuMy40LjErZGZzZy9saWIva2VybmVsL3NyYy8uLi9pbmNsdWRldxl3YXJuX21pc3NpbmdfZG9jX2Z1bmN0aW9udxl3YXJuX21pc3NpbmdfZG9jX2NhbGxiYWNrdxx3YXJuX21pc3Npbmdfc3BlY19kb2N1bWVudGVkamgCdwZzb3VyY2VrAE0vYnVpbGQvcmVwcm9kdWNpYmxlLXBhdGgvZXJsYW5nLTI3LjMuNC4xK2Rmc2cvbGliL2tlcm5lbC9zcmMvZXJyb3JfbG9nZ2VyLmVybGo= +=mod:logger_backend +Current size: 7936 +Current attributes: g2wAAAABaAJ3A3ZzbmwAAAABbhAApo1njv3C1nAnfn6l84o6f2pq +Current compilation info: g2wAAAADaAJ3B3ZlcnNpb25rAAU4LjUuNGgCdwdvcHRpb25zbAAAAAV3CmRlYnVnX2luZm9oAncBaWsARy9idWlsZC9yZXByb2R1Y2libGUtcGF0aC9lcmxhbmctMjcuMy40LjErZGZzZy9saWIva2VybmVsL3NyYy8uLi9pbmNsdWRldxl3YXJuX21pc3NpbmdfZG9jX2Z1bmN0aW9udxl3YXJuX21pc3NpbmdfZG9jX2NhbGxiYWNrdxx3YXJuX21pc3Npbmdfc3BlY19kb2N1bWVudGVkamgCdwZzb3VyY2VrAE8vYnVpbGQvcmVwcm9kdWNpYmxlLXBhdGgvZXJsYW5nLTI3LjMuNC4xK2Rmc2cvbGliL2tlcm5lbC9zcmMvbG9nZ2VyX2JhY2tlbmQuZXJsag== +=mod:code_server +Current size: 74280 +Current attributes: g2wAAAABaAJ3A3ZzbmwAAAABbhAAFGIYMeVO5vA0eMoFpA+En2pq +Current compilation info: g2wAAAADaAJ3B3ZlcnNpb25rAAU4LjUuNGgCdwdvcHRpb25zbAAAAAV3CmRlYnVnX2luZm9oAncBaWsARy9idWlsZC9yZXByb2R1Y2libGUtcGF0aC9lcmxhbmctMjcuMy40LjErZGZzZy9saWIva2VybmVsL3NyYy8uLi9pbmNsdWRldxl3YXJuX21pc3NpbmdfZG9jX2Z1bmN0aW9udxl3YXJuX21pc3NpbmdfZG9jX2NhbGxiYWNrdxx3YXJuX21pc3Npbmdfc3BlY19kb2N1bWVudGVkamgCdwZzb3VyY2VrAEwvYnVpbGQvcmVwcm9kdWNpYmxlLXBhdGgvZXJsYW5nLTI3LjMuNC4xK2Rmc2cvbGliL2tlcm5lbC9zcmMvY29kZV9zZXJ2ZXIuZXJsag== +=mod:heart +Current size: 18112 +Current attributes: g2wAAAACaAJ3A3ZzbmwAAAABbhAA1ubFp29GmD0U/aE3qIerEmpoAncIZGlhbHl6ZXJsAAAAAWgCdxFub19pbXByb3Blcl9saXN0c2gCdw5zZW5kX2hlYXJ0X2NtZGECamo= +Current compilation info: g2wAAAADaAJ3B3ZlcnNpb25rAAU4LjUuNGgCdwdvcHRpb25zbAAAAAV3CmRlYnVnX2luZm9oAncBaWsARy9idWlsZC9yZXByb2R1Y2libGUtcGF0aC9lcmxhbmctMjcuMy40LjErZGZzZy9saWIva2VybmVsL3NyYy8uLi9pbmNsdWRldxl3YXJuX21pc3NpbmdfZG9jX2Z1bmN0aW9udxl3YXJuX21pc3NpbmdfZG9jX2NhbGxiYWNrdxx3YXJuX21pc3Npbmdfc3BlY19kb2N1bWVudGVkamgCdwZzb3VyY2VrAEYvYnVpbGQvcmVwcm9kdWNpYmxlLXBhdGgvZXJsYW5nLTI3LjMuNC4xK2Rmc2cvbGliL2tlcm5lbC9zcmMvaGVhcnQuZXJsag== +=mod:application +Current size: 16424 +Current attributes: g2wAAAABaAJ3A3ZzbmwAAAABbhAArIt6ubypKXGeMSYkGqiIE2pq +Current compilation info: g2wAAAADaAJ3B3ZlcnNpb25rAAU4LjUuNGgCdwdvcHRpb25zbAAAAAV3CmRlYnVnX2luZm9oAncBaWsARy9idWlsZC9yZXByb2R1Y2libGUtcGF0aC9lcmxhbmctMjcuMy40LjErZGZzZy9saWIva2VybmVsL3NyYy8uLi9pbmNsdWRldxl3YXJuX21pc3NpbmdfZG9jX2Z1bmN0aW9udxl3YXJuX21pc3NpbmdfZG9jX2NhbGxiYWNrdxx3YXJuX21pc3Npbmdfc3BlY19kb2N1bWVudGVkamgCdwZzb3VyY2VrAEwvYnVpbGQvcmVwcm9kdWNpYmxlLXBhdGgvZXJsYW5nLTI3LjMuNC4xK2Rmc2cvbGliL2tlcm5lbC9zcmMvYXBwbGljYXRpb24uZXJsag== +=mod:application_master +Current size: 21592 +Current attributes: g2wAAAABaAJ3A3ZzbmwAAAABbhAAm2IuiiJpe6hJe1wHyy10fWpq +Current compilation info: g2wAAAADaAJ3B3ZlcnNpb25rAAU4LjUuNGgCdwdvcHRpb25zbAAAAAV3CmRlYnVnX2luZm9oAncBaWsARy9idWlsZC9yZXByb2R1Y2libGUtcGF0aC9lcmxhbmctMjcuMy40LjErZGZzZy9saWIva2VybmVsL3NyYy8uLi9pbmNsdWRldxl3YXJuX21pc3NpbmdfZG9jX2Z1bmN0aW9udxl3YXJuX21pc3NpbmdfZG9jX2NhbGxiYWNrdxx3YXJuX21pc3Npbmdfc3BlY19kb2N1bWVudGVkamgCdwZzb3VyY2VrAFMvYnVpbGQvcmVwcm9kdWNpYmxlLXBhdGgvZXJsYW5nLTI3LjMuNC4xK2Rmc2cvbGliL2tlcm5lbC9zcmMvYXBwbGljYXRpb25fbWFzdGVyLmVybGo= +=mod:error_handler +Current size: 5576 +Current attributes: g2wAAAABaAJ3A3ZzbmwAAAABbhAAM8eBoSiCbCVYkDFYYI0pmmpq +Current compilation info: g2wAAAADaAJ3B3ZlcnNpb25rAAU4LjUuNGgCdwdvcHRpb25zbAAAAAV3CmRlYnVnX2luZm9oAncBaWsARy9idWlsZC9yZXByb2R1Y2libGUtcGF0aC9lcmxhbmctMjcuMy40LjErZGZzZy9saWIva2VybmVsL3NyYy8uLi9pbmNsdWRldxl3YXJuX21pc3NpbmdfZG9jX2Z1bmN0aW9udxl3YXJuX21pc3NpbmdfZG9jX2NhbGxiYWNrdxx3YXJuX21pc3Npbmdfc3BlY19kb2N1bWVudGVkamgCdwZzb3VyY2VrAE4vYnVpbGQvcmVwcm9kdWNpYmxlLXBhdGgvZXJsYW5nLTI3LjMuNC4xK2Rmc2cvbGliL2tlcm5lbC9zcmMvZXJyb3JfaGFuZGxlci5lcmxq +=mod:logger_proxy +Current size: 9440 +Current attributes: g2wAAAABaAJ3A3ZzbmwAAAABbhAAZIRtgKqGUjqSPx8kLlq2Nmpq +Current compilation info: g2wAAAADaAJ3B3ZlcnNpb25rAAU4LjUuNGgCdwdvcHRpb25zbAAAAAV3CmRlYnVnX2luZm9oAncBaWsARy9idWlsZC9yZXByb2R1Y2libGUtcGF0aC9lcmxhbmctMjcuMy40LjErZGZzZy9saWIva2VybmVsL3NyYy8uLi9pbmNsdWRldxl3YXJuX21pc3NpbmdfZG9jX2Z1bmN0aW9udxl3YXJuX21pc3NpbmdfZG9jX2NhbGxiYWNrdxx3YXJuX21pc3Npbmdfc3BlY19kb2N1bWVudGVkamgCdwZzb3VyY2VrAE0vYnVpbGQvcmVwcm9kdWNpYmxlLXBhdGgvZXJsYW5nLTI3LjMuNC4xK2Rmc2cvbGliL2tlcm5lbC9zcmMvbG9nZ2VyX3Byb3h5LmVybGo= +=mod:logger_olp +Current size: 26320 +Current attributes: g2wAAAACaAJ3A3ZzbmwAAAABbhAA2NXQcOudpseOdWa7u5cPcmpoAncJYmVoYXZpb3VybAAAAAF3Cmdlbl9zZXJ2ZXJqag== +Current compilation info: g2wAAAADaAJ3B3ZlcnNpb25rAAU4LjUuNGgCdwdvcHRpb25zbAAAAAV3CmRlYnVnX2luZm9oAncBaWsARy9idWlsZC9yZXByb2R1Y2libGUtcGF0aC9lcmxhbmctMjcuMy40LjErZGZzZy9saWIva2VybmVsL3NyYy8uLi9pbmNsdWRldxl3YXJuX21pc3NpbmdfZG9jX2Z1bmN0aW9udxl3YXJuX21pc3NpbmdfZG9jX2NhbGxiYWNrdxx3YXJuX21pc3Npbmdfc3BlY19kb2N1bWVudGVkamgCdwZzb3VyY2VrAEsvYnVpbGQvcmVwcm9kdWNpYmxlLXBhdGgvZXJsYW5nLTI3LjMuNC4xK2Rmc2cvbGliL2tlcm5lbC9zcmMvbG9nZ2VyX29scC5lcmxq +=mod:queue +Current size: 31384 +Current attributes: g2wAAAACaAJ3A3ZzbmwAAAABbhAAwrF/xRgH2sCBQp22GU1EWGpoAncKZGVwcmVjYXRlZGwAAAABaAN3BGxhaXRhAWsAGHVzZSBxdWV1ZTpsaWF0LzEgaW5zdGVhZGpq +Current compilation info: g2wAAAADaAJ3B3ZlcnNpb25rAAU4LjUuNGgCdwdvcHRpb25zbAAAAAZ3CmRlYnVnX2luZm9oAncBaWsARy9idWlsZC9yZXByb2R1Y2libGUtcGF0aC9lcmxhbmctMjcuMy40LjErZGZzZy9saWIvc3RkbGliL3NyYy8uLi9pbmNsdWRlaAJ3AWlrAFEvYnVpbGQvcmVwcm9kdWNpYmxlLXBhdGgvZXJsYW5nLTI3LjMuNC4xK2Rmc2cvbGliL3N0ZGxpYi9zcmMvLi4vLi4va2VybmVsL2luY2x1ZGV3GXdhcm5fbWlzc2luZ19kb2NfZnVuY3Rpb253GXdhcm5fbWlzc2luZ19kb2NfY2FsbGJhY2t3HHdhcm5fbWlzc2luZ19zcGVjX2RvY3VtZW50ZWRqaAJ3BnNvdXJjZWsARi9idWlsZC9yZXByb2R1Y2libGUtcGF0aC9lcmxhbmctMjcuMy40LjErZGZzZy9saWIvc3RkbGliL3NyYy9xdWV1ZS5lcmxq +=mod:proplists +Current size: 15696 +Current attributes: g2wAAAABaAJ3A3ZzbmwAAAABbhAAX6lXchjeoYvvlQbMXVFcrmpq +Current compilation info: g2wAAAADaAJ3B3ZlcnNpb25rAAU4LjUuNGgCdwdvcHRpb25zbAAAAAZ3CmRlYnVnX2luZm9oAncBaWsARy9idWlsZC9yZXByb2R1Y2libGUtcGF0aC9lcmxhbmctMjcuMy40LjErZGZzZy9saWIvc3RkbGliL3NyYy8uLi9pbmNsdWRlaAJ3AWlrAFEvYnVpbGQvcmVwcm9kdWNpYmxlLXBhdGgvZXJsYW5nLTI3LjMuNC4xK2Rmc2cvbGliL3N0ZGxpYi9zcmMvLi4vLi4va2VybmVsL2luY2x1ZGV3GXdhcm5fbWlzc2luZ19kb2NfZnVuY3Rpb253GXdhcm5fbWlzc2luZ19kb2NfY2FsbGJhY2t3HHdhcm5fbWlzc2luZ19zcGVjX2RvY3VtZW50ZWRqaAJ3BnNvdXJjZWsASi9idWlsZC9yZXByb2R1Y2libGUtcGF0aC9lcmxhbmctMjcuMy40LjErZGZzZy9saWIvc3RkbGliL3NyYy9wcm9wbGlzdHMuZXJsag== +=mod:os +Current size: 19688 +Current attributes: g2wAAAABaAJ3A3ZzbmwAAAABbhAA4Ygej8TN5mez+Pt/m55OWWpq +Current compilation info: g2wAAAADaAJ3B3ZlcnNpb25rAAU4LjUuNGgCdwdvcHRpb25zbAAAAAV3CmRlYnVnX2luZm9oAncBaWsARy9idWlsZC9yZXByb2R1Y2libGUtcGF0aC9lcmxhbmctMjcuMy40LjErZGZzZy9saWIva2VybmVsL3NyYy8uLi9pbmNsdWRldxl3YXJuX21pc3NpbmdfZG9jX2Z1bmN0aW9udxl3YXJuX21pc3NpbmdfZG9jX2NhbGxiYWNrdxx3YXJuX21pc3Npbmdfc3BlY19kb2N1bWVudGVkamgCdwZzb3VyY2VrAEMvYnVpbGQvcmVwcm9kdWNpYmxlLXBhdGgvZXJsYW5nLTI3LjMuNC4xK2Rmc2cvbGliL2tlcm5lbC9zcmMvb3MuZXJsag== +=mod:peer +Current size: 64632 +Current attributes: g2wAAAAEaAJ3A3ZzbmwAAAABbhAADwwIbb92LFd1CpiKkVD4b2poAncGYXV0aG9yawASbWF4aW1mY2FAZ21haWwuY29taAJ3CWJlaGF2aW91cmwAAAABdwpnZW5fc2VydmVyamgCdwliZWhhdmlvdXJsAAAAAXcDc3lzamo= +Current compilation info: g2wAAAADaAJ3B3ZlcnNpb25rAAU4LjUuNGgCdwdvcHRpb25zbAAAAAZ3CmRlYnVnX2luZm9oAncBaWsARy9idWlsZC9yZXByb2R1Y2libGUtcGF0aC9lcmxhbmctMjcuMy40LjErZGZzZy9saWIvc3RkbGliL3NyYy8uLi9pbmNsdWRlaAJ3AWlrAFEvYnVpbGQvcmVwcm9kdWNpYmxlLXBhdGgvZXJsYW5nLTI3LjMuNC4xK2Rmc2cvbGliL3N0ZGxpYi9zcmMvLi4vLi4va2VybmVsL2luY2x1ZGV3GXdhcm5fbWlzc2luZ19kb2NfZnVuY3Rpb253GXdhcm5fbWlzc2luZ19kb2NfY2FsbGJhY2t3HHdhcm5fbWlzc2luZ19zcGVjX2RvY3VtZW50ZWRqaAJ3BnNvdXJjZWsARS9idWlsZC9yZXByb2R1Y2libGUtcGF0aC9lcmxhbmctMjcuMy40LjErZGZzZy9saWIvc3RkbGliL3NyYy9wZWVyLmVybGo= +=mod:beam_lib +Current size: 73160 +Current attributes: g2wAAAACaAJ3A3ZzbmwAAAABbhAAmTbDKvJC0OVTDnYFIduObGpoAncJYmVoYXZpb3VybAAAAAF3Cmdlbl9zZXJ2ZXJqag== +Current compilation info: g2wAAAADaAJ3B3ZlcnNpb25rAAU4LjUuNGgCdwdvcHRpb25zbAAAAAZ3CmRlYnVnX2luZm9oAncBaWsARy9idWlsZC9yZXByb2R1Y2libGUtcGF0aC9lcmxhbmctMjcuMy40LjErZGZzZy9saWIvc3RkbGliL3NyYy8uLi9pbmNsdWRlaAJ3AWlrAFEvYnVpbGQvcmVwcm9kdWNpYmxlLXBhdGgvZXJsYW5nLTI3LjMuNC4xK2Rmc2cvbGliL3N0ZGxpYi9zcmMvLi4vLi4va2VybmVsL2luY2x1ZGV3GXdhcm5fbWlzc2luZ19kb2NfZnVuY3Rpb253GXdhcm5fbWlzc2luZ19kb2NfY2FsbGJhY2t3HHdhcm5fbWlzc2luZ19zcGVjX2RvY3VtZW50ZWRqaAJ3BnNvdXJjZWsASS9idWlsZC9yZXByb2R1Y2libGUtcGF0aC9lcmxhbmctMjcuMy40LjErZGZzZy9saWIvc3RkbGliL3NyYy9iZWFtX2xpYi5lcmxq +=mod:binary +Current size: 23920 +Current attributes: g2wAAAABaAJ3A3ZzbmwAAAABbhAApQeR01WIA5K4B6AKbZ+oHGpq +Current compilation info: g2wAAAADaAJ3B3ZlcnNpb25rAAU4LjUuNGgCdwdvcHRpb25zbAAAAAZ3CmRlYnVnX2luZm9oAncBaWsARy9idWlsZC9yZXByb2R1Y2libGUtcGF0aC9lcmxhbmctMjcuMy40LjErZGZzZy9saWIvc3RkbGliL3NyYy8uLi9pbmNsdWRlaAJ3AWlrAFEvYnVpbGQvcmVwcm9kdWNpYmxlLXBhdGgvZXJsYW5nLTI3LjMuNC4xK2Rmc2cvbGliL3N0ZGxpYi9zcmMvLi4vLi4va2VybmVsL2luY2x1ZGV3GXdhcm5fbWlzc2luZ19kb2NfZnVuY3Rpb253GXdhcm5fbWlzc2luZ19kb2NfY2FsbGJhY2t3HHdhcm5fbWlzc2luZ19zcGVjX2RvY3VtZW50ZWRqaAJ3BnNvdXJjZWsARy9idWlsZC9yZXByb2R1Y2libGUtcGF0aC9lcmxhbmctMjcuMy40LjErZGZzZy9saWIvc3RkbGliL3NyYy9iaW5hcnkuZXJsag== +=mod:gb_sets +Current size: 30568 +Current attributes: g2wAAAABaAJ3A3ZzbmwAAAABbhAAZK4mqHRJZB2ivr5Zkg/ovmpq +Current compilation info: g2wAAAADaAJ3B3ZlcnNpb25rAAU4LjUuNGgCdwdvcHRpb25zbAAAAAZ3CmRlYnVnX2luZm9oAncBaWsARy9idWlsZC9yZXByb2R1Y2libGUtcGF0aC9lcmxhbmctMjcuMy40LjErZGZzZy9saWIvc3RkbGliL3NyYy8uLi9pbmNsdWRlaAJ3AWlrAFEvYnVpbGQvcmVwcm9kdWNpYmxlLXBhdGgvZXJsYW5nLTI3LjMuNC4xK2Rmc2cvbGliL3N0ZGxpYi9zcmMvLi4vLi4va2VybmVsL2luY2x1ZGV3GXdhcm5fbWlzc2luZ19kb2NfZnVuY3Rpb253GXdhcm5fbWlzc2luZ19kb2NfY2FsbGJhY2t3HHdhcm5fbWlzc2luZ19zcGVjX2RvY3VtZW50ZWRqaAJ3BnNvdXJjZWsASC9idWlsZC9yZXByb2R1Y2libGUtcGF0aC9lcmxhbmctMjcuMy40LjErZGZzZy9saWIvc3RkbGliL3NyYy9nYl9zZXRzLmVybGo= +=mod:gb_trees +Current size: 19840 +Current attributes: g2wAAAABaAJ3A3ZzbmwAAAABbhAAfQUW/4O+36aJ93fztAs/+Wpq +Current compilation info: g2wAAAADaAJ3B3ZlcnNpb25rAAU4LjUuNGgCdwdvcHRpb25zbAAAAAZ3CmRlYnVnX2luZm9oAncBaWsARy9idWlsZC9yZXByb2R1Y2libGUtcGF0aC9lcmxhbmctMjcuMy40LjErZGZzZy9saWIvc3RkbGliL3NyYy8uLi9pbmNsdWRlaAJ3AWlrAFEvYnVpbGQvcmVwcm9kdWNpYmxlLXBhdGgvZXJsYW5nLTI3LjMuNC4xK2Rmc2cvbGliL3N0ZGxpYi9zcmMvLi4vLi4va2VybmVsL2luY2x1ZGV3GXdhcm5fbWlzc2luZ19kb2NfZnVuY3Rpb253GXdhcm5fbWlzc2luZ19kb2NfY2FsbGJhY2t3HHdhcm5fbWlzc2luZ19zcGVjX2RvY3VtZW50ZWRqaAJ3BnNvdXJjZWsASS9idWlsZC9yZXByb2R1Y2libGUtcGF0aC9lcmxhbmctMjcuMy40LjErZGZzZy9saWIvc3RkbGliL3NyYy9nYl90cmVlcy5lcmxq +=mod:unicode +Current size: 47456 +Current attributes: g2wAAAACaAJ3A3ZzbmwAAAABbhAAgc1jsIFPoPjkCgYi0ZMqq2poAncIZGlhbHl6ZXJsAAAAAWgCdxFub19pbXByb3Blcl9saXN0c2gCdwxkb19vX2JpbmFyeTJhAmpq +Current compilation info: g2wAAAADaAJ3B3ZlcnNpb25rAAU4LjUuNGgCdwdvcHRpb25zbAAAAAZ3CmRlYnVnX2luZm9oAncBaWsARy9idWlsZC9yZXByb2R1Y2libGUtcGF0aC9lcmxhbmctMjcuMy40LjErZGZzZy9saWIvc3RkbGliL3NyYy8uLi9pbmNsdWRlaAJ3AWlrAFEvYnVpbGQvcmVwcm9kdWNpYmxlLXBhdGgvZXJsYW5nLTI3LjMuNC4xK2Rmc2cvbGliL3N0ZGxpYi9zcmMvLi4vLi4va2VybmVsL2luY2x1ZGV3GXdhcm5fbWlzc2luZ19kb2NfZnVuY3Rpb253GXdhcm5fbWlzc2luZ19kb2NfY2FsbGJhY2t3HHdhcm5fbWlzc2luZ19zcGVjX2RvY3VtZW50ZWRqaAJ3BnNvdXJjZWsASC9idWlsZC9yZXByb2R1Y2libGUtcGF0aC9lcmxhbmctMjcuMy40LjErZGZzZy9saWIvc3RkbGliL3NyYy91bmljb2RlLmVybGo= +=mod:erl_features +Current size: 43736 +Current attributes: g2wAAAABaAJ3A3ZzbmwAAAABbhAA5rFNLbVZWPdZI57od1EFV2pq +Current compilation info: g2wAAAADaAJ3B3ZlcnNpb25rAAU4LjUuNGgCdwdvcHRpb25zbAAAAAZ3CmRlYnVnX2luZm9oAncBaWsARy9idWlsZC9yZXByb2R1Y2libGUtcGF0aC9lcmxhbmctMjcuMy40LjErZGZzZy9saWIvc3RkbGliL3NyYy8uLi9pbmNsdWRlaAJ3AWlrAFEvYnVpbGQvcmVwcm9kdWNpYmxlLXBhdGgvZXJsYW5nLTI3LjMuNC4xK2Rmc2cvbGliL3N0ZGxpYi9zcmMvLi4vLi4va2VybmVsL2luY2x1ZGV3GXdhcm5fbWlzc2luZ19kb2NfZnVuY3Rpb253GXdhcm5fbWlzc2luZ19kb2NfY2FsbGJhY2t3HHdhcm5fbWlzc2luZ19zcGVjX2RvY3VtZW50ZWRqaAJ3BnNvdXJjZWsATS9idWlsZC9yZXByb2R1Y2libGUtcGF0aC9lcmxhbmctMjcuMy40LjErZGZzZy9saWIvc3RkbGliL3NyYy9lcmxfZmVhdHVyZXMuZXJsag== +=mod:standard_error +Current size: 12048 +Current attributes: g2wAAAACaAJ3A3ZzbmwAAAABbhAAOz1Ph+UH8DtbZBXlEZ7qUGpoAncJYmVoYXZpb3VybAAAAAF3EXN1cGVydmlzb3JfYnJpZGdlamo= +Current compilation info: g2wAAAADaAJ3B3ZlcnNpb25rAAU4LjUuNGgCdwdvcHRpb25zbAAAAAV3CmRlYnVnX2luZm9oAncBaWsARy9idWlsZC9yZXByb2R1Y2libGUtcGF0aC9lcmxhbmctMjcuMy40LjErZGZzZy9saWIva2VybmVsL3NyYy8uLi9pbmNsdWRldxl3YXJuX21pc3NpbmdfZG9jX2Z1bmN0aW9udxl3YXJuX21pc3NpbmdfZG9jX2NhbGxiYWNrdxx3YXJuX21pc3Npbmdfc3BlY19kb2N1bWVudGVkamgCdwZzb3VyY2VrAE8vYnVpbGQvcmVwcm9kdWNpYmxlLXBhdGgvZXJsYW5nLTI3LjMuNC4xK2Rmc2cvbGliL2tlcm5lbC9zcmMvc3RhbmRhcmRfZXJyb3IuZXJsag== +=mod:supervisor_bridge +Current size: 21384 +Current attributes: g2wAAAACaAJ3A3ZzbmwAAAABbhAARxP0+BU2gN7Ukzex1hLmV2poAncJYmVoYXZpb3VybAAAAAF3Cmdlbl9zZXJ2ZXJqag== +Current compilation info: g2wAAAADaAJ3B3ZlcnNpb25rAAU4LjUuNGgCdwdvcHRpb25zbAAAAAZ3CmRlYnVnX2luZm9oAncBaWsARy9idWlsZC9yZXByb2R1Y2libGUtcGF0aC9lcmxhbmctMjcuMy40LjErZGZzZy9saWIvc3RkbGliL3NyYy8uLi9pbmNsdWRlaAJ3AWlrAFEvYnVpbGQvcmVwcm9kdWNpYmxlLXBhdGgvZXJsYW5nLTI3LjMuNC4xK2Rmc2cvbGliL3N0ZGxpYi9zcmMvLi4vLi4va2VybmVsL2luY2x1ZGV3GXdhcm5fbWlzc2luZ19kb2NfZnVuY3Rpb253GXdhcm5fbWlzc2luZ19kb2NfY2FsbGJhY2t3HHdhcm5fbWlzc2luZ19zcGVjX2RvY3VtZW50ZWRqaAJ3BnNvdXJjZWsAUi9idWlsZC9yZXByb2R1Y2libGUtcGF0aC9lcmxhbmctMjcuMy40LjErZGZzZy9saWIvc3RkbGliL3NyYy9zdXBlcnZpc29yX2JyaWRnZS5lcmxq +=mod:inet_db +Current size: 76368 +Current attributes: g2wAAAABaAJ3A3ZzbmwAAAABbhAA0SHQ3Ieq6WHBCsNfr6hUDmpq +Current compilation info: g2wAAAADaAJ3B3ZlcnNpb25rAAU4LjUuNGgCdwdvcHRpb25zbAAAAAV3CmRlYnVnX2luZm9oAncBaWsARy9idWlsZC9yZXByb2R1Y2libGUtcGF0aC9lcmxhbmctMjcuMy40LjErZGZzZy9saWIva2VybmVsL3NyYy8uLi9pbmNsdWRldxl3YXJuX21pc3NpbmdfZG9jX2Z1bmN0aW9udxl3YXJuX21pc3NpbmdfZG9jX2NhbGxiYWNrdxx3YXJuX21pc3Npbmdfc3BlY19kb2N1bWVudGVkamgCdwZzb3VyY2VrAEgvYnVpbGQvcmVwcm9kdWNpYmxlLXBhdGgvZXJsYW5nLTI3LjMuNC4xK2Rmc2cvbGliL2tlcm5lbC9zcmMvaW5ldF9kYi5lcmxq +=mod:inet_config +Current size: 26880 +Current attributes: g2wAAAABaAJ3A3ZzbmwAAAABbhAAXjRwixnzHhELdm0gYJ7AC2pq +Current compilation info: g2wAAAADaAJ3B3ZlcnNpb25rAAU4LjUuNGgCdwdvcHRpb25zbAAAAAV3CmRlYnVnX2luZm9oAncBaWsARy9idWlsZC9yZXByb2R1Y2libGUtcGF0aC9lcmxhbmctMjcuMy40LjErZGZzZy9saWIva2VybmVsL3NyYy8uLi9pbmNsdWRldxl3YXJuX21pc3NpbmdfZG9jX2Z1bmN0aW9udxl3YXJuX21pc3NpbmdfZG9jX2NhbGxiYWNrdxx3YXJuX21pc3Npbmdfc3BlY19kb2N1bWVudGVkamgCdwZzb3VyY2VrAEwvYnVpbGQvcmVwcm9kdWNpYmxlLXBhdGgvZXJsYW5nLTI3LjMuNC4xK2Rmc2cvbGliL2tlcm5lbC9zcmMvaW5ldF9jb25maWcuZXJsag== +=mod:inet_udp +Current size: 7168 +Current attributes: g2wAAAABaAJ3A3ZzbmwAAAABbhAAsQpWMmtEzCEBF6nHGOUPv2pq +Current compilation info: g2wAAAADaAJ3B3ZlcnNpb25rAAU4LjUuNGgCdwdvcHRpb25zbAAAAAV3CmRlYnVnX2luZm9oAncBaWsARy9idWlsZC9yZXByb2R1Y2libGUtcGF0aC9lcmxhbmctMjcuMy40LjErZGZzZy9saWIva2VybmVsL3NyYy8uLi9pbmNsdWRldxl3YXJuX21pc3NpbmdfZG9jX2Z1bmN0aW9udxl3YXJuX21pc3NpbmdfZG9jX2NhbGxiYWNrdxx3YXJuX21pc3Npbmdfc3BlY19kb2N1bWVudGVkamgCdwZzb3VyY2VrAEkvYnVpbGQvcmVwcm9kdWNpYmxlLXBhdGgvZXJsYW5nLTI3LjMuNC4xK2Rmc2cvbGliL2tlcm5lbC9zcmMvaW5ldF91ZHAuZXJsag== +=mod:inet +Current size: 116072 +Current attributes: g2wAAAABaAJ3A3ZzbmwAAAABbhAAJAtG3i/WBDP9Q7d56wO6S2pq +Current compilation info: g2wAAAADaAJ3B3ZlcnNpb25rAAU4LjUuNGgCdwdvcHRpb25zbAAAAAV3CmRlYnVnX2luZm9oAncBaWsARy9idWlsZC9yZXByb2R1Y2libGUtcGF0aC9lcmxhbmctMjcuMy40LjErZGZzZy9saWIva2VybmVsL3NyYy8uLi9pbmNsdWRldxl3YXJuX21pc3NpbmdfZG9jX2Z1bmN0aW9udxl3YXJuX21pc3NpbmdfZG9jX2NhbGxiYWNrdxx3YXJuX21pc3Npbmdfc3BlY19kb2N1bWVudGVkamgCdwZzb3VyY2VrAEUvYnVpbGQvcmVwcm9kdWNpYmxlLXBhdGgvZXJsYW5nLTI3LjMuNC4xK2Rmc2cvbGliL2tlcm5lbC9zcmMvaW5ldC5lcmxq +=mod:inet_parse +Current size: 43936 +Current attributes: g2wAAAABaAJ3A3ZzbmwAAAABbhAAbUUr0Sfp4LQiCTU38nG6hmpq +Current compilation info: g2wAAAADaAJ3B3ZlcnNpb25rAAU4LjUuNGgCdwdvcHRpb25zbAAAAAV3CmRlYnVnX2luZm9oAncBaWsARy9idWlsZC9yZXByb2R1Y2libGUtcGF0aC9lcmxhbmctMjcuMy40LjErZGZzZy9saWIva2VybmVsL3NyYy8uLi9pbmNsdWRldxl3YXJuX21pc3NpbmdfZG9jX2Z1bmN0aW9udxl3YXJuX21pc3NpbmdfZG9jX2NhbGxiYWNrdxx3YXJuX21pc3Npbmdfc3BlY19kb2N1bWVudGVkamgCdwZzb3VyY2VrAEsvYnVpbGQvcmVwcm9kdWNpYmxlLXBhdGgvZXJsYW5nLTI3LjMuNC4xK2Rmc2cvbGliL2tlcm5lbC9zcmMvaW5ldF9wYXJzZS5lcmxq +=mod:inet_gethost_native +Current size: 34000 +Current attributes: g2wAAAADaAJ3A3ZzbmwAAAABbhAAlb6ndYXiQ9A7dTTf4+RdmWpoAncJYmVoYXZpb3VybAAAAAF3EXN1cGVydmlzb3JfYnJpZGdlamgCdwhkaWFseXplcmwAAAABaAJ3EW5vX2ltcHJvcGVyX2xpc3RzaAJ3DGRvX29wZW5fcG9ydGECamo= +Current compilation info: g2wAAAADaAJ3B3ZlcnNpb25rAAU4LjUuNGgCdwdvcHRpb25zbAAAAAV3CmRlYnVnX2luZm9oAncBaWsARy9idWlsZC9yZXByb2R1Y2libGUtcGF0aC9lcmxhbmctMjcuMy40LjErZGZzZy9saWIva2VybmVsL3NyYy8uLi9pbmNsdWRldxl3YXJuX21pc3NpbmdfZG9jX2Z1bmN0aW9udxl3YXJuX21pc3NpbmdfZG9jX2NhbGxiYWNrdxx3YXJuX21pc3Npbmdfc3BlY19kb2N1bWVudGVkamgCdwZzb3VyY2VrAFQvYnVpbGQvcmVwcm9kdWNpYmxlLXBhdGgvZXJsYW5nLTI3LjMuNC4xK2Rmc2cvbGliL2tlcm5lbC9zcmMvaW5ldF9nZXRob3N0X25hdGl2ZS5lcmxq +=mod:rpc +Current size: 33480 +Current attributes: g2wAAAADaAJ3A3ZzbmwAAAABbhAA68uqJyOS5x943X8V2GTsqWpoAncJYmVoYXZpb3VybAAAAAF3Cmdlbl9zZXJ2ZXJqaAJ3B3JlbW92ZWRsAAAAAmgDdxZzYWZlX211bHRpX3NlcnZlcl9jYWxsYQJrACN1c2UgcnBjOm11bHRpX3NlcnZlcl9jYWxsLzIgaW5zdGVhZGgDdxZzYWZlX211bHRpX3NlcnZlcl9jYWxsYQNrACN1c2UgcnBjOm11bHRpX3NlcnZlcl9jYWxsLzMgaW5zdGVhZGpq +Current compilation info: g2wAAAADaAJ3B3ZlcnNpb25rAAU4LjUuNGgCdwdvcHRpb25zbAAAAAV3CmRlYnVnX2luZm9oAncBaWsARy9idWlsZC9yZXByb2R1Y2libGUtcGF0aC9lcmxhbmctMjcuMy40LjErZGZzZy9saWIva2VybmVsL3NyYy8uLi9pbmNsdWRldxl3YXJuX21pc3NpbmdfZG9jX2Z1bmN0aW9udxl3YXJuX21pc3NpbmdfZG9jX2NhbGxiYWNrdxx3YXJuX21pc3Npbmdfc3BlY19kb2N1bWVudGVkamgCdwZzb3VyY2VrAEQvYnVpbGQvcmVwcm9kdWNpYmxlLXBhdGgvZXJsYW5nLTI3LjMuNC4xK2Rmc2cvbGliL2tlcm5lbC9zcmMvcnBjLmVybGo= +=mod:net_kernel +Current size: 113536 +Current attributes: g2wAAAACaAJ3A3ZzbmwAAAABbhAABaHuTUG/6lokcnexrKXZzGpoAncJYmVoYXZpb3VybAAAAAF3Cmdlbl9zZXJ2ZXJqag== +Current compilation info: g2wAAAADaAJ3B3ZlcnNpb25rAAU4LjUuNGgCdwdvcHRpb25zbAAAAAV3CmRlYnVnX2luZm9oAncBaWsARy9idWlsZC9yZXByb2R1Y2libGUtcGF0aC9lcmxhbmctMjcuMy40LjErZGZzZy9saWIva2VybmVsL3NyYy8uLi9pbmNsdWRldxl3YXJuX21pc3NpbmdfZG9jX2Z1bmN0aW9udxl3YXJuX21pc3NpbmdfZG9jX2NhbGxiYWNrdxx3YXJuX21pc3Npbmdfc3BlY19kb2N1bWVudGVkamgCdwZzb3VyY2VrAEsvYnVpbGQvcmVwcm9kdWNpYmxlLXBhdGgvZXJsYW5nLTI3LjMuNC4xK2Rmc2cvbGliL2tlcm5lbC9zcmMvbmV0X2tlcm5lbC5lcmxq +=mod:global +Current size: 134664 +Current attributes: g2wAAAACaAJ3A3ZzbmwAAAABbhAAoiJuecWkTQiIIfapR+N/uWpoAncJYmVoYXZpb3VybAAAAAF3Cmdlbl9zZXJ2ZXJqag== +Current compilation info: g2wAAAADaAJ3B3ZlcnNpb25rAAU4LjUuNGgCdwdvcHRpb25zbAAAAAV3CmRlYnVnX2luZm9oAncBaWsARy9idWlsZC9yZXByb2R1Y2libGUtcGF0aC9lcmxhbmctMjcuMy40LjErZGZzZy9saWIva2VybmVsL3NyYy8uLi9pbmNsdWRldxl3YXJuX21pc3NpbmdfZG9jX2Z1bmN0aW9udxl3YXJuX21pc3NpbmdfZG9jX2NhbGxiYWNrdxx3YXJuX21pc3Npbmdfc3BlY19kb2N1bWVudGVkamgCdwZzb3VyY2VrAEcvYnVpbGQvcmVwcm9kdWNpYmxlLXBhdGgvZXJsYW5nLTI3LjMuNC4xK2Rmc2cvbGliL2tlcm5lbC9zcmMvZ2xvYmFsLmVybGo= +=mod:rand +Current size: 92608 +Current attributes: g2wAAAAMaAJ3A3ZzbmwAAAABbhAA1XguTyLCf3yrWjsyEDRyTGpoAncIZGlhbHl6ZXJsAAAAAWgCdxFub19pbXByb3Blcl9saXN0c2gCdwxleHNwbHVzX3NlZWRhAWpoAncIZGlhbHl6ZXJsAAAAAWgCdxFub19pbXByb3Blcl9saXN0c2gCdwpleHNzc19zZWVkYQFqaAJ3CGRpYWx5emVybAAAAAFoAncRbm9faW1wcm9wZXJfbGlzdHNoAncJZXhzcF9uZXh0YQFqaAJ3CGRpYWx5emVybAAAAAFoAncRbm9faW1wcm9wZXJfbGlzdHNoAncKZXhzc3NfbmV4dGEBamgCdwhkaWFseXplcmwAAAABaAJ3EW5vX2ltcHJvcGVyX2xpc3RzaAJ3DGV4c3BsdXNfanVtcGEBamgCdwhkaWFseXplcmwAAAABaAJ3EW5vX2ltcHJvcGVyX2xpc3RzaAJ3CWV4c3BfanVtcGEBamgCdwhkaWFseXplcmwAAAABaAJ3EW5vX2ltcHJvcGVyX2xpc3RzaAJ3DGV4c3BsdXNfanVtcGEEamgCdwhkaWFseXplcmwAAAABaAJ3EW5vX2ltcHJvcGVyX2xpc3RzaAJ3CmV4cm9wX3NlZWRhAWpoAncIZGlhbHl6ZXJsAAAAAWgCdxFub19pbXByb3Blcl9saXN0c2gCdwxleHJvcF9uZXh0X3NhAmpoAncIZGlhbHl6ZXJsAAAAAWgCdxFub19pbXByb3Blcl9saXN0c2gCdwpleHJvcF9uZXh0YQFqaAJ3CGRpYWx5emVybAAAAAFoAncRbm9faW1wcm9wZXJfbGlzdHNoAncKZXhyb3BfanVtcGEFamo= +Current compilation info: g2wAAAADaAJ3B3ZlcnNpb25rAAU4LjUuNGgCdwdvcHRpb25zbAAAAAZ3CmRlYnVnX2luZm9oAncBaWsARy9idWlsZC9yZXByb2R1Y2libGUtcGF0aC9lcmxhbmctMjcuMy40LjErZGZzZy9saWIvc3RkbGliL3NyYy8uLi9pbmNsdWRlaAJ3AWlrAFEvYnVpbGQvcmVwcm9kdWNpYmxlLXBhdGgvZXJsYW5nLTI3LjMuNC4xK2Rmc2cvbGliL3N0ZGxpYi9zcmMvLi4vLi4va2VybmVsL2luY2x1ZGV3GXdhcm5fbWlzc2luZ19kb2NfZnVuY3Rpb253GXdhcm5fbWlzc2luZ19kb2NfY2FsbGJhY2t3HHdhcm5fbWlzc2luZ19zcGVjX2RvY3VtZW50ZWRqaAJ3BnNvdXJjZWsARS9idWlsZC9yZXByb2R1Y2libGUtcGF0aC9lcmxhbmctMjcuMy40LjErZGZzZy9saWIvc3RkbGliL3NyYy9yYW5kLmVybGo= +=mod:erl_distribution +Current size: 7384 +Current attributes: g2wAAAACaAJ3A3ZzbmwAAAABbhAAJeEsQAYbdw9IvloQYuz2v2poAncJYmVoYXZpb3VybAAAAAF3CnN1cGVydmlzb3Jqag== +Current compilation info: g2wAAAADaAJ3B3ZlcnNpb25rAAU4LjUuNGgCdwdvcHRpb25zbAAAAAV3CmRlYnVnX2luZm9oAncBaWsARy9idWlsZC9yZXByb2R1Y2libGUtcGF0aC9lcmxhbmctMjcuMy40LjErZGZzZy9saWIva2VybmVsL3NyYy8uLi9pbmNsdWRldxl3YXJuX21pc3NpbmdfZG9jX2Z1bmN0aW9udxl3YXJuX21pc3NpbmdfZG9jX2NhbGxiYWNrdxx3YXJuX21pc3Npbmdfc3BlY19kb2N1bWVudGVkamgCdwZzb3VyY2VrAFEvYnVpbGQvcmVwcm9kdWNpYmxlLXBhdGgvZXJsYW5nLTI3LjMuNC4xK2Rmc2cvbGliL2tlcm5lbC9zcmMvZXJsX2Rpc3RyaWJ1dGlvbi5lcmxq +=mod:maps +Current size: 24984 +Current attributes: g2wAAAACaAJ3A3ZzbmwAAAABbhAAPPHz2eqSLzZgaIvFNPKjnWpoAncIZGlhbHl6ZXJsAAAAAWgCdxFub19pbXByb3Blcl9saXN0c2wAAAACaAJ3CGl0ZXJhdG9yYQFoAncIaXRlcmF0b3JhAmpqag== +Current compilation info: g2wAAAADaAJ3B3ZlcnNpb25rAAU4LjUuNGgCdwdvcHRpb25zbAAAAAZ3CmRlYnVnX2luZm9oAncBaWsARy9idWlsZC9yZXByb2R1Y2libGUtcGF0aC9lcmxhbmctMjcuMy40LjErZGZzZy9saWIvc3RkbGliL3NyYy8uLi9pbmNsdWRlaAJ3AWlrAFEvYnVpbGQvcmVwcm9kdWNpYmxlLXBhdGgvZXJsYW5nLTI3LjMuNC4xK2Rmc2cvbGliL3N0ZGxpYi9zcmMvLi4vLi4va2VybmVsL2luY2x1ZGV3GXdhcm5fbWlzc2luZ19kb2NfZnVuY3Rpb253GXdhcm5fbWlzc2luZ19kb2NfY2FsbGJhY2t3HHdhcm5fbWlzc2luZ19zcGVjX2RvY3VtZW50ZWRqaAJ3BnNvdXJjZWsARS9idWlsZC9yZXByb2R1Y2libGUtcGF0aC9lcmxhbmctMjcuMy40LjErZGZzZy9saWIvc3RkbGliL3NyYy9tYXBzLmVybGo= +=mod:global_group +Current size: 62568 +Current attributes: g2wAAAACaAJ3A3ZzbmwAAAABbhAA9F4Vn29QCEahg4SEXvLU7mpoAncJYmVoYXZpb3VybAAAAAF3Cmdlbl9zZXJ2ZXJqag== +Current compilation info: g2wAAAADaAJ3B3ZlcnNpb25rAAU4LjUuNGgCdwdvcHRpb25zbAAAAAV3CmRlYnVnX2luZm9oAncBaWsARy9idWlsZC9yZXByb2R1Y2libGUtcGF0aC9lcmxhbmctMjcuMy40LjErZGZzZy9saWIva2VybmVsL3NyYy8uLi9pbmNsdWRldxl3YXJuX21pc3NpbmdfZG9jX2Z1bmN0aW9udxl3YXJuX21pc3NpbmdfZG9jX2NhbGxiYWNrdxx3YXJuX21pc3Npbmdfc3BlY19kb2N1bWVudGVkamgCdwZzb3VyY2VrAE0vYnVpbGQvcmVwcm9kdWNpYmxlLXBhdGgvZXJsYW5nLTI3LjMuNC4xK2Rmc2cvbGliL2tlcm5lbC9zcmMvZ2xvYmFsX2dyb3VwLmVybGo= +=mod:erpc +Current size: 50328 +Current attributes: g2wAAAALaAJ3A3ZzbmwAAAABbhAASnvljtjx++opg2J7M7/4AmpoAncIZGlhbHl6ZXJsAAAAAmgCdw9ub3dhcm5fZnVuY3Rpb25oAncEY2FsbGEFdwlub19yZXR1cm5qaAJ3CGRpYWx5emVybAAAAAFoAncRbm9faW1wcm9wZXJfbGlzdHNoAncMc2VuZF9yZXF1ZXN0YQRqaAJ3CGRpYWx5emVybAAAAAFoAncRbm9faW1wcm9wZXJfbGlzdHNoAncMc2VuZF9yZXF1ZXN0YQZqaAJ3CGRpYWx5emVybAAAAAJoAncPbm93YXJuX2Z1bmN0aW9uaAJ3EHJlY2VpdmVfcmVzcG9uc2VhAncJbm9fcmV0dXJuamgCdwhkaWFseXplcmwAAAACaAJ3D25vd2Fybl9mdW5jdGlvbmgCdxByZWNlaXZlX3Jlc3BvbnNlYQN3CW5vX3JldHVybmpoAncIZGlhbHl6ZXJsAAAAAmgCdw9ub3dhcm5fZnVuY3Rpb25oAncNd2FpdF9yZXNwb25zZWECdwlub19yZXR1cm5qaAJ3CGRpYWx5emVybAAAAAJoAncPbm93YXJuX2Z1bmN0aW9uaAJ3DmNoZWNrX3Jlc3BvbnNlYQJ3CW5vX3JldHVybmpoAncIZGlhbHl6ZXJsAAAAAWgCdxFub19pbXByb3Blcl9saXN0c2gCdwpyZXFpZHNfYWRkYQNqaAJ3CGRpYWx5emVybAAAAAFoAncRbm9faW1wcm9wZXJfbGlzdHNoAncOcmVxaWRzX3RvX2xpc3RhAWpoAncIZGlhbHl6ZXJsAAAAAmgCdw9ub3dhcm5fZnVuY3Rpb25oAncGcmVzdWx0YQR3CW5vX3JldHVybmpq +Current compilation info: g2wAAAADaAJ3B3ZlcnNpb25rAAU4LjUuNGgCdwdvcHRpb25zbAAAAAV3CmRlYnVnX2luZm9oAncBaWsARy9idWlsZC9yZXByb2R1Y2libGUtcGF0aC9lcmxhbmctMjcuMy40LjErZGZzZy9saWIva2VybmVsL3NyYy8uLi9pbmNsdWRldxl3YXJuX21pc3NpbmdfZG9jX2Z1bmN0aW9udxl3YXJuX21pc3NpbmdfZG9jX2NhbGxiYWNrdxx3YXJuX21pc3Npbmdfc3BlY19kb2N1bWVudGVkamgCdwZzb3VyY2VrAEUvYnVpbGQvcmVwcm9kdWNpYmxlLXBhdGgvZXJsYW5nLTI3LjMuNC4xK2Rmc2cvbGliL2tlcm5lbC9zcmMvZXJwYy5lcmxq +=mod:user_sup +Current size: 5888 +Current attributes: g2wAAAACaAJ3A3ZzbmwAAAABbhAAN8qhL+hdOL6pDXGJ/Nudl2poAncJYmVoYXZpb3VybAAAAAF3EXN1cGVydmlzb3JfYnJpZGdlamo= +Current compilation info: g2wAAAADaAJ3B3ZlcnNpb25rAAU4LjUuNGgCdwdvcHRpb25zbAAAAAV3CmRlYnVnX2luZm9oAncBaWsARy9idWlsZC9yZXByb2R1Y2libGUtcGF0aC9lcmxhbmctMjcuMy40LjErZGZzZy9saWIva2VybmVsL3NyYy8uLi9pbmNsdWRldxl3YXJuX21pc3NpbmdfZG9jX2Z1bmN0aW9udxl3YXJuX21pc3NpbmdfZG9jX2NhbGxiYWNrdxx3YXJuX21pc3Npbmdfc3BlY19kb2N1bWVudGVkamgCdwZzb3VyY2VrAEkvYnVpbGQvcmVwcm9kdWNpYmxlLXBhdGgvZXJsYW5nLTI3LjMuNC4xK2Rmc2cvbGliL2tlcm5lbC9zcmMvdXNlcl9zdXAuZXJsag== +=mod:user_drv +Current size: 60448 +Current attributes: g2wAAAACaAJ3A3ZzbmwAAAABbhAAaG+sYI8pjexZUCBjowWxa2poAncJYmVoYXZpb3VybAAAAAF3Cmdlbl9zdGF0ZW1qag== +Current compilation info: g2wAAAADaAJ3B3ZlcnNpb25rAAU4LjUuNGgCdwdvcHRpb25zbAAAAAV3CmRlYnVnX2luZm9oAncBaWsARy9idWlsZC9yZXByb2R1Y2libGUtcGF0aC9lcmxhbmctMjcuMy40LjErZGZzZy9saWIva2VybmVsL3NyYy8uLi9pbmNsdWRldxl3YXJuX21pc3NpbmdfZG9jX2Z1bmN0aW9udxl3YXJuX21pc3NpbmdfZG9jX2NhbGxiYWNrdxx3YXJuX21pc3Npbmdfc3BlY19kb2N1bWVudGVkamgCdwZzb3VyY2VrAEkvYnVpbGQvcmVwcm9kdWNpYmxlLXBhdGgvZXJsYW5nLTI3LjMuNC4xK2Rmc2cvbGliL2tlcm5lbC9zcmMvdXNlcl9kcnYuZXJsag== +=mod:gen_statem +Current size: 92744 +Current attributes: g2wAAAADaAJ3A3ZzbmwAAAABbhAAD0CDNCw1fgoThWIKqhwhk2poAncJYmVoYXZpb3VybAAAAAF3A3N5c2poAncTZGVwcmVjYXRlZF9jYWxsYmFja2wAAAABaAN3DWZvcm1hdF9zdGF0dXNhAmsAG3VzZSBmb3JtYXRfc3RhdHVzLzEgaW5zdGVhZGpq +Current compilation info: g2wAAAADaAJ3B3ZlcnNpb25rAAU4LjUuNGgCdwdvcHRpb25zbAAAAAZ3CmRlYnVnX2luZm9oAncBaWsARy9idWlsZC9yZXByb2R1Y2libGUtcGF0aC9lcmxhbmctMjcuMy40LjErZGZzZy9saWIvc3RkbGliL3NyYy8uLi9pbmNsdWRlaAJ3AWlrAFEvYnVpbGQvcmVwcm9kdWNpYmxlLXBhdGgvZXJsYW5nLTI3LjMuNC4xK2Rmc2cvbGliL3N0ZGxpYi9zcmMvLi4vLi4va2VybmVsL2luY2x1ZGV3GXdhcm5fbWlzc2luZ19kb2NfZnVuY3Rpb253GXdhcm5fbWlzc2luZ19kb2NfY2FsbGJhY2t3HHdhcm5fbWlzc2luZ19zcGVjX2RvY3VtZW50ZWRqaAJ3BnNvdXJjZWsASy9idWlsZC9yZXByb2R1Y2libGUtcGF0aC9lcmxhbmctMjcuMy40LjErZGZzZy9saWIvc3RkbGliL3NyYy9nZW5fc3RhdGVtLmVybGo= +=mod:prim_tty +Current size: 82016 +Current attributes: g2wAAAABaAJ3A3ZzbmwAAAABbhAArd49UxpmZGGyCUXC1IYLpGpq +Current compilation info: g2wAAAADaAJ3B3ZlcnNpb25rAAU4LjUuNGgCdwdvcHRpb25zbAAAAAV3CmRlYnVnX2luZm9oAncBaWsARy9idWlsZC9yZXByb2R1Y2libGUtcGF0aC9lcmxhbmctMjcuMy40LjErZGZzZy9saWIva2VybmVsL3NyYy8uLi9pbmNsdWRldxl3YXJuX21pc3NpbmdfZG9jX2Z1bmN0aW9udxl3YXJuX21pc3NpbmdfZG9jX2NhbGxiYWNrdxx3YXJuX21pc3Npbmdfc3BlY19kb2N1bWVudGVkamgCdwZzb3VyY2VrAEkvYnVpbGQvcmVwcm9kdWNpYmxlLXBhdGgvZXJsYW5nLTI3LjMuNC4xK2Rmc2cvbGliL2tlcm5lbC9zcmMvcHJpbV90dHkuZXJsag== +=mod:io +Current size: 28840 +Current attributes: g2wAAAABaAJ3A3ZzbmwAAAABbhAAvLVNE9/p8cnRLqUX0r3rq2pq +Current compilation info: g2wAAAADaAJ3B3ZlcnNpb25rAAU4LjUuNGgCdwdvcHRpb25zbAAAAAZ3CmRlYnVnX2luZm9oAncBaWsARy9idWlsZC9yZXByb2R1Y2libGUtcGF0aC9lcmxhbmctMjcuMy40LjErZGZzZy9saWIvc3RkbGliL3NyYy8uLi9pbmNsdWRlaAJ3AWlrAFEvYnVpbGQvcmVwcm9kdWNpYmxlLXBhdGgvZXJsYW5nLTI3LjMuNC4xK2Rmc2cvbGliL3N0ZGxpYi9zcmMvLi4vLi4va2VybmVsL2luY2x1ZGV3GXdhcm5fbWlzc2luZ19kb2NfZnVuY3Rpb253GXdhcm5fbWlzc2luZ19kb2NfY2FsbGJhY2t3HHdhcm5fbWlzc2luZ19zcGVjX2RvY3VtZW50ZWRqaAJ3BnNvdXJjZWsAQy9idWlsZC9yZXByb2R1Y2libGUtcGF0aC9lcmxhbmctMjcuMy40LjErZGZzZy9saWIvc3RkbGliL3NyYy9pby5lcmxq +=mod:group +Current size: 69320 +Current attributes: g2wAAAABaAJ3A3ZzbmwAAAABbhAAPXGzuUnbpV0dGsdBdOOZfmpq +Current compilation info: g2wAAAADaAJ3B3ZlcnNpb25rAAU4LjUuNGgCdwdvcHRpb25zbAAAAAV3CmRlYnVnX2luZm9oAncBaWsARy9idWlsZC9yZXByb2R1Y2libGUtcGF0aC9lcmxhbmctMjcuMy40LjErZGZzZy9saWIva2VybmVsL3NyYy8uLi9pbmNsdWRldxl3YXJuX21pc3NpbmdfZG9jX2Z1bmN0aW9udxl3YXJuX21pc3NpbmdfZG9jX2NhbGxiYWNrdxx3YXJuX21pc3Npbmdfc3BlY19kb2N1bWVudGVkamgCdwZzb3VyY2VrAEYvYnVpbGQvcmVwcm9kdWNpYmxlLXBhdGgvZXJsYW5nLTI3LjMuNC4xK2Rmc2cvbGliL2tlcm5lbC9zcmMvZ3JvdXAuZXJsag== +=mod:edlin +Current size: 51560 +Current attributes: g2wAAAABaAJ3A3ZzbmwAAAABbhAArweeF+yeEQ5QDPkDpvBxrGpq +Current compilation info: g2wAAAADaAJ3B3ZlcnNpb25rAAU4LjUuNGgCdwdvcHRpb25zbAAAAAZ3CmRlYnVnX2luZm9oAncBaWsARy9idWlsZC9yZXByb2R1Y2libGUtcGF0aC9lcmxhbmctMjcuMy40LjErZGZzZy9saWIvc3RkbGliL3NyYy8uLi9pbmNsdWRlaAJ3AWlrAFEvYnVpbGQvcmVwcm9kdWNpYmxlLXBhdGgvZXJsYW5nLTI3LjMuNC4xK2Rmc2cvbGliL3N0ZGxpYi9zcmMvLi4vLi4va2VybmVsL2luY2x1ZGV3GXdhcm5fbWlzc2luZ19kb2NfZnVuY3Rpb253GXdhcm5fbWlzc2luZ19kb2NfY2FsbGJhY2t3HHdhcm5fbWlzc2luZ19zcGVjX2RvY3VtZW50ZWRqaAJ3BnNvdXJjZWsARi9idWlsZC9yZXByb2R1Y2libGUtcGF0aC9lcmxhbmctMjcuMy40LjErZGZzZy9saWIvc3RkbGliL3NyYy9lZGxpbi5lcmxq +=mod:io_lib +Current size: 41832 +Current attributes: g2wAAAABaAJ3A3ZzbmwAAAABbhAA/srPMtCB35kgxsiu+oeBPGpq +Current compilation info: g2wAAAADaAJ3B3ZlcnNpb25rAAU4LjUuNGgCdwdvcHRpb25zbAAAAAZ3CmRlYnVnX2luZm9oAncBaWsARy9idWlsZC9yZXByb2R1Y2libGUtcGF0aC9lcmxhbmctMjcuMy40LjErZGZzZy9saWIvc3RkbGliL3NyYy8uLi9pbmNsdWRlaAJ3AWlrAFEvYnVpbGQvcmVwcm9kdWNpYmxlLXBhdGgvZXJsYW5nLTI3LjMuNC4xK2Rmc2cvbGliL3N0ZGxpYi9zcmMvLi4vLi4va2VybmVsL2luY2x1ZGV3GXdhcm5fbWlzc2luZ19kb2NfZnVuY3Rpb253GXdhcm5fbWlzc2luZ19kb2NfY2FsbGJhY2t3HHdhcm5fbWlzc2luZ19zcGVjX2RvY3VtZW50ZWRqaAJ3BnNvdXJjZWsARy9idWlsZC9yZXByb2R1Y2libGUtcGF0aC9lcmxhbmctMjcuMy40LjErZGZzZy9saWIvc3RkbGliL3NyYy9pb19saWIuZXJsag== +=mod:logger_sup +Current size: 1864 +Current attributes: g2wAAAACaAJ3A3ZzbmwAAAABbhAA1tMyMEOqj4vq2RNWp2yUJmpoAncJYmVoYXZpb3VybAAAAAF3CnN1cGVydmlzb3Jqag== +Current compilation info: g2wAAAADaAJ3B3ZlcnNpb25rAAU4LjUuNGgCdwdvcHRpb25zbAAAAAV3CmRlYnVnX2luZm9oAncBaWsARy9idWlsZC9yZXByb2R1Y2libGUtcGF0aC9lcmxhbmctMjcuMy40LjErZGZzZy9saWIva2VybmVsL3NyYy8uLi9pbmNsdWRldxl3YXJuX21pc3NpbmdfZG9jX2Z1bmN0aW9udxl3YXJuX21pc3NpbmdfZG9jX2NhbGxiYWNrdxx3YXJuX21pc3Npbmdfc3BlY19kb2N1bWVudGVkamgCdwZzb3VyY2VrAEsvYnVpbGQvcmVwcm9kdWNpYmxlLXBhdGgvZXJsYW5nLTI3LjMuNC4xK2Rmc2cvbGliL2tlcm5lbC9zcmMvbG9nZ2VyX3N1cC5lcmxq +=mod:edlin_key +Current size: 19168 +Current attributes: g2wAAAABaAJ3A3ZzbmwAAAABbhAAwZTzZ40T/vREcbDhLp+afWpq +Current compilation info: g2wAAAADaAJ3B3ZlcnNpb25rAAU4LjUuNGgCdwdvcHRpb25zbAAAAAZ3CmRlYnVnX2luZm9oAncBaWsARy9idWlsZC9yZXByb2R1Y2libGUtcGF0aC9lcmxhbmctMjcuMy40LjErZGZzZy9saWIvc3RkbGliL3NyYy8uLi9pbmNsdWRlaAJ3AWlrAFEvYnVpbGQvcmVwcm9kdWNpYmxlLXBhdGgvZXJsYW5nLTI3LjMuNC4xK2Rmc2cvbGliL3N0ZGxpYi9zcmMvLi4vLi4va2VybmVsL2luY2x1ZGV3GXdhcm5fbWlzc2luZ19kb2NfZnVuY3Rpb253GXdhcm5fbWlzc2luZ19kb2NfY2FsbGJhY2t3HHdhcm5fbWlzc2luZ19zcGVjX2RvY3VtZW50ZWRqaAJ3BnNvdXJjZWsASi9idWlsZC9yZXByb2R1Y2libGUtcGF0aC9lcmxhbmctMjcuMy40LjErZGZzZy9saWIvc3RkbGliL3NyYy9lZGxpbl9rZXkuZXJsag== +=mod:logger_handler_watcher +Current size: 3944 +Current attributes: g2wAAAACaAJ3A3ZzbmwAAAABbhAA8KD/9r/XCkdk82ccr5/0YWpoAncJYmVoYXZpb3VybAAAAAF3Cmdlbl9zZXJ2ZXJqag== +Current compilation info: g2wAAAADaAJ3B3ZlcnNpb25rAAU4LjUuNGgCdwdvcHRpb25zbAAAAAV3CmRlYnVnX2luZm9oAncBaWsARy9idWlsZC9yZXByb2R1Y2libGUtcGF0aC9lcmxhbmctMjcuMy40LjErZGZzZy9saWIva2VybmVsL3NyYy8uLi9pbmNsdWRldxl3YXJuX21pc3NpbmdfZG9jX2Z1bmN0aW9udxl3YXJuX21pc3NpbmdfZG9jX2NhbGxiYWNrdxx3YXJuX21pc3Npbmdfc3BlY19kb2N1bWVudGVkamgCdwZzb3VyY2VrAFcvYnVpbGQvcmVwcm9kdWNpYmxlLXBhdGgvZXJsYW5nLTI3LjMuNC4xK2Rmc2cvbGliL2tlcm5lbC9zcmMvbG9nZ2VyX2hhbmRsZXJfd2F0Y2hlci5lcmxq +=mod:io_lib_format +Current size: 42320 +Current attributes: g2wAAAABaAJ3A3ZzbmwAAAABbhAAYU8TRNrMKBG374UnVwjsK2pq +Current compilation info: g2wAAAADaAJ3B3ZlcnNpb25rAAU4LjUuNGgCdwdvcHRpb25zbAAAAAZ3CmRlYnVnX2luZm9oAncBaWsARy9idWlsZC9yZXByb2R1Y2libGUtcGF0aC9lcmxhbmctMjcuMy40LjErZGZzZy9saWIvc3RkbGliL3NyYy8uLi9pbmNsdWRlaAJ3AWlrAFEvYnVpbGQvcmVwcm9kdWNpYmxlLXBhdGgvZXJsYW5nLTI3LjMuNC4xK2Rmc2cvbGliL3N0ZGxpYi9zcmMvLi4vLi4va2VybmVsL2luY2x1ZGV3GXdhcm5fbWlzc2luZ19kb2NfZnVuY3Rpb253GXdhcm5fbWlzc2luZ19kb2NfY2FsbGJhY2t3HHdhcm5fbWlzc2luZ19zcGVjX2RvY3VtZW50ZWRqaAJ3BnNvdXJjZWsATi9idWlsZC9yZXByb2R1Y2libGUtcGF0aC9lcmxhbmctMjcuMy40LjErZGZzZy9saWIvc3RkbGliL3NyYy9pb19saWJfZm9ybWF0LmVybGo= +=mod:kernel_config +Current size: 7696 +Current attributes: g2wAAAACaAJ3A3ZzbmwAAAABbhAADPuIDPW4OE0d741eNR0oxGpoAncJYmVoYXZpb3VybAAAAAF3Cmdlbl9zZXJ2ZXJqag== +Current compilation info: g2wAAAADaAJ3B3ZlcnNpb25rAAU4LjUuNGgCdwdvcHRpb25zbAAAAAV3CmRlYnVnX2luZm9oAncBaWsARy9idWlsZC9yZXByb2R1Y2libGUtcGF0aC9lcmxhbmctMjcuMy40LjErZGZzZy9saWIva2VybmVsL3NyYy8uLi9pbmNsdWRldxl3YXJuX21pc3NpbmdfZG9jX2Z1bmN0aW9udxl3YXJuX21pc3NpbmdfZG9jX2NhbGxiYWNrdxx3YXJuX21pc3Npbmdfc3BlY19kb2N1bWVudGVkamgCdwZzb3VyY2VrAE4vYnVpbGQvcmVwcm9kdWNpYmxlLXBhdGgvZXJsYW5nLTI3LjMuNC4xK2Rmc2cvbGliL2tlcm5lbC9zcmMva2VybmVsX2NvbmZpZy5lcmxq +=mod:kernel_refc +Current size: 6440 +Current attributes: g2wAAAACaAJ3A3ZzbmwAAAABbhAAzogAXLmwus+/+7aA35wXkmpoAncJYmVoYXZpb3VybAAAAAF3Cmdlbl9zZXJ2ZXJqag== +Current compilation info: g2wAAAADaAJ3B3ZlcnNpb25rAAU4LjUuNGgCdwdvcHRpb25zbAAAAAV3CmRlYnVnX2luZm9oAncBaWsARy9idWlsZC9yZXByb2R1Y2libGUtcGF0aC9lcmxhbmctMjcuMy40LjErZGZzZy9saWIva2VybmVsL3NyYy8uLi9pbmNsdWRldxl3YXJuX21pc3NpbmdfZG9jX2Z1bmN0aW9udxl3YXJuX21pc3NpbmdfZG9jX2NhbGxiYWNrdxx3YXJuX21pc3Npbmdfc3BlY19kb2N1bWVudGVkamgCdwZzb3VyY2VrAEwvYnVpbGQvcmVwcm9kdWNpYmxlLXBhdGgvZXJsYW5nLTI3LjMuNC4xK2Rmc2cvbGliL2tlcm5lbC9zcmMva2VybmVsX3JlZmMuZXJsag== +=mod:erl_signal_handler +Current size: 3808 +Current attributes: g2wAAAACaAJ3A3ZzbmwAAAABbhAA4T/O51EEMsoIf/aTrcQALGpoAncJYmVoYXZpb3VybAAAAAF3CWdlbl9ldmVudGpq +Current compilation info: g2wAAAADaAJ3B3ZlcnNpb25rAAU4LjUuNGgCdwdvcHRpb25zbAAAAAV3CmRlYnVnX2luZm9oAncBaWsARy9idWlsZC9yZXByb2R1Y2libGUtcGF0aC9lcmxhbmctMjcuMy40LjErZGZzZy9saWIva2VybmVsL3NyYy8uLi9pbmNsdWRldxl3YXJuX21pc3NpbmdfZG9jX2Z1bmN0aW9udxl3YXJuX21pc3NpbmdfZG9jX2NhbGxiYWNrdxx3YXJuX21pc3Npbmdfc3BlY19kb2N1bWVudGVkamgCdwZzb3VyY2VrAFMvYnVpbGQvcmVwcm9kdWNpYmxlLXBhdGgvZXJsYW5nLTI3LjMuNC4xK2Rmc2cvbGliL2tlcm5lbC9zcmMvZXJsX3NpZ25hbF9oYW5kbGVyLmVybGo= +=mod:logger_formatter +Current size: 30160 +Current attributes: g2wAAAABaAJ3A3ZzbmwAAAABbhAAVIhGVmD9fu9YRO6Ids4Cpmpq +Current compilation info: g2wAAAADaAJ3B3ZlcnNpb25rAAU4LjUuNGgCdwdvcHRpb25zbAAAAAV3CmRlYnVnX2luZm9oAncBaWsARy9idWlsZC9yZXByb2R1Y2libGUtcGF0aC9lcmxhbmctMjcuMy40LjErZGZzZy9saWIva2VybmVsL3NyYy8uLi9pbmNsdWRldxl3YXJuX21pc3NpbmdfZG9jX2Z1bmN0aW9udxl3YXJuX21pc3NpbmdfZG9jX2NhbGxiYWNrdxx3YXJuX21pc3Npbmdfc3BlY19kb2N1bWVudGVkamgCdwZzb3VyY2VrAFEvYnVpbGQvcmVwcm9kdWNpYmxlLXBhdGgvZXJsYW5nLTI3LjMuNC4xK2Rmc2cvbGliL2tlcm5lbC9zcmMvbG9nZ2VyX2Zvcm1hdHRlci5lcmxq +=mod:logger_std_h +Current size: 31984 +Current attributes: g2wAAAACaAJ3A3ZzbmwAAAABbhAAubfnJ1oZaHQSzVL3mdRVSGpoAncJYmVoYXZpb3VybAAAAAF3DmxvZ2dlcl9oYW5kbGVyamo= +Current compilation info: g2wAAAADaAJ3B3ZlcnNpb25rAAU4LjUuNGgCdwdvcHRpb25zbAAAAAV3CmRlYnVnX2luZm9oAncBaWsARy9idWlsZC9yZXByb2R1Y2libGUtcGF0aC9lcmxhbmctMjcuMy40LjErZGZzZy9saWIva2VybmVsL3NyYy8uLi9pbmNsdWRldxl3YXJuX21pc3NpbmdfZG9jX2Z1bmN0aW9udxl3YXJuX21pc3NpbmdfZG9jX2NhbGxiYWNrdxx3YXJuX21pc3Npbmdfc3BlY19kb2N1bWVudGVkamgCdwZzb3VyY2VrAE0vYnVpbGQvcmVwcm9kdWNpYmxlLXBhdGgvZXJsYW5nLTI3LjMuNC4xK2Rmc2cvbGliL2tlcm5lbC9zcmMvbG9nZ2VyX3N0ZF9oLmVybGo= +=mod:logger_h_common +Current size: 28344 +Current attributes: g2wAAAACaAJ3A3ZzbmwAAAABbhAA46aMS/cFaHxJQEKiRXE3BWpoAncJYmVoYXZpb3VybAAAAAF3Cmdlbl9zZXJ2ZXJqag== +Current compilation info: g2wAAAADaAJ3B3ZlcnNpb25rAAU4LjUuNGgCdwdvcHRpb25zbAAAAAV3CmRlYnVnX2luZm9oAncBaWsARy9idWlsZC9yZXByb2R1Y2libGUtcGF0aC9lcmxhbmctMjcuMy40LjErZGZzZy9saWIva2VybmVsL3NyYy8uLi9pbmNsdWRldxl3YXJuX21pc3NpbmdfZG9jX2Z1bmN0aW9udxl3YXJuX21pc3NpbmdfZG9jX2NhbGxiYWNrdxx3YXJuX21pc3Npbmdfc3BlY19kb2N1bWVudGVkamgCdwZzb3VyY2VrAFAvYnVpbGQvcmVwcm9kdWNpYmxlLXBhdGgvZXJsYW5nLTI3LjMuNC4xK2Rmc2cvbGliL2tlcm5lbC9zcmMvbG9nZ2VyX2hfY29tbW9uLmVybGo= +=mod:c +Current size: 66552 +Current attributes: g2wAAAABaAJ3A3ZzbmwAAAABbhAAqKsWjtig2RpF/JZSPH/6J2pq +Current compilation info: g2wAAAADaAJ3B3ZlcnNpb25rAAU4LjUuNGgCdwdvcHRpb25zbAAAAAZ3CmRlYnVnX2luZm9oAncBaWsARy9idWlsZC9yZXByb2R1Y2libGUtcGF0aC9lcmxhbmctMjcuMy40LjErZGZzZy9saWIvc3RkbGliL3NyYy8uLi9pbmNsdWRlaAJ3AWlrAFEvYnVpbGQvcmVwcm9kdWNpYmxlLXBhdGgvZXJsYW5nLTI3LjMuNC4xK2Rmc2cvbGliL3N0ZGxpYi9zcmMvLi4vLi4va2VybmVsL2luY2x1ZGV3GXdhcm5fbWlzc2luZ19kb2NfZnVuY3Rpb253GXdhcm5fbWlzc2luZ19kb2NfY2FsbGJhY2t3HHdhcm5fbWlzc2luZ19zcGVjX2RvY3VtZW50ZWRqaAJ3BnNvdXJjZWsAQi9idWlsZC9yZXByb2R1Y2libGUtcGF0aC9lcmxhbmctMjcuMy40LjErZGZzZy9saWIvc3RkbGliL3NyYy9jLmVybGo= +=mod:orddict +Current size: 10592 +Current attributes: g2wAAAABaAJ3A3ZzbmwAAAABbhAAaLM1fu5+H1NnyiSuBXe4Vmpq +Current compilation info: g2wAAAADaAJ3B3ZlcnNpb25rAAU4LjUuNGgCdwdvcHRpb25zbAAAAAZ3CmRlYnVnX2luZm9oAncBaWsARy9idWlsZC9yZXByb2R1Y2libGUtcGF0aC9lcmxhbmctMjcuMy40LjErZGZzZy9saWIvc3RkbGliL3NyYy8uLi9pbmNsdWRlaAJ3AWlrAFEvYnVpbGQvcmVwcm9kdWNpYmxlLXBhdGgvZXJsYW5nLTI3LjMuNC4xK2Rmc2cvbGliL3N0ZGxpYi9zcmMvLi4vLi4va2VybmVsL2luY2x1ZGV3GXdhcm5fbWlzc2luZ19kb2NfZnVuY3Rpb253GXdhcm5fbWlzc2luZ19kb2NfY2FsbGJhY2t3HHdhcm5fbWlzc2luZ19zcGVjX2RvY3VtZW50ZWRqaAJ3BnNvdXJjZWsASC9idWlsZC9yZXByb2R1Y2libGUtcGF0aC9lcmxhbmctMjcuMy40LjErZGZzZy9saWIvc3RkbGliL3NyYy9vcmRkaWN0LmVybGo= +=mod:raw_file_io +Current size: 3864 +Current attributes: g2wAAAABaAJ3A3ZzbmwAAAABbhAAXIUx7L0H/c0bp/ChoPv1P2pq +Current compilation info: g2wAAAADaAJ3B3ZlcnNpb25rAAU4LjUuNGgCdwdvcHRpb25zbAAAAAV3CmRlYnVnX2luZm9oAncBaWsARy9idWlsZC9yZXByb2R1Y2libGUtcGF0aC9lcmxhbmctMjcuMy40LjErZGZzZy9saWIva2VybmVsL3NyYy8uLi9pbmNsdWRldxl3YXJuX21pc3NpbmdfZG9jX2Z1bmN0aW9udxl3YXJuX21pc3NpbmdfZG9jX2NhbGxiYWNrdxx3YXJuX21pc3Npbmdfc3BlY19kb2N1bWVudGVkamgCdwZzb3VyY2VrAEwvYnVpbGQvcmVwcm9kdWNpYmxlLXBhdGgvZXJsYW5nLTI3LjMuNC4xK2Rmc2cvbGliL2tlcm5lbC9zcmMvcmF3X2ZpbGVfaW8uZXJsag== +=fun +Module: global +Uniq: 97255194 +Index: 7 +Address: 0x0000772b50f1d940 +Refc: 2 +=fun +Module: erl_eval +Uniq: 81571850 +Index: 59 +Address: 0x0000772b50de2968 +Refc: 2 +=fun +Module: supervisor +Uniq: 88264141 +Index: 13 +Address: 0x0000772b50d5758f +Refc: 2 +=fun +Module: io_lib +Uniq: 31722559 +Index: 1 +Address: 0x0000772b50fadb90 +Refc: 2 +=fun +Module: prim_socket +Uniq: 108649643 +Index: 16 +Address: 0x0000772b50c534ea +Refc: 2 +=fun +Module: rpc +Uniq: 89088806 +Index: 0 +Address: 0x0000772b50eebf5e +Refc: 2 +=fun +Module: erl_lint +Uniq: 59358358 +Index: 48 +Address: 0x0000772b50dc1e60 +Refc: 2 +=fun +Module: prim_zip +Uniq: 107817055 +Index: 3 +Address: 0x0000772b50c59bf0 +Refc: 2 +=fun +Module: erl_eval +Uniq: 81571850 +Index: 2 +Address: 0x0000772b50de715d +Refc: 2 +=fun +Module: logger_server +Uniq: 69885138 +Index: 6 +Address: 0x0000772b50d81b89 +Refc: 2 +=fun +Module: inet +Uniq: 39702559 +Index: 7 +Address: 0x0000772b50ecfa98 +Refc: 2 +=fun +Module: erl_lint +Uniq: 59358358 +Index: 18 +Address: 0x0000772b50dc5410 +Refc: 2 +=fun +Module: unicode +Uniq: 89740446 +Index: 12 +Address: 0x0000772b50e93da0 +Refc: 2 +=fun +Module: erl_parse +Uniq: 95113583 +Index: 8 +Address: 0x0000772b50e2bca8 +Refc: 2 +=fun +Module: rand +Uniq: 40079776 +Index: 1 +Address: 0x0000772b50f28fe8 +Refc: 2 +=fun +Module: erl_eval +Uniq: 81571850 +Index: 32 +Address: 0x0000772b50de410c +Refc: 2 +=fun +Module: prim_socket +Uniq: 108649643 +Index: 5 +Address: 0x0000772b50c53968 +Refc: 2 +=fun +Module: erl_lint +Uniq: 59358358 +Index: 91 +Address: 0x0000772b50dbd1bd +Refc: 2 +=fun +Module: inet_config +Uniq: 6161651 +Index: 1 +Address: 0x0000772b50eb69f0 +Refc: 2 +=fun +Module: inet_db +Uniq: 7513413 +Index: 5 +Address: 0x0000772b50eb0db0 +Refc: 2 +=fun +Module: erl_features +Uniq: 45623947 +Index: 9 +Address: 0x0000772b50e99400 +Refc: 2 +=fun +Module: global +Uniq: 97255194 +Index: 16 +Address: 0x0000772b50f1cf55 +Refc: 2 +=fun +Module: supervisor +Uniq: 88264141 +Index: 2 +Address: 0x0000772b50d58200 +Refc: 2 +=fun +Module: erl_lint +Uniq: 59358358 +Index: 100 +Address: 0x0000772b50dbc403 +Refc: 2 +=fun +Module: peer +Uniq: 58704516 +Index: 3 +Address: 0x0000772b50e68e2c +Refc: 2 +=fun +Module: erpc +Uniq: 1558009 +Index: 1 +Address: 0x0000772b50f52d60 +Refc: 2 +=fun +Module: erl_lint +Uniq: 59358358 +Index: 61 +Address: 0x0000772b50dc1732 +Refc: 2 +=fun +Module: rand +Uniq: 40079776 +Index: 20 +Address: 0x0000772b50f2bed0 +Refc: 2 +=fun +Module: erl_eval +Uniq: 81571850 +Index: 13 +Address: 0x0000772b50de5ca3 +Refc: 2 +=fun +Module: logger_formatter +Uniq: 87037555 +Index: 0 +Address: 0x0000772b50fcb410 +Refc: 2 +=fun +Module: erl_lint +Uniq: 59358358 +Index: 70 +Address: 0x0000772b50dbfba8 +Refc: 2 +=fun +Module: beam_lib +Uniq: 56915673 +Index: 1 +Address: 0x0000772b50e77690 +Refc: 2 +=fun +Module: inet +Uniq: 39702559 +Index: 20 +Address: 0x0000772b50ecefb8 +Refc: 2 +=fun +Module: erl_lint +Uniq: 59358358 +Index: 31 +Address: 0x0000772b50dc2b8f +Refc: 2 +=fun +Module: erl_parse +Uniq: 95113583 +Index: 5 +Address: 0x0000772b50e2c0bc +Refc: 2 +=fun +Module: code_server +Uniq: 83632253 +Index: 3 +Address: 0x0000772b50cb1e90 +Refc: 2 +=fun +Module: global +Uniq: 97255194 +Index: 15 +Address: 0x0000772b50f1cfb3 +Refc: 2 +=fun +Module: net_kernel +Uniq: 107400493 +Index: 4 +Address: 0x0000772b50f01e08 +Refc: 2 +=fun +Module: inet_parse +Uniq: 70636431 +Index: 9 +Address: 0x0000772b50edb1e8 +Refc: 2 +=fun +Module: erl_eval +Uniq: 81571850 +Index: 51 +Address: 0x0000772b50de2e3b +Refc: 2 +=fun +Module: unicode +Uniq: 89740446 +Index: 1 +Address: 0x0000772b50e92eb8 +Refc: 2 +=fun +Module: gen_event +Uniq: 98502976 +Index: 4 +Address: 0x0000772b50d8dd53 +Refc: 2 +=fun +Module: prim_tty +Uniq: 86006838 +Index: 0 +Address: 0x0000772b50f85fb8 +Refc: 2 +=fun +Module: erl_lint +Uniq: 59358358 +Index: 40 +Address: 0x0000772b50dc21c1 +Refc: 2 +=fun +Module: prim_socket +Uniq: 108649643 +Index: 8 +Address: 0x0000772b50c53a48 +Refc: 2 +=fun +Module: ets +Uniq: 107168513 +Index: 12 +Address: 0x0000772b50d44225 +Refc: 2 +=fun +Module: erl_init +Uniq: 3103087 +Index: 0 +Address: 0x0000772b50c05c98 +Refc: 2 +=fun +Module: erl_eval +Uniq: 81571850 +Index: 65 +Address: 0x0000772b50de1dc0 +Refc: 2 +=fun +Module: proc_lib +Uniq: 95872253 +Index: 1 +Address: 0x0000772b50d35900 +Refc: 2 +=fun +Module: unicode +Uniq: 89740446 +Index: 20 +Address: 0x0000772b50e93778 +Refc: 2 +=fun +Module: erl_lint +Uniq: 59358358 +Index: 10 +Address: 0x0000772b50dc6f40 +Refc: 2 +=fun +Module: gen_statem +Uniq: 77138149 +Index: 0 +Address: 0x0000772b50f66778 +Refc: 2 +=fun +Module: rand +Uniq: 40079776 +Index: 9 +Address: 0x0000772b50f280c0 +Refc: 2 +=fun +Module: erl_prim_loader +Uniq: 91968038 +Index: 11 +Address: 0x0000772b50c6bcce +Refc: 2 +=fun +Module: erl_eval +Uniq: 81571850 +Index: 24 +Address: 0x0000772b50de5021 +Refc: 2 +=fun +Module: init +Uniq: 88714206 +Index: 2 +Address: 0x0000772b50c16f60 +Refc: 2 +=fun +Module: erl_lint +Uniq: 59358358 +Index: 83 +Address: 0x0000772b50dbdac1 +Refc: 2 +=fun +Module: c +Uniq: 20960249 +Index: 12 +Address: 0x0000772b50fe3e88 +Refc: 2 +=fun +Module: ets +Uniq: 107168513 +Index: 17 +Address: 0x0000772b50d4464e +Refc: 2 +=fun +Module: application_controller +Uniq: 70664124 +Index: 4 +Address: 0x0000772b50d03d18 +Refc: 2 +=fun +Module: global_group +Uniq: 125216658 +Index: 4 +Address: 0x0000772b50f46014 +Refc: 2 +=fun +Module: maps +Uniq: 82648977 +Index: 4 +Address: 0x0000772b50f389a8 +Refc: 2 +=fun +Module: erl_features +Uniq: 45623947 +Index: 1 +Address: 0x0000772b50e997e8 +Refc: 2 +=fun +Module: user_drv +Uniq: 56461357 +Index: 1 +Address: 0x0000772b50f6066a +Refc: 2 +=fun +Module: global +Uniq: 97255194 +Index: 24 +Address: 0x0000772b50f1b977 +Refc: 2 +=fun +Module: erl_eval +Uniq: 81571850 +Index: 62 +Address: 0x0000772b50de2720 +Refc: 2 +=fun +Module: supervisor +Uniq: 88264141 +Index: 10 +Address: 0x0000772b50d577e1 +Refc: 2 +=fun +Module: erl_lint +Uniq: 59358358 +Index: 53 +Address: 0x0000772b50dc19ad +Refc: 2 +=fun +Module: raw_file_io +Uniq: 33533917 +Index: 2 +Address: 0x0000772b50fe8e20 +Refc: 2 +=fun +Module: rand +Uniq: 40079776 +Index: 28 +Address: 0x0000772b50f304c0 +Refc: 2 +=fun +Module: prim_zip +Uniq: 107817055 +Index: 6 +Address: 0x0000772b50c5d339 +Refc: 2 +=fun +Module: erl_eval +Uniq: 81571850 +Index: 5 +Address: 0x0000772b50de6a7e +Refc: 2 +=fun +Module: inet +Uniq: 39702559 +Index: 12 +Address: 0x0000772b50ecf8ed +Refc: 2 +=fun +Module: erl_lint +Uniq: 59358358 +Index: 23 +Address: 0x0000772b50dc3ab0 +Refc: 2 +=fun +Module: erl_parse +Uniq: 95113583 +Index: 13 +Address: 0x0000772b50e2b5f8 +Refc: 2 +=fun +Module: code_server +Uniq: 83632253 +Index: 11 +Address: 0x0000772b50cb0c07 +Refc: 2 +=fun +Module: unicode +Uniq: 89740446 +Index: 9 +Address: 0x0000772b50e8ffb8 +Refc: 2 +=fun +Module: erl_eval +Uniq: 81571850 +Index: 43 +Address: 0x0000772b50de361b +Refc: 2 +=fun +Module: code +Uniq: 92045327 +Index: 6 +Address: 0x0000772b50cc33f0 +Refc: 2 +=fun +Module: erl_lint +Uniq: 59358358 +Index: 32 +Address: 0x0000772b50dc2952 +Refc: 2 +=fun +Module: prim_socket +Uniq: 108649643 +Index: 0 +Address: 0x0000772b50c53eb0 +Refc: 2 +=fun +Module: logger_simple_h +Uniq: 50489874 +Index: 4 +Address: 0x0000772b50d7a128 +Refc: 2 +=fun +Module: ets +Uniq: 107168513 +Index: 4 +Address: 0x0000772b50d44879 +Refc: 2 +=fun +Module: global +Uniq: 97255194 +Index: 21 +Address: 0x0000772b50f1c0a1 +Refc: 2 +=fun +Module: erl_lint +Uniq: 59358358 +Index: 105 +Address: 0x0000772b50dbbde3 +Refc: 2 +=fun +Module: erl_lint +Uniq: 59358358 +Index: 2 +Address: 0x0000772b50dc90e0 +Refc: 2 +=fun +Module: peer +Uniq: 58704516 +Index: 4 +Address: 0x0000772b50e66da8 +Refc: 2 +=fun +Module: rand +Uniq: 40079776 +Index: 17 +Address: 0x0000772b50f2d298 +Refc: 2 +=fun +Module: global +Uniq: 97255194 +Index: 34 +Address: 0x0000772b50f1ad80 +Refc: 2 +=fun +Module: erl_prim_loader +Uniq: 91968038 +Index: 3 +Address: 0x0000772b50c6cacb +Refc: 2 +=fun +Module: erl_eval +Uniq: 81571850 +Index: 16 +Address: 0x0000772b50de58e6 +Refc: 2 +=fun +Module: init +Uniq: 88714206 +Index: 10 +Address: 0x0000772b50c06b38 +Refc: 2 +=fun +Module: gen +Uniq: 70664065 +Index: 2 +Address: 0x0000772b50d0d560 +Refc: 2 +=fun +Module: erl_lint +Uniq: 59358358 +Index: 75 +Address: 0x0000772b50dbf55f +Refc: 2 +=fun +Module: c +Uniq: 20960249 +Index: 4 +Address: 0x0000772b50fe440d +Refc: 2 +=fun +Module: inet +Uniq: 39702559 +Index: 17 +Address: 0x0000772b50ecf49e +Refc: 2 +=fun +Module: application_controller +Uniq: 70664124 +Index: 12 +Address: 0x0000772b50d03100 +Refc: 2 +=fun +Module: global +Uniq: 97255194 +Index: 0 +Address: 0x0000772b50f173e8 +Refc: 2 +=fun +Module: net_kernel +Uniq: 107400493 +Index: 3 +Address: 0x0000772b50f01fda +Refc: 2 +=fun +Module: inet_parse +Uniq: 70636431 +Index: 2 +Address: 0x0000772b50edba38 +Refc: 2 +=fun +Module: erl_eval +Uniq: 81571850 +Index: 54 +Address: 0x0000772b50de2dbb +Refc: 2 +=fun +Module: rpc +Uniq: 89088806 +Index: 3 +Address: 0x0000772b50eeb878 +Refc: 2 +=fun +Module: erl_lint +Uniq: 59358358 +Index: 45 +Address: 0x0000772b50da3e60 +Refc: 2 +=fun +Module: logger_server +Uniq: 69885138 +Index: 3 +Address: 0x0000772b50d81f1f +Refc: 2 +=fun +Module: inet +Uniq: 39702559 +Index: 4 +Address: 0x0000772b50ecfbff +Refc: 2 +=fun +Module: erl_lint +Uniq: 59358358 +Index: 15 +Address: 0x0000772b50dc6100 +Refc: 2 +=fun +Module: rand +Uniq: 40079776 +Index: 6 +Address: 0x0000772b50f28268 +Refc: 2 +=fun +Module: unicode +Uniq: 89740446 +Index: 17 +Address: 0x0000772b50e93ab0 +Refc: 2 +=fun +Module: erl_prim_loader +Uniq: 91968038 +Index: 12 +Address: 0x0000772b50c6ba40 +Refc: 2 +=fun +Module: erl_eval +Uniq: 81571850 +Index: 35 +Address: 0x0000772b50de3cef +Refc: 2 +=fun +Module: erl_lint +Uniq: 59358358 +Index: 88 +Address: 0x0000772b50dbd799 +Refc: 2 +=fun +Module: inet_config +Uniq: 6161651 +Index: 2 +Address: 0x0000772b50eb6948 +Refc: 2 +=fun +Module: inet_db +Uniq: 7513413 +Index: 0 +Address: 0x0000772b50eb17c0 +Refc: 2 +=fun +Module: erl_features +Uniq: 45623947 +Index: 12 +Address: 0x0000772b50e99020 +Refc: 2 +=fun +Module: global +Uniq: 97255194 +Index: 29 +Address: 0x0000772b50f1af98 +Refc: 2 +=fun +Module: erl_lint +Uniq: 59358358 +Index: 97 +Address: 0x0000772b50dbc858 +Refc: 2 +=fun +Module: supervisor +Uniq: 88264141 +Index: 7 +Address: 0x0000772b50d57c78 +Refc: 2 +=fun +Module: erl_lint +Uniq: 59358358 +Index: 58 +Address: 0x0000772b50daa090 +Refc: 2 +=fun +Module: file +Uniq: 39298303 +Index: 0 +Address: 0x0000772b50cced91 +Refc: 2 +=fun +Module: rand +Uniq: 40079776 +Index: 25 +Address: 0x0000772b50f2d9c0 +Refc: 2 +=fun +Module: erl_eval +Uniq: 81571850 +Index: 8 +Address: 0x0000772b50de6496 +Refc: 2 +=fun +Module: erl_lint +Uniq: 59358358 +Index: 67 +Address: 0x0000772b50dbff38 +Refc: 2 +=fun +Module: inet +Uniq: 39702559 +Index: 9 +Address: 0x0000772b50ecf9ff +Refc: 2 +=fun +Module: inet_parse +Uniq: 70636431 +Index: 10 +Address: 0x0000772b50edb100 +Refc: 2 +=fun +Module: erl_lint +Uniq: 59358358 +Index: 28 +Address: 0x0000772b50dc35ad +Refc: 2 +=fun +Module: erl_parse +Uniq: 95113583 +Index: 2 +Address: 0x0000772b50e2cbec +Refc: 2 +=fun +Module: code_server +Uniq: 83632253 +Index: 0 +Address: 0x0000772b50cb28d3 +Refc: 2 +=fun +Module: unicode +Uniq: 89740446 +Index: 6 +Address: 0x0000772b50e93e28 +Refc: 2 +=fun +Module: global +Uniq: 97255194 +Index: 8 +Address: 0x0000772b50f1d90a +Refc: 2 +=fun +Module: net_kernel +Uniq: 107400493 +Index: 11 +Address: 0x0000772b50f01a58 +Refc: 2 +=fun +Module: erl_eval +Uniq: 81571850 +Index: 46 +Address: 0x0000772b50de31a8 +Refc: 2 +=fun +Module: gen_event +Uniq: 98502976 +Index: 1 +Address: 0x0000772b50d8e7c6 +Refc: 2 +=fun +Module: erl_lint +Uniq: 59358358 +Index: 37 +Address: 0x0000772b50dc2672 +Refc: 2 +=fun +Module: prim_socket +Uniq: 108649643 +Index: 11 +Address: 0x0000772b50c53728 +Refc: 2 +=fun +Module: group +Uniq: 66375451 +Index: 2 +Address: 0x0000772b50f9a758 +Refc: 2 +=fun +Module: standard_error +Uniq: 42423536 +Index: 1 +Address: 0x0000772b50e9cf60 +Refc: 2 +=fun +Module: logger_simple_h +Uniq: 50489874 +Index: 3 +Address: 0x0000772b50d7a2d0 +Refc: 2 +=fun +Module: ets +Uniq: 107168513 +Index: 15 +Address: 0x0000772b50d43c9d +Refc: 2 +=fun +Module: application_controller +Uniq: 70664124 +Index: 18 +Address: 0x0000772b50cfe648 +Refc: 2 +=fun +Module: erl_lint +Uniq: 59358358 +Index: 110 +Address: 0x0000772b50dc51bf +Refc: 2 +=fun +Module: binary +Uniq: 15025403 +Index: 2 +Address: 0x0000772b50e7d3de +Refc: 2 +=fun +Module: erl_lint +Uniq: 59358358 +Index: 7 +Address: 0x0000772b50d986c0 +Refc: 2 +=fun +Module: rand +Uniq: 40079776 +Index: 14 +Address: 0x0000772b50f2c8e0 +Refc: 2 +=fun +Module: erl_eval +Uniq: 81571850 +Index: 27 +Address: 0x0000772b50de49aa +Refc: 2 +=fun +Module: erl_prim_loader +Uniq: 91968038 +Index: 4 +Address: 0x0000772b50c6ca23 +Refc: 2 +=fun +Module: init +Uniq: 88714206 +Index: 1 +Address: 0x0000772b50c07df0 +Refc: 2 +=fun +Module: erl_lint +Uniq: 59358358 +Index: 80 +Address: 0x0000772b50dbdde8 +Refc: 2 +=fun +Module: c +Uniq: 20960249 +Index: 9 +Address: 0x0000772b50fdc498 +Refc: 2 +=fun +Module: inet_db +Uniq: 7513413 +Index: 8 +Address: 0x0000772b50eb06e7 +Refc: 2 +=fun +Module: erl_features +Uniq: 45623947 +Index: 4 +Address: 0x0000772b50e995fe +Refc: 2 +=fun +Module: application_controller +Uniq: 70664124 +Index: 7 +Address: 0x0000772b50d037c4 +Refc: 2 +=fun +Module: edlin +Uniq: 90410885 +Index: 0 +Address: 0x0000772b50fa93e0 +Refc: 2 +=fun +Module: global_group +Uniq: 125216658 +Index: 7 +Address: 0x0000772b50f466c0 +Refc: 2 +=fun +Module: maps +Uniq: 82648977 +Index: 1 +Address: 0x0000772b50f33cc0 +Refc: 2 +=fun +Module: inet_parse +Uniq: 70636431 +Index: 7 +Address: 0x0000772b50edb4c0 +Refc: 2 +=fun +Module: global +Uniq: 97255194 +Index: 5 +Address: 0x0000772b50f1dd58 +Refc: 2 +=fun +Module: erl_eval +Uniq: 81571850 +Index: 57 +Address: 0x0000772b50de2be7 +Refc: 2 +=fun +Module: erl_lint +Uniq: 59358358 +Index: 50 +Address: 0x0000772b50dc1b68 +Refc: 2 +=fun +Module: edlin_key +Uniq: 65852665 +Index: 0 +Address: 0x0000772b50fb65e0 +Refc: 2 +=fun +Module: prim_zip +Uniq: 107817055 +Index: 5 +Address: 0x0000772b50c5d3b3 +Refc: 2 +=fun +Module: erl_eval +Uniq: 81571850 +Index: 0 +Address: 0x0000772b50de7687 +Refc: 2 +=fun +Module: logger_server +Uniq: 69885138 +Index: 4 +Address: 0x0000772b50d81d11 +Refc: 2 +=fun +Module: inet +Uniq: 39702559 +Index: 1 +Address: 0x0000772b50ed00c7 +Refc: 2 +=fun +Module: erl_lint +Uniq: 59358358 +Index: 20 +Address: 0x0000772b50dc443e +Refc: 2 +=fun +Module: erl_parse +Uniq: 95113583 +Index: 10 +Address: 0x0000772b50e2b907 +Refc: 2 +=fun +Module: rand +Uniq: 40079776 +Index: 3 +Address: 0x0000772b50f29ad0 +Refc: 2 +=fun +Module: unicode +Uniq: 89740446 +Index: 14 +Address: 0x0000772b50e93598 +Refc: 2 +=fun +Module: code_server +Uniq: 83632253 +Index: 8 +Address: 0x0000772b50cb172d +Refc: 2 +=fun +Module: erl_eval +Uniq: 81571850 +Index: 38 +Address: 0x0000772b50de39a6 +Refc: 2 +=fun +Module: prim_socket +Uniq: 108649643 +Index: 3 +Address: 0x0000772b50c53dc0 +Refc: 2 +=fun +Module: prim_inet +Uniq: 53596091 +Index: 0 +Address: 0x0000772b50c34010 +Refc: 2 +=fun +Module: erl_lint +Uniq: 59358358 +Index: 93 +Address: 0x0000772b50dbce58 +Refc: 2 +=fun +Module: code +Uniq: 92045327 +Index: 5 +Address: 0x0000772b50cc34e0 +Refc: 2 +=fun +Module: error_logger +Uniq: 128667414 +Index: 1 +Address: 0x0000772b50cb91f0 +Refc: 2 +=fun +Module: erl_features +Uniq: 45623947 +Index: 11 +Address: 0x0000772b50e99170 +Refc: 2 +=fun +Module: ets +Uniq: 107168513 +Index: 7 +Address: 0x0000772b50d4492b +Refc: 2 +=fun +Module: global_group +Uniq: 125216658 +Index: 10 +Address: 0x0000772b50f45ba4 +Refc: 2 +=fun +Module: global +Uniq: 97255194 +Index: 22 +Address: 0x0000772b50f1bd5c +Refc: 2 +=fun +Module: erl_lint +Uniq: 59358358 +Index: 102 +Address: 0x0000772b50dbbfb9 +Refc: 2 +=fun +Module: peer +Uniq: 58704516 +Index: 1 +Address: 0x0000772b50e68bcd +Refc: 2 +=fun +Module: erl_lint +Uniq: 59358358 +Index: 63 +Address: 0x0000772b50dc0dc0 +Refc: 2 +=fun +Module: rand +Uniq: 40079776 +Index: 22 +Address: 0x0000772b50f2c2f8 +Refc: 2 +=fun +Module: init +Uniq: 88714206 +Index: 9 +Address: 0x0000772b50c15d5d +Refc: 2 +=fun +Module: erl_eval +Uniq: 81571850 +Index: 19 +Address: 0x0000772b50de560d +Refc: 2 +=fun +Module: erl_lint +Uniq: 59358358 +Index: 72 +Address: 0x0000772b50dbf9f0 +Refc: 2 +=fun +Module: beam_lib +Uniq: 56915673 +Index: 3 +Address: 0x0000772b50e77143 +Refc: 2 +=fun +Module: c +Uniq: 20960249 +Index: 1 +Address: 0x0000772b50fe45fe +Refc: 2 +=fun +Module: application_controller +Uniq: 70664124 +Index: 15 +Address: 0x0000772b50d02f0f +Refc: 2 +=fun +Module: erl_parse +Uniq: 95113583 +Index: 7 +Address: 0x0000772b50e2bdc0 +Refc: 2 +=fun +Module: code_server +Uniq: 83632253 +Index: 5 +Address: 0x0000772b50cb186a +Refc: 2 +=fun +Module: unicode +Uniq: 89740446 +Index: 3 +Address: 0x0000772b50e91aa8 +Refc: 2 +=fun +Module: global +Uniq: 97255194 +Index: 13 +Address: 0x0000772b50f1d288 +Refc: 2 +=fun +Module: net_kernel +Uniq: 107400493 +Index: 6 +Address: 0x0000772b50f01dd7 +Refc: 2 +=fun +Module: erl_eval +Uniq: 81571850 +Index: 49 +Address: 0x0000772b50de2f63 +Refc: 2 +=fun +Module: file_server +Uniq: 111577811 +Index: 1 +Address: 0x0000772b50cd2e8b +Refc: 2 +=fun +Module: kernel_config +Uniq: 102842601 +Index: 0 +Address: 0x0000772b50fc3688 +Refc: 2 +=fun +Module: rpc +Uniq: 89088806 +Index: 6 +Address: 0x0000772b50eeb58d +Refc: 2 +=fun +Module: erl_lint +Uniq: 59358358 +Index: 42 +Address: 0x0000772b50dc2073 +Refc: 2 +=fun +Module: ets +Uniq: 107168513 +Index: 10 +Address: 0x0000772b50d446a7 +Refc: 2 +=fun +Module: lists +Uniq: 99218795 +Index: 0 +Address: 0x0000772b50d5f5d0 +Refc: 2 +=fun +Module: unicode +Uniq: 89740446 +Index: 22 +Address: 0x0000772b50e93b28 +Refc: 2 +=fun +Module: erl_lint +Uniq: 59358358 +Index: 12 +Address: 0x0000772b50dc6620 +Refc: 2 +=fun +Module: gen_statem +Uniq: 77138149 +Index: 2 +Address: 0x0000772b50f72866 +Refc: 2 +=fun +Module: rand +Uniq: 40079776 +Index: 11 +Address: 0x0000772b50f2a698 +Refc: 2 +=fun +Module: erl_eval +Uniq: 81571850 +Index: 30 +Address: 0x0000772b50de443a +Refc: 2 +=fun +Module: erl_prim_loader +Uniq: 91968038 +Index: 9 +Address: 0x0000772b50c6bd82 +Refc: 2 +=fun +Module: init +Uniq: 88714206 +Index: 4 +Address: 0x0000772b50c16ced +Refc: 2 +=fun +Module: erl_lint +Uniq: 59358358 +Index: 85 +Address: 0x0000772b50dbd950 +Refc: 2 +=fun +Module: c +Uniq: 20960249 +Index: 14 +Address: 0x0000772b50fe3db0 +Refc: 2 +=fun +Module: inet_db +Uniq: 7513413 +Index: 3 +Address: 0x0000772b50eadb70 +Refc: 2 +=fun +Module: application_controller +Uniq: 70664124 +Index: 2 +Address: 0x0000772b50d03fa8 +Refc: 2 +=fun +Module: global_group +Uniq: 125216658 +Index: 2 +Address: 0x0000772b50f469c0 +Refc: 2 +=fun +Module: erl_features +Uniq: 45623947 +Index: 3 +Address: 0x0000772b50e996f7 +Refc: 2 +=fun +Module: global +Uniq: 97255194 +Index: 30 +Address: 0x0000772b50f1af5f +Refc: 2 +=fun +Module: erl_eval +Uniq: 81571850 +Index: 60 +Address: 0x0000772b50de292f +Refc: 2 +=fun +Module: supervisor +Uniq: 88264141 +Index: 4 +Address: 0x0000772b50d58148 +Refc: 2 +=fun +Module: logger +Uniq: 48184761 +Index: 1 +Address: 0x0000772b50ce9d20 +Refc: 2 +=fun +Module: erl_lint +Uniq: 59358358 +Index: 55 +Address: 0x0000772b50dc190f +Refc: 2 +=fun +Module: raw_file_io +Uniq: 33533917 +Index: 0 +Address: 0x0000772b50fe8d30 +Refc: 2 +=fun +Module: erl_eval +Uniq: 81571850 +Index: 11 +Address: 0x0000772b50de5f89 +Refc: 2 +=fun +Module: inet_gethost_native +Uniq: 80408359 +Index: 1 +Address: 0x0000772b50ee3dfc +Refc: 2 +=fun +Module: erl_lint +Uniq: 59358358 +Index: 64 +Address: 0x0000772b50dc0d87 +Refc: 2 +=fun +Module: inet +Uniq: 39702559 +Index: 14 +Address: 0x0000772b50ecf82b +Refc: 2 +=fun +Module: erl_lint +Uniq: 59358358 +Index: 25 +Address: 0x0000772b50dc3748 +Refc: 2 +=fun +Module: unicode +Uniq: 89740446 +Index: 11 +Address: 0x0000772b50e90548 +Refc: 2 +=fun +Module: code_server +Uniq: 83632253 +Index: 13 +Address: 0x0000772b50cb0a5f +Refc: 2 +=fun +Module: erl_eval +Uniq: 81571850 +Index: 41 +Address: 0x0000772b50de3739 +Refc: 2 +=fun +Module: gen_event +Uniq: 98502976 +Index: 2 +Address: 0x0000772b50d8e68e +Refc: 2 +=fun +Module: erl_lint +Uniq: 59358358 +Index: 34 +Address: 0x0000772b50dc287b +Refc: 2 +=fun +Module: prim_socket +Uniq: 108649643 +Index: 14 +Address: 0x0000772b50c53670 +Refc: 2 +=fun +Module: code +Uniq: 92045327 +Index: 0 +Address: 0x0000772b50cc39f0 +Refc: 2 +=fun +Module: ets +Uniq: 107168513 +Index: 2 +Address: 0x0000772b50d44c66 +Refc: 2 +=fun +Module: application_controller +Uniq: 70664124 +Index: 21 +Address: 0x0000772b50d0279e +Refc: 2 +=fun +Module: erl_lint +Uniq: 59358358 +Index: 107 +Address: 0x0000772b50dbcfa8 +Refc: 2 +=fun +Module: erl_lint +Uniq: 59358358 +Index: 4 +Address: 0x0000772b50dc8b48 +Refc: 2 +=fun +Module: erl_prim_loader +Uniq: 91968038 +Index: 1 +Address: 0x0000772b50c64690 +Refc: 2 +=fun +Module: rand +Uniq: 40079776 +Index: 19 +Address: 0x0000772b50f2b3c0 +Refc: 2 +=fun +Module: global +Uniq: 97255194 +Index: 32 +Address: 0x0000772b50f1ae58 +Refc: 2 +=fun +Module: erl_eval +Uniq: 81571850 +Index: 22 +Address: 0x0000772b50de3328 +Refc: 2 +=fun +Module: init +Uniq: 88714206 +Index: 12 +Address: 0x0000772b50c15cc0 +Refc: 2 +=fun +Module: erl_lint +Uniq: 59358358 +Index: 77 +Address: 0x0000772b50dbed48 +Refc: 2 +=fun +Module: c +Uniq: 20960249 +Index: 6 +Address: 0x0000772b50fe4308 +Refc: 2 +=fun +Module: maps +Uniq: 82648977 +Index: 2 +Address: 0x0000772b50f38b42 +Refc: 2 +=fun +Module: inet +Uniq: 39702559 +Index: 19 +Address: 0x0000772b50ecf170 +Refc: 2 +=fun +Module: inet_db +Uniq: 7513413 +Index: 11 +Address: 0x0000772b50eb1118 +Refc: 2 +=fun +Module: application_controller +Uniq: 70664124 +Index: 10 +Address: 0x0000772b50d033bf +Refc: 2 +=fun +Module: global +Uniq: 97255194 +Index: 6 +Address: 0x0000772b50f1dbf8 +Refc: 2 +=fun +Module: inet_parse +Uniq: 70636431 +Index: 0 +Address: 0x0000772b50edbd00 +Refc: 2 +=fun +Module: erl_eval +Uniq: 81571850 +Index: 52 +Address: 0x0000772b50de2ee3 +Refc: 2 +=fun +Module: supervisor +Uniq: 88264141 +Index: 12 +Address: 0x0000772b50d5761b +Refc: 2 +=fun +Module: io_lib +Uniq: 31722559 +Index: 0 +Address: 0x0000772b50fb3360 +Refc: 2 +=fun +Module: rpc +Uniq: 89088806 +Index: 1 +Address: 0x0000772b50eebc20 +Refc: 2 +=fun +Module: erl_lint +Uniq: 59358358 +Index: 47 +Address: 0x0000772b50dc1eb8 +Refc: 2 +=fun +Module: prim_socket +Uniq: 108649643 +Index: 17 +Address: 0x0000772b50c53363 +Refc: 2 +=fun +Module: prim_zip +Uniq: 107817055 +Index: 0 +Address: 0x0000772b50c5d4a8 +Refc: 2 +=fun +Module: erl_eval +Uniq: 81571850 +Index: 3 +Address: 0x0000772b50de6ef8 +Refc: 2 +=fun +Module: logger_server +Uniq: 69885138 +Index: 1 +Address: 0x0000772b50d82048 +Refc: 2 +=fun +Module: c +Uniq: 20960249 +Index: 17 +Address: 0x0000772b50fe3970 +Refc: 2 +=fun +Module: inet +Uniq: 39702559 +Index: 6 +Address: 0x0000772b50ecfb07 +Refc: 2 +=fun +Module: unicode +Uniq: 89740446 +Index: 19 +Address: 0x0000772b50e93610 +Refc: 2 +=fun +Module: erl_lint +Uniq: 59358358 +Index: 17 +Address: 0x0000772b50dc5ce0 +Refc: 2 +=fun +Module: rand +Uniq: 40079776 +Index: 0 +Address: 0x0000772b50f28af0 +Refc: 2 +=fun +Module: erl_eval +Uniq: 81571850 +Index: 33 +Address: 0x0000772b50de3f95 +Refc: 2 +=fun +Module: code +Uniq: 92045327 +Index: 8 +Address: 0x0000772b50cc2f0d +Refc: 2 +=fun +Module: prim_socket +Uniq: 108649643 +Index: 6 +Address: 0x0000772b50c53b28 +Refc: 2 +=fun +Module: erl_lint +Uniq: 59358358 +Index: 90 +Address: 0x0000772b50dbd2e8 +Refc: 2 +=fun +Module: inet_config +Uniq: 6161651 +Index: 0 +Address: 0x0000772b50eb6b74 +Refc: 2 +=fun +Module: inet_db +Uniq: 7513413 +Index: 6 +Address: 0x0000772b50eb0c88 +Refc: 2 +=fun +Module: erl_features +Uniq: 45623947 +Index: 14 +Address: 0x0000772b50e98d91 +Refc: 2 +=fun +Module: global +Uniq: 97255194 +Index: 19 +Address: 0x0000772b50f1c500 +Refc: 2 +=fun +Module: erl_lint +Uniq: 59358358 +Index: 99 +Address: 0x0000772b50dbc438 +Refc: 2 +=fun +Module: supervisor +Uniq: 88264141 +Index: 1 +Address: 0x0000772b50d5841c +Refc: 2 +=fun +Module: gen_server +Uniq: 31933447 +Index: 1 +Address: 0x0000772b50d290ce +Refc: 2 +=fun +Module: erpc +Uniq: 1558009 +Index: 0 +Address: 0x0000772b50f52ea8 +Refc: 2 +=fun +Module: peer +Uniq: 58704516 +Index: 2 +Address: 0x0000772b50e69076 +Refc: 2 +=fun +Module: erl_lint +Uniq: 59358358 +Index: 60 +Address: 0x0000772b50da9e68 +Refc: 2 +=fun +Module: rand +Uniq: 40079776 +Index: 27 +Address: 0x0000772b50f2dab0 +Refc: 2 +=fun +Module: erl_eval +Uniq: 81571850 +Index: 14 +Address: 0x0000772b50de5b4c +Refc: 2 +=fun +Module: erl_lint +Uniq: 59358358 +Index: 69 +Address: 0x0000772b50dbfe58 +Refc: 2 +=fun +Module: inet +Uniq: 39702559 +Index: 11 +Address: 0x0000772b50ecf955 +Refc: 2 +=fun +Module: erl_lint +Uniq: 59358358 +Index: 30 +Address: 0x0000772b50dc303a +Refc: 2 +=fun +Module: inet_parse +Uniq: 70636431 +Index: 8 +Address: 0x0000772b50edb378 +Refc: 2 +=fun +Module: erl_parse +Uniq: 95113583 +Index: 4 +Address: 0x0000772b50e2c0f8 +Refc: 2 +=fun +Module: code_server +Uniq: 83632253 +Index: 2 +Address: 0x0000772b50ca7308 +Refc: 2 +=fun +Module: unicode +Uniq: 89740446 +Index: 0 +Address: 0x0000772b50e946a2 +Refc: 2 +=fun +Module: global +Uniq: 97255194 +Index: 14 +Address: 0x0000772b50f1d06d +Refc: 2 +=fun +Module: net_kernel +Uniq: 107400493 +Index: 5 +Address: 0x0000772b50f01eb8 +Refc: 2 +=fun +Module: erl_eval +Uniq: 81571850 +Index: 44 +Address: 0x0000772b50de5365 +Refc: 2 +=fun +Module: gen_event +Uniq: 98502976 +Index: 7 +Address: 0x0000772b50d8d901 +Refc: 2 +=fun +Module: prim_tty +Uniq: 86006838 +Index: 1 +Address: 0x0000772b50f85638 +Refc: 2 +=fun +Module: logger_std_h +Uniq: 37924516 +Index: 0 +Address: 0x0000772b50fd2318 +Refc: 2 +=fun +Module: erl_lint +Uniq: 59358358 +Index: 39 +Address: 0x0000772b50dc21f8 +Refc: 2 +=fun +Module: prim_socket +Uniq: 108649643 +Index: 9 +Address: 0x0000772b50c53cc0 +Refc: 2 +=fun +Module: ets +Uniq: 107168513 +Index: 13 +Address: 0x0000772b50d43deb +Refc: 2 +=fun +Module: application_controller +Uniq: 70664124 +Index: 16 +Address: 0x0000772b50d02d90 +Refc: 2 +=fun +Module: erl_init +Uniq: 3103087 +Index: 1 +Address: 0x0000772b50c05c20 +Refc: 2 +=fun +Module: logger_server +Uniq: 69885138 +Index: 9 +Address: 0x0000772b50d81de5 +Refc: 2 +=fun +Module: erl_eval +Uniq: 81571850 +Index: 66 +Address: 0x0000772b50de1cd8 +Refc: 2 +=fun +Module: erl_lint +Uniq: 59358358 +Index: 9 +Address: 0x0000772b50dc7540 +Refc: 2 +=fun +Module: gen_statem +Uniq: 77138149 +Index: 1 +Address: 0x0000772b50f728fe +Refc: 2 +=fun +Module: rand +Uniq: 40079776 +Index: 8 +Address: 0x0000772b50f29328 +Refc: 2 +=fun +Module: global +Uniq: 97255194 +Index: 37 +Address: 0x0000772b50f1d353 +Refc: 2 +=fun +Module: erl_eval +Uniq: 81571850 +Index: 25 +Address: 0x0000772b50de4ddc +Refc: 2 +=fun +Module: socket_registry +Uniq: 51103816 +Index: 0 +Address: 0x0000772b50c47508 +Refc: 2 +=fun +Module: erl_prim_loader +Uniq: 91968038 +Index: 10 +Address: 0x0000772b50c6bd08 +Refc: 2 +=fun +Module: init +Uniq: 88714206 +Index: 3 +Address: 0x0000772b50c16d5b +Refc: 2 +=fun +Module: erl_lint +Uniq: 59358358 +Index: 82 +Address: 0x0000772b50dbdb21 +Refc: 2 +=fun +Module: c +Uniq: 20960249 +Index: 11 +Address: 0x0000772b50fe417e +Refc: 2 +=fun +Module: erl_features +Uniq: 45623947 +Index: 6 +Address: 0x0000772b50e96fe8 +Refc: 2 +=fun +Module: application_controller +Uniq: 70664124 +Index: 5 +Address: 0x0000772b50d03bf0 +Refc: 2 +=fun +Module: global_group +Uniq: 125216658 +Index: 5 +Address: 0x0000772b50f462d5 +Refc: 2 +=fun +Module: global +Uniq: 97255194 +Index: 27 +Address: 0x0000772b50f1b430 +Refc: 2 +=fun +Module: inet_parse +Uniq: 70636431 +Index: 5 +Address: 0x0000772b50edb628 +Refc: 2 +=fun +Module: application_master +Uniq: 65773934 +Index: 0 +Address: 0x0000772b50c9a878 +Refc: 2 +=fun +Module: user_drv +Uniq: 56461357 +Index: 2 +Address: 0x0000772b50f6070b +Refc: 2 +=fun +Module: erl_eval +Uniq: 81571850 +Index: 63 +Address: 0x0000772b50de26e1 +Refc: 2 +=fun +Module: supervisor +Uniq: 88264141 +Index: 9 +Address: 0x0000772b50d578f8 +Refc: 2 +=fun +Module: erl_lint +Uniq: 59358358 +Index: 52 +Address: 0x0000772b50dc19fd +Refc: 2 +=fun +Module: raw_file_io +Uniq: 33533917 +Index: 5 +Address: 0x0000772b50fe8f78 +Refc: 2 +=fun +Module: zlib +Uniq: 121920116 +Index: 0 +Address: 0x0000772b50c3fac8 +Refc: 2 +=fun +Module: erl_eval +Uniq: 81571850 +Index: 6 +Address: 0x0000772b50de686c +Refc: 2 +=fun +Module: inet +Uniq: 39702559 +Index: 3 +Address: 0x0000772b50ecfc40 +Refc: 2 +=fun +Module: erl_lint +Uniq: 59358358 +Index: 22 +Address: 0x0000772b50dc409a +Refc: 2 +=fun +Module: erl_parse +Uniq: 95113583 +Index: 12 +Address: 0x0000772b50e2b6b0 +Refc: 2 +=fun +Module: code_server +Uniq: 83632253 +Index: 10 +Address: 0x0000772b50cb168d +Refc: 2 +=fun +Module: unicode +Uniq: 89740446 +Index: 8 +Address: 0x0000772b50e90ab0 +Refc: 2 +=fun +Module: erl_eval +Uniq: 81571850 +Index: 36 +Address: 0x0000772b50de3bc0 +Refc: 2 +=fun +Module: prim_socket +Uniq: 108649643 +Index: 1 +Address: 0x0000772b50c53e7d +Refc: 2 +=fun +Module: erl_lint +Uniq: 59358358 +Index: 95 +Address: 0x0000772b50dbcc38 +Refc: 2 +=fun +Module: code +Uniq: 92045327 +Index: 7 +Address: 0x0000772b50cc2f5d +Refc: 2 +=fun +Module: ets +Uniq: 107168513 +Index: 5 +Address: 0x0000772b50d44a69 +Refc: 2 +=fun +Module: global_group +Uniq: 125216658 +Index: 8 +Address: 0x0000772b50f465e0 +Refc: 2 +=fun +Module: global +Uniq: 97255194 +Index: 20 +Address: 0x0000772b50f1c46c +Refc: 2 +=fun +Module: erl_lint +Uniq: 59358358 +Index: 104 +Address: 0x0000772b50dbbe18 +Refc: 2 +=fun +Module: erl_lint +Uniq: 59358358 +Index: 1 +Address: 0x0000772b50dc91b4 +Refc: 2 +=fun +Module: rand +Uniq: 40079776 +Index: 16 +Address: 0x0000772b50f2ce70 +Refc: 2 +=fun +Module: erl_prim_loader +Uniq: 91968038 +Index: 2 +Address: 0x0000772b50c61800 +Refc: 2 +=fun +Module: erl_eval +Uniq: 81571850 +Index: 17 +Address: 0x0000772b50de57db +Refc: 2 +=fun +Module: init +Uniq: 88714206 +Index: 11 +Address: 0x0000772b50c06aa8 +Refc: 2 +=fun +Module: gen +Uniq: 70664065 +Index: 1 +Address: 0x0000772b50d0d66d +Refc: 2 +=fun +Module: erl_lint +Uniq: 59358358 +Index: 74 +Address: 0x0000772b50dbf758 +Refc: 2 +=fun +Module: c +Uniq: 20960249 +Index: 3 +Address: 0x0000772b50fe44a9 +Refc: 2 +=fun +Module: inet +Uniq: 39702559 +Index: 16 +Address: 0x0000772b50ecf548 +Refc: 2 +=fun +Module: application_controller +Uniq: 70664124 +Index: 13 +Address: 0x0000772b50d030c3 +Refc: 2 +=fun +Module: code_server +Uniq: 83632253 +Index: 7 +Address: 0x0000772b50cb177d +Refc: 2 +=fun +Module: global +Uniq: 97255194 +Index: 3 +Address: 0x0000772b50f1e0a1 +Refc: 2 +=fun +Module: net_kernel +Uniq: 107400493 +Index: 0 +Address: 0x0000772b50f022c8 +Refc: 2 +=fun +Module: erl_eval +Uniq: 81571850 +Index: 55 +Address: 0x0000772b50de2c80 +Refc: 2 +=fun +Module: rpc +Uniq: 89088806 +Index: 4 +Address: 0x0000772b50eeb83c +Refc: 2 +=fun +Module: erl_lint +Uniq: 59358358 +Index: 44 +Address: 0x0000772b50da54c8 +Refc: 2 +=fun +Module: ets +Uniq: 107168513 +Index: 8 +Address: 0x0000772b50d447e2 +Refc: 2 +=fun +Module: logger_server +Uniq: 69885138 +Index: 2 +Address: 0x0000772b50d8200c +Refc: 2 +=fun +Module: unicode +Uniq: 89740446 +Index: 16 +Address: 0x0000772b50e93c18 +Refc: 2 +=fun +Module: erl_lint +Uniq: 59358358 +Index: 14 +Address: 0x0000772b50dc6138 +Refc: 2 +=fun +Module: rand +Uniq: 40079776 +Index: 5 +Address: 0x0000772b50f28940 +Refc: 2 +=fun +Module: erl_eval +Uniq: 81571850 +Index: 28 +Address: 0x0000772b50de47c0 +Refc: 2 +=fun +Module: init +Uniq: 88714206 +Index: 6 +Address: 0x0000772b50c16b66 +Refc: 2 +=fun +Module: erl_lint +Uniq: 59358358 +Index: 87 +Address: 0x0000772b50dbd858 +Refc: 2 +=fun +Module: inet_db +Uniq: 7513413 +Index: 1 +Address: 0x0000772b50ea5b08 +Refc: 2 +=fun +Module: erl_features +Uniq: 45623947 +Index: 13 +Address: 0x0000772b50e98fe5 +Refc: 2 +=fun +Module: application_controller +Uniq: 70664124 +Index: 0 +Address: 0x0000772b50d042b7 +Refc: 2 +=fun +Module: global_group +Uniq: 125216658 +Index: 0 +Address: 0x0000772b50f43818 +Refc: 2 +=fun +Module: global +Uniq: 97255194 +Index: 28 +Address: 0x0000772b50f1b378 +Refc: 2 +=fun +Module: erl_lint +Uniq: 59358358 +Index: 96 +Address: 0x0000772b50dbc8a0 +Refc: 2 +=fun +Module: supervisor +Uniq: 88264141 +Index: 6 +Address: 0x0000772b50d57f3c +Refc: 2 +=fun +Module: erl_lint +Uniq: 59358358 +Index: 57 +Address: 0x0000772b50dc1823 +Refc: 2 +=fun +Module: logger_olp +Uniq: 59800765 +Index: 0 +Address: 0x0000772b50e4bec5 +Refc: 2 +=fun +Module: rand +Uniq: 40079776 +Index: 24 +Address: 0x0000772b50f2d918 +Refc: 2 +=fun +Module: erl_eval +Uniq: 81571850 +Index: 9 +Address: 0x0000772b50de62cf +Refc: 2 +=fun +Module: erl_lint +Uniq: 59358358 +Index: 66 +Address: 0x0000772b50dc0b82 +Refc: 2 +=fun +Module: inet +Uniq: 39702559 +Index: 8 +Address: 0x0000772b50ecfa5f +Refc: 2 +=fun +Module: erl_lint +Uniq: 59358358 +Index: 27 +Address: 0x0000772b50dc35e8 +Refc: 2 +=fun +Module: erl_parse +Uniq: 95113583 +Index: 1 +Address: 0x0000772b50e2cc28 +Refc: 2 +=fun +Module: file_io_server +Uniq: 52181705 +Index: 0 +Address: 0x0000772b50cdead9 +Refc: 2 +=fun +Module: unicode +Uniq: 89740446 +Index: 5 +Address: 0x0000772b50e91fa8 +Refc: 2 +=fun +Module: global +Uniq: 97255194 +Index: 11 +Address: 0x0000772b50f1d5d0 +Refc: 2 +=fun +Module: net_kernel +Uniq: 107400493 +Index: 8 +Address: 0x0000772b50eff790 +Refc: 2 +=fun +Module: erl_eval +Uniq: 81571850 +Index: 47 +Address: 0x0000772b50de3172 +Refc: 2 +=fun +Module: gen_event +Uniq: 98502976 +Index: 0 +Address: 0x0000772b50d874c8 +Refc: 2 +=fun +Module: erl_lint +Uniq: 59358358 +Index: 36 +Address: 0x0000772b50da1470 +Refc: 2 +=fun +Module: prim_socket +Uniq: 108649643 +Index: 12 +Address: 0x0000772b50c537a7 +Refc: 2 +=fun +Module: code +Uniq: 92045327 +Index: 2 +Address: 0x0000772b50cc3758 +Refc: 2 +=fun +Module: group +Uniq: 66375451 +Index: 1 +Address: 0x0000772b50f9a8b8 +Refc: 2 +=fun +Module: logger_simple_h +Uniq: 50489874 +Index: 0 +Address: 0x0000772b50d7a75d +Refc: 2 +=fun +Module: ets +Uniq: 107168513 +Index: 0 +Address: 0x0000772b50d44fb2 +Refc: 2 +=fun +Module: application_controller +Uniq: 70664124 +Index: 19 +Address: 0x0000772b50d02b18 +Refc: 2 +=fun +Module: erl_lint +Uniq: 59358358 +Index: 109 +Address: 0x0000772b50dc4258 +Refc: 2 +=fun +Module: logger_server +Uniq: 69885138 +Index: 10 +Address: 0x0000772b50d816d6 +Refc: 2 +=fun +Module: binary +Uniq: 15025403 +Index: 1 +Address: 0x0000772b50e7d37e +Refc: 2 +=fun +Module: erl_lint +Uniq: 59358358 +Index: 6 +Address: 0x0000772b50dc8598 +Refc: 2 +=fun +Module: rand +Uniq: 40079776 +Index: 13 +Address: 0x0000772b50f29f38 +Refc: 2 +=fun +Module: erl_prim_loader +Uniq: 91968038 +Index: 7 +Address: 0x0000772b50c6c305 +Refc: 2 +=fun +Module: init +Uniq: 88714206 +Index: 14 +Address: 0x0000772b50c15c87 +Refc: 2 +=fun +Module: erl_eval +Uniq: 81571850 +Index: 20 +Address: 0x0000772b50de554d +Refc: 2 +=fun +Module: erl_lint +Uniq: 59358358 +Index: 79 +Address: 0x0000772b50dbde98 +Refc: 2 +=fun +Module: c +Uniq: 20960249 +Index: 8 +Address: 0x0000772b50fe41b0 +Refc: 2 +=fun +Module: inet_db +Uniq: 7513413 +Index: 9 +Address: 0x0000772b50eb02a4 +Refc: 2 +=fun +Module: application_controller +Uniq: 70664124 +Index: 8 +Address: 0x0000772b50d03498 +Refc: 2 +=fun +Module: logger_h_common +Uniq: 2734986 +Index: 1 +Address: 0x0000772b50fd8440 +Refc: 2 +=fun +Module: maps +Uniq: 82648977 +Index: 0 +Address: 0x0000772b50f33d18 +Refc: 2 +=fun +Module: inet_parse +Uniq: 70636431 +Index: 6 +Address: 0x0000772b50edb580 +Refc: 2 +=fun +Module: erl_features +Uniq: 45623947 +Index: 5 +Address: 0x0000772b50e96f20 +Refc: 2 +=fun +Module: global +Uniq: 97255194 +Index: 4 +Address: 0x0000772b50f1dfde +Refc: 2 +=fun +Module: erl_eval +Uniq: 81571850 +Index: 58 +Address: 0x0000772b50de2b74 +Refc: 2 +=fun +Module: io_lib +Uniq: 31722559 +Index: 2 +Address: 0x0000772b50fadde8 +Refc: 2 +=fun +Module: erl_lint +Uniq: 59358358 +Index: 49 +Address: 0x0000772b50dc1c32 +Refc: 2 +=fun +Module: prim_zip +Uniq: 107817055 +Index: 2 +Address: 0x0000772b50c5a558 +Refc: 2 +=fun +Module: erl_eval +Uniq: 81571850 +Index: 1 +Address: 0x0000772b50de73e2 +Refc: 2 +=fun +Module: logger_server +Uniq: 69885138 +Index: 7 +Address: 0x0000772b50d81acf +Refc: 2 +=fun +Module: inet +Uniq: 39702559 +Index: 0 +Address: 0x0000772b50ed02b8 +Refc: 2 +=fun +Module: unicode +Uniq: 89740446 +Index: 13 +Address: 0x0000772b50e93700 +Refc: 2 +=fun +Module: erl_lint +Uniq: 59358358 +Index: 19 +Address: 0x0000772b50dc5060 +Refc: 2 +=fun +Module: erl_parse +Uniq: 95113583 +Index: 9 +Address: 0x0000772b50e2bc28 +Refc: 2 +=fun +Module: rand +Uniq: 40079776 +Index: 2 +Address: 0x0000772b50f296a8 +Refc: 2 +=fun +Module: erl_eval +Uniq: 81571850 +Index: 39 +Address: 0x0000772b50de38bf +Refc: 2 +=fun +Module: prim_socket +Uniq: 108649643 +Index: 4 +Address: 0x0000772b50c53d70 +Refc: 2 +=fun +Module: erl_lint +Uniq: 59358358 +Index: 92 +Address: 0x0000772b50dbcfe0 +Refc: 2 +=fun +Module: error_logger +Uniq: 128667414 +Index: 0 +Address: 0x0000772b50cb80e0 +Refc: 2 +=fun +Module: inet_db +Uniq: 7513413 +Index: 4 +Address: 0x0000772b50eb122b +Refc: 2 +=fun +Module: global_group +Uniq: 125216658 +Index: 11 +Address: 0x0000772b50f4596c +Refc: 2 +=fun +Module: erl_features +Uniq: 45623947 +Index: 8 +Address: 0x0000772b50e994b8 +Refc: 2 +=fun +Module: global +Uniq: 97255194 +Index: 17 +Address: 0x0000772b50f1cb86 +Refc: 2 +=fun +Module: erl_lint +Uniq: 59358358 +Index: 101 +Address: 0x0000772b50dbc36e +Refc: 2 +=fun +Module: supervisor +Uniq: 88264141 +Index: 3 +Address: 0x0000772b50d58458 +Refc: 2 +=fun +Module: peer +Uniq: 58704516 +Index: 0 +Address: 0x0000772b50e69f68 +Refc: 2 +=fun +Module: erl_lint +Uniq: 59358358 +Index: 62 +Address: 0x0000772b50dc14eb +Refc: 2 +=fun +Module: rand +Uniq: 40079776 +Index: 21 +Address: 0x0000772b50f2c050 +Refc: 2 +=fun +Module: erl_eval +Uniq: 81571850 +Index: 12 +Address: 0x0000772b50de5e0a +Refc: 2 +=fun +Module: logger_formatter +Uniq: 87037555 +Index: 1 +Address: 0x0000772b50fcb3b0 +Refc: 2 +=fun +Module: erl_lint +Uniq: 59358358 +Index: 71 +Address: 0x0000772b50dbfde8 +Refc: 2 +=fun +Module: beam_lib +Uniq: 56915673 +Index: 0 +Address: 0x0000772b50e77e30 +Refc: 2 +=fun +Module: c +Uniq: 20960249 +Index: 0 +Address: 0x0000772b50fe4638 +Refc: 2 +=fun +Module: inet +Uniq: 39702559 +Index: 21 +Address: 0x0000772b50eceafa +Refc: 2 +=fun +Module: erl_parse +Uniq: 95113583 +Index: 6 +Address: 0x0000772b50e2bed8 +Refc: 2 +=fun +Module: code_server +Uniq: 83632253 +Index: 4 +Address: 0x0000772b50cb19b9 +Refc: 2 +=fun +Module: unicode +Uniq: 89740446 +Index: 2 +Address: 0x0000772b50e92488 +Refc: 2 +=fun +Module: global +Uniq: 97255194 +Index: 12 +Address: 0x0000772b50f1d422 +Refc: 2 +=fun +Module: net_kernel +Uniq: 107400493 +Index: 7 +Address: 0x0000772b50f01d48 +Refc: 2 +=fun +Module: erl_eval +Uniq: 81571850 +Index: 50 +Address: 0x0000772b50de300b +Refc: 2 +=fun +Module: file_server +Uniq: 111577811 +Index: 0 +Address: 0x0000772b50cd2e1b +Refc: 2 +=fun +Module: gen_event +Uniq: 98502976 +Index: 5 +Address: 0x0000772b50d8dc60 +Refc: 2 +=fun +Module: rpc +Uniq: 89088806 +Index: 7 +Address: 0x0000772b50eebab0 +Refc: 2 +=fun +Module: erl_lint +Uniq: 59358358 +Index: 41 +Address: 0x0000772b50dc2163 +Refc: 2 +=fun +Module: ets +Uniq: 107168513 +Index: 11 +Address: 0x0000772b50d445ac +Refc: 2 +=fun +Module: erl_eval +Uniq: 81571850 +Index: 64 +Address: 0x0000772b50de2552 +Refc: 2 +=fun +Module: proc_lib +Uniq: 95872253 +Index: 0 +Address: 0x0000772b50d35b58 +Refc: 2 +=fun +Module: erl_lint +Uniq: 59358358 +Index: 11 +Address: 0x0000772b50dc67b5 +Refc: 2 +=fun +Module: unicode +Uniq: 89740446 +Index: 21 +Address: 0x0000772b50e93988 +Refc: 2 +=fun +Module: rand +Uniq: 40079776 +Index: 10 +Address: 0x0000772b50f27a38 +Refc: 2 +=fun +Module: erl_eval +Uniq: 81571850 +Index: 31 +Address: 0x0000772b50de429b +Refc: 2 +=fun +Module: erl_prim_loader +Uniq: 91968038 +Index: 8 +Address: 0x0000772b50c6c06f +Refc: 2 +=fun +Module: init +Uniq: 88714206 +Index: 5 +Address: 0x0000772b50c16bc5 +Refc: 2 +=fun +Module: erl_lint +Uniq: 59358358 +Index: 84 +Address: 0x0000772b50dbda60 +Refc: 2 +=fun +Module: c +Uniq: 20960249 +Index: 13 +Address: 0x0000772b50fe3e20 +Refc: 2 +=fun +Module: erl_features +Uniq: 45623947 +Index: 0 +Address: 0x0000772b50e99a00 +Refc: 2 +=fun +Module: ets +Uniq: 107168513 +Index: 16 +Address: 0x0000772b50d41810 +Refc: 2 +=fun +Module: application_controller +Uniq: 70664124 +Index: 3 +Address: 0x0000772b50d0401c +Refc: 2 +=fun +Module: user_drv +Uniq: 56461357 +Index: 0 +Address: 0x0000772b50f60740 +Refc: 2 +=fun +Module: global_group +Uniq: 125216658 +Index: 3 +Address: 0x0000772b50f468d8 +Refc: 2 +=fun +Module: maps +Uniq: 82648977 +Index: 5 +Address: 0x0000772b50f388f0 +Refc: 2 +=fun +Module: global +Uniq: 97255194 +Index: 25 +Address: 0x0000772b50f1b6c0 +Refc: 2 +=fun +Module: supervisor +Uniq: 88264141 +Index: 11 +Address: 0x0000772b50d57650 +Refc: 2 +=fun +Module: erl_eval +Uniq: 81571850 +Index: 61 +Address: 0x0000772b50de28b7 +Refc: 2 +=fun +Module: erl_lint +Uniq: 59358358 +Index: 54 +Address: 0x0000772b50dc1893 +Refc: 2 +=fun +Module: rand +Uniq: 40079776 +Index: 29 +Address: 0x0000772b50f2bab8 +Refc: 2 +=fun +Module: raw_file_io +Uniq: 33533917 +Index: 3 +Address: 0x0000772b50fe914e +Refc: 2 +=fun +Module: inet_gethost_native +Uniq: 80408359 +Index: 0 +Address: 0x0000772b50ee3eff +Refc: 2 +=fun +Module: erl_eval +Uniq: 81571850 +Index: 4 +Address: 0x0000772b50de6cab +Refc: 2 +=fun +Module: inet +Uniq: 39702559 +Index: 13 +Address: 0x0000772b50ecf89e +Refc: 2 +=fun +Module: erl_lint +Uniq: 59358358 +Index: 24 +Address: 0x0000772b50dc3a28 +Refc: 2 +=fun +Module: erl_parse +Uniq: 95113583 +Index: 14 +Address: 0x0000772b50e2b540 +Refc: 2 +=fun +Module: code_server +Uniq: 83632253 +Index: 12 +Address: 0x0000772b50cb0b1c +Refc: 2 +=fun +Module: erl_eval +Uniq: 81571850 +Index: 42 +Address: 0x0000772b50de369a +Refc: 2 +=fun +Module: unicode +Uniq: 89740446 +Index: 10 +Address: 0x0000772b50e91018 +Refc: 2 +=fun +Module: init +Uniq: 88714206 +Index: 16 +Address: 0x0000772b50c159f8 +Refc: 2 +=fun +Module: erl_lint +Uniq: 59358358 +Index: 33 +Address: 0x0000772b50dc28b0 +Refc: 2 +=fun +Module: prim_socket +Uniq: 108649643 +Index: 15 +Address: 0x0000772b50c536c8 +Refc: 2 +=fun +Module: code +Uniq: 92045327 +Index: 1 +Address: 0x0000772b50cc3928 +Refc: 2 +=fun +Module: ets +Uniq: 107168513 +Index: 3 +Address: 0x0000772b50d44e66 +Refc: 2 +=fun +Module: application_controller +Uniq: 70664124 +Index: 22 +Address: 0x0000772b50d021aa +Refc: 2 +=fun +Module: erl_lint +Uniq: 59358358 +Index: 106 +Address: 0x0000772b50dbbf5e +Refc: 2 +=fun +Module: peer +Uniq: 58704516 +Index: 5 +Address: 0x0000772b50e689f5 +Refc: 2 +=fun +Module: erl_lint +Uniq: 59358358 +Index: 3 +Address: 0x0000772b50dc8c38 +Refc: 2 +=fun +Module: rand +Uniq: 40079776 +Index: 18 +Address: 0x0000772b50f2c4b0 +Refc: 2 +=fun +Module: global +Uniq: 97255194 +Index: 35 +Address: 0x0000772b50f1c4c7 +Refc: 2 +=fun +Module: erl_prim_loader +Uniq: 91968038 +Index: 0 +Address: 0x0000772b50c6cb2d +Refc: 2 +=fun +Module: erl_eval +Uniq: 81571850 +Index: 23 +Address: 0x0000772b50de5286 +Refc: 2 +=fun +Module: init +Uniq: 88714206 +Index: 13 +Address: 0x0000772b50c14468 +Refc: 2 +=fun +Module: gen +Uniq: 70664065 +Index: 3 +Address: 0x0000772b50d0d526 +Refc: 2 +=fun +Module: erl_lint +Uniq: 59358358 +Index: 76 +Address: 0x0000772b50dbeeb8 +Refc: 2 +=fun +Module: c +Uniq: 20960249 +Index: 5 +Address: 0x0000772b50fe4370 +Refc: 2 +=fun +Module: inet +Uniq: 39702559 +Index: 18 +Address: 0x0000772b50ecf43e +Refc: 2 +=fun +Module: application_controller +Uniq: 70664124 +Index: 11 +Address: 0x0000772b50d032b8 +Refc: 2 +=fun +Module: inet_parse +Uniq: 70636431 +Index: 3 +Address: 0x0000772b50edb770 +Refc: 2 +=fun +Module: global +Uniq: 97255194 +Index: 1 +Address: 0x0000772b50f1e40a +Refc: 2 +=fun +Module: net_kernel +Uniq: 107400493 +Index: 2 +Address: 0x0000772b50f02010 +Refc: 2 +=fun +Module: erl_eval +Uniq: 81571850 +Index: 53 +Address: 0x0000772b50de2d13 +Refc: 2 +=fun +Module: rpc +Uniq: 89088806 +Index: 2 +Address: 0x0000772b50eebb68 +Refc: 2 +=fun +Module: erl_lint +Uniq: 59358358 +Index: 46 +Address: 0x0000772b50dc2000 +Refc: 2 +=fun +Module: prim_socket +Uniq: 108649643 +Index: 18 +Address: 0x0000772b50c53228 +Refc: 2 +=fun +Module: prim_zip +Uniq: 107817055 +Index: 1 +Address: 0x0000772b50c5d471 +Refc: 2 +=fun +Module: logger_server +Uniq: 69885138 +Index: 0 +Address: 0x0000772b50d820a8 +Refc: 2 +=fun +Module: c +Uniq: 20960249 +Index: 16 +Address: 0x0000772b50fe39f8 +Refc: 2 +=fun +Module: inet +Uniq: 39702559 +Index: 5 +Address: 0x0000772b50ecfb48 +Refc: 2 +=fun +Module: erl_lint +Uniq: 59358358 +Index: 16 +Address: 0x0000772b50dc5d18 +Refc: 2 +=fun +Module: unicode +Uniq: 89740446 +Index: 18 +Address: 0x0000772b50e93888 +Refc: 2 +=fun +Module: rand +Uniq: 40079776 +Index: 7 +Address: 0x0000772b50f28d48 +Refc: 2 +=fun +Module: erl_eval +Uniq: 81571850 +Index: 34 +Address: 0x0000772b50de3e36 +Refc: 2 +=fun +Module: code +Uniq: 92045327 +Index: 9 +Address: 0x0000772b50cc2eb2 +Refc: 2 +=fun +Module: prim_socket +Uniq: 108649643 +Index: 7 +Address: 0x0000772b50c53c10 +Refc: 2 +=fun +Module: erl_lint +Uniq: 59358358 +Index: 89 +Address: 0x0000772b50dbd518 +Refc: 2 +=fun +Module: inet_config +Uniq: 6161651 +Index: 3 +Address: 0x0000772b50eb6858 +Refc: 2 +=fun +Module: inet_db +Uniq: 7513413 +Index: 7 +Address: 0x0000772b50eb0aa0 +Refc: 2 +=fun +Module: erl_features +Uniq: 45623947 +Index: 15 +Address: 0x0000772b50e98808 +Refc: 2 +=fun +Module: global +Uniq: 97255194 +Index: 18 +Address: 0x0000772b50f1c743 +Refc: 2 +=fun +Module: erl_lint +Uniq: 59358358 +Index: 98 +Address: 0x0000772b50dbc610 +Refc: 2 +=fun +Module: supervisor +Uniq: 88264141 +Index: 0 +Address: 0x0000772b50d589b1 +Refc: 2 +=fun +Module: gen_server +Uniq: 31933447 +Index: 0 +Address: 0x0000772b50d24190 +Refc: 2 +=fun +Module: erl_lint +Uniq: 59358358 +Index: 59 +Address: 0x0000772b50da6d10 +Refc: 2 +=fun +Module: file +Uniq: 39298303 +Index: 1 +Address: 0x0000772b50cced10 +Refc: 2 +=fun +Module: rand +Uniq: 40079776 +Index: 26 +Address: 0x0000772b50f2d828 +Refc: 2 +=fun +Module: erl_eval +Uniq: 81571850 +Index: 15 +Address: 0x0000772b50de5a0d +Refc: 2 +=fun +Module: erl_lint +Uniq: 59358358 +Index: 68 +Address: 0x0000772b50dbfec8 +Refc: 2 +=fun +Module: inet +Uniq: 39702559 +Index: 10 +Address: 0x0000772b50ecf9a5 +Refc: 2 +=fun +Module: erl_features +Uniq: 45623947 +Index: 16 +Address: 0x0000772b50e9913c +Refc: 2 +=fun +Module: erl_lint +Uniq: 59358358 +Index: 29 +Address: 0x0000772b50dc3393 +Refc: 2 +=fun +Module: erl_parse +Uniq: 95113583 +Index: 3 +Address: 0x0000772b50e2c1b0 +Refc: 2 +=fun +Module: code_server +Uniq: 83632253 +Index: 1 +Address: 0x0000772b50cb286e +Refc: 2 +=fun +Module: global +Uniq: 97255194 +Index: 9 +Address: 0x0000772b50f1d77e +Refc: 2 +=fun +Module: net_kernel +Uniq: 107400493 +Index: 10 +Address: 0x0000772b50f01bee +Refc: 2 +=fun +Module: inet_parse +Uniq: 70636431 +Index: 11 +Address: 0x0000772b50eda2f0 +Refc: 2 +=fun +Module: unicode +Uniq: 89740446 +Index: 7 +Address: 0x0000772b50e91560 +Refc: 2 +=fun +Module: erl_eval +Uniq: 81571850 +Index: 45 +Address: 0x0000772b50de52f7 +Refc: 2 +=fun +Module: gen_event +Uniq: 98502976 +Index: 6 +Address: 0x0000772b50d8dc10 +Refc: 2 +=fun +Module: logger_std_h +Uniq: 37924516 +Index: 1 +Address: 0x0000772b50fd22dd +Refc: 2 +=fun +Module: prim_tty +Uniq: 86006838 +Index: 2 +Address: 0x0000772b50f85580 +Refc: 2 +=fun +Module: erl_lint +Uniq: 59358358 +Index: 38 +Address: 0x0000772b50dc22b9 +Refc: 2 +=fun +Module: prim_socket +Uniq: 108649643 +Index: 10 +Address: 0x0000772b50c5392f +Refc: 2 +=fun +Module: standard_error +Uniq: 42423536 +Index: 0 +Address: 0x0000772b50e9d0e1 +Refc: 2 +=fun +Module: group +Uniq: 66375451 +Index: 3 +Address: 0x0000772b50f9c578 +Refc: 2 +=fun +Module: logger_simple_h +Uniq: 50489874 +Index: 2 +Address: 0x0000772b50d7a58e +Refc: 2 +=fun +Module: application_controller +Uniq: 70664124 +Index: 17 +Address: 0x0000772b50d02cf8 +Refc: 2 +=fun +Module: ets +Uniq: 107168513 +Index: 14 +Address: 0x0000772b50d43d43 +Refc: 2 +=fun +Module: erl_lint +Uniq: 59358358 +Index: 111 +Address: 0x0000772b50dc8680 +Refc: 2 +=fun +Module: logger_server +Uniq: 69885138 +Index: 8 +Address: 0x0000772b50d81e82 +Refc: 2 +=fun +Module: erl_eval +Uniq: 81571850 +Index: 67 +Address: 0x0000772b50de1c30 +Refc: 2 +=fun +Module: erl_lint +Uniq: 59358358 +Index: 8 +Address: 0x0000772b50dc7e40 +Refc: 2 +=fun +Module: rand +Uniq: 40079776 +Index: 15 +Address: 0x0000772b50f2cb30 +Refc: 2 +=fun +Module: global +Uniq: 97255194 +Index: 36 +Address: 0x0000772b50f1d243 +Refc: 2 +=fun +Module: erl_eval +Uniq: 81571850 +Index: 26 +Address: 0x0000772b50de4bb7 +Refc: 2 +=fun +Module: erl_prim_loader +Uniq: 91968038 +Index: 5 +Address: 0x0000772b50c6c9b1 +Refc: 2 +=fun +Module: init +Uniq: 88714206 +Index: 0 +Address: 0x0000772b50c07d10 +Refc: 2 +=fun +Module: erl_lint +Uniq: 59358358 +Index: 81 +Address: 0x0000772b50dbddb2 +Refc: 2 +=fun +Module: c +Uniq: 20960249 +Index: 10 +Address: 0x0000772b50fdc408 +Refc: 2 +=fun +Module: application_controller +Uniq: 70664124 +Index: 6 +Address: 0x0000772b50d04050 +Refc: 2 +=fun +Module: inet_parse +Uniq: 70636431 +Index: 4 +Address: 0x0000772b50edb690 +Refc: 2 +=fun +Module: erl_features +Uniq: 45623947 +Index: 7 +Address: 0x0000772b50e95a48 +Refc: 2 +=fun +Module: user_drv +Uniq: 56461357 +Index: 3 +Address: 0x0000772b50f605b1 +Refc: 2 +=fun +Module: global_group +Uniq: 125216658 +Index: 6 +Address: 0x0000772b50f465a9 +Refc: 2 +=fun +Module: global +Uniq: 97255194 +Index: 26 +Address: 0x0000772b50f1b689 +Refc: 2 +=fun +Module: erl_eval +Uniq: 81571850 +Index: 56 +Address: 0x0000772b50de2c45 +Refc: 2 +=fun +Module: supervisor +Uniq: 88264141 +Index: 8 +Address: 0x0000772b50d57930 +Refc: 2 +=fun +Module: proplists +Uniq: 91415178 +Index: 0 +Address: 0x0000772b50e57308 +Refc: 2 +=fun +Module: erl_lint +Uniq: 59358358 +Index: 51 +Address: 0x0000772b50dc1b33 +Refc: 2 +=fun +Module: prim_zip +Uniq: 107817055 +Index: 4 +Address: 0x0000772b50c5d413 +Refc: 2 +=fun +Module: erl_eval +Uniq: 81571850 +Index: 7 +Address: 0x0000772b50de6675 +Refc: 2 +=fun +Module: raw_file_io +Uniq: 33533917 +Index: 4 +Address: 0x0000772b50fe8ee0 +Refc: 2 +=fun +Module: zlib +Uniq: 121920116 +Index: 1 +Address: 0x0000772b50c405c8 +Refc: 2 +=fun +Module: logger_server +Uniq: 69885138 +Index: 5 +Address: 0x0000772b50d81c27 +Refc: 2 +=fun +Module: inet +Uniq: 39702559 +Index: 2 +Address: 0x0000772b50ecfe30 +Refc: 2 +=fun +Module: unicode +Uniq: 89740446 +Index: 15 +Address: 0x0000772b50e93910 +Refc: 2 +=fun +Module: erl_lint +Uniq: 59358358 +Index: 21 +Address: 0x0000772b50dc4376 +Refc: 2 +=fun +Module: erl_parse +Uniq: 95113583 +Index: 11 +Address: 0x0000772b50e2b817 +Refc: 2 +=fun +Module: code_server +Uniq: 83632253 +Index: 9 +Address: 0x0000772b50cb16dd +Refc: 2 +=fun +Module: erl_eval +Uniq: 81571850 +Index: 37 +Address: 0x0000772b50de3aa9 +Refc: 2 +=fun +Module: prim_inet +Uniq: 53596091 +Index: 1 +Address: 0x0000772b50c34068 +Refc: 2 +=fun +Module: code +Uniq: 92045327 +Index: 4 +Address: 0x0000772b50cc35d0 +Refc: 2 +=fun +Module: prim_socket +Uniq: 108649643 +Index: 2 +Address: 0x0000772b50c53e10 +Refc: 2 +=fun +Module: erl_lint +Uniq: 59358358 +Index: 94 +Address: 0x0000772b50dbcd68 +Refc: 2 +=fun +Module: erl_features +Uniq: 45623947 +Index: 10 +Address: 0x0000772b50e991f8 +Refc: 2 +=fun +Module: ets +Uniq: 107168513 +Index: 6 +Address: 0x0000772b50d449d3 +Refc: 2 +=fun +Module: global_group +Uniq: 125216658 +Index: 9 +Address: 0x0000772b50f45e70 +Refc: 2 +=fun +Module: global +Uniq: 97255194 +Index: 23 +Address: 0x0000772b50f1bb68 +Refc: 2 +=fun +Module: erl_lint +Uniq: 59358358 +Index: 103 +Address: 0x0000772b50db74f0 +Refc: 2 +=fun +Module: erl_lint +Uniq: 59358358 +Index: 0 +Address: 0x0000772b50dc92a5 +Refc: 2 +=fun +Module: peer +Uniq: 58704516 +Index: 6 +Address: 0x0000772b50e6892e +Refc: 2 +=fun +Module: rand +Uniq: 40079776 +Index: 23 +Address: 0x0000772b50f2b0f0 +Refc: 2 +=fun +Module: erl_eval +Uniq: 81571850 +Index: 18 +Address: 0x0000772b50de56e4 +Refc: 2 +=fun +Module: init +Uniq: 88714206 +Index: 8 +Address: 0x0000772b50c160a8 +Refc: 2 +=fun +Module: gen +Uniq: 70664065 +Index: 0 +Address: 0x0000772b50d0d6c5 +Refc: 2 +=fun +Module: erl_lint +Uniq: 59358358 +Index: 73 +Address: 0x0000772b50dbf948 +Refc: 2 +=fun +Module: beam_lib +Uniq: 56915673 +Index: 2 +Address: 0x0000772b50e77384 +Refc: 2 +=fun +Module: c +Uniq: 20960249 +Index: 2 +Address: 0x0000772b50fe4529 +Refc: 2 +=fun +Module: application_controller +Uniq: 70664124 +Index: 14 +Address: 0x0000772b50d02f48 +Refc: 2 +=fun +Module: code_server +Uniq: 83632253 +Index: 6 +Address: 0x0000772b50cb193a +Refc: 2 +=fun +Module: global +Uniq: 97255194 +Index: 2 +Address: 0x0000772b50f1e159 +Refc: 2 +=fun +Module: net_kernel +Uniq: 107400493 +Index: 1 +Address: 0x0000772b50f02128 +Refc: 2 +=fun +Module: erl_eval +Uniq: 81571850 +Index: 48 +Address: 0x0000772b50de30d6 +Refc: 2 +=fun +Module: rpc +Uniq: 89088806 +Index: 5 +Address: 0x0000772b50eeb6b5 +Refc: 2 +=fun +Module: erl_lint +Uniq: 59358358 +Index: 43 +Address: 0x0000772b50dc20f3 +Refc: 2 +=fun +Module: ets +Uniq: 107168513 +Index: 9 +Address: 0x0000772b50d44742 +Refc: 2 +=fun +Module: proc_lib +Uniq: 95872253 +Index: 2 +Address: 0x0000772b50d358c7 +Refc: 2 +=fun +Module: erl_lint +Uniq: 59358358 +Index: 13 +Address: 0x0000772b50dc64c0 +Refc: 2 +=fun +Module: rand +Uniq: 40079776 +Index: 4 +Address: 0x0000772b50f28698 +Refc: 2 +=fun +Module: unicode +Uniq: 89740446 +Index: 23 +Address: 0x0000772b50e93c90 +Refc: 2 +=fun +Module: erl_eval +Uniq: 81571850 +Index: 29 +Address: 0x0000772b50de45f1 +Refc: 2 +=fun +Module: init +Uniq: 88714206 +Index: 7 +Address: 0x0000772b50c16c7d +Refc: 2 +=fun +Module: erl_lint +Uniq: 59358358 +Index: 86 +Address: 0x0000772b50dbd918 +Refc: 2 +=fun +Module: c +Uniq: 20960249 +Index: 15 +Address: 0x0000772b50fe3c18 +Refc: 2 +=fun +Module: inet_config +Uniq: 6161651 +Index: 4 +Address: 0x0000772b50eb6808 +Refc: 2 +=fun +Module: inet_db +Uniq: 7513413 +Index: 2 +Address: 0x0000772b50ea57b8 +Refc: 2 +=fun +Module: erl_features +Uniq: 45623947 +Index: 2 +Address: 0x0000772b50e99730 +Refc: 2 +=fun +Module: application_controller +Uniq: 70664124 +Index: 1 +Address: 0x0000772b50d041e0 +Refc: 2 +=fun +Module: global_group +Uniq: 125216658 +Index: 1 +Address: 0x0000772b50f46aa8 +Refc: 2 +=fun +Module: global +Uniq: 97255194 +Index: 31 +Address: 0x0000772b50f1af05 +Refc: 2 +=fun +Module: supervisor +Uniq: 88264141 +Index: 5 +Address: 0x0000772b50d5810c +Refc: 2 +=fun +Module: logger +Uniq: 48184761 +Index: 0 +Address: 0x0000772b50ce9f28 +Refc: 2 +=fun +Module: erl_lint +Uniq: 59358358 +Index: 56 +Address: 0x0000772b50dc17a3 +Refc: 2 +=fun +Module: file +Uniq: 39298303 +Index: 2 +Address: 0x0000772b50cceca8 +Refc: 2 +=fun +Module: raw_file_io +Uniq: 33533917 +Index: 1 +Address: 0x0000772b50fe8d98 +Refc: 2 +=fun +Module: inet_gethost_native +Uniq: 80408359 +Index: 2 +Address: 0x0000772b50edd680 +Refc: 2 +=fun +Module: erl_eval +Uniq: 81571850 +Index: 10 +Address: 0x0000772b50de6120 +Refc: 2 +=fun +Module: erl_lint +Uniq: 59358358 +Index: 65 +Address: 0x0000772b50dc0be9 +Refc: 2 +=fun +Module: inet +Uniq: 39702559 +Index: 15 +Address: 0x0000772b50ecf4d8 +Refc: 2 +=fun +Module: erl_lint +Uniq: 59358358 +Index: 26 +Address: 0x0000772b50dc370c +Refc: 2 +=fun +Module: erl_parse +Uniq: 95113583 +Index: 0 +Address: 0x0000772b50e2ccb8 +Refc: 2 +=fun +Module: file_io_server +Uniq: 52181705 +Index: 1 +Address: 0x0000772b50cde5e8 +Refc: 2 +=fun +Module: unicode +Uniq: 89740446 +Index: 4 +Address: 0x0000772b50e92968 +Refc: 2 +=fun +Module: global +Uniq: 97255194 +Index: 10 +Address: 0x0000772b50f1d836 +Refc: 2 +=fun +Module: net_kernel +Uniq: 107400493 +Index: 9 +Address: 0x0000772b50f01d0e +Refc: 2 +=fun +Module: erl_eval +Uniq: 81571850 +Index: 40 +Address: 0x0000772b50de37f0 +Refc: 2 +=fun +Module: gen_event +Uniq: 98502976 +Index: 3 +Address: 0x0000772b50d8e4da +Refc: 2 +=fun +Module: code +Uniq: 92045327 +Index: 3 +Address: 0x0000772b50cc3658 +Refc: 2 +=fun +Module: erl_lint +Uniq: 59358358 +Index: 35 +Address: 0x0000772b50dc2807 +Refc: 2 +=fun +Module: prim_socket +Uniq: 108649643 +Index: 13 +Address: 0x0000772b50c537e0 +Refc: 2 +=fun +Module: group +Uniq: 66375451 +Index: 0 +Address: 0x0000772b50f9ca5d +Refc: 2 +=fun +Module: logger_simple_h +Uniq: 50489874 +Index: 1 +Address: 0x0000772b50d7a5c8 +Refc: 2 +=fun +Module: ets +Uniq: 107168513 +Index: 1 +Address: 0x0000772b50d450be +Refc: 2 +=fun +Module: application_controller +Uniq: 70664124 +Index: 20 +Address: 0x0000772b50d02ae3 +Refc: 2 +=fun +Module: erl_lint +Uniq: 59358358 +Index: 108 +Address: 0x0000772b50dbfdaf +Refc: 2 +=fun +Module: binary +Uniq: 15025403 +Index: 0 +Address: 0x0000772b50e7d439 +Refc: 2 +=fun +Module: erl_lint +Uniq: 59358358 +Index: 5 +Address: 0x0000772b50dc86e8 +Refc: 2 +=fun +Module: kernel_refc +Uniq: 76594406 +Index: 0 +Address: 0x0000772b50fc5015 +Refc: 2 +=fun +Module: rand +Uniq: 40079776 +Index: 12 +Address: 0x0000772b50f2aa90 +Refc: 2 +=fun +Module: global +Uniq: 97255194 +Index: 33 +Address: 0x0000772b50f1adc8 +Refc: 2 +=fun +Module: erl_prim_loader +Uniq: 91968038 +Index: 6 +Address: 0x0000772b50c6c815 +Refc: 2 +=fun +Module: erl_eval +Uniq: 81571850 +Index: 21 +Address: 0x0000772b50de53a8 +Refc: 2 +=fun +Module: init +Uniq: 88714206 +Index: 15 +Address: 0x0000772b50c15c2c +Refc: 2 +=fun +Module: erl_lint +Uniq: 59358358 +Index: 78 +Address: 0x0000772b50dbe5f2 +Refc: 2 +=fun +Module: c +Uniq: 20960249 +Index: 7 +Address: 0x0000772b50fe428c +Refc: 2 +=fun +Module: logger_h_common +Uniq: 2734986 +Index: 0 +Address: 0x0000772b50fd84a6 +Refc: 2 +=fun +Module: inet_db +Uniq: 7513413 +Index: 10 +Address: 0x0000772b50eaf600 +Refc: 2 +=fun +Module: application_controller +Uniq: 70664124 +Index: 9 +Address: 0x0000772b50d033f8 +Refc: 2 +=fun +Module: maps +Uniq: 82648977 +Index: 3 +Address: 0x0000772b50f38aba +Refc: 2 +=fun +Module: inet_parse +Uniq: 70636431 +Index: 1 +Address: 0x0000772b50edbc18 +Refc: 2 +=proc_stack:<0.0.0> +0x0000772b4c29e408:SReturn addr 0x50C72DC4 (erlang:halt/1 + 140) +y0:H772B4C29CED8 +y1:SCatch 0x50C72DD9 (erlang:halt/1 + 161) +0x0000772b4c29e420:SReturn addr 0x50C011F8 () +=proc_heap:<0.0.0> +772B4C29CED8:lI82|H772B4C29CEE8 +772B4C29CEE8:lI117|H772B4C29CEF8 +772B4C29CEF8:lI110|H772B4C29CF08 +772B4C29CF08:lI116|H772B4C29CF18 +772B4C29CF18:lI105|H772B4C29CF28 +772B4C29CF28:lI109|H772B4C29CF38 +772B4C29CF38:lI101|H772B4C29CF48 +772B4C29CF48:lI32|H772B4C29CF58 +772B4C29CF58:lI116|H772B4C29CF68 +772B4C29CF68:lI101|H772B4C29CF78 +772B4C29CF78:lI114|H772B4C29CF88 +772B4C29CF88:lI109|H772B4C29CF98 +772B4C29CF98:lI105|H772B4C29CFA8 +772B4C29CFA8:lI110|H772B4C29CFB8 +772B4C29CFB8:lI97|H772B4C29CFC8 +772B4C29CFC8:lI116|H772B4C29CFD8 +772B4C29CFD8:lI105|H772B4C29CFE8 +772B4C29CFE8:lI110|H772B4C29CFF8 +772B4C29CFF8:lI103|H772B4C29D008 +772B4C29D008:lI32|H772B4C29D018 +772B4C29D018:lI100|H772B4C29D028 +772B4C29D028:lI117|H772B4C29D038 +772B4C29D038:lI114|H772B4C29D048 +772B4C29D048:lI105|H772B4C29D058 +772B4C29D058:lI110|H772B4C29D068 +772B4C29D068:lI103|H772B4C29D078 +772B4C29D078:lI32|H772B4C29D088 +772B4C29D088:lI98|H772B4C29D098 +772B4C29D098:lI111|H772B4C29D0A8 +772B4C29D0A8:lI111|H772B4C29D0B8 +772B4C29D0B8:lI116|H772B4C29CEC8 +772B4C29CEC8:lI32|H772B4C29CEB8 +772B4C29CEB8:lI40|H772B4C29CA48 +772B4C29CA48:lI123|H772B4C29CA58 +772B4C29CA58:lI117|H772B4C29CA68 +772B4C29CA68:lI110|H772B4C29CA78 +772B4C29CA78:lI100|H772B4C29CA88 +772B4C29CA88:lI101|H772B4C29CA98 +772B4C29CA98:lI102|H772B4C29CAA8 +772B4C29CAA8:lI44|H772B4C29CAB8 +772B4C29CAB8:lI91|H772B4C29CAC8 +772B4C29CAC8:lI123|H772B4C29CAD8 +772B4C29CAD8:lI105|H772B4C29CAE8 +772B4C29CAE8:lI110|H772B4C29CAF8 +772B4C29CAF8:lI105|H772B4C29CB08 +772B4C29CB08:lI116|H772B4C29CB18 +772B4C29CB18:lI44|H772B4C29CB28 +772B4C29CB28:lI115|H772B4C29CB38 +772B4C29CB38:lI116|H772B4C29CB48 +772B4C29CB48:lI97|H772B4C29CB58 +772B4C29CB58:lI114|H772B4C29CB68 +772B4C29CB68:lI116|H772B4C29CB78 +772B4C29CB78:lI95|H772B4C29CB88 +772B4C29CB88:lI105|H772B4C29CB98 +772B4C29CB98:lI116|H772B4C29CBA8 +772B4C29CBA8:lI44|H772B4C29CBB8 +772B4C29CBB8:lI49|H772B4C29CBC8 +772B4C29CBC8:lI44|H772B4C29CBD8 +772B4C29CBD8:lI91|H772B4C29CBE8 +772B4C29CBE8:lI93|H772B4C29CBF8 +772B4C29CBF8:lI125|H772B4C29CC08 +772B4C29CC08:lI44|H772B4C29CC18 +772B4C29CC18:lI123|H772B4C29CC28 +772B4C29CC28:lI105|H772B4C29CC38 +772B4C29CC38:lI110|H772B4C29CC48 +772B4C29CC48:lI105|H772B4C29CC58 +772B4C29CC58:lI116|H772B4C29CC68 +772B4C29CC68:lI44|H772B4C29CC78 +772B4C29CC78:lI115|H772B4C29CC88 +772B4C29CC88:lI116|H772B4C29CC98 +772B4C29CC98:lI97|H772B4C29CCA8 +772B4C29CCA8:lI114|H772B4C29CCB8 +772B4C29CCB8:lI116|H772B4C29CCC8 +772B4C29CCC8:lI95|H772B4C29CCD8 +772B4C29CCD8:lI101|H772B4C29CCE8 +772B4C29CCE8:lI109|H772B4C29CCF8 +772B4C29CCF8:lI44|H772B4C29CD08 +772B4C29CD08:lI49|H772B4C29CD18 +772B4C29CD18:lI44|H772B4C29CD28 +772B4C29CD28:lI91|H772B4C29CD38 +772B4C29CD38:lI93|H772B4C29CD48 +772B4C29CD48:lI125|H772B4C29CD58 +772B4C29CD58:lI44|H772B4C29CD68 +772B4C29CD68:lI123|H772B4C29CD78 +772B4C29CD78:lI105|H772B4C29CD88 +772B4C29CD88:lI110|H772B4C29CD98 +772B4C29CD98:lI105|H772B4C29CDA8 +772B4C29CDA8:lI116|H772B4C29CDB8 +772B4C29CDB8:lI44|H772B4C29CDC8 +772B4C29CDC8:lI100|H772B4C29CDD8 +772B4C29CDD8:lI111|H772B4C29CDE8 +772B4C29CDE8:lI95|H772B4C29CDF8 +772B4C29CDF8:lI98|H772B4C29CE08 +772B4C29CE08:lI111|H772B4C29CE18 +772B4C29CE18:lI111|H772B4C29CE28 +772B4C29CE28:lI116|H772B4C29CE38 +772B4C29CE38:lI44|H772B4C29CE48 +772B4C29CE48:lI51|H772B4C29CE58 +772B4C29CE58:lI44|H772B4C29CE68 +772B4C29CE68:lI91|H772B4C29CE78 +772B4C29CE78:lI93|H772B4C29CE88 +772B4C29CE88:lI125|H772B4C29CE98 +772B4C29CE98:lI93|H772B4C29CEA8 +772B4C29CEA8:lI125|H772B4C29CA38 +772B4C29CA38:lI41|N +=proc_stack:<0.1.0> +0x0000772b57844ee8:SReturn addr 0x50C011F8 () +=proc_heap:<0.1.0> +=proc_stack:<0.2.0> +y0:N +y1:I0 +y2:I60000 +y3:N +y4:I0 +y5:H772B58428E00 +y6:A9:undefined +0x0000772b57845eb8:SReturn addr 0x50C011F8 () +=proc_heap:<0.2.0> +=proc_stack:<0.3.0> +y0:N +0x0000772b57846608:SReturn addr 0x50C011F8 () +=proc_heap:<0.3.0> +=proc_stack:<0.4.0> +y0:N +0x0000772b57846d58:SReturn addr 0x50C011F8 () +=proc_heap:<0.4.0> +=proc_stack:<0.5.0> +y0:N +0x0000772b578474a8:SReturn addr 0x50C011F8 () +=proc_heap:<0.5.0> +=proc_stack:<0.6.0> +0x0000772b57847bf8:SReturn addr 0x50C011F8 () +=proc_heap:<0.6.0> +=proc_stack:<0.7.0> +0x0000772b580fc900:SReturn addr 0x50C011F8 () +=proc_heap:<0.7.0> +=proc_stack:<0.8.0> +y0:N +y1:N +y2:H772B58424520 +0x0000772b580fd050:SReturn addr 0x50C011F8 () +=proc_heap:<0.8.0> +=proc_stack:<0.11.0> +y0:N +y1:I360000 +y2:H772B577185E8 +y3:P<0.10.0> +y4:H772B57716D80 +0x0000772b4c2384a0:SReturn addr 0x50C011F8 () +=proc_heap:<0.11.0> +772B577185E8:lH772B57717AE8|H772B577185D8 +772B57717AE8:lI47|H772B57717B18 +772B57717B18:lI104|H772B57717B48 +772B57717B48:lI111|H772B57717B78 +772B57717B78:lI109|H772B57717BA8 +772B57717BA8:lI101|H772B57717BD8 +772B57717BD8:lI47|H772B57717C08 +772B57717C08:lI104|H772B57717C38 +772B57717C38:lI121|H772B57717C68 +772B57717C68:lI112|H772B57717C98 +772B57717C98:lI101|H772B57717CC8 +772B57717CC8:lI114|H772B57717CF8 +772B57717CF8:lI112|H772B57717D28 +772B57717D28:lI111|H772B57717D58 +772B57717D58:lI108|H772B57717D88 +772B57717D88:lI121|H772B57717DB8 +772B57717DB8:lI109|H772B57717DE8 +772B57717DE8:lI97|H772B57717E18 +772B57717E18:lI116|H772B57717E48 +772B57717E48:lI104|H772B57717E78 +772B57717E78:lI47|H772B57717EA8 +772B57717EA8:lI100|H772B57717ED8 +772B57717ED8:lI101|H772B57717F08 +772B57717F08:lI118|H772B57717F38 +772B57717F38:lI101|H772B57717F68 +772B57717F68:lI108|H772B57717F98 +772B57717F98:lI111|H772B57717FC8 +772B57717FC8:lI112|H772B57717FF8 +772B57717FF8:lI101|H772B57718028 +772B57718028:lI114|H772B57718058 +772B57718058:lI47|H772B57718088 +772B57718088:lI116|H772B577180B8 +772B577180B8:lI111|H772B577180E8 +772B577180E8:lI111|H772B57718118 +772B57718118:lI108|H772B57718148 +772B57718148:lI115|H772B57718178 +772B57718178:lI47|H772B577181A8 +772B577181A8:lI111|H772B577181D8 +772B577181D8:lI112|H772B57718208 +772B57718208:lI116|H772B57718238 +772B57718238:lI47|H772B57718248 +772B57718248:lI109|H772B57718258 +772B57718258:lI105|H772B57718268 +772B57718268:lI115|H772B57718278 +772B57718278:lI101|H772B57718288 +772B57718288:lI47|H772B57718298 +772B57718298:lI105|H772B577182A8 +772B577182A8:lI110|H772B577182B8 +772B577182B8:lI115|H772B577182C8 +772B577182C8:lI116|H772B577182D8 +772B577182D8:lI97|H772B577182E8 +772B577182E8:lI108|H772B577182F8 +772B577182F8:lI108|H772B57718308 +772B57718308:lI115|H772B57718318 +772B57718318:lI47|H772B57718328 +772B57718328:lI101|H772B57718338 +772B57718338:lI108|H772B57718348 +772B57718348:lI105|H772B57718358 +772B57718358:lI120|H772B57718368 +772B57718368:lI105|H772B57718378 +772B57718378:lI114|H772B57718388 +772B57718388:lI47|H772B57718398 +772B57718398:lI49|H772B577183A8 +772B577183A8:lI46|H772B577183B8 +772B577183B8:lI49|H772B577183C8 +772B577183C8:lI57|H772B577183D8 +772B577183D8:lI46|H772B577183E8 +772B577183E8:lI53|H772B577183F8 +772B577183F8:lI45|H772B57718408 +772B57718408:lI111|H772B57718418 +772B57718418:lI116|H772B57718428 +772B57718428:lI112|H772B57718438 +772B57718438:lI45|H772B57718448 +772B57718448:lI50|H772B57718458 +772B57718458:lI56|H772B57718468 +772B57718468:lI47|H772B57718478 +772B57718478:lI98|H772B57718488 +772B57718488:lI105|H772B57718498 +772B57718498:lI110|H772B577184A8 +772B577184A8:lI47|H772B577184B8 +772B577184B8:lI46|H772B577184C8 +772B577184C8:lI46|H772B577184D8 +772B577184D8:lI47|H772B577184E8 +772B577184E8:lI108|H772B577184F8 +772B577184F8:lI105|H772B57718508 +772B57718508:lI98|H772B57718518 +772B57718518:lI47|H772B57718528 +772B57718528:lI101|H772B57718538 +772B57718538:lI108|H772B57718548 +772B57718548:lI105|H772B57718558 +772B57718558:lI120|H772B57718568 +772B57718568:lI105|H772B57718578 +772B57718578:lI114|H772B57718588 +772B57718588:lI47|H772B57718598 +772B57718598:lI101|H772B577185A8 +772B577185A8:lI98|H772B577185B8 +772B577185B8:lI105|H772B577185C8 +772B577185C8:lI110|N +772B577185D8:lH772B57717AD8|H772B577185F8 +772B57717AD8:lI47|H772B57717B08 +772B57717B08:lI117|H772B57717B38 +772B57717B38:lI115|H772B57717B68 +772B57717B68:lI114|H772B57717B98 +772B57717B98:lI47|H772B57717BC8 +772B57717BC8:lI108|H772B57717BF8 +772B57717BF8:lI105|H772B57717C28 +772B57717C28:lI98|H772B57717C58 +772B57717C58:lI47|H772B57717C88 +772B57717C88:lI101|H772B57717CB8 +772B57717CB8:lI114|H772B57717CE8 +772B57717CE8:lI108|H772B57717D18 +772B57717D18:lI97|H772B57717D48 +772B57717D48:lI110|H772B57717D78 +772B57717D78:lI103|H772B57717DA8 +772B57717DA8:lI47|H772B57717DD8 +772B57717DD8:lI108|H772B57717E08 +772B57717E08:lI105|H772B57717E38 +772B57717E38:lI98|H772B57717E68 +772B57717E68:lI47|H772B57717E98 +772B57717E98:lI107|H772B57717EC8 +772B57717EC8:lI101|H772B57717EF8 +772B57717EF8:lI114|H772B57717F28 +772B57717F28:lI110|H772B57717F58 +772B57717F58:lI101|H772B57717F88 +772B57717F88:lI108|H772B57717FB8 +772B57717FB8:lI45|H772B57717FE8 +772B57717FE8:lI49|H772B57718018 +772B57718018:lI48|H772B57718048 +772B57718048:lI46|H772B57718078 +772B57718078:lI50|H772B577180A8 +772B577180A8:lI46|H772B577180D8 +772B577180D8:lI55|H772B57718108 +772B57718108:lI46|H772B57718138 +772B57718138:lI49|H772B57718168 +772B57718168:lI47|H772B57718198 +772B57718198:lI101|H772B577181C8 +772B577181C8:lI98|H772B577181F8 +772B577181F8:lI105|H772B57718228 +772B57718228:lI110|N +772B577185F8:lH772B57717AF8|N +772B57717AF8:lI47|H772B57717B28 +772B57717B28:lI117|H772B57717B58 +772B57717B58:lI115|H772B57717B88 +772B57717B88:lI114|H772B57717BB8 +772B57717BB8:lI47|H772B57717BE8 +772B57717BE8:lI108|H772B57717C18 +772B57717C18:lI105|H772B57717C48 +772B57717C48:lI98|H772B57717C78 +772B57717C78:lI47|H772B57717CA8 +772B57717CA8:lI101|H772B57717CD8 +772B57717CD8:lI114|H772B57717D08 +772B57717D08:lI108|H772B57717D38 +772B57717D38:lI97|H772B57717D68 +772B57717D68:lI110|H772B57717D98 +772B57717D98:lI103|H772B57717DC8 +772B57717DC8:lI47|H772B57717DF8 +772B57717DF8:lI108|H772B57717E28 +772B57717E28:lI105|H772B57717E58 +772B57717E58:lI98|H772B57717E88 +772B57717E88:lI47|H772B57717EB8 +772B57717EB8:lI115|H772B57717EE8 +772B57717EE8:lI116|H772B57717F18 +772B57717F18:lI100|H772B57717F48 +772B57717F48:lI108|H772B57717F78 +772B57717F78:lI105|H772B57717FA8 +772B57717FA8:lI98|H772B57717FD8 +772B57717FD8:lI45|H772B57718008 +772B57718008:lI54|H772B57718038 +772B57718038:lI46|H772B57718068 +772B57718068:lI50|H772B57718098 +772B57718098:lI46|H772B577180C8 +772B577180C8:lI50|H772B577180F8 +772B577180F8:lI46|H772B57718128 +772B57718128:lI49|H772B57718158 +772B57718158:lI47|H772B57718188 +772B57718188:lI101|H772B577181B8 +772B577181B8:lI98|H772B577181E8 +772B577181E8:lI105|H772B57718218 +772B57718218:lI110|N +772B57716D80:t6:A5:state,A5:efile,N,A6:noport,I360000,H772B57716DB8 +772B57716DB8:t3:AA:prim_state,A5:false,A9:undefined +=proc_dictionary:<0.43.0> +H772B4C214E28 +H772B4C214E70 +H772B4C214E10 +=proc_stack:<0.43.0> +y0:N +y1:A8:infinity +y2:H772B4C214DD0 +y3:H772B4C26CCC0 +y4:A6:logger +y5:P<0.10.0> +0x0000772b4c26dee8:SReturn addr 0x50D2C2E8 (proc_lib:init_p_do_apply/3 + 192) +y0:N +y1:N +y2:SCatch 0x50D2C2FD (proc_lib:init_p_do_apply/3 + 213) +0x0000772b4c26df08:SReturn addr 0x50C011F8 () +=proc_heap:<0.43.0> +772B4C214DD0:t5:AE:callback_cache,AD:logger_server,H772B584151F0,H772B584151E0,H772B584151D0 +772B4C26CCC0:t5:A5:state,H772B4C214D88,A9:undefined,H772B5845AF30,A9:undefined +772B4C214D88:E23:g1oAA3cNbm9ub2RlQG5vaG9zdAAAAAAAA5YPQkIAAumgILU= +772B4C214E28:t2:A12:$logger_cb_process,A4:true +772B4C214E70:t2:AA:$ancestors,H772B4C214E88 +772B4C214E88:lP<0.10.0>|N +772B4C214E10:t2:AD:$initial_call,H772B4C214E50 +772B4C214E50:t3:AD:logger_server,A4:init,I1 +=proc_dictionary:<0.45.0> +H772B4C243978 +H772B4C243990 +=proc_stack:<0.45.0> +y0:N +y1:A8:infinity +y2:H772B4C24BC48 +y3:H772B4C24E4A0 +y4:A16:application_controller +y5:P<0.10.0> +0x0000772b4c250d10:SReturn addr 0x50C011F8 () +=proc_heap:<0.45.0> +772B4C24BC48:t5:AE:callback_cache,A16:application_controller,H772B584165C0,H772B584165B0,H772B584165A0 +772B4C24E4A0:t9:A5:state,N,N,N,H772B4C24E468,N,H772B4C24E490,N,N +772B4C24E490:lH772B4C24E478|H772B4C24CED8 +772B4C24E478:t2:A6:stdlib,A9:permanent +772B4C24CED8:lH772B4C24CEC0|N +772B4C24CEC0:t2:A6:kernel,A9:permanent +772B4C24E468:lH772B4C24E450|H772B4C24CEB0 +772B4C24E450:t2:A6:stdlib,A9:undefined +772B4C24CEB0:lH772B4C24CE98|N +772B4C24CE98:t2:A6:kernel,P<0.46.0> +772B4C243978:t2:AA:$ancestors,H772B4C2439A8 +772B4C2439A8:lP<0.10.0>|N +772B4C243990:t2:AD:$initial_call,H772B5843B728 +=proc_dictionary:<0.46.0> +H772B4C214AF0 +H772B4C214B28 +=proc_stack:<0.46.0> +y0:H772B4C214CD8 +y1:P<0.45.0> +0x0000772b4c214d58:SReturn addr 0x50D2C2E8 (proc_lib:init_p_do_apply/3 + 192) +y0:N +y1:N +y2:SCatch 0x50D2C2FD (proc_lib:init_p_do_apply/3 + 213) +0x0000772b4c214d78:SReturn addr 0x50C011F8 () +=proc_heap:<0.46.0> +772B4C214CD8:t7:A5:state,P<0.47.0>,H772B4C2141F0,N,I0,A4:init,N +772B4C2141F0:t8:A9:appl_data,A6:kernel,H772B4C214A70,A9:undefined,H772B4C214238,H772B4C214890,A8:infinity,A8:infinity +772B4C214890:lAB:application|H772B4C214880 +772B4C214880:lA16:application_controller|H772B4C214870 +772B4C214870:lA12:application_master|H772B4C214860 +772B4C214860:lA13:application_starter|H772B4C214850 +772B4C214850:lA4:auth|H772B4C214840 +772B4C214840:lA4:code|H772B4C214830 +772B4C214830:lAB:code_server|H772B4C214820 +772B4C214820:lA9:dist_util|H772B4C214810 +772B4C214810:lAF:erl_boot_server|H772B4C214800 +772B4C214800:lA12:erl_compile_server|H772B4C2147F0 +772B4C2147F0:lA10:erl_distribution|H772B4C2147E0 +772B4C2147E0:lAF:erl_erts_errors|H772B4C2147D0 +772B4C2147D0:lA9:erl_reply|H772B4C2147C0 +772B4C2147C0:lA11:erl_kernel_errors|H772B4C2147B0 +772B4C2147B0:lA12:erl_signal_handler|H772B4C2147A0 +772B4C2147A0:lA4:erpc|H772B4C214790 +772B4C214790:lAD:error_handler|H772B4C214780 +772B4C214780:lAC:error_logger|H772B4C214770 +772B4C214770:lA4:file|H772B4C214760 +772B4C214760:lAB:file_server|H772B4C214750 +772B4C214750:lAE:file_io_server|H772B4C214740 +772B4C214740:lA6:global|H772B4C214730 +772B4C214730:lAC:global_group|H772B4C214720 +772B4C214720:lAD:global_search|H772B4C214710 +772B4C214710:lA5:group|H772B4C214700 +772B4C214700:lAD:group_history|H772B4C2146F0 +772B4C2146F0:lA5:heart|H772B4C2146E0 +772B4C2146E0:lA9:inet6_tcp|H772B4C2146D0 +772B4C2146D0:lAE:inet6_tcp_dist|H772B4C2146C0 +772B4C2146C0:lA9:inet6_udp|H772B4C2146B0 +772B4C2146B0:lAA:inet6_sctp|H772B4C2146A0 +772B4C2146A0:lAB:inet_config|H772B4C214690 +772B4C214690:lAE:inet_epmd_dist|H772B4C214680 +772B4C214680:lA10:inet_epmd_socket|H772B4C214670 +772B4C214670:lAA:inet_hosts|H772B4C214660 +772B4C214660:lA13:inet_gethost_native|H772B4C214650 +772B4C214650:lAD:inet_tcp_dist|H772B4C214640 +772B4C214640:lA6:kernel|H772B4C214630 +772B4C214630:lAD:kernel_config|H772B4C214620 +772B4C214620:lAB:kernel_refc|H772B4C214610 +772B4C214610:lA9:local_tcp|H772B4C214600 +772B4C214600:lA9:local_udp|H772B4C2145F0 +772B4C2145F0:lA6:logger|H772B4C2145E0 +772B4C2145E0:lAE:logger_backend|H772B4C2145D0 +772B4C2145D0:lAD:logger_config|H772B4C2145C0 +772B4C2145C0:lA11:logger_disk_log_h|H772B4C2145B0 +772B4C2145B0:lAE:logger_filters|H772B4C2145A0 +772B4C2145A0:lA10:logger_formatter|H772B4C214590 +772B4C214590:lAF:logger_h_common|H772B4C214580 +772B4C214580:lAE:logger_handler|H772B4C214570 +772B4C214570:lA16:logger_handler_watcher|H772B4C214560 +772B4C214560:lAA:logger_olp|H772B4C214550 +772B4C214550:lAC:logger_proxy|H772B4C214540 +772B4C214540:lAD:logger_server|H772B4C214530 +772B4C214530:lAF:logger_simple_h|H772B4C214520 +772B4C214520:lAC:logger_std_h|H772B4C214510 +772B4C214510:lAA:logger_sup|H772B4C214500 +772B4C214500:lA3:net|H772B4C2144F0 +772B4C2144F0:lA7:net_adm|H772B4C2144E0 +772B4C2144E0:lAA:net_kernel|H772B4C2144D0 +772B4C2144D0:lA2:os|H772B4C2144C0 +772B4C2144C0:lA8:ram_file|H772B4C2144B0 +772B4C2144B0:lA3:rpc|H772B4C2144A0 +772B4C2144A0:lA8:user_drv|H772B4C214490 +772B4C214490:lA8:user_sup|H772B4C214480 +772B4C214480:lA8:prim_tty|H772B4C214470 +772B4C214470:lA8:disk_log|H772B4C214460 +772B4C214460:lAA:disk_log_1|H772B4C214450 +772B4C214450:lAF:disk_log_server|H772B4C214440 +772B4C214440:lAC:disk_log_sup|H772B4C214430 +772B4C214430:lA7:dist_ac|H772B4C214420 +772B4C214420:lA8:erl_ddll|H772B4C214410 +772B4C214410:lA8:erl_epmd|H772B4C214400 +772B4C214400:lAA:erts_debug|H772B4C2143F0 +772B4C2143F0:lA7:gen_tcp|H772B4C2143E0 +772B4C2143E0:lAE:gen_tcp_socket|H772B4C2143D0 +772B4C2143D0:lA7:gen_udp|H772B4C2143C0 +772B4C2143C0:lAE:gen_udp_socket|H772B4C2143B0 +772B4C2143B0:lA8:gen_sctp|H772B4C2143A0 +772B4C2143A0:lA4:inet|H772B4C214390 +772B4C214390:lA7:inet_db|H772B4C214380 +772B4C214380:lA8:inet_dns|H772B4C214370 +772B4C214370:lAD:inet_dns_tsig|H772B4C214360 +772B4C214360:lAA:inet_parse|H772B4C214350 +772B4C214350:lA8:inet_res|H772B4C214340 +772B4C214340:lA8:inet_tcp|H772B4C214330 +772B4C214330:lA8:inet_udp|H772B4C214320 +772B4C214320:lA9:inet_sctp|H772B4C214310 +772B4C214310:lA2:pg|H772B4C214300 +772B4C214300:lA3:pg2|H772B4C2142F0 +772B4C2142F0:lAB:raw_file_io|H772B4C2142E0 +772B4C2142E0:lA16:raw_file_io_compressed|H772B4C2142D0 +772B4C2142D0:lA13:raw_file_io_deflate|H772B4C2142C0 +772B4C2142C0:lA13:raw_file_io_delayed|H772B4C2142B0 +772B4C2142B0:lA13:raw_file_io_inflate|H772B4C2142A0 +772B4C2142A0:lA10:raw_file_io_list|H772B4C214290 +772B4C214290:lA9:seq_trace|H772B4C214280 +772B4C214280:lA6:socket|H772B4C214270 +772B4C214270:lAE:standard_error|H772B4C214260 +772B4C214260:lA5:trace|H772B4C214250 +772B4C214250:lAF:wrap_log_reader|N +772B4C214238:t2:A6:kernel,N +772B4C214A70:lA16:application_controller|H772B4C214A60 +772B4C214A60:lA9:erl_reply|H772B4C214A50 +772B4C214A50:lA4:auth|H772B4C214A40 +772B4C214A40:lAB:boot_server|H772B4C214A30 +772B4C214A30:lAB:code_server|H772B4C214A20 +772B4C214A20:lAF:disk_log_server|H772B4C214A10 +772B4C214A10:lAC:disk_log_sup|H772B4C214A00 +772B4C214A00:lAF:erl_prim_loader|H772B4C2149F0 +772B4C2149F0:lAC:error_logger|H772B4C2149E0 +772B4C2149E0:lAD:file_server_2|H772B4C2149D0 +772B4C2149D0:lAF:fixtable_server|H772B4C2149C0 +772B4C2149C0:lAC:global_group|H772B4C2149B0 +772B4C2149B0:lA12:global_name_server|H772B4C2149A0 +772B4C2149A0:lA5:heart|H772B4C214990 +772B4C214990:lA4:init|H772B4C214980 +772B4C214980:lAD:kernel_config|H772B4C214970 +772B4C214970:lAB:kernel_refc|H772B4C214960 +772B4C214960:lAA:kernel_sup|H772B4C214950 +772B4C214950:lA6:logger|H772B4C214940 +772B4C214940:lA16:logger_handler_watcher|H772B4C214930 +772B4C214930:lAA:logger_sup|H772B4C214920 +772B4C214920:lAA:net_kernel|H772B4C214910 +772B4C214910:lA7:net_sup|H772B4C214900 +772B4C214900:lA3:rex|H772B4C2148F0 +772B4C2148F0:lA4:user|H772B4C2148E0 +772B4C2148E0:lA9:os_server|H772B4C2148D0 +772B4C2148D0:lAB:ddll_server|H772B4C2148C0 +772B4C2148C0:lA8:erl_epmd|H772B4C2148B0 +772B4C2148B0:lA7:inet_db|H772B4C2148A0 +772B4C2148A0:lA2:pg|N +772B4C214AF0:t2:AA:$ancestors,H772B4C214AE0 +772B4C214AE0:lA16:application_controller|H772B4C214AA0 +772B4C214AA0:lP<0.10.0>|N +772B4C214B28:t2:AD:$initial_call,H772B4C214B08 +772B4C214B08:t3:A12:application_master,A4:init,I3 +=proc_stack:<0.47.0> +y0:N +y1:N +y2:A6:kernel +y3:P<0.49.0> +y4:P<0.46.0> +0x0000772b4c21aa28:SReturn addr 0x50C011F8 () +=proc_heap:<0.47.0> +=proc_dictionary:<0.49.0> +H772B4C23A4A8 +H772B4C23A4C0 +=proc_stack:<0.49.0> +y0:N +y1:A8:infinity +y2:H772B4C298388 +y3:H772B4C298758 +y4:AA:kernel_sup +y5:P<0.47.0> +0x0000772b4c29b208:SReturn addr 0x50D2C45C (proc_lib:wake_up/3 + 228) +y0:N +y1:N +y2:SCatch 0x50D2C471 (proc_lib:wake_up/3 + 249) +0x0000772b4c29b228:SReturn addr 0x50C011F8 () +=proc_heap:<0.49.0> +772B4C298388:t5:AE:callback_cache,AA:supervisor,H772B58415940,H772B58415930,H772B58415920 +772B4C298758:tC:A5:state,H772B58435558,AB:one_for_all,H772B4C298740,A9:undefined,I0,I1,N,I0,A5:never,A6:kernel,N +772B4C298740:t2:H772B4C298070,H772B4C2986B0 +772B4C2986B0:MfF:H772B4C23A4D8:H772B4C23AC80,H772B4C298660,H772B4C23ACD0,H772B4C23AD20,H772B4C23ABD0,H772B4C298120,H772B4C23AA58,H772B4C23AD70,H772B4C23ADC0,H772B4C298170,H772B4C23AE10,H772B4C23AC20,H772B4C23A878,H772B4C23AE60,H772B4C2981C0 +772B4C23A4D8:tF:A11:erl_signal_server,A7:on_load,A4:user,A12:global_name_server,AE:standard_error,AB:kernel_refc,AB:code_server,AC:global_group,A7:inet_db,AD:kernel_config,AA:logger_sup,AD:file_server_2,A7:net_sup,A3:rex,AF:kernel_safe_sup +772B4C2981C0:t9:A5:child,P<0.76.0>,AF:kernel_safe_sup,H772B58435AD0,A9:permanent,A5:false,A8:infinity,AA:supervisor,H772B58435AC0 +772B4C23AE60:t9:A5:child,P<0.57.0>,A3:rex,H772B58436228,A9:permanent,A5:false,I2000,A6:worker,H772B58436218 +772B4C23A878:t9:A5:child,A9:undefined,A7:net_sup,H772B58436018,A9:permanent,A5:false,A8:infinity,AA:supervisor,H772B58436008 +772B4C23AC20:t9:A5:child,P<0.53.0>,AD:file_server_2,H772B58435690,A9:permanent,A5:false,I2000,A6:worker,H772B58435650 +772B4C23AE10:t9:A5:child,P<0.71.0>,AA:logger_sup,H772B584358C0,A9:permanent,A5:false,A8:infinity,AA:supervisor,H772B584358B0 +772B4C298170:t9:A5:child,P<0.74.0>,AD:kernel_config,H772B58435970,A9:permanent,A5:false,I2000,A6:worker,H772B58435960 +772B4C23ADC0:t9:A5:child,P<0.55.0>,A7:inet_db,H772B58435F48,A9:permanent,A5:false,I2000,A6:worker,H772B58435F38 +772B4C23AD70:t9:A5:child,P<0.62.0>,AC:global_group,H772B584360C8,A9:permanent,A5:false,I2000,A6:worker,H772B584360B8 +772B4C23AA58:t9:A5:child,P<0.50.0>,AB:code_server,H772B58435D68,A9:permanent,A5:false,I2000,A6:worker,H772B58435D58 +772B4C298120:t9:A5:child,P<0.75.0>,AB:kernel_refc,H772B58435A20,A9:permanent,A5:false,I2000,A6:worker,H772B58435A10 +772B4C23ABD0:t9:A5:child,P<0.51.0>,AE:standard_error,H772B58435CB8,A9:temporary,A5:false,I2000,AA:supervisor,H772B58435CA8 +772B4C23AD20:t9:A5:child,P<0.59.0>,A12:global_name_server,H772B58436178,A9:permanent,A5:false,I2000,A6:worker,H772B58436168 +772B4C23ACD0:t9:A5:child,P<0.65.0>,A4:user,H772B58435810,A9:temporary,A5:false,I2000,AA:supervisor,H772B58435800 +772B4C298660:t9:A5:child,A9:undefined,A7:on_load,H772B58435BC8,A9:transient,A5:false,I2000,A6:worker,H772B58435BB8 +772B4C23AC80:t9:A5:child,P<0.64.0>,A11:erl_signal_server,H772B58435E70,A9:permanent,A5:false,I2000,A6:worker,A7:dynamic +772B4C298070:lAF:kernel_safe_sup|H772B4C298110 +772B4C298110:lAB:kernel_refc|H772B4C298210 +772B4C298210:lAD:kernel_config|H772B4C23AEB0 +772B4C23AEB0:lAA:logger_sup|H772B4C23AEC0 +772B4C23AEC0:lA4:user|H772B4C23AED0 +772B4C23AED0:lA11:erl_signal_server|H772B4C23AEE0 +772B4C23AEE0:lAC:global_group|H772B4C23AEF0 +772B4C23AEF0:lA7:net_sup|H772B4C23AF00 +772B4C23AF00:lA12:global_name_server|H772B4C23AF10 +772B4C23AF10:lA3:rex|H772B4C23AF20 +772B4C23AF20:lA7:inet_db|H772B4C23AAD0 +772B4C23AAD0:lA7:on_load|H772B4C23AB70 +772B4C23AB70:lAD:file_server_2|H772B4C23AC70 +772B4C23AC70:lAE:standard_error|H772B4C23AAA8 +772B4C23AAA8:lAB:code_server|N +772B4C23A4A8:t2:AA:$ancestors,H772B4C23A978 +772B4C23A978:lP<0.47.0>|N +772B4C23A4C0:t2:AD:$initial_call,H772B4C23A988 +772B4C23A988:t3:AA:supervisor,A6:kernel,I1 +=proc_stack:<0.50.0> +0x0000772b4c2b1b48:SReturn addr 0x50CAF39C (code_server:handle_loader/4 + 684) +y0:H772B4C2A8CA0 +y1:A6:string +y2:P<0.73.0> +y3:H772B4C2AA3C0 +0x0000772b4c2b1b70:SReturn addr 0x50CAEE14 (code_server:run_loader/4 + 100) +y0:N +y1:A6:string +y2:P<0.73.0> +0x0000772b4c2b1b90:SReturn addr 0x50CA5C4C (code_server:handle_call/3 + 820) +0x0000772b4c2b1b98:SReturn addr 0x50CA4D3C (code_server:loop/1 + 692) +y0:P<0.73.0> +y1:P<0.49.0> +y2:N +0x0000772b4c2b1bb8:SReturn addr 0x50C011F8 () +=proc_heap:<0.50.0> +772B4C2A8CA0:t9:A5:state,P<0.49.0>,H772B4C273818,H772B4C27D5A0,H772B4C288118,H772B4C273800,H772B4C27D578,H772B4C291408,H772B4C2A8C80 +772B4C2A8C80:Mf1:H772B4C2A8C70:N +772B4C2A8C70:t1:A6:string +772B4C291408:Mf0:H772B58410188: +772B4C27D578:E23:g1oAA3cNbm9ub2RlQG5vaG9zdAAAAAAAA5ZIQkIAAumgILU= +772B4C273800:E23:g1oAA3cNbm9ub2RlQG5vaG9zdAAAAAAAA5ZHQkIAAumgILU= +772B4C288118:Mf2:H772B4C288140:H772B4C288158,H772B4C2881E8 +772B4C288140:t2:I-576460752303423486,I-576460752303423454 +772B4C2881E8:Mh5F:10:H772B4C288598,H772B4C2885B8,H772B4C2885E8,H772B4C288600,H772B4C288618,H772B4C288650,H772B4C288690,H772B4C2886D0,H772B4C2886E8,H772B4C2886F8,H772B4C288738,H772B4C288780,H772B4C2887C0,H772B4C288808,H772B4C288828,H772B4C288848 +772B4C288598:Mn3:H772B4C288E48,H772B4C288E58,H772B4C288E68 +772B4C288E48:lH772B4C2897A0|N +772B4C2897A0:lI112|H772B4C28A070 +772B4C28A070:lI111|H772B4C28A948 +772B4C28A948:lI111|H772B4C28B228 +772B4C28B228:lI108|H772B4C28BB08 +772B4C28BB08:lI46|H772B4C28C3E8 +772B4C28C3E8:lI98|H772B4C28CCC8 +772B4C28CCC8:lI101|H772B4C28D588 +772B4C28D588:lI97|H772B4C28DE08 +772B4C28DE08:lI109|N +772B4C288E68:lH772B4C2897C0|N +772B4C2897C0:lI101|H772B4C28A090 +772B4C28A090:lI114|H772B4C28A968 +772B4C28A968:lI108|H772B4C28B248 +772B4C28B248:lI95|H772B4C28BB28 +772B4C28BB28:lI97|H772B4C28C408 +772B4C28C408:lI98|H772B4C28CCE8 +772B4C28CCE8:lI115|H772B4C28D5A8 +772B4C28D5A8:lI116|H772B4C28DE28 +772B4C28DE28:lI114|H772B4C28E648 +772B4C28E648:lI97|H772B4C28EDD8 +772B4C28EDD8:lI99|H772B4C28F4C8 +772B4C28F4C8:lI116|H772B4C28FB18 +772B4C28FB18:lI95|H772B4C290068 +772B4C290068:lI99|H772B4C2904F8 +772B4C2904F8:lI111|H772B4C290878 +772B4C290878:lI100|H772B4C290B68 +772B4C290B68:lI101|H772B4C290DC8 +772B4C290DC8:lI46|H772B4C290F88 +772B4C290F88:lI98|H772B4C2910C8 +772B4C2910C8:lI101|H772B4C291198 +772B4C291198:lI97|H772B4C291248 +772B4C291248:lI109|N +772B4C288E58:lH772B4C2897B0|N +772B4C2897B0:lI100|H772B4C28A080 +772B4C28A080:lI101|H772B4C28A958 +772B4C28A958:lI116|H772B4C28B238 +772B4C28B238:lI115|H772B4C28BB18 +772B4C28BB18:lI95|H772B4C28C3F8 +772B4C28C3F8:lI118|H772B4C28CCD8 +772B4C28CCD8:lI57|H772B4C28D598 +772B4C28D598:lI46|H772B4C28DE18 +772B4C28DE18:lI98|H772B4C28E638 +772B4C28E638:lI101|H772B4C28EDC8 +772B4C28EDC8:lI97|H772B4C28F4B8 +772B4C28F4B8:lI109|N +772B4C288848:Mn5:H772B4C289330,H772B4C289350,H772B4C289360,H772B4C289370,H772B4C289388 +772B4C289330:Mn3:H772B4C289D00,H772B4C289D10,H772B4C289D20 +772B4C289D00:lH772B4C28A5D8|N +772B4C28A5D8:lI101|H772B4C28AEB8 +772B4C28AEB8:lI114|H772B4C28B798 +772B4C28B798:lI108|H772B4C28C078 +772B4C28C078:lI95|H772B4C28C958 +772B4C28C958:lI115|H772B4C28D238 +772B4C28D238:lI116|H772B4C28DAC8 +772B4C28DAC8:lI100|H772B4C28E308 +772B4C28E308:lI108|H772B4C28EAB8 +772B4C28EAB8:lI105|H772B4C28F1D8 +772B4C28F1D8:lI98|H772B4C28F868 +772B4C28F868:lI95|H772B4C28FE08 +772B4C28FE08:lI101|H772B4C2902D8 +772B4C2902D8:lI114|H772B4C2906B8 +772B4C2906B8:lI114|H772B4C2909E8 +772B4C2909E8:lI111|H772B4C290C98 +772B4C290C98:lI114|H772B4C290EA8 +772B4C290EA8:lI115|H772B4C291048 +772B4C291048:lI46|H772B4C291138 +772B4C291138:lI98|H772B4C291208 +772B4C291208:lI101|H772B4C2912B8 +772B4C2912B8:lI97|H772B4C291348 +772B4C291348:lI109|N +772B4C289D20:lH772B4C28A5F8|N +772B4C28A5F8:lI100|H772B4C28AED8 +772B4C28AED8:lI101|H772B4C28B7B8 +772B4C28B7B8:lI116|H772B4C28C098 +772B4C28C098:lI115|H772B4C28C978 +772B4C28C978:lI46|H772B4C28D258 +772B4C28D258:lI98|H772B4C28DAE8 +772B4C28DAE8:lI101|H772B4C28E328 +772B4C28E328:lI97|H772B4C28EAD8 +772B4C28EAD8:lI109|N +772B4C289D10:lH772B4C28A5E8|N +772B4C28A5E8:lI111|H772B4C28AEC8 +772B4C28AEC8:lI116|H772B4C28B7A8 +772B4C28B7A8:lI112|H772B4C28C088 +772B4C28C088:lI95|H772B4C28C968 +772B4C28C968:lI105|H772B4C28D248 +772B4C28D248:lI110|H772B4C28DAD8 +772B4C28DAD8:lI116|H772B4C28E318 +772B4C28E318:lI101|H772B4C28EAC8 +772B4C28EAC8:lI114|H772B4C28F1E8 +772B4C28F1E8:lI110|H772B4C28F878 +772B4C28F878:lI97|H772B4C28FE18 +772B4C28FE18:lI108|H772B4C2902E8 +772B4C2902E8:lI46|H772B4C2906C8 +772B4C2906C8:lI98|H772B4C2909F8 +772B4C2909F8:lI101|H772B4C290CA8 +772B4C290CA8:lI97|H772B4C290EB8 +772B4C290EB8:lI109|N +772B4C289388:lH772B4C289D70|N +772B4C289D70:lI99|H772B4C28A648 +772B4C28A648:lI97|H772B4C28AF28 +772B4C28AF28:lI108|H772B4C28B808 +772B4C28B808:lI101|H772B4C28C0E8 +772B4C28C0E8:lI110|H772B4C28C9C8 +772B4C28C9C8:lI100|H772B4C28D298 +772B4C28D298:lI97|H772B4C28DB28 +772B4C28DB28:lI114|H772B4C28E368 +772B4C28E368:lI46|H772B4C28EB18 +772B4C28EB18:lI98|H772B4C28F228 +772B4C28F228:lI101|H772B4C28F8B8 +772B4C28F8B8:lI97|H772B4C28FE58 +772B4C28FE58:lI109|N +772B4C289370:Mn2:H772B4C289D50,H772B4C289D60 +772B4C289D50:lH772B4C28A628|N +772B4C28A628:lI101|H772B4C28AF08 +772B4C28AF08:lI114|H772B4C28B7E8 +772B4C28B7E8:lI108|H772B4C28C0C8 +772B4C28C0C8:lI95|H772B4C28C9A8 +772B4C28C9A8:lI99|H772B4C28D278 +772B4C28D278:lI111|H772B4C28DB08 +772B4C28DB08:lI109|H772B4C28E348 +772B4C28E348:lI112|H772B4C28EAF8 +772B4C28EAF8:lI105|H772B4C28F208 +772B4C28F208:lI108|H772B4C28F898 +772B4C28F898:lI101|H772B4C28FE38 +772B4C28FE38:lI46|H772B4C290308 +772B4C290308:lI98|H772B4C2906D8 +772B4C2906D8:lI101|H772B4C290A08 +772B4C290A08:lI97|H772B4C290CB8 +772B4C290CB8:lI109|N +772B4C289D60:lH772B4C28A638|N +772B4C28A638:lI97|H772B4C28AF18 +772B4C28AF18:lI114|H772B4C28B7F8 +772B4C28B7F8:lI103|H772B4C28C0D8 +772B4C28C0D8:lI112|H772B4C28C9B8 +772B4C28C9B8:lI97|H772B4C28D288 +772B4C28D288:lI114|H772B4C28DB18 +772B4C28DB18:lI115|H772B4C28E358 +772B4C28E358:lI101|H772B4C28EB08 +772B4C28EB08:lI46|H772B4C28F218 +772B4C28F218:lI98|H772B4C28F8A8 +772B4C28F8A8:lI101|H772B4C28FE48 +772B4C28FE48:lI97|H772B4C290318 +772B4C290318:lI109|N +772B4C289360:lH772B4C289D40|N +772B4C289D40:lI99|H772B4C28A618 +772B4C28A618:lI46|H772B4C28AEF8 +772B4C28AEF8:lI98|H772B4C28B7D8 +772B4C28B7D8:lI101|H772B4C28C0B8 +772B4C28C0B8:lI97|H772B4C28C998 +772B4C28C998:lI109|N +772B4C289350:lH772B4C289D30|N +772B4C289D30:lI101|H772B4C28A608 +772B4C28A608:lI100|H772B4C28AEE8 +772B4C28AEE8:lI108|H772B4C28B7C8 +772B4C28B7C8:lI105|H772B4C28C0A8 +772B4C28C0A8:lI110|H772B4C28C988 +772B4C28C988:lI95|H772B4C28D268 +772B4C28D268:lI107|H772B4C28DAF8 +772B4C28DAF8:lI101|H772B4C28E338 +772B4C28E338:lI121|H772B4C28EAE8 +772B4C28EAE8:lI46|H772B4C28F1F8 +772B4C28F1F8:lI98|H772B4C28F888 +772B4C28F888:lI101|H772B4C28FE28 +772B4C28FE28:lI97|H772B4C2902F8 +772B4C2902F8:lI109|N +772B4C288828:Mn3:H772B4C289300,H772B4C289310,H772B4C289320 +772B4C289300:lH772B4C289CD0|N +772B4C289CD0:lI101|H772B4C28A5A8 +772B4C28A5A8:lI118|H772B4C28AE88 +772B4C28AE88:lI97|H772B4C28B768 +772B4C28B768:lI108|H772B4C28C048 +772B4C28C048:lI95|H772B4C28C928 +772B4C28C928:lI98|H772B4C28D208 +772B4C28D208:lI105|H772B4C28DA98 +772B4C28DA98:lI116|H772B4C28E2D8 +772B4C28E2D8:lI115|H772B4C28EA88 +772B4C28EA88:lI46|H772B4C28F1A8 +772B4C28F1A8:lI98|H772B4C28F848 +772B4C28F848:lI101|H772B4C28FDE8 +772B4C28FDE8:lI97|H772B4C2902B8 +772B4C2902B8:lI109|N +772B4C289320:lH772B4C289CF0|N +772B4C289CF0:lI105|H772B4C28A5C8 +772B4C28A5C8:lI111|H772B4C28AEA8 +772B4C28AEA8:lI95|H772B4C28B788 +772B4C28B788:lI108|H772B4C28C068 +772B4C28C068:lI105|H772B4C28C948 +772B4C28C948:lI98|H772B4C28D228 +772B4C28D228:lI46|H772B4C28DAB8 +772B4C28DAB8:lI98|H772B4C28E2F8 +772B4C28E2F8:lI101|H772B4C28EAA8 +772B4C28EAA8:lI97|H772B4C28F1C8 +772B4C28F1C8:lI109|N +772B4C289310:lH772B4C289CE0|N +772B4C289CE0:lI100|H772B4C28A5B8 +772B4C28A5B8:lI101|H772B4C28AE98 +772B4C28AE98:lI116|H772B4C28B778 +772B4C28B778:lI115|H772B4C28C058 +772B4C28C058:lI95|H772B4C28C938 +772B4C28C938:lI115|H772B4C28D218 +772B4C28D218:lI101|H772B4C28DAA8 +772B4C28DAA8:lI114|H772B4C28E2E8 +772B4C28E2E8:lI118|H772B4C28EA98 +772B4C28EA98:lI101|H772B4C28F1B8 +772B4C28F1B8:lI114|H772B4C28F858 +772B4C28F858:lI46|H772B4C28FDF8 +772B4C28FDF8:lI98|H772B4C2902C8 +772B4C2902C8:lI101|H772B4C2906A8 +772B4C2906A8:lI97|H772B4C2909D8 +772B4C2909D8:lI109|N +772B4C288808:Mn3:H772B4C2892C8,H772B4C2892E0,H772B4C2892F0 +772B4C2892C8:Mn2:H772B4C289C90,H772B4C289CA0 +772B4C289C90:lH772B4C28A560|N +772B4C28A560:lI115|H772B4C28AE38 +772B4C28AE38:lI117|H772B4C28B718 +772B4C28B718:lI112|H772B4C28BFF8 +772B4C28BFF8:lI101|H772B4C28C8D8 +772B4C28C8D8:lI114|H772B4C28D1B8 +772B4C28D1B8:lI118|H772B4C28DA48 +772B4C28DA48:lI105|H772B4C28E288 +772B4C28E288:lI115|H772B4C28EA38 +772B4C28EA38:lI111|H772B4C28F158 +772B4C28F158:lI114|H772B4C28F808 +772B4C28F808:lI46|H772B4C28FDB8 +772B4C28FDB8:lI98|H772B4C290288 +772B4C290288:lI101|H772B4C290678 +772B4C290678:lI97|H772B4C2909A8 +772B4C2909A8:lI109|N +772B4C289CA0:Mn1:H772B4C28A570 +772B4C28A570:Mn2:H772B4C28AE48,H772B4C28AE58 +772B4C28AE48:lH772B4C28B728|N +772B4C28B728:lI115|H772B4C28C008 +772B4C28C008:lI111|H772B4C28C8E8 +772B4C28C8E8:lI102|H772B4C28D1C8 +772B4C28D1C8:lI115|H772B4C28DA58 +772B4C28DA58:lI46|H772B4C28E298 +772B4C28E298:lI98|H772B4C28EA48 +772B4C28EA48:lI101|H772B4C28F168 +772B4C28F168:lI97|H772B4C28F818 +772B4C28F818:lI109|N +772B4C28AE58:lH772B4C28B738|N +772B4C28B738:lI103|H772B4C28C018 +772B4C28C018:lI98|H772B4C28C8F8 +772B4C28C8F8:lI95|H772B4C28D1D8 +772B4C28D1D8:lI116|H772B4C28DA68 +772B4C28DA68:lI114|H772B4C28E2A8 +772B4C28E2A8:lI101|H772B4C28EA58 +772B4C28EA58:lI101|H772B4C28F178 +772B4C28F178:lI115|H772B4C28F828 +772B4C28F828:lI46|H772B4C28FDC8 +772B4C28FDC8:lI98|H772B4C290298 +772B4C290298:lI101|H772B4C290688 +772B4C290688:lI97|H772B4C2909B8 +772B4C2909B8:lI109|N +772B4C2892F0:lH772B4C289CC0|N +772B4C289CC0:lI101|H772B4C28A598 +772B4C28A598:lI114|H772B4C28AE78 +772B4C28AE78:lI108|H772B4C28B758 +772B4C28B758:lI95|H772B4C28C038 +772B4C28C038:lI112|H772B4C28C918 +772B4C28C918:lI111|H772B4C28D1F8 +772B4C28D1F8:lI115|H772B4C28DA88 +772B4C28DA88:lI105|H772B4C28E2C8 +772B4C28E2C8:lI120|H772B4C28EA78 +772B4C28EA78:lI95|H772B4C28F198 +772B4C28F198:lI109|H772B4C28F838 +772B4C28F838:lI115|H772B4C28FDD8 +772B4C28FDD8:lI103|H772B4C2902A8 +772B4C2902A8:lI46|H772B4C290698 +772B4C290698:lI98|H772B4C2909C8 +772B4C2909C8:lI101|H772B4C290C88 +772B4C290C88:lI97|H772B4C290E98 +772B4C290E98:lI109|N +772B4C2892E0:lH772B4C289CB0|N +772B4C289CB0:lI113|H772B4C28A588 +772B4C28A588:lI108|H772B4C28AE68 +772B4C28AE68:lI99|H772B4C28B748 +772B4C28B748:lI95|H772B4C28C028 +772B4C28C028:lI112|H772B4C28C908 +772B4C28C908:lI116|H772B4C28D1E8 +772B4C28D1E8:lI46|H772B4C28DA78 +772B4C28DA78:lI98|H772B4C28E2B8 +772B4C28E2B8:lI101|H772B4C28EA68 +772B4C28EA68:lI97|H772B4C28F188 +772B4C28F188:lI109|N +772B4C2887C0:Mn8:H772B4C289220,H772B4C289248,H772B4C289258,H772B4C289268,H772B4C289280,H772B4C289290,H772B4C2892A0,H772B4C2892B8 +772B4C289220:Mn4:H772B4C289BC0,H772B4C289BD0,H772B4C289BE0,H772B4C289BF0 +772B4C289BC0:lH772B4C28A490|N +772B4C28A490:lI115|H772B4C28AD68 +772B4C28AD68:lI104|H772B4C28B648 +772B4C28B648:lI101|H772B4C28BF28 +772B4C28BF28:lI108|H772B4C28C808 +772B4C28C808:lI108|H772B4C28D0E8 +772B4C28D0E8:lI95|H772B4C28D978 +772B4C28D978:lI100|H772B4C28E1C8 +772B4C28E1C8:lI111|H772B4C28E988 +772B4C28E988:lI99|H772B4C28F0A8 +772B4C28F0A8:lI115|H772B4C28F768 +772B4C28F768:lI95|H772B4C28FD38 +772B4C28FD38:lI109|H772B4C290218 +772B4C290218:lI97|H772B4C290628 +772B4C290628:lI114|H772B4C290958 +772B4C290958:lI107|H772B4C290C38 +772B4C290C38:lI100|H772B4C290E68 +772B4C290E68:lI111|H772B4C291018 +772B4C291018:lI119|H772B4C291118 +772B4C291118:lI110|H772B4C2911E8 +772B4C2911E8:lI46|H772B4C291298 +772B4C291298:lI98|H772B4C291328 +772B4C291328:lI101|H772B4C291398 +772B4C291398:lI97|H772B4C2913D8 +772B4C2913D8:lI109|N +772B4C289BF0:lH772B4C28A4C0|N +772B4C28A4C0:lI115|H772B4C28AD98 +772B4C28AD98:lI104|H772B4C28B678 +772B4C28B678:lI101|H772B4C28BF58 +772B4C28BF58:lI108|H772B4C28C838 +772B4C28C838:lI108|H772B4C28D118 +772B4C28D118:lI95|H772B4C28D9A8 +772B4C28D9A8:lI100|H772B4C28E1F8 +772B4C28E1F8:lI101|H772B4C28E9B8 +772B4C28E9B8:lI102|H772B4C28F0D8 +772B4C28F0D8:lI97|H772B4C28F798 +772B4C28F798:lI117|H772B4C28FD68 +772B4C28FD68:lI108|H772B4C290248 +772B4C290248:lI116|H772B4C290648 +772B4C290648:lI46|H772B4C290978 +772B4C290978:lI98|H772B4C290C58 +772B4C290C58:lI101|H772B4C290E88 +772B4C290E88:lI97|H772B4C291038 +772B4C291038:lI109|N +772B4C289BE0:lH772B4C28A4B0|N +772B4C28A4B0:lI101|H772B4C28AD88 +772B4C28AD88:lI114|H772B4C28B668 +772B4C28B668:lI114|H772B4C28BF48 +772B4C28BF48:lI111|H772B4C28C828 +772B4C28C828:lI114|H772B4C28D108 +772B4C28D108:lI95|H772B4C28D998 +772B4C28D998:lI108|H772B4C28E1E8 +772B4C28E1E8:lI111|H772B4C28E9A8 +772B4C28E9A8:lI103|H772B4C28F0C8 +772B4C28F0C8:lI103|H772B4C28F788 +772B4C28F788:lI101|H772B4C28FD58 +772B4C28FD58:lI114|H772B4C290238 +772B4C290238:lI95|H772B4C290638 +772B4C290638:lI102|H772B4C290968 +772B4C290968:lI105|H772B4C290C48 +772B4C290C48:lI108|H772B4C290E78 +772B4C290E78:lI101|H772B4C291028 +772B4C291028:lI95|H772B4C291128 +772B4C291128:lI104|H772B4C2911F8 +772B4C2911F8:lI46|H772B4C2912A8 +772B4C2912A8:lI98|H772B4C291338 +772B4C291338:lI101|H772B4C2913A8 +772B4C2913A8:lI97|H772B4C2913E8 +772B4C2913E8:lI109|N +772B4C289BD0:lH772B4C28A4A0|N +772B4C28A4A0:lI101|H772B4C28AD78 +772B4C28AD78:lI114|H772B4C28B658 +772B4C28B658:lI108|H772B4C28BF38 +772B4C28BF38:lI95|H772B4C28C818 +772B4C28C818:lI97|H772B4C28D0F8 +772B4C28D0F8:lI110|H772B4C28D988 +772B4C28D988:lI110|H772B4C28E1D8 +772B4C28E1D8:lI111|H772B4C28E998 +772B4C28E998:lI46|H772B4C28F0B8 +772B4C28F0B8:lI98|H772B4C28F778 +772B4C28F778:lI101|H772B4C28FD48 +772B4C28FD48:lI97|H772B4C290228 +772B4C290228:lI109|N +772B4C2892B8:lH772B4C289C80|N +772B4C289C80:lI122|H772B4C28A550 +772B4C28A550:lI105|H772B4C28AE28 +772B4C28AE28:lI112|H772B4C28B708 +772B4C28B708:lI46|H772B4C28BFE8 +772B4C28BFE8:lI98|H772B4C28C8C8 +772B4C28C8C8:lI101|H772B4C28D1A8 +772B4C28D1A8:lI97|H772B4C28DA38 +772B4C28DA38:lI109|N +772B4C2892A0:Mn2:H772B4C289C60,H772B4C289C70 +772B4C289C60:lH772B4C28A530|N +772B4C28A530:lI98|H772B4C28AE08 +772B4C28AE08:lI97|H772B4C28B6E8 +772B4C28B6E8:lI115|H772B4C28BFC8 +772B4C28BFC8:lI101|H772B4C28C8A8 +772B4C28C8A8:lI54|H772B4C28D188 +772B4C28D188:lI52|H772B4C28DA18 +772B4C28DA18:lI46|H772B4C28E268 +772B4C28E268:lI98|H772B4C28EA18 +772B4C28EA18:lI101|H772B4C28F138 +772B4C28F138:lI97|H772B4C28F7E8 +772B4C28F7E8:lI109|N +772B4C289C70:lH772B4C28A540|N +772B4C28A540:lI102|H772B4C28AE18 +772B4C28AE18:lI105|H772B4C28B6F8 +772B4C28B6F8:lI108|H772B4C28BFD8 +772B4C28BFD8:lI101|H772B4C28C8B8 +772B4C28C8B8:lI108|H772B4C28D198 +772B4C28D198:lI105|H772B4C28DA28 +772B4C28DA28:lI98|H772B4C28E278 +772B4C28E278:lI46|H772B4C28EA28 +772B4C28EA28:lI98|H772B4C28F148 +772B4C28F148:lI101|H772B4C28F7F8 +772B4C28F7F8:lI97|H772B4C28FDA8 +772B4C28FDA8:lI109|N +772B4C289290:lH772B4C289C50|N +772B4C289C50:lI117|H772B4C28A520 +772B4C28A520:lI110|H772B4C28ADF8 +772B4C28ADF8:lI105|H772B4C28B6D8 +772B4C28B6D8:lI99|H772B4C28BFB8 +772B4C28BFB8:lI111|H772B4C28C898 +772B4C28C898:lI100|H772B4C28D178 +772B4C28D178:lI101|H772B4C28DA08 +772B4C28DA08:lI95|H772B4C28E258 +772B4C28E258:lI117|H772B4C28EA08 +772B4C28EA08:lI116|H772B4C28F128 +772B4C28F128:lI105|H772B4C28F7D8 +772B4C28F7D8:lI108|H772B4C28FD98 +772B4C28FD98:lI46|H772B4C290278 +772B4C290278:lI98|H772B4C290668 +772B4C290668:lI101|H772B4C290998 +772B4C290998:lI97|H772B4C290C78 +772B4C290C78:lI109|N +772B4C289280:lH772B4C289C40|N +772B4C289C40:lI101|H772B4C28A510 +772B4C28A510:lI100|H772B4C28ADE8 +772B4C28ADE8:lI108|H772B4C28B6C8 +772B4C28B6C8:lI105|H772B4C28BFA8 +772B4C28BFA8:lI110|H772B4C28C888 +772B4C28C888:lI95|H772B4C28D168 +772B4C28D168:lI101|H772B4C28D9F8 +772B4C28D9F8:lI120|H772B4C28E248 +772B4C28E248:lI112|H772B4C28E9F8 +772B4C28E9F8:lI97|H772B4C28F118 +772B4C28F118:lI110|H772B4C28F7C8 +772B4C28F7C8:lI100|H772B4C28FD88 +772B4C28FD88:lI46|H772B4C290268 +772B4C290268:lI98|H772B4C290658 +772B4C290658:lI101|H772B4C290988 +772B4C290988:lI97|H772B4C290C68 +772B4C290C68:lI109|N +772B4C289268:Mn2:H772B4C289C20,H772B4C289C30 +772B4C289C20:lH772B4C28A4F0|N +772B4C28A4F0:lI115|H772B4C28ADC8 +772B4C28ADC8:lI108|H772B4C28B6A8 +772B4C28B6A8:lI97|H772B4C28BF88 +772B4C28BF88:lI118|H772B4C28C868 +772B4C28C868:lI101|H772B4C28D148 +772B4C28D148:lI46|H772B4C28D9D8 +772B4C28D9D8:lI98|H772B4C28E228 +772B4C28E228:lI101|H772B4C28E9D8 +772B4C28E9D8:lI97|H772B4C28F0F8 +772B4C28F0F8:lI109|N +772B4C289C30:lH772B4C28A500|N +772B4C28A500:lI108|H772B4C28ADD8 +772B4C28ADD8:lI111|H772B4C28B6B8 +772B4C28B6B8:lI103|H772B4C28BF98 +772B4C28BF98:lI95|H772B4C28C878 +772B4C28C878:lI109|H772B4C28D158 +772B4C28D158:lI102|H772B4C28D9E8 +772B4C28D9E8:lI95|H772B4C28E238 +772B4C28E238:lI104|H772B4C28E9E8 +772B4C28E9E8:lI46|H772B4C28F108 +772B4C28F108:lI98|H772B4C28F7B8 +772B4C28F7B8:lI101|H772B4C28FD78 +772B4C28FD78:lI97|H772B4C290258 +772B4C290258:lI109|N +772B4C289258:lH772B4C289C10|N +772B4C289C10:lI115|H772B4C28A4E0 +772B4C28A4E0:lI116|H772B4C28ADB8 +772B4C28ADB8:lI100|H772B4C28B698 +772B4C28B698:lI108|H772B4C28BF78 +772B4C28BF78:lI105|H772B4C28C858 +772B4C28C858:lI98|H772B4C28D138 +772B4C28D138:lI46|H772B4C28D9C8 +772B4C28D9C8:lI97|H772B4C28E218 +772B4C28E218:lI112|H772B4C28E9C8 +772B4C28E9C8:lI112|H772B4C28F0E8 +772B4C28F0E8:lI117|H772B4C28F7A8 +772B4C28F7A8:lI112|N +772B4C289248:lH772B4C289C00|N +772B4C289C00:lI100|H772B4C28A4D0 +772B4C28A4D0:lI105|H772B4C28ADA8 +772B4C28ADA8:lI99|H772B4C28B688 +772B4C28B688:lI116|H772B4C28BF68 +772B4C28BF68:lI46|H772B4C28C848 +772B4C28C848:lI98|H772B4C28D128 +772B4C28D128:lI101|H772B4C28D9B8 +772B4C28D9B8:lI97|H772B4C28E208 +772B4C28E208:lI109|N +772B4C288780:Mn7:H772B4C2891A8,H772B4C2891B8,H772B4C2891C8,H772B4C2891D8,H772B4C2891F0,H772B4C289200,H772B4C289210 +772B4C2891A8:lH772B4C289B40|N +772B4C289B40:lI115|H772B4C28A410 +772B4C28A410:lI104|H772B4C28ACE8 +772B4C28ACE8:lI101|H772B4C28B5C8 +772B4C28B5C8:lI108|H772B4C28BEA8 +772B4C28BEA8:lI108|H772B4C28C788 +772B4C28C788:lI95|H772B4C28D068 +772B4C28D068:lI100|H772B4C28D8F8 +772B4C28D8F8:lI111|H772B4C28E148 +772B4C28E148:lI99|H772B4C28E908 +772B4C28E908:lI115|H772B4C28F028 +772B4C28F028:lI46|H772B4C28F6E8 +772B4C28F6E8:lI98|H772B4C28FCB8 +772B4C28FCB8:lI101|H772B4C2901B8 +772B4C2901B8:lI97|H772B4C2905E8 +772B4C2905E8:lI109|N +772B4C289210:lH772B4C289BB0|N +772B4C289BB0:lI101|H772B4C28A480 +772B4C28A480:lI114|H772B4C28AD58 +772B4C28AD58:lI108|H772B4C28B638 +772B4C28B638:lI95|H772B4C28BF18 +772B4C28BF18:lI112|H772B4C28C7F8 +772B4C28C7F8:lI97|H772B4C28D0D8 +772B4C28D0D8:lI114|H772B4C28D968 +772B4C28D968:lI115|H772B4C28E1B8 +772B4C28E1B8:lI101|H772B4C28E978 +772B4C28E978:lI46|H772B4C28F098 +772B4C28F098:lI98|H772B4C28F758 +772B4C28F758:lI101|H772B4C28FD28 +772B4C28FD28:lI97|H772B4C290208 +772B4C290208:lI109|N +772B4C289200:lH772B4C289BA0|N +772B4C289BA0:lI112|H772B4C28A470 +772B4C28A470:lI114|H772B4C28AD48 +772B4C28AD48:lI111|H772B4C28B628 +772B4C28B628:lI99|H772B4C28BF08 +772B4C28BF08:lI95|H772B4C28C7E8 +772B4C28C7E8:lI108|H772B4C28D0C8 +772B4C28D0C8:lI105|H772B4C28D958 +772B4C28D958:lI98|H772B4C28E1A8 +772B4C28E1A8:lI46|H772B4C28E968 +772B4C28E968:lI98|H772B4C28F088 +772B4C28F088:lI101|H772B4C28F748 +772B4C28F748:lI97|H772B4C28FD18 +772B4C28FD18:lI109|N +772B4C2891F0:lH772B4C289B90|N +772B4C289B90:lI117|H772B4C28A460 +772B4C28A460:lI114|H772B4C28AD38 +772B4C28AD38:lI105|H772B4C28B618 +772B4C28B618:lI95|H772B4C28BEF8 +772B4C28BEF8:lI115|H772B4C28C7D8 +772B4C28C7D8:lI116|H772B4C28D0B8 +772B4C28D0B8:lI114|H772B4C28D948 +772B4C28D948:lI105|H772B4C28E198 +772B4C28E198:lI110|H772B4C28E958 +772B4C28E958:lI103|H772B4C28F078 +772B4C28F078:lI46|H772B4C28F738 +772B4C28F738:lI98|H772B4C28FD08 +772B4C28FD08:lI101|H772B4C2901F8 +772B4C2901F8:lI97|H772B4C290618 +772B4C290618:lI109|N +772B4C2891D8:Mn2:H772B4C289B70,H772B4C289B80 +772B4C289B70:lH772B4C28A440|N +772B4C28A440:lI101|H772B4C28AD18 +772B4C28AD18:lI114|H772B4C28B5F8 +772B4C28B5F8:lI108|H772B4C28BED8 +772B4C28BED8:lI95|H772B4C28C7B8 +772B4C28C7B8:lI101|H772B4C28D098 +772B4C28D098:lI118|H772B4C28D928 +772B4C28D928:lI97|H772B4C28E178 +772B4C28E178:lI108|H772B4C28E938 +772B4C28E938:lI46|H772B4C28F058 +772B4C28F058:lI98|H772B4C28F718 +772B4C28F718:lI101|H772B4C28FCE8 +772B4C28FCE8:lI97|H772B4C2901D8 +772B4C2901D8:lI109|N +772B4C289B80:lH772B4C28A450|N +772B4C28A450:lI105|H772B4C28AD28 +772B4C28AD28:lI111|H772B4C28B608 +772B4C28B608:lI95|H772B4C28BEE8 +772B4C28BEE8:lI108|H772B4C28C7C8 +772B4C28C7C8:lI105|H772B4C28D0A8 +772B4C28D0A8:lI98|H772B4C28D938 +772B4C28D938:lI95|H772B4C28E188 +772B4C28E188:lI112|H772B4C28E948 +772B4C28E948:lI114|H772B4C28F068 +772B4C28F068:lI101|H772B4C28F728 +772B4C28F728:lI116|H772B4C28FCF8 +772B4C28FCF8:lI116|H772B4C2901E8 +772B4C2901E8:lI121|H772B4C290608 +772B4C290608:lI46|H772B4C290948 +772B4C290948:lI98|H772B4C290C28 +772B4C290C28:lI101|H772B4C290E58 +772B4C290E58:lI97|H772B4C291008 +772B4C291008:lI109|N +772B4C2891C8:lH772B4C289B60|N +772B4C289B60:lI101|H772B4C28A430 +772B4C28A430:lI114|H772B4C28AD08 +772B4C28AD08:lI114|H772B4C28B5E8 +772B4C28B5E8:lI111|H772B4C28BEC8 +772B4C28BEC8:lI114|H772B4C28C7A8 +772B4C28C7A8:lI95|H772B4C28D088 +772B4C28D088:lI108|H772B4C28D918 +772B4C28D918:lI111|H772B4C28E168 +772B4C28E168:lI103|H772B4C28E928 +772B4C28E928:lI103|H772B4C28F048 +772B4C28F048:lI101|H772B4C28F708 +772B4C28F708:lI114|H772B4C28FCD8 +772B4C28FCD8:lI95|H772B4C2901C8 +772B4C2901C8:lI116|H772B4C2905F8 +772B4C2905F8:lI116|H772B4C290938 +772B4C290938:lI121|H772B4C290C18 +772B4C290C18:lI95|H772B4C290E48 +772B4C290E48:lI104|H772B4C290FF8 +772B4C290FF8:lI46|H772B4C291108 +772B4C291108:lI98|H772B4C2911D8 +772B4C2911D8:lI101|H772B4C291288 +772B4C291288:lI97|H772B4C291318 +772B4C291318:lI109|N +772B4C2891B8:lH772B4C289B50|N +772B4C289B50:lI119|H772B4C28A420 +772B4C28A420:lI105|H772B4C28ACF8 +772B4C28ACF8:lI110|H772B4C28B5D8 +772B4C28B5D8:lI51|H772B4C28BEB8 +772B4C28BEB8:lI50|H772B4C28C798 +772B4C28C798:lI114|H772B4C28D078 +772B4C28D078:lI101|H772B4C28D908 +772B4C28D908:lI103|H772B4C28E158 +772B4C28E158:lI46|H772B4C28E918 +772B4C28E918:lI98|H772B4C28F038 +772B4C28F038:lI101|H772B4C28F6F8 +772B4C28F6F8:lI97|H772B4C28FCC8 +772B4C28FCC8:lI109|N +772B4C288738:Mn8:H772B4C289110,H772B4C289120,H772B4C289130,H772B4C289148,H772B4C289160,H772B4C289170,H772B4C289180,H772B4C289198 +772B4C289110:lH772B4C289A90|N +772B4C289A90:lI97|H772B4C28A360 +772B4C28A360:lI114|H772B4C28AC38 +772B4C28AC38:lI114|H772B4C28B518 +772B4C28B518:lI97|H772B4C28BDF8 +772B4C28BDF8:lI121|H772B4C28C6D8 +772B4C28C6D8:lI46|H772B4C28CFB8 +772B4C28CFB8:lI98|H772B4C28D848 +772B4C28D848:lI101|H772B4C28E098 +772B4C28E098:lI97|H772B4C28E878 +772B4C28E878:lI109|N +772B4C289198:lH772B4C289B30|N +772B4C289B30:lI100|H772B4C28A400 +772B4C28A400:lI105|H772B4C28ACD8 +772B4C28ACD8:lI103|H772B4C28B5B8 +772B4C28B5B8:lI114|H772B4C28BE98 +772B4C28BE98:lI97|H772B4C28C778 +772B4C28C778:lI112|H772B4C28D058 +772B4C28D058:lI104|H772B4C28D8E8 +772B4C28D8E8:lI46|H772B4C28E138 +772B4C28E138:lI98|H772B4C28E8F8 +772B4C28E8F8:lI101|H772B4C28F018 +772B4C28F018:lI97|H772B4C28F6D8 +772B4C28F6D8:lI109|N +772B4C289180:Mn2:H772B4C289B10,H772B4C289B20 +772B4C289B10:lH772B4C28A3E0|N +772B4C28A3E0:lI101|H772B4C28ACB8 +772B4C28ACB8:lI114|H772B4C28B598 +772B4C28B598:lI108|H772B4C28BE78 +772B4C28BE78:lI95|H772B4C28C758 +772B4C28C758:lI98|H772B4C28D038 +772B4C28D038:lI105|H772B4C28D8C8 +772B4C28D8C8:lI116|H772B4C28E118 +772B4C28E118:lI115|H772B4C28E8D8 +772B4C28E8D8:lI46|H772B4C28EFF8 +772B4C28EFF8:lI98|H772B4C28F6B8 +772B4C28F6B8:lI101|H772B4C28FC98 +772B4C28FC98:lI97|H772B4C290198 +772B4C290198:lI109|N +772B4C289B20:lH772B4C28A3F0|N +772B4C28A3F0:lI101|H772B4C28ACC8 +772B4C28ACC8:lI100|H772B4C28B5A8 +772B4C28B5A8:lI108|H772B4C28BE88 +772B4C28BE88:lI105|H772B4C28C768 +772B4C28C768:lI110|H772B4C28D048 +772B4C28D048:lI95|H772B4C28D8D8 +772B4C28D8D8:lI99|H772B4C28E128 +772B4C28E128:lI111|H772B4C28E8E8 +772B4C28E8E8:lI110|H772B4C28F008 +772B4C28F008:lI116|H772B4C28F6C8 +772B4C28F6C8:lI101|H772B4C28FCA8 +772B4C28FCA8:lI120|H772B4C2901A8 +772B4C2901A8:lI116|H772B4C2905D8 +772B4C2905D8:lI46|H772B4C290928 +772B4C290928:lI98|H772B4C290C08 +772B4C290C08:lI101|H772B4C290E38 +772B4C290E38:lI97|H772B4C290FE8 +772B4C290FE8:lI109|N +772B4C289170:lH772B4C289B00|N +772B4C289B00:lI112|H772B4C28A3D0 +772B4C28A3D0:lI101|H772B4C28ACA8 +772B4C28ACA8:lI101|H772B4C28B588 +772B4C28B588:lI114|H772B4C28BE68 +772B4C28BE68:lI46|H772B4C28C748 +772B4C28C748:lI98|H772B4C28D028 +772B4C28D028:lI101|H772B4C28D8B8 +772B4C28D8B8:lI97|H772B4C28E108 +772B4C28E108:lI109|N +772B4C289160:lH772B4C289AF0|N +772B4C289AF0:lI113|H772B4C28A3C0 +772B4C28A3C0:lI117|H772B4C28AC98 +772B4C28AC98:lI101|H772B4C28B578 +772B4C28B578:lI117|H772B4C28BE58 +772B4C28BE58:lI101|H772B4C28C738 +772B4C28C738:lI46|H772B4C28D018 +772B4C28D018:lI98|H772B4C28D8A8 +772B4C28D8A8:lI101|H772B4C28E0F8 +772B4C28E0F8:lI97|H772B4C28E8C8 +772B4C28E8C8:lI109|N +772B4C289148:Mn2:H772B4C289AD0,H772B4C289AE0 +772B4C289AD0:lH772B4C28A3A0|N +772B4C28A3A0:lI117|H772B4C28AC78 +772B4C28AC78:lI110|H772B4C28B558 +772B4C28B558:lI105|H772B4C28BE38 +772B4C28BE38:lI99|H772B4C28C718 +772B4C28C718:lI111|H772B4C28CFF8 +772B4C28CFF8:lI100|H772B4C28D888 +772B4C28D888:lI101|H772B4C28E0D8 +772B4C28E0D8:lI46|H772B4C28E8A8 +772B4C28E8A8:lI98|H772B4C28EFD8 +772B4C28EFD8:lI101|H772B4C28F698 +772B4C28F698:lI97|H772B4C28FC78 +772B4C28FC78:lI109|N +772B4C289AE0:lH772B4C28A3B0|N +772B4C28A3B0:lI101|H772B4C28AC88 +772B4C28AC88:lI114|H772B4C28B568 +772B4C28B568:lI108|H772B4C28BE48 +772B4C28BE48:lI95|H772B4C28C728 +772B4C28C728:lI101|H772B4C28D008 +772B4C28D008:lI120|H772B4C28D898 +772B4C28D898:lI112|H772B4C28E0E8 +772B4C28E0E8:lI97|H772B4C28E8B8 +772B4C28E8B8:lI110|H772B4C28EFE8 +772B4C28EFE8:lI100|H772B4C28F6A8 +772B4C28F6A8:lI95|H772B4C28FC88 +772B4C28FC88:lI114|H772B4C290188 +772B4C290188:lI101|H772B4C2905C8 +772B4C2905C8:lI99|H772B4C290918 +772B4C290918:lI111|H772B4C290BF8 +772B4C290BF8:lI114|H772B4C290E28 +772B4C290E28:lI100|H772B4C290FD8 +772B4C290FD8:lI115|H772B4C2910F8 +772B4C2910F8:lI46|H772B4C2911C8 +772B4C2911C8:lI98|H772B4C291278 +772B4C291278:lI101|H772B4C291308 +772B4C291308:lI97|H772B4C291388 +772B4C291388:lI109|N +772B4C289130:Mn2:H772B4C289AB0,H772B4C289AC0 +772B4C289AB0:lH772B4C28A380|N +772B4C28A380:lI115|H772B4C28AC58 +772B4C28AC58:lI116|H772B4C28B538 +772B4C28B538:lI114|H772B4C28BE18 +772B4C28BE18:lI105|H772B4C28C6F8 +772B4C28C6F8:lI110|H772B4C28CFD8 +772B4C28CFD8:lI103|H772B4C28D868 +772B4C28D868:lI46|H772B4C28E0B8 +772B4C28E0B8:lI98|H772B4C28E898 +772B4C28E898:lI101|H772B4C28EFC8 +772B4C28EFC8:lI97|H772B4C28F688 +772B4C28F688:lI109|N +772B4C289AC0:lH772B4C28A390|N +772B4C28A390:lI101|H772B4C28AC68 +772B4C28AC68:lI112|H772B4C28B548 +772B4C28B548:lI112|H772B4C28BE28 +772B4C28BE28:lI46|H772B4C28C708 +772B4C28C708:lI98|H772B4C28CFE8 +772B4C28CFE8:lI101|H772B4C28D878 +772B4C28D878:lI97|H772B4C28E0C8 +772B4C28E0C8:lI109|N +772B4C289120:lH772B4C289AA0|N +772B4C289AA0:lI98|H772B4C28A370 +772B4C28A370:lI105|H772B4C28AC48 +772B4C28AC48:lI110|H772B4C28B528 +772B4C28B528:lI97|H772B4C28BE08 +772B4C28BE08:lI114|H772B4C28C6E8 +772B4C28C6E8:lI121|H772B4C28CFC8 +772B4C28CFC8:lI46|H772B4C28D858 +772B4C28D858:lI98|H772B4C28E0A8 +772B4C28E0A8:lI101|H772B4C28E888 +772B4C28E888:lI97|H772B4C28EFB8 +772B4C28EFB8:lI109|N +772B4C2886F8:Mn7:H772B4C289098,H772B4C2890A8,H772B4C2890B8,H772B4C2890C8,H772B4C2890D8,H772B4C2890E8,H772B4C289100 +772B4C289098:lH772B4C289A10|N +772B4C289A10:lI102|H772B4C28A2E0 +772B4C28A2E0:lI105|H772B4C28ABB8 +772B4C28ABB8:lI108|H772B4C28B498 +772B4C28B498:lI101|H772B4C28BD78 +772B4C28BD78:lI95|H772B4C28C658 +772B4C28C658:lI115|H772B4C28CF38 +772B4C28CF38:lI111|H772B4C28D7C8 +772B4C28D7C8:lI114|H772B4C28E018 +772B4C28E018:lI116|H772B4C28E808 +772B4C28E808:lI101|H772B4C28EF58 +772B4C28EF58:lI114|H772B4C28F638 +772B4C28F638:lI46|H772B4C28FC28 +772B4C28FC28:lI98|H772B4C290138 +772B4C290138:lI101|H772B4C290598 +772B4C290598:lI97|H772B4C2908F8 +772B4C2908F8:lI109|N +772B4C289100:lH772B4C289A80|N +772B4C289A80:lI115|H772B4C28A350 +772B4C28A350:lI101|H772B4C28AC28 +772B4C28AC28:lI116|H772B4C28B508 +772B4C28B508:lI115|H772B4C28BDE8 +772B4C28BDE8:lI46|H772B4C28C6C8 +772B4C28C6C8:lI98|H772B4C28CFA8 +772B4C28CFA8:lI101|H772B4C28D838 +772B4C28D838:lI97|H772B4C28E088 +772B4C28E088:lI109|N +772B4C2890E8:Mn2:H772B4C289A60,H772B4C289A70 +772B4C289A60:lH772B4C28A330|N +772B4C28A330:lI115|H772B4C28AC08 +772B4C28AC08:lI116|H772B4C28B4E8 +772B4C28B4E8:lI100|H772B4C28BDC8 +772B4C28BDC8:lI108|H772B4C28C6A8 +772B4C28C6A8:lI105|H772B4C28CF88 +772B4C28CF88:lI98|H772B4C28D818 +772B4C28D818:lI46|H772B4C28E068 +772B4C28E068:lI97|H772B4C28E858 +772B4C28E858:lI112|H772B4C28EFA8 +772B4C28EFA8:lI112|N +772B4C289A70:lH772B4C28A340|N +772B4C28A340:lI109|H772B4C28AC18 +772B4C28AC18:lI97|H772B4C28B4F8 +772B4C28B4F8:lI112|H772B4C28BDD8 +772B4C28BDD8:lI115|H772B4C28C6B8 +772B4C28C6B8:lI46|H772B4C28CF98 +772B4C28CF98:lI98|H772B4C28D828 +772B4C28D828:lI101|H772B4C28E078 +772B4C28E078:lI97|H772B4C28E868 +772B4C28E868:lI109|N +772B4C2890D8:lH772B4C289A50|N +772B4C289A50:lI101|H772B4C28A320 +772B4C28A320:lI114|H772B4C28ABF8 +772B4C28ABF8:lI108|H772B4C28B4D8 +772B4C28B4D8:lI95|H772B4C28BDB8 +772B4C28BDB8:lI101|H772B4C28C698 +772B4C28C698:lI114|H772B4C28CF78 +772B4C28CF78:lI114|H772B4C28D808 +772B4C28D808:lI111|H772B4C28E058 +772B4C28E058:lI114|H772B4C28E848 +772B4C28E848:lI46|H772B4C28EF98 +772B4C28EF98:lI98|H772B4C28F678 +772B4C28F678:lI101|H772B4C28FC68 +772B4C28FC68:lI97|H772B4C290178 +772B4C290178:lI109|N +772B4C2890C8:lH772B4C289A40|N +772B4C289A40:lI103|H772B4C28A310 +772B4C28A310:lI101|H772B4C28ABE8 +772B4C28ABE8:lI110|H772B4C28B4C8 +772B4C28B4C8:lI95|H772B4C28BDA8 +772B4C28BDA8:lI101|H772B4C28C688 +772B4C28C688:lI118|H772B4C28CF68 +772B4C28CF68:lI101|H772B4C28D7F8 +772B4C28D7F8:lI110|H772B4C28E048 +772B4C28E048:lI116|H772B4C28E838 +772B4C28E838:lI46|H772B4C28EF88 +772B4C28EF88:lI98|H772B4C28F668 +772B4C28F668:lI101|H772B4C28FC58 +772B4C28FC58:lI97|H772B4C290168 +772B4C290168:lI109|N +772B4C2890B8:lH772B4C289A30|N +772B4C289A30:lI103|H772B4C28A300 +772B4C28A300:lI101|H772B4C28ABD8 +772B4C28ABD8:lI110|H772B4C28B4B8 +772B4C28B4B8:lI95|H772B4C28BD98 +772B4C28BD98:lI115|H772B4C28C678 +772B4C28C678:lI116|H772B4C28CF58 +772B4C28CF58:lI97|H772B4C28D7E8 +772B4C28D7E8:lI116|H772B4C28E038 +772B4C28E038:lI101|H772B4C28E828 +772B4C28E828:lI109|H772B4C28EF78 +772B4C28EF78:lI46|H772B4C28F658 +772B4C28F658:lI98|H772B4C28FC48 +772B4C28FC48:lI101|H772B4C290158 +772B4C290158:lI97|H772B4C2905B8 +772B4C2905B8:lI109|N +772B4C2890A8:lH772B4C289A20|N +772B4C289A20:lI101|H772B4C28A2F0 +772B4C28A2F0:lI100|H772B4C28ABC8 +772B4C28ABC8:lI108|H772B4C28B4A8 +772B4C28B4A8:lI105|H772B4C28BD88 +772B4C28BD88:lI110|H772B4C28C668 +772B4C28C668:lI95|H772B4C28CF48 +772B4C28CF48:lI116|H772B4C28D7D8 +772B4C28D7D8:lI121|H772B4C28E028 +772B4C28E028:lI112|H772B4C28E818 +772B4C28E818:lI101|H772B4C28EF68 +772B4C28EF68:lI95|H772B4C28F648 +772B4C28F648:lI115|H772B4C28FC38 +772B4C28FC38:lI117|H772B4C290148 +772B4C290148:lI103|H772B4C2905A8 +772B4C2905A8:lI103|H772B4C290908 +772B4C290908:lI101|H772B4C290BE8 +772B4C290BE8:lI115|H772B4C290E18 +772B4C290E18:lI116|H772B4C290FC8 +772B4C290FC8:lI105|H772B4C2910E8 +772B4C2910E8:lI111|H772B4C2911B8 +772B4C2911B8:lI110|H772B4C291268 +772B4C291268:lI46|H772B4C2912F8 +772B4C2912F8:lI98|H772B4C291378 +772B4C291378:lI101|H772B4C2913C8 +772B4C2913C8:lI97|H772B4C2913F8 +772B4C2913F8:lI109|N +772B4C2886E8:lH772B4C289088|N +772B4C289088:lI115|H772B4C289A00 +772B4C289A00:lI121|H772B4C28A2D0 +772B4C28A2D0:lI115|H772B4C28ABA8 +772B4C28ABA8:lI46|H772B4C28B488 +772B4C28B488:lI98|H772B4C28BD68 +772B4C28BD68:lI101|H772B4C28C648 +772B4C28C648:lI97|H772B4C28CF28 +772B4C28CF28:lI109|N +772B4C2886D0:Mn2:H772B4C289068,H772B4C289078 +772B4C289068:lH772B4C2899E0|N +772B4C2899E0:lI114|H772B4C28A2B0 +772B4C28A2B0:lI97|H772B4C28AB88 +772B4C28AB88:lI110|H772B4C28B468 +772B4C28B468:lI100|H772B4C28BD48 +772B4C28BD48:lI46|H772B4C28C628 +772B4C28C628:lI98|H772B4C28CF08 +772B4C28CF08:lI101|H772B4C28D7A8 +772B4C28D7A8:lI97|H772B4C28DFF8 +772B4C28DFF8:lI109|N +772B4C289078:lH772B4C2899F0|N +772B4C2899F0:lI111|H772B4C28A2C0 +772B4C28A2C0:lI114|H772B4C28AB98 +772B4C28AB98:lI100|H772B4C28B478 +772B4C28B478:lI100|H772B4C28BD58 +772B4C28BD58:lI105|H772B4C28C638 +772B4C28C638:lI99|H772B4C28CF18 +772B4C28CF18:lI116|H772B4C28D7B8 +772B4C28D7B8:lI46|H772B4C28E008 +772B4C28E008:lI98|H772B4C28E7F8 +772B4C28E7F8:lI101|H772B4C28EF48 +772B4C28EF48:lI97|H772B4C28F628 +772B4C28F628:lI109|N +772B4C288690:Mn7:H772B4C288FE8,H772B4C288FF8,H772B4C289008,H772B4C289018,H772B4C289028,H772B4C289038,H772B4C289048 +772B4C288FE8:lH772B4C289950|N +772B4C289950:lI106|H772B4C28A220 +772B4C28A220:lI115|H772B4C28AAF8 +772B4C28AAF8:lI111|H772B4C28B3D8 +772B4C28B3D8:lI110|H772B4C28BCB8 +772B4C28BCB8:lI46|H772B4C28C598 +772B4C28C598:lI98|H772B4C28CE78 +772B4C28CE78:lI101|H772B4C28D718 +772B4C28D718:lI97|H772B4C28DF78 +772B4C28DF78:lI109|N +772B4C289048:Mn3:H772B4C2899B0,H772B4C2899C0,H772B4C2899D0 +772B4C2899B0:lH772B4C28A280|N +772B4C28A280:lI101|H772B4C28AB58 +772B4C28AB58:lI114|H772B4C28B438 +772B4C28B438:lI108|H772B4C28BD18 +772B4C28BD18:lI95|H772B4C28C5F8 +772B4C28C5F8:lI105|H772B4C28CED8 +772B4C28CED8:lI110|H772B4C28D778 +772B4C28D778:lI116|H772B4C28DFC8 +772B4C28DFC8:lI101|H772B4C28E7C8 +772B4C28E7C8:lI114|H772B4C28EF18 +772B4C28EF18:lI110|H772B4C28F5F8 +772B4C28F5F8:lI97|H772B4C28FC08 +772B4C28FC08:lI108|H772B4C290118 +772B4C290118:lI46|H772B4C290578 +772B4C290578:lI98|H772B4C2908D8 +772B4C2908D8:lI101|H772B4C290BC8 +772B4C290BC8:lI97|H772B4C290DF8 +772B4C290DF8:lI109|N +772B4C2899D0:lH772B4C28A2A0|N +772B4C28A2A0:lI100|H772B4C28AB78 +772B4C28AB78:lI105|H772B4C28B458 +772B4C28B458:lI103|H772B4C28BD38 +772B4C28BD38:lI114|H772B4C28C618 +772B4C28C618:lI97|H772B4C28CEF8 +772B4C28CEF8:lI112|H772B4C28D798 +772B4C28D798:lI104|H772B4C28DFE8 +772B4C28DFE8:lI95|H772B4C28E7E8 +772B4C28E7E8:lI117|H772B4C28EF38 +772B4C28EF38:lI116|H772B4C28F618 +772B4C28F618:lI105|H772B4C28FC18 +772B4C28FC18:lI108|H772B4C290128 +772B4C290128:lI115|H772B4C290588 +772B4C290588:lI46|H772B4C2908E8 +772B4C2908E8:lI98|H772B4C290BD8 +772B4C290BD8:lI101|H772B4C290E08 +772B4C290E08:lI97|H772B4C290FB8 +772B4C290FB8:lI109|N +772B4C2899C0:lH772B4C28A290|N +772B4C28A290:lI114|H772B4C28AB68 +772B4C28AB68:lI97|H772B4C28B448 +772B4C28B448:lI110|H772B4C28BD28 +772B4C28BD28:lI100|H772B4C28C608 +772B4C28C608:lI111|H772B4C28CEE8 +772B4C28CEE8:lI109|H772B4C28D788 +772B4C28D788:lI46|H772B4C28DFD8 +772B4C28DFD8:lI98|H772B4C28E7D8 +772B4C28E7D8:lI101|H772B4C28EF28 +772B4C28EF28:lI97|H772B4C28F608 +772B4C28F608:lI109|N +772B4C289038:lH772B4C2899A0|N +772B4C2899A0:lI111|H772B4C28A270 +772B4C28A270:lI114|H772B4C28AB48 +772B4C28AB48:lI100|H772B4C28B428 +772B4C28B428:lI115|H772B4C28BD08 +772B4C28BD08:lI101|H772B4C28C5E8 +772B4C28C5E8:lI116|H772B4C28CEC8 +772B4C28CEC8:lI115|H772B4C28D768 +772B4C28D768:lI46|H772B4C28DFB8 +772B4C28DFB8:lI98|H772B4C28E7B8 +772B4C28E7B8:lI101|H772B4C28EF08 +772B4C28EF08:lI97|H772B4C28F5E8 +772B4C28F5E8:lI109|N +772B4C289028:lH772B4C289990|N +772B4C289990:lI116|H772B4C28A260 +772B4C28A260:lI105|H772B4C28AB38 +772B4C28AB38:lI109|H772B4C28B418 +772B4C28B418:lI101|H772B4C28BCF8 +772B4C28BCF8:lI114|H772B4C28C5D8 +772B4C28C5D8:lI46|H772B4C28CEB8 +772B4C28CEB8:lI98|H772B4C28D758 +772B4C28D758:lI101|H772B4C28DFA8 +772B4C28DFA8:lI97|H772B4C28E7A8 +772B4C28E7A8:lI109|N +772B4C289018:lH772B4C289980|N +772B4C289980:lI113|H772B4C28A250 +772B4C28A250:lI108|H772B4C28AB28 +772B4C28AB28:lI99|H772B4C28B408 +772B4C28B408:lI46|H772B4C28BCE8 +772B4C28BCE8:lI98|H772B4C28C5C8 +772B4C28C5C8:lI101|H772B4C28CEA8 +772B4C28CEA8:lI97|H772B4C28D748 +772B4C28D748:lI109|N +772B4C289008:lH772B4C289970|N +772B4C289970:lI115|H772B4C28A240 +772B4C28A240:lI117|H772B4C28AB18 +772B4C28AB18:lI112|H772B4C28B3F8 +772B4C28B3F8:lI101|H772B4C28BCD8 +772B4C28BCD8:lI114|H772B4C28C5B8 +772B4C28C5B8:lI118|H772B4C28CE98 +772B4C28CE98:lI105|H772B4C28D738 +772B4C28D738:lI115|H772B4C28DF98 +772B4C28DF98:lI111|H772B4C28E798 +772B4C28E798:lI114|H772B4C28EEF8 +772B4C28EEF8:lI95|H772B4C28F5D8 +772B4C28F5D8:lI98|H772B4C28FBF8 +772B4C28FBF8:lI114|H772B4C290108 +772B4C290108:lI105|H772B4C290568 +772B4C290568:lI100|H772B4C2908C8 +772B4C2908C8:lI103|H772B4C290BB8 +772B4C290BB8:lI101|H772B4C290DE8 +772B4C290DE8:lI46|H772B4C290FA8 +772B4C290FA8:lI98|H772B4C2910D8 +772B4C2910D8:lI101|H772B4C2911A8 +772B4C2911A8:lI97|H772B4C291258 +772B4C291258:lI109|N +772B4C288FF8:lH772B4C289960|N +772B4C289960:lI102|H772B4C28A230 +772B4C28A230:lI105|H772B4C28AB08 +772B4C28AB08:lI108|H772B4C28B3E8 +772B4C28B3E8:lI101|H772B4C28BCC8 +772B4C28BCC8:lI110|H772B4C28C5A8 +772B4C28C5A8:lI97|H772B4C28CE88 +772B4C28CE88:lI109|H772B4C28D728 +772B4C28D728:lI101|H772B4C28DF88 +772B4C28DF88:lI46|H772B4C28E788 +772B4C28E788:lI98|H772B4C28EEE8 +772B4C28EEE8:lI101|H772B4C28F5C8 +772B4C28F5C8:lI97|H772B4C28FBE8 +772B4C28FBE8:lI109|N +772B4C288650:Mn7:H772B4C288F78,H772B4C288F88,H772B4C288F98,H772B4C288FA8,H772B4C288FB8,H772B4C288FC8,H772B4C288FD8 +772B4C288F78:lH772B4C2898E0|N +772B4C2898E0:lI109|H772B4C28A1B0 +772B4C28A1B0:lI97|H772B4C28AA88 +772B4C28AA88:lI116|H772B4C28B368 +772B4C28B368:lI104|H772B4C28BC48 +772B4C28BC48:lI46|H772B4C28C528 +772B4C28C528:lI98|H772B4C28CE08 +772B4C28CE08:lI101|H772B4C28D6A8 +772B4C28D6A8:lI97|H772B4C28DF08 +772B4C28DF08:lI109|N +772B4C288FD8:lH772B4C289940|N +772B4C289940:lI105|H772B4C28A210 +772B4C28A210:lI111|H772B4C28AAE8 +772B4C28AAE8:lI95|H772B4C28B3C8 +772B4C28B3C8:lI108|H772B4C28BCA8 +772B4C28BCA8:lI105|H772B4C28C588 +772B4C28C588:lI98|H772B4C28CE68 +772B4C28CE68:lI95|H772B4C28D708 +772B4C28D708:lI102|H772B4C28DF68 +772B4C28DF68:lI114|H772B4C28E778 +772B4C28E778:lI101|H772B4C28EED8 +772B4C28EED8:lI97|H772B4C28F5B8 +772B4C28F5B8:lI100|H772B4C28FBD8 +772B4C28FBD8:lI46|H772B4C2900F8 +772B4C2900F8:lI98|H772B4C290558 +772B4C290558:lI101|H772B4C2908B8 +772B4C2908B8:lI97|H772B4C290BA8 +772B4C290BA8:lI109|N +772B4C288FC8:lH772B4C289930|N +772B4C289930:lI101|H772B4C28A200 +772B4C28A200:lI114|H772B4C28AAD8 +772B4C28AAD8:lI108|H772B4C28B3B8 +772B4C28B3B8:lI95|H772B4C28BC98 +772B4C28BC98:lI112|H772B4C28C578 +772B4C28C578:lI112|H772B4C28CE58 +772B4C28CE58:lI46|H772B4C28D6F8 +772B4C28D6F8:lI98|H772B4C28DF58 +772B4C28DF58:lI101|H772B4C28E768 +772B4C28E768:lI97|H772B4C28EEC8 +772B4C28EEC8:lI109|N +772B4C288FB8:lH772B4C289920|N +772B4C289920:lI100|H772B4C28A1F0 +772B4C28A1F0:lI101|H772B4C28AAC8 +772B4C28AAC8:lI116|H772B4C28B3A8 +772B4C28B3A8:lI115|H772B4C28BC88 +772B4C28BC88:lI95|H772B4C28C568 +772B4C28C568:lI117|H772B4C28CE48 +772B4C28CE48:lI116|H772B4C28D6E8 +772B4C28D6E8:lI105|H772B4C28DF48 +772B4C28DF48:lI108|H772B4C28E758 +772B4C28E758:lI115|H772B4C28EEB8 +772B4C28EEB8:lI46|H772B4C28F5A8 +772B4C28F5A8:lI98|H772B4C28FBC8 +772B4C28FBC8:lI101|H772B4C2900E8 +772B4C2900E8:lI97|H772B4C290548 +772B4C290548:lI109|N +772B4C288FA8:lH772B4C289910|N +772B4C289910:lI115|H772B4C28A1E0 +772B4C28A1E0:lI104|H772B4C28AAB8 +772B4C28AAB8:lI101|H772B4C28B398 +772B4C28B398:lI108|H772B4C28BC78 +772B4C28BC78:lI108|H772B4C28C558 +772B4C28C558:lI46|H772B4C28CE38 +772B4C28CE38:lI98|H772B4C28D6D8 +772B4C28D6D8:lI101|H772B4C28DF38 +772B4C28DF38:lI97|H772B4C28E748 +772B4C28E748:lI109|N +772B4C288F98:lH772B4C289900|N +772B4C289900:lI101|H772B4C28A1D0 +772B4C28A1D0:lI100|H772B4C28AAA8 +772B4C28AAA8:lI108|H772B4C28B388 +772B4C28B388:lI105|H772B4C28BC68 +772B4C28BC68:lI110|H772B4C28C548 +772B4C28C548:lI46|H772B4C28CE28 +772B4C28CE28:lI98|H772B4C28D6C8 +772B4C28D6C8:lI101|H772B4C28DF28 +772B4C28DF28:lI97|H772B4C28E738 +772B4C28E738:lI109|N +772B4C288F88:lH772B4C2898F0|N +772B4C2898F0:lI101|H772B4C28A1C0 +772B4C28A1C0:lI114|H772B4C28AA98 +772B4C28AA98:lI108|H772B4C28B378 +772B4C28B378:lI95|H772B4C28BC58 +772B4C28BC58:lI102|H772B4C28C538 +772B4C28C538:lI101|H772B4C28CE18 +772B4C28CE18:lI97|H772B4C28D6B8 +772B4C28D6B8:lI116|H772B4C28DF18 +772B4C28DF18:lI117|H772B4C28E728 +772B4C28E728:lI114|H772B4C28EEA8 +772B4C28EEA8:lI101|H772B4C28F598 +772B4C28F598:lI115|H772B4C28FBB8 +772B4C28FBB8:lI46|H772B4C2900D8 +772B4C2900D8:lI98|H772B4C290538 +772B4C290538:lI101|H772B4C2908A8 +772B4C2908A8:lI97|H772B4C290B98 +772B4C290B98:lI109|N +772B4C288618:Mn6:H772B4C288F10,H772B4C288F20,H772B4C288F30,H772B4C288F48,H772B4C288F58,H772B4C288F68 +772B4C288F10:lH772B4C289870|N +772B4C289870:lI108|H772B4C28A140 +772B4C28A140:lI105|H772B4C28AA18 +772B4C28AA18:lI115|H772B4C28B2F8 +772B4C28B2F8:lI116|H772B4C28BBD8 +772B4C28BBD8:lI115|H772B4C28C4B8 +772B4C28C4B8:lI46|H772B4C28CD98 +772B4C28CD98:lI98|H772B4C28D648 +772B4C28D648:lI101|H772B4C28DEA8 +772B4C28DEA8:lI97|H772B4C28E6C8 +772B4C28E6C8:lI109|N +772B4C288F68:lH772B4C2898D0|N +772B4C2898D0:lI98|H772B4C28A1A0 +772B4C28A1A0:lI101|H772B4C28AA78 +772B4C28AA78:lI97|H772B4C28B358 +772B4C28B358:lI109|H772B4C28BC38 +772B4C28BC38:lI95|H772B4C28C518 +772B4C28C518:lI108|H772B4C28CDF8 +772B4C28CDF8:lI105|H772B4C28D698 +772B4C28D698:lI98|H772B4C28DEF8 +772B4C28DEF8:lI46|H772B4C28E718 +772B4C28E718:lI98|H772B4C28EE98 +772B4C28EE98:lI101|H772B4C28F588 +772B4C28F588:lI97|H772B4C28FBA8 +772B4C28FBA8:lI109|N +772B4C288F58:lH772B4C2898C0|N +772B4C2898C0:lI112|H772B4C28A190 +772B4C28A190:lI114|H772B4C28AA68 +772B4C28AA68:lI111|H772B4C28B348 +772B4C28B348:lI112|H772B4C28BC28 +772B4C28BC28:lI108|H772B4C28C508 +772B4C28C508:lI105|H772B4C28CDE8 +772B4C28CDE8:lI115|H772B4C28D688 +772B4C28D688:lI116|H772B4C28DEE8 +772B4C28DEE8:lI115|H772B4C28E708 +772B4C28E708:lI46|H772B4C28EE88 +772B4C28EE88:lI98|H772B4C28F578 +772B4C28F578:lI101|H772B4C28FB98 +772B4C28FB98:lI97|H772B4C2900C8 +772B4C2900C8:lI109|N +772B4C288F48:lH772B4C2898B0|N +772B4C2898B0:lI109|H772B4C28A180 +772B4C28A180:lI115|H772B4C28AA58 +772B4C28AA58:lI95|H772B4C28B338 +772B4C28B338:lI116|H772B4C28BC18 +772B4C28BC18:lI114|H772B4C28C4F8 +772B4C28C4F8:lI97|H772B4C28CDD8 +772B4C28CDD8:lI110|H772B4C28D678 +772B4C28D678:lI115|H772B4C28DED8 +772B4C28DED8:lI102|H772B4C28E6F8 +772B4C28E6F8:lI111|H772B4C28EE78 +772B4C28EE78:lI114|H772B4C28F568 +772B4C28F568:lI109|H772B4C28FB88 +772B4C28FB88:lI46|H772B4C2900B8 +772B4C2900B8:lI98|H772B4C290528 +772B4C290528:lI101|H772B4C290898 +772B4C290898:lI97|H772B4C290B88 +772B4C290B88:lI109|N +772B4C288F30:Mn2:H772B4C289890,H772B4C2898A0 +772B4C289890:lH772B4C28A160|N +772B4C28A160:lI103|H772B4C28AA38 +772B4C28AA38:lI98|H772B4C28B318 +772B4C28B318:lI95|H772B4C28BBF8 +772B4C28BBF8:lI115|H772B4C28C4D8 +772B4C28C4D8:lI101|H772B4C28CDB8 +772B4C28CDB8:lI116|H772B4C28D658 +772B4C28D658:lI115|H772B4C28DEB8 +772B4C28DEB8:lI46|H772B4C28E6D8 +772B4C28E6D8:lI98|H772B4C28EE58 +772B4C28EE58:lI101|H772B4C28F548 +772B4C28F548:lI97|H772B4C28FB68 +772B4C28FB68:lI109|N +772B4C2898A0:lH772B4C28A170|N +772B4C28A170:lI100|H772B4C28AA48 +772B4C28AA48:lI101|H772B4C28B328 +772B4C28B328:lI116|H772B4C28BC08 +772B4C28BC08:lI115|H772B4C28C4E8 +772B4C28C4E8:lI95|H772B4C28CDC8 +772B4C28CDC8:lI115|H772B4C28D668 +772B4C28D668:lI117|H772B4C28DEC8 +772B4C28DEC8:lI112|H772B4C28E6E8 +772B4C28E6E8:lI46|H772B4C28EE68 +772B4C28EE68:lI98|H772B4C28F558 +772B4C28F558:lI101|H772B4C28FB78 +772B4C28FB78:lI97|H772B4C2900A8 +772B4C2900A8:lI109|N +772B4C288F20:lH772B4C289880|N +772B4C289880:lI114|H772B4C28A150 +772B4C28A150:lI101|H772B4C28AA28 +772B4C28AA28:lI46|H772B4C28B308 +772B4C28B308:lI98|H772B4C28BBE8 +772B4C28BBE8:lI101|H772B4C28C4C8 +772B4C28C4C8:lI97|H772B4C28CDA8 +772B4C28CDA8:lI109|N +772B4C288600:Mn2:H772B4C288EF0,H772B4C288F00 +772B4C288EF0:lH772B4C289850|N +772B4C289850:lI101|H772B4C28A120 +772B4C28A120:lI116|H772B4C28A9F8 +772B4C28A9F8:lI115|H772B4C28B2D8 +772B4C28B2D8:lI46|H772B4C28BBB8 +772B4C28BBB8:lI98|H772B4C28C498 +772B4C28C498:lI101|H772B4C28CD78 +772B4C28CD78:lI97|H772B4C28D628 +772B4C28D628:lI109|N +772B4C288F00:lH772B4C289860|N +772B4C289860:lI101|H772B4C28A130 +772B4C28A130:lI114|H772B4C28AA08 +772B4C28AA08:lI108|H772B4C28B2E8 +772B4C28B2E8:lI95|H772B4C28BBC8 +772B4C28BBC8:lI115|H772B4C28C4A8 +772B4C28C4A8:lI99|H772B4C28CD88 +772B4C28CD88:lI97|H772B4C28D638 +772B4C28D638:lI110|H772B4C28DE98 +772B4C28DE98:lI46|H772B4C28E6B8 +772B4C28E6B8:lI98|H772B4C28EE48 +772B4C28EE48:lI101|H772B4C28F538 +772B4C28F538:lI97|H772B4C28FB58 +772B4C28FB58:lI109|N +772B4C2885E8:Mn2:H772B4C288ED0,H772B4C288EE0 +772B4C288ED0:lH772B4C289830|N +772B4C289830:lI103|H772B4C28A100 +772B4C28A100:lI101|H772B4C28A9D8 +772B4C28A9D8:lI110|H772B4C28B2B8 +772B4C28B2B8:lI46|H772B4C28BB98 +772B4C28BB98:lI98|H772B4C28C478 +772B4C28C478:lI101|H772B4C28CD58 +772B4C28CD58:lI97|H772B4C28D618 +772B4C28D618:lI109|N +772B4C288EE0:lH772B4C289840|N +772B4C289840:lI105|H772B4C28A110 +772B4C28A110:lI111|H772B4C28A9E8 +772B4C28A9E8:lI46|H772B4C28B2C8 +772B4C28B2C8:lI98|H772B4C28BBA8 +772B4C28BBA8:lI101|H772B4C28C488 +772B4C28C488:lI97|H772B4C28CD68 +772B4C28CD68:lI109|N +772B4C2885B8:Mn5:H772B4C288E78,H772B4C288E90,H772B4C288EA0,H772B4C288EB0,H772B4C288EC0 +772B4C288E78:Mn2:H772B4C2897D0,H772B4C2897E0 +772B4C2897D0:lH772B4C28A0A0|N +772B4C28A0A0:lI101|H772B4C28A978 +772B4C28A978:lI114|H772B4C28B258 +772B4C28B258:lI108|H772B4C28BB38 +772B4C28BB38:lI95|H772B4C28C418 +772B4C28C418:lI108|H772B4C28CCF8 +772B4C28CCF8:lI105|H772B4C28D5B8 +772B4C28D5B8:lI110|H772B4C28DE38 +772B4C28DE38:lI116|H772B4C28E658 +772B4C28E658:lI46|H772B4C28EDE8 +772B4C28EDE8:lI98|H772B4C28F4D8 +772B4C28F4D8:lI101|H772B4C28FB28 +772B4C28FB28:lI97|H772B4C290078 +772B4C290078:lI109|N +772B4C2897E0:lH772B4C28A0B0|N +772B4C28A0B0:lI105|H772B4C28A988 +772B4C28A988:lI111|H772B4C28B268 +772B4C28B268:lI95|H772B4C28BB48 +772B4C28BB48:lI108|H772B4C28C428 +772B4C28C428:lI105|H772B4C28CD08 +772B4C28CD08:lI98|H772B4C28D5C8 +772B4C28D5C8:lI95|H772B4C28DE48 +772B4C28DE48:lI102|H772B4C28E668 +772B4C28E668:lI111|H772B4C28EDF8 +772B4C28EDF8:lI114|H772B4C28F4E8 +772B4C28F4E8:lI109|H772B4C28FB38 +772B4C28FB38:lI97|H772B4C290088 +772B4C290088:lI116|H772B4C290508 +772B4C290508:lI46|H772B4C290888 +772B4C290888:lI98|H772B4C290B78 +772B4C290B78:lI101|H772B4C290DD8 +772B4C290DD8:lI97|H772B4C290F98 +772B4C290F98:lI109|N +772B4C288EC0:lH772B4C289820|N +772B4C289820:lI103|H772B4C28A0F0 +772B4C28A0F0:lI101|H772B4C28A9C8 +772B4C28A9C8:lI110|H772B4C28B2A8 +772B4C28B2A8:lI95|H772B4C28BB88 +772B4C28BB88:lI115|H772B4C28C468 +772B4C28C468:lI101|H772B4C28CD48 +772B4C28CD48:lI114|H772B4C28D608 +772B4C28D608:lI118|H772B4C28DE88 +772B4C28DE88:lI101|H772B4C28E6A8 +772B4C28E6A8:lI114|H772B4C28EE38 +772B4C28EE38:lI46|H772B4C28F528 +772B4C28F528:lI98|H772B4C28FB48 +772B4C28FB48:lI101|H772B4C290098 +772B4C290098:lI97|H772B4C290518 +772B4C290518:lI109|N +772B4C288EB0:lH772B4C289810|N +772B4C289810:lI101|H772B4C28A0E0 +772B4C28A0E0:lI115|H772B4C28A9B8 +772B4C28A9B8:lI99|H772B4C28B298 +772B4C28B298:lI114|H772B4C28BB78 +772B4C28BB78:lI105|H772B4C28C458 +772B4C28C458:lI112|H772B4C28CD38 +772B4C28CD38:lI116|H772B4C28D5F8 +772B4C28D5F8:lI46|H772B4C28DE78 +772B4C28DE78:lI98|H772B4C28E698 +772B4C28E698:lI101|H772B4C28EE28 +772B4C28EE28:lI97|H772B4C28F518 +772B4C28F518:lI109|N +772B4C288EA0:lH772B4C289800|N +772B4C289800:lI101|H772B4C28A0D0 +772B4C28A0D0:lI114|H772B4C28A9A8 +772B4C28A9A8:lI108|H772B4C28B288 +772B4C28B288:lI95|H772B4C28BB68 +772B4C28BB68:lI116|H772B4C28C448 +772B4C28C448:lI97|H772B4C28CD28 +772B4C28CD28:lI114|H772B4C28D5E8 +772B4C28D5E8:lI46|H772B4C28DE68 +772B4C28DE68:lI98|H772B4C28E688 +772B4C28E688:lI101|H772B4C28EE18 +772B4C28EE18:lI97|H772B4C28F508 +772B4C28F508:lI109|N +772B4C288E90:lH772B4C2897F0|N +772B4C2897F0:lI103|H772B4C28A0C0 +772B4C28A0C0:lI101|H772B4C28A998 +772B4C28A998:lI110|H772B4C28B278 +772B4C28B278:lI95|H772B4C28BB58 +772B4C28BB58:lI102|H772B4C28C438 +772B4C28C438:lI115|H772B4C28CD18 +772B4C28CD18:lI109|H772B4C28D5D8 +772B4C28D5D8:lI46|H772B4C28DE58 +772B4C28DE58:lI98|H772B4C28E678 +772B4C28E678:lI101|H772B4C28EE08 +772B4C28EE08:lI97|H772B4C28F4F8 +772B4C28F4F8:lI109|N +772B4C288158:Mh67:10:H772B4C288278,H772B4C2882A0,H772B4C2882D0,H772B4C2882F8,H772B4C288328,H772B4C288360,H772B4C288388,H772B4C2883C0,H772B4C2883F0,H772B4C288428,H772B4C288440,H772B4C288468,H772B4C2884B0,H772B4C2884D8,H772B4C288518,H772B4C288558 +772B4C288278:Mn4:H772B4C288878,H772B4C288888,H772B4C288898,H772B4C2888A8 +772B4C288878:lH772B4C284778|N +772B4C284778:lI108|H772B4C284AF8 +772B4C284AF8:lI111|H772B4C284E78 +772B4C284E78:lI103|H772B4C2851F8 +772B4C2851F8:lI103|H772B4C285578 +772B4C285578:lI101|H772B4C2858F8 +772B4C2858F8:lI114|H772B4C285C78 +772B4C285C78:lI95|H772B4C285FF8 +772B4C285FF8:lI100|H772B4C286378 +772B4C286378:lI105|H772B4C2866C8 +772B4C2866C8:lI115|H772B4C2869E8 +772B4C2869E8:lI107|H772B4C286CE8 +772B4C286CE8:lI95|H772B4C286FD8 +772B4C286FD8:lI108|H772B4C287298 +772B4C287298:lI111|H772B4C2874E8 +772B4C2874E8:lI103|H772B4C2876E8 +772B4C2876E8:lI95|H772B4C287898 +772B4C287898:lI104|H772B4C287A38 +772B4C287A38:lI46|H772B4C287BB8 +772B4C287BB8:lI98|H772B4C287D08 +772B4C287D08:lI101|H772B4C287E18 +772B4C287E18:lI97|H772B4C287EE8 +772B4C287EE8:lI109|N +772B4C2888A8:lH772B4C2893A8|N +772B4C2893A8:lI105|H772B4C289D90 +772B4C289D90:lI110|H772B4C28A668 +772B4C28A668:lI101|H772B4C28AF48 +772B4C28AF48:lI116|H772B4C28B828 +772B4C28B828:lI95|H772B4C28C108 +772B4C28C108:lI116|H772B4C28C9E8 +772B4C28C9E8:lI99|H772B4C28D2B8 +772B4C28D2B8:lI112|H772B4C28DB48 +772B4C28DB48:lI46|H772B4C28E388 +772B4C28E388:lI98|H772B4C28EB38 +772B4C28EB38:lI101|H772B4C28F248 +772B4C28F248:lI97|H772B4C28F8D8 +772B4C28F8D8:lI109|N +772B4C288898:lH772B4C284788|N +772B4C284788:lI107|H772B4C284B08 +772B4C284B08:lI101|H772B4C284E88 +772B4C284E88:lI114|H772B4C285208 +772B4C285208:lI110|H772B4C285588 +772B4C285588:lI101|H772B4C285908 +772B4C285908:lI108|H772B4C285C88 +772B4C285C88:lI46|H772B4C286008 +772B4C286008:lI97|H772B4C286388 +772B4C286388:lI112|H772B4C2866D8 +772B4C2866D8:lI112|H772B4C2869F8 +772B4C2869F8:lI117|H772B4C286CF8 +772B4C286CF8:lI112|N +772B4C288888:lH772B4C289398|N +772B4C289398:lI102|H772B4C289D80 +772B4C289D80:lI105|H772B4C28A658 +772B4C28A658:lI108|H772B4C28AF38 +772B4C28AF38:lI101|H772B4C28B818 +772B4C28B818:lI95|H772B4C28C0F8 +772B4C28C0F8:lI115|H772B4C28C9D8 +772B4C28C9D8:lI101|H772B4C28D2A8 +772B4C28D2A8:lI114|H772B4C28DB38 +772B4C28DB38:lI118|H772B4C28E378 +772B4C28E378:lI101|H772B4C28EB28 +772B4C28EB28:lI114|H772B4C28F238 +772B4C28F238:lI46|H772B4C28F8C8 +772B4C28F8C8:lI98|H772B4C28FE68 +772B4C28FE68:lI101|H772B4C290328 +772B4C290328:lI97|H772B4C2906E8 +772B4C2906E8:lI109|N +772B4C288558:Mn7:H772B4C288DB8,H772B4C288DC8,H772B4C288DE0,H772B4C288DF8,H772B4C288E08,H772B4C288E18,H772B4C288E30 +772B4C288DB8:lH772B4C2849B8|N +772B4C2849B8:lI101|H772B4C284D38 +772B4C284D38:lI114|H772B4C2850B8 +772B4C2850B8:lI108|H772B4C285438 +772B4C285438:lI95|H772B4C2857B8 +772B4C2857B8:lI98|H772B4C285B38 +772B4C285B38:lI111|H772B4C285EB8 +772B4C285EB8:lI111|H772B4C286238 +772B4C286238:lI116|H772B4C286598 +772B4C286598:lI95|H772B4C2868C8 +772B4C2868C8:lI115|H772B4C286BD8 +772B4C286BD8:lI101|H772B4C286ED8 +772B4C286ED8:lI114|H772B4C287198 +772B4C287198:lI118|H772B4C287418 +772B4C287418:lI101|H772B4C287638 +772B4C287638:lI114|H772B4C287818 +772B4C287818:lI46|H772B4C2879B8 +772B4C2879B8:lI98|H772B4C287B48 +772B4C287B48:lI101|H772B4C287C98 +772B4C287C98:lI97|H772B4C287DB8 +772B4C287DB8:lI109|N +772B4C288E30:Mn2:H772B4C289780,H772B4C289790 +772B4C289780:lH772B4C284AE8|N +772B4C284AE8:lI105|H772B4C284E68 +772B4C284E68:lI110|H772B4C2851E8 +772B4C2851E8:lI101|H772B4C285568 +772B4C285568:lI116|H772B4C2858E8 +772B4C2858E8:lI95|H772B4C285C68 +772B4C285C68:lI100|H772B4C285FE8 +772B4C285FE8:lI110|H772B4C286368 +772B4C286368:lI115|H772B4C2866B8 +772B4C2866B8:lI46|H772B4C2869D8 +772B4C2869D8:lI98|H772B4C286CD8 +772B4C286CD8:lI101|H772B4C286FC8 +772B4C286FC8:lI97|H772B4C287288 +772B4C287288:lI109|N +772B4C289790:lH772B4C28A060|N +772B4C28A060:lI107|H772B4C28A938 +772B4C28A938:lI101|H772B4C28B218 +772B4C28B218:lI114|H772B4C28BAF8 +772B4C28BAF8:lI110|H772B4C28C3D8 +772B4C28C3D8:lI101|H772B4C28CCB8 +772B4C28CCB8:lI108|H772B4C28D578 +772B4C28D578:lI46|H772B4C28DDF8 +772B4C28DDF8:lI98|H772B4C28E628 +772B4C28E628:lI101|H772B4C28EDB8 +772B4C28EDB8:lI97|H772B4C28F4A8 +772B4C28F4A8:lI109|N +772B4C288E18:Mn2:H772B4C289760,H772B4C289770 +772B4C289760:lH772B4C284AD8|N +772B4C284AD8:lI108|H772B4C284E58 +772B4C284E58:lI111|H772B4C2851D8 +772B4C2851D8:lI99|H772B4C285558 +772B4C285558:lI97|H772B4C2858D8 +772B4C2858D8:lI108|H772B4C285C58 +772B4C285C58:lI95|H772B4C285FD8 +772B4C285FD8:lI116|H772B4C286358 +772B4C286358:lI99|H772B4C2866A8 +772B4C2866A8:lI112|H772B4C2869C8 +772B4C2869C8:lI46|H772B4C286CC8 +772B4C286CC8:lI98|H772B4C286FB8 +772B4C286FB8:lI101|H772B4C287278 +772B4C287278:lI97|H772B4C2874D8 +772B4C2874D8:lI109|N +772B4C289770:lH772B4C28A050|N +772B4C28A050:lI105|H772B4C28A928 +772B4C28A928:lI110|H772B4C28B208 +772B4C28B208:lI101|H772B4C28BAE8 +772B4C28BAE8:lI116|H772B4C28C3C8 +772B4C28C3C8:lI95|H772B4C28CCA8 +772B4C28CCA8:lI100|H772B4C28D568 +772B4C28D568:lI110|H772B4C28DDE8 +772B4C28DDE8:lI115|H772B4C28E618 +772B4C28E618:lI95|H772B4C28EDA8 +772B4C28EDA8:lI116|H772B4C28F498 +772B4C28F498:lI115|H772B4C28FB08 +772B4C28FB08:lI105|H772B4C290058 +772B4C290058:lI103|H772B4C2904E8 +772B4C2904E8:lI46|H772B4C290868 +772B4C290868:lI98|H772B4C290B58 +772B4C290B58:lI101|H772B4C290DB8 +772B4C290DB8:lI97|H772B4C290F78 +772B4C290F78:lI109|N +772B4C288E08:lH772B4C289750|N +772B4C289750:lI105|H772B4C28A040 +772B4C28A040:lI110|H772B4C28A918 +772B4C28A918:lI101|H772B4C28B1F8 +772B4C28B1F8:lI116|H772B4C28BAD8 +772B4C28BAD8:lI95|H772B4C28C3B8 +772B4C28C3B8:lI100|H772B4C28CC98 +772B4C28CC98:lI98|H772B4C28D558 +772B4C28D558:lI46|H772B4C28DDD8 +772B4C28DDD8:lI98|H772B4C28E608 +772B4C28E608:lI101|H772B4C28ED98 +772B4C28ED98:lI97|H772B4C28F488 +772B4C28F488:lI109|N +772B4C288DF8:lH772B4C2849C8|N +772B4C2849C8:lI105|H772B4C284D48 +772B4C284D48:lI110|H772B4C2850C8 +772B4C2850C8:lI101|H772B4C285448 +772B4C285448:lI116|H772B4C2857C8 +772B4C2857C8:lI95|H772B4C285B48 +772B4C285B48:lI104|H772B4C285EC8 +772B4C285EC8:lI111|H772B4C286248 +772B4C286248:lI115|H772B4C2865A8 +772B4C2865A8:lI116|H772B4C2868D8 +772B4C2868D8:lI115|H772B4C286BE8 +772B4C286BE8:lI46|H772B4C286EE8 +772B4C286EE8:lI98|H772B4C2871A8 +772B4C2871A8:lI101|H772B4C287428 +772B4C287428:lI97|H772B4C287648 +772B4C287648:lI109|N +772B4C288DE0:Mn2:H772B4C289730,H772B4C289740 +772B4C289730:lH772B4C284AB8|N +772B4C284AB8:lI114|H772B4C284E38 +772B4C284E38:lI97|H772B4C2851B8 +772B4C2851B8:lI119|H772B4C285538 +772B4C285538:lI95|H772B4C2858B8 +772B4C2858B8:lI102|H772B4C285C38 +772B4C285C38:lI105|H772B4C285FB8 +772B4C285FB8:lI108|H772B4C286338 +772B4C286338:lI101|H772B4C286688 +772B4C286688:lI95|H772B4C2869A8 +772B4C2869A8:lI105|H772B4C286CA8 +772B4C286CA8:lI111|H772B4C286F98 +772B4C286F98:lI95|H772B4C287258 +772B4C287258:lI100|H772B4C2874B8 +772B4C2874B8:lI101|H772B4C2876C8 +772B4C2876C8:lI108|H772B4C287878 +772B4C287878:lI97|H772B4C287A18 +772B4C287A18:lI121|H772B4C287B98 +772B4C287B98:lI101|H772B4C287CE8 +772B4C287CE8:lI100|H772B4C287DF8 +772B4C287DF8:lI46|H772B4C287EC8 +772B4C287EC8:lI98|H772B4C287F68 +772B4C287F68:lI101|H772B4C287FF8 +772B4C287FF8:lI97|H772B4C288068 +772B4C288068:lI109|N +772B4C289740:lH772B4C284AC8|N +772B4C284AC8:lI97|H772B4C284E48 +772B4C284E48:lI112|H772B4C2851C8 +772B4C2851C8:lI112|H772B4C285548 +772B4C285548:lI108|H772B4C2858C8 +772B4C2858C8:lI105|H772B4C285C48 +772B4C285C48:lI99|H772B4C285FC8 +772B4C285FC8:lI97|H772B4C286348 +772B4C286348:lI116|H772B4C286698 +772B4C286698:lI105|H772B4C2869B8 +772B4C2869B8:lI111|H772B4C286CB8 +772B4C286CB8:lI110|H772B4C286FA8 +772B4C286FA8:lI95|H772B4C287268 +772B4C287268:lI99|H772B4C2874C8 +772B4C2874C8:lI111|H772B4C2876D8 +772B4C2876D8:lI110|H772B4C287888 +772B4C287888:lI116|H772B4C287A28 +772B4C287A28:lI114|H772B4C287BA8 +772B4C287BA8:lI111|H772B4C287CF8 +772B4C287CF8:lI108|H772B4C287E08 +772B4C287E08:lI108|H772B4C287ED8 +772B4C287ED8:lI101|H772B4C287F78 +772B4C287F78:lI114|H772B4C288008 +772B4C288008:lI46|H772B4C288078 +772B4C288078:lI98|H772B4C2880A8 +772B4C2880A8:lI101|H772B4C2880D8 +772B4C2880D8:lI97|H772B4C288108 +772B4C288108:lI109|N +772B4C288DC8:Mn2:H772B4C289710,H772B4C289720 +772B4C289710:lH772B4C28A020|N +772B4C28A020:lI105|H772B4C28A8F8 +772B4C28A8F8:lI110|H772B4C28B1D8 +772B4C28B1D8:lI101|H772B4C28BAB8 +772B4C28BAB8:lI116|H772B4C28C398 +772B4C28C398:lI46|H772B4C28CC78 +772B4C28CC78:lI98|H772B4C28D538 +772B4C28D538:lI101|H772B4C28DDB8 +772B4C28DDB8:lI97|H772B4C28E5E8 +772B4C28E5E8:lI109|N +772B4C289720:lH772B4C28A030|N +772B4C28A030:lI103|H772B4C28A908 +772B4C28A908:lI101|H772B4C28B1E8 +772B4C28B1E8:lI110|H772B4C28BAC8 +772B4C28BAC8:lI95|H772B4C28C3A8 +772B4C28C3A8:lI116|H772B4C28CC88 +772B4C28CC88:lI99|H772B4C28D548 +772B4C28D548:lI112|H772B4C28DDC8 +772B4C28DDC8:lI46|H772B4C28E5F8 +772B4C28E5F8:lI98|H772B4C28ED88 +772B4C28ED88:lI101|H772B4C28F478 +772B4C28F478:lI97|H772B4C28FAF8 +772B4C28FAF8:lI109|N +772B4C288518:Mn7:H772B4C288D48,H772B4C288D58,H772B4C288D68,H772B4C288D78,H772B4C288D88,H772B4C288D98,H772B4C288DA8 +772B4C288D48:lH772B4C2896B0|N +772B4C2896B0:lI103|H772B4C289FC0 +772B4C289FC0:lI114|H772B4C28A898 +772B4C28A898:lI111|H772B4C28B178 +772B4C28B178:lI117|H772B4C28BA58 +772B4C28BA58:lI112|H772B4C28C338 +772B4C28C338:lI95|H772B4C28CC18 +772B4C28CC18:lI104|H772B4C28D4D8 +772B4C28D4D8:lI105|H772B4C28DD58 +772B4C28DD58:lI115|H772B4C28E588 +772B4C28E588:lI116|H772B4C28ED28 +772B4C28ED28:lI111|H772B4C28F418 +772B4C28F418:lI114|H772B4C28FA98 +772B4C28FA98:lI121|H772B4C28FFF8 +772B4C28FFF8:lI46|H772B4C290488 +772B4C290488:lI98|H772B4C290818 +772B4C290818:lI101|H772B4C290B08 +772B4C290B08:lI97|H772B4C290D88 +772B4C290D88:lI109|N +772B4C288DA8:lH772B4C289700|N +772B4C289700:lI105|H772B4C28A010 +772B4C28A010:lI110|H772B4C28A8E8 +772B4C28A8E8:lI101|H772B4C28B1C8 +772B4C28B1C8:lI116|H772B4C28BAA8 +772B4C28BAA8:lI95|H772B4C28C388 +772B4C28C388:lI101|H772B4C28CC68 +772B4C28CC68:lI112|H772B4C28D528 +772B4C28D528:lI109|H772B4C28DDA8 +772B4C28DDA8:lI100|H772B4C28E5D8 +772B4C28E5D8:lI95|H772B4C28ED78 +772B4C28ED78:lI115|H772B4C28F468 +772B4C28F468:lI111|H772B4C28FAE8 +772B4C28FAE8:lI99|H772B4C290048 +772B4C290048:lI107|H772B4C2904D8 +772B4C2904D8:lI101|H772B4C290858 +772B4C290858:lI116|H772B4C290B48 +772B4C290B48:lI46|H772B4C290DA8 +772B4C290DA8:lI98|H772B4C290F68 +772B4C290F68:lI101|H772B4C2910B8 +772B4C2910B8:lI97|H772B4C291188 +772B4C291188:lI109|N +772B4C288D98:lH772B4C2896F0|N +772B4C2896F0:lI101|H772B4C28A000 +772B4C28A000:lI114|H772B4C28A8D8 +772B4C28A8D8:lI116|H772B4C28B1B8 +772B4C28B1B8:lI115|H772B4C28BA98 +772B4C28BA98:lI95|H772B4C28C378 +772B4C28C378:lI100|H772B4C28CC58 +772B4C28CC58:lI101|H772B4C28D518 +772B4C28D518:lI98|H772B4C28DD98 +772B4C28DD98:lI117|H772B4C28E5C8 +772B4C28E5C8:lI103|H772B4C28ED68 +772B4C28ED68:lI46|H772B4C28F458 +772B4C28F458:lI98|H772B4C28FAD8 +772B4C28FAD8:lI101|H772B4C290038 +772B4C290038:lI97|H772B4C2904C8 +772B4C2904C8:lI109|N +772B4C288D88:lH772B4C2896E0|N +772B4C2896E0:lI103|H772B4C289FF0 +772B4C289FF0:lI101|H772B4C28A8C8 +772B4C28A8C8:lI110|H772B4C28B1A8 +772B4C28B1A8:lI95|H772B4C28BA88 +772B4C28BA88:lI116|H772B4C28C368 +772B4C28C368:lI99|H772B4C28CC48 +772B4C28CC48:lI112|H772B4C28D508 +772B4C28D508:lI95|H772B4C28DD88 +772B4C28DD88:lI115|H772B4C28E5B8 +772B4C28E5B8:lI111|H772B4C28ED58 +772B4C28ED58:lI99|H772B4C28F448 +772B4C28F448:lI107|H772B4C28FAC8 +772B4C28FAC8:lI101|H772B4C290028 +772B4C290028:lI116|H772B4C2904B8 +772B4C2904B8:lI46|H772B4C290848 +772B4C290848:lI98|H772B4C290B38 +772B4C290B38:lI101|H772B4C290D98 +772B4C290D98:lI97|H772B4C290F58 +772B4C290F58:lI109|N +772B4C288D78:lH772B4C2896D0|N +772B4C2896D0:lI101|H772B4C289FE0 +772B4C289FE0:lI114|H772B4C28A8B8 +772B4C28A8B8:lI114|H772B4C28B198 +772B4C28B198:lI111|H772B4C28BA78 +772B4C28BA78:lI114|H772B4C28C358 +772B4C28C358:lI95|H772B4C28CC38 +772B4C28CC38:lI108|H772B4C28D4F8 +772B4C28D4F8:lI111|H772B4C28DD78 +772B4C28DD78:lI103|H772B4C28E5A8 +772B4C28E5A8:lI103|H772B4C28ED48 +772B4C28ED48:lI101|H772B4C28F438 +772B4C28F438:lI114|H772B4C28FAB8 +772B4C28FAB8:lI46|H772B4C290018 +772B4C290018:lI98|H772B4C2904A8 +772B4C2904A8:lI101|H772B4C290838 +772B4C290838:lI97|H772B4C290B28 +772B4C290B28:lI109|N +772B4C288D68:lH772B4C2849A8|N +772B4C2849A8:lI108|H772B4C284D28 +772B4C284D28:lI111|H772B4C2850A8 +772B4C2850A8:lI103|H772B4C285428 +772B4C285428:lI103|H772B4C2857A8 +772B4C2857A8:lI101|H772B4C285B28 +772B4C285B28:lI114|H772B4C285EA8 +772B4C285EA8:lI95|H772B4C286228 +772B4C286228:lI115|H772B4C286588 +772B4C286588:lI117|H772B4C2868B8 +772B4C2868B8:lI112|H772B4C286BC8 +772B4C286BC8:lI46|H772B4C286EC8 +772B4C286EC8:lI98|H772B4C287188 +772B4C287188:lI101|H772B4C287408 +772B4C287408:lI97|H772B4C287628 +772B4C287628:lI109|N +772B4C288D58:lH772B4C2896C0|N +772B4C2896C0:lI103|H772B4C289FD0 +772B4C289FD0:lI108|H772B4C28A8A8 +772B4C28A8A8:lI111|H772B4C28B188 +772B4C28B188:lI98|H772B4C28BA68 +772B4C28BA68:lI97|H772B4C28C348 +772B4C28C348:lI108|H772B4C28CC28 +772B4C28CC28:lI95|H772B4C28D4E8 +772B4C28D4E8:lI103|H772B4C28DD68 +772B4C28DD68:lI114|H772B4C28E598 +772B4C28E598:lI111|H772B4C28ED38 +772B4C28ED38:lI117|H772B4C28F428 +772B4C28F428:lI112|H772B4C28FAA8 +772B4C28FAA8:lI46|H772B4C290008 +772B4C290008:lI98|H772B4C290498 +772B4C290498:lI101|H772B4C290828 +772B4C290828:lI97|H772B4C290B18 +772B4C290B18:lI109|N +772B4C2884D8:Mn7:H772B4C288CD0,H772B4C288CE0,H772B4C288CF8,H772B4C288D08,H772B4C288D18,H772B4C288D28,H772B4C288D38 +772B4C288CD0:lH772B4C284968|N +772B4C284968:lI103|H772B4C284CE8 +772B4C284CE8:lI108|H772B4C285068 +772B4C285068:lI111|H772B4C2853E8 +772B4C2853E8:lI98|H772B4C285768 +772B4C285768:lI97|H772B4C285AE8 +772B4C285AE8:lI108|H772B4C285E68 +772B4C285E68:lI95|H772B4C2861E8 +772B4C2861E8:lI115|H772B4C286548 +772B4C286548:lI101|H772B4C286878 +772B4C286878:lI97|H772B4C286B88 +772B4C286B88:lI114|H772B4C286E88 +772B4C286E88:lI99|H772B4C287148 +772B4C287148:lI104|H772B4C2873C8 +772B4C2873C8:lI46|H772B4C2875E8 +772B4C2875E8:lI98|H772B4C2877D8 +772B4C2877D8:lI101|H772B4C287978 +772B4C287978:lI97|H772B4C287B08 +772B4C287B08:lI109|N +772B4C288D38:lH772B4C284998|N +772B4C284998:lI101|H772B4C284D18 +772B4C284D18:lI114|H772B4C285098 +772B4C285098:lI108|H772B4C285418 +772B4C285418:lI95|H772B4C285798 +772B4C285798:lI100|H772B4C285B18 +772B4C285B18:lI105|H772B4C285E98 +772B4C285E98:lI115|H772B4C286218 +772B4C286218:lI116|H772B4C286578 +772B4C286578:lI114|H772B4C2868A8 +772B4C2868A8:lI105|H772B4C286BB8 +772B4C286BB8:lI98|H772B4C286EB8 +772B4C286EB8:lI117|H772B4C287178 +772B4C287178:lI116|H772B4C2873F8 +772B4C2873F8:lI105|H772B4C287618 +772B4C287618:lI111|H772B4C287808 +772B4C287808:lI110|H772B4C2879A8 +772B4C2879A8:lI46|H772B4C287B38 +772B4C287B38:lI98|H772B4C287C88 +772B4C287C88:lI101|H772B4C287DA8 +772B4C287DA8:lI97|H772B4C287E98 +772B4C287E98:lI109|N +772B4C288D28:lH772B4C2896A0|N +772B4C2896A0:lI108|H772B4C289FB0 +772B4C289FB0:lI111|H772B4C28A888 +772B4C28A888:lI103|H772B4C28B168 +772B4C28B168:lI103|H772B4C28BA48 +772B4C28BA48:lI101|H772B4C28C328 +772B4C28C328:lI114|H772B4C28CC08 +772B4C28CC08:lI95|H772B4C28D4C8 +772B4C28D4C8:lI115|H772B4C28DD48 +772B4C28DD48:lI101|H772B4C28E578 +772B4C28E578:lI114|H772B4C28ED18 +772B4C28ED18:lI118|H772B4C28F408 +772B4C28F408:lI101|H772B4C28FA88 +772B4C28FA88:lI114|H772B4C28FFE8 +772B4C28FFE8:lI46|H772B4C290478 +772B4C290478:lI98|H772B4C290808 +772B4C290808:lI101|H772B4C290AF8 +772B4C290AF8:lI97|H772B4C290D78 +772B4C290D78:lI109|N +772B4C288D18:lH772B4C284988|N +772B4C284988:lI107|H772B4C284D08 +772B4C284D08:lI101|H772B4C285088 +772B4C285088:lI114|H772B4C285408 +772B4C285408:lI110|H772B4C285788 +772B4C285788:lI101|H772B4C285B08 +772B4C285B08:lI108|H772B4C285E88 +772B4C285E88:lI95|H772B4C286208 +772B4C286208:lI99|H772B4C286568 +772B4C286568:lI111|H772B4C286898 +772B4C286898:lI110|H772B4C286BA8 +772B4C286BA8:lI102|H772B4C286EA8 +772B4C286EA8:lI105|H772B4C287168 +772B4C287168:lI103|H772B4C2873E8 +772B4C2873E8:lI46|H772B4C287608 +772B4C287608:lI98|H772B4C2877F8 +772B4C2877F8:lI101|H772B4C287998 +772B4C287998:lI97|H772B4C287B28 +772B4C287B28:lI109|N +772B4C288D08:lH772B4C289690|N +772B4C289690:lI115|H772B4C289FA0 +772B4C289FA0:lI101|H772B4C28A878 +772B4C28A878:lI113|H772B4C28B158 +772B4C28B158:lI95|H772B4C28BA38 +772B4C28BA38:lI116|H772B4C28C318 +772B4C28C318:lI114|H772B4C28CBF8 +772B4C28CBF8:lI97|H772B4C28D4B8 +772B4C28D4B8:lI99|H772B4C28DD38 +772B4C28DD38:lI101|H772B4C28E568 +772B4C28E568:lI46|H772B4C28ED08 +772B4C28ED08:lI98|H772B4C28F3F8 +772B4C28F3F8:lI101|H772B4C28FA78 +772B4C28FA78:lI97|H772B4C28FFD8 +772B4C28FFD8:lI109|N +772B4C288CF8:lH772B4C284978|N +772B4C284978:lI108|H772B4C284CF8 +772B4C284CF8:lI111|H772B4C285078 +772B4C285078:lI103|H772B4C2853F8 +772B4C2853F8:lI103|H772B4C285778 +772B4C285778:lI101|H772B4C285AF8 +772B4C285AF8:lI114|H772B4C285E78 +772B4C285E78:lI95|H772B4C2861F8 +772B4C2861F8:lI104|H772B4C286558 +772B4C286558:lI97|H772B4C286888 +772B4C286888:lI110|H772B4C286B98 +772B4C286B98:lI100|H772B4C286E98 +772B4C286E98:lI108|H772B4C287158 +772B4C287158:lI101|H772B4C2873D8 +772B4C2873D8:lI114|H772B4C2875F8 +772B4C2875F8:lI95|H772B4C2877E8 +772B4C2877E8:lI119|H772B4C287988 +772B4C287988:lI97|H772B4C287B18 +772B4C287B18:lI116|H772B4C287C78 +772B4C287C78:lI99|H772B4C287D98 +772B4C287D98:lI104|H772B4C287E88 +772B4C287E88:lI101|H772B4C287F58 +772B4C287F58:lI114|H772B4C287FE8 +772B4C287FE8:lI46|H772B4C288058 +772B4C288058:lI98|H772B4C288098 +772B4C288098:lI101|H772B4C2880C8 +772B4C2880C8:lI97|H772B4C2880F8 +772B4C2880F8:lI109|N +772B4C288CE0:Mn2:H772B4C289670,H772B4C289680 +772B4C289670:lH772B4C284A98|N +772B4C284A98:lI114|H772B4C284E18 +772B4C284E18:lI97|H772B4C285198 +772B4C285198:lI109|H772B4C285518 +772B4C285518:lI95|H772B4C285898 +772B4C285898:lI102|H772B4C285C18 +772B4C285C18:lI105|H772B4C285F98 +772B4C285F98:lI108|H772B4C286318 +772B4C286318:lI101|H772B4C286668 +772B4C286668:lI46|H772B4C286998 +772B4C286998:lI98|H772B4C286C98 +772B4C286C98:lI101|H772B4C286F88 +772B4C286F88:lI97|H772B4C287248 +772B4C287248:lI109|N +772B4C289680:lH772B4C284AA8|N +772B4C284AA8:lI99|H772B4C284E28 +772B4C284E28:lI111|H772B4C2851A8 +772B4C2851A8:lI100|H772B4C285528 +772B4C285528:lI101|H772B4C2858A8 +772B4C2858A8:lI46|H772B4C285C28 +772B4C285C28:lI98|H772B4C285FA8 +772B4C285FA8:lI101|H772B4C286328 +772B4C286328:lI97|H772B4C286678 +772B4C286678:lI109|N +772B4C2884B0:Mn4:H772B4C288C90,H772B4C288CA0,H772B4C288CB0,H772B4C288CC0 +772B4C288C90:lH772B4C284948|N +772B4C284948:lI103|H772B4C284CC8 +772B4C284CC8:lI101|H772B4C285048 +772B4C285048:lI110|H772B4C2853C8 +772B4C2853C8:lI95|H772B4C285748 +772B4C285748:lI117|H772B4C285AC8 +772B4C285AC8:lI100|H772B4C285E48 +772B4C285E48:lI112|H772B4C2861C8 +772B4C2861C8:lI46|H772B4C286528 +772B4C286528:lI98|H772B4C286858 +772B4C286858:lI101|H772B4C286B68 +772B4C286B68:lI97|H772B4C286E68 +772B4C286E68:lI109|N +772B4C288CC0:lH772B4C289660|N +772B4C289660:lI105|H772B4C289F90 +772B4C289F90:lI110|H772B4C28A868 +772B4C28A868:lI101|H772B4C28B148 +772B4C28B148:lI116|H772B4C28BA28 +772B4C28BA28:lI95|H772B4C28C308 +772B4C28C308:lI99|H772B4C28CBE8 +772B4C28CBE8:lI111|H772B4C28D4A8 +772B4C28D4A8:lI110|H772B4C28DD28 +772B4C28DD28:lI102|H772B4C28E558 +772B4C28E558:lI105|H772B4C28ECF8 +772B4C28ECF8:lI103|H772B4C28F3E8 +772B4C28F3E8:lI46|H772B4C28FA68 +772B4C28FA68:lI98|H772B4C28FFC8 +772B4C28FFC8:lI101|H772B4C290468 +772B4C290468:lI97|H772B4C2907F8 +772B4C2907F8:lI109|N +772B4C288CB0:lH772B4C284958|N +772B4C284958:lI114|H772B4C284CD8 +772B4C284CD8:lI97|H772B4C285058 +772B4C285058:lI119|H772B4C2853D8 +772B4C2853D8:lI95|H772B4C285758 +772B4C285758:lI102|H772B4C285AD8 +772B4C285AD8:lI105|H772B4C285E58 +772B4C285E58:lI108|H772B4C2861D8 +772B4C2861D8:lI101|H772B4C286538 +772B4C286538:lI95|H772B4C286868 +772B4C286868:lI105|H772B4C286B78 +772B4C286B78:lI111|H772B4C286E78 +772B4C286E78:lI95|H772B4C287138 +772B4C287138:lI105|H772B4C2873B8 +772B4C2873B8:lI110|H772B4C2875D8 +772B4C2875D8:lI102|H772B4C2877C8 +772B4C2877C8:lI108|H772B4C287968 +772B4C287968:lI97|H772B4C287AF8 +772B4C287AF8:lI116|H772B4C287C68 +772B4C287C68:lI101|H772B4C287D88 +772B4C287D88:lI46|H772B4C287E78 +772B4C287E78:lI98|H772B4C287F48 +772B4C287F48:lI101|H772B4C287FD8 +772B4C287FD8:lI97|H772B4C288048 +772B4C288048:lI109|N +772B4C288CA0:lH772B4C289650|N +772B4C289650:lI108|H772B4C289F80 +772B4C289F80:lI111|H772B4C28A858 +772B4C28A858:lI103|H772B4C28B138 +772B4C28B138:lI103|H772B4C28BA18 +772B4C28BA18:lI101|H772B4C28C2F8 +772B4C28C2F8:lI114|H772B4C28CBD8 +772B4C28CBD8:lI95|H772B4C28D498 +772B4C28D498:lI102|H772B4C28DD18 +772B4C28DD18:lI105|H772B4C28E548 +772B4C28E548:lI108|H772B4C28ECE8 +772B4C28ECE8:lI116|H772B4C28F3D8 +772B4C28F3D8:lI101|H772B4C28FA58 +772B4C28FA58:lI114|H772B4C28FFB8 +772B4C28FFB8:lI115|H772B4C290458 +772B4C290458:lI46|H772B4C2907E8 +772B4C2907E8:lI98|H772B4C290AE8 +772B4C290AE8:lI101|H772B4C290D68 +772B4C290D68:lI97|H772B4C290F48 +772B4C290F48:lI109|N +772B4C288468:Mn8:H772B4C288C00,H772B4C288C10,H772B4C288C20,H772B4C288C30,H772B4C288C40,H772B4C288C60,H772B4C288C70,H772B4C288C80 +772B4C288C00:lH772B4C284908|N +772B4C284908:lI100|H772B4C284C88 +772B4C284C88:lI105|H772B4C285008 +772B4C285008:lI115|H772B4C285388 +772B4C285388:lI107|H772B4C285708 +772B4C285708:lI95|H772B4C285A88 +772B4C285A88:lI108|H772B4C285E08 +772B4C285E08:lI111|H772B4C286188 +772B4C286188:lI103|H772B4C2864E8 +772B4C2864E8:lI46|H772B4C286818 +772B4C286818:lI98|H772B4C286B28 +772B4C286B28:lI101|H772B4C286E28 +772B4C286E28:lI97|H772B4C2870F8 +772B4C2870F8:lI109|N +772B4C288C80:lH772B4C284938|N +772B4C284938:lI108|H772B4C284CB8 +772B4C284CB8:lI111|H772B4C285038 +772B4C285038:lI103|H772B4C2853B8 +772B4C2853B8:lI103|H772B4C285738 +772B4C285738:lI101|H772B4C285AB8 +772B4C285AB8:lI114|H772B4C285E38 +772B4C285E38:lI95|H772B4C2861B8 +772B4C2861B8:lI111|H772B4C286518 +772B4C286518:lI108|H772B4C286848 +772B4C286848:lI112|H772B4C286B58 +772B4C286B58:lI46|H772B4C286E58 +772B4C286E58:lI98|H772B4C287128 +772B4C287128:lI101|H772B4C2873A8 +772B4C2873A8:lI97|H772B4C2875C8 +772B4C2875C8:lI109|N +772B4C288C70:lH772B4C289640|N +772B4C289640:lI101|H772B4C289F70 +772B4C289F70:lI114|H772B4C28A848 +772B4C28A848:lI108|H772B4C28B128 +772B4C28B128:lI95|H772B4C28BA08 +772B4C28BA08:lI99|H772B4C28C2E8 +772B4C28C2E8:lI111|H772B4C28CBC8 +772B4C28CBC8:lI109|H772B4C28D488 +772B4C28D488:lI112|H772B4C28DD08 +772B4C28DD08:lI105|H772B4C28E538 +772B4C28E538:lI108|H772B4C28ECD8 +772B4C28ECD8:lI101|H772B4C28F3C8 +772B4C28F3C8:lI95|H772B4C28FA48 +772B4C28FA48:lI115|H772B4C28FFA8 +772B4C28FFA8:lI101|H772B4C290448 +772B4C290448:lI114|H772B4C2907D8 +772B4C2907D8:lI118|H772B4C290AD8 +772B4C290AD8:lI101|H772B4C290D58 +772B4C290D58:lI114|H772B4C290F38 +772B4C290F38:lI46|H772B4C2910A8 +772B4C2910A8:lI98|H772B4C291178 +772B4C291178:lI101|H772B4C291238 +772B4C291238:lI97|H772B4C2912E8 +772B4C2912E8:lI109|N +772B4C288C60:lH772B4C284928|N +772B4C284928:lI100|H772B4C284CA8 +772B4C284CA8:lI105|H772B4C285028 +772B4C285028:lI115|H772B4C2853A8 +772B4C2853A8:lI116|H772B4C285728 +772B4C285728:lI95|H772B4C285AA8 +772B4C285AA8:lI117|H772B4C285E28 +772B4C285E28:lI116|H772B4C2861A8 +772B4C2861A8:lI105|H772B4C286508 +772B4C286508:lI108|H772B4C286838 +772B4C286838:lI46|H772B4C286B48 +772B4C286B48:lI98|H772B4C286E48 +772B4C286E48:lI101|H772B4C287118 +772B4C287118:lI97|H772B4C287398 +772B4C287398:lI109|N +772B4C288C40:Mn3:H772B4C289610,H772B4C289620,H772B4C289630 +772B4C289610:lH772B4C284A78|N +772B4C284A78:lI114|H772B4C284DF8 +772B4C284DF8:lI112|H772B4C285178 +772B4C285178:lI99|H772B4C2854F8 +772B4C2854F8:lI46|H772B4C285878 +772B4C285878:lI98|H772B4C285BF8 +772B4C285BF8:lI101|H772B4C285F78 +772B4C285F78:lI97|H772B4C2862F8 +772B4C2862F8:lI109|N +772B4C289630:lH772B4C284A88|N +772B4C284A88:lI107|H772B4C284E08 +772B4C284E08:lI101|H772B4C285188 +772B4C285188:lI114|H772B4C285508 +772B4C285508:lI110|H772B4C285888 +772B4C285888:lI101|H772B4C285C08 +772B4C285C08:lI108|H772B4C285F88 +772B4C285F88:lI46|H772B4C286308 +772B4C286308:lI97|H772B4C286658 +772B4C286658:lI112|H772B4C286988 +772B4C286988:lI112|N +772B4C289620:lH772B4C289F60|N +772B4C289F60:lI104|H772B4C28A838 +772B4C28A838:lI101|H772B4C28B118 +772B4C28B118:lI97|H772B4C28B9F8 +772B4C28B9F8:lI114|H772B4C28C2D8 +772B4C28C2D8:lI116|H772B4C28CBB8 +772B4C28CBB8:lI46|H772B4C28D478 +772B4C28D478:lI98|H772B4C28DCF8 +772B4C28DCF8:lI101|H772B4C28E528 +772B4C28E528:lI97|H772B4C28ECC8 +772B4C28ECC8:lI109|N +772B4C288C30:lH772B4C289600|N +772B4C289600:lI108|H772B4C289F50 +772B4C289F50:lI111|H772B4C28A828 +772B4C28A828:lI103|H772B4C28B108 +772B4C28B108:lI103|H772B4C28B9E8 +772B4C28B9E8:lI101|H772B4C28C2C8 +772B4C28C2C8:lI114|H772B4C28CBA8 +772B4C28CBA8:lI46|H772B4C28D468 +772B4C28D468:lI98|H772B4C28DCE8 +772B4C28DCE8:lI101|H772B4C28E518 +772B4C28E518:lI97|H772B4C28ECB8 +772B4C28ECB8:lI109|N +772B4C288C20:lH772B4C2895F0|N +772B4C2895F0:lI110|H772B4C289F40 +772B4C289F40:lI101|H772B4C28A818 +772B4C28A818:lI116|H772B4C28B0F8 +772B4C28B0F8:lI95|H772B4C28B9D8 +772B4C28B9D8:lI107|H772B4C28C2B8 +772B4C28C2B8:lI101|H772B4C28CB98 +772B4C28CB98:lI114|H772B4C28D458 +772B4C28D458:lI110|H772B4C28DCD8 +772B4C28DCD8:lI101|H772B4C28E508 +772B4C28E508:lI108|H772B4C28ECA8 +772B4C28ECA8:lI46|H772B4C28F3B8 +772B4C28F3B8:lI98|H772B4C28FA38 +772B4C28FA38:lI101|H772B4C28FF98 +772B4C28FF98:lI97|H772B4C290438 +772B4C290438:lI109|N +772B4C288C10:lH772B4C284918|N +772B4C284918:lI108|H772B4C284C98 +772B4C284C98:lI111|H772B4C285018 +772B4C285018:lI103|H772B4C285398 +772B4C285398:lI103|H772B4C285718 +772B4C285718:lI101|H772B4C285A98 +772B4C285A98:lI114|H772B4C285E18 +772B4C285E18:lI95|H772B4C286198 +772B4C286198:lI115|H772B4C2864F8 +772B4C2864F8:lI116|H772B4C286828 +772B4C286828:lI100|H772B4C286B38 +772B4C286B38:lI95|H772B4C286E38 +772B4C286E38:lI104|H772B4C287108 +772B4C287108:lI46|H772B4C287388 +772B4C287388:lI98|H772B4C2875B8 +772B4C2875B8:lI101|H772B4C2877B8 +772B4C2877B8:lI97|H772B4C287958 +772B4C287958:lI109|N +772B4C288440:Mn4:H772B4C288BC0,H772B4C288BD0,H772B4C288BE0,H772B4C288BF0 +772B4C288BC0:lH772B4C2848C8|N +772B4C2848C8:lI110|H772B4C284C48 +772B4C284C48:lI101|H772B4C284FC8 +772B4C284FC8:lI116|H772B4C285348 +772B4C285348:lI95|H772B4C2856C8 +772B4C2856C8:lI97|H772B4C285A48 +772B4C285A48:lI100|H772B4C285DC8 +772B4C285DC8:lI109|H772B4C286148 +772B4C286148:lI46|H772B4C2864A8 +772B4C2864A8:lI98|H772B4C2867D8 +772B4C2867D8:lI101|H772B4C286AF8 +772B4C286AF8:lI97|H772B4C286DF8 +772B4C286DF8:lI109|N +772B4C288BF0:lH772B4C2848F8|N +772B4C2848F8:lI101|H772B4C284C78 +772B4C284C78:lI114|H772B4C284FF8 +772B4C284FF8:lI108|H772B4C285378 +772B4C285378:lI95|H772B4C2856F8 +772B4C2856F8:lI114|H772B4C285A78 +772B4C285A78:lI101|H772B4C285DF8 +772B4C285DF8:lI112|H772B4C286178 +772B4C286178:lI108|H772B4C2864D8 +772B4C2864D8:lI121|H772B4C286808 +772B4C286808:lI46|H772B4C286B18 +772B4C286B18:lI98|H772B4C286E18 +772B4C286E18:lI101|H772B4C2870E8 +772B4C2870E8:lI97|H772B4C287378 +772B4C287378:lI109|N +772B4C288BE0:lH772B4C2848E8|N +772B4C2848E8:lI114|H772B4C284C68 +772B4C284C68:lI97|H772B4C284FE8 +772B4C284FE8:lI119|H772B4C285368 +772B4C285368:lI95|H772B4C2856E8 +772B4C2856E8:lI102|H772B4C285A68 +772B4C285A68:lI105|H772B4C285DE8 +772B4C285DE8:lI108|H772B4C286168 +772B4C286168:lI101|H772B4C2864C8 +772B4C2864C8:lI95|H772B4C2867F8 +772B4C2867F8:lI105|H772B4C286B08 +772B4C286B08:lI111|H772B4C286E08 +772B4C286E08:lI95|H772B4C2870D8 +772B4C2870D8:lI99|H772B4C287368 +772B4C287368:lI111|H772B4C2875A8 +772B4C2875A8:lI109|H772B4C2877A8 +772B4C2877A8:lI112|H772B4C287948 +772B4C287948:lI114|H772B4C287AE8 +772B4C287AE8:lI101|H772B4C287C58 +772B4C287C58:lI115|H772B4C287D78 +772B4C287D78:lI115|H772B4C287E68 +772B4C287E68:lI101|H772B4C287F38 +772B4C287F38:lI100|H772B4C287FC8 +772B4C287FC8:lI46|H772B4C288038 +772B4C288038:lI98|H772B4C288088 +772B4C288088:lI101|H772B4C2880B8 +772B4C2880B8:lI97|H772B4C2880E8 +772B4C2880E8:lI109|N +772B4C288BD0:lH772B4C2848D8|N +772B4C2848D8:lI116|H772B4C284C58 +772B4C284C58:lI114|H772B4C284FD8 +772B4C284FD8:lI97|H772B4C285358 +772B4C285358:lI99|H772B4C2856D8 +772B4C2856D8:lI101|H772B4C285A58 +772B4C285A58:lI46|H772B4C285DD8 +772B4C285DD8:lI98|H772B4C286158 +772B4C286158:lI101|H772B4C2864B8 +772B4C2864B8:lI97|H772B4C2867E8 +772B4C2867E8:lI109|N +772B4C288428:Mn2:H772B4C288BA0,H772B4C288BB0 +772B4C288BA0:Mn1:H772B4C2895D8 +772B4C2895D8:Mn2:H772B4C289F20,H772B4C289F30 +772B4C289F20:lH772B4C28A7F8|N +772B4C28A7F8:lI101|H772B4C28B0D8 +772B4C28B0D8:lI114|H772B4C28B9B8 +772B4C28B9B8:lI108|H772B4C28C298 +772B4C28C298:lI95|H772B4C28CB78 +772B4C28CB78:lI107|H772B4C28D438 +772B4C28D438:lI101|H772B4C28DCB8 +772B4C28DCB8:lI114|H772B4C28E4E8 +772B4C28E4E8:lI110|H772B4C28EC88 +772B4C28EC88:lI101|H772B4C28F398 +772B4C28F398:lI108|H772B4C28FA18 +772B4C28FA18:lI95|H772B4C28FF88 +772B4C28FF88:lI101|H772B4C290428 +772B4C290428:lI114|H772B4C2907C8 +772B4C2907C8:lI114|H772B4C290AC8 +772B4C290AC8:lI111|H772B4C290D48 +772B4C290D48:lI114|H772B4C290F28 +772B4C290F28:lI115|H772B4C291098 +772B4C291098:lI46|H772B4C291168 +772B4C291168:lI98|H772B4C291228 +772B4C291228:lI101|H772B4C2912D8 +772B4C2912D8:lI97|H772B4C291368 +772B4C291368:lI109|N +772B4C289F30:lH772B4C28A808|N +772B4C28A808:lI103|H772B4C28B0E8 +772B4C28B0E8:lI108|H772B4C28B9C8 +772B4C28B9C8:lI111|H772B4C28C2A8 +772B4C28C2A8:lI98|H772B4C28CB88 +772B4C28CB88:lI97|H772B4C28D448 +772B4C28D448:lI108|H772B4C28DCC8 +772B4C28DCC8:lI46|H772B4C28E4F8 +772B4C28E4F8:lI98|H772B4C28EC98 +772B4C28EC98:lI101|H772B4C28F3A8 +772B4C28F3A8:lI97|H772B4C28FA28 +772B4C28FA28:lI109|N +772B4C288BB0:lH772B4C2848B8|N +772B4C2848B8:lI105|H772B4C284C38 +772B4C284C38:lI110|H772B4C284FB8 +772B4C284FB8:lI101|H772B4C285338 +772B4C285338:lI116|H772B4C2856B8 +772B4C2856B8:lI95|H772B4C285A38 +772B4C285A38:lI101|H772B4C285DB8 +772B4C285DB8:lI112|H772B4C286138 +772B4C286138:lI109|H772B4C286498 +772B4C286498:lI100|H772B4C2867C8 +772B4C2867C8:lI95|H772B4C286AE8 +772B4C286AE8:lI100|H772B4C286DE8 +772B4C286DE8:lI105|H772B4C2870C8 +772B4C2870C8:lI115|H772B4C287358 +772B4C287358:lI116|H772B4C287598 +772B4C287598:lI46|H772B4C287798 +772B4C287798:lI98|H772B4C287938 +772B4C287938:lI101|H772B4C287AD8 +772B4C287AD8:lI97|H772B4C287C48 +772B4C287C48:lI109|N +772B4C2883F0:Mn6:H772B4C288B40,H772B4C288B50,H772B4C288B60,H772B4C288B70,H772B4C288B80,H772B4C288B90 +772B4C288B40:lH772B4C2895B8|N +772B4C2895B8:lI103|H772B4C289F00 +772B4C289F00:lI114|H772B4C28A7D8 +772B4C28A7D8:lI111|H772B4C28B0B8 +772B4C28B0B8:lI117|H772B4C28B998 +772B4C28B998:lI112|H772B4C28C278 +772B4C28C278:lI46|H772B4C28CB58 +772B4C28CB58:lI98|H772B4C28D418 +772B4C28D418:lI101|H772B4C28DC98 +772B4C28DC98:lI97|H772B4C28E4C8 +772B4C28E4C8:lI109|N +772B4C288B90:lH772B4C2848A8|N +772B4C2848A8:lI97|H772B4C284C28 +772B4C284C28:lI117|H772B4C284FA8 +772B4C284FA8:lI116|H772B4C285328 +772B4C285328:lI104|H772B4C2856A8 +772B4C2856A8:lI46|H772B4C285A28 +772B4C285A28:lI98|H772B4C285DA8 +772B4C285DA8:lI101|H772B4C286128 +772B4C286128:lI97|H772B4C286488 +772B4C286488:lI109|N +772B4C288B80:lH772B4C284898|N +772B4C284898:lI105|H772B4C284C18 +772B4C284C18:lI110|H772B4C284F98 +772B4C284F98:lI101|H772B4C285318 +772B4C285318:lI116|H772B4C285698 +772B4C285698:lI95|H772B4C285A18 +772B4C285A18:lI117|H772B4C285D98 +772B4C285D98:lI100|H772B4C286118 +772B4C286118:lI112|H772B4C286478 +772B4C286478:lI46|H772B4C2867B8 +772B4C2867B8:lI98|H772B4C286AD8 +772B4C286AD8:lI101|H772B4C286DD8 +772B4C286DD8:lI97|H772B4C2870B8 +772B4C2870B8:lI109|N +772B4C288B70:lH772B4C284888|N +772B4C284888:lI102|H772B4C284C08 +772B4C284C08:lI105|H772B4C284F88 +772B4C284F88:lI108|H772B4C285308 +772B4C285308:lI101|H772B4C285688 +772B4C285688:lI46|H772B4C285A08 +772B4C285A08:lI98|H772B4C285D88 +772B4C285D88:lI101|H772B4C286108 +772B4C286108:lI97|H772B4C286468 +772B4C286468:lI109|N +772B4C288B60:lH772B4C284878|N +772B4C284878:lI101|H772B4C284BF8 +772B4C284BF8:lI114|H772B4C284F78 +772B4C284F78:lI108|H772B4C2852F8 +772B4C2852F8:lI95|H772B4C285678 +772B4C285678:lI115|H772B4C2859F8 +772B4C2859F8:lI105|H772B4C285D78 +772B4C285D78:lI103|H772B4C2860F8 +772B4C2860F8:lI110|H772B4C286458 +772B4C286458:lI97|H772B4C2867A8 +772B4C2867A8:lI108|H772B4C286AC8 +772B4C286AC8:lI95|H772B4C286DC8 +772B4C286DC8:lI104|H772B4C2870A8 +772B4C2870A8:lI97|H772B4C287348 +772B4C287348:lI110|H772B4C287588 +772B4C287588:lI100|H772B4C287788 +772B4C287788:lI108|H772B4C287928 +772B4C287928:lI101|H772B4C287AC8 +772B4C287AC8:lI114|H772B4C287C38 +772B4C287C38:lI46|H772B4C287D68 +772B4C287D68:lI98|H772B4C287E58 +772B4C287E58:lI101|H772B4C287F28 +772B4C287F28:lI97|H772B4C287FB8 +772B4C287FB8:lI109|N +772B4C288B50:lH772B4C2895C8|N +772B4C2895C8:lI99|H772B4C289F10 +772B4C289F10:lI111|H772B4C28A7E8 +772B4C28A7E8:lI100|H772B4C28B0C8 +772B4C28B0C8:lI101|H772B4C28B9A8 +772B4C28B9A8:lI95|H772B4C28C288 +772B4C28C288:lI115|H772B4C28CB68 +772B4C28CB68:lI101|H772B4C28D428 +772B4C28D428:lI114|H772B4C28DCA8 +772B4C28DCA8:lI118|H772B4C28E4D8 +772B4C28E4D8:lI101|H772B4C28EC78 +772B4C28EC78:lI114|H772B4C28F388 +772B4C28F388:lI46|H772B4C28FA08 +772B4C28FA08:lI98|H772B4C28FF78 +772B4C28FF78:lI101|H772B4C290418 +772B4C290418:lI97|H772B4C2907B8 +772B4C2907B8:lI109|N +772B4C2883C0:Mn5:H772B4C288AE8,H772B4C288B00,H772B4C288B10,H772B4C288B20,H772B4C288B30 +772B4C288AE8:Mn2:H772B4C289558,H772B4C289568 +772B4C289558:lH772B4C289EB0|N +772B4C289EB0:lI97|H772B4C28A788 +772B4C28A788:lI112|H772B4C28B068 +772B4C28B068:lI112|H772B4C28B948 +772B4C28B948:lI108|H772B4C28C228 +772B4C28C228:lI105|H772B4C28CB08 +772B4C28CB08:lI99|H772B4C28D3C8 +772B4C28D3C8:lI97|H772B4C28DC48 +772B4C28DC48:lI116|H772B4C28E478 +772B4C28E478:lI105|H772B4C28EC28 +772B4C28EC28:lI111|H772B4C28F338 +772B4C28F338:lI110|H772B4C28F9B8 +772B4C28F9B8:lI46|H772B4C28FF38 +772B4C28FF38:lI98|H772B4C2903D8 +772B4C2903D8:lI101|H772B4C290778 +772B4C290778:lI97|H772B4C290A88 +772B4C290A88:lI109|N +772B4C289568:lH772B4C284A68|N +772B4C284A68:lI114|H772B4C284DE8 +772B4C284DE8:lI97|H772B4C285168 +772B4C285168:lI119|H772B4C2854E8 +772B4C2854E8:lI95|H772B4C285868 +772B4C285868:lI102|H772B4C285BE8 +772B4C285BE8:lI105|H772B4C285F68 +772B4C285F68:lI108|H772B4C2862E8 +772B4C2862E8:lI101|H772B4C286648 +772B4C286648:lI95|H772B4C286978 +772B4C286978:lI105|H772B4C286C88 +772B4C286C88:lI111|H772B4C286F78 +772B4C286F78:lI95|H772B4C287238 +772B4C287238:lI108|H772B4C2874A8 +772B4C2874A8:lI105|H772B4C2876B8 +772B4C2876B8:lI115|H772B4C287868 +772B4C287868:lI116|H772B4C287A08 +772B4C287A08:lI46|H772B4C287B88 +772B4C287B88:lI98|H772B4C287CD8 +772B4C287CD8:lI101|H772B4C287DE8 +772B4C287DE8:lI97|H772B4C287EB8 +772B4C287EB8:lI109|N +772B4C288B30:lH772B4C2895A8|N +772B4C2895A8:lI101|H772B4C289EF0 +772B4C289EF0:lI114|H772B4C28A7C8 +772B4C28A7C8:lI114|H772B4C28B0A8 +772B4C28B0A8:lI111|H772B4C28B988 +772B4C28B988:lI114|H772B4C28C268 +772B4C28C268:lI95|H772B4C28CB48 +772B4C28CB48:lI104|H772B4C28D408 +772B4C28D408:lI97|H772B4C28DC88 +772B4C28DC88:lI110|H772B4C28E4B8 +772B4C28E4B8:lI100|H772B4C28EC68 +772B4C28EC68:lI108|H772B4C28F378 +772B4C28F378:lI101|H772B4C28F9F8 +772B4C28F9F8:lI114|H772B4C28FF68 +772B4C28FF68:lI46|H772B4C290408 +772B4C290408:lI98|H772B4C2907A8 +772B4C2907A8:lI101|H772B4C290AB8 +772B4C290AB8:lI97|H772B4C290D38 +772B4C290D38:lI109|N +772B4C288B20:lH772B4C289598|N +772B4C289598:lI102|H772B4C289EE0 +772B4C289EE0:lI105|H772B4C28A7B8 +772B4C28A7B8:lI108|H772B4C28B098 +772B4C28B098:lI101|H772B4C28B978 +772B4C28B978:lI95|H772B4C28C258 +772B4C28C258:lI105|H772B4C28CB38 +772B4C28CB38:lI111|H772B4C28D3F8 +772B4C28D3F8:lI95|H772B4C28DC78 +772B4C28DC78:lI115|H772B4C28E4A8 +772B4C28E4A8:lI101|H772B4C28EC58 +772B4C28EC58:lI114|H772B4C28F368 +772B4C28F368:lI118|H772B4C28F9E8 +772B4C28F9E8:lI101|H772B4C28FF58 +772B4C28FF58:lI114|H772B4C2903F8 +772B4C2903F8:lI46|H772B4C290798 +772B4C290798:lI98|H772B4C290AA8 +772B4C290AA8:lI101|H772B4C290D28 +772B4C290D28:lI97|H772B4C290F18 +772B4C290F18:lI109|N +772B4C288B10:lH772B4C289588|N +772B4C289588:lI105|H772B4C289ED0 +772B4C289ED0:lI110|H772B4C28A7A8 +772B4C28A7A8:lI101|H772B4C28B088 +772B4C28B088:lI116|H772B4C28B968 +772B4C28B968:lI95|H772B4C28C248 +772B4C28C248:lI116|H772B4C28CB28 +772B4C28CB28:lI99|H772B4C28D3E8 +772B4C28D3E8:lI112|H772B4C28DC68 +772B4C28DC68:lI95|H772B4C28E498 +772B4C28E498:lI100|H772B4C28EC48 +772B4C28EC48:lI105|H772B4C28F358 +772B4C28F358:lI115|H772B4C28F9D8 +772B4C28F9D8:lI116|H772B4C28FF48 +772B4C28FF48:lI46|H772B4C2903E8 +772B4C2903E8:lI98|H772B4C290788 +772B4C290788:lI101|H772B4C290A98 +772B4C290A98:lI97|H772B4C290D18 +772B4C290D18:lI109|N +772B4C288B00:lH772B4C289578|N +772B4C289578:lI101|H772B4C289EC0 +772B4C289EC0:lI114|H772B4C28A798 +772B4C28A798:lI108|H772B4C28B078 +772B4C28B078:lI95|H772B4C28B958 +772B4C28B958:lI101|H772B4C28C238 +772B4C28C238:lI112|H772B4C28CB18 +772B4C28CB18:lI109|H772B4C28D3D8 +772B4C28D3D8:lI100|H772B4C28DC58 +772B4C28DC58:lI46|H772B4C28E488 +772B4C28E488:lI98|H772B4C28EC38 +772B4C28EC38:lI101|H772B4C28F348 +772B4C28F348:lI97|H772B4C28F9C8 +772B4C28F9C8:lI109|N +772B4C288388:Mn6:H772B4C288A70,H772B4C288A80,H772B4C288A98,H772B4C288AB0,H772B4C288AC0,H772B4C288AD0 +772B4C288A70:lH772B4C284858|N +772B4C284858:lI105|H772B4C284BD8 +772B4C284BD8:lI110|H772B4C284F58 +772B4C284F58:lI101|H772B4C2852D8 +772B4C2852D8:lI116|H772B4C285658 +772B4C285658:lI95|H772B4C2859D8 +772B4C2859D8:lI115|H772B4C285D58 +772B4C285D58:lI99|H772B4C2860D8 +772B4C2860D8:lI116|H772B4C286438 +772B4C286438:lI112|H772B4C286788 +772B4C286788:lI46|H772B4C286AA8 +772B4C286AA8:lI98|H772B4C286DA8 +772B4C286DA8:lI101|H772B4C287088 +772B4C287088:lI97|H772B4C287328 +772B4C287328:lI109|N +772B4C288AD0:Mn2:H772B4C289538,H772B4C289548 +772B4C289538:lH772B4C289E90|N +772B4C289E90:lI114|H772B4C28A768 +772B4C28A768:lI97|H772B4C28B048 +772B4C28B048:lI119|H772B4C28B928 +772B4C28B928:lI95|H772B4C28C208 +772B4C28C208:lI102|H772B4C28CAE8 +772B4C28CAE8:lI105|H772B4C28D3A8 +772B4C28D3A8:lI108|H772B4C28DC28 +772B4C28DC28:lI101|H772B4C28E458 +772B4C28E458:lI95|H772B4C28EC08 +772B4C28EC08:lI105|H772B4C28F318 +772B4C28F318:lI111|H772B4C28F998 +772B4C28F998:lI46|H772B4C28FF18 +772B4C28FF18:lI98|H772B4C2903C8 +772B4C2903C8:lI101|H772B4C290768 +772B4C290768:lI97|H772B4C290A78 +772B4C290A78:lI109|N +772B4C289548:lH772B4C289EA0|N +772B4C289EA0:lI117|H772B4C28A778 +772B4C28A778:lI115|H772B4C28B058 +772B4C28B058:lI101|H772B4C28B938 +772B4C28B938:lI114|H772B4C28C218 +772B4C28C218:lI95|H772B4C28CAF8 +772B4C28CAF8:lI100|H772B4C28D3B8 +772B4C28D3B8:lI114|H772B4C28DC38 +772B4C28DC38:lI118|H772B4C28E468 +772B4C28E468:lI46|H772B4C28EC18 +772B4C28EC18:lI98|H772B4C28F328 +772B4C28F328:lI101|H772B4C28F9A8 +772B4C28F9A8:lI97|H772B4C28FF28 +772B4C28FF28:lI109|N +772B4C288AC0:lH772B4C284868|N +772B4C284868:lI101|H772B4C284BE8 +772B4C284BE8:lI114|H772B4C284F68 +772B4C284F68:lI108|H772B4C2852E8 +772B4C2852E8:lI95|H772B4C285668 +772B4C285668:lI101|H772B4C2859E8 +772B4C2859E8:lI114|H772B4C285D68 +772B4C285D68:lI116|H772B4C2860E8 +772B4C2860E8:lI115|H772B4C286448 +772B4C286448:lI95|H772B4C286798 +772B4C286798:lI101|H772B4C286AB8 +772B4C286AB8:lI114|H772B4C286DB8 +772B4C286DB8:lI114|H772B4C287098 +772B4C287098:lI111|H772B4C287338 +772B4C287338:lI114|H772B4C287578 +772B4C287578:lI115|H772B4C287778 +772B4C287778:lI46|H772B4C287918 +772B4C287918:lI98|H772B4C287AB8 +772B4C287AB8:lI101|H772B4C287C28 +772B4C287C28:lI97|H772B4C287D58 +772B4C287D58:lI109|N +772B4C288AB0:lH772B4C289528|N +772B4C289528:lI115|H772B4C289E80 +772B4C289E80:lI116|H772B4C28A758 +772B4C28A758:lI97|H772B4C28B038 +772B4C28B038:lI110|H772B4C28B918 +772B4C28B918:lI100|H772B4C28C1F8 +772B4C28C1F8:lI97|H772B4C28CAD8 +772B4C28CAD8:lI114|H772B4C28D398 +772B4C28D398:lI100|H772B4C28DC18 +772B4C28DC18:lI95|H772B4C28E448 +772B4C28E448:lI101|H772B4C28EBF8 +772B4C28EBF8:lI114|H772B4C28F308 +772B4C28F308:lI114|H772B4C28F988 +772B4C28F988:lI111|H772B4C28FF08 +772B4C28FF08:lI114|H772B4C2903B8 +772B4C2903B8:lI46|H772B4C290758 +772B4C290758:lI98|H772B4C290A68 +772B4C290A68:lI101|H772B4C290D08 +772B4C290D08:lI97|H772B4C290F08 +772B4C290F08:lI109|N +772B4C288A98:Mn2:H772B4C289508,H772B4C289518 +772B4C289508:lH772B4C289E70|N +772B4C289E70:lI105|H772B4C28A748 +772B4C28A748:lI110|H772B4C28B028 +772B4C28B028:lI101|H772B4C28B908 +772B4C28B908:lI116|H772B4C28C1E8 +772B4C28C1E8:lI95|H772B4C28CAC8 +772B4C28CAC8:lI103|H772B4C28D388 +772B4C28D388:lI101|H772B4C28DC08 +772B4C28DC08:lI116|H772B4C28E438 +772B4C28E438:lI104|H772B4C28EBE8 +772B4C28EBE8:lI111|H772B4C28F2F8 +772B4C28F2F8:lI115|H772B4C28F978 +772B4C28F978:lI116|H772B4C28FEF8 +772B4C28FEF8:lI95|H772B4C2903A8 +772B4C2903A8:lI110|H772B4C290748 +772B4C290748:lI97|H772B4C290A58 +772B4C290A58:lI116|H772B4C290CF8 +772B4C290CF8:lI105|H772B4C290EF8 +772B4C290EF8:lI118|H772B4C291088 +772B4C291088:lI101|H772B4C291158 +772B4C291158:lI46|H772B4C291218 +772B4C291218:lI98|H772B4C2912C8 +772B4C2912C8:lI101|H772B4C291358 +772B4C291358:lI97|H772B4C2913B8 +772B4C2913B8:lI109|N +772B4C289518:lH772B4C284A58|N +772B4C284A58:lI100|H772B4C284DD8 +772B4C284DD8:lI105|H772B4C285158 +772B4C285158:lI115|H772B4C2854D8 +772B4C2854D8:lI107|H772B4C285858 +772B4C285858:lI95|H772B4C285BD8 +772B4C285BD8:lI108|H772B4C285F58 +772B4C285F58:lI111|H772B4C2862D8 +772B4C2862D8:lI103|H772B4C286638 +772B4C286638:lI95|H772B4C286968 +772B4C286968:lI115|H772B4C286C78 +772B4C286C78:lI117|H772B4C286F68 +772B4C286F68:lI112|H772B4C287228 +772B4C287228:lI46|H772B4C287498 +772B4C287498:lI98|H772B4C2876A8 +772B4C2876A8:lI101|H772B4C287858 +772B4C287858:lI97|H772B4C2879F8 +772B4C2879F8:lI109|N +772B4C288A80:Mn2:H772B4C2894E8,H772B4C2894F8 +772B4C2894E8:lH772B4C289E60|N +772B4C289E60:lI111|H772B4C28A738 +772B4C28A738:lI115|H772B4C28B018 +772B4C28B018:lI46|H772B4C28B8F8 +772B4C28B8F8:lI98|H772B4C28C1D8 +772B4C28C1D8:lI101|H772B4C28CAB8 +772B4C28CAB8:lI97|H772B4C28D378 +772B4C28D378:lI109|N +772B4C2894F8:lH772B4C284A48|N +772B4C284A48:lI103|H772B4C284DC8 +772B4C284DC8:lI101|H772B4C285148 +772B4C285148:lI110|H772B4C2854C8 +772B4C2854C8:lI95|H772B4C285848 +772B4C285848:lI117|H772B4C285BC8 +772B4C285BC8:lI100|H772B4C285F48 +772B4C285F48:lI112|H772B4C2862C8 +772B4C2862C8:lI95|H772B4C286628 +772B4C286628:lI115|H772B4C286958 +772B4C286958:lI111|H772B4C286C68 +772B4C286C68:lI99|H772B4C286F58 +772B4C286F58:lI107|H772B4C287218 +772B4C287218:lI101|H772B4C287488 +772B4C287488:lI116|H772B4C287698 +772B4C287698:lI46|H772B4C287848 +772B4C287848:lI98|H772B4C2879E8 +772B4C2879E8:lI101|H772B4C287B78 +772B4C287B78:lI97|H772B4C287CC8 +772B4C287CC8:lI109|N +772B4C288360:Mn4:H772B4C288A28,H772B4C288A38,H772B4C288A50,H772B4C288A60 +772B4C288A28:lH772B4C284838|N +772B4C284838:lI107|H772B4C284BB8 +772B4C284BB8:lI101|H772B4C284F38 +772B4C284F38:lI114|H772B4C2852B8 +772B4C2852B8:lI110|H772B4C285638 +772B4C285638:lI101|H772B4C2859B8 +772B4C2859B8:lI108|H772B4C285D38 +772B4C285D38:lI95|H772B4C2860B8 +772B4C2860B8:lI114|H772B4C286418 +772B4C286418:lI101|H772B4C286768 +772B4C286768:lI102|H772B4C286A88 +772B4C286A88:lI99|H772B4C286D88 +772B4C286D88:lI46|H772B4C287068 +772B4C287068:lI98|H772B4C287318 +772B4C287318:lI101|H772B4C287568 +772B4C287568:lI97|H772B4C287768 +772B4C287768:lI109|N +772B4C288A60:lH772B4C2894D8|N +772B4C2894D8:lI108|H772B4C289E50 +772B4C289E50:lI111|H772B4C28A728 +772B4C28A728:lI103|H772B4C28B008 +772B4C28B008:lI103|H772B4C28B8E8 +772B4C28B8E8:lI101|H772B4C28C1C8 +772B4C28C1C8:lI114|H772B4C28CAA8 +772B4C28CAA8:lI95|H772B4C28D368 +772B4C28D368:lI112|H772B4C28DBF8 +772B4C28DBF8:lI114|H772B4C28E428 +772B4C28E428:lI111|H772B4C28EBD8 +772B4C28EBD8:lI120|H772B4C28F2E8 +772B4C28F2E8:lI121|H772B4C28F968 +772B4C28F968:lI46|H772B4C28FEE8 +772B4C28FEE8:lI98|H772B4C290398 +772B4C290398:lI101|H772B4C290738 +772B4C290738:lI97|H772B4C290A48 +772B4C290A48:lI109|N +772B4C288A50:lH772B4C284848|N +772B4C284848:lI101|H772B4C284BC8 +772B4C284BC8:lI114|H772B4C284F48 +772B4C284F48:lI108|H772B4C2852C8 +772B4C2852C8:lI95|H772B4C285648 +772B4C285648:lI100|H772B4C2859C8 +772B4C2859C8:lI100|H772B4C285D48 +772B4C285D48:lI108|H772B4C2860C8 +772B4C2860C8:lI108|H772B4C286428 +772B4C286428:lI46|H772B4C286778 +772B4C286778:lI98|H772B4C286A98 +772B4C286A98:lI101|H772B4C286D98 +772B4C286D98:lI97|H772B4C287078 +772B4C287078:lI109|N +772B4C288A38:Mn2:H772B4C2894B8,H772B4C2894C8 +772B4C2894B8:lH772B4C284A38|N +772B4C284A38:lI105|H772B4C284DB8 +772B4C284DB8:lI110|H772B4C285138 +772B4C285138:lI101|H772B4C2854B8 +772B4C2854B8:lI116|H772B4C285838 +772B4C285838:lI95|H772B4C285BB8 +772B4C285BB8:lI114|H772B4C285F38 +772B4C285F38:lI101|H772B4C2862B8 +772B4C2862B8:lI115|H772B4C286618 +772B4C286618:lI46|H772B4C286948 +772B4C286948:lI98|H772B4C286C58 +772B4C286C58:lI101|H772B4C286F48 +772B4C286F48:lI97|H772B4C287208 +772B4C287208:lI109|N +772B4C2894C8:lH772B4C289E40|N +772B4C289E40:lI105|H772B4C28A718 +772B4C28A718:lI110|H772B4C28AFF8 +772B4C28AFF8:lI101|H772B4C28B8D8 +772B4C28B8D8:lI116|H772B4C28C1B8 +772B4C28C1B8:lI54|H772B4C28CA98 +772B4C28CA98:lI95|H772B4C28D358 +772B4C28D358:lI117|H772B4C28DBE8 +772B4C28DBE8:lI100|H772B4C28E418 +772B4C28E418:lI112|H772B4C28EBC8 +772B4C28EBC8:lI46|H772B4C28F2D8 +772B4C28F2D8:lI98|H772B4C28F958 +772B4C28F958:lI101|H772B4C28FED8 +772B4C28FED8:lI97|H772B4C290388 +772B4C290388:lI109|N +772B4C288328:Mn6:H772B4C2889B8,H772B4C2889D0,H772B4C2889E0,H772B4C2889F0,H772B4C288A00,H772B4C288A18 +772B4C2889B8:Mn2:H772B4C289468,H772B4C289478 +772B4C289468:lH772B4C284A18|N +772B4C284A18:lI105|H772B4C284D98 +772B4C284D98:lI110|H772B4C285118 +772B4C285118:lI101|H772B4C285498 +772B4C285498:lI116|H772B4C285818 +772B4C285818:lI54|H772B4C285B98 +772B4C285B98:lI95|H772B4C285F18 +772B4C285F18:lI115|H772B4C286298 +772B4C286298:lI99|H772B4C2865F8 +772B4C2865F8:lI116|H772B4C286928 +772B4C286928:lI112|H772B4C286C38 +772B4C286C38:lI46|H772B4C286F28 +772B4C286F28:lI98|H772B4C2871E8 +772B4C2871E8:lI101|H772B4C287468 +772B4C287468:lI97|H772B4C287678 +772B4C287678:lI109|N +772B4C289478:lH772B4C284A28|N +772B4C284A28:lI108|H772B4C284DA8 +772B4C284DA8:lI111|H772B4C285128 +772B4C285128:lI103|H772B4C2854A8 +772B4C2854A8:lI103|H772B4C285828 +772B4C285828:lI101|H772B4C285BA8 +772B4C285BA8:lI114|H772B4C285F28 +772B4C285F28:lI95|H772B4C2862A8 +772B4C2862A8:lI102|H772B4C286608 +772B4C286608:lI111|H772B4C286938 +772B4C286938:lI114|H772B4C286C48 +772B4C286C48:lI109|H772B4C286F38 +772B4C286F38:lI97|H772B4C2871F8 +772B4C2871F8:lI116|H772B4C287478 +772B4C287478:lI116|H772B4C287688 +772B4C287688:lI101|H772B4C287838 +772B4C287838:lI114|H772B4C2879D8 +772B4C2879D8:lI46|H772B4C287B68 +772B4C287B68:lI98|H772B4C287CB8 +772B4C287CB8:lI101|H772B4C287DD8 +772B4C287DD8:lI97|H772B4C287EA8 +772B4C287EA8:lI109|N +772B4C288A18:lH772B4C284828|N +772B4C284828:lI110|H772B4C284BA8 +772B4C284BA8:lI101|H772B4C284F28 +772B4C284F28:lI116|H772B4C2852A8 +772B4C2852A8:lI46|H772B4C285628 +772B4C285628:lI98|H772B4C2859A8 +772B4C2859A8:lI101|H772B4C285D28 +772B4C285D28:lI97|H772B4C2860A8 +772B4C2860A8:lI109|N +772B4C288A00:Mn2:H772B4C289498,H772B4C2894A8 +772B4C289498:lH772B4C289E20|N +772B4C289E20:lI105|H772B4C28A6F8 +772B4C28A6F8:lI110|H772B4C28AFD8 +772B4C28AFD8:lI101|H772B4C28B8B8 +772B4C28B8B8:lI116|H772B4C28C198 +772B4C28C198:lI54|H772B4C28CA78 +772B4C28CA78:lI95|H772B4C28D338 +772B4C28D338:lI116|H772B4C28DBC8 +772B4C28DBC8:lI99|H772B4C28E3F8 +772B4C28E3F8:lI112|H772B4C28EBA8 +772B4C28EBA8:lI95|H772B4C28F2B8 +772B4C28F2B8:lI100|H772B4C28F938 +772B4C28F938:lI105|H772B4C28FEB8 +772B4C28FEB8:lI115|H772B4C290368 +772B4C290368:lI116|H772B4C290728 +772B4C290728:lI46|H772B4C290A38 +772B4C290A38:lI98|H772B4C290CE8 +772B4C290CE8:lI101|H772B4C290EE8 +772B4C290EE8:lI97|H772B4C291078 +772B4C291078:lI109|N +772B4C2894A8:lH772B4C289E30|N +772B4C289E30:lI108|H772B4C28A708 +772B4C28A708:lI111|H772B4C28AFE8 +772B4C28AFE8:lI99|H772B4C28B8C8 +772B4C28B8C8:lI97|H772B4C28C1A8 +772B4C28C1A8:lI108|H772B4C28CA88 +772B4C28CA88:lI95|H772B4C28D348 +772B4C28D348:lI117|H772B4C28DBD8 +772B4C28DBD8:lI100|H772B4C28E408 +772B4C28E408:lI112|H772B4C28EBB8 +772B4C28EBB8:lI46|H772B4C28F2C8 +772B4C28F2C8:lI98|H772B4C28F948 +772B4C28F948:lI101|H772B4C28FEC8 +772B4C28FEC8:lI97|H772B4C290378 +772B4C290378:lI109|N +772B4C2889F0:lH772B4C289488|N +772B4C289488:lI100|H772B4C289E10 +772B4C289E10:lI105|H772B4C28A6E8 +772B4C28A6E8:lI115|H772B4C28AFC8 +772B4C28AFC8:lI107|H772B4C28B8A8 +772B4C28B8A8:lI95|H772B4C28C188 +772B4C28C188:lI108|H772B4C28CA68 +772B4C28CA68:lI111|H772B4C28D328 +772B4C28D328:lI103|H772B4C28DBB8 +772B4C28DBB8:lI95|H772B4C28E3E8 +772B4C28E3E8:lI115|H772B4C28EB98 +772B4C28EB98:lI101|H772B4C28F2A8 +772B4C28F2A8:lI114|H772B4C28F928 +772B4C28F928:lI118|H772B4C28FEA8 +772B4C28FEA8:lI101|H772B4C290358 +772B4C290358:lI114|H772B4C290718 +772B4C290718:lI46|H772B4C290A28 +772B4C290A28:lI98|H772B4C290CD8 +772B4C290CD8:lI101|H772B4C290ED8 +772B4C290ED8:lI97|H772B4C291068 +772B4C291068:lI109|N +772B4C2889E0:lH772B4C284818|N +772B4C284818:lI108|H772B4C284B98 +772B4C284B98:lI111|H772B4C284F18 +772B4C284F18:lI103|H772B4C285298 +772B4C285298:lI103|H772B4C285618 +772B4C285618:lI101|H772B4C285998 +772B4C285998:lI114|H772B4C285D18 +772B4C285D18:lI95|H772B4C286098 +772B4C286098:lI115|H772B4C286408 +772B4C286408:lI105|H772B4C286758 +772B4C286758:lI109|H772B4C286A78 +772B4C286A78:lI112|H772B4C286D78 +772B4C286D78:lI108|H772B4C287058 +772B4C287058:lI101|H772B4C287308 +772B4C287308:lI95|H772B4C287558 +772B4C287558:lI104|H772B4C287758 +772B4C287758:lI46|H772B4C287908 +772B4C287908:lI98|H772B4C287AA8 +772B4C287AA8:lI101|H772B4C287C18 +772B4C287C18:lI97|H772B4C287D48 +772B4C287D48:lI109|N +772B4C2889D0:lH772B4C284808|N +772B4C284808:lI103|H772B4C284B88 +772B4C284B88:lI101|H772B4C284F08 +772B4C284F08:lI110|H772B4C285288 +772B4C285288:lI95|H772B4C285608 +772B4C285608:lI115|H772B4C285988 +772B4C285988:lI99|H772B4C285D08 +772B4C285D08:lI116|H772B4C286088 +772B4C286088:lI112|H772B4C2863F8 +772B4C2863F8:lI46|H772B4C286748 +772B4C286748:lI98|H772B4C286A68 +772B4C286A68:lI101|H772B4C286D68 +772B4C286D68:lI97|H772B4C287048 +772B4C287048:lI109|N +772B4C2882F8:Mn5:H772B4C288968,H772B4C288978,H772B4C288988,H772B4C288998,H772B4C2889A8 +772B4C288968:lH772B4C2847C8|N +772B4C2847C8:lI108|H772B4C284B48 +772B4C284B48:lI111|H772B4C284EC8 +772B4C284EC8:lI103|H772B4C285248 +772B4C285248:lI103|H772B4C2855C8 +772B4C2855C8:lI101|H772B4C285948 +772B4C285948:lI114|H772B4C285CC8 +772B4C285CC8:lI95|H772B4C286048 +772B4C286048:lI98|H772B4C2863C8 +772B4C2863C8:lI97|H772B4C286718 +772B4C286718:lI99|H772B4C286A38 +772B4C286A38:lI107|H772B4C286D38 +772B4C286D38:lI101|H772B4C287018 +772B4C287018:lI110|H772B4C2872D8 +772B4C2872D8:lI100|H772B4C287528 +772B4C287528:lI46|H772B4C287728 +772B4C287728:lI98|H772B4C2878D8 +772B4C2878D8:lI101|H772B4C287A78 +772B4C287A78:lI97|H772B4C287BE8 +772B4C287BE8:lI109|N +772B4C2889A8:lH772B4C289458|N +772B4C289458:lI101|H772B4C289E00 +772B4C289E00:lI114|H772B4C28A6D8 +772B4C28A6D8:lI112|H772B4C28AFB8 +772B4C28AFB8:lI99|H772B4C28B898 +772B4C28B898:lI46|H772B4C28C178 +772B4C28C178:lI98|H772B4C28CA58 +772B4C28CA58:lI101|H772B4C28D318 +772B4C28D318:lI97|H772B4C28DBA8 +772B4C28DBA8:lI109|N +772B4C288998:lH772B4C2847F8|N +772B4C2847F8:lI97|H772B4C284B78 +772B4C284B78:lI112|H772B4C284EF8 +772B4C284EF8:lI112|H772B4C285278 +772B4C285278:lI108|H772B4C2855F8 +772B4C2855F8:lI105|H772B4C285978 +772B4C285978:lI99|H772B4C285CF8 +772B4C285CF8:lI97|H772B4C286078 +772B4C286078:lI116|H772B4C2863E8 +772B4C2863E8:lI105|H772B4C286738 +772B4C286738:lI111|H772B4C286A58 +772B4C286A58:lI110|H772B4C286D58 +772B4C286D58:lI95|H772B4C287038 +772B4C287038:lI115|H772B4C2872F8 +772B4C2872F8:lI116|H772B4C287548 +772B4C287548:lI97|H772B4C287748 +772B4C287748:lI114|H772B4C2878F8 +772B4C2878F8:lI116|H772B4C287A98 +772B4C287A98:lI101|H772B4C287C08 +772B4C287C08:lI114|H772B4C287D38 +772B4C287D38:lI46|H772B4C287E48 +772B4C287E48:lI98|H772B4C287F18 +772B4C287F18:lI101|H772B4C287FA8 +772B4C287FA8:lI97|H772B4C288028 +772B4C288028:lI109|N +772B4C288988:lH772B4C2847E8|N +772B4C2847E8:lI112|H772B4C284B68 +772B4C284B68:lI103|H772B4C284EE8 +772B4C284EE8:lI50|H772B4C285268 +772B4C285268:lI46|H772B4C2855E8 +772B4C2855E8:lI98|H772B4C285968 +772B4C285968:lI101|H772B4C285CE8 +772B4C285CE8:lI97|H772B4C286068 +772B4C286068:lI109|N +772B4C288978:lH772B4C2847D8|N +772B4C2847D8:lI97|H772B4C284B58 +772B4C284B58:lI112|H772B4C284ED8 +772B4C284ED8:lI112|H772B4C285258 +772B4C285258:lI108|H772B4C2855D8 +772B4C2855D8:lI105|H772B4C285958 +772B4C285958:lI99|H772B4C285CD8 +772B4C285CD8:lI97|H772B4C286058 +772B4C286058:lI116|H772B4C2863D8 +772B4C2863D8:lI105|H772B4C286728 +772B4C286728:lI111|H772B4C286A48 +772B4C286A48:lI110|H772B4C286D48 +772B4C286D48:lI95|H772B4C287028 +772B4C287028:lI109|H772B4C2872E8 +772B4C2872E8:lI97|H772B4C287538 +772B4C287538:lI115|H772B4C287738 +772B4C287738:lI116|H772B4C2878E8 +772B4C2878E8:lI101|H772B4C287A88 +772B4C287A88:lI114|H772B4C287BF8 +772B4C287BF8:lI46|H772B4C287D28 +772B4C287D28:lI98|H772B4C287E38 +772B4C287E38:lI101|H772B4C287F08 +772B4C287F08:lI97|H772B4C287F98 +772B4C287F98:lI109|N +772B4C2882D0:Mn4:H772B4C288910,H772B4C288920,H772B4C288930,H772B4C288948 +772B4C288910:lH772B4C2847A8|N +772B4C2847A8:lI114|H772B4C284B28 +772B4C284B28:lI97|H772B4C284EA8 +772B4C284EA8:lI119|H772B4C285228 +772B4C285228:lI95|H772B4C2855A8 +772B4C2855A8:lI102|H772B4C285928 +772B4C285928:lI105|H772B4C285CA8 +772B4C285CA8:lI108|H772B4C286028 +772B4C286028:lI101|H772B4C2863A8 +772B4C2863A8:lI95|H772B4C2866F8 +772B4C2866F8:lI105|H772B4C286A18 +772B4C286A18:lI111|H772B4C286D18 +772B4C286D18:lI95|H772B4C286FF8 +772B4C286FF8:lI100|H772B4C2872B8 +772B4C2872B8:lI101|H772B4C287508 +772B4C287508:lI102|H772B4C287708 +772B4C287708:lI108|H772B4C2878B8 +772B4C2878B8:lI97|H772B4C287A58 +772B4C287A58:lI116|H772B4C287BD8 +772B4C287BD8:lI101|H772B4C287D18 +772B4C287D18:lI46|H772B4C287E28 +772B4C287E28:lI98|H772B4C287EF8 +772B4C287EF8:lI101|H772B4C287F88 +772B4C287F88:lI97|H772B4C288018 +772B4C288018:lI109|N +772B4C288948:Mn3:H772B4C289428,H772B4C289438,H772B4C289448 +772B4C289428:lH772B4C2849F8|N +772B4C2849F8:lI119|H772B4C284D78 +772B4C284D78:lI114|H772B4C2850F8 +772B4C2850F8:lI97|H772B4C285478 +772B4C285478:lI112|H772B4C2857F8 +772B4C2857F8:lI95|H772B4C285B78 +772B4C285B78:lI108|H772B4C285EF8 +772B4C285EF8:lI111|H772B4C286278 +772B4C286278:lI103|H772B4C2865D8 +772B4C2865D8:lI95|H772B4C286908 +772B4C286908:lI114|H772B4C286C18 +772B4C286C18:lI101|H772B4C286F18 +772B4C286F18:lI97|H772B4C2871D8 +772B4C2871D8:lI100|H772B4C287458 +772B4C287458:lI101|H772B4C287668 +772B4C287668:lI114|H772B4C287828 +772B4C287828:lI46|H772B4C2879C8 +772B4C2879C8:lI98|H772B4C287B58 +772B4C287B58:lI101|H772B4C287CA8 +772B4C287CA8:lI97|H772B4C287DC8 +772B4C287DC8:lI109|N +772B4C289448:lH772B4C289DF0|N +772B4C289DF0:lI112|H772B4C28A6C8 +772B4C28A6C8:lI114|H772B4C28AFA8 +772B4C28AFA8:lI105|H772B4C28B888 +772B4C28B888:lI109|H772B4C28C168 +772B4C28C168:lI95|H772B4C28CA48 +772B4C28CA48:lI116|H772B4C28D308 +772B4C28D308:lI116|H772B4C28DB98 +772B4C28DB98:lI121|H772B4C28E3D8 +772B4C28E3D8:lI46|H772B4C28EB88 +772B4C28EB88:lI98|H772B4C28F298 +772B4C28F298:lI101|H772B4C28F918 +772B4C28F918:lI97|H772B4C28FE98 +772B4C28FE98:lI109|N +772B4C289438:lH772B4C284A08|N +772B4C284A08:lI115|H772B4C284D88 +772B4C284D88:lI111|H772B4C285108 +772B4C285108:lI99|H772B4C285488 +772B4C285488:lI107|H772B4C285808 +772B4C285808:lI101|H772B4C285B88 +772B4C285B88:lI116|H772B4C285F08 +772B4C285F08:lI46|H772B4C286288 +772B4C286288:lI98|H772B4C2865E8 +772B4C2865E8:lI101|H772B4C286918 +772B4C286918:lI97|H772B4C286C28 +772B4C286C28:lI109|N +772B4C288930:Mn2:H772B4C289408,H772B4C289418 +772B4C289408:lH772B4C2849E8|N +772B4C2849E8:lI105|H772B4C284D68 +772B4C284D68:lI110|H772B4C2850E8 +772B4C2850E8:lI101|H772B4C285468 +772B4C285468:lI116|H772B4C2857E8 +772B4C2857E8:lI54|H772B4C285B68 +772B4C285B68:lI95|H772B4C285EE8 +772B4C285EE8:lI116|H772B4C286268 +772B4C286268:lI99|H772B4C2865C8 +772B4C2865C8:lI112|H772B4C2868F8 +772B4C2868F8:lI46|H772B4C286C08 +772B4C286C08:lI98|H772B4C286F08 +772B4C286F08:lI101|H772B4C2871C8 +772B4C2871C8:lI97|H772B4C287448 +772B4C287448:lI109|N +772B4C289418:lH772B4C289DE0|N +772B4C289DE0:lI108|H772B4C28A6B8 +772B4C28A6B8:lI111|H772B4C28AF98 +772B4C28AF98:lI103|H772B4C28B878 +772B4C28B878:lI103|H772B4C28C158 +772B4C28C158:lI101|H772B4C28CA38 +772B4C28CA38:lI114|H772B4C28D2F8 +772B4C28D2F8:lI95|H772B4C28DB88 +772B4C28DB88:lI104|H772B4C28E3C8 +772B4C28E3C8:lI95|H772B4C28EB78 +772B4C28EB78:lI99|H772B4C28F288 +772B4C28F288:lI111|H772B4C28F908 +772B4C28F908:lI109|H772B4C28FE88 +772B4C28FE88:lI109|H772B4C290348 +772B4C290348:lI111|H772B4C290708 +772B4C290708:lI110|H772B4C290A18 +772B4C290A18:lI46|H772B4C290CC8 +772B4C290CC8:lI98|H772B4C290EC8 +772B4C290EC8:lI101|H772B4C291058 +772B4C291058:lI97|H772B4C291148 +772B4C291148:lI109|N +772B4C288920:lH772B4C2847B8|N +772B4C2847B8:lI108|H772B4C284B38 +772B4C284B38:lI111|H772B4C284EB8 +772B4C284EB8:lI103|H772B4C285238 +772B4C285238:lI103|H772B4C2855B8 +772B4C2855B8:lI101|H772B4C285938 +772B4C285938:lI114|H772B4C285CB8 +772B4C285CB8:lI95|H772B4C286038 +772B4C286038:lI99|H772B4C2863B8 +772B4C2863B8:lI111|H772B4C286708 +772B4C286708:lI110|H772B4C286A28 +772B4C286A28:lI102|H772B4C286D28 +772B4C286D28:lI105|H772B4C287008 +772B4C287008:lI103|H772B4C2872C8 +772B4C2872C8:lI46|H772B4C287518 +772B4C287518:lI98|H772B4C287718 +772B4C287718:lI101|H772B4C2878C8 +772B4C2878C8:lI97|H772B4C287A68 +772B4C287A68:lI109|N +772B4C2882A0:Mn5:H772B4C2888B8,H772B4C2888C8,H772B4C2888D8,H772B4C2888F0,H772B4C288900 +772B4C2888B8:lH772B4C2893B8|N +772B4C2893B8:lI112|H772B4C289DA0 +772B4C289DA0:lI103|H772B4C28A678 +772B4C28A678:lI46|H772B4C28AF58 +772B4C28AF58:lI98|H772B4C28B838 +772B4C28B838:lI101|H772B4C28C118 +772B4C28C118:lI97|H772B4C28C9F8 +772B4C28C9F8:lI109|N +772B4C288900:lH772B4C284798|N +772B4C284798:lI108|H772B4C284B18 +772B4C284B18:lI111|H772B4C284E98 +772B4C284E98:lI103|H772B4C285218 +772B4C285218:lI103|H772B4C285598 +772B4C285598:lI101|H772B4C285918 +772B4C285918:lI114|H772B4C285C98 +772B4C285C98:lI95|H772B4C286018 +772B4C286018:lI104|H772B4C286398 +772B4C286398:lI97|H772B4C2866E8 +772B4C2866E8:lI110|H772B4C286A08 +772B4C286A08:lI100|H772B4C286D08 +772B4C286D08:lI108|H772B4C286FE8 +772B4C286FE8:lI101|H772B4C2872A8 +772B4C2872A8:lI114|H772B4C2874F8 +772B4C2874F8:lI46|H772B4C2876F8 +772B4C2876F8:lI98|H772B4C2878A8 +772B4C2878A8:lI101|H772B4C287A48 +772B4C287A48:lI97|H772B4C287BC8 +772B4C287BC8:lI109|N +772B4C2888F0:lH772B4C2893F8|N +772B4C2893F8:lI117|H772B4C289DD0 +772B4C289DD0:lI115|H772B4C28A6A8 +772B4C28A6A8:lI101|H772B4C28AF88 +772B4C28AF88:lI114|H772B4C28B868 +772B4C28B868:lI95|H772B4C28C148 +772B4C28C148:lI115|H772B4C28CA28 +772B4C28CA28:lI117|H772B4C28D2E8 +772B4C28D2E8:lI112|H772B4C28DB78 +772B4C28DB78:lI46|H772B4C28E3B8 +772B4C28E3B8:lI98|H772B4C28EB68 +772B4C28EB68:lI101|H772B4C28F278 +772B4C28F278:lI97|H772B4C28F8F8 +772B4C28F8F8:lI109|N +772B4C2888D8:Mn2:H772B4C2893D8,H772B4C2893E8 +772B4C2893D8:lH772B4C2849D8|N +772B4C2849D8:lI105|H772B4C284D58 +772B4C284D58:lI110|H772B4C2850D8 +772B4C2850D8:lI101|H772B4C285458 +772B4C285458:lI116|H772B4C2857D8 +772B4C2857D8:lI95|H772B4C285B58 +772B4C285B58:lI112|H772B4C285ED8 +772B4C285ED8:lI97|H772B4C286258 +772B4C286258:lI114|H772B4C2865B8 +772B4C2865B8:lI115|H772B4C2868E8 +772B4C2868E8:lI101|H772B4C286BF8 +772B4C286BF8:lI46|H772B4C286EF8 +772B4C286EF8:lI98|H772B4C2871B8 +772B4C2871B8:lI101|H772B4C287438 +772B4C287438:lI97|H772B4C287658 +772B4C287658:lI109|N +772B4C2893E8:lH772B4C289DC0|N +772B4C289DC0:lI100|H772B4C28A698 +772B4C28A698:lI105|H772B4C28AF78 +772B4C28AF78:lI115|H772B4C28B858 +772B4C28B858:lI107|H772B4C28C138 +772B4C28C138:lI95|H772B4C28CA18 +772B4C28CA18:lI108|H772B4C28D2D8 +772B4C28D2D8:lI111|H772B4C28DB68 +772B4C28DB68:lI103|H772B4C28E3A8 +772B4C28E3A8:lI95|H772B4C28EB58 +772B4C28EB58:lI49|H772B4C28F268 +772B4C28F268:lI46|H772B4C28F8E8 +772B4C28F8E8:lI98|H772B4C28FE78 +772B4C28FE78:lI101|H772B4C290338 +772B4C290338:lI97|H772B4C2906F8 +772B4C2906F8:lI109|N +772B4C2888C8:lH772B4C2893C8|N +772B4C2893C8:lI100|H772B4C289DB0 +772B4C289DB0:lI105|H772B4C28A688 +772B4C28A688:lI115|H772B4C28AF68 +772B4C28AF68:lI116|H772B4C28B848 +772B4C28B848:lI95|H772B4C28C128 +772B4C28C128:lI97|H772B4C28CA08 +772B4C28CA08:lI99|H772B4C28D2C8 +772B4C28D2C8:lI46|H772B4C28DB58 +772B4C28DB58:lI98|H772B4C28E398 +772B4C28E398:lI101|H772B4C28EB48 +772B4C28EB48:lI97|H772B4C28F258 +772B4C28F258:lI109|N +772B4C27D5A0:lH772B4C27D5C0|H772B4C27D5D8 +772B4C27D5C0:t2:H772B4C27D5F8,A7:nocache +772B4C27D5F8:lI47|H772B4C27D640 +772B4C27D640:lI104|H772B4C27D688 +772B4C27D688:lI111|H772B4C27D6D0 +772B4C27D6D0:lI109|H772B4C27D708 +772B4C27D708:lI101|H772B4C27D728 +772B4C27D728:lI47|H772B4C27D748 +772B4C27D748:lI104|H772B4C27D768 +772B4C27D768:lI121|H772B4C27D788 +772B4C27D788:lI112|H772B4C27D7A8 +772B4C27D7A8:lI101|H772B4C27D7C8 +772B4C27D7C8:lI114|H772B4C27D7E8 +772B4C27D7E8:lI112|H772B4C27D808 +772B4C27D808:lI111|H772B4C27D828 +772B4C27D828:lI108|H772B4C27D848 +772B4C27D848:lI121|H772B4C27D868 +772B4C27D868:lI109|H772B4C27D888 +772B4C27D888:lI97|H772B4C27D8A8 +772B4C27D8A8:lI116|H772B4C27D8C8 +772B4C27D8C8:lI104|H772B4C27D8E8 +772B4C27D8E8:lI47|H772B4C27D908 +772B4C27D908:lI100|H772B4C27D928 +772B4C27D928:lI101|H772B4C27D948 +772B4C27D948:lI118|H772B4C27D968 +772B4C27D968:lI101|H772B4C27D988 +772B4C27D988:lI108|H772B4C27D9A8 +772B4C27D9A8:lI111|H772B4C27D9C8 +772B4C27D9C8:lI112|H772B4C27D9E8 +772B4C27D9E8:lI101|H772B4C27DA08 +772B4C27DA08:lI114|H772B4C27DA28 +772B4C27DA28:lI47|H772B4C27DA48 +772B4C27DA48:lI116|H772B4C27DA68 +772B4C27DA68:lI111|H772B4C27DA88 +772B4C27DA88:lI111|H772B4C27DA98 +772B4C27DA98:lI108|H772B4C27DAA8 +772B4C27DAA8:lI115|H772B4C27DAB8 +772B4C27DAB8:lI47|H772B4C27DAC8 +772B4C27DAC8:lI111|H772B4C27DAD8 +772B4C27DAD8:lI112|H772B4C27DAE8 +772B4C27DAE8:lI116|H772B4C27DAF8 +772B4C27DAF8:lI47|H772B4C27DB08 +772B4C27DB08:lI109|H772B4C27DB18 +772B4C27DB18:lI105|H772B4C27DB28 +772B4C27DB28:lI115|H772B4C27DB38 +772B4C27DB38:lI101|H772B4C27DB48 +772B4C27DB48:lI47|H772B4C27DB58 +772B4C27DB58:lI105|H772B4C27DB68 +772B4C27DB68:lI110|H772B4C27DB78 +772B4C27DB78:lI115|H772B4C27DB88 +772B4C27DB88:lI116|H772B4C27DB98 +772B4C27DB98:lI97|H772B4C27DBA8 +772B4C27DBA8:lI108|H772B4C27DBB8 +772B4C27DBB8:lI108|H772B4C27DBC8 +772B4C27DBC8:lI115|H772B4C27DBD8 +772B4C27DBD8:lI47|H772B4C27DBE8 +772B4C27DBE8:lI101|H772B4C27DBF8 +772B4C27DBF8:lI108|H772B4C27DC08 +772B4C27DC08:lI105|H772B4C27DC18 +772B4C27DC18:lI120|H772B4C27DC28 +772B4C27DC28:lI105|H772B4C27DC38 +772B4C27DC38:lI114|H772B4C27DC48 +772B4C27DC48:lI47|H772B4C27DC58 +772B4C27DC58:lI49|H772B4C27DC68 +772B4C27DC68:lI46|H772B4C27DC78 +772B4C27DC78:lI49|H772B4C27DC88 +772B4C27DC88:lI57|H772B4C27DC98 +772B4C27DC98:lI46|H772B4C27DCA8 +772B4C27DCA8:lI53|H772B4C27DCB8 +772B4C27DCB8:lI45|H772B4C27DCC8 +772B4C27DCC8:lI111|H772B4C27DCD8 +772B4C27DCD8:lI116|H772B4C27DCE8 +772B4C27DCE8:lI112|H772B4C27DCF8 +772B4C27DCF8:lI45|H772B4C27DD08 +772B4C27DD08:lI50|H772B4C27DD18 +772B4C27DD18:lI56|H772B4C27DD28 +772B4C27DD28:lI47|H772B4C27DD38 +772B4C27DD38:lI98|H772B4C27DD48 +772B4C27DD48:lI105|H772B4C27DD58 +772B4C27DD58:lI110|H772B4C27DD68 +772B4C27DD68:lI47|H772B4C27DD78 +772B4C27DD78:lI46|H772B4C27DD88 +772B4C27DD88:lI46|H772B4C27DD98 +772B4C27DD98:lI47|H772B4C27DDA8 +772B4C27DDA8:lI108|H772B4C27DDB8 +772B4C27DDB8:lI105|H772B4C27DDC8 +772B4C27DDC8:lI98|H772B4C27DDD8 +772B4C27DDD8:lI47|H772B4C27DDE8 +772B4C27DDE8:lI101|H772B4C27DDF8 +772B4C27DDF8:lI108|H772B4C27DE08 +772B4C27DE08:lI105|H772B4C27DE18 +772B4C27DE18:lI120|H772B4C27DE28 +772B4C27DE28:lI105|H772B4C27DE38 +772B4C27DE38:lI114|H772B4C27DE48 +772B4C27DE48:lI47|H772B4C27DE58 +772B4C27DE58:lI101|H772B4C27DE68 +772B4C27DE68:lI98|H772B4C27DE78 +772B4C27DE78:lI105|H772B4C27DE88 +772B4C27DE88:lI110|N +772B4C27D5D8:lH772B4C27D608|H772B4C27D620 +772B4C27D608:t2:H772B58430090,A7:nocache +772B4C27D620:lH772B4C27D650|H772B4C27D668 +772B4C27D650:t2:H772B4C27C9E0,I-576460752303423486 +772B4C27C9E0:lI47|H772B4C27CA00 +772B4C27CA00:lI117|H772B4C27CA20 +772B4C27CA20:lI115|H772B4C27CA40 +772B4C27CA40:lI114|H772B4C27CA60 +772B4C27CA60:lI47|H772B4C27CA80 +772B4C27CA80:lI108|H772B4C27CAA0 +772B4C27CAA0:lI105|H772B4C27CAC0 +772B4C27CAC0:lI98|H772B4C27CAE0 +772B4C27CAE0:lI47|H772B4C27CB00 +772B4C27CB00:lI101|H772B4C27CB10 +772B4C27CB10:lI114|H772B4C27CB20 +772B4C27CB20:lI108|H772B4C27CB30 +772B4C27CB30:lI97|H772B4C27CB40 +772B4C27CB40:lI110|H772B4C27CB50 +772B4C27CB50:lI103|H772B4C27CB60 +772B4C27CB60:lI47|H772B4C27CB70 +772B4C27CB70:lI108|H772B4C27CB80 +772B4C27CB80:lI105|H772B4C27CB90 +772B4C27CB90:lI98|H772B4C27CBA0 +772B4C27CBA0:lI47|H772B4C27CBB0 +772B4C27CBB0:lI107|H772B4C27CBC0 +772B4C27CBC0:lI101|H772B4C27CBD0 +772B4C27CBD0:lI114|H772B4C27CBE0 +772B4C27CBE0:lI110|H772B4C27CBF0 +772B4C27CBF0:lI101|H772B4C27CC00 +772B4C27CC00:lI108|H772B4C27CC10 +772B4C27CC10:lI45|H772B4C27CC20 +772B4C27CC20:lI49|H772B4C27CC30 +772B4C27CC30:lI48|H772B4C27CC40 +772B4C27CC40:lI46|H772B4C27CC50 +772B4C27CC50:lI50|H772B4C27CC60 +772B4C27CC60:lI46|H772B4C27CC70 +772B4C27CC70:lI55|H772B4C27CC80 +772B4C27CC80:lI46|H772B4C27CC90 +772B4C27CC90:lI49|H772B4C27CCA0 +772B4C27CCA0:lI47|H772B4C27CCB0 +772B4C27CCB0:lI101|H772B4C27CCC0 +772B4C27CCC0:lI98|H772B4C27CCD0 +772B4C27CCD0:lI105|H772B4C27CCE0 +772B4C27CCE0:lI110|N +772B4C27D668:lH772B4C27D698|H772B4C27D6B0 +772B4C27D698:t2:H772B4C27CCF0,I-576460752303423454 +772B4C27CCF0:lI47|H772B4C27CD00 +772B4C27CD00:lI117|H772B4C27CD10 +772B4C27CD10:lI115|H772B4C27CD20 +772B4C27CD20:lI114|H772B4C27CD30 +772B4C27CD30:lI47|H772B4C27CD40 +772B4C27CD40:lI108|H772B4C27CD50 +772B4C27CD50:lI105|H772B4C27CD60 +772B4C27CD60:lI98|H772B4C27CD70 +772B4C27CD70:lI47|H772B4C27CD80 +772B4C27CD80:lI101|H772B4C27CD90 +772B4C27CD90:lI114|H772B4C27CDA0 +772B4C27CDA0:lI108|H772B4C27CDB0 +772B4C27CDB0:lI97|H772B4C27CDC0 +772B4C27CDC0:lI110|H772B4C27CDD0 +772B4C27CDD0:lI103|H772B4C27CDE0 +772B4C27CDE0:lI47|H772B4C27CDF0 +772B4C27CDF0:lI108|H772B4C27CE00 +772B4C27CE00:lI105|H772B4C27CE10 +772B4C27CE10:lI98|H772B4C27CE20 +772B4C27CE20:lI47|H772B4C27CE30 +772B4C27CE30:lI115|H772B4C27CE40 +772B4C27CE40:lI116|H772B4C27CE50 +772B4C27CE50:lI100|H772B4C27CE60 +772B4C27CE60:lI108|H772B4C27CE70 +772B4C27CE70:lI105|H772B4C27CE80 +772B4C27CE80:lI98|H772B4C27CE90 +772B4C27CE90:lI45|H772B4C27CEA0 +772B4C27CEA0:lI54|H772B4C27CEB0 +772B4C27CEB0:lI46|H772B4C27CEC0 +772B4C27CEC0:lI50|H772B4C27CED0 +772B4C27CED0:lI46|H772B4C27CEE0 +772B4C27CEE0:lI50|H772B4C27CEF0 +772B4C27CEF0:lI46|H772B4C27CF00 +772B4C27CF00:lI49|H772B4C27CF10 +772B4C27CF10:lI47|H772B4C27CF20 +772B4C27CF20:lI101|H772B4C27CF30 +772B4C27CF30:lI98|H772B4C27CF40 +772B4C27CF40:lI105|H772B4C27CF50 +772B4C27CF50:lI110|N +772B4C27D6B0:lH772B4C27D6E0|H772B4C27D0C8 +772B4C27D6E0:t2:H772B4C27B740,I-576460752303423422 +772B4C27B740:lI47|H772B4C27B7B0 +772B4C27B7B0:lI117|H772B4C27B820 +772B4C27B820:lI115|H772B4C27B890 +772B4C27B890:lI114|H772B4C27B900 +772B4C27B900:lI47|H772B4C27B970 +772B4C27B970:lI108|H772B4C27B9E0 +772B4C27B9E0:lI105|H772B4C27BA50 +772B4C27BA50:lI98|H772B4C27BAC0 +772B4C27BAC0:lI47|H772B4C27BB30 +772B4C27BB30:lI101|H772B4C27BBA0 +772B4C27BBA0:lI114|H772B4C27BC10 +772B4C27BC10:lI108|H772B4C27BC80 +772B4C27BC80:lI97|H772B4C27BCF0 +772B4C27BCF0:lI110|H772B4C27BD60 +772B4C27BD60:lI103|H772B4C27BDD0 +772B4C27BDD0:lI47|H772B4C27BE40 +772B4C27BE40:lI108|H772B4C27BEB0 +772B4C27BEB0:lI105|H772B4C27BF20 +772B4C27BF20:lI98|H772B4C27BF90 +772B4C27BF90:lI47|H772B4C27C000 +772B4C27C000:lI120|H772B4C27C070 +772B4C27C070:lI109|H772B4C27C0E0 +772B4C27C0E0:lI101|H772B4C27C150 +772B4C27C150:lI114|H772B4C27C1C0 +772B4C27C1C0:lI108|H772B4C27C230 +772B4C27C230:lI45|H772B4C27C2A0 +772B4C27C2A0:lI50|H772B4C27C310 +772B4C27C310:lI46|H772B4C27C380 +772B4C27C380:lI49|H772B4C27C3F0 +772B4C27C3F0:lI46|H772B4C27C450 +772B4C27C450:lI51|H772B4C27C4B0 +772B4C27C4B0:lI46|H772B4C27C500 +772B4C27C500:lI49|H772B4C27C540 +772B4C27C540:lI47|H772B58430370 +772B4C27D0C8:lH772B4C27D348|H772B4C27D360 +772B4C27D348:t2:H772B4C27B750,I-576460752303423390 +772B4C27B750:lI47|H772B4C27B7C0 +772B4C27B7C0:lI117|H772B4C27B830 +772B4C27B830:lI115|H772B4C27B8A0 +772B4C27B8A0:lI114|H772B4C27B910 +772B4C27B910:lI47|H772B4C27B980 +772B4C27B980:lI108|H772B4C27B9F0 +772B4C27B9F0:lI105|H772B4C27BA60 +772B4C27BA60:lI98|H772B4C27BAD0 +772B4C27BAD0:lI47|H772B4C27BB40 +772B4C27BB40:lI101|H772B4C27BBB0 +772B4C27BBB0:lI114|H772B4C27BC20 +772B4C27BC20:lI108|H772B4C27BC90 +772B4C27BC90:lI97|H772B4C27BD00 +772B4C27BD00:lI110|H772B4C27BD70 +772B4C27BD70:lI103|H772B4C27BDE0 +772B4C27BDE0:lI47|H772B4C27BE50 +772B4C27BE50:lI108|H772B4C27BEC0 +772B4C27BEC0:lI105|H772B4C27BF30 +772B4C27BF30:lI98|H772B4C27BFA0 +772B4C27BFA0:lI47|H772B4C27C010 +772B4C27C010:lI119|H772B4C27C080 +772B4C27C080:lI120|H772B4C27C0F0 +772B4C27C0F0:lI45|H772B4C27C160 +772B4C27C160:lI50|H772B4C27C1D0 +772B4C27C1D0:lI46|H772B4C27C240 +772B4C27C240:lI52|H772B4C27C2B0 +772B4C27C2B0:lI46|H772B4C27C320 +772B4C27C320:lI51|H772B4C27C390 +772B4C27C390:lI47|H772B58430370 +772B4C27D360:lH772B4C27D330|H772B4C27D370 +772B4C27D330:t2:H772B4C27B760,I-576460752303423358 +772B4C27B760:lI47|H772B4C27B7D0 +772B4C27B7D0:lI117|H772B4C27B840 +772B4C27B840:lI115|H772B4C27B8B0 +772B4C27B8B0:lI114|H772B4C27B920 +772B4C27B920:lI47|H772B4C27B990 +772B4C27B990:lI108|H772B4C27BA00 +772B4C27BA00:lI105|H772B4C27BA70 +772B4C27BA70:lI98|H772B4C27BAE0 +772B4C27BAE0:lI47|H772B4C27BB50 +772B4C27BB50:lI101|H772B4C27BBC0 +772B4C27BBC0:lI114|H772B4C27BC30 +772B4C27BC30:lI108|H772B4C27BCA0 +772B4C27BCA0:lI97|H772B4C27BD10 +772B4C27BD10:lI110|H772B4C27BD80 +772B4C27BD80:lI103|H772B4C27BDF0 +772B4C27BDF0:lI47|H772B4C27BE60 +772B4C27BE60:lI108|H772B4C27BED0 +772B4C27BED0:lI105|H772B4C27BF40 +772B4C27BF40:lI98|H772B4C27BFB0 +772B4C27BFB0:lI47|H772B4C27C020 +772B4C27C020:lI116|H772B4C27C090 +772B4C27C090:lI111|H772B4C27C100 +772B4C27C100:lI111|H772B4C27C170 +772B4C27C170:lI108|H772B4C27C1E0 +772B4C27C1E0:lI115|H772B4C27C250 +772B4C27C250:lI45|H772B4C27C2C0 +772B4C27C2C0:lI52|H772B4C27C330 +772B4C27C330:lI46|H772B4C27C3A0 +772B4C27C3A0:lI49|H772B4C27C400 +772B4C27C400:lI46|H772B4C27C460 +772B4C27C460:lI49|H772B4C27C4C0 +772B4C27C4C0:lI47|H772B58430370 +772B4C27D370:lH772B4C27D318|H772B4C27D380 +772B4C27D318:t2:H772B4C27B770,I-576460752303423326 +772B4C27B770:lI47|H772B4C27B7E0 +772B4C27B7E0:lI117|H772B4C27B850 +772B4C27B850:lI115|H772B4C27B8C0 +772B4C27B8C0:lI114|H772B4C27B930 +772B4C27B930:lI47|H772B4C27B9A0 +772B4C27B9A0:lI108|H772B4C27BA10 +772B4C27BA10:lI105|H772B4C27BA80 +772B4C27BA80:lI98|H772B4C27BAF0 +772B4C27BAF0:lI47|H772B4C27BB60 +772B4C27BB60:lI101|H772B4C27BBD0 +772B4C27BBD0:lI114|H772B4C27BC40 +772B4C27BC40:lI108|H772B4C27BCB0 +772B4C27BCB0:lI97|H772B4C27BD20 +772B4C27BD20:lI110|H772B4C27BD90 +772B4C27BD90:lI103|H772B4C27BE00 +772B4C27BE00:lI47|H772B4C27BE70 +772B4C27BE70:lI108|H772B4C27BEE0 +772B4C27BEE0:lI105|H772B4C27BF50 +772B4C27BF50:lI98|H772B4C27BFC0 +772B4C27BFC0:lI47|H772B4C27C030 +772B4C27C030:lI116|H772B4C27C0A0 +772B4C27C0A0:lI102|H772B4C27C110 +772B4C27C110:lI116|H772B4C27C180 +772B4C27C180:lI112|H772B4C27C1F0 +772B4C27C1F0:lI45|H772B4C27C260 +772B4C27C260:lI49|H772B4C27C2D0 +772B4C27C2D0:lI46|H772B4C27C340 +772B4C27C340:lI50|H772B4C27C3B0 +772B4C27C3B0:lI46|H772B4C27C410 +772B4C27C410:lI50|H772B4C27C470 +772B4C27C470:lI47|H772B58430370 +772B4C27D380:lH772B4C27D300|H772B4C27D390 +772B4C27D300:t2:H772B4C27B780,I-576460752303423294 +772B4C27B780:lI47|H772B4C27B7F0 +772B4C27B7F0:lI117|H772B4C27B860 +772B4C27B860:lI115|H772B4C27B8D0 +772B4C27B8D0:lI114|H772B4C27B940 +772B4C27B940:lI47|H772B4C27B9B0 +772B4C27B9B0:lI108|H772B4C27BA20 +772B4C27BA20:lI105|H772B4C27BA90 +772B4C27BA90:lI98|H772B4C27BB00 +772B4C27BB00:lI47|H772B4C27BB70 +772B4C27BB70:lI101|H772B4C27BBE0 +772B4C27BBE0:lI114|H772B4C27BC50 +772B4C27BC50:lI108|H772B4C27BCC0 +772B4C27BCC0:lI97|H772B4C27BD30 +772B4C27BD30:lI110|H772B4C27BDA0 +772B4C27BDA0:lI103|H772B4C27BE10 +772B4C27BE10:lI47|H772B4C27BE80 +772B4C27BE80:lI108|H772B4C27BEF0 +772B4C27BEF0:lI105|H772B4C27BF60 +772B4C27BF60:lI98|H772B4C27BFD0 +772B4C27BFD0:lI47|H772B4C27C040 +772B4C27C040:lI115|H772B4C27C0B0 +772B4C27C0B0:lI121|H772B4C27C120 +772B4C27C120:lI110|H772B4C27C190 +772B4C27C190:lI116|H772B4C27C200 +772B4C27C200:lI97|H772B4C27C270 +772B4C27C270:lI120|H772B4C27C2E0 +772B4C27C2E0:lI95|H772B4C27C350 +772B4C27C350:lI116|H772B4C27C3C0 +772B4C27C3C0:lI111|H772B4C27C420 +772B4C27C420:lI111|H772B4C27C480 +772B4C27C480:lI108|H772B4C27C4D0 +772B4C27C4D0:lI115|H772B4C27C510 +772B4C27C510:lI45|H772B4C27C550 +772B4C27C550:lI51|H772B4C27C580 +772B4C27C580:lI46|H772B4C27C5B0 +772B4C27C5B0:lI50|H772B4C27C5D0 +772B4C27C5D0:lI46|H772B4C27C5F0 +772B4C27C5F0:lI50|H772B4C27C610 +772B4C27C610:lI47|H772B58430370 +772B4C27D390:lH772B4C27D2E8|H772B4C27D3A0 +772B4C27D2E8:t2:H772B4C278E60,I-576460752303423262 +772B4C278E60:lI47|H772B4C278EE0 +772B4C278EE0:lI117|H772B4C278F70 +772B4C278F70:lI115|H772B4C279010 +772B4C279010:lI114|H772B4C2790B0 +772B4C2790B0:lI47|H772B4C279160 +772B4C279160:lI108|H772B4C279220 +772B4C279220:lI105|H772B4C2792F0 +772B4C2792F0:lI98|H772B4C2793D0 +772B4C2793D0:lI47|H772B4C2794C0 +772B4C2794C0:lI101|H772B4C2795C0 +772B4C2795C0:lI114|H772B4C2796C0 +772B4C2796C0:lI108|H772B4C2797D0 +772B4C2797D0:lI97|H772B4C2798F0 +772B4C2798F0:lI110|H772B4C279A20 +772B4C279A20:lI103|H772B4C279B60 +772B4C279B60:lI47|H772B4C279C90 +772B4C279C90:lI108|H772B4C279DC0 +772B4C279DC0:lI105|H772B4C279EF0 +772B4C279EF0:lI98|H772B4C27A020 +772B4C27A020:lI47|H772B4C27A140 +772B4C27A140:lI115|H772B4C27A260 +772B4C27A260:lI115|H772B4C27A380 +772B4C27A380:lI108|H772B4C27A4A0 +772B4C27A4A0:lI45|H772B4C27A5C0 +772B4C27A5C0:lI49|H772B4C27A6E0 +772B4C27A6E0:lI49|H772B4C27A800 +772B4C27A800:lI46|H772B4C27A920 +772B4C27A920:lI50|H772B4C27AA40 +772B4C27AA40:lI46|H772B4C27AB60 +772B4C27AB60:lI49|H772B4C27AC80 +772B4C27AC80:lI50|H772B4C27ADA0 +772B4C27ADA0:lI46|H772B4C27AEB0 +772B4C27AEB0:lI49|H772B4C27AFB0 +772B4C27AFB0:lI47|H772B58430370 +772B4C27D3A0:lH772B4C27D2D0|H772B4C27D3B0 +772B4C27D2D0:t2:H772B4C278E50,I-576460752303423230 +772B4C278E50:lI47|H772B4C278ED0 +772B4C278ED0:lI117|H772B4C278F60 +772B4C278F60:lI115|H772B4C279000 +772B4C279000:lI114|H772B4C2790A0 +772B4C2790A0:lI47|H772B4C279150 +772B4C279150:lI108|H772B4C279210 +772B4C279210:lI105|H772B4C2792E0 +772B4C2792E0:lI98|H772B4C2793C0 +772B4C2793C0:lI47|H772B4C2794B0 +772B4C2794B0:lI101|H772B4C2795B0 +772B4C2795B0:lI114|H772B4C2796B0 +772B4C2796B0:lI108|H772B4C2797C0 +772B4C2797C0:lI97|H772B4C2798E0 +772B4C2798E0:lI110|H772B4C279A10 +772B4C279A10:lI103|H772B4C279B50 +772B4C279B50:lI47|H772B4C279C80 +772B4C279C80:lI108|H772B4C279DB0 +772B4C279DB0:lI105|H772B4C279EE0 +772B4C279EE0:lI98|H772B4C27A010 +772B4C27A010:lI47|H772B4C27A130 +772B4C27A130:lI115|H772B4C27A250 +772B4C27A250:lI115|H772B4C27A370 +772B4C27A370:lI104|H772B4C27A490 +772B4C27A490:lI45|H772B4C27A5B0 +772B4C27A5B0:lI53|H772B4C27A6D0 +772B4C27A6D0:lI46|H772B4C27A7F0 +772B4C27A7F0:lI50|H772B4C27A910 +772B4C27A910:lI46|H772B4C27AA30 +772B4C27AA30:lI49|H772B4C27AB50 +772B4C27AB50:lI49|H772B4C27AC70 +772B4C27AC70:lI46|H772B4C27AD90 +772B4C27AD90:lI49|H772B4C27AEA0 +772B4C27AEA0:lI47|H772B58430370 +772B4C27D3B0:lH772B4C27D2B8|H772B4C27D3C0 +772B4C27D2B8:t2:H772B4C278E40,I-576460752303423198 +772B4C278E40:lI47|H772B4C278EC0 +772B4C278EC0:lI117|H772B4C278F50 +772B4C278F50:lI115|H772B4C278FF0 +772B4C278FF0:lI114|H772B4C279090 +772B4C279090:lI47|H772B4C279140 +772B4C279140:lI108|H772B4C279200 +772B4C279200:lI105|H772B4C2792D0 +772B4C2792D0:lI98|H772B4C2793B0 +772B4C2793B0:lI47|H772B4C2794A0 +772B4C2794A0:lI101|H772B4C2795A0 +772B4C2795A0:lI114|H772B4C2796A0 +772B4C2796A0:lI108|H772B4C2797B0 +772B4C2797B0:lI97|H772B4C2798D0 +772B4C2798D0:lI110|H772B4C279A00 +772B4C279A00:lI103|H772B4C279B40 +772B4C279B40:lI47|H772B4C279C70 +772B4C279C70:lI108|H772B4C279DA0 +772B4C279DA0:lI105|H772B4C279ED0 +772B4C279ED0:lI98|H772B4C27A000 +772B4C27A000:lI47|H772B4C27A120 +772B4C27A120:lI115|H772B4C27A240 +772B4C27A240:lI110|H772B4C27A360 +772B4C27A360:lI109|H772B4C27A480 +772B4C27A480:lI112|H772B4C27A5A0 +772B4C27A5A0:lI45|H772B4C27A6C0 +772B4C27A6C0:lI53|H772B4C27A7E0 +772B4C27A7E0:lI46|H772B4C27A900 +772B4C27A900:lI49|H772B4C27AA20 +772B4C27AA20:lI56|H772B4C27AB40 +772B4C27AB40:lI46|H772B4C27AC60 +772B4C27AC60:lI50|H772B4C27AD80 +772B4C27AD80:lI47|H772B58430370 +772B4C27D3C0:lH772B4C27D2A0|H772B4C27D3D0 +772B4C27D2A0:t2:H772B4C278E10,I-576460752303423166 +772B4C278E10:lI47|H772B4C278E80 +772B4C278E80:lI117|H772B4C278F00 +772B4C278F00:lI115|H772B4C278F90 +772B4C278F90:lI114|H772B4C279020 +772B4C279020:lI47|H772B4C2790C0 +772B4C2790C0:lI108|H772B4C279170 +772B4C279170:lI105|H772B4C279230 +772B4C279230:lI98|H772B4C279300 +772B4C279300:lI47|H772B4C2793E0 +772B4C2793E0:lI101|H772B4C2794D0 +772B4C2794D0:lI114|H772B4C278E30 +772B4C278E30:lI108|H772B4C278EB0 +772B4C278EB0:lI97|H772B4C278F40 +772B4C278F40:lI110|H772B4C278FE0 +772B4C278FE0:lI103|H772B4C279080 +772B4C279080:lI47|H772B4C279130 +772B4C279130:lI108|H772B4C2791F0 +772B4C2791F0:lI105|H772B4C2792C0 +772B4C2792C0:lI98|H772B4C2793A0 +772B4C2793A0:lI47|H772B4C279490 +772B4C279490:lI115|H772B4C279590 +772B4C279590:lI97|H772B4C279690 +772B4C279690:lI115|H772B4C2797A0 +772B4C2797A0:lI108|H772B4C2798C0 +772B4C2798C0:lI45|H772B4C2799F0 +772B4C2799F0:lI52|H772B4C279B30 +772B4C279B30:lI46|H772B4C279C60 +772B4C279C60:lI50|H772B4C279D90 +772B4C279D90:lI46|H772B4C279EC0 +772B4C279EC0:lI50|H772B4C279FF0 +772B4C279FF0:lI47|H772B58430370 +772B4C27D3D0:lH772B4C27D288|H772B4C27D3E0 +772B4C27D288:t2:H772B4C278E90,I-576460752303423134 +772B4C278E90:lI47|H772B4C278F10 +772B4C278F10:lI117|H772B4C278FA0 +772B4C278FA0:lI115|H772B4C279030 +772B4C279030:lI114|H772B4C2790D0 +772B4C2790D0:lI47|H772B4C279180 +772B4C279180:lI108|H772B4C279240 +772B4C279240:lI105|H772B4C279310 +772B4C279310:lI98|H772B4C2793F0 +772B4C2793F0:lI47|H772B4C2794E0 +772B4C2794E0:lI101|H772B4C2795D0 +772B4C2795D0:lI114|H772B4C2796D0 +772B4C2796D0:lI108|H772B4C2797E0 +772B4C2797E0:lI97|H772B4C279900 +772B4C279900:lI110|H772B4C279A30 +772B4C279A30:lI103|H772B4C279B70 +772B4C279B70:lI47|H772B4C279CA0 +772B4C279CA0:lI108|H772B4C279DD0 +772B4C279DD0:lI105|H772B4C279F00 +772B4C279F00:lI98|H772B4C27A030 +772B4C27A030:lI47|H772B4C27A150 +772B4C27A150:lI114|H772B4C27A270 +772B4C27A270:lI117|H772B4C27A390 +772B4C27A390:lI110|H772B4C27A4B0 +772B4C27A4B0:lI116|H772B4C27A5D0 +772B4C27A5D0:lI105|H772B4C27A6F0 +772B4C27A6F0:lI109|H772B4C27A810 +772B4C27A810:lI101|H772B4C27A930 +772B4C27A930:lI95|H772B4C27AA50 +772B4C27AA50:lI116|H772B4C27AB70 +772B4C27AB70:lI111|H772B4C27AC90 +772B4C27AC90:lI111|H772B4C27ADB0 +772B4C27ADB0:lI108|H772B4C27AEC0 +772B4C27AEC0:lI115|H772B4C27AFC0 +772B4C27AFC0:lI45|H772B4C27B0B0 +772B4C27B0B0:lI50|H772B4C27B1A0 +772B4C27B1A0:lI46|H772B4C27B270 +772B4C27B270:lI49|H772B4C27B340 +772B4C27B340:lI46|H772B4C27B410 +772B4C27B410:lI49|H772B4C27B4C0 +772B4C27B4C0:lI47|H772B58430370 +772B4C27D3E0:lH772B4C27D270|H772B4C27D3F0 +772B4C27D270:t2:H772B4C278F20,I-576460752303423102 +772B4C278F20:lI47|H772B4C278FB0 +772B4C278FB0:lI117|H772B4C279040 +772B4C279040:lI115|H772B4C2790E0 +772B4C2790E0:lI114|H772B4C279190 +772B4C279190:lI47|H772B4C279250 +772B4C279250:lI108|H772B4C279320 +772B4C279320:lI105|H772B4C279400 +772B4C279400:lI98|H772B4C2794F0 +772B4C2794F0:lI47|H772B4C2795E0 +772B4C2795E0:lI101|H772B4C2796E0 +772B4C2796E0:lI114|H772B4C2797F0 +772B4C2797F0:lI108|H772B4C279910 +772B4C279910:lI97|H772B4C279A40 +772B4C279A40:lI110|H772B4C279B80 +772B4C279B80:lI103|H772B4C279CB0 +772B4C279CB0:lI47|H772B4C279DE0 +772B4C279DE0:lI108|H772B4C279F10 +772B4C279F10:lI105|H772B4C27A040 +772B4C27A040:lI98|H772B4C27A160 +772B4C27A160:lI47|H772B4C27A280 +772B4C27A280:lI114|H772B4C27A3A0 +772B4C27A3A0:lI101|H772B4C27A4C0 +772B4C27A4C0:lI108|H772B4C27A5E0 +772B4C27A5E0:lI116|H772B4C27A700 +772B4C27A700:lI111|H772B4C27A820 +772B4C27A820:lI111|H772B4C27A940 +772B4C27A940:lI108|H772B4C27AA60 +772B4C27AA60:lI45|H772B4C27AB80 +772B4C27AB80:lI49|H772B4C27ACA0 +772B4C27ACA0:lI46|H772B4C27ADC0 +772B4C27ADC0:lI48|H772B4C27AED0 +772B4C27AED0:lI46|H772B4C27AFD0 +772B4C27AFD0:lI49|H772B4C27B0C0 +772B4C27B0C0:lI47|H772B58430370 +772B4C27D3F0:lH772B4C27D258|H772B4C27D400 +772B4C27D258:t2:H772B4C278FC0,I-576460752303423070 +772B4C278FC0:lI47|H772B4C279050 +772B4C279050:lI117|H772B4C2790F0 +772B4C2790F0:lI115|H772B4C2791A0 +772B4C2791A0:lI114|H772B4C279260 +772B4C279260:lI47|H772B4C279330 +772B4C279330:lI108|H772B4C279410 +772B4C279410:lI105|H772B4C279500 +772B4C279500:lI98|H772B4C2795F0 +772B4C2795F0:lI47|H772B4C2796F0 +772B4C2796F0:lI101|H772B4C279800 +772B4C279800:lI114|H772B4C279920 +772B4C279920:lI108|H772B4C279A50 +772B4C279A50:lI97|H772B4C279B90 +772B4C279B90:lI110|H772B4C279CC0 +772B4C279CC0:lI103|H772B4C279DF0 +772B4C279DF0:lI47|H772B4C279F20 +772B4C279F20:lI108|H772B4C27A050 +772B4C27A050:lI105|H772B4C27A170 +772B4C27A170:lI98|H772B4C27A290 +772B4C27A290:lI47|H772B4C27A3B0 +772B4C27A3B0:lI112|H772B4C27A4D0 +772B4C27A4D0:lI117|H772B4C27A5F0 +772B4C27A5F0:lI98|H772B4C27A710 +772B4C27A710:lI108|H772B4C27A830 +772B4C27A830:lI105|H772B4C27A950 +772B4C27A950:lI99|H772B4C27AA70 +772B4C27AA70:lI95|H772B4C27AB90 +772B4C27AB90:lI107|H772B4C27ACB0 +772B4C27ACB0:lI101|H772B4C27ADD0 +772B4C27ADD0:lI121|H772B4C27AEE0 +772B4C27AEE0:lI45|H772B4C27AFE0 +772B4C27AFE0:lI49|H772B4C27B0D0 +772B4C27B0D0:lI46|H772B4C27B1B0 +772B4C27B1B0:lI49|H772B4C27B280 +772B4C27B280:lI55|H772B4C27B350 +772B4C27B350:lI46|H772B4C27B420 +772B4C27B420:lI49|H772B4C27B4D0 +772B4C27B4D0:lI47|H772B58430370 +772B4C27D400:lH772B4C27D240|H772B4C27D410 +772B4C27D240:t2:H772B4C279060,I-576460752303423038 +772B4C279060:lI47|H772B4C279100 +772B4C279100:lI117|H772B4C2791B0 +772B4C2791B0:lI115|H772B4C279270 +772B4C279270:lI114|H772B4C279340 +772B4C279340:lI47|H772B4C279420 +772B4C279420:lI108|H772B4C279510 +772B4C279510:lI105|H772B4C279600 +772B4C279600:lI98|H772B4C279700 +772B4C279700:lI47|H772B4C279810 +772B4C279810:lI101|H772B4C279930 +772B4C279930:lI114|H772B4C279A60 +772B4C279A60:lI108|H772B4C279BA0 +772B4C279BA0:lI97|H772B4C279CD0 +772B4C279CD0:lI110|H772B4C279E00 +772B4C279E00:lI103|H772B4C279F30 +772B4C279F30:lI47|H772B4C27A060 +772B4C27A060:lI108|H772B4C27A180 +772B4C27A180:lI105|H772B4C27A2A0 +772B4C27A2A0:lI98|H772B4C27A3C0 +772B4C27A3C0:lI47|H772B4C27A4E0 +772B4C27A4E0:lI112|H772B4C27A600 +772B4C27A600:lI97|H772B4C27A720 +772B4C27A720:lI114|H772B4C27A840 +772B4C27A840:lI115|H772B4C27A960 +772B4C27A960:lI101|H772B4C27AA80 +772B4C27AA80:lI116|H772B4C27ABA0 +772B4C27ABA0:lI111|H772B4C27ACC0 +772B4C27ACC0:lI111|H772B4C27ADE0 +772B4C27ADE0:lI108|H772B4C27AEF0 +772B4C27AEF0:lI115|H772B4C27AFF0 +772B4C27AFF0:lI45|H772B4C27B0E0 +772B4C27B0E0:lI50|H772B4C27B1C0 +772B4C27B1C0:lI46|H772B4C27B290 +772B4C27B290:lI54|H772B4C27B360 +772B4C27B360:lI47|H772B58430370 +772B4C27D410:lH772B4C27D228|H772B4C27D420 +772B4C27D228:t2:H772B4C279110,I-576460752303423006 +772B4C279110:lI47|H772B4C2791C0 +772B4C2791C0:lI117|H772B4C279280 +772B4C279280:lI115|H772B4C279350 +772B4C279350:lI114|H772B4C279430 +772B4C279430:lI47|H772B4C279520 +772B4C279520:lI108|H772B4C279610 +772B4C279610:lI105|H772B4C279710 +772B4C279710:lI98|H772B4C279820 +772B4C279820:lI47|H772B4C279940 +772B4C279940:lI101|H772B4C279A70 +772B4C279A70:lI114|H772B4C279BB0 +772B4C279BB0:lI108|H772B4C279CE0 +772B4C279CE0:lI97|H772B4C279E10 +772B4C279E10:lI110|H772B4C279F40 +772B4C279F40:lI103|H772B4C27A070 +772B4C27A070:lI47|H772B4C27A190 +772B4C27A190:lI108|H772B4C27A2B0 +772B4C27A2B0:lI105|H772B4C27A3D0 +772B4C27A3D0:lI98|H772B4C27A4F0 +772B4C27A4F0:lI47|H772B4C27A610 +772B4C27A610:lI111|H772B4C27A730 +772B4C27A730:lI115|H772B4C27A850 +772B4C27A850:lI95|H772B4C27A970 +772B4C27A970:lI109|H772B4C27AA90 +772B4C27AA90:lI111|H772B4C27ABB0 +772B4C27ABB0:lI110|H772B4C27ACD0 +772B4C27ACD0:lI45|H772B4C27ADF0 +772B4C27ADF0:lI50|H772B4C27AF00 +772B4C27AF00:lI46|H772B4C27B000 +772B4C27B000:lI49|H772B4C27B0F0 +772B4C27B0F0:lI48|H772B4C27B1D0 +772B4C27B1D0:lI46|H772B4C27B2A0 +772B4C27B2A0:lI49|H772B4C27B370 +772B4C27B370:lI47|H772B58430370 +772B4C27D420:lH772B4C27D210|H772B4C27D430 +772B4C27D210:t2:H772B4C2791D0,I-576460752303422974 +772B4C2791D0:lI47|H772B4C279290 +772B4C279290:lI117|H772B4C279360 +772B4C279360:lI115|H772B4C279440 +772B4C279440:lI114|H772B4C279530 +772B4C279530:lI47|H772B4C279620 +772B4C279620:lI108|H772B4C279720 +772B4C279720:lI105|H772B4C279830 +772B4C279830:lI98|H772B4C279950 +772B4C279950:lI47|H772B4C279A80 +772B4C279A80:lI101|H772B4C279BC0 +772B4C279BC0:lI114|H772B4C279CF0 +772B4C279CF0:lI108|H772B4C279E20 +772B4C279E20:lI97|H772B4C279F50 +772B4C279F50:lI110|H772B4C27A080 +772B4C27A080:lI103|H772B4C27A1A0 +772B4C27A1A0:lI47|H772B4C27A2C0 +772B4C27A2C0:lI108|H772B4C27A3E0 +772B4C27A3E0:lI105|H772B4C27A500 +772B4C27A500:lI98|H772B4C27A620 +772B4C27A620:lI47|H772B4C27A740 +772B4C27A740:lI111|H772B4C27A860 +772B4C27A860:lI100|H772B4C27A980 +772B4C27A980:lI98|H772B4C27AAA0 +772B4C27AAA0:lI99|H772B4C27ABC0 +772B4C27ABC0:lI45|H772B4C27ACE0 +772B4C27ACE0:lI50|H772B4C27AE00 +772B4C27AE00:lI46|H772B4C27AF10 +772B4C27AF10:lI49|H772B4C27B010 +772B4C27B010:lI53|H772B4C27B100 +772B4C27B100:lI47|H772B58430370 +772B4C27D430:lH772B4C27D1F8|H772B4C27D440 +772B4C27D1F8:t2:H772B4C2792A0,I-576460752303422942 +772B4C2792A0:lI47|H772B4C279370 +772B4C279370:lI117|H772B4C279450 +772B4C279450:lI115|H772B4C279540 +772B4C279540:lI114|H772B4C279630 +772B4C279630:lI47|H772B4C279730 +772B4C279730:lI108|H772B4C279840 +772B4C279840:lI105|H772B4C279960 +772B4C279960:lI98|H772B4C279A90 +772B4C279A90:lI47|H772B4C279BD0 +772B4C279BD0:lI101|H772B4C279D00 +772B4C279D00:lI114|H772B4C279E30 +772B4C279E30:lI108|H772B4C279F60 +772B4C279F60:lI97|H772B4C27A090 +772B4C27A090:lI110|H772B4C27A1B0 +772B4C27A1B0:lI103|H772B4C27A2D0 +772B4C27A2D0:lI47|H772B4C27A3F0 +772B4C27A3F0:lI108|H772B4C27A510 +772B4C27A510:lI105|H772B4C27A630 +772B4C27A630:lI98|H772B4C27A750 +772B4C27A750:lI47|H772B4C27A870 +772B4C27A870:lI111|H772B4C27A990 +772B4C27A990:lI98|H772B4C27AAB0 +772B4C27AAB0:lI115|H772B4C27ABD0 +772B4C27ABD0:lI101|H772B4C27ACF0 +772B4C27ACF0:lI114|H772B4C27AE10 +772B4C27AE10:lI118|H772B4C27AF20 +772B4C27AF20:lI101|H772B4C27B020 +772B4C27B020:lI114|H772B4C27B110 +772B4C27B110:lI45|H772B4C27B1E0 +772B4C27B1E0:lI50|H772B4C27B2B0 +772B4C27B2B0:lI46|H772B4C27B380 +772B4C27B380:lI49|H772B4C27B430 +772B4C27B430:lI55|H772B4C27B4E0 +772B4C27B4E0:lI47|H772B58430370 +772B4C27D440:lH772B4C27D1E0|H772B4C27D450 +772B4C27D1E0:t2:H772B4C279380,I-576460752303422910 +772B4C279380:lI47|H772B4C279460 +772B4C279460:lI117|H772B4C279550 +772B4C279550:lI115|H772B4C279640 +772B4C279640:lI114|H772B4C279740 +772B4C279740:lI47|H772B4C279850 +772B4C279850:lI108|H772B4C279970 +772B4C279970:lI105|H772B4C279AA0 +772B4C279AA0:lI98|H772B4C279BE0 +772B4C279BE0:lI47|H772B4C279D10 +772B4C279D10:lI101|H772B4C279E40 +772B4C279E40:lI114|H772B4C279F70 +772B4C279F70:lI108|H772B4C27A0A0 +772B4C27A0A0:lI97|H772B4C27A1C0 +772B4C27A1C0:lI110|H772B4C27A2E0 +772B4C27A2E0:lI103|H772B4C27A400 +772B4C27A400:lI47|H772B4C27A520 +772B4C27A520:lI108|H772B4C27A640 +772B4C27A640:lI105|H772B4C27A760 +772B4C27A760:lI98|H772B4C27A880 +772B4C27A880:lI47|H772B4C27A9A0 +772B4C27A9A0:lI109|H772B4C27AAC0 +772B4C27AAC0:lI110|H772B4C27ABE0 +772B4C27ABE0:lI101|H772B4C27AD00 +772B4C27AD00:lI115|H772B4C27AE20 +772B4C27AE20:lI105|H772B4C27AF30 +772B4C27AF30:lI97|H772B4C27B030 +772B4C27B030:lI45|H772B4C27B120 +772B4C27B120:lI52|H772B4C27B1F0 +772B4C27B1F0:lI46|H772B4C27B2C0 +772B4C27B2C0:lI50|H772B4C27B390 +772B4C27B390:lI51|H772B4C27B440 +772B4C27B440:lI46|H772B4C27B4F0 +772B4C27B4F0:lI53|H772B4C27B570 +772B4C27B570:lI47|H772B58430370 +772B4C27D450:lH772B4C27D1C8|H772B4C27D460 +772B4C27D1C8:t2:H772B4C279470,I-576460752303422878 +772B4C279470:lI47|H772B4C279560 +772B4C279560:lI117|H772B4C279650 +772B4C279650:lI115|H772B4C279750 +772B4C279750:lI114|H772B4C279860 +772B4C279860:lI47|H772B4C279980 +772B4C279980:lI108|H772B4C279AB0 +772B4C279AB0:lI105|H772B4C279BF0 +772B4C279BF0:lI98|H772B4C279D20 +772B4C279D20:lI47|H772B4C279E50 +772B4C279E50:lI101|H772B4C279F80 +772B4C279F80:lI114|H772B4C27A0B0 +772B4C27A0B0:lI108|H772B4C27A1D0 +772B4C27A1D0:lI97|H772B4C27A2F0 +772B4C27A2F0:lI110|H772B4C27A410 +772B4C27A410:lI103|H772B4C27A530 +772B4C27A530:lI47|H772B4C27A650 +772B4C27A650:lI108|H772B4C27A770 +772B4C27A770:lI105|H772B4C27A890 +772B4C27A890:lI98|H772B4C27A9B0 +772B4C27A9B0:lI47|H772B4C27AAD0 +772B4C27AAD0:lI109|H772B4C27ABF0 +772B4C27ABF0:lI101|H772B4C27AD10 +772B4C27AD10:lI103|H772B4C27AE30 +772B4C27AE30:lI97|H772B4C27AF40 +772B4C27AF40:lI99|H772B4C27B040 +772B4C27B040:lI111|H772B4C27B130 +772B4C27B130:lI45|H772B4C27B200 +772B4C27B200:lI52|H772B4C27B2D0 +772B4C27B2D0:lI46|H772B4C27B3A0 +772B4C27B3A0:lI55|H772B4C27B450 +772B4C27B450:lI46|H772B4C27B500 +772B4C27B500:lI50|H772B4C27B580 +772B4C27B580:lI47|H772B58430370 +772B4C27D460:lH772B4C27D1B0|H772B4C27D470 +772B4C27D1B0:t2:H772B4C279670,I-576460752303422846 +772B4C279670:lI47|H772B4C279770 +772B4C279770:lI117|H772B4C279880 +772B4C279880:lI115|H772B4C2799A0 +772B4C2799A0:lI114|H772B4C279AD0 +772B4C279AD0:lI47|H772B4C279C10 +772B4C279C10:lI108|H772B4C279D40 +772B4C279D40:lI105|H772B4C279E70 +772B4C279E70:lI98|H772B4C279FA0 +772B4C279FA0:lI47|H772B4C27A0D0 +772B4C27A0D0:lI101|H772B4C27A1F0 +772B4C27A1F0:lI114|H772B4C27A310 +772B4C27A310:lI108|H772B4C27A430 +772B4C27A430:lI97|H772B4C27A550 +772B4C27A550:lI110|H772B4C27A670 +772B4C27A670:lI103|H772B4C27A790 +772B4C27A790:lI47|H772B4C27A8B0 +772B4C27A8B0:lI108|H772B4C27A9D0 +772B4C27A9D0:lI105|H772B4C27AAF0 +772B4C27AAF0:lI98|H772B4C27AC10 +772B4C27AC10:lI47|H772B4C27AD30 +772B4C27AD30:lI106|H772B4C27AE50 +772B4C27AE50:lI105|H772B4C27AF60 +772B4C27AF60:lI110|H772B4C27B060 +772B4C27B060:lI116|H772B4C27B150 +772B4C27B150:lI101|H772B4C27B220 +772B4C27B220:lI114|H772B4C27B2F0 +772B4C27B2F0:lI102|H772B4C27B3C0 +772B4C27B3C0:lI97|H772B4C27B470 +772B4C27B470:lI99|H772B4C27B520 +772B4C27B520:lI101|H772B4C27B5A0 +772B4C27B5A0:lI45|H772B4C27B600 +772B4C27B600:lI49|H772B4C27B660 +772B4C27B660:lI46|H772B4C27B6B0 +772B4C27B6B0:lI49|H772B4C27B6E0 +772B4C27B6E0:lI52|H772B4C27B700 +772B4C27B700:lI46|H772B4C27B710 +772B4C27B710:lI49|H772B4C27B720 +772B4C27B720:lI47|H772B58430370 +772B4C27D470:lH772B4C27D198|H772B4C27D480 +772B4C27D198:t2:H772B4C279780,I-576460752303422814 +772B4C279780:lI47|H772B4C279890 +772B4C279890:lI117|H772B4C2799B0 +772B4C2799B0:lI115|H772B4C279AE0 +772B4C279AE0:lI114|H772B4C279C20 +772B4C279C20:lI47|H772B4C279D50 +772B4C279D50:lI108|H772B4C279E80 +772B4C279E80:lI105|H772B4C279FB0 +772B4C279FB0:lI98|H772B4C27A0E0 +772B4C27A0E0:lI47|H772B4C27A200 +772B4C27A200:lI101|H772B4C27A320 +772B4C27A320:lI114|H772B4C27A440 +772B4C27A440:lI108|H772B4C27A560 +772B4C27A560:lI97|H772B4C27A680 +772B4C27A680:lI110|H772B4C27A7A0 +772B4C27A7A0:lI103|H772B4C27A8C0 +772B4C27A8C0:lI47|H772B4C27A9E0 +772B4C27A9E0:lI108|H772B4C27AB00 +772B4C27AB00:lI105|H772B4C27AC20 +772B4C27AC20:lI98|H772B4C27AD40 +772B4C27AD40:lI47|H772B4C27AE60 +772B4C27AE60:lI105|H772B4C27AF70 +772B4C27AF70:lI110|H772B4C27B070 +772B4C27B070:lI101|H772B4C27B160 +772B4C27B160:lI116|H772B4C27B230 +772B4C27B230:lI115|H772B4C27B300 +772B4C27B300:lI45|H772B4C27B3D0 +772B4C27B3D0:lI57|H772B4C27B480 +772B4C27B480:lI46|H772B4C27B530 +772B4C27B530:lI51|H772B4C27B5B0 +772B4C27B5B0:lI46|H772B4C27B610 +772B4C27B610:lI50|H772B4C27B670 +772B4C27B670:lI47|H772B58430370 +772B4C27D480:lH772B4C27D180|H772B4C27D490 +772B4C27D180:t2:H772B4C2798A0,I-576460752303422782 +772B4C2798A0:lI47|H772B4C2799C0 +772B4C2799C0:lI117|H772B4C279AF0 +772B4C279AF0:lI115|H772B4C279C30 +772B4C279C30:lI114|H772B4C279D60 +772B4C279D60:lI47|H772B4C279E90 +772B4C279E90:lI108|H772B4C279FC0 +772B4C279FC0:lI105|H772B4C27A0F0 +772B4C27A0F0:lI98|H772B4C27A210 +772B4C27A210:lI47|H772B4C27A330 +772B4C27A330:lI101|H772B4C27A450 +772B4C27A450:lI114|H772B4C27A570 +772B4C27A570:lI108|H772B4C27A690 +772B4C27A690:lI97|H772B4C27A7B0 +772B4C27A7B0:lI110|H772B4C27A8D0 +772B4C27A8D0:lI103|H772B4C27A9F0 +772B4C27A9F0:lI47|H772B4C27AB10 +772B4C27AB10:lI108|H772B4C27AC30 +772B4C27AC30:lI105|H772B4C27AD50 +772B4C27AD50:lI98|H772B4C27AE70 +772B4C27AE70:lI47|H772B4C27AF80 +772B4C27AF80:lI102|H772B4C27B080 +772B4C27B080:lI116|H772B4C27B170 +772B4C27B170:lI112|H772B4C27B240 +772B4C27B240:lI45|H772B4C27B310 +772B4C27B310:lI49|H772B4C27B3E0 +772B4C27B3E0:lI46|H772B4C27B490 +772B4C27B490:lI50|H772B4C27B540 +772B4C27B540:lI46|H772B4C27B5C0 +772B4C27B5C0:lI51|H772B4C27B620 +772B4C27B620:lI47|H772B58430370 +772B4C27D490:lH772B4C27D168|H772B4C27D4A0 +772B4C27D168:t2:H772B4C2799D0,I-576460752303422750 +772B4C2799D0:lI47|H772B4C279B00 +772B4C279B00:lI117|H772B4C279C40 +772B4C279C40:lI115|H772B4C279D70 +772B4C279D70:lI114|H772B4C279EA0 +772B4C279EA0:lI47|H772B4C279FD0 +772B4C279FD0:lI108|H772B4C27A100 +772B4C27A100:lI105|H772B4C27A220 +772B4C27A220:lI98|H772B4C27A340 +772B4C27A340:lI47|H772B4C27A460 +772B4C27A460:lI101|H772B4C27A580 +772B4C27A580:lI114|H772B4C27A6A0 +772B4C27A6A0:lI108|H772B4C27A7C0 +772B4C27A7C0:lI97|H772B4C27A8E0 +772B4C27A8E0:lI110|H772B4C27AA00 +772B4C27AA00:lI103|H772B4C27AB20 +772B4C27AB20:lI47|H772B4C27AC40 +772B4C27AC40:lI108|H772B4C27AD60 +772B4C27AD60:lI105|H772B4C27AE80 +772B4C27AE80:lI98|H772B4C27AF90 +772B4C27AF90:lI47|H772B4C27B090 +772B4C27B090:lI101|H772B4C27B180 +772B4C27B180:lI117|H772B4C27B250 +772B4C27B250:lI110|H772B4C27B320 +772B4C27B320:lI105|H772B4C27B3F0 +772B4C27B3F0:lI116|H772B4C27B4A0 +772B4C27B4A0:lI45|H772B4C27B550 +772B4C27B550:lI50|H772B4C27B5D0 +772B4C27B5D0:lI46|H772B4C27B630 +772B4C27B630:lI57|H772B4C27B680 +772B4C27B680:lI46|H772B4C27B6C0 +772B4C27B6C0:lI49|H772B4C27B6F0 +772B4C27B6F0:lI47|H772B58430370 +772B4C27D4A0:lH772B4C27D150|H772B4C27D4B0 +772B4C27D150:t2:H772B4C279B10,I-576460752303422718 +772B4C279B10:lI47|H772B4C279C50 +772B4C279C50:lI117|H772B4C279D80 +772B4C279D80:lI115|H772B4C279EB0 +772B4C279EB0:lI114|H772B4C279FE0 +772B4C279FE0:lI47|H772B4C27A110 +772B4C27A110:lI108|H772B4C27A230 +772B4C27A230:lI105|H772B4C27A350 +772B4C27A350:lI98|H772B4C27A470 +772B4C27A470:lI47|H772B4C27A590 +772B4C27A590:lI101|H772B4C27A6B0 +772B4C27A6B0:lI114|H772B4C27A7D0 +772B4C27A7D0:lI108|H772B4C27A8F0 +772B4C27A8F0:lI97|H772B4C27AA10 +772B4C27AA10:lI110|H772B4C27AB30 +772B4C27AB30:lI103|H772B4C27AC50 +772B4C27AC50:lI47|H772B4C27AD70 +772B4C27AD70:lI108|H772B4C27AE90 +772B4C27AE90:lI105|H772B4C27AFA0 +772B4C27AFA0:lI98|H772B4C27B0A0 +772B4C27B0A0:lI47|H772B4C27B190 +772B4C27B190:lI101|H772B4C27B260 +772B4C27B260:lI116|H772B4C27B330 +772B4C27B330:lI45|H772B4C27B400 +772B4C27B400:lI49|H772B4C27B4B0 +772B4C27B4B0:lI46|H772B4C27B560 +772B4C27B560:lI55|H772B4C27B5E0 +772B4C27B5E0:lI46|H772B4C27B640 +772B4C27B640:lI49|H772B4C27B690 +772B4C27B690:lI47|H772B58430370 +772B4C27D4B0:lH772B4C27D138|H772B4C27D4C0 +772B4C27D138:t2:H772B4C277550,I-576460752303422686 +772B4C277550:lI47|H772B4C277580 +772B4C277580:lI117|H772B4C2775C0 +772B4C2775C0:lI115|H772B4C277610 +772B4C277610:lI114|H772B4C277670 +772B4C277670:lI47|H772B4C2776E0 +772B4C2776E0:lI108|H772B4C277750 +772B4C277750:lI105|H772B4C2777D0 +772B4C2777D0:lI98|H772B4C277860 +772B4C277860:lI47|H772B4C277900 +772B4C277900:lI101|H772B4C2779B0 +772B4C2779B0:lI114|H772B4C277A60 +772B4C277A60:lI108|H772B4C277B10 +772B4C277B10:lI97|H772B4C277BC0 +772B4C277BC0:lI110|H772B4C277C70 +772B4C277C70:lI103|H772B4C277D20 +772B4C277D20:lI47|H772B4C277DD0 +772B4C277DD0:lI108|H772B4C277E80 +772B4C277E80:lI105|H772B4C277F30 +772B4C277F30:lI98|H772B4C277FE0 +772B4C277FE0:lI47|H772B4C278090 +772B4C278090:lI101|H772B4C278140 +772B4C278140:lI114|H772B4C2781F0 +772B4C2781F0:lI116|H772B4C2782A0 +772B4C2782A0:lI115|H772B4C278350 +772B4C278350:lI45|H772B4C278400 +772B4C278400:lI49|H772B4C2784B0 +772B4C2784B0:lI53|H772B4C278560 +772B4C278560:lI46|H772B4C278610 +772B4C278610:lI50|H772B4C2786C0 +772B4C2786C0:lI46|H772B4C278770 +772B4C278770:lI55|H772B4C278820 +772B4C278820:lI47|H772B58430370 +772B4C27D4C0:lH772B4C27D120|H772B4C27D4D0 +772B4C27D120:t2:H772B4C277590,I-576460752303422654 +772B4C277590:lI47|H772B4C2775D0 +772B4C2775D0:lI117|H772B4C277620 +772B4C277620:lI115|H772B4C277680 +772B4C277680:lI114|H772B4C2776F0 +772B4C2776F0:lI47|H772B4C277760 +772B4C277760:lI108|H772B4C2777E0 +772B4C2777E0:lI105|H772B4C277870 +772B4C277870:lI98|H772B4C277910 +772B4C277910:lI47|H772B4C2779C0 +772B4C2779C0:lI101|H772B4C277A70 +772B4C277A70:lI114|H772B4C277B20 +772B4C277B20:lI108|H772B4C277BD0 +772B4C277BD0:lI97|H772B4C277C80 +772B4C277C80:lI110|H772B4C277D30 +772B4C277D30:lI103|H772B4C277DE0 +772B4C277DE0:lI47|H772B4C277E90 +772B4C277E90:lI108|H772B4C277F40 +772B4C277F40:lI105|H772B4C277FF0 +772B4C277FF0:lI98|H772B4C2780A0 +772B4C2780A0:lI47|H772B4C278150 +772B4C278150:lI101|H772B4C278200 +772B4C278200:lI114|H772B4C2782B0 +772B4C2782B0:lI108|H772B4C278360 +772B4C278360:lI95|H772B4C278410 +772B4C278410:lI105|H772B4C2784C0 +772B4C2784C0:lI110|H772B4C278570 +772B4C278570:lI116|H772B4C278620 +772B4C278620:lI101|H772B4C2786D0 +772B4C2786D0:lI114|H772B4C278780 +772B4C278780:lI102|H772B4C278830 +772B4C278830:lI97|H772B4C2788D0 +772B4C2788D0:lI99|H772B4C278970 +772B4C278970:lI101|H772B4C278A10 +772B4C278A10:lI45|H772B4C278AA0 +772B4C278AA0:lI53|H772B4C278B30 +772B4C278B30:lI46|H772B4C278BC0 +772B4C278BC0:lI53|H772B4C278C40 +772B4C278C40:lI46|H772B4C278CC0 +772B4C278CC0:lI50|H772B4C278D20 +772B4C278D20:lI47|H772B58430370 +772B4C27D4D0:lH772B4C27D108|H772B4C27D4E0 +772B4C27D108:t2:H772B4C2775E0,I-576460752303422622 +772B4C2775E0:lI47|H772B4C277630 +772B4C277630:lI117|H772B4C277690 +772B4C277690:lI115|H772B4C277700 +772B4C277700:lI114|H772B4C277770 +772B4C277770:lI47|H772B4C2777F0 +772B4C2777F0:lI108|H772B4C277880 +772B4C277880:lI105|H772B4C277920 +772B4C277920:lI98|H772B4C2779D0 +772B4C2779D0:lI47|H772B4C277A80 +772B4C277A80:lI101|H772B4C277B30 +772B4C277B30:lI114|H772B4C277BE0 +772B4C277BE0:lI108|H772B4C277C90 +772B4C277C90:lI97|H772B4C277D40 +772B4C277D40:lI110|H772B4C277DF0 +772B4C277DF0:lI103|H772B4C277EA0 +772B4C277EA0:lI47|H772B4C277F50 +772B4C277F50:lI108|H772B4C278000 +772B4C278000:lI105|H772B4C2780B0 +772B4C2780B0:lI98|H772B4C278160 +772B4C278160:lI47|H772B4C278210 +772B4C278210:lI101|H772B4C2782C0 +772B4C2782C0:lI108|H772B4C278370 +772B4C278370:lI100|H772B4C278420 +772B4C278420:lI97|H772B4C2784D0 +772B4C2784D0:lI112|H772B4C278580 +772B4C278580:lI45|H772B4C278630 +772B4C278630:lI49|H772B4C2786E0 +772B4C2786E0:lI46|H772B4C278790 +772B4C278790:lI50|H772B4C278840 +772B4C278840:lI46|H772B4C2788E0 +772B4C2788E0:lI49|H772B4C278980 +772B4C278980:lI52|H772B4C278A20 +772B4C278A20:lI46|H772B4C278AB0 +772B4C278AB0:lI49|H772B4C278B40 +772B4C278B40:lI47|H772B58430370 +772B4C27D4E0:lH772B4C27D0F0|H772B4C27D4F0 +772B4C27D0F0:t2:H772B4C277640,I-576460752303422590 +772B4C277640:lI47|H772B4C2776A0 +772B4C2776A0:lI117|H772B4C277710 +772B4C277710:lI115|H772B4C277780 +772B4C277780:lI114|H772B4C277800 +772B4C277800:lI47|H772B4C277890 +772B4C277890:lI108|H772B4C277930 +772B4C277930:lI105|H772B4C2779E0 +772B4C2779E0:lI98|H772B4C277A90 +772B4C277A90:lI47|H772B4C277B40 +772B4C277B40:lI101|H772B4C277BF0 +772B4C277BF0:lI114|H772B4C277CA0 +772B4C277CA0:lI108|H772B4C277D50 +772B4C277D50:lI97|H772B4C277E00 +772B4C277E00:lI110|H772B4C277EB0 +772B4C277EB0:lI103|H772B4C277F60 +772B4C277F60:lI47|H772B4C278010 +772B4C278010:lI108|H772B4C2780C0 +772B4C2780C0:lI105|H772B4C278170 +772B4C278170:lI98|H772B4C278220 +772B4C278220:lI47|H772B4C2782D0 +772B4C2782D0:lI101|H772B4C278380 +772B4C278380:lI100|H772B4C278430 +772B4C278430:lI111|H772B4C2784E0 +772B4C2784E0:lI99|H772B4C278590 +772B4C278590:lI45|H772B4C278640 +772B4C278640:lI49|H772B4C2786F0 +772B4C2786F0:lI46|H772B4C2787A0 +772B4C2787A0:lI51|H772B4C278850 +772B4C278850:lI46|H772B4C2788F0 +772B4C2788F0:lI50|H772B4C278990 +772B4C278990:lI47|H772B58430370 +772B4C27D4F0:lH772B4C27D0D8|H772B4C27D500 +772B4C27D0D8:t2:H772B4C2776B0,I-576460752303422558 +772B4C2776B0:lI47|H772B4C277720 +772B4C277720:lI117|H772B4C277790 +772B4C277790:lI115|H772B4C277810 +772B4C277810:lI114|H772B4C2778A0 +772B4C2778A0:lI47|H772B4C277940 +772B4C277940:lI108|H772B4C2779F0 +772B4C2779F0:lI105|H772B4C277AA0 +772B4C277AA0:lI98|H772B4C277B50 +772B4C277B50:lI47|H772B4C277C00 +772B4C277C00:lI101|H772B4C277CB0 +772B4C277CB0:lI114|H772B4C277D60 +772B4C277D60:lI108|H772B4C277E10 +772B4C277E10:lI97|H772B4C277EC0 +772B4C277EC0:lI110|H772B4C277F70 +772B4C277F70:lI103|H772B4C278020 +772B4C278020:lI47|H772B4C2780D0 +772B4C2780D0:lI108|H772B4C278180 +772B4C278180:lI105|H772B4C278230 +772B4C278230:lI98|H772B4C2782E0 +772B4C2782E0:lI47|H772B4C278390 +772B4C278390:lI100|H772B4C278440 +772B4C278440:lI105|H772B4C2784F0 +772B4C2784F0:lI97|H772B4C2785A0 +772B4C2785A0:lI109|H772B4C278650 +772B4C278650:lI101|H772B4C278700 +772B4C278700:lI116|H772B4C2787B0 +772B4C2787B0:lI101|H772B4C278860 +772B4C278860:lI114|H772B4C278900 +772B4C278900:lI45|H772B4C2789A0 +772B4C2789A0:lI50|H772B4C278A30 +772B4C278A30:lI46|H772B4C278AC0 +772B4C278AC0:lI52|H772B4C278B50 +772B4C278B50:lI46|H772B4C278BD0 +772B4C278BD0:lI49|H772B4C278C50 +772B4C278C50:lI47|H772B58430370 +772B4C27D500:lH772B4C27D0B0|H772B4C27D510 +772B4C27D0B0:t2:H772B4C277730,I-576460752303422526 +772B4C277730:lI47|H772B4C2777A0 +772B4C2777A0:lI117|H772B4C277820 +772B4C277820:lI115|H772B4C2778B0 +772B4C2778B0:lI114|H772B4C277950 +772B4C277950:lI47|H772B4C277A00 +772B4C277A00:lI108|H772B4C277AB0 +772B4C277AB0:lI105|H772B4C277B60 +772B4C277B60:lI98|H772B4C277C10 +772B4C277C10:lI47|H772B4C277CC0 +772B4C277CC0:lI101|H772B4C277D70 +772B4C277D70:lI114|H772B4C277E20 +772B4C277E20:lI108|H772B4C277ED0 +772B4C277ED0:lI97|H772B4C277F80 +772B4C277F80:lI110|H772B4C278030 +772B4C278030:lI103|H772B4C2780E0 +772B4C2780E0:lI47|H772B4C278190 +772B4C278190:lI108|H772B4C278240 +772B4C278240:lI105|H772B4C2782F0 +772B4C2782F0:lI98|H772B4C2783A0 +772B4C2783A0:lI47|H772B4C278450 +772B4C278450:lI100|H772B4C278500 +772B4C278500:lI105|H772B4C2785B0 +772B4C2785B0:lI97|H772B4C278660 +772B4C278660:lI108|H772B4C278710 +772B4C278710:lI121|H772B4C2787C0 +772B4C2787C0:lI122|H772B4C278870 +772B4C278870:lI101|H772B4C278910 +772B4C278910:lI114|H772B4C2789B0 +772B4C2789B0:lI45|H772B4C278A40 +772B4C278A40:lI53|H772B4C278AD0 +772B4C278AD0:lI46|H772B4C278B60 +772B4C278B60:lI51|H772B4C278BE0 +772B4C278BE0:lI46|H772B4C278C60 +772B4C278C60:lI49|H772B4C278CD0 +772B4C278CD0:lI47|H772B58430370 +772B4C27D510:lH772B4C27D098|H772B4C27D520 +772B4C27D098:t2:H772B4C2777B0,I-576460752303422494 +772B4C2777B0:lI47|H772B4C277830 +772B4C277830:lI117|H772B4C2778C0 +772B4C2778C0:lI115|H772B4C277960 +772B4C277960:lI114|H772B4C277A10 +772B4C277A10:lI47|H772B4C277AC0 +772B4C277AC0:lI108|H772B4C277B70 +772B4C277B70:lI105|H772B4C277C20 +772B4C277C20:lI98|H772B4C277CD0 +772B4C277CD0:lI47|H772B4C277D80 +772B4C277D80:lI101|H772B4C277E30 +772B4C277E30:lI114|H772B4C277EE0 +772B4C277EE0:lI108|H772B4C277F90 +772B4C277F90:lI97|H772B4C278040 +772B4C278040:lI110|H772B4C2780F0 +772B4C2780F0:lI103|H772B4C2781A0 +772B4C2781A0:lI47|H772B4C278250 +772B4C278250:lI108|H772B4C278300 +772B4C278300:lI105|H772B4C2783B0 +772B4C2783B0:lI98|H772B4C278460 +772B4C278460:lI47|H772B4C278510 +772B4C278510:lI100|H772B4C2785C0 +772B4C2785C0:lI101|H772B4C278670 +772B4C278670:lI98|H772B4C278720 +772B4C278720:lI117|H772B4C2787D0 +772B4C2787D0:lI103|H772B4C278880 +772B4C278880:lI103|H772B4C278920 +772B4C278920:lI101|H772B4C2789C0 +772B4C2789C0:lI114|H772B4C278A50 +772B4C278A50:lI45|H772B4C278AE0 +772B4C278AE0:lI53|H772B4C278B70 +772B4C278B70:lI46|H772B4C278BF0 +772B4C278BF0:lI53|H772B4C278C70 +772B4C278C70:lI47|H772B58430370 +772B4C27D520:lH772B4C27D080|H772B4C27D530 +772B4C27D080:t2:H772B4C277840,I-576460752303422462 +772B4C277840:lI47|H772B4C2778D0 +772B4C2778D0:lI117|H772B4C277970 +772B4C277970:lI115|H772B4C277A20 +772B4C277A20:lI114|H772B4C277AD0 +772B4C277AD0:lI47|H772B4C277B80 +772B4C277B80:lI108|H772B4C277C30 +772B4C277C30:lI105|H772B4C277CE0 +772B4C277CE0:lI98|H772B4C277D90 +772B4C277D90:lI47|H772B4C277E40 +772B4C277E40:lI101|H772B4C277EF0 +772B4C277EF0:lI114|H772B4C277FA0 +772B4C277FA0:lI108|H772B4C278050 +772B4C278050:lI97|H772B4C278100 +772B4C278100:lI110|H772B4C2781B0 +772B4C2781B0:lI103|H772B4C278260 +772B4C278260:lI47|H772B4C278310 +772B4C278310:lI108|H772B4C2783C0 +772B4C2783C0:lI105|H772B4C278470 +772B4C278470:lI98|H772B4C278520 +772B4C278520:lI47|H772B4C2785D0 +772B4C2785D0:lI99|H772B4C278680 +772B4C278680:lI114|H772B4C278730 +772B4C278730:lI121|H772B4C2787E0 +772B4C2787E0:lI112|H772B4C278890 +772B4C278890:lI116|H772B4C278930 +772B4C278930:lI111|H772B4C2789D0 +772B4C2789D0:lI45|H772B4C278A60 +772B4C278A60:lI53|H772B4C278AF0 +772B4C278AF0:lI46|H772B4C278B80 +772B4C278B80:lI53|H772B4C278C00 +772B4C278C00:lI46|H772B4C278C80 +772B4C278C80:lI51|H772B4C278CE0 +772B4C278CE0:lI47|H772B58430370 +772B4C27D530:lH772B4C27D068|H772B4C27D540 +772B4C27D068:t2:H772B4C2778E0,I-576460752303422430 +772B4C2778E0:lI47|H772B4C277980 +772B4C277980:lI117|H772B4C277A30 +772B4C277A30:lI115|H772B4C277AE0 +772B4C277AE0:lI114|H772B4C277B90 +772B4C277B90:lI47|H772B4C277C40 +772B4C277C40:lI108|H772B4C277CF0 +772B4C277CF0:lI105|H772B4C277DA0 +772B4C277DA0:lI98|H772B4C277E50 +772B4C277E50:lI47|H772B4C277F00 +772B4C277F00:lI101|H772B4C277FB0 +772B4C277FB0:lI114|H772B4C278060 +772B4C278060:lI108|H772B4C278110 +772B4C278110:lI97|H772B4C2781C0 +772B4C2781C0:lI110|H772B4C278270 +772B4C278270:lI103|H772B4C278320 +772B4C278320:lI47|H772B4C2783D0 +772B4C2783D0:lI108|H772B4C278480 +772B4C278480:lI105|H772B4C278530 +772B4C278530:lI98|H772B4C2785E0 +772B4C2785E0:lI47|H772B4C278690 +772B4C278690:lI99|H772B4C278740 +772B4C278740:lI111|H772B4C2787F0 +772B4C2787F0:lI109|H772B4C2788A0 +772B4C2788A0:lI112|H772B4C278940 +772B4C278940:lI105|H772B4C2789E0 +772B4C2789E0:lI108|H772B4C278A70 +772B4C278A70:lI101|H772B4C278B00 +772B4C278B00:lI114|H772B4C278B90 +772B4C278B90:lI45|H772B4C278C10 +772B4C278C10:lI56|H772B4C278C90 +772B4C278C90:lI46|H772B4C278CF0 +772B4C278CF0:lI54|H772B4C278D30 +772B4C278D30:lI46|H772B4C278D60 +772B4C278D60:lI49|H772B4C278D90 +772B4C278D90:lI47|H772B58430370 +772B4C27D540:lH772B4C27D050|H772B4C27D550 +772B4C27D050:t2:H772B4C277990,I-576460752303422398 +772B4C277990:lI47|H772B4C277A40 +772B4C277A40:lI117|H772B4C277AF0 +772B4C277AF0:lI115|H772B4C277BA0 +772B4C277BA0:lI114|H772B4C277C50 +772B4C277C50:lI47|H772B4C277D00 +772B4C277D00:lI108|H772B4C277DB0 +772B4C277DB0:lI105|H772B4C277E60 +772B4C277E60:lI98|H772B4C277F10 +772B4C277F10:lI47|H772B4C277FC0 +772B4C277FC0:lI101|H772B4C278070 +772B4C278070:lI114|H772B4C278120 +772B4C278120:lI108|H772B4C2781D0 +772B4C2781D0:lI97|H772B4C278280 +772B4C278280:lI110|H772B4C278330 +772B4C278330:lI103|H772B4C2783E0 +772B4C2783E0:lI47|H772B4C278490 +772B4C278490:lI108|H772B4C278540 +772B4C278540:lI105|H772B4C2785F0 +772B4C2785F0:lI98|H772B4C2786A0 +772B4C2786A0:lI47|H772B4C278750 +772B4C278750:lI99|H772B4C278800 +772B4C278800:lI111|H772B4C2788B0 +772B4C2788B0:lI109|H772B4C278950 +772B4C278950:lI109|H772B4C2789F0 +772B4C2789F0:lI111|H772B4C278A80 +772B4C278A80:lI110|H772B4C278B10 +772B4C278B10:lI95|H772B4C278BA0 +772B4C278BA0:lI116|H772B4C278C20 +772B4C278C20:lI101|H772B4C278CA0 +772B4C278CA0:lI115|H772B4C278D00 +772B4C278D00:lI116|H772B4C278D40 +772B4C278D40:lI45|H772B4C278D70 +772B4C278D70:lI49|H772B4C278DA0 +772B4C278DA0:lI46|H772B4C278DC0 +772B4C278DC0:lI50|H772B4C278DD0 +772B4C278DD0:lI55|H772B4C278DE0 +772B4C278DE0:lI46|H772B4C278DF0 +772B4C278DF0:lI55|H772B4C278E00 +772B4C278E00:lI47|H772B58430370 +772B4C27D550:lH772B4C27D560|N +772B4C27D560:t2:H772B4C277A50,I-576460752303422366 +772B4C277A50:lI47|H772B4C277B00 +772B4C277B00:lI117|H772B4C277BB0 +772B4C277BB0:lI115|H772B4C277C60 +772B4C277C60:lI114|H772B4C277D10 +772B4C277D10:lI47|H772B4C277DC0 +772B4C277DC0:lI108|H772B4C277E70 +772B4C277E70:lI105|H772B4C277F20 +772B4C277F20:lI98|H772B4C277FD0 +772B4C277FD0:lI47|H772B4C278080 +772B4C278080:lI101|H772B4C278130 +772B4C278130:lI114|H772B4C2781E0 +772B4C2781E0:lI108|H772B4C278290 +772B4C278290:lI97|H772B4C278340 +772B4C278340:lI110|H772B4C2783F0 +772B4C2783F0:lI103|H772B4C2784A0 +772B4C2784A0:lI47|H772B4C278550 +772B4C278550:lI108|H772B4C278600 +772B4C278600:lI105|H772B4C2786B0 +772B4C2786B0:lI98|H772B4C278760 +772B4C278760:lI47|H772B4C278810 +772B4C278810:lI97|H772B4C2788C0 +772B4C2788C0:lI115|H772B4C278960 +772B4C278960:lI110|H772B4C278A00 +772B4C278A00:lI49|H772B4C278A90 +772B4C278A90:lI45|H772B4C278B20 +772B4C278B20:lI53|H772B4C278BB0 +772B4C278BB0:lI46|H772B4C278C30 +772B4C278C30:lI51|H772B4C278CB0 +772B4C278CB0:lI46|H772B4C278D10 +772B4C278D10:lI52|H772B4C278D50 +772B4C278D50:lI46|H772B4C278D80 +772B4C278D80:lI49|H772B4C278DB0 +772B4C278DB0:lI47|H772B58430370 +772B4C273818:lI47|H772B4C273900 +772B4C273900:lI117|H772B4C2739D0 +772B4C2739D0:lI115|H772B4C273AA0 +772B4C273AA0:lI114|H772B4C273B70 +772B4C273B70:lI47|H772B4C273C40 +772B4C273C40:lI108|H772B4C273D10 +772B4C273D10:lI105|H772B4C273DE0 +772B4C273DE0:lI98|H772B4C273EB0 +772B4C273EB0:lI47|H772B4C273F80 +772B4C273F80:lI101|H772B4C274050 +772B4C274050:lI114|H772B4C274120 +772B4C274120:lI108|H772B4C2741F0 +772B4C2741F0:lI97|H772B4C2742C0 +772B4C2742C0:lI110|H772B4C274390 +772B4C274390:lI103|N +772B4C2AA3C0:t4:AB:load_module,H772B4C2AA0B0,H772B4C2AA3B0,A4:true +772B4C2AA3B0:lI47|H772B4C2AA3A0 +772B4C2AA3A0:lI117|H772B4C2AA390 +772B4C2AA390:lI115|H772B4C2AA380 +772B4C2AA380:lI114|H772B4C2AA370 +772B4C2AA370:lI47|H772B4C2AA360 +772B4C2AA360:lI108|H772B4C2AA350 +772B4C2AA350:lI105|H772B4C2AA340 +772B4C2AA340:lI98|H772B4C2AA330 +772B4C2AA330:lI47|H772B4C2AA320 +772B4C2AA320:lI101|H772B4C2AA310 +772B4C2AA310:lI114|H772B4C2AA300 +772B4C2AA300:lI108|H772B4C2AA2F0 +772B4C2AA2F0:lI97|H772B4C2AA2E0 +772B4C2AA2E0:lI110|H772B4C2AA2D0 +772B4C2AA2D0:lI103|H772B4C2AA2C0 +772B4C2AA2C0:lI47|H772B4C2AA2B0 +772B4C2AA2B0:lI108|H772B4C2AA2A0 +772B4C2AA2A0:lI105|H772B4C2AA290 +772B4C2AA290:lI98|H772B4C2AA280 +772B4C2AA280:lI47|H772B4C2AA270 +772B4C2AA270:lI115|H772B4C2AA260 +772B4C2AA260:lI116|H772B4C2AA250 +772B4C2AA250:lI100|H772B4C2AA240 +772B4C2AA240:lI108|H772B4C2AA230 +772B4C2AA230:lI105|H772B4C2AA220 +772B4C2AA220:lI98|H772B4C2AA210 +772B4C2AA210:lI45|H772B4C2AA200 +772B4C2AA200:lI54|H772B4C2AA1F0 +772B4C2AA1F0:lI46|H772B4C2AA1E0 +772B4C2AA1E0:lI50|H772B4C2AA1D0 +772B4C2AA1D0:lI46|H772B4C2AA1C0 +772B4C2AA1C0:lI50|H772B4C2AA1B0 +772B4C2AA1B0:lI46|H772B4C2AA1A0 +772B4C2AA1A0:lI49|H772B4C2AA190 +772B4C2AA190:lI47|H772B4C2AA180 +772B4C2AA180:lI101|H772B4C2AA170 +772B4C2AA170:lI98|H772B4C2AA160 +772B4C2AA160:lI105|H772B4C2AA150 +772B4C2AA150:lI110|H772B4C2AA140 +772B4C2AA140:lI47|H772B4C2AA130 +772B4C2AA130:lI115|H772B4C2AA120 +772B4C2AA120:lI116|H772B4C2AA110 +772B4C2AA110:lI114|H772B4C2AA100 +772B4C2AA100:lI105|H772B4C2AA0F0 +772B4C2AA0F0:lI110|H772B4C2AA0E0 +772B4C2AA0E0:lI103|H772B58421960 +772B4C2AA0B0:E23:g1oAA3cNbm9ub2RlQG5vaG9zdAAAAAAAA5dfQkIAAumgILU= +=proc_dictionary:<0.51.0> +H772B4C215A60 +H772B4C215A98 +=proc_stack:<0.51.0> +y0:N +y1:A8:infinity +y2:H772B4C215AB0 +y3:H772B4C215B78 +y4:A12:standard_error_sup +y5:P<0.49.0> +0x0000772b4c216070:SReturn addr 0x50D2C2E8 (proc_lib:init_p_do_apply/3 + 192) +y0:N +y1:N +y2:SCatch 0x50D2C2FD (proc_lib:init_p_do_apply/3 + 213) +0x0000772b4c216090:SReturn addr 0x50C011F8 () +=proc_heap:<0.51.0> +772B4C215AB0:t5:AE:callback_cache,A11:supervisor_bridge,H772B58419260,H772B58419250,H772B58419240 +772B4C215B78:t5:A5:state,AE:standard_error,P<0.52.0>,P<0.52.0>,H772B58468C08 +772B4C215A60:t2:AA:$ancestors,H772B4C215A50 +772B4C215A50:lAA:kernel_sup|H772B4C215A10 +772B4C215A10:lP<0.47.0>|N +772B4C215A98:t2:AD:$initial_call,H772B4C215A78 +772B4C215A78:t3:A11:supervisor_bridge,AE:standard_error,I1 +=proc_dictionary:<0.52.0> +H772B4C233FF8 +H772B4C234010 +H772B4C234028 +=proc_stack:<0.52.0> +y0:N +y1:N +y2:p<0.1> +0x0000772b4c234b50:SReturn addr 0x50C011F8 () +=proc_heap:<0.52.0> +772B4C233FF8:t2:A3:log,A4:none +772B4C234010:t2:A5:onlcr,A5:false +772B4C234028:t2:A8:encoding,A7:unicode +=proc_dictionary:<0.53.0> +H772B4C233438 +H772B4C233450 +=proc_stack:<0.53.0> +y0:N +y1:A8:infinity +y2:H772B4C233408 +y3:A9:undefined +y4:AD:file_server_2 +y5:P<0.49.0> +0x0000772b4c233f68:SReturn addr 0x50D2C2E8 (proc_lib:init_p_do_apply/3 + 192) +y0:N +y1:N +y2:SCatch 0x50D2C2FD (proc_lib:init_p_do_apply/3 + 213) +0x0000772b4c233f88:SReturn addr 0x50C011F8 () +=proc_heap:<0.53.0> +772B4C233408:t5:AE:callback_cache,AB:file_server,H772B58416FB0,H772B58416FA0,H772B58416F90 +772B4C233438:t2:AA:$ancestors,H772B4C233490 +772B4C233490:lAA:kernel_sup|H772B4C2334D0 +772B4C2334D0:lP<0.47.0>|N +772B4C233450:t2:AD:$initial_call,H772B4C2334A0 +772B4C2334A0:t3:AB:file_server,A4:init,I1 +=proc_dictionary:<0.55.0> +H772B4C242660 +H772B4C242678 +=proc_stack:<0.55.0> +y0:N +y1:A8:infinity +y2:H772B4C2426E0 +y3:H772B4C242690 +y4:A7:inet_db +y5:P<0.49.0> +0x0000772b4c242630:SReturn addr 0x50D2C2E8 (proc_lib:init_p_do_apply/3 + 192) +y0:N +y1:N +y2:SCatch 0x50D2C2FD (proc_lib:init_p_do_apply/3 + 213) +0x0000772b4c242650:SReturn addr 0x50C011F8 () +=proc_heap:<0.55.0> +772B4C2426E0:t5:AE:callback_cache,A7:inet_db,H772B58419310,H772B58419300,H772B584192F0 +772B4C242690:t9:A5:state,A7:inet_db,AA:inet_cache,A11:inet_hosts_byname,A11:inet_hosts_byaddr,A16:inet_hosts_file_byname,A16:inet_hosts_file_byaddr,AC:inet_sockets,H772B4C242740 +772B4C242740:E23:g1oAA3cNbm9ub2RlQG5vaG9zdAAAAAAAA5ZsQkAAAumgILU= +772B4C242660:t2:AA:$ancestors,H772B4C242710 +772B4C242710:lAA:kernel_sup|H772B4C242758 +772B4C242758:lP<0.47.0>|N +772B4C242678:t2:AD:$initial_call,H772B4C242720 +772B4C242720:t3:A7:inet_db,A4:init,I1 +=proc_dictionary:<0.57.0> +H772B4C23F548 +H772B4C23F580 +=proc_stack:<0.57.0> +y0:N +y1:A8:infinity +y2:H772B4C23F598 +y3:H772B4C23F608 +y4:A3:rex +y5:P<0.49.0> +0x0000772b4c23fb88:SReturn addr 0x50D2C2E8 (proc_lib:init_p_do_apply/3 + 192) +y0:N +y1:N +y2:SCatch 0x50D2C2FD (proc_lib:init_p_do_apply/3 + 213) +0x0000772b4c23fba8:SReturn addr 0x50C011F8 () +=proc_heap:<0.57.0> +772B4C23F598:t5:AE:callback_cache,A3:rpc,H772B5841A5F0,H772B5841A5E0,H772B5841A5D0 +772B4C23F608:Mf1:H772B58471BB0:H772B4C23F5F0 +772B4C23F5F0:t2:P<0.58.0>,H772B4C23F5D8 +772B4C23F5D8:E23:g1oAA3cNbm9ub2RlQG5vaG9zdAAAAAAAA5aXQkAAAumgILU= +772B4C23F548:t2:AA:$ancestors,H772B4C23F538 +772B4C23F538:lAA:kernel_sup|H772B4C23F4F8 +772B4C23F4F8:lP<0.47.0>|N +772B4C23F580:t2:AD:$initial_call,H772B4C23F560 +772B4C23F560:t3:A3:rpc,A4:init,I1 +=proc_stack:<0.58.0> +y0:N +y1:H772B4C2384E8 +y2:N +0x0000772b4c239068:SReturn addr 0x50C011F8 () +=proc_heap:<0.58.0> +772B4C2384E8:E23:g1oAA3cNbm9ub2RlQG5vaG9zdAAAAAAAA5aYQkIAAumgILU= +=proc_dictionary:<0.59.0> +H772B4C22B230 +H772B4C22B218 +H772B4C219060 +H772B4C219078 +=proc_stack:<0.59.0> +y0:N +y1:A8:infinity +y2:H772B4C219030 +y3:H772B4C218FD0 +y4:A12:global_name_server +y5:P<0.49.0> +0x0000772b4c22c3f0:SReturn addr 0x50D2C2E8 (proc_lib:init_p_do_apply/3 + 192) +y0:N +y1:N +y2:SCatch 0x50D2C2FD (proc_lib:init_p_do_apply/3 + 213) +0x0000772b4c22c410:SReturn addr 0x50C011F8 () +=proc_heap:<0.59.0> +772B4C219030:t5:AE:callback_cache,A6:global,H772B5841AA80,H772B5841AA70,H772B5841AA60 +772B4C218FD0:tB:A5:state,H772B4C2190B0,H772B58476190,N,N,N,AD:nonode@nohost,P<0.60.0>,P<0.61.0>,A8:no_trace,A5:false +772B4C2190B0:t3:A4:conf,A4:true,A4:true +772B4C22B230:t2:A12:creation_extension,H772B4C2174D0 +772B4C2174D0:B950565567859785728 +772B4C22B218:t2:A9:rand_seed,H772B4C22B1E8 +772B4C22B1E8:t2:H772B4C22B138,H772B4C22B1A0 +772B4C22B1A0:lI280031731675185528|I235789250375065609 +772B4C22B138:Mf6:H772B5847F5E8:A5:exsss,H772B5847F528,I58,H772B5847F558,H772B5847F588,H772B5847F5B8 +772B4C219060:t2:AA:$ancestors,H772B4C2190D0 +772B4C2190D0:lAA:kernel_sup|H772B4C219118 +772B4C219118:lP<0.47.0>|N +772B4C219078:t2:AD:$initial_call,H772B4C2190E0 +772B4C2190E0:t3:A6:global,A4:init,I1 +=proc_stack:<0.60.0> +y0:A8:infinity +y1:H772B4C239218 +0x0000772b4c2397b8:SReturn addr 0x50C011F8 () +=proc_heap:<0.60.0> +772B4C239218:t7:A5:multi,N,N,N,AD:nonode@nohost,A5:false,A5:false +=proc_stack:<0.61.0> +y0:N +0x0000772b4c239f08:SReturn addr 0x50C011F8 () +=proc_heap:<0.61.0> +=proc_dictionary:<0.62.0> +H772B4C22C4F8 +H772B4C22C510 +H772B4C22C588 +H772B4C22C618 +H772B4C22C5B0 +H772B4C22C630 +=proc_stack:<0.62.0> +y0:N +y1:A8:infinity +y2:H772B4C22C4C8 +y3:H772B4C22CDA0 +y4:AC:global_group +y5:P<0.49.0> +0x0000772b4c22cfb8:SReturn addr 0x50D2C2E8 (proc_lib:init_p_do_apply/3 + 192) +y0:N +y1:N +y2:SCatch 0x50D2C2FD (proc_lib:init_p_do_apply/3 + 213) +0x0000772b4c22cfd8:SReturn addr 0x50C011F8 () +=proc_heap:<0.62.0> +772B4C22C4C8:t5:AE:callback_cache,AC:global_group,H772B5841B060,H772B5841B050,H772B5841B040 +772B4C22CDA0:tA:A5:state,A7:no_conf,N,H772B58480AB8,N,N,A6:normal,H772B58480AB8,H772B58481678,A9:undefined +772B4C22C4F8:t2:A10:registered_names,H772B58480AA8 +772B4C22C510:t2:AC:whereis_name,H772B58480AA8 +772B4C22C588:t2:A4:send,H772B58480AA8 +772B4C22C618:t2:AA:$ancestors,H772B4C22C678 +772B4C22C678:lAA:kernel_sup|H772B4C22C6C8 +772B4C22C6C8:lP<0.47.0>|N +772B4C22C5B0:t2:A12:global_group_check,P<0.63.0> +772B4C22C630:t2:AD:$initial_call,H772B4C22C688 +772B4C22C688:t3:AC:global_group,A4:init,I1 +=proc_stack:<0.63.0> +0x0000772b4c218b40:SReturn addr 0x50C011F8 () +=proc_heap:<0.63.0> +=proc_dictionary:<0.64.0> +H772B4C23FC98 +H772B4C23FCB0 +=proc_stack:<0.64.0> +y0:A5:false +y1:N +y2:A8:infinity +y3:H772B4C23FDA0 +y4:A11:erl_signal_server +y5:P<0.49.0> +0x0000772b4c2402d8:SReturn addr 0x50D2C2E8 (proc_lib:init_p_do_apply/3 + 192) +y0:N +y1:N +y2:SCatch 0x50D2C2FD (proc_lib:init_p_do_apply/3 + 213) +0x0000772b4c2402f8:SReturn addr 0x50C011F8 () +=proc_heap:<0.64.0> +772B4C23FDA0:lH772B4C23FD70|N +772B4C23FD70:t5:A7:handler,A12:erl_signal_handler,A5:false,H772B5848EB70,A5:false +772B4C23FC98:t2:AA:$ancestors,H772B4C23FC88 +772B4C23FC88:lAA:kernel_sup|H772B4C23FC48 +772B4C23FC48:lP<0.47.0>|N +772B4C23FCB0:t2:AD:$initial_call,H772B58446E88 +=proc_dictionary:<0.65.0> +H772B4C29E478 +H772B4C29E490 +=proc_stack:<0.65.0> +y0:N +y1:A8:infinity +y2:H772B4C29E448 +y3:H772B4C2A2080 +y4:P<0.65.0> +y5:P<0.49.0> +0x0000772b4c2a47f0:SReturn addr 0x50D2C2E8 (proc_lib:init_p_do_apply/3 + 192) +y0:N +y1:N +y2:SCatch 0x50D2C2FD (proc_lib:init_p_do_apply/3 + 213) +0x0000772b4c2a4810:SReturn addr 0x50C011F8 () +=proc_heap:<0.65.0> +772B4C29E448:t5:AE:callback_cache,A11:supervisor_bridge,H772B58419260,H772B58419250,H772B58419240 +772B4C2A2080:t5:A5:state,A8:user_sup,P<0.70.0>,P<0.70.0>,H772B4C29E430 +772B4C29E430:t2:P<0.65.0>,A8:user_sup +772B4C29E478:t2:AA:$ancestors,H772B4C29E4A8 +772B4C29E4A8:lAA:kernel_sup|H772B4C29E4D8 +772B4C29E4D8:lP<0.47.0>|N +772B4C29E490:t2:AD:$initial_call,H772B4C29E4B8 +772B4C29E4B8:t3:A11:supervisor_bridge,A8:user_sup,I1 +=proc_dictionary:<0.66.0> +H772B4C21B2C0 +H772B4C21AEB0 +H772B4C21B2D8 +=proc_stack:<0.66.0> +y0:N +y1:A8:infinity +y2:H772B4C252FB0 +y3:N +y4:H772B4C21B280 +0x0000772b4c253320:SReturn addr 0x50D2C2E8 (proc_lib:init_p_do_apply/3 + 192) +y0:N +y1:N +y2:SCatch 0x50D2C2FD (proc_lib:init_p_do_apply/3 + 213) +0x0000772b4c253340:SReturn addr 0x50C011F8 () +=proc_heap:<0.66.0> +772B4C252FB0:t5:A5:state,H772B4C252F40,N,H772B58484678,A5:false +772B4C252F40:t2:A6:server,H772B4C252ED0 +772B4C252ED0:tA:A5:state,H772B4C21AEE0,H772B4C21AFC8,A3:eof,A5:false,A9:undefined,P<0.70.0>,P<0.70.0>,H772B4C21B2F0,H772B4C21B320 +772B4C21B320:t2:A5:false,H772B5845AF00 +772B4C21B2F0:t5:A2:gr,I1,I0,P<0.70.0>,H772B4C21B370 +772B4C21B370:lH772B4C21B380|N +772B4C21B380:t4:A5:group,I0,P<0.70.0>,H772B58410188 +772B4C21AFC8:E23:g1oAA3cNbm9ub2RlQG5vaG9zdAAAAAAAA5bcQkAAAumgILU= +772B4C21AEE0:t1C:A5:state,H772B4C21B058,H772B4C21B070,H772B4C21B088,H772B4C21B0A0,A4:true,N,N,N,N,A9:undefined,I1,I0,I80,I24,A5:false,H772B58488980,H772B58488998,H772B584889B0,H772B584889C8,H772B584889E0,H772B584889F8,H772B58488A10,A5:false,A5:false,H772B58488A28,H772B58488A40,H772B4C21B0D8 +772B4C21B0D8:t5:AA:re_pattern,I0,I1,I0,H772B4C21B170 +772B4C21B170:Yc6451BC50D300:0:15E +772B4C21B0A0:Mf4:H772B58488A68:A4:true,A5:false,A5:false,A5:false +772B4C21B088:t2:P<0.68.0>,H772B4C21AFC8 +772B4C21B070:t2:P<0.69.0>,H772B4C21AFE0 +772B4C21AFE0:E23:g1oAA3cNbm9ub2RlQG5vaG9zdAAAAAAAA5beQkAAAumgILU= +772B4C21B058:E23:g1oAA3cNbm9ub2RlQG5vaG9zdAAAAAAAA5baQkIAAumgILU= +772B4C21B280:t7:A6:params,AF:state_functions,A5:false,P<0.66.0>,H772B4C21B350,A8:user_drv,A8:infinity +772B4C21B350:lA8:user_drv|N +772B4C21B2C0:t2:AA:$ancestors,H772B4C21B360 +772B4C21B360:lP<0.70.0>|H772B4C21B010 +772B4C21B010:lP<0.65.0>|H772B4C21B160 +772B4C21B160:lAA:kernel_sup|H772B4C21B198 +772B4C21B198:lP<0.47.0>|N +772B4C21AEB0:t2:AD:$initial_call,H772B4C21B020 +772B4C21B020:t3:A8:user_drv,A4:init,I1 +772B4C21B2D8:t2:AD:current_group,P<0.70.0> +=proc_dictionary:<0.68.0> +H772B4C22D0A0 +H772B4C22D0D8 +=proc_stack:<0.68.0> +y0:N +y1:H772B4C22D0F0 +y2:H772B4C22D018 +0x0000772b4c22d708:SReturn addr 0x50D2C2E8 (proc_lib:init_p_do_apply/3 + 192) +y0:N +y1:N +y2:SCatch 0x50D2C2FD (proc_lib:init_p_do_apply/3 + 213) +0x0000772b4c22d728:SReturn addr 0x50C011F8 () +=proc_heap:<0.68.0> +772B4C22D0F0:E23:g1oAA3cNbm9ub2RlQG5vaG9zdAAAAAAAA5bcQkAAAumgILU= +772B4C22D018:E23:g1oAA3cNbm9ub2RlQG5vaG9zdAAAAAAAA5baQkIAAumgILU= +772B4C22D0A0:t2:AA:$ancestors,H772B4C22D090 +772B4C22D090:lA8:user_drv|H772B4C22D050 +772B4C22D050:lP<0.65.0>|H772B4C22D040 +772B4C22D040:lAA:kernel_sup|H772B4C22D030 +772B4C22D030:lP<0.47.0>|N +772B4C22D0D8:t2:AD:$initial_call,H772B4C22D0B8 +772B4C22D0B8:t3:A8:prim_tty,A6:writer,I1 +=proc_messages:<0.70.0> +H772B4C251B08:N +=proc_dictionary:<0.70.0> +H772B4C2518E8 +H772B4C251A30 +H772B4C2519D8 +H772B4C251960 +H772B4C251A00 +H772B4C251988 +H772B4C251920 +H772B4C2519B0 +H772B4C251A18 +H772B4C251AD0 +H772B4C251948 +=proc_stack:<0.70.0> +y0:N +y1:A2:ok +y2:P<0.66.0> +0x0000772b4c252028:SReturn addr 0x50C011F8 () +=proc_heap:<0.70.0> +772B4C251B08:t2:P<0.66.0>,A3:eof +772B4C2518E8:t2:AC:expand_below,A4:true +772B4C251A30:t2:A7:key_map,H772B4C251A48 +772B4C251A48:Mf4:H772B5848E1C8:H772B5848D4D0,H772B5848BE00,H772B5848BBC8,H772B5848C0B8 +772B4C2519D8:t2:A9:read_mode,A4:list +772B4C251960:t2:A8:user_drv,P<0.66.0> +772B4C251A00:t2:AB:kill_buffer,N +772B4C251988:t2:A4:dumb,A5:false +772B4C251920:t2:AB:line_buffer,N +772B4C2519B0:t2:A7:noshell,A4:true +772B4C251A18:t2:AA:expand_fun,H772B5841BC50 +772B4C251AD0:t2:A3:log,A4:none +772B4C251948:t2:A4:echo,A5:false +=proc_dictionary:<0.71.0> +H772B4C296160 +H772B4C296178 +=proc_stack:<0.71.0> +y0:N +y1:A8:infinity +y2:H772B4C296E18 +y3:H772B4C297188 +y4:AA:logger_sup +y5:P<0.49.0> +0x0000772b4c297448:SReturn addr 0x50D2C45C (proc_lib:wake_up/3 + 228) +y0:N +y1:N +y2:SCatch 0x50D2C471 (proc_lib:wake_up/3 + 249) +0x0000772b4c297468:SReturn addr 0x50C011F8 () +=proc_heap:<0.71.0> +772B4C296E18:t5:AE:callback_cache,AA:supervisor,H772B58415940,H772B58415930,H772B58415920 +772B4C297188:tC:A5:state,H772B5848B8A8,AB:one_for_one,H772B4C297170,A9:undefined,I1,I5,N,I0,A5:never,AA:logger_sup,N +772B4C297170:t2:H772B4C297160,H772B4C297130 +772B4C297130:Mf3:H772B4C297108:H772B4C297098,H772B4C296310,H772B4C296360 +772B4C297108:t3:A7:default,A16:logger_handler_watcher,AC:logger_proxy +772B4C296360:t9:A5:child,P<0.73.0>,AC:logger_proxy,H772B58459D68,A9:temporary,A5:false,I2000,A6:worker,H772B58459D58 +772B4C296310:t9:A5:child,P<0.72.0>,A16:logger_handler_watcher,H772B5848B910,A9:permanent,A5:false,AB:brutal_kill,A6:worker,H772B4C2963B0 +772B4C2963B0:lA16:logger_handler_watcher|N +772B4C297098:t9:A5:child,P<0.78.0>,A7:default,H772B4C2970E8,A9:temporary,A5:false,I2000,A6:worker,H772B58490F28 +772B4C2970E8:t3:AA:logger_olp,AA:start_link,A9:undefined +772B4C297160:lA7:default|H772B4C2962A0 +772B4C2962A0:lAC:logger_proxy|H772B4C2962E8 +772B4C2962E8:lA16:logger_handler_watcher|N +772B4C296160:t2:AA:$ancestors,H772B4C2961A0 +772B4C2961A0:lAA:kernel_sup|H772B4C2961E0 +772B4C2961E0:lP<0.47.0>|N +772B4C296178:t2:AD:$initial_call,H772B4C2961B0 +772B4C2961B0:t3:AA:supervisor,AA:logger_sup,I1 +=proc_dictionary:<0.72.0> +H772B4C234C50 +H772B4C234C88 +=proc_stack:<0.72.0> +y0:N +y1:A8:infinity +y2:H772B4C234CA0 +y3:H772B4C234DE8 +y4:A16:logger_handler_watcher +y5:P<0.71.0> +0x0000772b4c235280:SReturn addr 0x50D2C2E8 (proc_lib:init_p_do_apply/3 + 192) +y0:N +y1:N +y2:SCatch 0x50D2C2FD (proc_lib:init_p_do_apply/3 + 213) +0x0000772b4c2352a0:SReturn addr 0x50C011F8 () +=proc_heap:<0.72.0> +772B4C234CA0:t5:AE:callback_cache,A16:logger_handler_watcher,H772B5841C260,H772B5841C250,H772B5841C240 +772B4C234DE8:t2:A5:state,H772B4C234DD8 +772B4C234DD8:lH772B4C234DC0|N +772B4C234DC0:t2:A7:default,H772B4C234DA8 +772B4C234DA8:E23:g1oAA3cNbm9ub2RlQG5vaG9zdAAAAAAAA5cwQkAAAumgILU= +772B4C234C50:t2:AA:$ancestors,H772B4C234C40 +772B4C234C40:lAA:logger_sup|H772B4C234C00 +772B4C234C00:lAA:kernel_sup|H772B4C234BF0 +772B4C234BF0:lP<0.47.0>|N +772B4C234C88:t2:AD:$initial_call,H772B4C234C68 +772B4C234C68:t3:A16:logger_handler_watcher,A4:init,I1 +=proc_messages:<0.73.0> +H772B4C218F98:A9:undefined +=proc_dictionary:<0.73.0> +H772B4C216158 +H772B4C216170 +H772B4C216188 +=proc_stack:<0.73.0> +y0:H772B4C26F7D0 +y1:H772B4C26F7A0 +0x0000772b4c270e18:SReturn addr 0x50C94EEC (error_handler:undefined_function/3 + 100) +y0:H772B4C26F258 +y1:A9:uppercase +y2:A6:string +0x0000772b4c270e38:SReturn addr 0x50FC9B3C (logger_formatter:add_legacy_title/3 + 516) +y0:H772B5848FD08 +y1:N +y2:N +0x0000772b4c270e58:SReturn addr 0x50FC96CC (logger_formatter:maybe_add_legacy_header/3 + 220) +y0:N +y1:N +y2:N +y3:I1784283924320533 +y4:H772B4C26F268 +y5:H772B4C216330 +0x0000772b4c270e90:SReturn addr 0x50FC62EC (logger_formatter:format/2 + 356) +y0:N +y1:N +y2:N +y3:A5:error +y4:H772B4C26F268 +y5:H772B4C2168B0 +0x0000772b4c270ec8:SReturn addr 0x50FD7900 (logger_h_common:try_format/3 + 240) +y0:N +y1:N +y2:H772B4C2168C8 +y3:A10:logger_formatter +y4:H772B4C2168F0 +y5:SCatch 0x50FD7915 (logger_h_common:try_format/3 + 261) +0x0000772b4c270f00:SReturn addr 0x50FD74C8 (logger_h_common:do_log_to_binary/2 + 240) +y0:N +y1:N +y2:N +y3:H772B4C2168C8 +y4:A10:logger_formatter +y5:H772B4C2168F0 +y6:N +0x0000772b4c270f40:SReturn addr 0x50FD48FC (logger_h_common:log/2 + 292) +y0:H772B4C216920 +0x0000772b4c270f50:SReturn addr 0x50CB4944 (logger_backend:call_handlers/3 + 644) +y0:N +y1:N +y2:N +y3:H772B4C26F2C8 +y4:H772B4C2168F0 +y5:AC:logger_std_h +y6:N +y7:A7:default +y8:H772B4C216940 +y9:H772B4C2168F0 +y10:SCatch 0x50CB4959 (logger_backend:call_handlers/3 + 665) +0x0000772b4c270fb0:SReturn addr 0x50E464A0 (logger_proxy:try_log/1 + 224) +y0:N +y1:N +y2:N +y3:H772B4C216958 +y4:SCatch 0x50E464B5 (logger_proxy:try_log/1 + 245) +0x0000772b4c270fe0:SReturn addr 0x50E45B84 (logger_proxy:handle_load/2 + 268) +y0:A8:no_state +0x0000772b4c270ff0:SReturn addr 0x50E4B90C (logger_olp:try_callback_call/4 + 204) +y0:A12:$no_default_return +y1:H772B4C216968 +y2:AB:handle_load +y3:AC:logger_proxy +y4:SCatch 0x50E4B921 (logger_olp:try_callback_call/4 + 225) +0x0000772b4c271020:SReturn addr 0x50E49A64 (logger_olp:handle_load/5 + 540) +y0:H772B4C216978 +y1:N +y2:N +y3:N +y4:N +y5:I-576460751634127 +y6:A5:async +0x0000772b4c271060:SReturn addr 0x50E48D28 (logger_olp:handle_info/2 + 1016) +0x0000772b4c271068:SReturn addr 0x50D21684 (gen_server:try_handle_info/3 + 244) +y0:N +y1:N +y2:N +y3:AA:logger_olp +y4:H772B4C2160A0 +y5:H772B4C2162D0 +y6:SCatch 0x50D216D7 (gen_server:try_handle_info/3 + 327) +0x0000772b4c2710a8:SReturn addr 0x50D22714 (gen_server:handle_msg/6 + 1388) +y0:A8:infinity +y1:H772B4C216300 +y2:H772B4C2160A0 +y3:P<0.73.0> +y4:P<0.71.0> +y5:H772B4C2162D0 +0x0000772b4c2710e0:SReturn addr 0x50D2C2E8 (proc_lib:init_p_do_apply/3 + 192) +y0:N +y1:N +y2:SCatch 0x50D2C2FD (proc_lib:init_p_do_apply/3 + 213) +0x0000772b4c271100:SReturn addr 0x50C011F8 () +=proc_heap:<0.73.0> +772B4C26F7D0:E23:g1oAA3cNbm9ub2RlQG5vaG9zdAAAAAAAA5dgQkAAAumgILU= +772B4C26F7A0:t5:A7:load_ok,H772B4C26F788,A6:string,H772B4C26F230,H772B4C26F240 +772B4C26F240:E23:g1oAA3cNbm9ub2RlQG5vaG9zdAAAAAAAA5deQkAAAumgILU= +772B4C26F230:lI47|H772B4C26F360 +772B4C26F360:lI117|H772B4C26F420 +772B4C26F420:lI115|H772B4C26F458 +772B4C26F458:lI114|H772B4C26F478 +772B4C26F478:lI47|H772B4C26F498 +772B4C26F498:lI108|H772B4C26F4B8 +772B4C26F4B8:lI105|H772B4C26F4C8 +772B4C26F4C8:lI98|H772B4C26F4D8 +772B4C26F4D8:lI47|H772B4C26F4E8 +772B4C26F4E8:lI101|H772B4C26F4F8 +772B4C26F4F8:lI114|H772B4C26F508 +772B4C26F508:lI108|H772B4C26F518 +772B4C26F518:lI97|H772B4C26F528 +772B4C26F528:lI110|H772B4C26F538 +772B4C26F538:lI103|H772B4C26F548 +772B4C26F548:lI47|H772B4C26F558 +772B4C26F558:lI108|H772B4C26F568 +772B4C26F568:lI105|H772B4C26F578 +772B4C26F578:lI98|H772B4C26F588 +772B4C26F588:lI47|H772B4C26F598 +772B4C26F598:lI115|H772B4C26F5A8 +772B4C26F5A8:lI116|H772B4C26F5B8 +772B4C26F5B8:lI100|H772B4C26F5C8 +772B4C26F5C8:lI108|H772B4C26F5D8 +772B4C26F5D8:lI105|H772B4C26F5E8 +772B4C26F5E8:lI98|H772B4C26F5F8 +772B4C26F5F8:lI45|H772B4C26F608 +772B4C26F608:lI54|H772B4C26F618 +772B4C26F618:lI46|H772B4C26F628 +772B4C26F628:lI50|H772B4C26F638 +772B4C26F638:lI46|H772B4C26F648 +772B4C26F648:lI50|H772B4C26F658 +772B4C26F658:lI46|H772B4C26F668 +772B4C26F668:lI49|H772B4C26F678 +772B4C26F678:lI47|H772B4C26F688 +772B4C26F688:lI101|H772B4C26F698 +772B4C26F698:lI98|H772B4C26F6A8 +772B4C26F6A8:lI105|H772B4C26F6B8 +772B4C26F6B8:lI110|H772B4C26F6C8 +772B4C26F6C8:lI47|H772B4C26F6D8 +772B4C26F6D8:lI115|H772B4C26F6E8 +772B4C26F6E8:lI116|H772B4C26F6F8 +772B4C26F6F8:lI114|H772B4C26F708 +772B4C26F708:lI105|H772B4C26F718 +772B4C26F718:lI110|H772B4C26F728 +772B4C26F728:lI103|H772B58421960 +772B4C26F788:E23:g1oAA3cNbm9ub2RlQG5vaG9zdAAAAAAAA5dfQkIAAumgILU= +772B4C26F258:lH772B4C26F370|N +772B4C26F370:lI101|H772B4C26F430 +772B4C26F430:lI114|H772B4C26F468 +772B4C26F468:lI114|H772B4C26F488 +772B4C26F488:lI111|H772B4C26F4A8 +772B4C26F4A8:lI114|N +772B4C26F268:Mf9:H772B4C26F380:N,A9:unlimited,A9:unlimited,A5:false,A4:true,A9:unlimited,H772B58490040,I84,A4:info +772B4C26F380:t9:AB:time_offset,AB:chars_limit,A5:depth,AB:single_line,AD:legacy_header,A8:max_size,A8:template,AF:time_designator,A1A:error_logger_notice_header +772B4C216330:Mf4:H772B4C216388:H772B4C2163B0,P<0.10.0>,I1784283924320533,P<0.70.0> +772B4C216388:t4:AC:error_logger,A3:pid,A4:time,A2:gl +772B4C2163B0:Mf2:H772B4C2163F8:A4:true,A5:error +772B4C2163F8:t2:A8:emulator,A3:tag +772B4C2168B0:t2:H772B4C216368,H772B4C216378 +772B4C216378:lH772B4C2163E8|N +772B4C2163E8:lI98|H772B4C216420 +772B4C216420:lI101|H772B4C216440 +772B4C216440:lI97|H772B4C216450 +772B4C216450:lI109|H772B4C216460 +772B4C216460:lI47|H772B4C216470 +772B4C216470:lI98|H772B4C216480 +772B4C216480:lI101|H772B4C216490 +772B4C216490:lI97|H772B4C2164A0 +772B4C2164A0:lI109|H772B4C2164B0 +772B4C2164B0:lI95|H772B4C2164C0 +772B4C2164C0:lI108|H772B4C2164D0 +772B4C2164D0:lI111|H772B4C2164E0 +772B4C2164E0:lI97|H772B4C2164F0 +772B4C2164F0:lI100|H772B4C216500 +772B4C216500:lI46|H772B4C216510 +772B4C216510:lI99|H772B4C216520 +772B4C216520:lI40|H772B4C216530 +772B4C216530:lI49|H772B4C216540 +772B4C216540:lI53|H772B4C216550 +772B4C216550:lI48|H772B4C216560 +772B4C216560:lI41|H772B4C216570 +772B4C216570:lI58|H772B4C216580 +772B4C216580:lI32|H772B4C216590 +772B4C216590:lI69|H772B4C2165A0 +772B4C2165A0:lI114|H772B4C2165B0 +772B4C2165B0:lI114|H772B4C2165C0 +772B4C2165C0:lI111|H772B4C2165D0 +772B4C2165D0:lI114|H772B4C2165E0 +772B4C2165E0:lI32|H772B4C2165F0 +772B4C2165F0:lI108|H772B4C216600 +772B4C216600:lI111|H772B4C216610 +772B4C216610:lI97|H772B4C216620 +772B4C216620:lI100|H772B4C216630 +772B4C216630:lI105|H772B4C216640 +772B4C216640:lI110|H772B4C216650 +772B4C216650:lI103|H772B4C216660 +772B4C216660:lI32|H772B4C216670 +772B4C216670:lI109|H772B4C216680 +772B4C216680:lI111|H772B4C216690 +772B4C216690:lI100|H772B4C2166A0 +772B4C2166A0:lI117|H772B4C2166B0 +772B4C2166B0:lI108|H772B4C2166C0 +772B4C2166C0:lI101|H772B4C2166D0 +772B4C2166D0:lI32|H772B4C2166E0 +772B4C2166E0:lI101|H772B4C2166F0 +772B4C2166F0:lI108|H772B4C216700 +772B4C216700:lI105|H772B4C216710 +772B4C216710:lI120|H772B4C216720 +772B4C216720:lI105|H772B4C216730 +772B4C216730:lI114|H772B4C216740 +772B4C216740:lI58|H772B4C216750 +772B4C216750:lI10|H772B4C216760 +772B4C216760:lI32|H772B4C216770 +772B4C216770:lI32|H772B4C216780 +772B4C216780:lI99|H772B4C216790 +772B4C216790:lI111|H772B4C2167A0 +772B4C2167A0:lI114|H772B4C2167B0 +772B4C2167B0:lI114|H772B4C2167C0 +772B4C2167C0:lI117|H772B4C2167D0 +772B4C2167D0:lI112|H772B4C2167E0 +772B4C2167E0:lI116|H772B4C2167F0 +772B4C2167F0:lI32|H772B4C216800 +772B4C216800:lI97|H772B4C216810 +772B4C216810:lI116|H772B4C216820 +772B4C216820:lI111|H772B4C216830 +772B4C216830:lI109|H772B4C216840 +772B4C216840:lI32|H772B4C216850 +772B4C216850:lI116|H772B4C216860 +772B4C216860:lI97|H772B4C216870 +772B4C216870:lI98|H772B4C216880 +772B4C216880:lI108|H772B4C216890 +772B4C216890:lI101|H772B4C2168A0 +772B4C2168A0:lI10|N +772B4C216368:lI126|H772B4C2163D8 +772B4C2163D8:lI115|H772B4C216410 +772B4C216410:lI126|H772B4C216430 +772B4C216430:lI110|N +772B4C2168C8:Mf2:H772B4C216AC8:A5:false,A4:true +772B4C216AC8:t2:AB:single_line,AD:legacy_header +772B4C2168F0:Mf3:H772B5843AD48:H772B4C216330,H772B4C2168B0,A5:error +772B4C216920:t3:A14:logger_std_h_default,P<0.78.0>,H772B4C216AE0 +772B4C216AE0:t2:AA:logger_olp,A14:logger_std_h_default +772B4C26F2C8:Mf4:H772B4C26F3D0:A7:default,AC:logger_std_h,H772B4C216A30,H772B4C216AB0 +772B4C26F3D0:t4:A2:id,A6:module,A6:config,A9:formatter +772B4C216AB0:t2:A10:logger_formatter,H772B4C2168C8 +772B4C216A30:MfD:H772B4C216B18:AB:standard_io,A4:true,I200,I1000,I10,I5000,I500,I1000,A5:false,I3000000,I20000,A9:no_repeat,H772B4C216920 +772B4C216B18:tD:A4:type,A12:burst_limit_enable,AE:drop_mode_qlen,AA:flush_qlen,AE:sync_mode_qlen,A1B:overload_kill_restart_after,A15:burst_limit_max_count,A17:burst_limit_window_time,A14:overload_kill_enable,A16:overload_kill_mem_size,A12:overload_kill_qlen,A18:filesync_repeat_interval,A3:olp +772B4C216940:E23:g1oAA3cNbm9ub2RlQG5vaG9zdAAAAAAAA5YPQkIAAumgILU= +772B4C216958:lA5:error|H772B4C216AF8 +772B4C216AF8:lH772B4C216368|H772B4C216B88 +772B4C216B88:lH772B4C216378|H772B4C216B98 +772B4C216B98:lH772B4C216330|N +772B4C216968:lH772B4C2162D0|H772B4C216B08 +772B4C2162D0:t5:A3:log,A5:error,H772B4C216368,H772B4C216378,H772B4C216330 +772B4C216B08:lA8:no_state|N +772B4C216978:Mf14:H772B4C2161A0:AC:logger_proxy,AC:logger_proxy,A5:async,A5:false,A5:false,I1000,I5000,I500,I0,I-576460751706177,A8:no_state,I-576460751706177,I0,H772B4C216248,I5000,I500,I1000,A5:false,I3000000,I20000 +772B4C2161A0:t14:A2:id,A6:module,A4:mode,A4:idle,A12:burst_limit_enable,AE:drop_mode_qlen,AA:flush_qlen,AE:sync_mode_qlen,AF:burst_msg_count,AC:burst_win_ts,A8:cb_state,AC:last_load_ts,A9:last_qlen,A8:mode_ref,A1B:overload_kill_restart_after,A15:burst_limit_max_count,A17:burst_limit_window_time,A14:overload_kill_enable,A16:overload_kill_mem_size,A12:overload_kill_qlen +772B4C216248:t2:AA:logger_olp,AC:logger_proxy +772B4C2160A0:Mf14:H772B4C2161A0:AC:logger_proxy,AC:logger_proxy,A5:async,A4:true,A5:false,I1000,I5000,I500,I0,I-576460751706177,A8:no_state,I-576460751706177,I0,H772B4C216248,I5000,I500,I1000,A5:false,I3000000,I20000 +772B4C216300:t5:AE:callback_cache,AA:logger_olp,H772B584180A0,H772B58418090,H772B58418080 +772B4C218F98:t5:A3:log,A5:error,H772B4C218E08,H772B4C218EE8,H772B4C218F60 +772B4C218F60:Mf4:H772B4C218F38:H772B4C218EF8,P<0.10.0>,I1784283924325860,P<0.70.0> +772B4C218F38:t4:AC:error_logger,A3:pid,A4:time,A2:gl +772B4C218EF8:Mf2:H772B4C218F20:A4:true,A5:error +772B4C218F20:t2:A8:emulator,A3:tag +772B4C218EE8:lP<0.10.0>|H772B4C218E18 +772B4C218E18:lH772B4C218E28|N +772B4C218E28:t2:A5:undef,H772B4C218E40 +772B4C218E40:lH772B4C218E70|H772B4C218E50 +772B4C218E70:t4:A4:init,A8:start_it,I1,N +772B4C218E50:lH772B4C218E98|H772B4C218E60 +772B4C218E98:t4:A4:init,A8:start_em,I1,N +772B4C218E60:lH772B4C218EC0|N +772B4C218EC0:t4:A4:init,A7:do_boot,I3,N +772B4C218E08:lI69|H772B4C218DF8 +772B4C218DF8:lI114|H772B4C218DE8 +772B4C218DE8:lI114|H772B4C218DD8 +772B4C218DD8:lI111|H772B4C218DC8 +772B4C218DC8:lI114|H772B4C218DB8 +772B4C218DB8:lI32|H772B4C218DA8 +772B4C218DA8:lI105|H772B4C218D98 +772B4C218D98:lI110|H772B4C218D88 +772B4C218D88:lI32|H772B4C218D78 +772B4C218D78:lI112|H772B4C218D68 +772B4C218D68:lI114|H772B4C218D58 +772B4C218D58:lI111|H772B4C218D48 +772B4C218D48:lI99|H772B4C218D38 +772B4C218D38:lI101|H772B4C218D28 +772B4C218D28:lI115|H772B4C218D18 +772B4C218D18:lI115|H772B4C218D08 +772B4C218D08:lI32|H772B4C218CF8 +772B4C218CF8:lI126|H772B4C218CE8 +772B4C218CE8:lI112|H772B4C218CD8 +772B4C218CD8:lI32|H772B4C218CC8 +772B4C218CC8:lI119|H772B4C218CB8 +772B4C218CB8:lI105|H772B4C218CA8 +772B4C218CA8:lI116|H772B4C218C98 +772B4C218C98:lI104|H772B4C218C88 +772B4C218C88:lI32|H772B4C218C78 +772B4C218C78:lI101|H772B4C218C68 +772B4C218C68:lI120|H772B4C218C58 +772B4C218C58:lI105|H772B4C218C48 +772B4C218C48:lI116|H772B4C218C38 +772B4C218C38:lI32|H772B4C218C28 +772B4C218C28:lI118|H772B4C218C18 +772B4C218C18:lI97|H772B4C218C08 +772B4C218C08:lI108|H772B4C218BF8 +772B4C218BF8:lI117|H772B4C218BE8 +772B4C218BE8:lI101|H772B4C218BD8 +772B4C218BD8:lI58|H772B4C218BC8 +772B4C218BC8:lI126|H772B4C218BB8 +772B4C218BB8:lI110|H772B4C218BA8 +772B4C218BA8:lI126|H772B4C218B98 +772B4C218B98:lI112|H772B4C218B88 +772B4C218B88:lI126|H772B4C218B78 +772B4C218B78:lI110|N +772B4C216158:t2:A7:olp_ref,H772B4C216260 +772B4C216260:t3:AC:logger_proxy,P<0.73.0>,H772B4C216248 +772B4C216170:t2:AA:$ancestors,H772B4C216280 +772B4C216280:lAA:logger_sup|H772B4C2162B0 +772B4C2162B0:lAA:kernel_sup|H772B4C2162C0 +772B4C2162C0:lP<0.47.0>|N +772B4C216188:t2:AD:$initial_call,H772B4C216290 +772B4C216290:t3:AA:logger_olp,A4:init,I1 +=proc_dictionary:<0.74.0> +H772B4C21C298 +H772B4C21C2D0 +=proc_stack:<0.74.0> +y0:N +y1:A8:infinity +y2:H772B4C21C2E8 +y3:N +y4:P<0.74.0> +y5:P<0.49.0> +0x0000772b4c21c8e8:SReturn addr 0x50D2C2E8 (proc_lib:init_p_do_apply/3 + 192) +y0:N +y1:N +y2:SCatch 0x50D2C2FD (proc_lib:init_p_do_apply/3 + 213) +0x0000772b4c21c908:SReturn addr 0x50C011F8 () +=proc_heap:<0.74.0> +772B4C21C2E8:t5:AE:callback_cache,AD:kernel_config,H772B5841C310,H772B5841C300,H772B5841C330 +772B4C21C298:t2:AA:$ancestors,H772B4C21C288 +772B4C21C288:lAA:kernel_sup|H772B4C21C248 +772B4C21C248:lP<0.47.0>|N +772B4C21C2D0:t2:AD:$initial_call,H772B4C21C2B0 +772B4C21C2B0:t3:AD:kernel_config,A4:init,I1 +=proc_dictionary:<0.75.0> +H772B4C22D818 +H772B4C22D850 +=proc_stack:<0.75.0> +y0:N +y1:A8:infinity +y2:H772B4C22D868 +y3:H772B5848E9F0 +y4:AB:kernel_refc +y5:P<0.49.0> +0x0000772b4c22de58:SReturn addr 0x50D2C2E8 (proc_lib:init_p_do_apply/3 + 192) +y0:N +y1:N +y2:SCatch 0x50D2C2FD (proc_lib:init_p_do_apply/3 + 213) +0x0000772b4c22de78:SReturn addr 0x50C011F8 () +=proc_heap:<0.75.0> +772B4C22D868:t5:AE:callback_cache,AB:kernel_refc,H772B5841C3D0,H772B5841C3C0,H772B5841C3B0 +772B4C22D818:t2:AA:$ancestors,H772B4C22D808 +772B4C22D808:lAA:kernel_sup|H772B4C22D7C8 +772B4C22D7C8:lP<0.47.0>|N +772B4C22D850:t2:AD:$initial_call,H772B4C22D830 +772B4C22D830:t3:AB:kernel_refc,A4:init,I1 +=proc_dictionary:<0.76.0> +H772B4C23A1D0 +H772B4C23A1E8 +=proc_stack:<0.76.0> +0x0000772b4c23a368:SReturn addr 0x50C011F8 () +=proc_heap:<0.76.0> +772B4C23A1D0:t2:AA:$ancestors,H772B4C23A210 +772B4C23A210:lAA:kernel_sup|H772B4C23A250 +772B4C23A250:lP<0.47.0>|N +772B4C23A1E8:t2:AD:$initial_call,H772B4C23A220 +772B4C23A220:t3:AA:supervisor,A6:kernel,I1 +=proc_dictionary:<0.78.0> +H772B4C26B678 +H772B4C26B690 +H772B4C26B6A8 +=proc_stack:<0.78.0> +y0:N +y1:A8:infinity +y2:H772B4C26BC80 +y3:H772B4C26B5C0 +y4:P<0.78.0> +y5:P<0.71.0> +0x0000772b4c26c008:SReturn addr 0x50D2C2E8 (proc_lib:init_p_do_apply/3 + 192) +y0:N +y1:N +y2:SCatch 0x50D2C2FD (proc_lib:init_p_do_apply/3 + 213) +0x0000772b4c26c028:SReturn addr 0x50C011F8 () +=proc_heap:<0.78.0> +772B4C26BC80:t5:AE:callback_cache,AA:logger_olp,H772B584180A0,H772B58418090,H772B58418080 +772B4C26B5C0:Mf14:H772B4C26B6D0:A14:logger_std_h_default,AF:logger_h_common,A5:async,A4:true,A4:true,I200,I1000,I10,I0,I-576460751656853,H772B4C26B778,I-576460751656853,I0,H772B4C26B7C0,I5000,I500,I1000,A5:false,I3000000,I20000 +772B4C26B6D0:t14:A2:id,A6:module,A4:mode,A4:idle,A12:burst_limit_enable,AE:drop_mode_qlen,AA:flush_qlen,AE:sync_mode_qlen,AF:burst_msg_count,AC:burst_win_ts,A8:cb_state,AC:last_load_ts,A9:last_qlen,A8:mode_ref,A1B:overload_kill_restart_after,A15:burst_limit_max_count,A17:burst_limit_window_time,A14:overload_kill_enable,A16:overload_kill_mem_size,A12:overload_kill_qlen +772B4C26B7C0:t2:AA:logger_olp,A14:logger_std_h_default +772B4C26B778:Mf6:H772B4C26B838:A7:default,AC:logger_std_h,A9:no_repeat,I20,H772B4C26B870,A4:sync +772B4C26B838:t6:A2:id,A6:module,A18:filesync_repeat_interval,AF:ctrl_sync_count,AD:handler_state,A7:last_op +772B4C26B870:Mf2:H772B4C26B8B8:AB:standard_io,P<0.79.0> +772B4C26B8B8:t2:A4:type,AD:file_ctrl_pid +772B4C26B678:t2:A7:olp_ref,H772B4C26B7D8 +772B4C26B7D8:t3:A14:logger_std_h_default,P<0.78.0>,H772B4C26B7C0 +772B4C26B690:t2:AA:$ancestors,H772B4C26B7F8 +772B4C26B7F8:lAA:logger_sup|H772B4C26B898 +772B4C26B898:lAA:kernel_sup|H772B4C26B8D0 +772B4C26B8D0:lP<0.47.0>|N +772B4C26B6A8:t2:AD:$initial_call,H772B4C26B808 +772B4C26B808:t3:AA:logger_olp,A4:init,I1 +=proc_stack:<0.79.0> +y0:N +y1:N +y2:H772B4C297500 +0x0000772b4c297bb8:SReturn addr 0x50C011F8 () +=proc_heap:<0.79.0> +772B4C297500:Mf2:H772B58490C78:A7:default,AB:standard_io +=persistent_terms +AF:erl_prim_loader|H772B5842F168 +H772B5842EC28|H772B5842EC40 +AC:global_group|H772B58481580 +H772B584920E0|I10 +H772B58471960|I8000 +H772B5846A460|I5 +H772B5842F050|H772B5842F068 +A12:rex_nodes_observer|H772B58471CF8 +H772B5842EA80|H772B5842EA98 +H772B5845AEB8|I5 +H772B58492140|A9:undefined +H772B58468B70|H772B58468B98 +AB:code_server|AB:interactive +AC:logger_proxy|H772B5848E778 +H772B5848E7E0|A5:async +H772B58492098|A5:async +H772B5842AB78|H772B5842AB90 +H772B584290D0|H772B584290E8 +H772B584681D0|H772B584681E8 +H772B58468B18|H772B58468B30 +H772B58468BD8|I5 +H772B5845AE70|I5 +A13:kernel_os_cmd_shell|H772B5845BA70 +H772B58468A88|A4:true +=literals +772B5841FBE8:t2:A4:unix,A5:linux +772B5841FC20:t3:I6,I18,I33 +772B5841FC58:t6:AB:erts_dflags,I55966662588,I17230663572,I55966662588,I8396866,I8192 +772B58410188:t0: +772B58410190:t0: +772B5841FCA8:lI108|N +772B5841FCB8:lI114|H772B5841FCA8 +772B5841FCC8:lI101|H772B5841FCB8 +772B5841FCD8:lI46|H772B5841FCC8 +772B5841FEE0:t2:A4:init,A7:started +772B5841FEF8:t2:A4:stop,A7:restart +772B5841FF10:t2:A4:stop,A6:reboot +772B5841FF28:t2:A4:stop,A4:stop +772B5841FF40:lN|N +772B5841FF50:lI69|H772B5841FF60 +772B5841FF60:lI114|H772B5841FF70 +772B5841FF70:lI114|H772B5841FF80 +772B5841FF80:lI111|H772B5841FF90 +772B5841FF90:lI114|H772B5841FFA0 +772B5841FFA0:lI33|H772B5841FFB0 +772B5841FFB0:lI32|H772B5841FFC0 +772B5841FFC0:lI84|H772B5841FFD0 +772B5841FFD0:lI104|H772B5841FFE0 +772B5841FFE0:lI101|H772B5841FFF0 +772B5841FFF0:lI32|H772B58420000 +772B58420000:lI45|H772B58420010 +772B58420010:lI83|H772B58420020 +772B58420020:lI32|H772B58420030 +772B58420030:lI111|H772B58420040 +772B58420040:lI112|H772B58420050 +772B58420050:lI116|H772B58420060 +772B58420060:lI105|H772B58420070 +772B58420070:lI111|H772B58420080 +772B58420080:lI110|H772B58420090 +772B58420090:lI32|H772B584200A0 +772B584200A0:lI109|H772B584200B0 +772B584200B0:lI117|H772B584200C0 +772B584200C0:lI115|H772B584200D0 +772B584200D0:lI116|H772B584200E0 +772B584200E0:lI32|H772B584200F0 +772B584200F0:lI98|H772B58420100 +772B58420100:lI101|H772B58420110 +772B58420110:lI32|H772B58420120 +772B58420120:lI102|H772B58420130 +772B58420130:lI111|H772B58420140 +772B58420140:lI108|H772B58420150 +772B58420150:lI108|H772B58420160 +772B58420160:lI111|H772B58420170 +772B58420170:lI119|H772B58420180 +772B58420180:lI101|H772B58420190 +772B58420190:lI100|H772B584201A0 +772B584201A0:lI32|H772B584201B0 +772B584201B0:lI98|H772B584201C0 +772B584201C0:lI121|H772B584201D0 +772B584201D0:lI32|H772B584201E0 +772B584201E0:lI97|H772B584201F0 +772B584201F0:lI116|H772B58420200 +772B58420200:lI32|H772B58420210 +772B58420210:lI108|H772B58420220 +772B58420220:lI101|H772B58420230 +772B58420230:lI97|H772B58420240 +772B58420240:lI115|H772B58420250 +772B58420250:lI116|H772B58420260 +772B58420260:lI32|H772B58420270 +772B58420270:lI97|H772B58420280 +772B58420280:lI32|H772B58420290 +772B58420290:lI109|H772B584202A0 +772B584202A0:lI111|H772B584202B0 +772B584202B0:lI100|H772B584202C0 +772B584202C0:lI117|H772B584202D0 +772B584202D0:lI108|H772B584202E0 +772B584202E0:lI101|H772B584202F0 +772B584202F0:lI32|H772B58420300 +772B58420300:lI116|H772B58420310 +772B58420310:lI111|H772B58420320 +772B58420320:lI32|H772B58420330 +772B58420330:lI115|H772B58420340 +772B58420340:lI116|H772B58420350 +772B58420350:lI97|H772B58420360 +772B58420360:lI114|H772B58420370 +772B58420370:lI116|H772B58420380 +772B58420380:lI44|H772B58420390 +772B58420390:lI32|H772B584203A0 +772B584203A0:lI115|H772B584203B0 +772B584203B0:lI117|H772B584203C0 +772B584203C0:lI99|H772B584203D0 +772B584203D0:lI104|H772B584203E0 +772B584203E0:lI32|H772B584203F0 +772B584203F0:lI97|H772B58420400 +772B58420400:lI115|H772B58420410 +772B58420410:lI32|H772B58420420 +772B58420420:lI96|H772B58420430 +772B58420430:lI45|H772B58420440 +772B58420440:lI83|H772B58420450 +772B58420450:lI32|H772B58420460 +772B58420460:lI77|H772B58420470 +772B58420470:lI111|H772B58420480 +772B58420480:lI100|H772B58420490 +772B58420490:lI117|H772B584204A0 +772B584204A0:lI108|H772B584204B0 +772B584204B0:lI101|H772B584204C0 +772B584204C0:lI96|H772B584204D0 +772B584204D0:lI32|H772B584204E0 +772B584204E0:lI111|H772B584204F0 +772B584204F0:lI114|H772B58420500 +772B58420500:lI32|H772B58420510 +772B58420510:lI96|H772B58420520 +772B58420520:lI45|H772B58420530 +772B58420530:lI83|H772B58420540 +772B58420540:lI32|H772B58420550 +772B58420550:lI77|H772B58420560 +772B58420560:lI111|H772B58420570 +772B58420570:lI100|H772B58420580 +772B58420580:lI117|H772B58420590 +772B58420590:lI108|H772B584205A0 +772B584205A0:lI101|H772B584205B0 +772B584205B0:lI32|H772B584205C0 +772B584205C0:lI70|H772B584205D0 +772B584205D0:lI117|H772B584205E0 +772B584205E0:lI110|H772B584205F0 +772B584205F0:lI99|H772B58420600 +772B58420600:lI116|H772B58420610 +772B58420610:lI105|H772B58420620 +772B58420620:lI111|H772B58420630 +772B58420630:lI110|H772B58420640 +772B58420640:lI96|H772B58420650 +772B58420650:lI32|H772B58420660 +772B58420660:lI116|H772B58420670 +772B58420670:lI111|H772B58420680 +772B58420680:lI32|H772B58420690 +772B58420690:lI115|H772B584206A0 +772B584206A0:lI116|H772B584206B0 +772B584206B0:lI97|H772B584206C0 +772B584206C0:lI114|H772B584206D0 +772B584206D0:lI116|H772B584206E0 +772B584206E0:lI32|H772B584206F0 +772B584206F0:lI119|H772B58420700 +772B58420700:lI105|H772B58420710 +772B58420710:lI116|H772B58420720 +772B58420720:lI104|H772B58420730 +772B58420730:lI32|H772B58420740 +772B58420740:lI97|H772B58420750 +772B58420750:lI32|H772B58420760 +772B58420760:lI102|H772B58420770 +772B58420770:lI117|H772B58420780 +772B58420780:lI110|H772B58420790 +772B58420790:lI99|H772B584207A0 +772B584207A0:lI116|H772B584207B0 +772B584207B0:lI105|H772B584207C0 +772B584207C0:lI111|H772B584207D0 +772B584207D0:lI110|H772B584207E0 +772B584207E0:lI46|H772B584207F0 +772B584207F0:lI13|H772B58420800 +772B58420800:lI10|H772B58420810 +772B58420810:lI13|H772B58420820 +772B58420820:lI10|N +772B58420830:lI101|H772B58420840 +772B58420840:lI108|H772B58420850 +772B58420850:lI97|H772B58420860 +772B58420860:lI120|H772B58420870 +772B58420870:lI101|H772B58420880 +772B58420880:lI100|N +772B58420890:t2:A8:starting,A8:starting +772B584208A8:Mf0:H772B58410188: +772B584208C0:t2:N,N +772B584208D8:lI82|H772B584208E8 +772B584208E8:lI117|H772B584208F8 +772B584208F8:lI110|H772B58420908 +772B58420908:lI116|H772B58420918 +772B58420918:lI105|H772B58420928 +772B58420928:lI109|H772B58420938 +772B58420938:lI101|H772B58420948 +772B58420948:lI32|H772B58420958 +772B58420958:lI116|H772B58420968 +772B58420968:lI101|H772B58420978 +772B58420978:lI114|H772B58420988 +772B58420988:lI109|H772B58420998 +772B58420998:lI105|H772B584209A8 +772B584209A8:lI110|H772B584209B8 +772B584209B8:lI97|H772B584209C8 +772B584209C8:lI116|H772B584209D8 +772B584209D8:lI105|H772B584209E8 +772B584209E8:lI110|H772B584209F8 +772B584209F8:lI103|H772B58420A08 +772B58420A08:lI32|H772B58420A18 +772B58420A18:lI100|H772B58420A28 +772B58420A28:lI117|H772B58420A38 +772B58420A38:lI114|H772B58420A48 +772B58420A48:lI105|H772B58420A58 +772B58420A58:lI110|H772B58420A68 +772B58420A68:lI103|H772B58420A78 +772B58420A78:lI32|H772B58420A88 +772B58420A88:lI98|H772B58420A98 +772B58420A98:lI111|H772B58420AA8 +772B58420AA8:lI111|H772B58420AB8 +772B58420AB8:lI116|N +772B58420AC8:lI67|H772B58420AD8 +772B58420AD8:lI111|H772B58420AE8 +772B58420AE8:lI117|H772B58420AF8 +772B58420AF8:lI108|H772B58420B08 +772B58420B08:lI100|H772B58420B18 +772B58420B18:lI32|H772B58420B28 +772B58420B28:lI110|H772B58420B38 +772B58420B38:lI111|H772B58420B48 +772B58420B48:lI116|H772B58420B58 +772B58420B58:lI32|H772B58420B68 +772B58420B68:lI115|H772B58420B78 +772B58420B78:lI116|H772B58420B88 +772B58420B88:lI97|H772B58420B98 +772B58420B98:lI114|H772B58420BA8 +772B58420BA8:lI116|H772B58420BB8 +772B58420BB8:lI32|H772B58420BC8 +772B58420BC8:lI107|H772B58420BD8 +772B58420BD8:lI101|H772B58420BE8 +772B58420BE8:lI114|H772B58420BF8 +772B58420BF8:lI110|H772B58420C08 +772B58420C08:lI101|H772B58420C18 +772B58420C18:lI108|H772B58420C28 +772B58420C28:lI32|H772B58420C38 +772B58420C38:lI112|H772B58420C48 +772B58420C48:lI105|H772B58420C58 +772B58420C58:lI100|N +772B58420C68:t2:A4:init,A2:ok +772B58420C80:t2:A4:init,A4:none +772B58420C98:t2:A4:init,AB:not_allowed +772B58420CB0:lI105|H772B58420CC0 +772B58420CC0:lI110|H772B58420CD0 +772B58420CD0:lI105|H772B58420CE0 +772B58420CE0:lI116|H772B58420CF0 +772B58420CF0:lI32|H772B58420D00 +772B58420D00:lI103|H772B58420D10 +772B58420D10:lI111|H772B58420D20 +772B58420D20:lI116|H772B58420D30 +772B58420D30:lI32|H772B58420D40 +772B58420D40:lI117|H772B58420D50 +772B58420D50:lI110|H772B58420D60 +772B58420D60:lI101|H772B58420D70 +772B58420D70:lI120|H772B58420D80 +772B58420D80:lI112|H772B58420D90 +772B58420D90:lI101|H772B58420DA0 +772B58420DA0:lI99|H772B58420DB0 +772B58420DB0:lI116|H772B58420DC0 +772B58420DC0:lI101|H772B58420DD0 +772B58420DD0:lI100|H772B58420DE0 +772B58420DE0:lI58|H772B58420DF0 +772B58420DF0:lI32|N +772B58420E00:t1:AC:error_logger +772B58420E10:Mf1:H772B58420E00:H772B58420E40 +772B58420E30:t1:A3:tag +772B58420E40:Mf1:H772B58420E30:A8:info_msg +772B58420E60:lI105|H772B58420E70 +772B58420E70:lI110|H772B58420E80 +772B58420E80:lI105|H772B58420E90 +772B58420E90:lI116|H772B58420EA0 +772B58420EA0:lI32|H772B58420EB0 +772B58420EB0:lI103|H772B58420EC0 +772B58420EC0:lI111|H772B58420ED0 +772B58420ED0:lI116|H772B58420EE0 +772B58420EE0:lI32|H772B58420EF0 +772B58420EF0:lI117|H772B58420F00 +772B58420F00:lI110|H772B58420F10 +772B58420F10:lI101|H772B58420F20 +772B58420F20:lI120|H772B58420F30 +772B58420F30:lI112|H772B58420F40 +772B58420F40:lI101|H772B58420F50 +772B58420F50:lI99|H772B58420F60 +772B58420F60:lI116|H772B58420F70 +772B58420F70:lI101|H772B58420F80 +772B58420F80:lI100|H772B58420F90 +772B58420F90:lI58|H772B58420FA0 +772B58420FA0:lI32|H772B58420FB0 +772B58420FB0:lI126|H772B58420FC0 +772B58420FC0:lI112|N +772B58420FD0:t2:A5:error,A6:badarg +772B58420FE8:lAD:logger_server|N +772B58420FF8:lA5:flush|N +772B58421008:t2:A4:init,A10:shutdown_timeout +772B58421020:lI75|H772B58421030 +772B58421030:lI101|H772B58421040 +772B58421040:lI114|H772B58421050 +772B58421050:lI110|H772B58421060 +772B58421060:lI101|H772B58421070 +772B58421070:lI108|H772B58421080 +772B58421080:lI32|H772B58421090 +772B58421090:lI112|H772B584210A0 +772B584210A0:lI105|H772B584210B0 +772B584210B0:lI100|H772B584210C0 +772B584210C0:lI32|H772B584210D0 +772B584210D0:lI116|H772B584210E0 +772B584210E0:lI101|H772B584210F0 +772B584210F0:lI114|H772B58421100 +772B58421100:lI109|H772B58421110 +772B58421110:lI105|H772B58421120 +772B58421120:lI110|H772B58421130 +772B58421130:lI97|H772B58421140 +772B58421140:lI116|H772B58421150 +772B58421150:lI101|H772B58421160 +772B58421160:lI100|N +772B58421170:lI46|N +772B58421180:lI99|H772B58421190 +772B58421190:lI97|H772B584211A0 +772B584211A0:lI110|H772B584211B0 +772B584211B0:lI110|H772B584211C0 +772B584211C0:lI111|H772B584211D0 +772B584211D0:lI116|H772B584211E0 +772B584211E0:lI32|H772B584211F0 +772B584211F0:lI115|H772B58421200 +772B58421200:lI116|H772B58421210 +772B58421210:lI97|H772B58421220 +772B58421220:lI114|H772B58421230 +772B58421230:lI116|H772B58421240 +772B58421240:lI32|H772B58421250 +772B58421250:lI108|H772B58421260 +772B58421260:lI111|H772B58421270 +772B58421270:lI97|H772B58421280 +772B58421280:lI100|H772B58421290 +772B58421290:lI101|H772B584212A0 +772B584212A0:lI114|N +772B584212B0:Yh4:Uk9PVA== +772B584212C8:lI47|H772B584212D8 +772B584212D8:lI98|H772B584212E8 +772B584212E8:lI105|H772B584212F8 +772B584212F8:lI110|H772B58421308 +772B58421308:lI47|H772B58421318 +772B58421318:lI115|H772B58421328 +772B58421328:lI116|H772B58421338 +772B58421338:lI97|H772B58421348 +772B58421348:lI114|H772B58421358 +772B58421358:lI116|N +772B58421368:lI46|H772B58421378 +772B58421378:lI98|H772B58421388 +772B58421388:lI111|H772B58421398 +772B58421398:lI111|H772B584213A8 +772B584213A8:lI116|N +772B584213B8:lI47|H772B584213C8 +772B584213C8:lI98|H772B584213D8 +772B584213D8:lI105|H772B584213E8 +772B584213E8:lI110|H772B584213F8 +772B584213F8:lI47|N +772B58421408:lI32|H772B58421418 +772B58421418:lI105|H772B58421428 +772B58421428:lI110|H772B58421438 +772B58421438:lI32|H772B58421448 +772B58421448:lI98|H772B58421458 +772B58421458:lI111|H772B58421468 +772B58421468:lI111|H772B58421478 +772B58421478:lI116|H772B58421488 +772B58421488:lI102|H772B58421498 +772B58421498:lI105|H772B584214A8 +772B584214A8:lI108|H772B584214B8 +772B584214B8:lI101|N +772B584214C8:lI99|H772B584214D8 +772B584214D8:lI97|H772B584214E8 +772B584214E8:lI110|H772B584214F8 +772B584214F8:lI110|H772B58421508 +772B58421508:lI111|H772B58421518 +772B58421518:lI116|H772B58421528 +772B58421528:lI32|H772B58421538 +772B58421538:lI101|H772B58421548 +772B58421548:lI120|H772B58421558 +772B58421558:lI112|H772B58421568 +772B58421568:lI97|H772B58421578 +772B58421578:lI110|H772B58421588 +772B58421588:lI100|H772B58421598 +772B58421598:lI32|H772B584215A8 +772B584215A8:lI36|N +772B584215B8:lI110|H772B584215C8 +772B584215C8:lI105|H772B584215D8 +772B584215D8:lI98|H772B584215E8 +772B584215E8:lI101|N +772B584215F8:lH772B58421608|N +772B58421608:lI101|H772B58421618 +772B58421618:lI98|H772B58421628 +772B58421628:lI105|H772B58421638 +772B58421638:lI110|N +772B58421648:lI47|N +772B58421658:lH772B58421668|N +772B58421668:lI32|H772B58421678 +772B58421678:lI105|H772B58421688 +772B58421688:lI115|H772B58421698 +772B58421698:lI32|H772B584216A8 +772B584216A8:lI110|H772B584216B8 +772B584216B8:lI111|H772B584216C8 +772B584216C8:lI116|H772B584216D8 +772B584216D8:lI32|H772B584216E8 +772B584216E8:lI101|H772B584216F8 +772B584216F8:lI120|H772B58421708 +772B58421708:lI112|H772B58421718 +772B58421718:lI111|H772B58421728 +772B58421728:lI114|H772B58421738 +772B58421738:lI116|H772B58421748 +772B58421748:lI101|H772B58421758 +772B58421758:lI100|H772B58421768 +772B58421768:lI46|H772B58421778 +772B58421778:lI13|H772B58421788 +772B58421788:lI10|H772B58421798 +772B58421798:lI13|H772B584217A8 +772B584217A8:lI10|N +772B584217B8:lI58|N +772B584217C8:lI69|H772B584217D8 +772B584217D8:lI114|H772B584217E8 +772B584217E8:lI114|H772B584217F8 +772B584217F8:lI111|H772B58421808 +772B58421808:lI114|H772B58421818 +772B58421818:lI33|H772B58421828 +772B58421828:lI32|N +772B58421838:lH772B58421848|N +772B58421848:Yh4:DQoNCg== +772B58421860:Yh17:RXJyb3IhIEZhaWxlZCB0byBldmFsOiA= +772B58421888:Yc6451BC4F4418:6451BC4F4438:6C +772B584218A0:Yc6451BC4F4418:0:6C +772B584218C8:lH772B584218D8|N +772B584218D8:Yh2:Lik= +772B584218F0:Yc6451BC4F44C0:6451BC4F44E0:6B +772B58421908:Yc6451BC4F44C0:0:6B +772B58421930:Yh1:Uw== +772B58421948:Yh2:LS0= +772B58421960:lI46|H772B58421970 +772B58421970:lI98|H772B58421980 +772B58421980:lI101|H772B58421990 +772B58421990:lI97|H772B584219A0 +772B584219A0:lI109|N +772B584219B0:lI46|H772B584219C0 +772B584219C0:lI101|H772B584219D0 +772B584219D0:lI122|N +772B584219E0:lA9:call_time|N +772B584219F0:t3:A1:_,A1:_,A1:_ +772B58421A10:lA4:call|N +772B58421A20:lI126|H772B58421A30 +772B58421A30:lI119|H772B58421A40 +772B58421A40:lI58|H772B58421A50 +772B58421A50:lI126|H772B58421A60 +772B58421A60:lI119|H772B58421A70 +772B58421A70:lI47|H772B58421A80 +772B58421A80:lI126|H772B58421A90 +772B58421A90:lI119|N +772B58421AA0:lI126|H772B58421AB0 +772B58421AB0:lI53|H772B58421AC0 +772B58421AC0:lI53|H772B58421AD0 +772B58421AD0:lI115|H772B58421AE0 +772B58421AE0:lI32|H772B58421AF0 +772B58421AF0:lI45|H772B58421B00 +772B58421B00:lI32|H772B58421B10 +772B58421B10:lI126|H772B58421B20 +772B58421B20:lI54|H772B58421B30 +772B58421B30:lI119|H772B58421B40 +772B58421B40:lI32|H772B58421B50 +772B58421B50:lI58|H772B58421B60 +772B58421B60:lI32|H772B58421B70 +772B58421B70:lI126|H772B58421B80 +772B58421B80:lI119|H772B58421B90 +772B58421B90:lI32|H772B58421BA0 +772B58421BA0:lI117|H772B58421BB0 +772B58421BB0:lI115|H772B58421BC0 +772B58421BC0:lI126|H772B58421BD0 +772B58421BD0:lI110|N +772B58421BE0:lI92|H772B58421BF0 +772B58421BF0:lI45|H772B58421C00 +772B58421C00:lI45|N +772B58421C10:lI45|H772B58421C20 +772B58421C20:lI45|N +772B58421C30:E48:g3AAAABGAfGJ81NeG9iHLSm7LUjSV3UAAAAAAAAAAHcEaW5pdGEAYgVJq95Ydw1ub25vZGVAbm9ob3N0AAAAAAAAAAAAAAAA +772B58421C48:Rf772B47012AC8 +772B58421C60:E48:g3AAAABGAfGJ81NeG9iHLSm7LUjSV3UAAAABAAAAAHcEaW5pdGEBYgVJq95Ydw1ub25vZGVAbm9ob3N0AAAAAAAAAAAAAAAA +772B58421C78:Rf772B47012B40 +772B58421C90:E48:g3AAAABGAfGJ81NeG9iHLSm7LUjSV3UAAAACAAAAAHcEaW5pdGECYgVJq95Ydw1ub25vZGVAbm9ob3N0AAAAAAAAAAAAAAAA +772B58421CA8:Rf772B47012BB8 +772B58421CC0:Rf772B47012C30 +772B58421CD8:Rf772B47012CA8 +772B58421CF0:Rf772B47012D20 +772B58421D08:Rf772B47012D98 +772B58421D20:Rf772B47012E10 +772B58421D38:E48:g3AAAABGA/GJ81NeG9iHLSm7LUjSV3UAAAAIAAAAAHcEaW5pdGEIYgVJq95Ydw1ub25vZGVAbm9ob3N0AAAAAAAAAAAAAAAA +772B58421D50:Rf772B47012E88 +772B58421D68:Rf772B47012F00 +772B58421D80:E48:g3AAAABGAfGJ81NeG9iHLSm7LUjSV3UAAAAKAAAAAHcEaW5pdGEKYgVJq95Ydw1ub25vZGVAbm9ob3N0AAAAAAAAAAAAAAAA +772B58421D98:Rf772B47012F78 +772B58421DB0:E48:g3AAAABGAfGJ81NeG9iHLSm7LUjSV3UAAAALAAAAAHcEaW5pdGELYgVJq95Ydw1ub25vZGVAbm9ob3N0AAAAAAAAAAAAAAAA +772B58421DC8:Rf772B47012FF0 +772B58421DE0:E48:g3AAAABGAfGJ81NeG9iHLSm7LUjSV3UAAAAMAAAAAHcEaW5pdGEMYgVJq95Ydw1ub25vZGVAbm9ob3N0AAAAAAAAAAAAAAAA +772B58421DF8:Rf772B47013068 +772B58421E10:E48:g3AAAABGAPGJ81NeG9iHLSm7LUjSV3UAAAANAAAAAHcEaW5pdGENYgVJq95Ydw1ub25vZGVAbm9ob3N0AAAAAAAAAAAAAAAA +772B58421E28:Rf772B470130E0 +772B58421E40:Rf772B47013158 +772B58421E58:Rf772B470131D0 +772B58421E70:E48:g3AAAABGAfGJ81NeG9iHLSm7LUjSV3UAAAAQAAAAAHcEaW5pdGEQYgVJq95Ydw1ub25vZGVAbm9ob3N0AAAAAAAAAAAAAAAA +772B58421E88:Rf772B47013248 +772B58424520:t4:A5:state,H772B58424548,H772B58424560,H772B58424578 +772B58424548:Mf0:H772B58410188: +772B58424560:Mf0:H772B58410188: +772B58424578:Mf0:H772B58410188: +772B58424590:Mf0:H772B58410188: +772B584245A8:lA5:flush|N +772B584245B8:lI115|H772B584245C8 +772B584245C8:lI111|H772B584245D8 +772B584245D8:lI99|H772B584245E8 +772B584245E8:lI107|H772B584245F8 +772B584245F8:lI101|H772B58424608 +772B58424608:lI116|H772B58424618 +772B58424618:lI45|H772B58424628 +772B58424628:lI114|H772B58424638 +772B58424638:lI101|H772B58424648 +772B58424648:lI103|H772B58424658 +772B58424658:lI105|H772B58424668 +772B58424668:lI115|H772B58424678 +772B58424678:lI116|H772B58424688 +772B58424688:lI114|H772B58424698 +772B58424698:lI121|H772B584246A8 +772B584246A8:lI32|H772B584246B8 +772B584246B8:lI114|H772B584246C8 +772B584246C8:lI101|H772B584246D8 +772B584246D8:lI99|H772B584246E8 +772B584246E8:lI101|H772B584246F8 +772B584246F8:lI105|H772B58424708 +772B58424708:lI118|H772B58424718 +772B58424718:lI101|H772B58424728 +772B58424728:lI100|H772B58424738 +772B58424738:lI32|H772B58424748 +772B58424748:lI117|H772B58424758 +772B58424758:lI110|H772B58424768 +772B58424768:lI101|H772B58424778 +772B58424778:lI120|H772B58424788 +772B58424788:lI112|H772B58424798 +772B58424798:lI101|H772B584247A8 +772B584247A8:lI99|H772B584247B8 +772B584247B8:lI116|H772B584247C8 +772B584247C8:lI101|H772B584247D8 +772B584247D8:lI100|H772B584247E8 +772B584247E8:lI32|H772B584247F8 +772B584247F8:lI101|H772B58424808 +772B58424808:lI120|H772B58424818 +772B58424818:lI105|H772B58424828 +772B58424828:lI116|H772B58424838 +772B58424838:lI32|H772B58424848 +772B58424848:lI102|H772B58424858 +772B58424858:lI114|H772B58424868 +772B58424868:lI111|H772B58424878 +772B58424878:lI109|H772B58424888 +772B58424888:lI32|H772B58424898 +772B58424898:lI126|H772B584248A8 +772B584248A8:lI112|H772B584248B8 +772B584248B8:lI58|H772B584248C8 +772B584248C8:lI126|H772B584248D8 +772B584248D8:lI110|H772B584248E8 +772B584248E8:lI32|H772B584248F8 +772B584248F8:lI32|H772B58424908 +772B58424908:lI32|H772B58424918 +772B58424918:lI126|H772B58424928 +772B58424928:lI112|N +772B58424938:lI115|H772B58424948 +772B58424948:lI111|H772B58424958 +772B58424958:lI99|H772B58424968 +772B58424968:lI107|H772B58424978 +772B58424978:lI101|H772B58424988 +772B58424988:lI116|H772B58424998 +772B58424998:lI45|H772B584249A8 +772B584249A8:lI114|H772B584249B8 +772B584249B8:lI101|H772B584249C8 +772B584249C8:lI103|H772B584249D8 +772B584249D8:lI105|H772B584249E8 +772B584249E8:lI115|H772B584249F8 +772B584249F8:lI116|H772B58424A08 +772B58424A08:lI114|H772B58424A18 +772B58424A18:lI121|H772B58424A28 +772B58424A28:lI32|H772B58424A38 +772B58424A38:lI114|H772B58424A48 +772B58424A48:lI101|H772B58424A58 +772B58424A58:lI99|H772B58424A68 +772B58424A68:lI101|H772B58424A78 +772B58424A78:lI105|H772B58424A88 +772B58424A88:lI118|H772B58424A98 +772B58424A98:lI101|H772B58424AA8 +772B58424AA8:lI100|H772B58424AB8 +772B58424AB8:lI32|H772B58424AC8 +772B58424AC8:lI117|H772B58424AD8 +772B58424AD8:lI110|H772B58424AE8 +772B58424AE8:lI101|H772B58424AF8 +772B58424AF8:lI120|H772B58424B08 +772B58424B08:lI112|H772B58424B18 +772B58424B18:lI101|H772B58424B28 +772B58424B28:lI99|H772B58424B38 +772B58424B38:lI116|H772B58424B48 +772B58424B48:lI101|H772B58424B58 +772B58424B58:lI100|H772B58424B68 +772B58424B68:lI58|H772B58424B78 +772B58424B78:lI126|H772B58424B88 +772B58424B88:lI110|H772B58424B98 +772B58424B98:lI32|H772B58424BA8 +772B58424BA8:lI32|H772B58424BB8 +772B58424BB8:lI32|H772B58424BC8 +772B58424BC8:lI126|H772B58424BD8 +772B58424BD8:lI112|N +772B58424BE8:lI115|H772B58424BF8 +772B58424BF8:lI111|H772B58424C08 +772B58424C08:lI99|H772B58424C18 +772B58424C18:lI107|H772B58424C28 +772B58424C28:lI101|H772B58424C38 +772B58424C38:lI116|H772B58424C48 +772B58424C48:lI45|H772B58424C58 +772B58424C58:lI114|H772B58424C68 +772B58424C68:lI101|H772B58424C78 +772B58424C78:lI103|H772B58424C88 +772B58424C88:lI105|H772B58424C98 +772B58424C98:lI115|H772B58424CA8 +772B58424CA8:lI116|H772B58424CB8 +772B58424CB8:lI114|H772B58424CC8 +772B58424CC8:lI121|H772B58424CD8 +772B58424CD8:lI32|H772B58424CE8 +772B58424CE8:lI101|H772B58424CF8 +772B58424CF8:lI114|H772B58424D08 +772B58424D08:lI114|H772B58424D18 +772B58424D18:lI111|H772B58424D28 +772B58424D28:lI114|H772B58424D38 +772B58424D38:lI32|H772B58424D48 +772B58424D48:lI119|H772B58424D58 +772B58424D58:lI104|H772B58424D68 +772B58424D68:lI105|H772B58424D78 +772B58424D78:lI108|H772B58424D88 +772B58424D88:lI101|H772B58424D98 +772B58424D98:lI32|H772B58424DA8 +772B58424DA8:lI112|H772B58424DB8 +772B58424DB8:lI114|H772B58424DC8 +772B58424DC8:lI111|H772B58424DD8 +772B58424DD8:lI99|H772B58424DE8 +772B58424DE8:lI101|H772B58424DF8 +772B58424DF8:lI115|H772B58424E08 +772B58424E08:lI115|H772B58424E18 +772B58424E18:lI105|H772B58424E28 +772B58424E28:lI110|H772B58424E38 +772B58424E38:lI103|H772B58424E48 +772B58424E48:lI32|H772B58424E58 +772B58424E58:lI115|H772B58424E68 +772B58424E68:lI111|H772B58424E78 +772B58424E78:lI99|H772B58424E88 +772B58424E88:lI107|H772B58424E98 +772B58424E98:lI101|H772B58424EA8 +772B58424EA8:lI116|H772B58424EB8 +772B58424EB8:lI58|H772B58424EC8 +772B58424EC8:lI32|H772B58424ED8 +772B58424ED8:lI126|H772B58424EE8 +772B58424EE8:lI110|H772B58424EF8 +772B58424EF8:lI32|H772B58424F08 +772B58424F08:lI32|H772B58424F18 +772B58424F18:lI32|H772B58424F28 +772B58424F28:lI67|H772B58424F38 +772B58424F38:lI108|H772B58424F48 +772B58424F48:lI97|H772B58424F58 +772B58424F58:lI115|H772B58424F68 +772B58424F68:lI115|H772B58424F78 +772B58424F78:lI58|H772B58424F88 +772B58424F88:lI32|H772B58424F98 +772B58424F98:lI126|H772B58424FA8 +772B58424FA8:lI112|H772B58424FB8 +772B58424FB8:lI126|H772B58424FC8 +772B58424FC8:lI110|H772B58424FD8 +772B58424FD8:lI32|H772B58424FE8 +772B58424FE8:lI32|H772B58424FF8 +772B58424FF8:lI32|H772B58425008 +772B58425008:lI69|H772B58425018 +772B58425018:lI114|H772B58425028 +772B58425028:lI114|H772B58425038 +772B58425038:lI111|H772B58425048 +772B58425048:lI114|H772B58425058 +772B58425058:lI58|H772B58425068 +772B58425068:lI32|H772B58425078 +772B58425078:lI126|H772B58425088 +772B58425088:lI112|H772B58425098 +772B58425098:lI126|H772B584250A8 +772B584250A8:lI110|H772B584250B8 +772B584250B8:lI32|H772B584250C8 +772B584250C8:lI32|H772B584250D8 +772B584250D8:lI32|H772B584250E8 +772B584250E8:lI83|H772B584250F8 +772B584250F8:lI116|H772B58425108 +772B58425108:lI97|H772B58425118 +772B58425118:lI99|H772B58425128 +772B58425128:lI107|H772B58425138 +772B58425138:lI58|H772B58425148 +772B58425148:lI32|H772B58425158 +772B58425158:lI126|H772B58425168 +772B58425168:lI112|N +772B58425178:t2:A5:error,AE:unknown_socket +772B58425190:t2:A5:error,A9:not_owner +772B584251A8:t2:A5:error,AF:unknown_monitor +772B584251C0:lI115|H772B584251D0 +772B584251D0:lI111|H772B584251E0 +772B584251E0:lI99|H772B584251F0 +772B584251F0:lI107|H772B58425200 +772B58425200:lI101|H772B58425210 +772B58425210:lI116|H772B58425220 +772B58425220:lI45|H772B58425230 +772B58425230:lI114|H772B58425240 +772B58425240:lI101|H772B58425250 +772B58425250:lI103|H772B58425260 +772B58425260:lI105|H772B58425270 +772B58425270:lI115|H772B58425280 +772B58425280:lI116|H772B58425290 +772B58425290:lI114|H772B584252A0 +772B584252A0:lI121|H772B584252B0 +772B584252B0:lI32|H772B584252C0 +772B584252C0:lI115|H772B584252D0 +772B584252D0:lI101|H772B584252E0 +772B584252E0:lI110|H772B584252F0 +772B584252F0:lI100|H772B58425300 +772B58425300:lI102|H772B58425310 +772B58425310:lI105|H772B58425320 +772B58425320:lI108|H772B58425330 +772B58425330:lI101|H772B58425340 +772B58425340:lI95|H772B58425350 +772B58425350:lI100|H772B58425360 +772B58425360:lI101|H772B58425370 +772B58425370:lI102|H772B58425380 +772B58425380:lI101|H772B58425390 +772B58425390:lI114|H772B584253A0 +772B584253A0:lI114|H772B584253B0 +772B584253B0:lI101|H772B584253C0 +772B584253C0:lI100|H772B584253D0 +772B584253D0:lI95|H772B584253E0 +772B584253E0:lI99|H772B584253F0 +772B584253F0:lI108|H772B58425400 +772B58425400:lI111|H772B58425410 +772B58425410:lI115|H772B58425420 +772B58425420:lI101|H772B58425430 +772B58425430:lI58|H772B58425440 +772B58425440:lI126|H772B58425450 +772B58425450:lI110|H772B58425460 +772B58425460:lI32|H772B58425470 +772B58425470:lI32|H772B58425480 +772B58425480:lI32|H772B58425490 +772B58425490:lI91|H772B584254A0 +772B584254A0:lI126|H772B584254B0 +772B584254B0:lI112|H772B584254C0 +772B584254C0:lI93|H772B584254D0 +772B584254D0:lI32|H772B584254E0 +772B584254E0:lI126|H772B584254F0 +772B584254F0:lI112|N +772B58425500:lI115|H772B58425510 +772B58425510:lI111|H772B58425520 +772B58425520:lI99|H772B58425530 +772B58425530:lI107|H772B58425540 +772B58425540:lI101|H772B58425550 +772B58425550:lI116|H772B58425560 +772B58425560:lI45|H772B58425570 +772B58425570:lI114|H772B58425580 +772B58425580:lI101|H772B58425590 +772B58425590:lI103|H772B584255A0 +772B584255A0:lI105|H772B584255B0 +772B584255B0:lI115|H772B584255C0 +772B584255C0:lI116|H772B584255D0 +772B584255D0:lI114|H772B584255E0 +772B584255E0:lI121|H772B584255F0 +772B584255F0:lI32|H772B58425600 +772B58425600:lI115|H772B58425610 +772B58425610:lI101|H772B58425620 +772B58425620:lI110|H772B58425630 +772B58425630:lI100|H772B58425640 +772B58425640:lI102|H772B58425650 +772B58425650:lI105|H772B58425660 +772B58425660:lI108|H772B58425670 +772B58425670:lI101|H772B58425680 +772B58425680:lI95|H772B58425690 +772B58425690:lI100|H772B584256A0 +772B584256A0:lI101|H772B584256B0 +772B584256B0:lI102|H772B584256C0 +772B584256C0:lI101|H772B584256D0 +772B584256D0:lI114|H772B584256E0 +772B584256E0:lI114|H772B584256F0 +772B584256F0:lI101|H772B58425700 +772B58425700:lI100|H772B58425710 +772B58425710:lI95|H772B58425720 +772B58425720:lI99|H772B58425730 +772B58425730:lI108|H772B58425740 +772B58425740:lI111|H772B58425750 +772B58425750:lI115|H772B58425760 +772B58425760:lI101|H772B58425770 +772B58425770:lI58|H772B58425780 +772B58425780:lI126|H772B58425790 +772B58425790:lI110|H772B584257A0 +772B584257A0:lI32|H772B584257B0 +772B584257B0:lI32|H772B584257C0 +772B584257C0:lI32|H772B584257D0 +772B584257D0:lI91|H772B584257E0 +772B584257E0:lI126|H772B584257F0 +772B584257F0:lI112|H772B58425800 +772B58425800:lI93|H772B58425810 +772B58425810:lI32|H772B58425820 +772B58425820:lI40|H772B58425830 +772B58425830:lI126|H772B58425840 +772B58425840:lI112|H772B58425850 +772B58425850:lI58|H772B58425860 +772B58425860:lI126|H772B58425870 +772B58425870:lI112|H772B58425880 +772B58425880:lI41|H772B58425890 +772B58425890:lI126|H772B584258A0 +772B584258A0:lI110|H772B584258B0 +772B584258B0:lI32|H772B584258C0 +772B584258C0:lI32|H772B584258D0 +772B584258D0:lI32|H772B584258E0 +772B584258E0:lI32|H772B584258F0 +772B584258F0:lI32|H772B58425900 +772B58425900:lI32|H772B58425910 +772B58425910:lI126|H772B58425920 +772B58425920:lI112|N +772B58425930:Rf772B470267B8 +772B58425948:t1:A3:tag +772B58425958:t4:AC:error_logger,A3:pid,A4:time,A2:gl +772B58428E00:t2:I0,N +772B58430040:lAB:named_table|H772B58430050 +772B58430050:lA9:protected|N +772B58430060:lI108|H772B58430070 +772B58430070:lI105|H772B58430080 +772B58430080:lI98|N +772B58430090:lI46|N +772B584300A0:Mf0:H772B58410188: +772B584300B8:lI69|H772B584300C8 +772B584300C8:lI82|H772B584300D8 +772B584300D8:lI76|H772B584300E8 +772B584300E8:lI95|H772B584300F8 +772B584300F8:lI76|H772B58430108 +772B58430108:lI73|H772B58430118 +772B58430118:lI66|H772B58430128 +772B58430128:lI83|N +772B58430138:lA5:flush|N +772B58430148:t2:A6:module,AB:code_server +772B58430160:lI32|H772B58430170 +772B58430170:lI42|H772B58430180 +772B58430180:lI42|H772B58430190 +772B58430190:lI32|H772B584301A0 +772B584301A0:lI67|H772B584301B0 +772B584301B0:lI111|H772B584301C0 +772B584301C0:lI100|H772B584301D0 +772B584301D0:lI101|H772B584301E0 +772B584301E0:lI115|H772B584301F0 +772B584301F0:lI101|H772B58430200 +772B58430200:lI114|H772B58430210 +772B58430210:lI118|H772B58430220 +772B58430220:lI101|H772B58430230 +772B58430230:lI114|H772B58430240 +772B58430240:lI42|H772B58430250 +772B58430250:lI42|H772B58430260 +772B58430260:lI42|H772B58430270 +772B58430270:lI32|H772B58430280 +772B58430280:lI105|H772B58430290 +772B58430290:lI103|H772B584302A0 +772B584302A0:lI110|H772B584302B0 +772B584302B0:lI111|H772B584302C0 +772B584302C0:lI114|H772B584302D0 +772B584302D0:lI105|H772B584302E0 +772B584302E0:lI110|H772B584302F0 +772B584302F0:lI103|H772B58430300 +772B58430300:lI32|H772B58430310 +772B58430310:lI126|H772B58430320 +772B58430320:lI119|H772B58430330 +772B58430330:lI126|H772B58430340 +772B58430340:lI110|H772B58430350 +772B58430350:lI32|N +772B58430360:lI0|N +772B58430370:lI101|H772B58430380 +772B58430380:lI98|H772B58430390 +772B58430390:lI105|H772B584303A0 +772B584303A0:lI110|N +772B584303B0:lH772B584303C0|N +772B584303C0:lI101|H772B584303D0 +772B584303D0:lI98|H772B584303E0 +772B584303E0:lI105|H772B584303F0 +772B584303F0:lI110|N +772B58430400:t2:A2:ok,H772B58430418 +772B58430418:lH772B58430428|N +772B58430428:lH772B58430438|N +772B58430438:lI102|H772B58430448 +772B58430448:lI97|H772B58430458 +772B58430458:lI108|H772B58430468 +772B58430468:lI115|H772B58430478 +772B58430478:lI101|N +772B58430488:lI45|N +772B58430498:t2:A5:error,AD:bad_directory +772B584304B0:lI101|H772B584304C0 +772B584304C0:lI114|H772B584304D0 +772B584304D0:lI116|H772B584304E0 +772B584304E0:lI115|N +772B584304F0:t2:A5:error,A8:bad_name +772B58430508:lI99|H772B58430518 +772B58430518:lI111|H772B58430528 +772B58430528:lI109|H772B58430538 +772B58430538:lI112|H772B58430548 +772B58430548:lI105|H772B58430558 +772B58430558:lI108|H772B58430568 +772B58430568:lI101|H772B58430578 +772B58430578:lI114|N +772B58430588:lI58|H772B58430598 +772B58430598:lI47|N +772B584305A8:t2:A5:error,A8:deadlock +772B584305C0:lI67|H772B584305D0 +772B584305D0:lI97|H772B584305E0 +772B584305E0:lI110|H772B584305F0 +772B584305F0:lI39|H772B58430600 +772B58430600:lI116|H772B58430610 +772B58430610:lI32|H772B58430620 +772B58430620:lI108|H772B58430630 +772B58430630:lI111|H772B58430640 +772B58430640:lI97|H772B58430650 +772B58430650:lI100|H772B58430660 +772B58430660:lI32|H772B58430670 +772B58430670:lI109|H772B58430680 +772B58430680:lI111|H772B58430690 +772B58430690:lI100|H772B584306A0 +772B584306A0:lI117|H772B584306B0 +772B584306B0:lI108|H772B584306C0 +772B584306C0:lI101|H772B584306D0 +772B584306D0:lI32|H772B584306E0 +772B584306E0:lI39|H772B584306F0 +772B584306F0:lI126|H772B58430700 +772B58430700:lI119|H772B58430710 +772B58430710:lI39|H772B58430720 +772B58430720:lI32|H772B58430730 +772B58430730:lI116|H772B58430740 +772B58430740:lI104|H772B58430750 +772B58430750:lI97|H772B58430760 +772B58430760:lI116|H772B58430770 +772B58430770:lI32|H772B58430780 +772B58430780:lI114|H772B58430790 +772B58430790:lI101|H772B584307A0 +772B584307A0:lI115|H772B584307B0 +772B584307B0:lI105|H772B584307C0 +772B584307C0:lI100|H772B584307D0 +772B584307D0:lI101|H772B584307E0 +772B584307E0:lI115|H772B584307F0 +772B584307F0:lI32|H772B58430800 +772B58430800:lI105|H772B58430810 +772B58430810:lI110|H772B58430820 +772B58430820:lI32|H772B58430830 +772B58430830:lI115|H772B58430840 +772B58430840:lI116|H772B58430850 +772B58430850:lI105|H772B58430860 +772B58430860:lI99|H772B58430870 +772B58430870:lI107|H772B58430880 +772B58430880:lI121|H772B58430890 +772B58430890:lI32|H772B584308A0 +772B584308A0:lI100|H772B584308B0 +772B584308B0:lI105|H772B584308C0 +772B584308C0:lI114|H772B584308D0 +772B584308D0:lI10|N +772B584308E0:t2:A5:error,A10:sticky_directory +772B584308F8:lI76|H772B58430908 +772B58430908:lI111|H772B58430918 +772B58430918:lI97|H772B58430928 +772B58430928:lI100|H772B58430938 +772B58430938:lI105|H772B58430948 +772B58430948:lI110|H772B58430958 +772B58430958:lI103|H772B58430968 +772B58430968:lI32|H772B58430978 +772B58430978:lI111|H772B58430988 +772B58430988:lI102|H772B58430998 +772B58430998:lI32|H772B584309A8 +772B584309A8:lI126|H772B584309B8 +772B584309B8:lI116|H772B584309C8 +772B584309C8:lI115|H772B584309D8 +772B584309D8:lI32|H772B584309E8 +772B584309E8:lI102|H772B584309F8 +772B584309F8:lI97|H772B58430A08 +772B58430A08:lI105|H772B58430A18 +772B58430A18:lI108|H772B58430A28 +772B58430A28:lI101|H772B58430A38 +772B58430A38:lI100|H772B58430A48 +772B58430A48:lI58|H772B58430A58 +772B58430A58:lI32|H772B58430A68 +772B58430A68:lI126|H772B58430A78 +772B58430A78:lI112|H772B58430A88 +772B58430A88:lI10|N +772B58430A98:t2:A5:error,AF:on_load_failure +772B58430AB0:t2:A5:error,A6:nofile +772B58430AC8:lH772B58430AD8|N +772B58430AD8:t3:H772B58430AF8,H772B58430B10,H772B58430B38 +772B58430AF8:t2:A2:$1,A1:_ +772B58430B10:lH772B58430B20|N +772B58430B20:t2:A7:is_atom,A2:$1 +772B58430B38:lA2:$_|N +772B58430B48:t1:A3:tag +772B58430B58:Mf1:H772B58430B48:A5:error +772B58430B78:t2:AB:code_server,A5:error +772B58430B90:t1:A3:tag +772B58430BA0:Mf1:H772B58430B90:A8:info_msg +772B58430BC0:lI10|N +772B58430BD0:lI84|H772B58430BE0 +772B58430BE0:lI104|H772B58430BF0 +772B58430BF0:lI101|H772B58430C00 +772B58430C00:lI32|H772B58430C10 +772B58430C10:lI111|H772B58430C20 +772B58430C20:lI110|H772B58430C30 +772B58430C30:lI95|H772B58430C40 +772B58430C40:lI108|H772B58430C50 +772B58430C50:lI111|H772B58430C60 +772B58430C60:lI97|H772B58430C70 +772B58430C70:lI100|H772B58430C80 +772B58430C80:lI32|H772B58430C90 +772B58430C90:lI102|H772B58430CA0 +772B58430CA0:lI117|H772B58430CB0 +772B58430CB0:lI110|H772B58430CC0 +772B58430CC0:lI99|H772B58430CD0 +772B58430CD0:lI116|H772B58430CE0 +772B58430CE0:lI105|H772B58430CF0 +772B58430CF0:lI111|H772B58430D00 +772B58430D00:lI110|H772B58430D10 +772B58430D10:lI32|H772B58430D20 +772B58430D20:lI102|H772B58430D30 +772B58430D30:lI111|H772B58430D40 +772B58430D40:lI114|H772B58430D50 +772B58430D50:lI32|H772B58430D60 +772B58430D60:lI109|H772B58430D70 +772B58430D70:lI111|H772B58430D80 +772B58430D80:lI100|H772B58430D90 +772B58430D90:lI117|H772B58430DA0 +772B58430DA0:lI108|H772B58430DB0 +772B58430DB0:lI101|H772B58430DC0 +772B58430DC0:lI32|H772B58430DD0 +772B58430DD0:lI126|H772B58430DE0 +772B58430DE0:lI115|H772B58430DF0 +772B58430DF0:lI32|H772B58430E00 +772B58430E00:lI114|H772B58430E10 +772B58430E10:lI101|H772B58430E20 +772B58430E20:lI116|H772B58430E30 +772B58430E30:lI117|H772B58430E40 +772B58430E40:lI114|H772B58430E50 +772B58430E50:lI110|H772B58430E60 +772B58430E60:lI101|H772B58430E70 +772B58430E70:lI100|H772B58430E80 +772B58430E80:lI58|H772B58430E90 +772B58430E90:lI126|H772B58430EA0 +772B58430EA0:lI110|H772B58430EB0 +772B58430EB0:lI126|H772B58430EC0 +772B58430EC0:lI80|H772B58430ED0 +772B58430ED0:lI10|N +772B58430EE0:lI108|N +772B58430EF0:lI114|H772B58430EE0 +772B58430F00:lI101|H772B58430EF0 +772B58430F10:lI46|H772B58430F00 +772B58430F20:lI114|H772B58430F10 +772B58430F30:lI101|H772B58430F20 +772B58430F40:lI118|H772B58430F30 +772B58430F50:lI114|H772B58430F40 +772B58430F60:lI101|H772B58430F50 +772B58430F70:lI115|H772B58430F60 +772B58430F80:lI95|H772B58430F70 +772B58430F90:lI101|H772B58430F80 +772B58430FA0:lI100|H772B58430F90 +772B58430FB0:lI111|H772B58430FA0 +772B58430FC0:lI99|H772B58430FB0 +772B58430FD0:Rf772B582DE640 +772B58430FE8:Rf772B582DE6B8 +772B58431000:E4F:g3AAAABNAZ+ED6QFyng08OZO5TEYYhQAAAACAAAAAHcLY29kZV9zZXJ2ZXJhAmIE/CB9WHcNbm9ub2RlQG5vaG9zdAAAAAAAAAAAAAAAAA== +772B58431018:Rf772B582DE730 +772B58431030:E4F:g3AAAABNAZ+ED6QFyng08OZO5TEYYhQAAAADAAAAAHcLY29kZV9zZXJ2ZXJhA2IE/CB9WHcNbm9ub2RlQG5vaG9zdAAAAAAAAAAAAAAAAA== +772B58431048:Rf772B582DE7A8 +772B58431060:Rf772B582DE820 +772B58431078:Rf772B582DE898 +772B58431090:Rf772B582DE910 +772B584310A8:Rf772B582DE988 +772B584310C0:Rf772B582DEA00 +772B584310D8:Rf772B582DEA78 +772B584310F0:Rf772B582DEAF0 +772B58431108:Rf772B582DEB68 +772B58431120:Rf772B582DEBE0 +772B58431138:Rf772B582DEC58 +772B58431150:t4:AC:error_logger,A3:pid,A4:time,A2:gl +772B58435558:t2:A5:local,AA:kernel_sup +772B58435570:t3:A9:intensity,A6:period,A8:strategy +772B58435590:Mf3:H772B58435570:I4,I3600,AB:one_for_one +772B584355C0:lH772B58435608|N +772B584355D0:t6:A2:id,A7:restart,A8:shutdown,A5:start,A4:type,A7:modules +772B58435608:Mf6:H772B584355D0:AD:file_server_2,A9:permanent,I2000,H772B58435690,A6:worker,H772B58435650 +772B58435650:lA4:file|H772B58435660 +772B58435660:lAB:file_server|H772B58435670 +772B58435670:lAE:file_io_server|H772B58435680 +772B58435680:lA9:prim_file|N +772B58435690:t3:AB:file_server,AA:start_link,N +772B584356B0:lH772B584356C0|N +772B584356C0:lI109|H772B584356D0 +772B584356D0:lI105|H772B584356E0 +772B584356E0:lI110|H772B584356F0 +772B584356F0:lI105|H772B58435700 +772B58435700:lI109|H772B58435710 +772B58435710:lI97|H772B58435720 +772B58435720:lI108|N +772B58435730:lH772B584357B8|H772B58435740 +772B58435740:lH772B58435868|H772B58435750 +772B58435750:lH772B58435918|H772B58435760 +772B58435760:lH772B584359C8|H772B58435770 +772B58435770:lH772B58435A78|N +772B58435780:t6:A2:id,A7:restart,A8:shutdown,A5:start,A4:type,A7:modules +772B584357B8:Mf6:H772B58435780:A4:user,A9:temporary,I2000,H772B58435810,AA:supervisor,H772B58435800 +772B58435800:lA8:user_sup|N +772B58435810:t3:A8:user_sup,A5:start,N +772B58435830:t6:A2:id,A7:restart,A8:shutdown,A5:start,A4:type,A7:modules +772B58435868:Mf6:H772B58435830:AA:logger_sup,A9:permanent,A8:infinity,H772B584358C0,AA:supervisor,H772B584358B0 +772B584358B0:lAA:logger_sup|N +772B584358C0:t3:AA:logger_sup,AA:start_link,N +772B584358E0:t6:A2:id,A7:restart,A8:shutdown,A5:start,A4:type,A7:modules +772B58435918:Mf6:H772B584358E0:AD:kernel_config,A9:permanent,I2000,H772B58435970,A6:worker,H772B58435960 +772B58435960:lAD:kernel_config|N +772B58435970:t3:AD:kernel_config,AA:start_link,N +772B58435990:t6:A2:id,A7:restart,A8:shutdown,A5:start,A4:type,A7:modules +772B584359C8:Mf6:H772B58435990:AB:kernel_refc,A9:permanent,I2000,H772B58435A20,A6:worker,H772B58435A10 +772B58435A10:lAB:kernel_refc|N +772B58435A20:t3:AB:kernel_refc,AA:start_link,N +772B58435A40:t6:A2:id,A7:restart,A8:shutdown,A5:start,A4:type,A7:modules +772B58435A78:Mf6:H772B58435A40:AF:kernel_safe_sup,A9:permanent,A8:infinity,H772B58435AD0,AA:supervisor,H772B58435AC0 +772B58435AC0:lA6:kernel|N +772B58435AD0:t3:AA:supervisor,AA:start_link,H772B58435AF0 +772B58435AF0:lH772B58435B20|H772B58435B00 +772B58435B00:lA6:kernel|H772B58435B10 +772B58435B10:lA4:safe|N +772B58435B20:t2:A5:local,AF:kernel_safe_sup +772B58435B38:t6:A2:id,A7:restart,A8:shutdown,A5:start,A4:type,A7:modules +772B58435B70:Mf6:H772B58435B38:A7:on_load,A9:transient,I2000,H772B58435BC8,A6:worker,H772B58435BB8 +772B58435BB8:lA6:kernel|N +772B58435BC8:t3:A8:proc_lib,AA:start_link,H772B58435BE8 +772B58435BE8:lA6:kernel|H772B58435BF8 +772B58435BF8:lA4:init|H772B58435C08 +772B58435C08:lH772B58435C18|N +772B58435C18:lA7:on_load|N +772B58435C28:t6:A2:id,A7:restart,A8:shutdown,A5:start,A4:type,A7:modules +772B58435C60:Mf6:H772B58435C28:AE:standard_error,A9:temporary,I2000,H772B58435CB8,AA:supervisor,H772B58435CA8 +772B58435CA8:lAE:standard_error|N +772B58435CB8:t3:AE:standard_error,AA:start_link,N +772B58435CD8:t6:A2:id,A7:restart,A8:shutdown,A5:start,A4:type,A7:modules +772B58435D10:Mf6:H772B58435CD8:AB:code_server,A9:permanent,I2000,H772B58435D68,A6:worker,H772B58435D58 +772B58435D58:lA4:code|N +772B58435D68:t3:A4:code,AA:start_link,N +772B58435D88:t3:A9:intensity,A6:period,A8:strategy +772B58435DA8:Mf3:H772B58435D88:I0,I1,AB:one_for_all +772B58435DD8:t2:A2:ok,A5:false +772B58435DF0:t6:A2:id,A7:restart,A8:shutdown,A5:start,A4:type,A7:modules +772B58435E28:Mf6:H772B58435DF0:A11:erl_signal_server,A9:permanent,I2000,H772B58435E70,A6:worker,A7:dynamic +772B58435E70:t3:A9:gen_event,AA:start_link,H772B58435E90 +772B58435E90:lH772B58435EA0|N +772B58435EA0:t2:A5:local,A11:erl_signal_server +772B58435EB8:t6:A2:id,A7:restart,A8:shutdown,A5:start,A4:type,A7:modules +772B58435EF0:Mf6:H772B58435EB8:A7:inet_db,A9:permanent,I2000,H772B58435F48,A6:worker,H772B58435F38 +772B58435F38:lA7:inet_db|N +772B58435F48:t3:A7:inet_db,AA:start_link,N +772B58435F68:lH772B58435FC0|H772B58435F78 +772B58435F78:lH772B58436070|N +772B58435F88:t6:A2:id,A7:restart,A8:shutdown,A5:start,A4:type,A7:modules +772B58435FC0:Mf6:H772B58435F88:A7:net_sup,A9:permanent,A8:infinity,H772B58436018,AA:supervisor,H772B58436008 +772B58436008:lA10:erl_distribution|N +772B58436018:t3:A10:erl_distribution,AA:start_link,N +772B58436038:t6:A2:id,A7:restart,A8:shutdown,A5:start,A4:type,A7:modules +772B58436070:Mf6:H772B58436038:AC:global_group,A9:permanent,I2000,H772B584360C8,A6:worker,H772B584360B8 +772B584360B8:lAC:global_group|N +772B584360C8:t3:AC:global_group,AA:start_link,N +772B584360E8:t6:A2:id,A7:restart,A8:shutdown,A5:start,A4:type,A7:modules +772B58436120:Mf6:H772B584360E8:A12:global_name_server,A9:permanent,I2000,H772B58436178,A6:worker,H772B58436168 +772B58436168:lA6:global|N +772B58436178:t3:A6:global,AA:start_link,N +772B58436198:t6:A2:id,A7:restart,A8:shutdown,A5:start,A4:type,A7:modules +772B584361D0:Mf6:H772B58436198:A3:rex,A9:permanent,I2000,H772B58436228,A6:worker,H772B58436218 +772B58436218:lA3:rpc|N +772B58436228:t3:A3:rpc,AA:start_link,N +772B58436248:lH772B58436290|N +772B58436258:t6:A2:id,A7:restart,A8:shutdown,A5:start,A4:type,A7:modules +772B58436290:Mf6:H772B58436258:A7:dist_ac,A9:permanent,I2000,H772B584362E8,A6:worker,H772B584362D8 +772B584362D8:lA7:dist_ac|N +772B584362E8:t3:A7:dist_ac,AA:start_link,N +772B58436308:t2:A2:ok,A4:true +772B58436320:Mf0:H772B58410188: +772B58436338:lAF:erl_boot_server|N +772B58436348:lH772B584363A0|H772B58436358 +772B58436358:lH772B58436450|N +772B58436368:t6:A2:id,A7:restart,A8:shutdown,A5:start,A4:type,A7:modules +772B584363A0:Mf6:H772B58436368:AF:disk_log_server,A9:permanent,I2000,H772B584363F8,A6:worker,H772B584363E8 +772B584363E8:lAF:disk_log_server|N +772B584363F8:t3:AF:disk_log_server,AA:start_link,N +772B58436418:t6:A2:id,A7:restart,A8:shutdown,A5:start,A4:type,A7:modules +772B58436450:Mf6:H772B58436418:AC:disk_log_sup,A9:permanent,I1000,H772B584364A8,AA:supervisor,H772B58436498 +772B58436498:lAC:disk_log_sup|N +772B584364A8:t3:AC:disk_log_sup,AA:start_link,N +772B584364C8:lH772B58436510|N +772B584364D8:t6:A2:id,A7:restart,A8:shutdown,A5:start,A4:type,A7:modules +772B58436510:Mf6:H772B584364D8:A2:pg,A9:permanent,I1000,H772B58436568,A6:worker,H772B58436558 +772B58436558:lA2:pg|N +772B58436568:t3:A2:pg,AA:start_link,N +772B58436588:lH772B584365D0|N +772B58436598:t6:A2:id,A7:restart,A8:shutdown,A5:start,A4:type,A7:modules +772B584365D0:Mf6:H772B58436598:AC:timer_server,A9:permanent,I1000,H772B58436628,A6:worker,H772B58436618 +772B58436618:lA5:timer|N +772B58436628:t3:A5:timer,AA:start_link,N +772B58436648:lH772B58436690|N +772B58436658:t6:A2:id,A7:restart,A8:shutdown,A5:start,A4:type,A7:modules +772B58436690:Mf6:H772B58436658:A12:erl_compile_server,A9:permanent,I2000,H772B584366E8,A6:worker,H772B584366D8 +772B584366D8:lA12:erl_compile_server|N +772B584366E8:t3:A12:erl_compile_server,AA:start_link,N +772B58436708:lI68|H772B58436718 +772B58436718:lI105|H772B58436728 +772B58436728:lI115|H772B58436738 +772B58436738:lI116|H772B58436748 +772B58436748:lI114|H772B58436758 +772B58436758:lI105|H772B58436768 +772B58436768:lI98|H772B58436778 +772B58436778:lI117|H772B58436788 +772B58436788:lI116|H772B58436798 +772B58436798:lI105|H772B584367A8 +772B584367A8:lI111|H772B584367B8 +772B584367B8:lI110|H772B584367C8 +772B584367C8:lI32|H772B584367D8 +772B584367D8:lI110|H772B584367E8 +772B584367E8:lI111|H772B584367F8 +772B584367F8:lI116|H772B58436808 +772B58436808:lI32|H772B58436818 +772B58436818:lI99|H772B58436828 +772B58436828:lI104|H772B58436838 +772B58436838:lI97|H772B58436848 +772B58436848:lI110|H772B58436858 +772B58436858:lI103|H772B58436868 +772B58436868:lI101|H772B58436878 +772B58436878:lI100|H772B58436888 +772B58436888:lI58|H772B58436898 +772B58436898:lI32|H772B584368A8 +772B584368A8:lI78|H772B584368B8 +772B584368B8:lI111|H772B584368C8 +772B584368C8:lI116|H772B584368D8 +772B584368D8:lI32|H772B584368E8 +772B584368E8:lI97|H772B584368F8 +772B584368F8:lI108|H772B58436908 +772B58436908:lI108|H772B58436918 +772B58436918:lI111|H772B58436928 +772B58436928:lI119|H772B58436938 +772B58436938:lI101|H772B58436948 +772B58436948:lI100|H772B58436958 +772B58436958:lI32|H772B58436968 +772B58436968:lI116|H772B58436978 +772B58436978:lI111|H772B58436988 +772B58436988:lI32|H772B58436998 +772B58436998:lI114|H772B584369A8 +772B584369A8:lI101|H772B584369B8 +772B584369B8:lI109|H772B584369C8 +772B584369C8:lI111|H772B584369D8 +772B584369D8:lI118|H772B584369E8 +772B584369E8:lI101|H772B584369F8 +772B584369F8:lI32|H772B58436A08 +772B58436A08:lI116|H772B58436A18 +772B58436A18:lI104|H772B58436A28 +772B58436A28:lI101|H772B58436A38 +772B58436A38:lI32|H772B58436A48 +772B58436A48:lI100|H772B58436A58 +772B58436A58:lI105|H772B58436A68 +772B58436A68:lI115|H772B58436A78 +772B58436A78:lI116|H772B58436A88 +772B58436A88:lI114|H772B58436A98 +772B58436A98:lI105|H772B58436AA8 +772B58436AA8:lI98|H772B58436AB8 +772B58436AB8:lI117|H772B58436AC8 +772B58436AC8:lI116|H772B58436AD8 +772B58436AD8:lI105|H772B58436AE8 +772B58436AE8:lI111|H772B58436AF8 +772B58436AF8:lI110|H772B58436B08 +772B58436B08:lI32|H772B58436B18 +772B58436B18:lI112|H772B58436B28 +772B58436B28:lI97|H772B58436B38 +772B58436B38:lI114|H772B58436B48 +772B58436B48:lI97|H772B58436B58 +772B58436B58:lI109|H772B58436B68 +772B58436B68:lI101|H772B58436B78 +772B58436B78:lI116|H772B58436B88 +772B58436B88:lI101|H772B58436B98 +772B58436B98:lI114|H772B58436BA8 +772B58436BA8:lI46|N +772B58436BB8:t2:A5:error,H772B58436BD0 +772B58436BD0:t2:A18:distribution_not_changed,H772B58436BE8 +772B58436BE8:lI78|H772B58436BF8 +772B58436BF8:lI111|H772B58436C08 +772B58436C08:lI116|H772B58436C18 +772B58436C18:lI32|H772B58436C28 +772B58436C28:lI97|H772B58436C38 +772B58436C38:lI108|H772B58436C48 +772B58436C48:lI108|H772B58436C58 +772B58436C58:lI111|H772B58436C68 +772B58436C68:lI119|H772B58436C78 +772B58436C78:lI101|H772B58436C88 +772B58436C88:lI100|H772B58436C98 +772B58436C98:lI32|H772B58436CA8 +772B58436CA8:lI116|H772B58436CB8 +772B58436CB8:lI111|H772B58436CC8 +772B58436CC8:lI32|H772B58436CD8 +772B58436CD8:lI114|H772B58436CE8 +772B58436CE8:lI101|H772B58436CF8 +772B58436CF8:lI109|H772B58436D08 +772B58436D08:lI111|H772B58436D18 +772B58436D18:lI118|H772B58436D28 +772B58436D28:lI101|H772B58436D38 +772B58436D38:lI32|H772B58436D48 +772B58436D48:lI116|H772B58436D58 +772B58436D58:lI104|H772B58436D68 +772B58436D68:lI101|H772B58436D78 +772B58436D78:lI32|H772B58436D88 +772B58436D88:lI39|H772B58436D98 +772B58436D98:lI100|H772B58436DA8 +772B58436DA8:lI105|H772B58436DB8 +772B58436DB8:lI115|H772B58436DC8 +772B58436DC8:lI116|H772B58436DD8 +772B58436DD8:lI114|H772B58436DE8 +772B58436DE8:lI105|H772B58436DF8 +772B58436DF8:lI98|H772B58436E08 +772B58436E08:lI117|H772B58436E18 +772B58436E18:lI116|H772B58436E28 +772B58436E28:lI101|H772B58436E38 +772B58436E38:lI100|H772B58436E48 +772B58436E48:lI39|H772B58436E58 +772B58436E58:lI32|H772B58436E68 +772B58436E68:lI112|H772B58436E78 +772B58436E78:lI97|H772B58436E88 +772B58436E88:lI114|H772B58436E98 +772B58436E98:lI97|H772B58436EA8 +772B58436EA8:lI109|H772B58436EB8 +772B58436EB8:lI101|H772B58436EC8 +772B58436EC8:lI116|H772B58436ED8 +772B58436ED8:lI101|H772B58436EE8 +772B58436EE8:lI114|N +772B58436EF8:lI68|H772B58436F08 +772B58436F08:lI105|H772B58436F18 +772B58436F18:lI115|H772B58436F28 +772B58436F28:lI116|H772B58436F38 +772B58436F38:lI114|H772B58436F48 +772B58436F48:lI105|H772B58436F58 +772B58436F58:lI98|H772B58436F68 +772B58436F68:lI117|H772B58436F78 +772B58436F78:lI116|H772B58436F88 +772B58436F88:lI105|H772B58436F98 +772B58436F98:lI111|H772B58436FA8 +772B58436FA8:lI110|H772B58436FB8 +772B58436FB8:lI32|H772B58436FC8 +772B58436FC8:lI110|H772B58436FD8 +772B58436FD8:lI111|H772B58436FE8 +772B58436FE8:lI116|H772B58436FF8 +772B58436FF8:lI32|H772B58437008 +772B58437008:lI99|H772B58437018 +772B58437018:lI104|H772B58437028 +772B58437028:lI97|H772B58437038 +772B58437038:lI110|H772B58437048 +772B58437048:lI103|H772B58437058 +772B58437058:lI101|H772B58437068 +772B58437068:lI100|H772B58437078 +772B58437078:lI58|H772B58437088 +772B58437088:lI32|H772B58437098 +772B58437098:lI78|H772B584370A8 +772B584370A8:lI111|H772B584370B8 +772B584370B8:lI116|H772B584370C8 +772B584370C8:lI32|H772B584370D8 +772B584370D8:lI97|H772B584370E8 +772B584370E8:lI108|H772B584370F8 +772B584370F8:lI108|H772B58437108 +772B58437108:lI111|H772B58437118 +772B58437118:lI119|H772B58437128 +772B58437128:lI101|H772B58437138 +772B58437138:lI100|H772B58437148 +772B58437148:lI32|H772B58437158 +772B58437158:lI116|H772B58437168 +772B58437168:lI111|H772B58437178 +772B58437178:lI32|H772B58437188 +772B58437188:lI97|H772B58437198 +772B58437198:lI100|H772B584371A8 +772B584371A8:lI100|H772B584371B8 +772B584371B8:lI32|H772B584371C8 +772B584371C8:lI116|H772B584371D8 +772B584371D8:lI104|H772B584371E8 +772B584371E8:lI101|H772B584371F8 +772B584371F8:lI32|H772B58437208 +772B58437208:lI39|H772B58437218 +772B58437218:lI100|H772B58437228 +772B58437228:lI105|H772B58437238 +772B58437238:lI115|H772B58437248 +772B58437248:lI116|H772B58437258 +772B58437258:lI114|H772B58437268 +772B58437268:lI105|H772B58437278 +772B58437278:lI98|H772B58437288 +772B58437288:lI117|H772B58437298 +772B58437298:lI116|H772B584372A8 +772B584372A8:lI101|H772B584372B8 +772B584372B8:lI100|H772B584372C8 +772B584372C8:lI39|H772B584372D8 +772B584372D8:lI32|H772B584372E8 +772B584372E8:lI112|H772B584372F8 +772B584372F8:lI97|H772B58437308 +772B58437308:lI114|H772B58437318 +772B58437318:lI97|H772B58437328 +772B58437328:lI109|H772B58437338 +772B58437338:lI101|H772B58437348 +772B58437348:lI116|H772B58437358 +772B58437358:lI101|H772B58437368 +772B58437368:lI114|H772B58437378 +772B58437378:lI46|N +772B58437388:t2:A5:error,H772B584373A0 +772B584373A0:t2:A18:distribution_not_changed,H772B584373B8 +772B584373B8:lI78|H772B584373C8 +772B584373C8:lI111|H772B584373D8 +772B584373D8:lI116|H772B584373E8 +772B584373E8:lI32|H772B584373F8 +772B584373F8:lI97|H772B58437408 +772B58437408:lI108|H772B58437418 +772B58437418:lI108|H772B58437428 +772B58437428:lI111|H772B58437438 +772B58437438:lI119|H772B58437448 +772B58437448:lI101|H772B58437458 +772B58437458:lI100|H772B58437468 +772B58437468:lI32|H772B58437478 +772B58437478:lI116|H772B58437488 +772B58437488:lI111|H772B58437498 +772B58437498:lI32|H772B584374A8 +772B584374A8:lI97|H772B584374B8 +772B584374B8:lI100|H772B584374C8 +772B584374C8:lI100|H772B584374D8 +772B584374D8:lI32|H772B584374E8 +772B584374E8:lI116|H772B584374F8 +772B584374F8:lI104|H772B58437508 +772B58437508:lI101|H772B58437518 +772B58437518:lI32|H772B58437528 +772B58437528:lI39|H772B58437538 +772B58437538:lI100|H772B58437548 +772B58437548:lI105|H772B58437558 +772B58437558:lI115|H772B58437568 +772B58437568:lI116|H772B58437578 +772B58437578:lI114|H772B58437588 +772B58437588:lI105|H772B58437598 +772B58437598:lI98|H772B584375A8 +772B584375A8:lI117|H772B584375B8 +772B584375B8:lI116|H772B584375C8 +772B584375C8:lI101|H772B584375D8 +772B584375D8:lI100|H772B584375E8 +772B584375E8:lI39|H772B584375F8 +772B584375F8:lI32|H772B58437608 +772B58437608:lI112|H772B58437618 +772B58437618:lI97|H772B58437628 +772B58437628:lI114|H772B58437638 +772B58437638:lI97|H772B58437648 +772B58437648:lI109|H772B58437658 +772B58437658:lI101|H772B58437668 +772B58437668:lI116|H772B58437678 +772B58437678:lI101|H772B58437688 +772B58437688:lI114|N +772B58437698:lI108|N +772B584376A8:lI114|H772B58437698 +772B584376B8:lI101|H772B584376A8 +772B584376C8:lI46|H772B584376B8 +772B584376D8:lI108|H772B584376C8 +772B584376E8:lI101|H772B584376D8 +772B584376F8:lI110|H772B584376E8 +772B58437708:lI114|H772B584376F8 +772B58437718:lI101|H772B58437708 +772B58437728:lI107|H772B58437718 +772B58437738:t6:A2:id,A7:restart,A8:shutdown,A5:start,A4:type,A7:modules +772B58437788:Mf0:H772B58410188: +772B584377A0:t2:H772B584377B8,H772B584377E8 +772B584377B8:lI126|H772B584377C8 +772B584377C8:lI116|H772B584377D8 +772B584377D8:lI112|N +772B584377E8:lN|N +772B584377F8:lI126|H772B58437808 +772B58437808:lI116|H772B58437818 +772B58437818:lI115|N +772B58437828:lI126|H772B58437838 +772B58437838:lI116|H772B58437848 +772B58437848:lI112|N +772B58437858:lI115|N +772B58437868:lI112|N +772B58437878:lI32|H772B58437888 +772B58437888:lI32|H772B58437898 +772B58437898:lI32|H772B584378A8 +772B584378A8:lI32|H772B584378B8 +772B584378B8:lI126|H772B584378C8 +772B584378C8:lI116|H772B584378D8 +772B584378D8:lI112|H772B584378E8 +772B584378E8:lI58|H772B584378F8 +772B584378F8:lI32|H772B58437908 +772B58437908:lI126|H772B58437918 +772B58437918:lI116|N +772B58437928:lI32|H772B58437938 +772B58437938:lI32|H772B58437948 +772B58437948:lI32|H772B58437958 +772B58437958:lI32|H772B58437968 +772B58437968:lI126|H772B58437978 +772B58437978:lI116|H772B58437988 +772B58437988:lI112|N +772B58437998:lI58|H772B584379A8 +772B584379A8:lI32|N +772B584379B8:lI76|H772B584379C8 +772B584379C8:lI111|H772B584379D8 +772B584379D8:lI103|H772B584379E8 +772B584379E8:lI103|H772B584379F8 +772B584379F8:lI101|H772B58437A08 +772B58437A08:lI114|H772B58437A18 +772B58437A18:lI32|H772B58437A28 +772B58437A28:lI45|H772B58437A38 +772B58437A38:lI32|N +772B58437A48:lI80|H772B58437A58 +772B58437A58:lI114|H772B58437A68 +772B58437A68:lI105|H772B58437A78 +772B58437A78:lI109|H772B58437A88 +772B58437A88:lI97|H772B58437A98 +772B58437A98:lI114|H772B58437AA8 +772B58437AA8:lI121|H772B58437AB8 +772B58437AB8:lI32|H772B58437AC8 +772B58437AC8:lI99|H772B58437AD8 +772B58437AD8:lI111|H772B58437AE8 +772B58437AE8:lI110|H772B58437AF8 +772B58437AF8:lI102|H772B58437B08 +772B58437B08:lI105|H772B58437B18 +772B58437B18:lI103|H772B58437B28 +772B58437B28:lI117|H772B58437B38 +772B58437B38:lI114|H772B58437B48 +772B58437B48:lI97|H772B58437B58 +772B58437B58:lI116|H772B58437B68 +772B58437B68:lI105|H772B58437B78 +772B58437B78:lI111|H772B58437B88 +772B58437B88:lI110|H772B58437B98 +772B58437B98:lI58|H772B58437BA8 +772B58437BA8:lI32|H772B58437BB8 +772B58437BB8:lI126|H772B58437BC8 +772B58437BC8:lI110|N +772B58437BD8:lI32|H772B58437BE8 +772B58437BE8:lI32|H772B58437BF8 +772B58437BF8:lI32|H772B58437C08 +772B58437C08:lI32|H772B58437C18 +772B58437C18:lI76|H772B58437C28 +772B58437C28:lI101|H772B58437C38 +772B58437C38:lI118|H772B58437C48 +772B58437C48:lI101|H772B58437C58 +772B58437C58:lI108|H772B58437C68 +772B58437C68:lI58|H772B58437C78 +772B58437C78:lI32|H772B58437C88 +772B58437C88:lI126|H772B58437C98 +772B58437C98:lI112|H772B58437CA8 +772B58437CA8:lI126|H772B58437CB8 +772B58437CB8:lI110|N +772B58437CC8:lI32|H772B58437CD8 +772B58437CD8:lI32|H772B58437CE8 +772B58437CE8:lI32|H772B58437CF8 +772B58437CF8:lI32|H772B58437D08 +772B58437D08:lI70|H772B58437D18 +772B58437D18:lI105|H772B58437D28 +772B58437D28:lI108|H772B58437D38 +772B58437D38:lI116|H772B58437D48 +772B58437D48:lI101|H772B58437D58 +772B58437D58:lI114|H772B58437D68 +772B58437D68:lI32|H772B58437D78 +772B58437D78:lI68|H772B58437D88 +772B58437D88:lI101|H772B58437D98 +772B58437D98:lI102|H772B58437DA8 +772B58437DA8:lI97|H772B58437DB8 +772B58437DB8:lI117|H772B58437DC8 +772B58437DC8:lI108|H772B58437DD8 +772B58437DD8:lI116|H772B58437DE8 +772B58437DE8:lI58|H772B58437DF8 +772B58437DF8:lI32|H772B58437E08 +772B58437E08:lI126|H772B58437E18 +772B58437E18:lI112|H772B58437E28 +772B58437E28:lI126|H772B58437E38 +772B58437E38:lI110|N +772B58437E48:lI32|H772B58437E58 +772B58437E58:lI32|H772B58437E68 +772B58437E68:lI32|H772B58437E78 +772B58437E78:lI32|H772B58437E88 +772B58437E88:lI70|H772B58437E98 +772B58437E98:lI105|H772B58437EA8 +772B58437EA8:lI108|H772B58437EB8 +772B58437EB8:lI116|H772B58437EC8 +772B58437EC8:lI101|H772B58437ED8 +772B58437ED8:lI114|H772B58437EE8 +772B58437EE8:lI115|H772B58437EF8 +772B58437EF8:lI58|H772B58437F08 +772B58437F08:lI32|H772B58437F18 +772B58437F18:lI126|H772B58437F28 +772B58437F28:lI110|N +772B58437F38:lI32|H772B58437F48 +772B58437F48:lI32|H772B58437F58 +772B58437F58:lI32|H772B58437F68 +772B58437F68:lI32|H772B58437F78 +772B58437F78:lI32|H772B58437F88 +772B58437F88:lI32|H772B58437F98 +772B58437F98:lI32|H772B58437FA8 +772B58437FA8:lI32|N +772B58437FB8:lI72|H772B58437FC8 +772B58437FC8:lI97|H772B58437FD8 +772B58437FD8:lI110|H772B58437FE8 +772B58437FE8:lI100|H772B58437FF8 +772B58437FF8:lI108|H772B58438008 +772B58438008:lI101|H772B58438018 +772B58438018:lI114|H772B58438028 +772B58438028:lI32|H772B58438038 +772B58438038:lI99|H772B58438048 +772B58438048:lI111|H772B58438058 +772B58438058:lI110|H772B58438068 +772B58438068:lI102|H772B58438078 +772B58438078:lI105|H772B58438088 +772B58438088:lI103|H772B58438098 +772B58438098:lI117|H772B584380A8 +772B584380A8:lI114|H772B584380B8 +772B584380B8:lI97|H772B584380C8 +772B584380C8:lI116|H772B584380D8 +772B584380D8:lI105|H772B584380E8 +772B584380E8:lI111|H772B584380F8 +772B584380F8:lI110|H772B58438108 +772B58438108:lI58|H772B58438118 +772B58438118:lI32|H772B58438128 +772B58438128:lI126|H772B58438138 +772B58438138:lI110|N +772B58438148:lI80|H772B58438158 +772B58438158:lI114|H772B58438168 +772B58438168:lI111|H772B58438178 +772B58438178:lI120|H772B58438188 +772B58438188:lI121|H772B58438198 +772B58438198:lI32|H772B584381A8 +772B584381A8:lI99|H772B584381B8 +772B584381B8:lI111|H772B584381C8 +772B584381C8:lI110|H772B584381D8 +772B584381D8:lI102|H772B584381E8 +772B584381E8:lI105|H772B584381F8 +772B584381F8:lI103|H772B58438208 +772B58438208:lI117|H772B58438218 +772B58438218:lI114|H772B58438228 +772B58438228:lI97|H772B58438238 +772B58438238:lI116|H772B58438248 +772B58438248:lI105|H772B58438258 +772B58438258:lI111|H772B58438268 +772B58438268:lI110|H772B58438278 +772B58438278:lI58|H772B58438288 +772B58438288:lI32|H772B58438298 +772B58438298:lI126|H772B584382A8 +772B584382A8:lI110|N +772B584382B8:lI32|H772B584382C8 +772B584382C8:lI32|H772B584382D8 +772B584382D8:lI32|H772B584382E8 +772B584382E8:lI32|N +772B584382F8:lI76|H772B58438308 +772B58438308:lI101|H772B58438318 +772B58438318:lI118|H772B58438328 +772B58438328:lI101|H772B58438338 +772B58438338:lI108|H772B58438348 +772B58438348:lI32|H772B58438358 +772B58438358:lI115|H772B58438368 +772B58438368:lI101|H772B58438378 +772B58438378:lI116|H772B58438388 +772B58438388:lI32|H772B58438398 +772B58438398:lI112|H772B584383A8 +772B584383A8:lI101|H772B584383B8 +772B584383B8:lI114|H772B584383C8 +772B584383C8:lI32|H772B584383D8 +772B584383D8:lI109|H772B584383E8 +772B584383E8:lI111|H772B584383F8 +772B584383F8:lI100|H772B58438408 +772B58438408:lI117|H772B58438418 +772B58438418:lI108|H772B58438428 +772B58438428:lI101|H772B58438438 +772B58438438:lI58|H772B58438448 +772B58438448:lI32|H772B58438458 +772B58438458:lI126|H772B58438468 +772B58438468:lI110|N +772B58438478:lI116|N +772B58438488:lI112|H772B58438498 +772B58438498:lI126|H772B584384A8 +772B584384A8:lI110|N +772B584384B8:lI112|H772B584384C8 +772B584384C8:lI126|H772B584384D8 +772B584384D8:lI110|H772B584384E8 +772B584384E8:lI126|H772B584384F8 +772B584384F8:lI115|H772B58438508 +772B58438508:lI32|H772B58438518 +772B58438518:lI32|H772B58438528 +772B58438528:lI32|H772B58438538 +772B58438538:lI32|H772B58438548 +772B58438548:lI65|H772B58438558 +772B58438558:lI114|H772B58438568 +772B58438568:lI103|H772B58438578 +772B58438578:lI58|H772B58438588 +772B58438588:lI32|H772B58438598 +772B58438598:lI126|N +772B584385A8:lI112|H772B584385B8 +772B584385B8:lI126|H772B584385C8 +772B584385C8:lI110|H772B584385D8 +772B584385D8:lI126|H772B584385E8 +772B584385E8:lI115|H772B584385F8 +772B584385F8:lI32|H772B58438608 +772B58438608:lI32|H772B58438618 +772B58438618:lI32|H772B58438628 +772B58438628:lI32|H772B58438638 +772B58438638:lI70|H772B58438648 +772B58438648:lI117|H772B58438658 +772B58438658:lI110|H772B58438668 +772B58438668:lI58|H772B58438678 +772B58438678:lI32|H772B58438688 +772B58438688:lI126|N +772B58438698:lI126|H772B584386A8 +772B584386A8:lI115|H772B584386B8 +772B584386B8:lI73|H772B584386C8 +772B584386C8:lI100|H772B584386D8 +772B584386D8:lI58|H772B584386E8 +772B584386E8:lI32|H772B584386F8 +772B584386F8:lI126|N +772B58438708:lI126|H772B58438718 +772B58438718:lI115|H772B58438728 +772B58438728:lI40|H772B58438738 +772B58438738:lI110|H772B58438748 +772B58438748:lI111|H772B58438758 +772B58438758:lI110|H772B58438768 +772B58438768:lI101|H772B58438778 +772B58438778:lI41|H772B58438788 +772B58438788:lI126|H772B58438798 +772B58438798:lI110|N +772B584387A8:lI112|H772B584387B8 +772B584387B8:lI126|H772B584387C8 +772B584387C8:lI110|H772B584387D8 +772B584387D8:lI32|H772B584387E8 +772B584387E8:lI32|H772B584387F8 +772B584387F8:lI32|H772B58438808 +772B58438808:lI32|H772B58438818 +772B58438818:lI32|H772B58438828 +772B58438828:lI32|H772B58438838 +772B58438838:lI32|H772B58438848 +772B58438848:lI32|H772B58438858 +772B58438858:lI77|H772B58438868 +772B58438868:lI111|H772B58438878 +772B58438878:lI100|H772B58438888 +772B58438888:lI117|H772B58438898 +772B58438898:lI108|H772B584388A8 +772B584388A8:lI101|H772B584388B8 +772B584388B8:lI58|H772B584388C8 +772B584388C8:lI32|H772B584388D8 +772B584388D8:lI126|H772B584388E8 +772B584388E8:lI112|H772B584388F8 +772B584388F8:lI126|H772B58438908 +772B58438908:lI110|H772B58438918 +772B58438918:lI32|H772B58438928 +772B58438928:lI32|H772B58438938 +772B58438938:lI32|H772B58438948 +772B58438948:lI32|H772B58438958 +772B58438958:lI32|H772B58438968 +772B58438968:lI32|H772B58438978 +772B58438978:lI32|H772B58438988 +772B58438988:lI32|H772B58438998 +772B58438998:lI76|H772B584389A8 +772B584389A8:lI101|H772B584389B8 +772B584389B8:lI118|H772B584389C8 +772B584389C8:lI101|H772B584389D8 +772B584389D8:lI108|H772B584389E8 +772B584389E8:lI58|H772B584389F8 +772B584389F8:lI32|H772B58438A08 +772B58438A08:lI32|H772B58438A18 +772B58438A18:lI126|H772B58438A28 +772B58438A28:lI112|H772B58438A38 +772B58438A38:lI126|H772B58438A48 +772B58438A48:lI110|H772B58438A58 +772B58438A58:lI32|H772B58438A68 +772B58438A68:lI32|H772B58438A78 +772B58438A78:lI32|H772B58438A88 +772B58438A88:lI32|H772B58438A98 +772B58438A98:lI32|H772B58438AA8 +772B58438AA8:lI32|H772B58438AB8 +772B58438AB8:lI32|H772B58438AC8 +772B58438AC8:lI32|H772B58438AD8 +772B58438AD8:lI70|H772B58438AE8 +772B58438AE8:lI111|H772B58438AF8 +772B58438AF8:lI114|H772B58438B08 +772B58438B08:lI109|H772B58438B18 +772B58438B18:lI97|H772B58438B28 +772B58438B28:lI116|H772B58438B38 +772B58438B38:lI116|H772B58438B48 +772B58438B48:lI101|H772B58438B58 +772B58438B58:lI114|H772B58438B68 +772B58438B68:lI58|H772B58438B78 +772B58438B78:lI126|H772B58438B88 +772B58438B88:lI110|H772B58438B98 +772B58438B98:lI32|H772B58438BA8 +772B58438BA8:lI32|H772B58438BB8 +772B58438BB8:lI32|H772B58438BC8 +772B58438BC8:lI32|H772B58438BD8 +772B58438BD8:lI32|H772B58438BE8 +772B58438BE8:lI32|H772B58438BF8 +772B58438BF8:lI32|H772B58438C08 +772B58438C08:lI32|H772B58438C18 +772B58438C18:lI32|H772B58438C28 +772B58438C28:lI32|H772B58438C38 +772B58438C38:lI32|H772B58438C48 +772B58438C48:lI32|H772B58438C58 +772B58438C58:lI77|H772B58438C68 +772B58438C68:lI111|H772B58438C78 +772B58438C78:lI100|H772B58438C88 +772B58438C88:lI117|H772B58438C98 +772B58438C98:lI108|H772B58438CA8 +772B58438CA8:lI101|H772B58438CB8 +772B58438CB8:lI58|H772B58438CC8 +772B58438CC8:lI32|H772B58438CD8 +772B58438CD8:lI126|H772B58438CE8 +772B58438CE8:lI112|H772B58438CF8 +772B58438CF8:lI126|H772B58438D08 +772B58438D08:lI110|H772B58438D18 +772B58438D18:lI32|H772B58438D28 +772B58438D28:lI32|H772B58438D38 +772B58438D38:lI32|H772B58438D48 +772B58438D48:lI32|H772B58438D58 +772B58438D58:lI32|H772B58438D68 +772B58438D68:lI32|H772B58438D78 +772B58438D78:lI32|H772B58438D88 +772B58438D88:lI32|H772B58438D98 +772B58438D98:lI32|H772B58438DA8 +772B58438DA8:lI32|H772B58438DB8 +772B58438DB8:lI32|H772B58438DC8 +772B58438DC8:lI32|H772B58438DD8 +772B58438DD8:lI67|H772B58438DE8 +772B58438DE8:lI111|H772B58438DF8 +772B58438DF8:lI110|H772B58438E08 +772B58438E08:lI102|H772B58438E18 +772B58438E18:lI105|H772B58438E28 +772B58438E28:lI103|H772B58438E38 +772B58438E38:lI58|H772B58438E48 +772B58438E48:lI126|H772B58438E58 +772B58438E58:lI110|N +772B58438E68:lI32|H772B58438E78 +772B58438E78:lI32|H772B58438E88 +772B58438E88:lI32|H772B58438E98 +772B58438E98:lI32|H772B58438EA8 +772B58438EA8:lI73|H772B58438EB8 +772B58438EB8:lI100|H772B58438EC8 +772B58438EC8:lI58|H772B58438ED8 +772B58438ED8:lI32|H772B58438EE8 +772B58438EE8:lI126|N +772B58438EF8:lI32|H772B58438F08 +772B58438F08:lI32|H772B58438F18 +772B58438F18:lI32|H772B58438F28 +772B58438F28:lI32|H772B58438F38 +772B58438F38:lI32|H772B58438F48 +772B58438F48:lI32|H772B58438F58 +772B58438F58:lI32|H772B58438F68 +772B58438F68:lI32|H772B58438F78 +772B58438F78:lI32|H772B58438F88 +772B58438F88:lI32|H772B58438F98 +772B58438F98:lI32|H772B58438FA8 +772B58438FA8:lI32|H772B58438FB8 +772B58438FB8:lI32|H772B58438FC8 +772B58438FC8:lI32|H772B58438FD8 +772B58438FD8:lI32|H772B58438FE8 +772B58438FE8:lI32|N +772B58438FF8:lI32|H772B58439008 +772B58439008:lI32|H772B58439018 +772B58439018:lI32|H772B58439028 +772B58439028:lI32|H772B58439038 +772B58439038:lI32|H772B58439048 +772B58439048:lI32|H772B58439058 +772B58439058:lI32|H772B58439068 +772B58439068:lI32|H772B58439078 +772B58439078:lI70|H772B58439088 +772B58439088:lI105|H772B58439098 +772B58439098:lI108|H772B584390A8 +772B584390A8:lI116|H772B584390B8 +772B584390B8:lI101|H772B584390C8 +772B584390C8:lI114|H772B584390D8 +772B584390D8:lI32|H772B584390E8 +772B584390E8:lI68|H772B584390F8 +772B584390F8:lI101|H772B58439108 +772B58439108:lI102|H772B58439118 +772B58439118:lI97|H772B58439128 +772B58439128:lI117|H772B58439138 +772B58439138:lI108|H772B58439148 +772B58439148:lI116|H772B58439158 +772B58439158:lI58|H772B58439168 +772B58439168:lI32|H772B58439178 +772B58439178:lI126|H772B58439188 +772B58439188:lI112|H772B58439198 +772B58439198:lI126|H772B584391A8 +772B584391A8:lI110|H772B584391B8 +772B584391B8:lI32|H772B584391C8 +772B584391C8:lI32|H772B584391D8 +772B584391D8:lI32|H772B584391E8 +772B584391E8:lI32|H772B584391F8 +772B584391F8:lI32|H772B58439208 +772B58439208:lI32|H772B58439218 +772B58439218:lI32|H772B58439228 +772B58439228:lI32|H772B58439238 +772B58439238:lI70|H772B58439248 +772B58439248:lI105|H772B58439258 +772B58439258:lI108|H772B58439268 +772B58439268:lI116|H772B58439278 +772B58439278:lI101|H772B58439288 +772B58439288:lI114|H772B58439298 +772B58439298:lI115|H772B584392A8 +772B584392A8:lI58|H772B584392B8 +772B584392B8:lI126|H772B584392C8 +772B584392C8:lI110|N +772B584392D8:lI32|H772B584392E8 +772B584392E8:lI32|H772B584392F8 +772B584392F8:lI32|H772B58439308 +772B58439308:lI32|H772B58439318 +772B58439318:lI32|H772B58439328 +772B58439328:lI32|H772B58439338 +772B58439338:lI32|H772B58439348 +772B58439348:lI32|H772B58439358 +772B58439358:lI32|H772B58439368 +772B58439368:lI32|H772B58439378 +772B58439378:lI32|H772B58439388 +772B58439388:lI32|N +772B58439398:lI32|H772B584393A8 +772B584393A8:lI32|H772B584393B8 +772B584393B8:lI32|H772B584393C8 +772B584393C8:lI32|H772B584393D8 +772B584393D8:lI32|H772B584393E8 +772B584393E8:lI32|H772B584393F8 +772B584393F8:lI32|H772B58439408 +772B58439408:lI32|H772B58439418 +772B58439418:lI72|H772B58439428 +772B58439428:lI97|H772B58439438 +772B58439438:lI110|H772B58439448 +772B58439448:lI100|H772B58439458 +772B58439458:lI108|H772B58439468 +772B58439468:lI101|H772B58439478 +772B58439478:lI114|H772B58439488 +772B58439488:lI32|H772B58439498 +772B58439498:lI67|H772B584394A8 +772B584394A8:lI111|H772B584394B8 +772B584394B8:lI110|H772B584394C8 +772B584394C8:lI102|H772B584394D8 +772B584394D8:lI105|H772B584394E8 +772B584394E8:lI103|H772B584394F8 +772B584394F8:lI58|H772B58439508 +772B58439508:lI126|H772B58439518 +772B58439518:lI110|N +772B58439528:lAE:filter_default|H772B58439538 +772B58439538:lA7:filters|H772B58439548 +772B58439548:lA9:formatter|H772B58439558 +772B58439558:lA5:level|H772B58439568 +772B58439568:lA6:module|H772B58439578 +772B58439578:lA2:id|H772B58439588 +772B58439588:lA6:config|N +772B58439598:lI32|H772B584395A8 +772B584395A8:lI32|H772B584395B8 +772B584395B8:lI32|H772B584395C8 +772B584395C8:lI32|H772B584395D8 +772B584395D8:lI32|H772B584395E8 +772B584395E8:lI32|H772B584395F8 +772B584395F8:lI32|H772B58439608 +772B58439608:lI32|H772B58439618 +772B58439618:lI67|H772B58439628 +772B58439628:lI117|H772B58439638 +772B58439638:lI115|H772B58439648 +772B58439648:lI116|H772B58439658 +772B58439658:lI111|H772B58439668 +772B58439668:lI109|H772B58439678 +772B58439678:lI32|H772B58439688 +772B58439688:lI67|H772B58439698 +772B58439698:lI111|H772B584396A8 +772B584396A8:lI110|H772B584396B8 +772B584396B8:lI102|H772B584396C8 +772B584396C8:lI105|H772B584396D8 +772B584396D8:lI103|H772B584396E8 +772B584396E8:lI58|H772B584396F8 +772B584396F8:lI126|H772B58439708 +772B58439708:lI110|N +772B58439718:lI32|H772B58439728 +772B58439728:lI32|H772B58439738 +772B58439738:lI32|H772B58439748 +772B58439748:lI32|H772B58439758 +772B58439758:lI40|H772B58439768 +772B58439768:lI110|H772B58439778 +772B58439778:lI111|H772B58439788 +772B58439788:lI110|H772B58439798 +772B58439798:lI101|H772B584397A8 +772B584397A8:lI41|H772B584397B8 +772B584397B8:lI126|H772B584397C8 +772B584397C8:lI110|N +772B584397D8:lI112|H772B584397E8 +772B584397E8:lI126|H772B584397F8 +772B584397F8:lI110|H772B58439808 +772B58439808:lI32|H772B58439818 +772B58439818:lI32|H772B58439828 +772B58439828:lI32|H772B58439838 +772B58439838:lI32|H772B58439848 +772B58439848:lI32|H772B58439858 +772B58439858:lI32|H772B58439868 +772B58439868:lI32|H772B58439878 +772B58439878:lI32|H772B58439888 +772B58439888:lI76|H772B58439898 +772B58439898:lI101|H772B584398A8 +772B584398A8:lI118|H772B584398B8 +772B584398B8:lI101|H772B584398C8 +772B584398C8:lI108|H772B584398D8 +772B584398D8:lI58|H772B584398E8 +772B584398E8:lI32|H772B584398F8 +772B584398F8:lI126|H772B58439908 +772B58439908:lI112|H772B58439918 +772B58439918:lI126|H772B58439928 +772B58439928:lI110|N +772B58439938:lI32|H772B58439948 +772B58439948:lI32|H772B58439958 +772B58439958:lI32|H772B58439968 +772B58439968:lI32|H772B58439978 +772B58439978:lI77|H772B58439988 +772B58439988:lI111|H772B58439998 +772B58439998:lI100|H772B584399A8 +772B584399A8:lI117|H772B584399B8 +772B584399B8:lI108|H772B584399C8 +772B584399C8:lI101|H772B584399D8 +772B584399D8:lI58|H772B584399E8 +772B584399E8:lI32|H772B584399F8 +772B584399F8:lI126|N +772B58439A08:t2:A7:filters,AE:filter_default +772B58439A20:Mf2:H772B58439A08:H772B58439A48,A4:stop +772B58439A48:lH772B58439A78|H772B58439A58 +772B58439A58:lH772B58439AA8|H772B58439A68 +772B58439A68:lH772B58439B08|N +772B58439A78:t2:A9:remote_gl,H772B58439A90 +772B58439A90:t2:H772B58414090,A4:stop +772B58439AA8:t2:A6:domain,H772B58439AC0 +772B58439AC0:t2:H772B584140A0,H772B58439AD8 +772B58439AD8:t3:A3:log,A5:super,H772B58439AF8 +772B58439AF8:lA3:otp|N +772B58439B08:t2:A9:no_domain,H772B58439B20 +772B58439B20:t2:H772B584140A0,H772B58439B38 +772B58439B38:t3:A3:log,A9:undefined,N +772B58439B58:t2:A5:error,H772B58439B70 +772B58439B70:t2:A9:not_found,A6:simple +772B58439B88:lI73|H772B58439B98 +772B58439B98:lI110|H772B58439BA8 +772B58439BA8:lI118|H772B58439BB8 +772B58439BB8:lI97|H772B58439BC8 +772B58439BC8:lI108|H772B58439BD8 +772B58439BD8:lI105|H772B58439BE8 +772B58439BE8:lI100|H772B58439BF8 +772B58439BF8:lI32|H772B58439C08 +772B58439C08:lI108|H772B58439C18 +772B58439C18:lI111|H772B58439C28 +772B58439C28:lI103|H772B58439C38 +772B58439C38:lI103|H772B58439C48 +772B58439C48:lI101|H772B58439C58 +772B58439C58:lI114|H772B58439C68 +772B58439C68:lI32|H772B58439C78 +772B58439C78:lI99|H772B58439C88 +772B58439C88:lI111|H772B58439C98 +772B58439C98:lI110|H772B58439CA8 +772B58439CA8:lI102|H772B58439CB8 +772B58439CB8:lI105|H772B58439CC8 +772B58439CC8:lI103|H772B58439CD8 +772B58439CD8:lI58|H772B58439CE8 +772B58439CE8:lI32|H772B58439CF8 +772B58439CF8:lI126|H772B58439D08 +772B58439D08:lI112|N +772B58439D18:t3:A4:line,A4:file,A3:mfa +772B58439D38:Mf3:H772B58439D18:I1576,H772B58439D68,H772B58439E08 +772B58439D68:lI108|H772B58439D78 +772B58439D78:lI111|H772B58439D88 +772B58439D88:lI103|H772B58439D98 +772B58439D98:lI103|H772B58439DA8 +772B58439DA8:lI101|H772B58439DB8 +772B58439DB8:lI114|H772B58439DC8 +772B58439DC8:lI46|H772B58439DD8 +772B58439DD8:lI101|H772B58439DE8 +772B58439DE8:lI114|H772B58439DF8 +772B58439DF8:lI108|N +772B58439E08:t3:A6:logger,A14:internal_init_logger,I0 +772B58439E28:lI73|H772B58439E38 +772B58439E38:lI110|H772B58439E48 +772B58439E48:lI118|H772B58439E58 +772B58439E58:lI97|H772B58439E68 +772B58439E68:lI108|H772B58439E78 +772B58439E78:lI105|H772B58439E88 +772B58439E88:lI100|H772B58439E98 +772B58439E98:lI32|H772B58439EA8 +772B58439EA8:lI100|H772B58439EB8 +772B58439EB8:lI101|H772B58439EC8 +772B58439EC8:lI102|H772B58439ED8 +772B58439ED8:lI97|H772B58439EE8 +772B58439EE8:lI117|H772B58439EF8 +772B58439EF8:lI108|H772B58439F08 +772B58439F08:lI116|H772B58439F18 +772B58439F18:lI32|H772B58439F28 +772B58439F28:lI104|H772B58439F38 +772B58439F38:lI97|H772B58439F48 +772B58439F48:lI110|H772B58439F58 +772B58439F58:lI100|H772B58439F68 +772B58439F68:lI108|H772B58439F78 +772B58439F78:lI101|H772B58439F88 +772B58439F88:lI114|H772B58439F98 +772B58439F98:lI32|H772B58439FA8 +772B58439FA8:lI99|H772B58439FB8 +772B58439FB8:lI111|H772B58439FC8 +772B58439FC8:lI110|H772B58439FD8 +772B58439FD8:lI102|H772B58439FE8 +772B58439FE8:lI105|H772B58439FF8 +772B58439FF8:lI103|H772B5843A008 +772B5843A008:lI58|H772B5843A018 +772B5843A018:lI32|H772B5843A028 +772B5843A028:lI126|H772B5843A038 +772B5843A038:lI112|N +772B5843A048:t3:A4:line,A4:file,A3:mfa +772B5843A068:Mf3:H772B5843A048:I1594,H772B5843A098,H772B5843A138 +772B5843A098:lI108|H772B5843A0A8 +772B5843A0A8:lI111|H772B5843A0B8 +772B5843A0B8:lI103|H772B5843A0C8 +772B5843A0C8:lI103|H772B5843A0D8 +772B5843A0D8:lI101|H772B5843A0E8 +772B5843A0E8:lI114|H772B5843A0F8 +772B5843A0F8:lI46|H772B5843A108 +772B5843A108:lI101|H772B5843A118 +772B5843A118:lI114|H772B5843A128 +772B5843A128:lI108|N +772B5843A138:t3:A6:logger,A14:init_kernel_handlers,I1 +772B5843A158:lI73|H772B5843A168 +772B5843A168:lI110|H772B5843A178 +772B5843A178:lI118|H772B5843A188 +772B5843A188:lI97|H772B5843A198 +772B5843A198:lI108|H772B5843A1A8 +772B5843A1A8:lI105|H772B5843A1B8 +772B5843A1B8:lI100|H772B5843A1C8 +772B5843A1C8:lI32|H772B5843A1D8 +772B5843A1D8:lI108|H772B5843A1E8 +772B5843A1E8:lI111|H772B5843A1F8 +772B5843A1F8:lI103|H772B5843A208 +772B5843A208:lI103|H772B5843A218 +772B5843A218:lI101|H772B5843A228 +772B5843A228:lI114|H772B5843A238 +772B5843A238:lI32|H772B5843A248 +772B5843A248:lI104|H772B5843A258 +772B5843A258:lI97|H772B5843A268 +772B5843A268:lI110|H772B5843A278 +772B5843A278:lI100|H772B5843A288 +772B5843A288:lI108|H772B5843A298 +772B5843A298:lI101|H772B5843A2A8 +772B5843A2A8:lI114|H772B5843A2B8 +772B5843A2B8:lI32|H772B5843A2C8 +772B5843A2C8:lI99|H772B5843A2D8 +772B5843A2D8:lI111|H772B5843A2E8 +772B5843A2E8:lI110|H772B5843A2F8 +772B5843A2F8:lI102|H772B5843A308 +772B5843A308:lI105|H772B5843A318 +772B5843A318:lI103|H772B5843A328 +772B5843A328:lI58|H772B5843A338 +772B5843A338:lI32|H772B5843A348 +772B5843A348:lI126|H772B5843A358 +772B5843A358:lI112|N +772B5843A368:t3:A4:line,A4:file,A3:mfa +772B5843A388:Mf3:H772B5843A368:I1695,H772B5843A3B8,H772B5843A458 +772B5843A3B8:lI108|H772B5843A3C8 +772B5843A3C8:lI111|H772B5843A3D8 +772B5843A3D8:lI103|H772B5843A3E8 +772B5843A3E8:lI103|H772B5843A3F8 +772B5843A3F8:lI101|H772B5843A408 +772B5843A408:lI114|H772B5843A418 +772B5843A418:lI46|H772B5843A428 +772B5843A428:lI101|H772B5843A438 +772B5843A438:lI114|H772B5843A448 +772B5843A448:lI108|N +772B5843A458:t3:A6:logger,AC:add_handlers,I2 +772B5843A478:t2:A2:ok,A6:silent +772B5843A490:t3:A7:handler,A7:default,A9:undefined +772B5843A4B0:t2:A2:ok,A5:false +772B5843A4C8:t2:A2:ok,AB:standard_io +772B5843A4E0:t1:A9:formatter +772B5843A4F0:Mf1:H772B5843A4E0:H772B5843A510 +772B5843A510:t2:A10:logger_formatter,H772B5843A540 +772B5843A528:t2:AB:single_line,AD:legacy_header +772B5843A540:Mf2:H772B5843A528:A5:false,A4:true +772B5843A568:lH772B5843A578|N +772B5843A578:t2:A7:timeout,A8:infinity +772B5843A590:lH772B5843A5C0|H772B5843A5A0 +772B5843A5A0:lH772B5843A5F0|H772B5843A5B0 +772B5843A5B0:lH772B5843A650|N +772B5843A5C0:t2:A9:remote_gl,H772B5843A5D8 +772B5843A5D8:t2:H772B58414090,A4:stop +772B5843A5F0:t2:A6:domain,H772B5843A608 +772B5843A608:t2:H772B584140A0,H772B5843A620 +772B5843A620:t3:A3:log,A5:super,H772B5843A640 +772B5843A640:lA3:otp|N +772B5843A650:t2:A9:no_domain,H772B5843A668 +772B5843A668:t2:H772B584140A0,H772B5843A680 +772B5843A680:t3:A3:log,A9:undefined,N +772B5843A6A0:lH772B5843A6D0|H772B5843A6B0 +772B5843A6B0:lH772B5843A700|H772B5843A6C0 +772B5843A6C0:lH772B5843A770|N +772B5843A6D0:t2:A9:remote_gl,H772B5843A6E8 +772B5843A6E8:t2:H772B58414090,A4:stop +772B5843A700:t2:A6:domain,H772B5843A718 +772B5843A718:t2:H772B584140A0,H772B5843A730 +772B5843A730:t3:A3:log,A5:super,H772B5843A750 +772B5843A750:lA3:otp|H772B5843A760 +772B5843A760:lA4:sasl|N +772B5843A770:t2:A9:no_domain,H772B5843A788 +772B5843A788:t2:H772B584140A0,H772B5843A7A0 +772B5843A7A0:t3:A3:log,A9:undefined,N +772B5843A7C0:lI76|H772B5843A7D0 +772B5843A7D0:lI65|H772B5843A7E0 +772B5843A7E0:lI90|H772B5843A7F0 +772B5843A7F0:lI89|H772B5843A800 +772B5843A800:lI95|H772B5843A810 +772B5843A810:lI70|H772B5843A820 +772B5843A820:lI85|H772B5843A830 +772B5843A830:lI78|H772B5843A840 +772B5843A840:lI32|H772B5843A850 +772B5843A850:lI67|H772B5843A860 +772B5843A860:lI82|H772B5843A870 +772B5843A870:lI65|H772B5843A880 +772B5843A880:lI83|H772B5843A890 +772B5843A890:lI72|H772B5843A8A0 +772B5843A8A0:lI58|H772B5843A8B0 +772B5843A8B0:lI32|H772B5843A8C0 +772B5843A8C0:lI126|H772B5843A8D0 +772B5843A8D0:lI116|H772B5843A8E0 +772B5843A8E0:lI112|H772B5843A8F0 +772B5843A8F0:lI59|H772B5843A900 +772B5843A900:lI32|H772B5843A910 +772B5843A910:lI82|H772B5843A920 +772B5843A920:lI101|H772B5843A930 +772B5843A930:lI97|H772B5843A940 +772B5843A940:lI115|H772B5843A950 +772B5843A950:lI111|H772B5843A960 +772B5843A960:lI110|H772B5843A970 +772B5843A970:lI58|H772B5843A980 +772B5843A980:lI32|H772B5843A990 +772B5843A990:lI126|H772B5843A9A0 +772B5843A9A0:lI116|H772B5843A9B0 +772B5843A9B0:lI112|N +772B5843A9C0:lI76|H772B5843A9D0 +772B5843A9D0:lI65|H772B5843A9E0 +772B5843A9E0:lI90|H772B5843A9F0 +772B5843A9F0:lI89|H772B5843AA00 +772B5843AA00:lI95|H772B5843AA10 +772B5843AA10:lI70|H772B5843AA20 +772B5843AA20:lI85|H772B5843AA30 +772B5843AA30:lI78|H772B5843AA40 +772B5843AA40:lI32|H772B5843AA50 +772B5843AA50:lI69|H772B5843AA60 +772B5843AA60:lI82|H772B5843AA70 +772B5843AA70:lI82|H772B5843AA80 +772B5843AA80:lI79|H772B5843AA90 +772B5843AA90:lI82|H772B5843AAA0 +772B5843AAA0:lI58|H772B5843AAB0 +772B5843AAB0:lI32|H772B5843AAC0 +772B5843AAC0:lI126|H772B5843AAD0 +772B5843AAD0:lI116|H772B5843AAE0 +772B5843AAE0:lI112|H772B5843AAF0 +772B5843AAF0:lI59|H772B5843AB00 +772B5843AB00:lI32|H772B5843AB10 +772B5843AB10:lI82|H772B5843AB20 +772B5843AB20:lI101|H772B5843AB30 +772B5843AB30:lI116|H772B5843AB40 +772B5843AB40:lI117|H772B5843AB50 +772B5843AB50:lI114|H772B5843AB60 +772B5843AB60:lI110|H772B5843AB70 +772B5843AB70:lI101|H772B5843AB80 +772B5843AB80:lI100|H772B5843AB90 +772B5843AB90:lI58|H772B5843ABA0 +772B5843ABA0:lI32|H772B5843ABB0 +772B5843ABB0:lI126|H772B5843ABC0 +772B5843ABC0:lI116|H772B5843ABD0 +772B5843ABD0:lI112|N +772B5843ABE0:lA3:pid|H772B5843ABF0 +772B5843ABF0:lA2:gl|H772B5843AC00 +772B5843AC00:lA4:time|N +772B5843AC10:lI108|N +772B5843AC20:lI114|H772B5843AC10 +772B5843AC30:lI101|H772B5843AC20 +772B5843AC40:lI46|H772B5843AC30 +772B5843AC50:lI114|H772B5843AC40 +772B5843AC60:lI101|H772B5843AC50 +772B5843AC70:lI103|H772B5843AC60 +772B5843AC80:lI103|H772B5843AC70 +772B5843AC90:lI111|H772B5843AC80 +772B5843ACA0:lI108|H772B5843AC90 +772B5843ACB0:t4:A7:primary,A8:handlers,A5:proxy,AD:module_levels +772B5843ACD8:E4A:g3AAAABIAlvntzXEi1LebN0BHMZ07LkAAAAAAAAAAHcGbG9nZ2VyYQBiAt89uVh3DW5vbm9kZUBub2hvc3QAAAAAAAAAAAAAAAA= +772B5843ACF0:Rf772B582D28B0 +772B5843AD08:E4A:g3AAAABIAVvntzXEi1LebN0BHMZ07LkAAAABAAAAAHcGbG9nZ2VyYQFiAt89uVh3DW5vbm9kZUBub2hvc3QAAAAAAAAAAAAAAAA= +772B5843AD20:Rf772B582D2928 +772B5843AD38:t1:A4:type +772B5843AD48:t3:A4:meta,A3:msg,A5:level +772B5843AD68:t2:A7:filters,AE:filter_default +772B5843AED0:lI66|H772B5843AEE0 +772B5843AEE0:lI97|H772B5843AEF0 +772B5843AEF0:lI100|H772B5843AF00 +772B5843AF00:lI32|H772B5843AF10 +772B5843AF10:lI101|H772B5843AF20 +772B5843AF20:lI110|H772B5843AF30 +772B5843AF30:lI118|H772B5843AF40 +772B5843AF40:lI105|H772B5843AF50 +772B5843AF50:lI114|H772B5843AF60 +772B5843AF60:lI111|H772B5843AF70 +772B5843AF70:lI110|H772B5843AF80 +772B5843AF80:lI109|H772B5843AF90 +772B5843AF90:lI101|H772B5843AFA0 +772B5843AFA0:lI110|H772B5843AFB0 +772B5843AFB0:lI116|H772B5843AFC0 +772B5843AFC0:lI32|H772B5843AFD0 +772B5843AFD0:lI118|H772B5843AFE0 +772B5843AFE0:lI97|H772B5843AFF0 +772B5843AFF0:lI114|H772B5843B000 +772B5843B000:lI105|H772B5843B010 +772B5843B010:lI97|H772B5843B020 +772B5843B020:lI98|H772B5843B030 +772B5843B030:lI108|H772B5843B040 +772B5843B040:lI101|H772B5843B050 +772B5843B050:lI58|H772B5843B060 +772B5843B060:lI32|H772B5843B070 +772B5843B070:lI126|H772B5843B080 +772B5843B080:lI116|H772B5843B090 +772B5843B090:lI112|H772B5843B0A0 +772B5843B0A0:lI32|H772B5843B0B0 +772B5843B0B0:lI32|H772B5843B0C0 +772B5843B0C0:lI65|H772B5843B0D0 +772B5843B0D0:lI112|H772B5843B0E0 +772B5843B0E0:lI112|H772B5843B0F0 +772B5843B0F0:lI108|H772B5843B100 +772B5843B100:lI105|H772B5843B110 +772B5843B110:lI99|H772B5843B120 +772B5843B120:lI97|H772B5843B130 +772B5843B130:lI116|H772B5843B140 +772B5843B140:lI105|H772B5843B150 +772B5843B150:lI111|H772B5843B160 +772B5843B160:lI110|H772B5843B170 +772B5843B170:lI58|H772B5843B180 +772B5843B180:lI32|H772B5843B190 +772B5843B190:lI126|H772B5843B1A0 +772B5843B1A0:lI112|N +772B5843B1B0:lH772B5843B1C0|N +772B5843B1C0:t3:H772B5843B1E0,N,H772B5843B260 +772B5843B1E0:t2:H772B5843B1F8,H772B5843B210 +772B5843B1F8:t2:A6:loaded,A2:$1 +772B5843B210:t9:A4:appl,A1:_,A1:_,A2:$2,A1:_,A2:$3,A1:_,A1:_,A1:_ +772B5843B260:lH772B5843B270|N +772B5843B270:t1:H772B5843B280 +772B5843B280:t3:A2:$1,A2:$2,A2:$3 +772B5843B2A0:t2:A12:application_master,A2:$1 +772B5843B2B8:t9:A4:appl,A1:_,A1:_,A1:_,A1:_,A2:$1,A1:_,A1:_,A1:_ +772B5843B308:t8:A9:appl_data,A1:_,A1:_,A2:$1,A1:_,A1:_,A1:_,A1:_ +772B5843B350:t8:A9:appl_data,A1:_,A2:$1,A1:_,A1:_,A1:_,A1:_,A1:_ +772B5843B398:t9:A4:appl,A1:_,A1:_,A1:_,A1:_,A1:_,A1:_,A2:$1,A1:_ +772B5843B3E8:t8:A9:appl_data,A1:_,A1:_,A1:_,A1:_,A2:$1,A1:_,A1:_ +772B5843B430:t8:A9:appl_data,A1:_,A1:_,A1:_,A2:$1,A1:_,A1:_,A1:_ +772B5843B478:t8:A9:appl_data,A1:_,A1:_,A1:_,A1:_,A1:_,A1:_,A2:$1 +772B5843B4C0:t8:A9:appl_data,A1:_,A1:_,A1:_,A1:_,A1:_,A2:$1,A1:_ +772B5843B508:t9:A4:appl,A1:_,A1:_,A1:_,A1:_,A1:_,A2:$1,A1:_,A1:_ +772B5843B558:t9:A4:appl,A1:_,A1:_,A1:_,A2:$1,A1:_,A1:_,A1:_,A1:_ +772B5843B5A8:t9:A4:appl,A1:_,A1:_,A2:$1,A1:_,A1:_,A1:_,A1:_,A1:_ +772B5843B5F8:t9:A4:appl,A1:_,A1:_,A1:_,A1:_,A1:_,A1:_,A1:_,A2:$1 +772B5843B648:t2:H772B5843B660,H772B5843B678 +772B5843B660:t2:A6:loaded,A2:$1 +772B5843B678:t9:A4:appl,A1:_,H772B5843B6C8,A1:_,A1:_,A1:_,A1:_,A1:_,A1:_ +772B5843B6C8:t8:A9:appl_data,A1:_,A1:_,A1:_,A1:_,A2:$2,A1:_,A1:_ +772B5843B710:t2:A5:error,AB:terminating +772B5843B728:t3:A16:application_controller,A5:start,I1 +772B5843B748:lI105|H772B5843B758 +772B5843B758:lI110|H772B5843B768 +772B5843B768:lI118|H772B5843B778 +772B5843B778:lI97|H772B5843B788 +772B5843B788:lI108|H772B5843B798 +772B5843B798:lI105|H772B5843B7A8 +772B5843B7A8:lI100|H772B5843B7B8 +772B5843B7B8:lI32|H772B5843B7C8 +772B5843B7C8:lI99|H772B5843B7D8 +772B5843B7D8:lI111|H772B5843B7E8 +772B5843B7E8:lI110|H772B5843B7F8 +772B5843B7F8:lI102|H772B5843B808 +772B5843B808:lI105|H772B5843B818 +772B5843B818:lI103|H772B5843B828 +772B5843B828:lI32|H772B5843B838 +772B5843B838:lI100|H772B5843B848 +772B5843B848:lI97|H772B5843B858 +772B5843B858:lI116|H772B5843B868 +772B5843B868:lI97|H772B5843B878 +772B5843B878:lI58|H772B5843B888 +772B5843B888:lI32|H772B5843B898 +772B5843B898:lI126|H772B5843B8A8 +772B5843B8A8:lI116|H772B5843B8B8 +772B5843B8B8:lI115|N +772B5843B8C8:lA3:set|H772B5843B8D8 +772B5843B8D8:lA6:public|H772B5843B8E8 +772B5843B8E8:lAB:named_table|H772B5843B8F8 +772B5843B8F8:lH772B5843B908|N +772B5843B908:t2:A10:read_concurrency,A4:true +772B5843B920:t2:A5:local,A16:application_controller +772B5843B938:lI101|H772B5843B948 +772B5843B948:lI114|H772B5843B958 +772B5843B958:lI114|H772B5843B968 +772B5843B968:lI111|H772B5843B978 +772B5843B978:lI114|H772B5843B988 +772B5843B988:lI32|H772B5843B998 +772B5843B998:lI105|H772B5843B9A8 +772B5843B9A8:lI110|H772B5843B9B8 +772B5843B9B8:lI32|H772B5843B9C8 +772B5843B9C8:lI99|H772B5843B9D8 +772B5843B9D8:lI111|H772B5843B9E8 +772B5843B9E8:lI110|H772B5843B9F8 +772B5843B9F8:lI102|H772B5843BA08 +772B5843BA08:lI105|H772B5843BA18 +772B5843BA18:lI103|H772B5843BA28 +772B5843BA28:lI32|H772B5843BA38 +772B5843BA38:lI114|H772B5843BA48 +772B5843BA48:lI101|H772B5843BA58 +772B5843BA58:lI97|H772B5843BA68 +772B5843BA68:lI100|H772B5843BA78 +772B5843BA78:lI32|H772B5843BA88 +772B5843BA88:lI102|H772B5843BA98 +772B5843BA98:lI114|H772B5843BAA8 +772B5843BAA8:lI111|H772B5843BAB8 +772B5843BAB8:lI109|H772B5843BAC8 +772B5843BAC8:lI32|H772B5843BAD8 +772B5843BAD8:lI102|H772B5843BAE8 +772B5843BAE8:lI105|H772B5843BAF8 +772B5843BAF8:lI108|H772B5843BB08 +772B5843BB08:lI101|H772B5843BB18 +772B5843BB18:lI32|H772B5843BB28 +772B5843BB28:lI100|H772B5843BB38 +772B5843BB38:lI101|H772B5843BB48 +772B5843BB48:lI115|H772B5843BB58 +772B5843BB58:lI99|H772B5843BB68 +772B5843BB68:lI114|H772B5843BB78 +772B5843BB78:lI105|H772B5843BB88 +772B5843BB88:lI112|H772B5843BB98 +772B5843BB98:lI116|H772B5843BBA8 +772B5843BBA8:lI111|H772B5843BBB8 +772B5843BBB8:lI114|H772B5843BBC8 +772B5843BBC8:lI32|H772B5843BBD8 +772B5843BBD8:lI126|H772B5843BBE8 +772B5843BBE8:lI116|H772B5843BBF8 +772B5843BBF8:lI112|H772B5843BC08 +772B5843BC08:lI32|H772B5843BC18 +772B5843BC18:lI40|H772B5843BC28 +772B5843BC28:lI126|H772B5843BC38 +772B5843BC38:lI119|H772B5843BC48 +772B5843BC48:lI41|H772B5843BC58 +772B5843BC58:lI58|H772B5843BC68 +772B5843BC68:lI32|H772B5843BC78 +772B5843BC78:lI126|H772B5843BC88 +772B5843BC88:lI116|H772B5843BC98 +772B5843BC98:lI115|N +772B5843BCA8:lI101|H772B5843BCB8 +772B5843BCB8:lI114|H772B5843BCC8 +772B5843BCC8:lI114|H772B5843BCD8 +772B5843BCD8:lI111|H772B5843BCE8 +772B5843BCE8:lI114|H772B5843BCF8 +772B5843BCF8:lI32|H772B5843BD08 +772B5843BD08:lI105|H772B5843BD18 +772B5843BD18:lI110|H772B5843BD28 +772B5843BD28:lI32|H772B5843BD38 +772B5843BD38:lI99|H772B5843BD48 +772B5843BD48:lI111|H772B5843BD58 +772B5843BD58:lI110|H772B5843BD68 +772B5843BD68:lI102|H772B5843BD78 +772B5843BD78:lI105|H772B5843BD88 +772B5843BD88:lI103|H772B5843BD98 +772B5843BD98:lI32|H772B5843BDA8 +772B5843BDA8:lI102|H772B5843BDB8 +772B5843BDB8:lI105|H772B5843BDC8 +772B5843BDC8:lI108|H772B5843BDD8 +772B5843BDD8:lI101|H772B5843BDE8 +772B5843BDE8:lI32|H772B5843BDF8 +772B5843BDF8:lI126|H772B5843BE08 +772B5843BE08:lI116|H772B5843BE18 +772B5843BE18:lI112|H772B5843BE28 +772B5843BE28:lI32|H772B5843BE38 +772B5843BE38:lI40|H772B5843BE48 +772B5843BE48:lI126|H772B5843BE58 +772B5843BE58:lI119|H772B5843BE68 +772B5843BE68:lI41|H772B5843BE78 +772B5843BE78:lI58|H772B5843BE88 +772B5843BE88:lI32|H772B5843BE98 +772B5843BE98:lI126|H772B5843BEA8 +772B5843BEA8:lI116|H772B5843BEB8 +772B5843BEB8:lI115|N +772B5843BEC8:lI100|H772B5843BED8 +772B5843BED8:lI117|H772B5843BEE8 +772B5843BEE8:lI112|H772B5843BEF8 +772B5843BEF8:lI108|H772B5843BF08 +772B5843BF08:lI105|H772B5843BF18 +772B5843BF18:lI99|H772B5843BF28 +772B5843BF28:lI97|H772B5843BF38 +772B5843BF38:lI116|H772B5843BF48 +772B5843BF48:lI101|H772B5843BF58 +772B5843BF58:lI32|H772B5843BF68 +772B5843BF68:lI97|H772B5843BF78 +772B5843BF78:lI112|H772B5843BF88 +772B5843BF88:lI112|H772B5843BF98 +772B5843BF98:lI108|H772B5843BFA8 +772B5843BFA8:lI105|H772B5843BFB8 +772B5843BFB8:lI99|H772B5843BFC8 +772B5843BFC8:lI97|H772B5843BFD8 +772B5843BFD8:lI116|H772B5843BFE8 +772B5843BFE8:lI105|H772B5843BFF8 +772B5843BFF8:lI111|H772B5843C008 +772B5843C008:lI110|H772B5843C018 +772B5843C018:lI32|H772B5843C028 +772B5843C028:lI99|H772B5843C038 +772B5843C038:lI111|H772B5843C048 +772B5843C048:lI110|H772B5843C058 +772B5843C058:lI102|H772B5843C068 +772B5843C068:lI105|H772B5843C078 +772B5843C078:lI103|H772B5843C088 +772B5843C088:lI58|H772B5843C098 +772B5843C098:lI32|N +772B5843C0A8:lI126|H772B5843C0B8 +772B5843C0B8:lI116|H772B5843C0C8 +772B5843C0C8:lI112|N +772B5843C0D8:lI59|H772B5843C0E8 +772B5843C0E8:lI32|H772B5843C0F8 +772B5843C0F8:lI97|H772B5843C108 +772B5843C108:lI112|H772B5843C118 +772B5843C118:lI112|H772B5843C128 +772B5843C128:lI108|H772B5843C138 +772B5843C138:lI105|H772B5843C148 +772B5843C148:lI99|H772B5843C158 +772B5843C158:lI97|H772B5843C168 +772B5843C168:lI116|H772B5843C178 +772B5843C178:lI105|H772B5843C188 +772B5843C188:lI111|H772B5843C198 +772B5843C198:lI110|H772B5843C1A8 +772B5843C1A8:lI32|H772B5843C1B8 +772B5843C1B8:lI110|H772B5843C1C8 +772B5843C1C8:lI97|H772B5843C1D8 +772B5843C1D8:lI109|H772B5843C1E8 +772B5843C1E8:lI101|H772B5843C1F8 +772B5843C1F8:lI32|H772B5843C208 +772B5843C208:lI109|H772B5843C218 +772B5843C218:lI117|H772B5843C228 +772B5843C228:lI115|H772B5843C238 +772B5843C238:lI116|H772B5843C248 +772B5843C248:lI32|H772B5843C258 +772B5843C258:lI98|H772B5843C268 +772B5843C268:lI101|H772B5843C278 +772B5843C278:lI32|H772B5843C288 +772B5843C288:lI97|H772B5843C298 +772B5843C298:lI110|H772B5843C2A8 +772B5843C2A8:lI32|H772B5843C2B8 +772B5843C2B8:lI97|H772B5843C2C8 +772B5843C2C8:lI116|H772B5843C2D8 +772B5843C2D8:lI111|H772B5843C2E8 +772B5843C2E8:lI109|N +772B5843C2F8:lI97|H772B5843C308 +772B5843C308:lI112|H772B5843C318 +772B5843C318:lI112|H772B5843C328 +772B5843C328:lI108|H772B5843C338 +772B5843C338:lI105|H772B5843C348 +772B5843C348:lI99|H772B5843C358 +772B5843C358:lI97|H772B5843C368 +772B5843C368:lI116|H772B5843C378 +772B5843C378:lI105|H772B5843C388 +772B5843C388:lI111|H772B5843C398 +772B5843C398:lI110|H772B5843C3A8 +772B5843C3A8:lI58|H772B5843C3B8 +772B5843C3B8:lI32|N +772B5843C3C8:lI59|H772B5843C3D8 +772B5843C3D8:lI32|H772B5843C3E8 +772B5843C3E8:lI112|H772B5843C3F8 +772B5843C3F8:lI97|H772B5843C408 +772B5843C408:lI114|H772B5843C418 +772B5843C418:lI97|H772B5843C428 +772B5843C428:lI109|H772B5843C438 +772B5843C438:lI101|H772B5843C448 +772B5843C448:lI116|H772B5843C458 +772B5843C458:lI101|H772B5843C468 +772B5843C468:lI114|H772B5843C478 +772B5843C478:lI115|H772B5843C488 +772B5843C488:lI32|H772B5843C498 +772B5843C498:lI109|H772B5843C4A8 +772B5843C4A8:lI117|H772B5843C4B8 +772B5843C4B8:lI115|H772B5843C4C8 +772B5843C4C8:lI116|H772B5843C4D8 +772B5843C4D8:lI32|H772B5843C4E8 +772B5843C4E8:lI98|H772B5843C4F8 +772B5843C4F8:lI101|H772B5843C508 +772B5843C508:lI32|H772B5843C518 +772B5843C518:lI97|H772B5843C528 +772B5843C528:lI32|H772B5843C538 +772B5843C538:lI108|H772B5843C548 +772B5843C548:lI105|H772B5843C558 +772B5843C558:lI115|H772B5843C568 +772B5843C568:lI116|N +772B5843C578:lI105|H772B5843C588 +772B5843C588:lI110|H772B5843C598 +772B5843C598:lI118|H772B5843C5A8 +772B5843C5A8:lI97|H772B5843C5B8 +772B5843C5B8:lI108|H772B5843C5C8 +772B5843C5C8:lI105|H772B5843C5D8 +772B5843C5D8:lI100|H772B5843C5E8 +772B5843C5E8:lI32|H772B5843C5F8 +772B5843C5F8:lI97|H772B5843C608 +772B5843C608:lI112|H772B5843C618 +772B5843C618:lI112|H772B5843C628 +772B5843C628:lI108|H772B5843C638 +772B5843C638:lI105|H772B5843C648 +772B5843C648:lI99|H772B5843C658 +772B5843C658:lI97|H772B5843C668 +772B5843C668:lI116|H772B5843C678 +772B5843C678:lI105|H772B5843C688 +772B5843C688:lI111|H772B5843C698 +772B5843C698:lI110|H772B5843C6A8 +772B5843C6A8:lI32|H772B5843C6B8 +772B5843C6B8:lI99|H772B5843C6C8 +772B5843C6C8:lI111|H772B5843C6D8 +772B5843C6D8:lI110|H772B5843C6E8 +772B5843C6E8:lI102|H772B5843C6F8 +772B5843C6F8:lI105|H772B5843C708 +772B5843C708:lI103|H772B5843C718 +772B5843C718:lI58|H772B5843C728 +772B5843C728:lI32|N +772B5843C738:t2:A5:error,H772B5843C750 +772B5843C750:lI99|H772B5843C760 +772B5843C760:lI111|H772B5843C770 +772B5843C770:lI110|H772B5843C780 +772B5843C780:lI102|H772B5843C790 +772B5843C790:lI105|H772B5843C7A0 +772B5843C7A0:lI103|H772B5843C7B0 +772B5843C7B0:lI117|H772B5843C7C0 +772B5843C7C0:lI114|H772B5843C7D0 +772B5843C7D0:lI97|H772B5843C7E0 +772B5843C7E0:lI116|H772B5843C7F0 +772B5843C7F0:lI105|H772B5843C800 +772B5843C800:lI111|H772B5843C810 +772B5843C810:lI110|H772B5843C820 +772B5843C820:lI32|H772B5843C830 +772B5843C830:lI109|H772B5843C840 +772B5843C840:lI117|H772B5843C850 +772B5843C850:lI115|H772B5843C860 +772B5843C860:lI116|H772B5843C870 +772B5843C870:lI32|H772B5843C880 +772B5843C880:lI98|H772B5843C890 +772B5843C890:lI101|H772B5843C8A0 +772B5843C8A0:lI32|H772B5843C8B0 +772B5843C8B0:lI97|H772B5843C8C0 +772B5843C8C0:lI32|H772B5843C8D0 +772B5843C8D0:lI108|H772B5843C8E0 +772B5843C8E0:lI105|H772B5843C8F0 +772B5843C8F0:lI115|H772B5843C900 +772B5843C900:lI116|H772B5843C910 +772B5843C910:lI32|H772B5843C920 +772B5843C920:lI101|H772B5843C930 +772B5843C930:lI110|H772B5843C940 +772B5843C940:lI100|H772B5843C950 +772B5843C950:lI101|H772B5843C960 +772B5843C960:lI100|H772B5843C970 +772B5843C970:lI32|H772B5843C980 +772B5843C980:lI98|H772B5843C990 +772B5843C990:lI121|H772B5843C9A0 +772B5843C9A0:lI32|H772B5843C9B0 +772B5843C9B0:lI60|H772B5843C9C0 +772B5843C9C0:lI100|H772B5843C9D0 +772B5843C9D0:lI111|H772B5843C9E0 +772B5843C9E0:lI116|H772B5843C9F0 +772B5843C9F0:lI62|H772B5843CA00 +772B5843CA00:lI60|H772B5843CA10 +772B5843CA10:lI119|H772B5843CA20 +772B5843CA20:lI104|H772B5843CA30 +772B5843CA30:lI105|H772B5843CA40 +772B5843CA40:lI116|H772B5843CA50 +772B5843CA50:lI101|H772B5843CA60 +772B5843CA60:lI115|H772B5843CA70 +772B5843CA70:lI112|H772B5843CA80 +772B5843CA80:lI97|H772B5843CA90 +772B5843CA90:lI99|H772B5843CAA0 +772B5843CAA0:lI101|H772B5843CAB0 +772B5843CAB0:lI62|N +772B5843CAC0:lI59|H772B5843CAD0 +772B5843CAD0:lI32|H772B5843CAE0 +772B5843CAE0:lI100|H772B5843CAF0 +772B5843CAF0:lI117|H772B5843CB00 +772B5843CB00:lI112|H772B5843CB10 +772B5843CB10:lI108|H772B5843CB20 +772B5843CB20:lI105|H772B5843CB30 +772B5843CB30:lI99|H772B5843CB40 +772B5843CB40:lI97|H772B5843CB50 +772B5843CB50:lI116|H772B5843CB60 +772B5843CB60:lI101|H772B5843CB70 +772B5843CB70:lI32|H772B5843CB80 +772B5843CB80:lI112|H772B5843CB90 +772B5843CB90:lI97|H772B5843CBA0 +772B5843CBA0:lI114|H772B5843CBB0 +772B5843CBB0:lI97|H772B5843CBC0 +772B5843CBC0:lI109|H772B5843CBD0 +772B5843CBD0:lI101|H772B5843CBE0 +772B5843CBE0:lI116|H772B5843CBF0 +772B5843CBF0:lI101|H772B5843CC00 +772B5843CC00:lI114|H772B5843CC10 +772B5843CC10:lI58|H772B5843CC20 +772B5843CC20:lI32|N +772B5843CC30:lI59|H772B5843CC40 +772B5843CC40:lI32|H772B5843CC50 +772B5843CC50:lI105|H772B5843CC60 +772B5843CC60:lI110|H772B5843CC70 +772B5843CC70:lI118|H772B5843CC80 +772B5843CC80:lI97|H772B5843CC90 +772B5843CC90:lI108|H772B5843CCA0 +772B5843CCA0:lI105|H772B5843CCB0 +772B5843CCB0:lI100|H772B5843CCC0 +772B5843CCC0:lI32|H772B5843CCD0 +772B5843CCD0:lI112|H772B5843CCE0 +772B5843CCE0:lI97|H772B5843CCF0 +772B5843CCF0:lI114|H772B5843CD00 +772B5843CD00:lI97|H772B5843CD10 +772B5843CD10:lI109|H772B5843CD20 +772B5843CD20:lI101|H772B5843CD30 +772B5843CD30:lI116|H772B5843CD40 +772B5843CD40:lI101|H772B5843CD50 +772B5843CD50:lI114|H772B5843CD60 +772B5843CD60:lI32|H772B5843CD70 +772B5843CD70:lI110|H772B5843CD80 +772B5843CD80:lI97|H772B5843CD90 +772B5843CD90:lI109|H772B5843CDA0 +772B5843CDA0:lI101|H772B5843CDB0 +772B5843CDB0:lI58|H772B5843CDC0 +772B5843CDC0:lI32|N +772B5843CDD0:lI59|H772B5843CDE0 +772B5843CDE0:lI32|H772B5843CDF0 +772B5843CDF0:lI105|H772B5843CE00 +772B5843CE00:lI110|H772B5843CE10 +772B5843CE10:lI118|H772B5843CE20 +772B5843CE20:lI97|H772B5843CE30 +772B5843CE30:lI108|H772B5843CE40 +772B5843CE40:lI105|H772B5843CE50 +772B5843CE50:lI100|H772B5843CE60 +772B5843CE60:lI32|H772B5843CE70 +772B5843CE70:lI112|H772B5843CE80 +772B5843CE80:lI97|H772B5843CE90 +772B5843CE90:lI114|H772B5843CEA0 +772B5843CEA0:lI97|H772B5843CEB0 +772B5843CEB0:lI109|H772B5843CEC0 +772B5843CEC0:lI101|H772B5843CED0 +772B5843CED0:lI116|H772B5843CEE0 +772B5843CEE0:lI101|H772B5843CEF0 +772B5843CEF0:lI114|H772B5843CF00 +772B5843CF00:lI58|H772B5843CF10 +772B5843CF10:lI32|N +772B5843CF20:t2:A5:error,H772B5843CF38 +772B5843CF38:lI97|H772B5843CF48 +772B5843CF48:lI112|H772B5843CF58 +772B5843CF58:lI112|H772B5843CF68 +772B5843CF68:lI108|H772B5843CF78 +772B5843CF78:lI105|H772B5843CF88 +772B5843CF88:lI99|H772B5843CF98 +772B5843CF98:lI97|H772B5843CFA8 +772B5843CFA8:lI116|H772B5843CFB8 +772B5843CFB8:lI105|H772B5843CFC8 +772B5843CFC8:lI111|H772B5843CFD8 +772B5843CFD8:lI110|H772B5843CFE8 +772B5843CFE8:lI58|H772B5843CFF8 +772B5843CFF8:lI32|H772B5843D008 +772B5843D008:lI107|H772B5843D018 +772B5843D018:lI101|H772B5843D028 +772B5843D028:lI114|H772B5843D038 +772B5843D038:lI110|H772B5843D048 +772B5843D048:lI101|H772B5843D058 +772B5843D058:lI108|H772B5843D068 +772B5843D068:lI59|H772B5843D078 +772B5843D078:lI32|H772B5843D088 +772B5843D088:lI101|H772B5843D098 +772B5843D098:lI114|H772B5843D0A8 +772B5843D0A8:lI114|H772B5843D0B8 +772B5843D0B8:lI111|H772B5843D0C8 +772B5843D0C8:lI110|H772B5843D0D8 +772B5843D0D8:lI101|H772B5843D0E8 +772B5843D0E8:lI111|H772B5843D0F8 +772B5843D0F8:lI117|H772B5843D108 +772B5843D108:lI115|H772B5843D118 +772B5843D118:lI32|H772B5843D128 +772B5843D128:lI112|H772B5843D138 +772B5843D138:lI97|H772B5843D148 +772B5843D148:lI114|H772B5843D158 +772B5843D158:lI97|H772B5843D168 +772B5843D168:lI109|H772B5843D178 +772B5843D178:lI101|H772B5843D188 +772B5843D188:lI116|H772B5843D198 +772B5843D198:lI101|H772B5843D1A8 +772B5843D1A8:lI114|H772B5843D1B8 +772B5843D1B8:lI58|H772B5843D1C8 +772B5843D1C8:lI32|H772B5843D1D8 +772B5843D1D8:lI100|H772B5843D1E8 +772B5843D1E8:lI105|H772B5843D1F8 +772B5843D1F8:lI115|H772B5843D208 +772B5843D208:lI116|H772B5843D218 +772B5843D218:lI114|H772B5843D228 +772B5843D228:lI105|H772B5843D238 +772B5843D238:lI98|H772B5843D248 +772B5843D248:lI117|H772B5843D258 +772B5843D258:lI116|H772B5843D268 +772B5843D268:lI101|H772B5843D278 +772B5843D278:lI100|N +772B5843D288:t2:A17:distributed_application,AB:only_loaded +772B5843D2A0:t2:A4:EXIT,A6:normal +772B5843D2B8:t2:AB:distributed,N +772B5843D2D0:t2:A12:application_master,A1:_ +772B5843D2E8:t2:A2:ok,A9:undefined +772B5843D300:lI46|H772B5843D310 +772B5843D310:lI97|H772B5843D320 +772B5843D320:lI112|H772B5843D330 +772B5843D330:lI112|N +772B5843D340:t2:A5:error,H772B5843D358 +772B5843D358:lI98|H772B5843D368 +772B5843D368:lI97|H772B5843D378 +772B5843D378:lI100|H772B5843D388 +772B5843D388:lI32|H772B5843D398 +772B5843D398:lI101|H772B5843D3A8 +772B5843D3A8:lI110|H772B5843D3B8 +772B5843D3B8:lI99|H772B5843D3C8 +772B5843D3C8:lI111|H772B5843D3D8 +772B5843D3D8:lI100|H772B5843D3E8 +772B5843D3E8:lI105|H772B5843D3F8 +772B5843D3F8:lI110|H772B5843D408 +772B5843D408:lI103|N +772B5843D418:t2:A5:error,A6:enoent +772B5843D430:lI97|H772B5843D440 +772B5843D440:lI112|H772B5843D450 +772B5843D450:lI112|H772B5843D460 +772B5843D460:lI108|H772B5843D470 +772B5843D470:lI105|H772B5843D480 +772B5843D480:lI99|H772B5843D490 +772B5843D490:lI97|H772B5843D4A0 +772B5843D4A0:lI116|H772B5843D4B0 +772B5843D4B0:lI105|H772B5843D4C0 +772B5843D4C0:lI111|H772B5843D4D0 +772B5843D4D0:lI110|H772B5843D4E0 +772B5843D4E0:lI95|H772B5843D4F0 +772B5843D4F0:lI99|H772B5843D500 +772B5843D500:lI111|H772B5843D510 +772B5843D510:lI110|H772B5843D520 +772B5843D520:lI116|H772B5843D530 +772B5843D530:lI114|H772B5843D540 +772B5843D540:lI111|H772B5843D550 +772B5843D550:lI108|H772B5843D560 +772B5843D560:lI108|H772B5843D570 +772B5843D570:lI101|H772B5843D580 +772B5843D580:lI114|H772B5843D590 +772B5843D590:lI58|H772B5843D5A0 +772B5843D5A0:lI32|H772B5843D5B0 +772B5843D5B0:lI126|H772B5843D5C0 +772B5843D5C0:lI116|H772B5843D5D0 +772B5843D5D0:lI115|H772B5843D5E0 +772B5843D5E0:lI58|H772B5843D5F0 +772B5843D5F0:lI32|H772B5843D600 +772B5843D600:lI126|H772B5843D610 +772B5843D610:lI116|H772B5843D620 +772B5843D620:lI115|H772B5843D630 +772B5843D630:lI126|H772B5843D640 +772B5843D640:lI110|N +772B5843D650:t1:AC:error_logger +772B5843D660:Mf1:H772B5843D650:H772B5843D690 +772B5843D680:t1:A3:tag +772B5843D690:Mf1:H772B5843D680:A5:error +772B5843D6B0:t3:A4:line,A4:file,A3:mfa +772B5843D6D0:Mf3:H772B5843D6B0:I1665,H772B5843D700,H772B5843D8A0 +772B5843D700:lI97|H772B5843D710 +772B5843D710:lI112|H772B5843D720 +772B5843D720:lI112|H772B5843D730 +772B5843D730:lI108|H772B5843D740 +772B5843D740:lI105|H772B5843D750 +772B5843D750:lI99|H772B5843D760 +772B5843D760:lI97|H772B5843D770 +772B5843D770:lI116|H772B5843D780 +772B5843D780:lI105|H772B5843D790 +772B5843D790:lI111|H772B5843D7A0 +772B5843D7A0:lI110|H772B5843D7B0 +772B5843D7B0:lI95|H772B5843D7C0 +772B5843D7C0:lI99|H772B5843D7D0 +772B5843D7D0:lI111|H772B5843D7E0 +772B5843D7E0:lI110|H772B5843D7F0 +772B5843D7F0:lI116|H772B5843D800 +772B5843D800:lI114|H772B5843D810 +772B5843D810:lI111|H772B5843D820 +772B5843D820:lI108|H772B5843D830 +772B5843D830:lI108|H772B5843D840 +772B5843D840:lI101|H772B5843D850 +772B5843D850:lI114|H772B5843D860 +772B5843D860:lI46|H772B5843D870 +772B5843D870:lI101|H772B5843D880 +772B5843D880:lI114|H772B5843D890 +772B5843D890:lI108|N +772B5843D8A0:t3:A16:application_controller,A16:handle_make_term_error,I3 +772B5843D8C0:t2:N,N +772B5843D8D8:lH772B5843D8F8|H772B5843D8E8 +772B5843D8E8:lN|N +772B5843D8F8:lI46|H772B5843D908 +772B5843D908:lI99|H772B5843D918 +772B5843D918:lI111|H772B5843D928 +772B5843D928:lI110|H772B5843D938 +772B5843D938:lI102|H772B5843D948 +772B5843D948:lI105|H772B5843D958 +772B5843D958:lI103|N +772B5843D968:lI67|H772B5843D978 +772B5843D978:lI97|H772B5843D988 +772B5843D988:lI110|H772B5843D998 +772B5843D998:lI110|H772B5843D9A8 +772B5843D9A8:lI111|H772B5843D9B8 +772B5843D9B8:lI116|H772B5843D9C8 +772B5843D9C8:lI32|H772B5843D9D8 +772B5843D9D8:lI112|H772B5843D9E8 +772B5843D9E8:lI97|H772B5843D9F8 +772B5843D9F8:lI114|H772B5843DA08 +772B5843DA08:lI115|H772B5843DA18 +772B5843DA18:lI101|H772B5843DA28 +772B5843DA28:lI32|H772B5843DA38 +772B5843DA38:lI102|H772B5843DA48 +772B5843DA48:lI105|H772B5843DA58 +772B5843DA58:lI108|H772B5843DA68 +772B5843DA68:lI101|H772B5843DA78 +772B5843DA78:lI32|H772B5843DA88 +772B5843DA88:lI100|H772B5843DA98 +772B5843DA98:lI101|H772B5843DAA8 +772B5843DAA8:lI115|H772B5843DAB8 +772B5843DAB8:lI99|H772B5843DAC8 +772B5843DAC8:lI114|H772B5843DAD8 +772B5843DAD8:lI105|H772B5843DAE8 +772B5843DAE8:lI112|H772B5843DAF8 +772B5843DAF8:lI116|H772B5843DB08 +772B5843DB08:lI111|H772B5843DB18 +772B5843DB18:lI114|H772B5843DB28 +772B5843DB28:lI32|H772B5843DB38 +772B5843DB38:lI111|H772B5843DB48 +772B5843DB48:lI102|H772B5843DB58 +772B5843DB58:lI32|H772B5843DB68 +772B5843DB68:lI116|H772B5843DB78 +772B5843DB78:lI121|H772B5843DB88 +772B5843DB88:lI112|H772B5843DB98 +772B5843DB98:lI101|H772B5843DBA8 +772B5843DBA8:lI58|H772B5843DBB8 +772B5843DBB8:lI32|H772B5843DBC8 +772B5843DBC8:lI126|H772B5843DBD8 +772B5843DBD8:lI116|H772B5843DBE8 +772B5843DBE8:lI115|N +772B5843DBF8:lI84|H772B5843DC08 +772B5843DC08:lI104|H772B5843DC18 +772B5843DC18:lI101|H772B5843DC28 +772B5843DC28:lI32|H772B5843DC38 +772B5843DC38:lI103|H772B5843DC48 +772B5843DC48:lI105|H772B5843DC58 +772B5843DC58:lI118|H772B5843DC68 +772B5843DC68:lI101|H772B5843DC78 +772B5843DC78:lI110|H772B5843DC88 +772B5843DC88:lI32|H772B5843DC98 +772B5843DC98:lI102|H772B5843DCA8 +772B5843DCA8:lI105|H772B5843DCB8 +772B5843DCB8:lI108|H772B5843DCC8 +772B5843DCC8:lI101|H772B5843DCD8 +772B5843DCD8:lI32|H772B5843DCE8 +772B5843DCE8:lI100|H772B5843DCF8 +772B5843DCF8:lI101|H772B5843DD08 +772B5843DD08:lI115|H772B5843DD18 +772B5843DD18:lI99|H772B5843DD28 +772B5843DD28:lI114|H772B5843DD38 +772B5843DD38:lI105|H772B5843DD48 +772B5843DD48:lI112|H772B5843DD58 +772B5843DD58:lI116|H772B5843DD68 +772B5843DD68:lI111|H772B5843DD78 +772B5843DD78:lI114|H772B5843DD88 +772B5843DD88:lI32|H772B5843DD98 +772B5843DD98:lI104|H772B5843DDA8 +772B5843DDA8:lI97|H772B5843DDB8 +772B5843DDB8:lI115|H772B5843DDC8 +772B5843DDC8:lI32|H772B5843DDD8 +772B5843DDD8:lI105|H772B5843DDE8 +772B5843DDE8:lI110|H772B5843DDF8 +772B5843DDF8:lI99|H772B5843DE08 +772B5843DE08:lI111|H772B5843DE18 +772B5843DE18:lI114|H772B5843DE28 +772B5843DE28:lI114|H772B5843DE38 +772B5843DE38:lI101|H772B5843DE48 +772B5843DE48:lI99|H772B5843DE58 +772B5843DE58:lI116|H772B5843DE68 +772B5843DE68:lI32|H772B5843DE78 +772B5843DE78:lI102|H772B5843DE88 +772B5843DE88:lI111|H772B5843DE98 +772B5843DE98:lI114|H772B5843DEA8 +772B5843DEA8:lI109|H772B5843DEB8 +772B5843DEB8:lI97|H772B5843DEC8 +772B5843DEC8:lI116|H772B5843DED8 +772B5843DED8:lI46|H772B5843DEE8 +772B5843DEE8:lI32|H772B5843DEF8 +772B5843DEF8:lI84|H772B5843DF08 +772B5843DF08:lI104|H772B5843DF18 +772B5843DF18:lI101|H772B5843DF28 +772B5843DF28:lI32|H772B5843DF38 +772B5843DF38:lI102|H772B5843DF48 +772B5843DF48:lI111|H772B5843DF58 +772B5843DF58:lI114|H772B5843DF68 +772B5843DF68:lI109|H772B5843DF78 +772B5843DF78:lI97|H772B5843DF88 +772B5843DF88:lI116|H772B5843DF98 +772B5843DF98:lI32|H772B5843DFA8 +772B5843DFA8:lI115|H772B5843DFB8 +772B5843DFB8:lI104|H772B5843DFC8 +772B5843DFC8:lI111|H772B5843DFD8 +772B5843DFD8:lI117|H772B5843DFE8 +772B5843DFE8:lI108|H772B5843DFF8 +772B5843DFF8:lI100|H772B5843E008 +772B5843E008:lI32|H772B5843E018 +772B5843E018:lI98|H772B5843E028 +772B5843E028:lI101|H772B5843E038 +772B5843E038:lI32|H772B5843E048 +772B5843E048:lI34|H772B5843E058 +772B5843E058:lI70|H772B5843E068 +772B5843E068:lI105|H772B5843E078 +772B5843E078:lI108|H772B5843E088 +772B5843E088:lI101|H772B5843E098 +772B5843E098:lI68|H772B5843E0A8 +772B5843E0A8:lI101|H772B5843E0B8 +772B5843E0B8:lI115|H772B5843E0C8 +772B5843E0C8:lI99|H772B5843E0D8 +772B5843E0D8:lI73|H772B5843E0E8 +772B5843E0E8:lI100|H772B5843E0F8 +772B5843E0F8:lI91|H772B5843E108 +772B5843E108:lI46|H772B5843E118 +772B5843E118:lI70|H772B5843E128 +772B5843E128:lI105|H772B5843E138 +772B5843E138:lI108|H772B5843E148 +772B5843E148:lI101|H772B5843E158 +772B5843E158:lI84|H772B5843E168 +772B5843E168:lI121|H772B5843E178 +772B5843E178:lI112|H772B5843E188 +772B5843E188:lI101|H772B5843E198 +772B5843E198:lI93|H772B5843E1A8 +772B5843E1A8:lI34|H772B5843E1B8 +772B5843E1B8:lI46|H772B5843E1C8 +772B5843E1C8:lI32|H772B5843E1D8 +772B5843E1D8:lI69|H772B5843E1E8 +772B5843E1E8:lI120|H772B5843E1F8 +772B5843E1F8:lI97|H772B5843E208 +772B5843E208:lI109|H772B5843E218 +772B5843E218:lI112|H772B5843E228 +772B5843E228:lI108|H772B5843E238 +772B5843E238:lI101|H772B5843E248 +772B5843E248:lI115|H772B5843E258 +772B5843E258:lI58|H772B5843E268 +772B5843E268:lI32|H772B5843E278 +772B5843E278:lI51|H772B5843E288 +772B5843E288:lI32|H772B5843E298 +772B5843E298:lI111|H772B5843E2A8 +772B5843E2A8:lI114|H772B5843E2B8 +772B5843E2B8:lI32|H772B5843E2C8 +772B5843E2C8:lI51|H772B5843E2D8 +772B5843E2D8:lI46|H772B5843E2E8 +772B5843E2E8:lI99|H772B5843E2F8 +772B5843E2F8:lI111|H772B5843E308 +772B5843E308:lI110|H772B5843E318 +772B5843E318:lI102|H772B5843E328 +772B5843E328:lI105|H772B5843E338 +772B5843E338:lI103|N +772B5843E348:lI46|H772B5843E358 +772B5843E358:lI99|H772B5843E368 +772B5843E368:lI111|H772B5843E378 +772B5843E378:lI110|H772B5843E388 +772B5843E388:lI102|H772B5843E398 +772B5843E398:lI105|H772B5843E3A8 +772B5843E3A8:lI103|N +772B5843E3B8:lI115|H772B5843E3C8 +772B5843E3C8:lI121|H772B5843E3D8 +772B5843E3D8:lI115|N +772B5843E3E8:lI32|N +772B5843E3F8:t2:A5:error,H772B5843E410 +772B5843E410:t3:A4:none,A9:scan_file,H772B5843E430 +772B5843E430:lI98|H772B5843E440 +772B5843E440:lI97|H772B5843E450 +772B5843E450:lI100|H772B5843E460 +772B5843E460:lI32|H772B5843E470 +772B5843E470:lI101|H772B5843E480 +772B5843E480:lI110|H772B5843E490 +772B5843E490:lI99|H772B5843E4A0 +772B5843E4A0:lI111|H772B5843E4B0 +772B5843E4B0:lI100|H772B5843E4C0 +772B5843E4C0:lI105|H772B5843E4D0 +772B5843E4D0:lI110|H772B5843E4E0 +772B5843E4E0:lI103|N +772B5843E4F0:t2:A5:error,H772B5843E508 +772B5843E508:t3:A4:none,A9:open_file,H772B5843E528 +772B5843E528:lI99|H772B5843E538 +772B5843E538:lI111|H772B5843E548 +772B5843E548:lI110|H772B5843E558 +772B5843E558:lI102|H772B5843E568 +772B5843E568:lI105|H772B5843E578 +772B5843E578:lI103|H772B5843E588 +772B5843E588:lI117|H772B5843E598 +772B5843E598:lI114|H772B5843E5A8 +772B5843E5A8:lI97|H772B5843E5B8 +772B5843E5B8:lI116|H772B5843E5C8 +772B5843E5C8:lI105|H772B5843E5D8 +772B5843E5D8:lI111|H772B5843E5E8 +772B5843E5E8:lI110|H772B5843E5F8 +772B5843E5F8:lI32|H772B5843E608 +772B5843E608:lI102|H772B5843E618 +772B5843E618:lI105|H772B5843E628 +772B5843E628:lI108|H772B5843E638 +772B5843E638:lI101|H772B5843E648 +772B5843E648:lI32|H772B5843E658 +772B5843E658:lI110|H772B5843E668 +772B5843E668:lI111|H772B5843E678 +772B5843E678:lI116|H772B5843E688 +772B5843E688:lI32|H772B5843E698 +772B5843E698:lI102|H772B5843E6A8 +772B5843E6A8:lI111|H772B5843E6B8 +772B5843E6B8:lI117|H772B5843E6C8 +772B5843E6C8:lI110|H772B5843E6D8 +772B5843E6D8:lI100|N +772B5843E6E8:lI67|H772B5843E6F8 +772B5843E6F8:lI111|H772B5843E708 +772B5843E708:lI117|H772B5843E718 +772B5843E718:lI108|H772B5843E728 +772B5843E728:lI100|H772B5843E738 +772B5843E738:lI32|H772B5843E748 +772B5843E748:lI110|H772B5843E758 +772B5843E758:lI111|H772B5843E768 +772B5843E768:lI116|H772B5843E778 +772B5843E778:lI32|H772B5843E788 +772B5843E788:lI114|H772B5843E798 +772B5843E798:lI101|H772B5843E7A8 +772B5843E7A8:lI97|H772B5843E7B8 +772B5843E7B8:lI100|H772B5843E7C8 +772B5843E7C8:lI32|H772B5843E7D8 +772B5843E7D8:lI102|H772B5843E7E8 +772B5843E7E8:lI114|H772B5843E7F8 +772B5843E7F8:lI111|H772B5843E808 +772B5843E808:lI109|H772B5843E818 +772B5843E818:lI32|H772B5843E828 +772B5843E828:lI102|H772B5843E838 +772B5843E838:lI105|H772B5843E848 +772B5843E848:lI108|H772B5843E858 +772B5843E858:lI101|H772B5843E868 +772B5843E868:lI32|H772B5843E878 +772B5843E878:lI100|H772B5843E888 +772B5843E888:lI101|H772B5843E898 +772B5843E898:lI115|H772B5843E8A8 +772B5843E8A8:lI99|H772B5843E8B8 +772B5843E8B8:lI114|H772B5843E8C8 +772B5843E8C8:lI105|H772B5843E8D8 +772B5843E8D8:lI112|H772B5843E8E8 +772B5843E8E8:lI116|H772B5843E8F8 +772B5843E8F8:lI111|H772B5843E908 +772B5843E908:lI114|H772B5843E918 +772B5843E918:lI58|H772B5843E928 +772B5843E928:lI32|H772B5843E938 +772B5843E938:lI126|H772B5843E948 +772B5843E948:lI115|N +772B5843E958:t2:A5:error,H772B5843E970 +772B5843E970:t3:A4:none,A9:load_file,H772B5843E990 +772B5843E990:lI110|H772B5843E9A0 +772B5843E9A0:lI111|H772B5843E9B0 +772B5843E9B0:lI32|H772B5843E9C0 +772B5843E9C0:lI101|H772B5843E9D0 +772B5843E9D0:lI110|H772B5843E9E0 +772B5843E9E0:lI100|H772B5843E9F0 +772B5843E9F0:lI105|H772B5843EA00 +772B5843EA00:lI110|H772B5843EA10 +772B5843EA10:lI103|H772B5843EA20 +772B5843EA20:lI32|H772B5843EA30 +772B5843EA30:lI60|H772B5843EA40 +772B5843EA40:lI100|H772B5843EA50 +772B5843EA50:lI111|H772B5843EA60 +772B5843EA60:lI116|H772B5843EA70 +772B5843EA70:lI62|H772B5843EA80 +772B5843EA80:lI32|H772B5843EA90 +772B5843EA90:lI102|H772B5843EAA0 +772B5843EAA0:lI111|H772B5843EAB0 +772B5843EAB0:lI117|H772B5843EAC0 +772B5843EAC0:lI110|H772B5843EAD0 +772B5843EAD0:lI100|N +772B5843EAE0:t2:A5:error,H772B5843EAF8 +772B5843EAF8:t3:A4:none,A9:load_file,H772B5843EB18 +772B5843EB18:lI99|H772B5843EB28 +772B5843EB28:lI111|H772B5843EB38 +772B5843EB38:lI110|H772B5843EB48 +772B5843EB48:lI102|H772B5843EB58 +772B5843EB58:lI105|H772B5843EB68 +772B5843EB68:lI103|H772B5843EB78 +772B5843EB78:lI117|H772B5843EB88 +772B5843EB88:lI114|H772B5843EB98 +772B5843EB98:lI97|H772B5843EBA8 +772B5843EBA8:lI116|H772B5843EBB8 +772B5843EBB8:lI105|H772B5843EBC8 +772B5843EBC8:lI111|H772B5843EBD8 +772B5843EBD8:lI110|H772B5843EBE8 +772B5843EBE8:lI32|H772B5843EBF8 +772B5843EBF8:lI102|H772B5843EC08 +772B5843EC08:lI105|H772B5843EC18 +772B5843EC18:lI108|H772B5843EC28 +772B5843EC28:lI101|H772B5843EC38 +772B5843EC38:lI32|H772B5843EC48 +772B5843EC48:lI109|H772B5843EC58 +772B5843EC58:lI117|H772B5843EC68 +772B5843EC68:lI115|H772B5843EC78 +772B5843EC78:lI116|H772B5843EC88 +772B5843EC88:lI32|H772B5843EC98 +772B5843EC98:lI99|H772B5843ECA8 +772B5843ECA8:lI111|H772B5843ECB8 +772B5843ECB8:lI110|H772B5843ECC8 +772B5843ECC8:lI116|H772B5843ECD8 +772B5843ECD8:lI97|H772B5843ECE8 +772B5843ECE8:lI105|H772B5843ECF8 +772B5843ECF8:lI110|H772B5843ED08 +772B5843ED08:lI32|H772B5843ED18 +772B5843ED18:lI79|H772B5843ED28 +772B5843ED28:lI78|H772B5843ED38 +772B5843ED38:lI69|H772B5843ED48 +772B5843ED48:lI32|H772B5843ED58 +772B5843ED58:lI108|H772B5843ED68 +772B5843ED68:lI105|H772B5843ED78 +772B5843ED78:lI115|H772B5843ED88 +772B5843ED88:lI116|H772B5843ED98 +772B5843ED98:lI32|H772B5843EDA8 +772B5843EDA8:lI101|H772B5843EDB8 +772B5843EDB8:lI110|H772B5843EDC8 +772B5843EDC8:lI100|H772B5843EDD8 +772B5843EDD8:lI101|H772B5843EDE8 +772B5843EDE8:lI100|H772B5843EDF8 +772B5843EDF8:lI32|H772B5843EE08 +772B5843EE08:lI98|H772B5843EE18 +772B5843EE18:lI121|H772B5843EE28 +772B5843EE28:lI32|H772B5843EE38 +772B5843EE38:lI60|H772B5843EE48 +772B5843EE48:lI100|H772B5843EE58 +772B5843EE58:lI111|H772B5843EE68 +772B5843EE68:lI116|H772B5843EE78 +772B5843EE78:lI62|N +772B5843EE88:Mf0:H772B58410188: +772B5843EEA0:t2:A16:application_controller,A8:progress +772B5843EEB8:t4:AC:error_logger,A6:domain,A10:logger_formatter,A9:report_cb +772B5843EEE0:Mf4:H772B5843EEB8:H772B5843EF58,H772B5843EF18,H772B5843EF98,H772B584140C0 +772B5843EF18:lA3:otp|H772B5843EF28 +772B5843EF28:lA4:sasl|N +772B5843EF38:t3:A3:tag,A4:type,A9:report_cb +772B5843EF58:Mf3:H772B5843EF38:AB:info_report,A8:progress,H772B584140B0 +772B5843EF88:t1:A5:title +772B5843EF98:Mf1:H772B5843EF88:H772B5843EFB8 +772B5843EFB8:lI80|H772B5843EFC8 +772B5843EFC8:lI82|H772B5843EFD8 +772B5843EFD8:lI79|H772B5843EFE8 +772B5843EFE8:lI71|H772B5843EFF8 +772B5843EFF8:lI82|H772B5843F008 +772B5843F008:lI69|H772B5843F018 +772B5843F018:lI83|H772B5843F028 +772B5843F028:lI83|H772B5843F038 +772B5843F038:lI32|H772B5843F048 +772B5843F048:lI82|H772B5843F058 +772B5843F058:lI69|H772B5843F068 +772B5843F068:lI80|H772B5843F078 +772B5843F078:lI79|H772B5843F088 +772B5843F088:lI82|H772B5843F098 +772B5843F098:lI84|N +772B5843F0A8:t3:A4:line,A4:file,A3:mfa +772B5843F0C8:Mf3:H772B5843F0A8:I2113,H772B5843F0F8,H772B5843F298 +772B5843F0F8:lI97|H772B5843F108 +772B5843F108:lI112|H772B5843F118 +772B5843F118:lI112|H772B5843F128 +772B5843F128:lI108|H772B5843F138 +772B5843F138:lI105|H772B5843F148 +772B5843F148:lI99|H772B5843F158 +772B5843F158:lI97|H772B5843F168 +772B5843F168:lI116|H772B5843F178 +772B5843F178:lI105|H772B5843F188 +772B5843F188:lI111|H772B5843F198 +772B5843F198:lI110|H772B5843F1A8 +772B5843F1A8:lI95|H772B5843F1B8 +772B5843F1B8:lI99|H772B5843F1C8 +772B5843F1C8:lI111|H772B5843F1D8 +772B5843F1D8:lI110|H772B5843F1E8 +772B5843F1E8:lI116|H772B5843F1F8 +772B5843F1F8:lI114|H772B5843F208 +772B5843F208:lI111|H772B5843F218 +772B5843F218:lI108|H772B5843F228 +772B5843F228:lI108|H772B5843F238 +772B5843F238:lI101|H772B5843F248 +772B5843F248:lI114|H772B5843F258 +772B5843F258:lI46|H772B5843F268 +772B5843F268:lI101|H772B5843F278 +772B5843F278:lI114|H772B5843F288 +772B5843F288:lI108|N +772B5843F298:t3:A16:application_controller,AC:info_started,I2 +772B5843F2B8:t2:A16:application_controller,A4:exit +772B5843F2D0:t3:AC:error_logger,A6:domain,A9:report_cb +772B5843F2F0:Mf3:H772B5843F2D0:H772B5843F350,H772B5843F320,H772B584140C0 +772B5843F320:lA3:otp|N +772B5843F330:t3:A3:tag,A4:type,A9:report_cb +772B5843F350:Mf3:H772B5843F330:AB:info_report,A8:std_info,H772B584140B0 +772B5843F380:t3:A4:line,A4:file,A3:mfa +772B5843F3A0:Mf3:H772B5843F380:I2125,H772B5843F3D0,H772B5843F570 +772B5843F3D0:lI97|H772B5843F3E0 +772B5843F3E0:lI112|H772B5843F3F0 +772B5843F3F0:lI112|H772B5843F400 +772B5843F400:lI108|H772B5843F410 +772B5843F410:lI105|H772B5843F420 +772B5843F420:lI99|H772B5843F430 +772B5843F430:lI97|H772B5843F440 +772B5843F440:lI116|H772B5843F450 +772B5843F450:lI105|H772B5843F460 +772B5843F460:lI111|H772B5843F470 +772B5843F470:lI110|H772B5843F480 +772B5843F480:lI95|H772B5843F490 +772B5843F490:lI99|H772B5843F4A0 +772B5843F4A0:lI111|H772B5843F4B0 +772B5843F4B0:lI110|H772B5843F4C0 +772B5843F4C0:lI116|H772B5843F4D0 +772B5843F4D0:lI114|H772B5843F4E0 +772B5843F4E0:lI111|H772B5843F4F0 +772B5843F4F0:lI108|H772B5843F500 +772B5843F500:lI108|H772B5843F510 +772B5843F510:lI101|H772B5843F520 +772B5843F520:lI114|H772B5843F530 +772B5843F530:lI46|H772B5843F540 +772B5843F540:lI101|H772B5843F550 +772B5843F550:lI114|H772B5843F560 +772B5843F560:lI108|N +772B5843F570:t3:A16:application_controller,AB:info_exited,I3 +772B5843F590:t4:AB:chars_limit,A5:depth,AB:single_line,A8:encoding +772B5843F5B8:Mf4:H772B5843F590:A9:unlimited,A9:unlimited,A5:false,A4:utf8 +772B5843F5F0:lI46|N +772B5843F600:lI46|H772B5843F610 +772B5843F610:lI32|H772B5843F620 +772B5843F620:lI83|H772B5843F630 +772B5843F630:lI116|H772B5843F640 +772B5843F640:lI97|H772B5843F650 +772B5843F650:lI114|H772B5843F660 +772B5843F660:lI116|H772B5843F670 +772B5843F670:lI101|H772B5843F680 +772B5843F680:lI100|H772B5843F690 +772B5843F690:lI32|H772B5843F6A0 +772B5843F6A0:lI97|H772B5843F6B0 +772B5843F6B0:lI116|H772B5843F6C0 +772B5843F6C0:lI58|H772B5843F6D0 +772B5843F6D0:lI32|N +772B5843F6E0:lI65|H772B5843F6F0 +772B5843F6F0:lI112|H772B5843F700 +772B5843F700:lI112|H772B5843F710 +772B5843F710:lI108|H772B5843F720 +772B5843F720:lI105|H772B5843F730 +772B5843F730:lI99|H772B5843F740 +772B5843F740:lI97|H772B5843F750 +772B5843F750:lI116|H772B5843F760 +772B5843F760:lI105|H772B5843F770 +772B5843F770:lI111|H772B5843F780 +772B5843F780:lI110|H772B5843F790 +772B5843F790:lI58|H772B5843F7A0 +772B5843F7A0:lI32|N +772B5843F7B0:lH772B5843F7C0|N +772B5843F7C0:lI46|N +772B5843F7D0:lI46|H772B5843F7E0 +772B5843F7E0:lI32|H772B5843F7F0 +772B5843F7F0:lI84|H772B5843F800 +772B5843F800:lI121|H772B5843F810 +772B5843F810:lI112|H772B5843F820 +772B5843F820:lI101|H772B5843F830 +772B5843F830:lI58|H772B5843F840 +772B5843F840:lI32|N +772B5843F850:lI46|H772B5843F860 +772B5843F860:lI32|H772B5843F870 +772B5843F870:lI69|H772B5843F880 +772B5843F880:lI120|H772B5843F890 +772B5843F890:lI105|H772B5843F8A0 +772B5843F8A0:lI116|H772B5843F8B0 +772B5843F8B0:lI101|H772B5843F8C0 +772B5843F8C0:lI100|H772B5843F8D0 +772B5843F8D0:lI58|H772B5843F8E0 +772B5843F8E0:lI32|N +772B5843F8F0:lH772B5843F900|N +772B5843F900:lI126|H772B5843F910 +772B5843F910:lI110|N +772B5843F920:lI32|H772B5843F930 +772B5843F930:lI32|H772B5843F940 +772B5843F940:lI32|H772B5843F950 +772B5843F950:lI32|H772B5843F960 +772B5843F960:lI115|H772B5843F970 +772B5843F970:lI116|H772B5843F980 +772B5843F980:lI97|H772B5843F990 +772B5843F990:lI114|H772B5843F9A0 +772B5843F9A0:lI116|H772B5843F9B0 +772B5843F9B0:lI101|H772B5843F9C0 +772B5843F9C0:lI100|H772B5843F9D0 +772B5843F9D0:lI95|H772B5843F9E0 +772B5843F9E0:lI97|H772B5843F9F0 +772B5843F9F0:lI116|H772B5843FA00 +772B5843FA00:lI58|H772B5843FA10 +772B5843FA10:lI32|N +772B5843FA20:lI126|H772B5843FA30 +772B5843FA30:lI110|N +772B5843FA40:lI32|H772B5843FA50 +772B5843FA50:lI32|H772B5843FA60 +772B5843FA60:lI32|H772B5843FA70 +772B5843FA70:lI32|H772B5843FA80 +772B5843FA80:lI97|H772B5843FA90 +772B5843FA90:lI112|H772B5843FAA0 +772B5843FAA0:lI112|H772B5843FAB0 +772B5843FAB0:lI108|H772B5843FAC0 +772B5843FAC0:lI105|H772B5843FAD0 +772B5843FAD0:lI99|H772B5843FAE0 +772B5843FAE0:lI97|H772B5843FAF0 +772B5843FAF0:lI116|H772B5843FB00 +772B5843FB00:lI105|H772B5843FB10 +772B5843FB10:lI111|H772B5843FB20 +772B5843FB20:lI110|H772B5843FB30 +772B5843FB30:lI58|H772B5843FB40 +772B5843FB40:lI32|N +772B5843FB50:lI32|H772B5843FB60 +772B5843FB60:lI32|H772B5843FB70 +772B5843FB70:lI32|H772B5843FB80 +772B5843FB80:lI32|H772B5843FB90 +772B5843FB90:lI116|H772B5843FBA0 +772B5843FBA0:lI121|H772B5843FBB0 +772B5843FBB0:lI112|H772B5843FBC0 +772B5843FBC0:lI101|H772B5843FBD0 +772B5843FBD0:lI58|H772B5843FBE0 +772B5843FBE0:lI32|N +772B5843FBF0:lI32|H772B5843FC00 +772B5843FC00:lI32|H772B5843FC10 +772B5843FC10:lI32|H772B5843FC20 +772B5843FC20:lI32|H772B5843FC30 +772B5843FC30:lI101|H772B5843FC40 +772B5843FC40:lI120|H772B5843FC50 +772B5843FC50:lI105|H772B5843FC60 +772B5843FC60:lI116|H772B5843FC70 +772B5843FC70:lI101|H772B5843FC80 +772B5843FC80:lI100|H772B5843FC90 +772B5843FC90:lI58|H772B5843FCA0 +772B5843FCA0:lI32|N +772B5843FCB0:lI112|N +772B5843FCC0:lI80|N +772B5843FCD0:lI48|N +772B5843FCE0:lI116|N +772B5843FCF0:t3:A3:env,A6:kernel,AB:permissions +772B5843FD10:lI126|H772B5843FD20 +772B5843FD20:lI48|H772B5843FD30 +772B5843FD30:lI112|N +772B5843FD40:lI83|H772B5843FD50 +772B5843FD50:lI108|H772B5843FD60 +772B5843FD60:lI111|H772B5843FD70 +772B5843FD70:lI119|H772B5843FD80 +772B5843FD80:lI32|H772B5843FD90 +772B5843FD90:lI45|H772B5843FDA0 +772B5843FDA0:lI99|H772B5843FDB0 +772B5843FDB0:lI111|H772B5843FDC0 +772B5843FDC0:lI110|H772B5843FDD0 +772B5843FDD0:lI102|H772B5843FDE0 +772B5843FDE0:lI105|H772B5843FDF0 +772B5843FDF0:lI103|H772B5843FE00 +772B5843FE00:lI102|H772B5843FE10 +772B5843FE10:lI100|H772B5843FE20 +772B5843FE20:lI32|H772B5843FE30 +772B5843FE30:lI102|H772B5843FE40 +772B5843FE40:lI105|H772B5843FE50 +772B5843FE50:lI108|H772B5843FE60 +772B5843FE60:lI101|H772B5843FE70 +772B5843FE70:lI32|H772B5843FE80 +772B5843FE80:lI100|H772B5843FE90 +772B5843FE90:lI101|H772B5843FEA0 +772B5843FEA0:lI115|H772B5843FEB0 +772B5843FEB0:lI99|H772B5843FEC0 +772B5843FEC0:lI114|H772B5843FED0 +772B5843FED0:lI105|H772B5843FEE0 +772B5843FEE0:lI112|H772B5843FEF0 +772B5843FEF0:lI116|H772B5843FF00 +772B5843FF00:lI111|H772B5843FF10 +772B5843FF10:lI114|H772B5843FF20 +772B5843FF20:lI32|H772B5843FF30 +772B5843FF30:lI126|H772B5843FF40 +772B5843FF40:lI112|H772B5843FF50 +772B5843FF50:lI46|H772B5843FF60 +772B5843FF60:lI32|H772B5843FF70 +772B5843FF70:lI84|H772B5843FF80 +772B5843FF80:lI104|H772B5843FF90 +772B5843FF90:lI101|H772B5843FFA0 +772B5843FFA0:lI32|H772B5843FFB0 +772B5843FFB0:lI115|H772B5843FFC0 +772B5843FFC0:lI121|H772B5843FFD0 +772B5843FFD0:lI115|H772B5843FFE0 +772B5843FFE0:lI116|H772B5843FFF0 +772B5843FFF0:lI101|H772B58440000 +772B58440000:lI109|H772B58440010 +772B58440010:lI32|H772B58440020 +772B58440020:lI119|H772B58440030 +772B58440030:lI105|H772B58440040 +772B58440040:lI108|H772B58440050 +772B58440050:lI108|H772B58440060 +772B58440060:lI32|H772B58440070 +772B58440070:lI99|H772B58440080 +772B58440080:lI111|H772B58440090 +772B58440090:lI110|H772B584400A0 +772B584400A0:lI116|H772B584400B0 +772B584400B0:lI105|H772B584400C0 +772B584400C0:lI110|H772B584400D0 +772B584400D0:lI117|H772B584400E0 +772B584400E0:lI101|H772B584400F0 +772B584400F0:lI32|H772B58440100 +772B58440100:lI116|H772B58440110 +772B58440110:lI111|H772B58440120 +772B58440120:lI32|H772B58440130 +772B58440130:lI114|H772B58440140 +772B58440140:lI101|H772B58440150 +772B58440150:lI97|H772B58440160 +772B58440160:lI100|H772B58440170 +772B58440170:lI32|H772B58440180 +772B58440180:lI102|H772B58440190 +772B58440190:lI114|H772B584401A0 +772B584401A0:lI111|H772B584401B0 +772B584401B0:lI109|H772B584401C0 +772B584401C0:lI32|H772B584401D0 +772B584401D0:lI116|H772B584401E0 +772B584401E0:lI104|H772B584401F0 +772B584401F0:lI101|H772B58440200 +772B58440200:lI32|H772B58440210 +772B58440210:lI102|H772B58440220 +772B58440220:lI105|H772B58440230 +772B58440230:lI108|H772B58440240 +772B58440240:lI101|H772B58440250 +772B58440250:lI32|H772B58440260 +772B58440260:lI100|H772B58440270 +772B58440270:lI101|H772B58440280 +772B58440280:lI115|H772B58440290 +772B58440290:lI99|H772B584402A0 +772B584402A0:lI114|H772B584402B0 +772B584402B0:lI105|H772B584402C0 +772B584402C0:lI112|H772B584402D0 +772B584402D0:lI116|H772B584402E0 +772B584402E0:lI111|H772B584402F0 +772B584402F0:lI114|H772B58440300 +772B58440300:lI32|H772B58440310 +772B58440310:lI97|H772B58440320 +772B58440320:lI110|H772B58440330 +772B58440330:lI100|H772B58440340 +772B58440340:lI32|H772B58440350 +772B58440350:lI119|H772B58440360 +772B58440360:lI105|H772B58440370 +772B58440370:lI108|H772B58440380 +772B58440380:lI108|H772B58440390 +772B58440390:lI32|H772B584403A0 +772B584403A0:lI98|H772B584403B0 +772B584403B0:lI101|H772B584403C0 +772B584403C0:lI32|H772B584403D0 +772B584403D0:lI98|H772B584403E0 +772B584403E0:lI108|H772B584403F0 +772B584403F0:lI111|H772B58440400 +772B58440400:lI99|H772B58440410 +772B58440410:lI107|H772B58440420 +772B58440420:lI101|H772B58440430 +772B58440430:lI100|H772B58440440 +772B58440440:lI32|H772B58440450 +772B58440450:lI117|H772B58440460 +772B58440460:lI110|H772B58440470 +772B58440470:lI116|H772B58440480 +772B58440480:lI105|H772B58440490 +772B58440490:lI108|H772B584404A0 +772B584404A0:lI32|H772B584404B0 +772B584404B0:lI101|H772B584404C0 +772B584404C0:lI110|H772B584404D0 +772B584404D0:lI100|H772B584404E0 +772B584404E0:lI32|H772B584404F0 +772B584404F0:lI111|H772B58440500 +772B58440500:lI102|H772B58440510 +772B58440510:lI32|H772B58440520 +772B58440520:lI102|H772B58440530 +772B58440530:lI105|H772B58440540 +772B58440540:lI108|H772B58440550 +772B58440550:lI101|H772B58440560 +772B58440560:lI32|H772B58440570 +772B58440570:lI105|H772B58440580 +772B58440580:lI115|H772B58440590 +772B58440590:lI32|H772B584405A0 +772B584405A0:lI114|H772B584405B0 +772B584405B0:lI101|H772B584405C0 +772B584405C0:lI99|H772B584405D0 +772B584405D0:lI101|H772B584405E0 +772B584405E0:lI105|H772B584405F0 +772B584405F0:lI118|H772B58440600 +772B58440600:lI101|H772B58440610 +772B58440610:lI100|H772B58440620 +772B58440620:lI46|N +772B58440630:t3:A4:line,A4:file,A3:mfa +772B58440650:Mf3:H772B58440630:I2090,H772B58440680,H772B58440820 +772B58440680:lI97|H772B58440690 +772B58440690:lI112|H772B584406A0 +772B584406A0:lI112|H772B584406B0 +772B584406B0:lI108|H772B584406C0 +772B584406C0:lI105|H772B584406D0 +772B584406D0:lI99|H772B584406E0 +772B584406E0:lI97|H772B584406F0 +772B584406F0:lI116|H772B58440700 +772B58440700:lI105|H772B58440710 +772B58440710:lI111|H772B58440720 +772B58440720:lI110|H772B58440730 +772B58440730:lI95|H772B58440740 +772B58440740:lI99|H772B58440750 +772B58440750:lI111|H772B58440760 +772B58440760:lI110|H772B58440770 +772B58440770:lI116|H772B58440780 +772B58440780:lI114|H772B58440790 +772B58440790:lI111|H772B584407A0 +772B584407A0:lI108|H772B584407B0 +772B584407B0:lI108|H772B584407C0 +772B584407C0:lI101|H772B584407D0 +772B584407D0:lI114|H772B584407E0 +772B584407E0:lI46|H772B584407F0 +772B584407F0:lI101|H772B58440800 +772B58440800:lI114|H772B58440810 +772B58440810:lI108|N +772B58440820:t3:A16:application_controller,A1B:read_fd_until_end_and_close,I3 +772B58440840:lA4:read|N +772B58440850:lI73|H772B58440860 +772B58440860:lI110|H772B58440870 +772B58440870:lI118|H772B58440880 +772B58440880:lI97|H772B58440890 +772B58440890:lI108|H772B584408A0 +772B584408A0:lI105|H772B584408B0 +772B584408B0:lI100|H772B584408C0 +772B584408C0:lI32|H772B584408D0 +772B584408D0:lI102|H772B584408E0 +772B584408E0:lI105|H772B584408F0 +772B584408F0:lI108|H772B58440900 +772B58440900:lI101|H772B58440910 +772B58440910:lI32|H772B58440920 +772B58440920:lI100|H772B58440930 +772B58440930:lI101|H772B58440940 +772B58440940:lI115|H772B58440950 +772B58440950:lI99|H772B58440960 +772B58440960:lI114|H772B58440970 +772B58440970:lI105|H772B58440980 +772B58440980:lI112|H772B58440990 +772B58440990:lI116|H772B584409A0 +772B584409A0:lI111|H772B584409B0 +772B584409B0:lI114|N +772B584409C0:lI134217728|N +772B584409D0:lI77|H772B584409E0 +772B584409E0:lI97|H772B584409F0 +772B584409F0:lI120|H772B58440A00 +772B58440A00:lI32|H772B58440A10 +772B58440A10:lI115|H772B58440A20 +772B58440A20:lI105|H772B58440A30 +772B58440A30:lI122|H772B58440A40 +772B58440A40:lI101|H772B58440A50 +772B58440A50:lI32|H772B58440A60 +772B58440A60:lI126|H772B58440A70 +772B58440A70:lI119|H772B58440A80 +772B58440A80:lI32|H772B58440A90 +772B58440A90:lI98|H772B58440AA0 +772B58440AA0:lI121|H772B58440AB0 +772B58440AB0:lI116|H772B58440AC0 +772B58440AC0:lI101|H772B58440AD0 +772B58440AD0:lI115|H772B58440AE0 +772B58440AE0:lI32|H772B58440AF0 +772B58440AF0:lI101|H772B58440B00 +772B58440B00:lI120|H772B58440B10 +772B58440B10:lI99|H772B58440B20 +772B58440B20:lI101|H772B58440B30 +772B58440B30:lI101|H772B58440B40 +772B58440B40:lI100|H772B58440B50 +772B58440B50:lI101|H772B58440B60 +772B58440B60:lI100|N +772B58440B70:lI48|H772B58440B80 +772B58440B80:lI49|H772B58440B90 +772B58440B90:lI50|H772B58440BA0 +772B58440BA0:lI51|H772B58440BB0 +772B58440BB0:lI52|H772B58440BC0 +772B58440BC0:lI53|H772B58440BD0 +772B58440BD0:lI54|H772B58440BE0 +772B58440BE0:lI55|H772B58440BF0 +772B58440BF0:lI56|H772B58440C00 +772B58440C00:lI57|N +772B58440C10:lI126|H772B58440C20 +772B58440C20:lI116|H772B58440C30 +772B58440C30:lI112|H772B58440C40 +772B58440C40:lI58|H772B58440C50 +772B58440C50:lI32|H772B58440C60 +772B58440C60:lI126|H772B58440C70 +772B58440C70:lI119|H772B58440C80 +772B58440C80:lI58|H772B58440C90 +772B58440C90:lI32|H772B58440CA0 +772B58440CA0:lI126|H772B58440CB0 +772B58440CB0:lI116|H772B58440CC0 +772B58440CC0:lI115|H772B58440CD0 +772B58440CD0:lI126|H772B58440CE0 +772B58440CE0:lI110|N +772B58440CF0:t3:A4:line,A4:file,A3:mfa +772B58440D10:Mf3:H772B58440CF0:I1584,H772B58440D40,H772B58440EE0 +772B58440D40:lI97|H772B58440D50 +772B58440D50:lI112|H772B58440D60 +772B58440D60:lI112|H772B58440D70 +772B58440D70:lI108|H772B58440D80 +772B58440D80:lI105|H772B58440D90 +772B58440D90:lI99|H772B58440DA0 +772B58440DA0:lI97|H772B58440DB0 +772B58440DB0:lI116|H772B58440DC0 +772B58440DC0:lI105|H772B58440DD0 +772B58440DD0:lI111|H772B58440DE0 +772B58440DE0:lI110|H772B58440DF0 +772B58440DF0:lI95|H772B58440E00 +772B58440E00:lI99|H772B58440E10 +772B58440E10:lI111|H772B58440E20 +772B58440E20:lI110|H772B58440E30 +772B58440E30:lI116|H772B58440E40 +772B58440E40:lI114|H772B58440E50 +772B58440E50:lI111|H772B58440E60 +772B58440E60:lI108|H772B58440E70 +772B58440E70:lI108|H772B58440E80 +772B58440E80:lI101|H772B58440E90 +772B58440E90:lI114|H772B58440EA0 +772B58440EA0:lI46|H772B58440EB0 +772B58440EB0:lI101|H772B58440EC0 +772B58440EC0:lI114|H772B58440ED0 +772B58440ED0:lI108|N +772B58440EE0:t3:A16:application_controller,AE:do_change_apps,I3 +772B58440F00:lI108|N +772B58440F10:lI114|H772B58440F00 +772B58440F20:lI101|H772B58440F10 +772B58440F30:lI46|H772B58440F20 +772B58440F40:lI114|H772B58440F30 +772B58440F50:lI101|H772B58440F40 +772B58440F60:lI108|H772B58440F50 +772B58440F70:lI108|H772B58440F60 +772B58440F80:lI111|H772B58440F70 +772B58440F90:lI114|H772B58440F80 +772B58440FA0:lI116|H772B58440F90 +772B58440FB0:lI110|H772B58440FA0 +772B58440FC0:lI111|H772B58440FB0 +772B58440FD0:lI99|H772B58440FC0 +772B58440FE0:lI95|H772B58440FD0 +772B58440FF0:lI110|H772B58440FE0 +772B58441000:lI111|H772B58440FF0 +772B58441010:lI105|H772B58441000 +772B58441020:lI116|H772B58441010 +772B58441030:lI97|H772B58441020 +772B58441040:lI99|H772B58441030 +772B58441050:lI105|H772B58441040 +772B58441060:lI108|H772B58441050 +772B58441070:lI112|H772B58441060 +772B58441080:lI112|H772B58441070 +772B58441090:lI97|H772B58441080 +772B584410A0:Rf772B582CDC18 +772B584410B8:E5A:g3AAAABYAYbH94nsQylk79YFSD2+Jx0AAAABAAAAAHcWYXBwbGljYXRpb25fY29udHJvbGxlcmEBYgQ2P7xYdw1ub25vZGVAbm9ob3N0AAAAAAAAAAAAAAAA +772B584410D0:Rf772B582CDC90 +772B584410E8:Rf772B582CDD08 +772B58441100:Rf772B582CDD80 +772B58441118:E5A:g3AAAABYAobH94nsQylk79YFSD2+Jx0AAAAEAAAAAHcWYXBwbGljYXRpb25fY29udHJvbGxlcmEEYgQ2P7xYdw1ub25vZGVAbm9ob3N0AAAAAAAAAAAAAAAA +772B58441130:Rf772B582CDDF8 +772B58441148:E5A:g3AAAABYAYbH94nsQylk79YFSD2+Jx0AAAAFAAAAAHcWYXBwbGljYXRpb25fY29udHJvbGxlcmEFYgQ2P7xYdw1ub25vZGVAbm9ob3N0AAAAAAAAAAAAAAAA +772B58441160:Rf772B582CDE70 +772B58441178:E5A:g3AAAABYAYbH94nsQylk79YFSD2+Jx0AAAAGAAAAAHcWYXBwbGljYXRpb25fY29udHJvbGxlcmEGYgQ2P7xYdw1ub25vZGVAbm9ob3N0AAAAAAAAAAAAAAAA +772B58441190:Rf772B582CDEE8 +772B584411A8:Rf772B582CDF60 +772B584411C0:E5A:g3AAAABYAobH94nsQylk79YFSD2+Jx0AAAAIAAAAAHcWYXBwbGljYXRpb25fY29udHJvbGxlcmEIYgQ2P7xYdw1ub25vZGVAbm9ob3N0AAAAAAAAAAAAAAAA +772B584411D8:Rf772B582CDFD8 +772B584411F0:E5A:g3AAAABYAobH94nsQylk79YFSD2+Jx0AAAAJAAAAAHcWYXBwbGljYXRpb25fY29udHJvbGxlcmEJYgQ2P7xYdw1ub25vZGVAbm9ob3N0AAAAAAAAAAAAAAAA +772B58441208:Rf772B582CE050 +772B58441220:Rf772B582CE0C8 +772B58441238:E5A:g3AAAABYAYbH94nsQylk79YFSD2+Jx0AAAALAAAAAHcWYXBwbGljYXRpb25fY29udHJvbGxlcmELYgQ2P7xYdw1ub25vZGVAbm9ob3N0AAAAAAAAAAAAAAAA +772B58441250:Rf772B582CE140 +772B58441268:E5A:g3AAAABYAYbH94nsQylk79YFSD2+Jx0AAAAMAAAAAHcWYXBwbGljYXRpb25fY29udHJvbGxlcmEMYgQ2P7xYdw1ub25vZGVAbm9ob3N0AAAAAAAAAAAAAAAA +772B58441280:Rf772B582CE1B8 +772B58441298:Rf772B582CE230 +772B584412B0:E5A:g3AAAABYAobH94nsQylk79YFSD2+Jx0AAAAOAAAAAHcWYXBwbGljYXRpb25fY29udHJvbGxlcmEOYgQ2P7xYdw1ub25vZGVAbm9ob3N0AAAAAAAAAAAAAAAA +772B584412C8:Rf772B582CE2A8 +772B584412E0:Rf772B582CE320 +772B584412F8:E5A:g3AAAABYAobH94nsQylk79YFSD2+Jx0AAAAQAAAAAHcWYXBwbGljYXRpb25fY29udHJvbGxlcmEQYgQ2P7xYdw1ub25vZGVAbm9ob3N0AAAAAAAAAAAAAAAA +772B58441310:Rf772B582CE398 +772B58441328:E5A:g3AAAABYAYbH94nsQylk79YFSD2+Jx0AAAARAAAAAHcWYXBwbGljYXRpb25fY29udHJvbGxlcmERYgQ2P7xYdw1ub25vZGVAbm9ob3N0AAAAAAAAAAAAAAAA +772B58441340:Rf772B582CE410 +772B58441358:E5A:g3AAAABYAYbH94nsQylk79YFSD2+Jx0AAAASAAAAAHcWYXBwbGljYXRpb25fY29udHJvbGxlcmESYgQ2P7xYdw1ub25vZGVAbm9ob3N0AAAAAAAAAAAAAAAA +772B58441370:Rf772B582CE488 +772B58441388:E5A:g3AAAABYAobH94nsQylk79YFSD2+Jx0AAAATAAAAAHcWYXBwbGljYXRpb25fY29udHJvbGxlcmETYgQ2P7xYdw1ub25vZGVAbm9ob3N0AAAAAAAAAAAAAAAA +772B584413A0:Rf772B582CE500 +772B584413B8:Rf772B582CE578 +772B584413D0:Rf772B582CE5F0 +772B584413E8:t2:A5:label,A6:report +772B58441400:t4:AB:chars_limit,A5:depth,AB:single_line,A8:encoding +772B58441428:Rf772B582CE668 +772B58446D50:lA5:flush|N +772B58446D60:t2:A5:error,A7:timeout +772B58446D78:lA4:link|H772B58446D88 +772B58446D88:lA7:monitor|N +772B58446D98:lI65|H772B58446DA8 +772B58446DA8:lI114|H772B58446DB8 +772B58446DB8:lI103|H772B58446DC8 +772B58446DC8:lI117|H772B58446DD8 +772B58446DD8:lI109|H772B58446DE8 +772B58446DE8:lI101|H772B58446DF8 +772B58446DF8:lI110|H772B58446E08 +772B58446E08:lI116|H772B58446E18 +772B58446E18:lI95|H772B58446E28 +772B58446E28:lI95|N +772B58446E38:t3:A8:proc_lib,A6:init_p,I5 +772B58446E58:t2:AA:dictionary,AE:$process_label +772B58446E70:t2:AA:dictionary,AD:$initial_call +772B58446E88:t3:A9:gen_event,A7:init_it,I6 +772B58446EA8:Mf0:H772B58410188: +772B58446EC0:t2:A8:proc_lib,A5:crash +772B58446ED8:t4:AC:error_logger,A6:domain,A10:logger_formatter,A9:report_cb +772B58446F00:Mf4:H772B58446ED8:H772B58446F70,H772B58446F38,H772B58446FA8,H772B584140F0 +772B58446F38:lA3:otp|H772B58446F48 +772B58446F48:lA4:sasl|N +772B58446F58:t2:A3:tag,A4:type +772B58446F70:Mf2:H772B58446F58:AC:error_report,AC:crash_report +772B58446F98:t1:A5:title +772B58446FA8:Mf1:H772B58446F98:H772B58446FC8 +772B58446FC8:lI67|H772B58446FD8 +772B58446FD8:lI82|H772B58446FE8 +772B58446FE8:lI65|H772B58446FF8 +772B58446FF8:lI83|H772B58447008 +772B58447008:lI72|H772B58447018 +772B58447018:lI32|H772B58447028 +772B58447028:lI82|H772B58447038 +772B58447038:lI69|H772B58447048 +772B58447048:lI80|H772B58447058 +772B58447058:lI79|H772B58447068 +772B58447068:lI82|H772B58447078 +772B58447078:lI84|N +772B58447088:t3:A4:line,A4:file,A3:mfa +772B584470A8:Mf3:H772B58447088:I950,H772B584470D8,H772B58447198 +772B584470D8:lI112|H772B584470E8 +772B584470E8:lI114|H772B584470F8 +772B584470F8:lI111|H772B58447108 +772B58447108:lI99|H772B58447118 +772B58447118:lI95|H772B58447128 +772B58447128:lI108|H772B58447138 +772B58447138:lI105|H772B58447148 +772B58447148:lI98|H772B58447158 +772B58447158:lI46|H772B58447168 +772B58447168:lI101|H772B58447178 +772B58447178:lI114|H772B58447188 +772B58447188:lI108|N +772B58447198:t3:A8:proc_lib,AC:crash_report,I4 +772B584471B8:lAF:registered_name|H772B584471C8 +772B584471C8:lAA:dictionary|H772B584471D8 +772B584471D8:lA11:message_queue_len|H772B584471E8 +772B584471E8:lA5:links|H772B584471F8 +772B584471F8:lA9:trap_exit|H772B58447208 +772B58447208:lA6:status|H772B58447218 +772B58447218:lA9:heap_size|H772B58447228 +772B58447228:lAA:stack_size|H772B58447238 +772B58447238:lAA:reductions|N +772B58447248:lAF:registered_name|H772B58447258 +772B58447258:lAC:initial_call|H772B58447268 +772B58447268:lA10:current_function|H772B58447278 +772B58447278:lA11:message_queue_len|H772B58447288 +772B58447288:lA5:links|H772B58447298 +772B58447298:lA9:trap_exit|H772B584472A8 +772B584472A8:lA6:status|H772B584472B8 +772B584472B8:lA9:heap_size|H772B584472C8 +772B584472C8:lAA:stack_size|H772B584472D8 +772B584472D8:lAA:reductions|H772B584472E8 +772B584472E8:lA12:current_stacktrace|N +772B584472F8:lH772B58447328|H772B58447308 +772B58447308:lH772B58447340|H772B58447318 +772B58447318:lH772B58447358|N +772B58447328:t2:AA:dictionary,AE:$process_label +772B58447340:t2:AA:dictionary,AD:$initial_call +772B58447358:t2:AA:dictionary,AA:$ancestors +772B58447370:t2:A9:trap_exit,A5:false +772B58447388:t4:AB:chars_limit,A5:depth,AB:single_line,A8:encoding +772B584473B0:Mf4:H772B58447388:A9:unlimited,A9:unlimited,A5:false,A4:utf8 +772B584473E8:lI32|H772B584473F8 +772B584473F8:lI32|N +772B58447408:lI32|N +772B58447418:lI126|H772B58447428 +772B58447428:lI116|H772B58447438 +772B58447438:lI115|N +772B58447448:lI126|H772B58447458 +772B58447458:lI115|H772B58447468 +772B58447468:lI99|H772B58447478 +772B58447478:lI114|H772B58447488 +772B58447488:lI97|H772B58447498 +772B58447498:lI115|H772B584474A8 +772B584474A8:lI104|H772B584474B8 +772B584474B8:lI101|H772B584474C8 +772B584474C8:lI114|H772B584474D8 +772B584474D8:lI58|N +772B584474E8:lI48|N +772B584474F8:lI110|H772B58447508 +772B58447508:lI101|H772B58447518 +772B58447518:lI105|H772B58447528 +772B58447528:lI103|H772B58447538 +772B58447538:lI104|H772B58447548 +772B58447548:lI98|H772B58447558 +772B58447558:lI111|H772B58447568 +772B58447568:lI117|H772B58447578 +772B58447578:lI114|H772B58447588 +772B58447588:lI115|H772B58447598 +772B58447598:lI58|H772B584475A8 +772B584475A8:lI32|H772B584475B8 +772B584475B8:lI126|N +772B584475C8:lI110|H772B584475D8 +772B584475D8:lI101|H772B584475E8 +772B584475E8:lI105|H772B584475F8 +772B584475F8:lI103|H772B58447608 +772B58447608:lI104|H772B58447618 +772B58447618:lI98|H772B58447628 +772B58447628:lI111|H772B58447638 +772B58447638:lI117|H772B58447648 +772B58447648:lI114|H772B58447658 +772B58447658:lI115|H772B58447668 +772B58447668:lI58|N +772B58447678:lI110|H772B58447688 +772B58447688:lI101|H772B58447698 +772B58447698:lI105|H772B584476A8 +772B584476A8:lI103|H772B584476B8 +772B584476B8:lI104|H772B584476C8 +772B584476C8:lI98|H772B584476D8 +772B584476D8:lI111|H772B584476E8 +772B584476E8:lI117|H772B584476F8 +772B584476F8:lI114|H772B58447708 +772B58447708:lI58|N +772B58447718:lI58|H772B58447728 +772B58447728:lI32|N +772B58447738:lI32|H772B58447748 +772B58447748:lI32|H772B58447758 +772B58447758:lI32|H772B58447768 +772B58447768:lI32|N +772B58447778:lI105|H772B58447788 +772B58447788:lI110|H772B58447798 +772B58447798:lI105|H772B584477A8 +772B584477A8:lI116|H772B584477B8 +772B584477B8:lI105|H772B584477C8 +772B584477C8:lI97|H772B584477D8 +772B584477D8:lI108|H772B584477E8 +772B584477E8:lI32|H772B584477F8 +772B584477F8:lI99|H772B58447808 +772B58447808:lI97|H772B58447818 +772B58447818:lI108|H772B58447828 +772B58447828:lI108|H772B58447838 +772B58447838:lI58|H772B58447848 +772B58447848:lI32|N +772B58447858:lI112|N +772B58447868:lI80|N +772B58447878:lI59|H772B58447888 +772B58447888:lI32|N +772B58447898:lI44|H772B584478A8 +772B584478A8:lI32|N +772B584478B8:lI116|N +772B584478C8:lI10|N +772B584478D8:lI108|N +772B584478E8:lI114|H772B584478D8 +772B584478F8:lI101|H772B584478E8 +772B58447908:lI46|H772B584478F8 +772B58447918:lI98|H772B58447908 +772B58447928:lI105|H772B58447918 +772B58447938:lI108|H772B58447928 +772B58447948:lI95|H772B58447938 +772B58447958:lI99|H772B58447948 +772B58447968:lI111|H772B58447958 +772B58447978:lI114|H772B58447968 +772B58447988:lI112|H772B58447978 +772B58447998:t2:A5:label,A6:report +772B584479B0:t4:AB:chars_limit,A5:depth,AB:single_line,A8:encoding +772B584479D8:E4C:g3AAAABKAbbcn6epZQgFSPEcH93t5icAAAAAAAAAAHcIcHJvY19saWJhAGIFtuT9WHcNbm9ub2RlQG5vaG9zdAAAAAAAAAAAAAAAAA== +772B584479F0:Rf772B582C61C0 +772B58447A08:E4C:g3AAAABKA7bcn6epZQgFSPEcH93t5icAAAABAAAAAHcIcHJvY19saWJhAWIFtuT9WHcNbm9ub2RlQG5vaG9zdAAAAAAAAAAAAAAAAA== +772B58447A20:Rf772B582C6238 +772B58447A38:Rf772B582C62B0 +772B58459CD8:t6:A2:id,A7:restart,A8:shutdown,A5:start,A4:type,A7:modules +772B58459D10:Mf6:H772B58459CD8:AC:logger_proxy,A9:temporary,I2000,H772B58459D68,A6:worker,H772B58459D58 +772B58459D58:lAC:logger_proxy|N +772B58459D68:t3:AC:logger_proxy,AA:start_link,N +772B58459D88:t2:A2:ok,A8:no_state +772B58459DA0:lA9:nosuspend|N +772B58459DB0:t2:A2:ok,H772B58417F30 +772B58459DC8:lI126|H772B58459DD8 +772B58459DD8:lI119|H772B58459DE8 +772B58459DE8:lI32|H772B58459DF8 +772B58459DF8:lI115|H772B58459E08 +772B58459E08:lI119|H772B58459E18 +772B58459E18:lI105|H772B58459E28 +772B58459E28:lI116|H772B58459E38 +772B58459E38:lI99|H772B58459E48 +772B58459E48:lI104|H772B58459E58 +772B58459E58:lI101|H772B58459E68 +772B58459E68:lI100|H772B58459E78 +772B58459E78:lI32|H772B58459E88 +772B58459E88:lI102|H772B58459E98 +772B58459E98:lI114|H772B58459EA8 +772B58459EA8:lI111|H772B58459EB8 +772B58459EB8:lI109|H772B58459EC8 +772B58459EC8:lI32|H772B58459ED8 +772B58459ED8:lI126|H772B58459EE8 +772B58459EE8:lI119|H772B58459EF8 +772B58459EF8:lI32|H772B58459F08 +772B58459F08:lI116|H772B58459F18 +772B58459F18:lI111|H772B58459F28 +772B58459F28:lI32|H772B58459F38 +772B58459F38:lI126|H772B58459F48 +772B58459F48:lI119|H772B58459F58 +772B58459F58:lI32|H772B58459F68 +772B58459F68:lI109|H772B58459F78 +772B58459F78:lI111|H772B58459F88 +772B58459F88:lI100|H772B58459F98 +772B58459F98:lI101|N +772B58459FA8:t3:A4:line,A4:file,A3:mfa +772B58459FC8:Mf3:H772B58459FA8:I159,H772B58459FF8,H772B5845A0F8 +772B58459FF8:lI108|H772B5845A008 +772B5845A008:lI111|H772B5845A018 +772B5845A018:lI103|H772B5845A028 +772B5845A028:lI103|H772B5845A038 +772B5845A038:lI101|H772B5845A048 +772B5845A048:lI114|H772B5845A058 +772B5845A058:lI95|H772B5845A068 +772B5845A068:lI112|H772B5845A078 +772B5845A078:lI114|H772B5845A088 +772B5845A088:lI111|H772B5845A098 +772B5845A098:lI120|H772B5845A0A8 +772B5845A0A8:lI121|H772B5845A0B8 +772B5845A0B8:lI46|H772B5845A0C8 +772B5845A0C8:lI101|H772B5845A0D8 +772B5845A0D8:lI114|H772B5845A0E8 +772B5845A0E8:lI108|N +772B5845A0F8:t3:AC:logger_proxy,A6:notify,I2 +772B5845A118:Mf0:H772B58410188: +772B5845A130:lI126|H772B5845A140 +772B5845A140:lI119|H772B5845A150 +772B5845A150:lI32|H772B5845A160 +772B5845A160:lI102|H772B5845A170 +772B5845A170:lI108|H772B5845A180 +772B5845A180:lI117|H772B5845A190 +772B5845A190:lI115|H772B5845A1A0 +772B5845A1A0:lI104|H772B5845A1B0 +772B5845A1B0:lI101|H772B5845A1C0 +772B5845A1C0:lI100|H772B5845A1D0 +772B5845A1D0:lI32|H772B5845A1E0 +772B5845A1E0:lI126|H772B5845A1F0 +772B5845A1F0:lI119|H772B5845A200 +772B5845A200:lI32|H772B5845A210 +772B5845A210:lI108|H772B5845A220 +772B5845A220:lI111|H772B5845A230 +772B5845A230:lI103|H772B5845A240 +772B5845A240:lI32|H772B5845A250 +772B5845A250:lI101|H772B5845A260 +772B5845A260:lI118|H772B5845A270 +772B5845A270:lI101|H772B5845A280 +772B5845A280:lI110|H772B5845A290 +772B5845A290:lI116|H772B5845A2A0 +772B5845A2A0:lI115|N +772B5845A2B0:t3:A4:line,A4:file,A3:mfa +772B5845A2D0:Mf3:H772B5845A2B0:I162,H772B5845A300,H772B5845A400 +772B5845A300:lI108|H772B5845A310 +772B5845A310:lI111|H772B5845A320 +772B5845A320:lI103|H772B5845A330 +772B5845A330:lI103|H772B5845A340 +772B5845A340:lI101|H772B5845A350 +772B5845A350:lI114|H772B5845A360 +772B5845A360:lI95|H772B5845A370 +772B5845A370:lI112|H772B5845A380 +772B5845A380:lI114|H772B5845A390 +772B5845A390:lI111|H772B5845A3A0 +772B5845A3A0:lI120|H772B5845A3B0 +772B5845A3B0:lI121|H772B5845A3C0 +772B5845A3C0:lI46|H772B5845A3D0 +772B5845A3D0:lI101|H772B5845A3E0 +772B5845A3E0:lI114|H772B5845A3F0 +772B5845A3F0:lI108|N +772B5845A400:t3:AC:logger_proxy,A6:notify,I2 +772B5845A420:t3:A4:line,A4:file,A3:mfa +772B5845A440:Mf3:H772B5845A420:I165,H772B5845A470,H772B5845A570 +772B5845A470:lI108|H772B5845A480 +772B5845A480:lI111|H772B5845A490 +772B5845A490:lI103|H772B5845A4A0 +772B5845A4A0:lI103|H772B5845A4B0 +772B5845A4B0:lI101|H772B5845A4C0 +772B5845A4C0:lI114|H772B5845A4D0 +772B5845A4D0:lI95|H772B5845A4E0 +772B5845A4E0:lI112|H772B5845A4F0 +772B5845A4F0:lI114|H772B5845A500 +772B5845A500:lI111|H772B5845A510 +772B5845A510:lI120|H772B5845A520 +772B5845A520:lI121|H772B5845A530 +772B5845A530:lI46|H772B5845A540 +772B5845A540:lI101|H772B5845A550 +772B5845A550:lI114|H772B5845A560 +772B5845A560:lI108|N +772B5845A570:t3:AC:logger_proxy,A6:notify,I2 +772B5845A590:lH772B5845A5B0|H772B5845A5A0 +772B5845A5A0:lH772B5845A670|N +772B5845A5B0:lI126|H772B5845A5C0 +772B5845A5C0:lI119|H772B5845A5D0 +772B5845A5D0:lI32|H772B5845A5E0 +772B5845A5E0:lI114|H772B5845A5F0 +772B5845A5F0:lI101|H772B5845A600 +772B5845A600:lI115|H772B5845A610 +772B5845A610:lI116|H772B5845A620 +772B5845A620:lI97|H772B5845A630 +772B5845A630:lI114|H772B5845A640 +772B5845A640:lI116|H772B5845A650 +772B5845A650:lI101|H772B5845A660 +772B5845A660:lI100|N +772B5845A670:lAC:logger_proxy|N +772B5845A680:t2:AC:logger_proxy,AA:log_failed +772B5845A698:t3:A4:line,A4:file,A3:mfa +772B5845A6B8:Mf3:H772B5845A698:I175,H772B5845A6E8,H772B5845A7E8 +772B5845A6E8:lI108|H772B5845A6F8 +772B5845A6F8:lI111|H772B5845A708 +772B5845A708:lI103|H772B5845A718 +772B5845A718:lI103|H772B5845A728 +772B5845A728:lI101|H772B5845A738 +772B5845A738:lI114|H772B5845A748 +772B5845A748:lI95|H772B5845A758 +772B5845A758:lI112|H772B5845A768 +772B5845A768:lI114|H772B5845A778 +772B5845A778:lI111|H772B5845A788 +772B5845A788:lI120|H772B5845A798 +772B5845A798:lI121|H772B5845A7A8 +772B5845A7A8:lI46|H772B5845A7B8 +772B5845A7B8:lI101|H772B5845A7C8 +772B5845A7C8:lI114|H772B5845A7D8 +772B5845A7D8:lI108|N +772B5845A7E8:t3:AC:logger_proxy,A7:try_log,I1 +772B5845A808:lI108|N +772B5845A818:lI114|H772B5845A808 +772B5845A828:lI101|H772B5845A818 +772B5845A838:lI46|H772B5845A828 +772B5845A848:lI121|H772B5845A838 +772B5845A858:lI120|H772B5845A848 +772B5845A868:lI111|H772B5845A858 +772B5845A878:lI114|H772B5845A868 +772B5845A888:lI112|H772B5845A878 +772B5845A898:lI95|H772B5845A888 +772B5845A8A8:lI114|H772B5845A898 +772B5845A8B8:lI101|H772B5845A8A8 +772B5845A8C8:lI103|H772B5845A8B8 +772B5845A8D8:lI103|H772B5845A8C8 +772B5845A8E8:lI111|H772B5845A8D8 +772B5845A8F8:lI108|H772B5845A8E8 +772B5845AF00:t2:N,N +772B5845AF18:t2:A5:empty,H772B5845AF30 +772B5845AF30:t2:N,N +772B5845AF48:lH772B5845AF58|N +772B5845AF58:t2:N,N +772B5845AF70:lI108|N +772B5845AF80:lI114|H772B5845AF70 +772B5845AF90:lI101|H772B5845AF80 +772B5845AFA0:lI46|H772B5845AF90 +772B5845AFB0:lI101|H772B5845AFA0 +772B5845AFC0:lI117|H772B5845AFB0 +772B5845AFD0:lI101|H772B5845AFC0 +772B5845AFE0:lI117|H772B5845AFD0 +772B5845AFF0:lI113|H772B5845AFE0 +772B58468C08:t2:A5:local,A12:standard_error_sup +772B58468C20:lA3:out|H772B58468C30 +772B58468C30:lA6:binary|N +772B58468C40:t2:A5:error,AB:no_stderror +772B58468C58:t3:A2:fd,I2,I2 +772B58468C78:lA6:native|N +772B58468C88:t2:A5:error,H772B58468CA0 +772B58468CA0:t2:A5:error,A9:put_chars +772B58468CB8:t2:A2:ok,A2:ok +772B58468CD0:t2:A5:error,H772B58468CE8 +772B58468CE8:t2:A5:error,A7:enotsup +772B58468D00:lA4:none|H772B58468D10 +772B58468D10:lA6:output|H772B58468D20 +772B58468D20:lA5:input|H772B58468D30 +772B58468D30:lA3:all|N +772B58468D40:t2:A8:encoding,A4:utf8 +772B58468D58:t2:A8:encoding,A7:unicode +772B58468D70:t2:A8:encoding,A6:latin1 +772B58468D88:lI13|H772B58468D98 +772B58468D98:lI10|N +772B58468DA8:lI125|N +772B58468DB8:lI92|H772B58468DC8 +772B58468DC8:lI120|H772B58468DD8 +772B58468DD8:lI123|N +772B58468DE8:lI108|N +772B58468DF8:lI114|H772B58468DE8 +772B58468E08:lI101|H772B58468DF8 +772B58468E18:lI46|H772B58468E08 +772B58468E28:lI114|H772B58468E18 +772B58468E38:lI111|H772B58468E28 +772B58468E48:lI114|H772B58468E38 +772B58468E58:lI114|H772B58468E48 +772B58468E68:lI101|H772B58468E58 +772B58468E78:lI95|H772B58468E68 +772B58468E88:lI100|H772B58468E78 +772B58468E98:lI114|H772B58468E88 +772B58468EA8:lI97|H772B58468E98 +772B58468EB8:lI100|H772B58468EA8 +772B58468EC8:lI110|H772B58468EB8 +772B58468ED8:lI97|H772B58468EC8 +772B58468EE8:lI116|H772B58468ED8 +772B58468EF8:lI115|H772B58468EE8 +772B58468F08:Rf772B4C0F26B0 +772B58468F20:E52:g3AAAABQAVDqnhHlFWRbO/AH5YdPPTsAAAABAAAAAHcOc3RhbmRhcmRfZXJyb3JhAWICh1TwWHcNbm9ub2RlQG5vaG9zdAAAAAAAAAAAAAAAAA== +772B58468F38:Rf772B4C0F2728 +772B58471990:lH772B584719A0|N +772B584719A0:t2:A9:spawn_opt,H772B584719B8 +772B584719B8:lH772B584719C8|N +772B584719C8:t2:A12:message_queue_data,A8:off_heap +772B584719E0:t2:A5:local,A3:rex +772B584719F8:Mf0:H772B58410188: +772B58471A10:t2:A6:badrpc,H772B58471A28 +772B58471A28:t2:A4:EXIT,AC:system_limit +772B58471A40:lA4:erpc|N +772B58471A50:t2:A6:badrpc,A7:timeout +772B58471A68:t2:A6:badrpc,A6:notsup +772B58471A80:t2:A6:badrpc,A8:nodedown +772B58471A98:t2:A5:error,A8:nodedown +772B58471AB0:lA5:flush|N +772B58471AC0:t2:A4:erpc,A6:badarg +772B58471AD8:t2:A5:error,A7:enotsup +772B58471AF0:t2:A5:error,A7:request +772B58471B08:lH772B58471B28|H772B58471B18 +772B58471B18:lA9:protected|N +772B58471B28:t2:A10:read_concurrency,A4:true +772B58471B40:lI108|N +772B58471B50:lI114|H772B58471B40 +772B58471B60:lI101|H772B58471B50 +772B58471B70:lI46|H772B58471B60 +772B58471B80:lI99|H772B58471B70 +772B58471B90:lI112|H772B58471B80 +772B58471BA0:lI114|H772B58471B90 +772B58471BB0:t1:AE:nodes_observer +772B58471BC0:Rf772B45ABDC10 +772B58471BD8:Rf772B45ABDC88 +772B58471BF0:E47:g3AAAABFAKnsZNgVf914H+eSIyeqy+sAAAACAAAAAHcDcnBjYQJiBU9jJlh3DW5vbm9kZUBub2hvc3QAAAAAAAAAAAAAAAA= +772B58471C08:Rf772B45ABDD00 +772B58471C20:E47:g3AAAABFAKnsZNgVf914H+eSIyeqy+sAAAADAAAAAHcDcnBjYQNiBU9jJlh3DW5vbm9kZUBub2hvc3QAAAAAAAAAAAAAAAA= +772B58471C38:Rf772B45ABDD78 +772B58471C50:Rf772B45ABDDF0 +772B58471C68:Rf772B45ABDE68 +772B58471C80:Rf772B45ABDEE0 +772B58471C98:E47:g3AAAABFAansZNgVf914H+eSIyeqy+sAAAAHAAAAAHcDcnBjYQdiBU9jJlh3DW5vbm9kZUBub2hvc3QAAAAAAAAAAAAAAAA= +772B58471CB0:Rf772B45ABDF58 +772B58475DD8:t2:A5:local,A12:global_name_server +772B58475DF0:t2:A2:ok,A5:allow +772B58475E08:lI103|H772B58475E18 +772B58475E18:lI108|H772B58475E28 +772B58475E28:lI111|H772B58475E38 +772B58475E38:lI98|H772B58475E48 +772B58475E48:lI97|H772B58475E58 +772B58475E58:lI108|H772B58475E68 +772B58475E68:lI58|H772B58475E78 +772B58475E78:lI32|H772B58475E88 +772B58475E88:lI126|H772B58475E98 +772B58475E98:lI119|H772B58475EA8 +772B58475EA8:lI32|H772B58475EB8 +772B58475EB8:lI114|H772B58475EC8 +772B58475EC8:lI101|H772B58475ED8 +772B58475ED8:lI103|H772B58475EE8 +772B58475EE8:lI105|H772B58475EF8 +772B58475EF8:lI115|H772B58475F08 +772B58475F08:lI116|H772B58475F18 +772B58475F18:lI101|H772B58475F28 +772B58475F28:lI114|H772B58475F38 +772B58475F38:lI101|H772B58475F48 +772B58475F48:lI100|H772B58475F58 +772B58475F58:lI32|H772B58475F68 +772B58475F68:lI117|H772B58475F78 +772B58475F78:lI110|H772B58475F88 +772B58475F88:lI100|H772B58475F98 +772B58475F98:lI101|H772B58475FA8 +772B58475FA8:lI114|H772B58475FB8 +772B58475FB8:lI32|H772B58475FC8 +772B58475FC8:lI115|H772B58475FD8 +772B58475FD8:lI101|H772B58475FE8 +772B58475FE8:lI118|H772B58475FF8 +772B58475FF8:lI101|H772B58476008 +772B58476008:lI114|H772B58476018 +772B58476018:lI97|H772B58476028 +772B58476028:lI108|H772B58476038 +772B58476038:lI32|H772B58476048 +772B58476048:lI110|H772B58476058 +772B58476058:lI97|H772B58476068 +772B58476068:lI109|H772B58476078 +772B58476078:lI101|H772B58476088 +772B58476088:lI115|H772B58476098 +772B58476098:lI58|H772B584760A8 +772B584760A8:lI32|H772B584760B8 +772B584760B8:lI126|H772B584760C8 +772B584760C8:lI116|H772B584760D8 +772B584760D8:lI119|H772B584760E8 +772B584760E8:lI10|N +772B584760F8:lH772B58476108|N +772B58476108:t3:H772B58476128,N,H772B58476150 +772B58476128:t4:A2:$1,A2:$2,A2:$3,A2:$4 +772B58476150:lA2:$1|N +772B58476160:t1:AD:connection_id +772B58476170:Mf1:H772B58476160:A4:true +772B58476190:Mf0:H772B58410188: +772B584761A8:lA3:set|H772B584761B8 +772B584761B8:lAB:named_table|H772B584761C8 +772B584761C8:lA9:protected|N +772B584761D8:lA3:set|H772B584761E8 +772B584761E8:lAB:named_table|H772B584761F8 +772B584761F8:lA9:protected|H772B58476208 +772B58476208:lH772B58476218|N +772B58476218:t2:A10:read_concurrency,A4:true +772B58476230:lA3:bag|H772B58476240 +772B58476240:lAB:named_table|H772B58476250 +772B58476250:lA9:protected|N +772B58476260:lI71|H772B58476270 +772B58476270:lI76|H772B58476280 +772B58476280:lI79|H772B58476290 +772B58476290:lI66|H772B584762A0 +772B584762A0:lI65|H772B584762B0 +772B584762B0:lI76|H772B584762C0 +772B584762C0:lI95|H772B584762D0 +772B584762D0:lI72|H772B584762E0 +772B584762E0:lI73|H772B584762F0 +772B584762F0:lI71|H772B58476300 +772B58476300:lI72|H772B58476310 +772B58476310:lI95|H772B58476320 +772B58476320:lI76|H772B58476330 +772B58476330:lI69|H772B58476340 +772B58476340:lI86|H772B58476350 +772B58476350:lI69|H772B58476360 +772B58476360:lI76|H772B58476370 +772B58476370:lI95|H772B58476380 +772B58476380:lI84|H772B58476390 +772B58476390:lI82|H772B584763A0 +772B584763A0:lI65|H772B584763B0 +772B584763B0:lI67|H772B584763C0 +772B584763C0:lI69|N +772B584763D0:lI84|H772B584763E0 +772B584763E0:lI82|H772B584763F0 +772B584763F0:lI85|H772B58476400 +772B58476400:lI69|N +772B58476410:lI102|H772B58476420 +772B58476420:lI97|H772B58476430 +772B58476430:lI108|H772B58476440 +772B58476440:lI115|H772B58476450 +772B58476450:lI101|N +772B58476460:lH772B58476470|N +772B58476470:t2:A7:timeout,A8:infinity +772B58476488:t2:A8:do_trace,A5:false +772B584764A0:t2:A8:do_trace,A4:true +772B584764B8:lI84|H772B584764C8 +772B584764C8:lI104|H772B584764D8 +772B584764D8:lI101|H772B584764E8 +772B584764E8:lI32|H772B584764F8 +772B584764F8:lI103|H772B58476508 +772B58476508:lI108|H772B58476518 +772B58476518:lI111|H772B58476528 +772B58476528:lI98|H772B58476538 +772B58476538:lI97|H772B58476548 +772B58476548:lI108|H772B58476558 +772B58476558:lI95|H772B58476568 +772B58476568:lI110|H772B58476578 +772B58476578:lI97|H772B58476588 +772B58476588:lI109|H772B58476598 +772B58476598:lI101|H772B584765A8 +772B584765A8:lI95|H772B584765B8 +772B584765B8:lI115|H772B584765C8 +772B584765C8:lI101|H772B584765D8 +772B584765D8:lI114|H772B584765E8 +772B584765E8:lI118|H772B584765F8 +772B584765F8:lI101|H772B58476608 +772B58476608:lI114|H772B58476618 +772B58476618:lI32|H772B58476628 +772B58476628:lI114|H772B58476638 +772B58476638:lI101|H772B58476648 +772B58476648:lI99|H772B58476658 +772B58476658:lI101|H772B58476668 +772B58476668:lI105|H772B58476678 +772B58476678:lI118|H772B58476688 +772B58476688:lI101|H772B58476698 +772B58476698:lI100|H772B584766A8 +772B584766A8:lI32|H772B584766B8 +772B584766B8:lI97|H772B584766C8 +772B584766C8:lI110|H772B584766D8 +772B584766D8:lI32|H772B584766E8 +772B584766E8:lI117|H772B584766F8 +772B584766F8:lI110|H772B58476708 +772B58476708:lI101|H772B58476718 +772B58476718:lI120|H772B58476728 +772B58476728:lI112|H772B58476738 +772B58476738:lI101|H772B58476748 +772B58476748:lI99|H772B58476758 +772B58476758:lI116|H772B58476768 +772B58476768:lI101|H772B58476778 +772B58476778:lI100|H772B58476788 +772B58476788:lI32|H772B58476798 +772B58476798:lI109|H772B584767A8 +772B584767A8:lI101|H772B584767B8 +772B584767B8:lI115|H772B584767C8 +772B584767C8:lI115|H772B584767D8 +772B584767D8:lI97|H772B584767E8 +772B584767E8:lI103|H772B584767F8 +772B584767F8:lI101|H772B58476808 +772B58476808:lI58|H772B58476818 +772B58476818:lI10|H772B58476828 +772B58476828:lI104|H772B58476838 +772B58476838:lI97|H772B58476848 +772B58476848:lI110|H772B58476858 +772B58476858:lI100|H772B58476868 +772B58476868:lI108|H772B58476878 +772B58476878:lI101|H772B58476888 +772B58476888:lI95|H772B58476898 +772B58476898:lI99|H772B584768A8 +772B584768A8:lI97|H772B584768B8 +772B584768B8:lI108|H772B584768C8 +772B584768C8:lI108|H772B584768D8 +772B584768D8:lI40|H772B584768E8 +772B584768E8:lI126|H772B584768F8 +772B584768F8:lI116|H772B58476908 +772B58476908:lI112|H772B58476918 +772B58476918:lI44|H772B58476928 +772B58476928:lI32|H772B58476938 +772B58476938:lI126|H772B58476948 +772B58476948:lI116|H772B58476958 +772B58476958:lI112|H772B58476968 +772B58476968:lI44|H772B58476978 +772B58476978:lI32|H772B58476988 +772B58476988:lI95|H772B58476998 +772B58476998:lI41|H772B584769A8 +772B584769A8:lI10|N +772B584769B8:lI73|H772B584769C8 +772B584769C8:lI108|H772B584769D8 +772B584769D8:lI108|H772B584769E8 +772B584769E8:lI101|H772B584769F8 +772B584769F8:lI103|H772B58476A08 +772B58476A08:lI97|H772B58476A18 +772B58476A18:lI108|H772B58476A28 +772B58476A28:lI32|H772B58476A38 +772B58476A38:lI103|H772B58476A48 +772B58476A48:lI108|H772B58476A58 +772B58476A58:lI111|H772B58476A68 +772B58476A68:lI98|H772B58476A78 +772B58476A78:lI97|H772B58476A88 +772B58476A88:lI108|H772B58476A98 +772B58476A98:lI32|H772B58476AA8 +772B58476AA8:lI112|H772B58476AB8 +772B58476AB8:lI114|H772B58476AC8 +772B58476AC8:lI111|H772B58476AD8 +772B58476AD8:lI116|H772B58476AE8 +772B58476AE8:lI111|H772B58476AF8 +772B58476AF8:lI99|H772B58476B08 +772B58476B08:lI111|H772B58476B18 +772B58476B18:lI108|H772B58476B28 +772B58476B28:lI32|H772B58476B38 +772B58476B38:lI118|H772B58476B48 +772B58476B48:lI101|H772B58476B58 +772B58476B58:lI114|H772B58476B68 +772B58476B68:lI115|H772B58476B78 +772B58476B78:lI105|H772B58476B88 +772B58476B88:lI111|H772B58476B98 +772B58476B98:lI110|H772B58476BA8 +772B58476BA8:lI32|H772B58476BB8 +772B58476BB8:lI126|H772B58476BC8 +772B58476BC8:lI112|H772B58476BD8 +772B58476BD8:lI32|H772B58476BE8 +772B58476BE8:lI78|H772B58476BF8 +772B58476BF8:lI111|H772B58476C08 +772B58476C08:lI100|H772B58476C18 +772B58476C18:lI101|H772B58476C28 +772B58476C28:lI58|H772B58476C38 +772B58476C38:lI32|H772B58476C48 +772B58476C48:lI126|H772B58476C58 +772B58476C58:lI112|H772B58476C68 +772B58476C68:lI10|N +772B58476C78:lI84|H772B58476C88 +772B58476C88:lI104|H772B58476C98 +772B58476C98:lI101|H772B58476CA8 +772B58476CA8:lI32|H772B58476CB8 +772B58476CB8:lI103|H772B58476CC8 +772B58476CC8:lI108|H772B58476CD8 +772B58476CD8:lI111|H772B58476CE8 +772B58476CE8:lI98|H772B58476CF8 +772B58476CF8:lI97|H772B58476D08 +772B58476D08:lI108|H772B58476D18 +772B58476D18:lI95|H772B58476D28 +772B58476D28:lI110|H772B58476D38 +772B58476D38:lI97|H772B58476D48 +772B58476D48:lI109|H772B58476D58 +772B58476D58:lI101|H772B58476D68 +772B58476D68:lI95|H772B58476D78 +772B58476D78:lI115|H772B58476D88 +772B58476D88:lI101|H772B58476D98 +772B58476D98:lI114|H772B58476DA8 +772B58476DA8:lI118|H772B58476DB8 +772B58476DB8:lI101|H772B58476DC8 +772B58476DC8:lI114|H772B58476DD8 +772B58476DD8:lI32|H772B58476DE8 +772B58476DE8:lI114|H772B58476DF8 +772B58476DF8:lI101|H772B58476E08 +772B58476E08:lI99|H772B58476E18 +772B58476E18:lI101|H772B58476E28 +772B58476E28:lI105|H772B58476E38 +772B58476E38:lI118|H772B58476E48 +772B58476E48:lI101|H772B58476E58 +772B58476E58:lI100|H772B58476E68 +772B58476E68:lI32|H772B58476E78 +772B58476E78:lI97|H772B58476E88 +772B58476E88:lI110|H772B58476E98 +772B58476E98:lI32|H772B58476EA8 +772B58476EA8:lI117|H772B58476EB8 +772B58476EB8:lI110|H772B58476EC8 +772B58476EC8:lI101|H772B58476ED8 +772B58476ED8:lI120|H772B58476EE8 +772B58476EE8:lI112|H772B58476EF8 +772B58476EF8:lI101|H772B58476F08 +772B58476F08:lI99|H772B58476F18 +772B58476F18:lI116|H772B58476F28 +772B58476F28:lI101|H772B58476F38 +772B58476F38:lI100|H772B58476F48 +772B58476F48:lI32|H772B58476F58 +772B58476F58:lI109|H772B58476F68 +772B58476F68:lI101|H772B58476F78 +772B58476F78:lI115|H772B58476F88 +772B58476F88:lI115|H772B58476F98 +772B58476F98:lI97|H772B58476FA8 +772B58476FA8:lI103|H772B58476FB8 +772B58476FB8:lI101|H772B58476FC8 +772B58476FC8:lI58|H772B58476FD8 +772B58476FD8:lI10|H772B58476FE8 +772B58476FE8:lI104|H772B58476FF8 +772B58476FF8:lI97|H772B58477008 +772B58477008:lI110|H772B58477018 +772B58477018:lI100|H772B58477028 +772B58477028:lI108|H772B58477038 +772B58477038:lI101|H772B58477048 +772B58477048:lI95|H772B58477058 +772B58477058:lI99|H772B58477068 +772B58477068:lI97|H772B58477078 +772B58477078:lI115|H772B58477088 +772B58477088:lI116|H772B58477098 +772B58477098:lI40|H772B584770A8 +772B584770A8:lI126|H772B584770B8 +772B584770B8:lI116|H772B584770C8 +772B584770C8:lI112|H772B584770D8 +772B584770D8:lI44|H772B584770E8 +772B584770E8:lI32|H772B584770F8 +772B584770F8:lI95|H772B58477108 +772B58477108:lI41|H772B58477118 +772B58477118:lI10|N +772B58477128:t3:A4:conf,A4:true,A4:true +772B58477148:lI100|H772B58477158 +772B58477158:lI105|H772B58477168 +772B58477168:lI115|H772B58477178 +772B58477178:lI99|H772B58477188 +772B58477188:lI111|H772B58477198 +772B58477198:lI110|H772B584771A8 +772B584771A8:lI110|H772B584771B8 +772B584771B8:lI101|H772B584771C8 +772B584771C8:lI99|H772B584771D8 +772B584771D8:lI116|H772B584771E8 +772B584771E8:lI101|H772B584771F8 +772B584771F8:lI100|H772B58477208 +772B58477208:lI32|H772B58477218 +772B58477218:lI111|H772B58477228 +772B58477228:lI108|H772B58477238 +772B58477238:lI100|N +772B58477248:lI101|H772B58477258 +772B58477258:lI120|H772B58477268 +772B58477268:lI99|H772B58477278 +772B58477278:lI108|H772B58477288 +772B58477288:lI117|H772B58477298 +772B58477298:lI100|H772B584772A8 +772B584772A8:lI101|H772B584772B8 +772B584772B8:lI100|H772B584772C8 +772B584772C8:lI32|H772B584772D8 +772B584772D8:lI103|H772B584772E8 +772B584772E8:lI108|H772B584772F8 +772B584772F8:lI111|H772B58477308 +772B58477308:lI98|H772B58477318 +772B58477318:lI97|H772B58477328 +772B58477328:lI108|H772B58477338 +772B58477338:lI32|H772B58477348 +772B58477348:lI103|H772B58477358 +772B58477358:lI114|H772B58477368 +772B58477368:lI111|H772B58477378 +772B58477378:lI117|H772B58477388 +772B58477388:lI112|H772B58477398 +772B58477398:lI32|H772B584773A8 +772B584773A8:lI109|H772B584773B8 +772B584773B8:lI101|H772B584773C8 +772B584773C8:lI109|H772B584773D8 +772B584773D8:lI98|H772B584773E8 +772B584773E8:lI101|H772B584773F8 +772B584773F8:lI114|N +772B58477408:lI114|H772B58477418 +772B58477418:lI101|H772B58477428 +772B58477428:lI113|H772B58477438 +772B58477438:lI117|H772B58477448 +772B58477448:lI101|H772B58477458 +772B58477458:lI115|H772B58477468 +772B58477468:lI116|H772B58477478 +772B58477478:lI101|H772B58477488 +772B58477488:lI100|H772B58477498 +772B58477498:lI32|H772B584774A8 +772B584774A8:lI100|H772B584774B8 +772B584774B8:lI105|H772B584774C8 +772B584774C8:lI115|H772B584774D8 +772B584774D8:lI99|H772B584774E8 +772B584774E8:lI111|H772B584774F8 +772B584774F8:lI110|H772B58477508 +772B58477508:lI110|H772B58477518 +772B58477518:lI101|H772B58477528 +772B58477528:lI99|H772B58477538 +772B58477538:lI116|H772B58477548 +772B58477548:lI32|H772B58477558 +772B58477558:lI102|H772B58477568 +772B58477568:lI114|H772B58477578 +772B58477578:lI111|H772B58477588 +772B58477588:lI109|N +772B58477598:lI39|H772B584775A8 +772B584775A8:lI103|H772B584775B8 +772B584775B8:lI108|H772B584775C8 +772B584775C8:lI111|H772B584775D8 +772B584775D8:lI98|H772B584775E8 +772B584775E8:lI97|H772B584775F8 +772B584775F8:lI108|H772B58477608 +772B58477608:lI39|H772B58477618 +772B58477618:lI32|H772B58477628 +772B58477628:lI97|H772B58477638 +772B58477638:lI116|H772B58477648 +772B58477648:lI32|H772B58477658 +772B58477658:lI110|H772B58477668 +772B58477668:lI111|H772B58477678 +772B58477678:lI100|H772B58477688 +772B58477688:lI101|H772B58477698 +772B58477698:lI32|H772B584776A8 +772B584776A8:lI126|H772B584776B8 +772B584776B8:lI112|H772B584776C8 +772B584776C8:lI32|H772B584776D8 +772B584776D8:lI126|H772B584776E8 +772B584776E8:lI115|H772B584776F8 +772B584776F8:lI32|H772B58477708 +772B58477708:lI110|H772B58477718 +772B58477718:lI111|H772B58477728 +772B58477728:lI100|H772B58477738 +772B58477738:lI101|H772B58477748 +772B58477748:lI32|H772B58477758 +772B58477758:lI126|H772B58477768 +772B58477768:lI112|H772B58477778 +772B58477778:lI32|H772B58477788 +772B58477788:lI105|H772B58477798 +772B58477798:lI110|H772B584777A8 +772B584777A8:lI32|H772B584777B8 +772B584777B8:lI111|H772B584777C8 +772B584777C8:lI114|H772B584777D8 +772B584777D8:lI100|H772B584777E8 +772B584777E8:lI101|H772B584777F8 +772B584777F8:lI114|H772B58477808 +772B58477808:lI32|H772B58477818 +772B58477818:lI116|H772B58477828 +772B58477828:lI111|H772B58477838 +772B58477838:lI32|H772B58477848 +772B58477848:lI112|H772B58477858 +772B58477858:lI114|H772B58477868 +772B58477868:lI101|H772B58477878 +772B58477878:lI118|H772B58477888 +772B58477888:lI101|H772B58477898 +772B58477898:lI110|H772B584778A8 +772B584778A8:lI116|H772B584778B8 +772B584778B8:lI32|H772B584778C8 +772B584778C8:lI111|H772B584778D8 +772B584778D8:lI118|H772B584778E8 +772B584778E8:lI101|H772B584778F8 +772B584778F8:lI114|H772B58477908 +772B58477908:lI108|H772B58477918 +772B58477918:lI97|H772B58477928 +772B58477928:lI112|H772B58477938 +772B58477938:lI112|H772B58477948 +772B58477948:lI105|H772B58477958 +772B58477958:lI110|H772B58477968 +772B58477968:lI103|H772B58477978 +772B58477978:lI32|H772B58477988 +772B58477988:lI112|H772B58477998 +772B58477998:lI97|H772B584779A8 +772B584779A8:lI114|H772B584779B8 +772B584779B8:lI116|H772B584779C8 +772B584779C8:lI105|H772B584779D8 +772B584779D8:lI116|H772B584779E8 +772B584779E8:lI105|H772B584779F8 +772B584779F8:lI111|H772B58477A08 +772B58477A08:lI110|H772B58477A18 +772B58477A18:lI115|N +772B58477A28:t3:A4:conf,A5:false,A5:false +772B58477A48:lI100|H772B58477A58 +772B58477A58:lI105|H772B58477A68 +772B58477A68:lI115|H772B58477A78 +772B58477A78:lI99|H772B58477A88 +772B58477A88:lI111|H772B58477A98 +772B58477A98:lI110|H772B58477AA8 +772B58477AA8:lI110|H772B58477AB8 +772B58477AB8:lI101|H772B58477AC8 +772B58477AC8:lI99|H772B58477AD8 +772B58477AD8:lI116|H772B58477AE8 +772B58477AE8:lI101|H772B58477AF8 +772B58477AF8:lI100|N +772B58477B08:lI62|H772B58477B18 +772B58477B18:lI62|H772B58477B28 +772B58477B28:lI62|H772B58477B38 +772B58477B38:lI62|H772B58477B48 +772B58477B48:lI32|H772B58477B58 +772B58477B58:lI126|H772B58477B68 +772B58477B68:lI112|H772B58477B78 +772B58477B78:lI10|N +772B58477B88:lI84|H772B58477B98 +772B58477B98:lI104|H772B58477BA8 +772B58477BA8:lI101|H772B58477BB8 +772B58477BB8:lI32|H772B58477BC8 +772B58477BC8:lI103|H772B58477BD8 +772B58477BD8:lI108|H772B58477BE8 +772B58477BE8:lI111|H772B58477BF8 +772B58477BF8:lI98|H772B58477C08 +772B58477C08:lI97|H772B58477C18 +772B58477C18:lI108|H772B58477C28 +772B58477C28:lI95|H772B58477C38 +772B58477C38:lI110|H772B58477C48 +772B58477C48:lI97|H772B58477C58 +772B58477C58:lI109|H772B58477C68 +772B58477C68:lI101|H772B58477C78 +772B58477C78:lI95|H772B58477C88 +772B58477C88:lI115|H772B58477C98 +772B58477C98:lI101|H772B58477CA8 +772B58477CA8:lI114|H772B58477CB8 +772B58477CB8:lI118|H772B58477CC8 +772B58477CC8:lI101|H772B58477CD8 +772B58477CD8:lI114|H772B58477CE8 +772B58477CE8:lI32|H772B58477CF8 +772B58477CF8:lI114|H772B58477D08 +772B58477D08:lI101|H772B58477D18 +772B58477D18:lI99|H772B58477D28 +772B58477D28:lI101|H772B58477D38 +772B58477D38:lI105|H772B58477D48 +772B58477D48:lI118|H772B58477D58 +772B58477D58:lI101|H772B58477D68 +772B58477D68:lI100|H772B58477D78 +772B58477D78:lI32|H772B58477D88 +772B58477D88:lI97|H772B58477D98 +772B58477D98:lI110|H772B58477DA8 +772B58477DA8:lI32|H772B58477DB8 +772B58477DB8:lI117|H772B58477DC8 +772B58477DC8:lI110|H772B58477DD8 +772B58477DD8:lI101|H772B58477DE8 +772B58477DE8:lI120|H772B58477DF8 +772B58477DF8:lI112|H772B58477E08 +772B58477E08:lI101|H772B58477E18 +772B58477E18:lI99|H772B58477E28 +772B58477E28:lI116|H772B58477E38 +772B58477E38:lI101|H772B58477E48 +772B58477E48:lI100|H772B58477E58 +772B58477E58:lI32|H772B58477E68 +772B58477E68:lI109|H772B58477E78 +772B58477E78:lI101|H772B58477E88 +772B58477E88:lI115|H772B58477E98 +772B58477E98:lI115|H772B58477EA8 +772B58477EA8:lI97|H772B58477EB8 +772B58477EB8:lI103|H772B58477EC8 +772B58477EC8:lI101|H772B58477ED8 +772B58477ED8:lI58|H772B58477EE8 +772B58477EE8:lI10|H772B58477EF8 +772B58477EF8:lI104|H772B58477F08 +772B58477F08:lI97|H772B58477F18 +772B58477F18:lI110|H772B58477F28 +772B58477F28:lI100|H772B58477F38 +772B58477F38:lI108|H772B58477F48 +772B58477F48:lI101|H772B58477F58 +772B58477F58:lI95|H772B58477F68 +772B58477F68:lI105|H772B58477F78 +772B58477F78:lI110|H772B58477F88 +772B58477F88:lI102|H772B58477F98 +772B58477F98:lI111|H772B58477FA8 +772B58477FA8:lI40|H772B58477FB8 +772B58477FB8:lI126|H772B58477FC8 +772B58477FC8:lI116|H772B58477FD8 +772B58477FD8:lI112|H772B58477FE8 +772B58477FE8:lI44|H772B58477FF8 +772B58477FF8:lI32|H772B58478008 +772B58478008:lI95|H772B58478018 +772B58478018:lI41|H772B58478028 +772B58478028:lI10|N +772B58478038:lI39|H772B58478048 +772B58478048:lI103|H772B58478058 +772B58478058:lI108|H772B58478068 +772B58478068:lI111|H772B58478078 +772B58478078:lI98|H772B58478088 +772B58478088:lI97|H772B58478098 +772B58478098:lI108|H772B584780A8 +772B584780A8:lI39|H772B584780B8 +772B584780B8:lI32|H772B584780C8 +772B584780C8:lI97|H772B584780D8 +772B584780D8:lI116|H772B584780E8 +772B584780E8:lI32|H772B584780F8 +772B584780F8:lI110|H772B58478108 +772B58478108:lI111|H772B58478118 +772B58478118:lI100|H772B58478128 +772B58478128:lI101|H772B58478138 +772B58478138:lI32|H772B58478148 +772B58478148:lI126|H772B58478158 +772B58478158:lI112|H772B58478168 +772B58478168:lI32|H772B58478178 +772B58478178:lI103|H772B58478188 +772B58478188:lI111|H772B58478198 +772B58478198:lI116|H772B584781A8 +772B584781A8:lI32|H772B584781B8 +772B584781B8:lI97|H772B584781C8 +772B584781C8:lI110|H772B584781D8 +772B584781D8:lI32|H772B584781E8 +772B584781E8:lI111|H772B584781F8 +772B584781F8:lI117|H772B58478208 +772B58478208:lI116|H772B58478218 +772B58478218:lI32|H772B58478228 +772B58478228:lI111|H772B58478238 +772B58478238:lI102|H772B58478248 +772B58478248:lI32|H772B58478258 +772B58478258:lI115|H772B58478268 +772B58478268:lI121|H772B58478278 +772B58478278:lI110|H772B58478288 +772B58478288:lI99|H772B58478298 +772B58478298:lI32|H772B584782A8 +772B584782A8:lI99|H772B584782B8 +772B584782B8:lI111|H772B584782C8 +772B584782C8:lI110|H772B584782D8 +772B584782D8:lI110|H772B584782E8 +772B584782E8:lI101|H772B584782F8 +772B584782F8:lI99|H772B58478308 +772B58478308:lI116|H772B58478318 +772B58478318:lI105|H772B58478328 +772B58478328:lI111|H772B58478338 +772B58478338:lI110|H772B58478348 +772B58478348:lI32|H772B58478358 +772B58478358:lI97|H772B58478368 +772B58478368:lI116|H772B58478378 +772B58478378:lI116|H772B58478388 +772B58478388:lI101|H772B58478398 +772B58478398:lI109|H772B584783A8 +772B584783A8:lI112|H772B584783B8 +772B584783B8:lI116|H772B584783C8 +772B584783C8:lI32|H772B584783D8 +772B584783D8:lI102|H772B584783E8 +772B584783E8:lI114|H772B584783F8 +772B584783F8:lI111|H772B58478408 +772B58478408:lI109|H772B58478418 +772B58478418:lI32|H772B58478428 +772B58478428:lI111|H772B58478438 +772B58478438:lI108|H772B58478448 +772B58478448:lI100|H772B58478458 +772B58478458:lI32|H772B58478468 +772B58478468:lI118|H772B58478478 +772B58478478:lI101|H772B58478488 +772B58478488:lI114|H772B58478498 +772B58478498:lI115|H772B584784A8 +772B584784A8:lI105|H772B584784B8 +772B584784B8:lI111|H772B584784C8 +772B584784C8:lI110|H772B584784D8 +772B584784D8:lI32|H772B584784E8 +772B584784E8:lI126|H772B584784F8 +772B584784F8:lI112|H772B58478508 +772B58478508:lI32|H772B58478518 +772B58478518:lI110|H772B58478528 +772B58478528:lI111|H772B58478538 +772B58478538:lI100|H772B58478548 +772B58478548:lI101|H772B58478558 +772B58478558:lI32|H772B58478568 +772B58478568:lI126|H772B58478578 +772B58478578:lI112|H772B58478588 +772B58478588:lI46|H772B58478598 +772B58478598:lI32|H772B584785A8 +772B584785A8:lI68|H772B584785B8 +772B584785B8:lI105|H772B584785C8 +772B584785C8:lI115|H772B584785D8 +772B584785D8:lI99|H772B584785E8 +772B584785E8:lI111|H772B584785F8 +772B584785F8:lI110|H772B58478608 +772B58478608:lI110|H772B58478618 +772B58478618:lI101|H772B58478628 +772B58478628:lI99|H772B58478638 +772B58478638:lI116|H772B58478648 +772B58478648:lI105|H772B58478658 +772B58478658:lI110|H772B58478668 +772B58478668:lI103|H772B58478678 +772B58478678:lI32|H772B58478688 +772B58478688:lI102|H772B58478698 +772B58478698:lI114|H772B584786A8 +772B584786A8:lI111|H772B584786B8 +772B584786B8:lI109|H772B584786C8 +772B584786C8:lI32|H772B584786D8 +772B584786D8:lI105|H772B584786E8 +772B584786E8:lI116|H772B584786F8 +772B584786F8:lI46|N +772B58478708:t2:A4:true,N +772B58478720:lA5:flush|N +772B58478730:lA15:allow_passive_connect|N +772B58478740:lI39|H772B58478750 +772B58478750:lI103|H772B58478760 +772B58478760:lI108|H772B58478770 +772B58478770:lI111|H772B58478780 +772B58478780:lI98|H772B58478790 +772B58478790:lI97|H772B584787A0 +772B584787A0:lI108|H772B584787B0 +772B584787B0:lI39|H772B584787C0 +772B584787C0:lI32|H772B584787D0 +772B584787D0:lI97|H772B584787E0 +772B584787E0:lI116|H772B584787F0 +772B584787F0:lI32|H772B58478800 +772B58478800:lI126|H772B58478810 +772B58478810:lI119|H772B58478820 +772B58478820:lI32|H772B58478830 +772B58478830:lI102|H772B58478840 +772B58478840:lI97|H772B58478850 +772B58478850:lI105|H772B58478860 +772B58478860:lI108|H772B58478870 +772B58478870:lI101|H772B58478880 +772B58478880:lI100|H772B58478890 +772B58478890:lI32|H772B584788A0 +772B584788A0:lI116|H772B584788B0 +772B584788B0:lI111|H772B584788C0 +772B584788C0:lI32|H772B584788D0 +772B584788D0:lI99|H772B584788E0 +772B584788E0:lI111|H772B584788F0 +772B584788F0:lI110|H772B58478900 +772B58478900:lI110|H772B58478910 +772B58478910:lI101|H772B58478920 +772B58478920:lI99|H772B58478930 +772B58478930:lI116|H772B58478940 +772B58478940:lI32|H772B58478950 +772B58478950:lI116|H772B58478960 +772B58478960:lI111|H772B58478970 +772B58478970:lI32|H772B58478980 +772B58478980:lI126|H772B58478990 +772B58478990:lI119|H772B584789A0 +772B584789A0:lI10|N +772B584789B0:lA9:noconnect|N +772B584789C0:lI103|H772B584789D0 +772B584789D0:lI108|H772B584789E0 +772B584789E0:lI111|H772B584789F0 +772B584789F0:lI98|H772B58478A00 +772B58478A00:lI97|H772B58478A10 +772B58478A10:lI108|H772B58478A20 +772B58478A20:lI58|H772B58478A30 +772B58478A30:lI32|H772B58478A40 +772B58478A40:lI98|H772B58478A50 +772B58478A50:lI97|H772B58478A60 +772B58478A60:lI100|H772B58478A70 +772B58478A70:lI114|H772B58478A80 +772B58478A80:lI112|H772B58478A90 +772B58478A90:lI99|H772B58478AA0 +772B58478AA0:lI32|H772B58478AB0 +772B58478AB0:lI126|H772B58478AC0 +772B58478AC0:lI119|H772B58478AD0 +772B58478AD0:lI32|H772B58478AE0 +772B58478AE0:lI114|H772B58478AF0 +772B58478AF0:lI101|H772B58478B00 +772B58478B00:lI99|H772B58478B10 +772B58478B10:lI101|H772B58478B20 +772B58478B20:lI105|H772B58478B30 +772B58478B30:lI118|H772B58478B40 +772B58478B40:lI101|H772B58478B50 +772B58478B50:lI100|H772B58478B60 +772B58478B60:lI32|H772B58478B70 +772B58478B70:lI119|H772B58478B80 +772B58478B80:lI104|H772B58478B90 +772B58478B90:lI101|H772B58478BA0 +772B58478BA0:lI110|H772B58478BB0 +772B58478BB0:lI32|H772B58478BC0 +772B58478BC0:lI99|H772B58478BD0 +772B58478BD0:lI111|H772B58478BE0 +772B58478BE0:lI110|H772B58478BF0 +772B58478BF0:lI102|H772B58478C00 +772B58478C00:lI108|H772B58478C10 +772B58478C10:lI105|H772B58478C20 +772B58478C20:lI99|H772B58478C30 +772B58478C30:lI116|H772B58478C40 +772B58478C40:lI105|H772B58478C50 +772B58478C50:lI110|H772B58478C60 +772B58478C60:lI103|H772B58478C70 +772B58478C70:lI32|H772B58478C80 +772B58478C80:lI110|H772B58478C90 +772B58478C90:lI97|H772B58478CA0 +772B58478CA0:lI109|H772B58478CB0 +772B58478CB0:lI101|H772B58478CC0 +772B58478CC0:lI32|H772B58478CD0 +772B58478CD0:lI126|H772B58478CE0 +772B58478CE0:lI116|H772B58478CF0 +772B58478CF0:lI119|H772B58478D00 +772B58478D00:lI32|H772B58478D10 +772B58478D10:lI119|H772B58478D20 +772B58478D20:lI97|H772B58478D30 +772B58478D30:lI115|H772B58478D40 +772B58478D40:lI32|H772B58478D50 +772B58478D50:lI102|H772B58478D60 +772B58478D60:lI111|H772B58478D70 +772B58478D70:lI117|H772B58478D80 +772B58478D80:lI110|H772B58478D90 +772B58478D90:lI100|H772B58478DA0 +772B58478DA0:lI10|N +772B58478DB0:lI103|H772B58478DC0 +772B58478DC0:lI108|H772B58478DD0 +772B58478DD0:lI111|H772B58478DE0 +772B58478DE0:lI98|H772B58478DF0 +772B58478DF0:lI97|H772B58478E00 +772B58478E00:lI108|H772B58478E10 +772B58478E10:lI58|H772B58478E20 +772B58478E20:lI32|H772B58478E30 +772B58478E30:lI82|H772B58478E40 +772B58478E40:lI101|H772B58478E50 +772B58478E50:lI115|H772B58478E60 +772B58478E60:lI111|H772B58478E70 +772B58478E70:lI108|H772B58478E80 +772B58478E80:lI118|H772B58478E90 +772B58478E90:lI101|H772B58478EA0 +772B58478EA0:lI32|H772B58478EB0 +772B58478EB0:lI109|H772B58478EC0 +772B58478EC0:lI101|H772B58478ED0 +772B58478ED0:lI116|H772B58478EE0 +772B58478EE0:lI104|H772B58478EF0 +772B58478EF0:lI111|H772B58478F00 +772B58478F00:lI100|H772B58478F10 +772B58478F10:lI32|H772B58478F20 +772B58478F20:lI126|H772B58478F30 +772B58478F30:lI119|H772B58478F40 +772B58478F40:lI32|H772B58478F50 +772B58478F50:lI102|H772B58478F60 +772B58478F60:lI111|H772B58478F70 +772B58478F70:lI114|H772B58478F80 +772B58478F80:lI32|H772B58478F90 +772B58478F90:lI99|H772B58478FA0 +772B58478FA0:lI111|H772B58478FB0 +772B58478FB0:lI110|H772B58478FC0 +772B58478FC0:lI102|H772B58478FD0 +772B58478FD0:lI108|H772B58478FE0 +772B58478FE0:lI105|H772B58478FF0 +772B58478FF0:lI99|H772B58479000 +772B58479000:lI116|H772B58479010 +772B58479010:lI105|H772B58479020 +772B58479020:lI110|H772B58479030 +772B58479030:lI103|H772B58479040 +772B58479040:lI32|H772B58479050 +772B58479050:lI110|H772B58479060 +772B58479060:lI97|H772B58479070 +772B58479070:lI109|H772B58479080 +772B58479080:lI101|H772B58479090 +772B58479090:lI32|H772B584790A0 +772B584790A0:lI126|H772B584790B0 +772B584790B0:lI116|H772B584790C0 +772B584790C0:lI119|H772B584790D0 +772B584790D0:lI32|H772B584790E0 +772B584790E0:lI114|H772B584790F0 +772B584790F0:lI101|H772B58479100 +772B58479100:lI116|H772B58479110 +772B58479110:lI117|H772B58479120 +772B58479120:lI114|H772B58479130 +772B58479130:lI110|H772B58479140 +772B58479140:lI101|H772B58479150 +772B58479150:lI100|H772B58479160 +772B58479160:lI32|H772B58479170 +772B58479170:lI126|H772B58479180 +772B58479180:lI116|H772B58479190 +772B58479190:lI119|H772B584791A0 +772B584791A0:lI10|N +772B584791B0:lI103|H772B584791C0 +772B584791C0:lI108|H772B584791D0 +772B584791D0:lI111|H772B584791E0 +772B584791E0:lI98|H772B584791F0 +772B584791F0:lI97|H772B58479200 +772B58479200:lI108|H772B58479210 +772B58479210:lI58|H772B58479220 +772B58479220:lI32|H772B58479230 +772B58479230:lI78|H772B58479240 +772B58479240:lI97|H772B58479250 +772B58479250:lI109|H772B58479260 +772B58479260:lI101|H772B58479270 +772B58479270:lI32|H772B58479280 +772B58479280:lI99|H772B58479290 +772B58479290:lI111|H772B584792A0 +772B584792A0:lI110|H772B584792B0 +772B584792B0:lI102|H772B584792C0 +772B584792C0:lI108|H772B584792D0 +772B584792D0:lI105|H772B584792E0 +772B584792E0:lI99|H772B584792F0 +772B584792F0:lI116|H772B58479300 +772B58479300:lI32|H772B58479310 +772B58479310:lI116|H772B58479320 +772B58479320:lI101|H772B58479330 +772B58479330:lI114|H772B58479340 +772B58479340:lI109|H772B58479350 +772B58479350:lI105|H772B58479360 +772B58479360:lI110|H772B58479370 +772B58479370:lI97|H772B58479380 +772B58479380:lI116|H772B58479390 +772B58479390:lI105|H772B584793A0 +772B584793A0:lI110|H772B584793B0 +772B584793B0:lI103|H772B584793C0 +772B584793C0:lI32|H772B584793D0 +772B584793D0:lI126|H772B584793E0 +772B584793E0:lI116|H772B584793F0 +772B584793F0:lI119|H772B58479400 +772B58479400:lI10|N +772B58479410:lA9:monotonic|N +772B58479420:t3:A9:undefined,A9:undefined,A9:undefined +772B58479440:lH772B58479460|H772B58479450 +772B58479450:lH772B58479478|N +772B58479460:t2:A5:async,A4:true +772B58479478:t2:A4:info,A5:false +772B58479490:lH772B584794A0|N +772B584794A0:t3:H772B584794C0,N,H772B584794E8 +772B584794C0:t4:A2:$1,A2:$2,A2:$3,A2:$4 +772B584794E8:lH772B584794F8|N +772B584794F8:t1:H772B58479508 +772B58479508:t3:A2:$1,A2:$2,A2:$3 +772B58479528:lI84|H772B58479538 +772B58479538:lI114|H772B58479548 +772B58479548:lI121|H772B58479558 +772B58479558:lI105|H772B58479568 +772B58479568:lI110|H772B58479578 +772B58479578:lI103|H772B58479588 +772B58479588:lI32|H772B58479598 +772B58479598:lI116|H772B584795A8 +772B584795A8:lI111|H772B584795B8 +772B584795B8:lI32|H772B584795C8 +772B584795C8:lI115|H772B584795D8 +772B584795D8:lI121|H772B584795E8 +772B584795E8:lI110|H772B584795F8 +772B584795F8:lI99|H772B58479608 +772B58479608:lI32|H772B58479618 +772B58479618:lI110|H772B58479628 +772B58479628:lI111|H772B58479638 +772B58479638:lI100|H772B58479648 +772B58479648:lI101|H772B58479658 +772B58479658:lI115|H772B58479668 +772B58479668:lI32|H772B58479678 +772B58479678:lI110|H772B58479688 +772B58479688:lI111|H772B58479698 +772B58479698:lI116|H772B584796A8 +772B584796A8:lI32|H772B584796B8 +772B584796B8:lI100|H772B584796C8 +772B584796C8:lI101|H772B584796D8 +772B584796D8:lI102|H772B584796E8 +772B584796E8:lI105|H772B584796F8 +772B584796F8:lI110|H772B58479708 +772B58479708:lI101|H772B58479718 +772B58479718:lI100|H772B58479728 +772B58479728:lI32|H772B58479738 +772B58479738:lI105|H772B58479748 +772B58479748:lI110|H772B58479758 +772B58479758:lI32|H772B58479768 +772B58479768:lI116|H772B58479778 +772B58479778:lI104|H772B58479788 +772B58479788:lI101|H772B58479798 +772B58479798:lI32|H772B584797A8 +772B584797A8:lI111|H772B584797B8 +772B584797B8:lI119|H772B584797C8 +772B584797C8:lI110|H772B584797D8 +772B584797D8:lI32|H772B584797E8 +772B584797E8:lI103|H772B584797F8 +772B584797F8:lI108|H772B58479808 +772B58479808:lI111|H772B58479818 +772B58479818:lI98|H772B58479828 +772B58479828:lI97|H772B58479838 +772B58479838:lI108|H772B58479848 +772B58479848:lI32|H772B58479858 +772B58479858:lI103|H772B58479868 +772B58479868:lI114|H772B58479878 +772B58479878:lI111|H772B58479888 +772B58479888:lI117|H772B58479898 +772B58479898:lI112|N +772B584798A8:lI103|H772B584798B8 +772B584798B8:lI108|H772B584798C8 +772B584798C8:lI111|H772B584798D8 +772B584798D8:lI98|H772B584798E8 +772B584798E8:lI97|H772B584798F8 +772B584798F8:lI108|H772B58479908 +772B58479908:lI95|H772B58479918 +772B58479918:lI103|H772B58479928 +772B58479928:lI114|H772B58479938 +772B58479938:lI111|H772B58479948 +772B58479948:lI117|H772B58479958 +772B58479958:lI112|H772B58479968 +772B58479968:lI115|H772B58479978 +772B58479978:lI32|H772B58479988 +772B58479988:lI100|H772B58479998 +772B58479998:lI101|H772B584799A8 +772B584799A8:lI102|H772B584799B8 +772B584799B8:lI105|H772B584799C8 +772B584799C8:lI110|H772B584799D8 +772B584799D8:lI105|H772B584799E8 +772B584799E8:lI116|H772B584799F8 +772B584799F8:lI105|H772B58479A08 +772B58479A08:lI111|H772B58479A18 +772B58479A18:lI110|H772B58479A28 +772B58479A28:lI32|H772B58479A38 +772B58479A38:lI101|H772B58479A48 +772B58479A48:lI114|H772B58479A58 +772B58479A58:lI114|H772B58479A68 +772B58479A68:lI111|H772B58479A78 +772B58479A78:lI114|N +772B58479A88:lI84|H772B58479A98 +772B58479A98:lI104|H772B58479AA8 +772B58479AA8:lI101|H772B58479AB8 +772B58479AB8:lI32|H772B58479AC8 +772B58479AC8:lI103|H772B58479AD8 +772B58479AD8:lI108|H772B58479AE8 +772B58479AE8:lI111|H772B58479AF8 +772B58479AF8:lI98|H772B58479B08 +772B58479B08:lI97|H772B58479B18 +772B58479B18:lI108|H772B58479B28 +772B58479B28:lI95|H772B58479B38 +772B58479B38:lI110|H772B58479B48 +772B58479B48:lI97|H772B58479B58 +772B58479B58:lI109|H772B58479B68 +772B58479B68:lI101|H772B58479B78 +772B58479B78:lI95|H772B58479B88 +772B58479B88:lI115|H772B58479B98 +772B58479B98:lI101|H772B58479BA8 +772B58479BA8:lI114|H772B58479BB8 +772B58479BB8:lI118|H772B58479BC8 +772B58479BC8:lI101|H772B58479BD8 +772B58479BD8:lI114|H772B58479BE8 +772B58479BE8:lI32|H772B58479BF8 +772B58479BF8:lI126|H772B58479C08 +772B58479C08:lI119|H772B58479C18 +772B58479C18:lI32|H772B58479C28 +772B58479C28:lI112|H772B58479C38 +772B58479C38:lI114|H772B58479C48 +772B58479C48:lI111|H772B58479C58 +772B58479C58:lI99|H772B58479C68 +772B58479C68:lI101|H772B58479C78 +772B58479C78:lI115|H772B58479C88 +772B58479C88:lI115|H772B58479C98 +772B58479C98:lI32|H772B58479CA8 +772B58479CA8:lI114|H772B58479CB8 +772B58479CB8:lI101|H772B58479CC8 +772B58479CC8:lI99|H772B58479CD8 +772B58479CD8:lI101|H772B58479CE8 +772B58479CE8:lI105|H772B58479CF8 +772B58479CF8:lI118|H772B58479D08 +772B58479D08:lI101|H772B58479D18 +772B58479D18:lI100|H772B58479D28 +772B58479D28:lI32|H772B58479D38 +772B58479D38:lI97|H772B58479D48 +772B58479D48:lI110|H772B58479D58 +772B58479D58:lI32|H772B58479D68 +772B58479D68:lI117|H772B58479D78 +772B58479D78:lI110|H772B58479D88 +772B58479D88:lI101|H772B58479D98 +772B58479D98:lI120|H772B58479DA8 +772B58479DA8:lI112|H772B58479DB8 +772B58479DB8:lI101|H772B58479DC8 +772B58479DC8:lI99|H772B58479DD8 +772B58479DD8:lI116|H772B58479DE8 +772B58479DE8:lI101|H772B58479DF8 +772B58479DF8:lI100|H772B58479E08 +772B58479E08:lI32|H772B58479E18 +772B58479E18:lI109|H772B58479E28 +772B58479E28:lI101|H772B58479E38 +772B58479E38:lI115|H772B58479E48 +772B58479E48:lI115|H772B58479E58 +772B58479E58:lI97|H772B58479E68 +772B58479E68:lI103|H772B58479E78 +772B58479E78:lI101|H772B58479E88 +772B58479E88:lI58|H772B58479E98 +772B58479E98:lI10|H772B58479EA8 +772B58479EA8:lI126|H772B58479EB8 +772B58479EB8:lI116|H772B58479EC8 +772B58479EC8:lI112|H772B58479ED8 +772B58479ED8:lI10|N +772B58479EE8:lI108|N +772B58479EF8:lI114|H772B58479EE8 +772B58479F08:lI101|H772B58479EF8 +772B58479F18:lI46|H772B58479F08 +772B58479F28:lI108|H772B58479F18 +772B58479F38:lI97|H772B58479F28 +772B58479F48:lI98|H772B58479F38 +772B58479F58:lI111|H772B58479F48 +772B58479F68:lI108|H772B58479F58 +772B58479F78:lI103|H772B58479F68 +772B58479F88:E4A:g3AAAABIA7l/40ep9iGICE2kxXluIqIAAAAAAAAAAHcGZ2xvYmFsYQBiBcv/Glh3DW5vbm9kZUBub2hvc3QAAAAAAAAAAAAAAAA= +772B58479FA0:Rf772B45AD3D18 +772B58479FB8:Rf772B45AD3D90 +772B58479FD0:Rf772B45AD3E08 +772B58479FE8:Rf772B45AD3E80 +772B5847A000:Rf772B45AD3EF8 +772B5847A018:E4A:g3AAAABIArl/40ep9iGICE2kxXluIqIAAAAFAAAAAHcGZ2xvYmFsYQViBcv/Glh3DW5vbm9kZUBub2hvc3QAAAAAAAAAAAAAAAA= +772B5847A030:Rf772B45AD3F70 +772B5847A048:B1152921504606846975 +772B5847A058:E4A:g3AAAABIA7l/40ep9iGICE2kxXluIqIAAAAGAAAAAHcGZ2xvYmFsYQZiBcv/Glh3DW5vbm9kZUBub2hvc3QAAAAAAAAAAAAAAAA= +772B5847A070:Rf772B45AD3FE8 +772B5847A088:E4A:g3AAAABIArl/40ep9iGICE2kxXluIqIAAAAHAAAAAHcGZ2xvYmFsYQdiBcv/Glh3DW5vbm9kZUBub2hvc3QAAAAAAAAAAAAAAAA= +772B5847A0A0:Rf772B45AD4060 +772B5847A0B8:Rf772B45AD40D8 +772B5847A0D0:Rf772B45AD4150 +772B5847A0E8:Rf772B45AD41C8 +772B5847A100:E4A:g3AAAABIA7l/40ep9iGICE2kxXluIqIAAAALAAAAAHcGZ2xvYmFsYQtiBcv/Glh3DW5vbm9kZUBub2hvc3QAAAAAAAAAAAAAAAA= +772B5847A118:Rf772B45AD4240 +772B5847A130:Rf772B45AD42B8 +772B5847A148:E4A:g3AAAABIArl/40ep9iGICE2kxXluIqIAAAANAAAAAHcGZ2xvYmFsYQ1iBcv/Glh3DW5vbm9kZUBub2hvc3QAAAAAAAAAAAAAAAA= +772B5847A160:Rf772B45AD4330 +772B5847A178:Rf772B45AD43A8 +772B5847A190:Rf772B45AD4420 +772B5847A1A8:Rf772B45AD4498 +772B5847A1C0:Rf772B45AD4510 +772B5847A1D8:Rf772B45AD4588 +772B5847A1F0:E4A:g3AAAABIArl/40ep9iGICE2kxXluIqIAAAATAAAAAHcGZ2xvYmFsYRNiBcv/Glh3DW5vbm9kZUBub2hvc3QAAAAAAAAAAAAAAAA= +772B5847A208:Rf772B45AD4600 +772B5847A220:Rf772B45AD4678 +772B5847A238:Rf772B45AD46F0 +772B5847A250:Rf772B45AD4768 +772B5847A268:E4A:g3AAAABIAbl/40ep9iGICE2kxXluIqIAAAAXAAAAAHcGZ2xvYmFsYRdiBcv/Glh3DW5vbm9kZUBub2hvc3QAAAAAAAAAAAAAAAA= +772B5847A280:Rf772B45AD47E0 +772B5847A298:Rf772B45AD4858 +772B5847A2B0:E4A:g3AAAABIAbl/40ep9iGICE2kxXluIqIAAAAZAAAAAHcGZ2xvYmFsYRliBcv/Glh3DW5vbm9kZUBub2hvc3QAAAAAAAAAAAAAAAA= +772B5847A2C8:Rf772B45AD48D0 +772B5847A2E0:Rf772B45AD4948 +772B5847A2F8:E4A:g3AAAABIArl/40ep9iGICE2kxXluIqIAAAAbAAAAAHcGZ2xvYmFsYRtiBcv/Glh3DW5vbm9kZUBub2hvc3QAAAAAAAAAAAAAAAA= +772B5847A310:Rf772B45AD49C0 +772B5847A328:E4A:g3AAAABIArl/40ep9iGICE2kxXluIqIAAAAcAAAAAHcGZ2xvYmFsYRxiBcv/Glh3DW5vbm9kZUBub2hvc3QAAAAAAAAAAAAAAAA= +772B5847A340:Rf772B45AD4A38 +772B5847A358:E4A:g3AAAABIArl/40ep9iGICE2kxXluIqIAAAAdAAAAAHcGZ2xvYmFsYR1iBcv/Glh3DW5vbm9kZUBub2hvc3QAAAAAAAAAAAAAAAA= +772B5847A370:Rf772B45AD4AB0 +772B5847A388:Rf772B45AD4B28 +772B5847A3A0:Rf772B45AD4BA0 +772B5847A3B8:E4A:g3AAAABIAbl/40ep9iGICE2kxXluIqIAAAAgAAAAAHcGZ2xvYmFsYSBiBcv/Glh3DW5vbm9kZUBub2hvc3QAAAAAAAAAAAAAAAA= +772B5847A3D0:Rf772B45AD4C18 +772B5847A3E8:E4A:g3AAAABIAbl/40ep9iGICE2kxXluIqIAAAAhAAAAAHcGZ2xvYmFsYSFiBcv/Glh3DW5vbm9kZUBub2hvc3QAAAAAAAAAAAAAAAA= +772B5847A400:Rf772B45AD4C90 +772B5847A418:E4A:g3AAAABIALl/40ep9iGICE2kxXluIqIAAAAiAAAAAHcGZ2xvYmFsYSJiBcv/Glh3DW5vbm9kZUBub2hvc3QAAAAAAAAAAAAAAAA= +772B5847A430:Rf772B45AD4D08 +772B5847A448:Rf772B45AD4D80 +772B5847A460:Rf772B45AD4DF8 +772B5847A478:Rf772B45AD4E70 +772B5847A4A8:F1A:1.11022302462515654042e-16 +772B5847A4B8:F1A:5.55111512312578270212e-17 +772B5847A4C8:F1A:2.77555756156289135106e-17 +772B5847A4D8:F1A:1.38777878078144567553e-17 +772B5847A4E8:F1A:2.00000000000000000000e+00 +772B5847A4F8:Yh0: +772B5847A508:t100:H772B5847AD10,H772B5847AD38,H772B5847AD60,H772B5847AD88,H772B5847ADB0,H772B5847ADD8,H772B5847AE00,H772B5847AE28,H772B5847AE50,H772B5847AE78,H772B5847AEA0,H772B5847AEC8,H772B5847AEF0,H772B5847AF18,H772B5847AF40,H772B5847AF68,H772B5847AF90,H772B5847AFB8,H772B5847AFE0,H772B5847B008,H772B5847B030,H772B5847B058,H772B5847B080,H772B5847B0A8,H772B5847B0D0,H772B5847B0F8,H772B5847B120,H772B5847B148,H772B5847B170,H772B5847B198,H772B5847B1C0,H772B5847B1E8,H772B5847B210,H772B5847B238,H772B5847B260,H772B5847B288,H772B5847B2B0,H772B5847B2D8,H772B5847B300,H772B5847B328,H772B5847B350,H772B5847B378,H772B5847B3A0,H772B5847B3C8,H772B5847B3F0,H772B5847B418,H772B5847B440,H772B5847B468,H772B5847B490,H772B5847B4B8,H772B5847B4E0,H772B5847B508,H772B5847B530,H772B5847B558,H772B5847B580,H772B5847B5A8,H772B5847B5D0,H772B5847B5F8,H772B5847B620,H772B5847B648,H772B5847B670,H772B5847B698,H772B5847B6C0,H772B5847B6E8,H772B5847B710,H772B5847B738,H772B5847B760,H772B5847B788,H772B5847B7B0,H772B5847B7D8,H772B5847B800,H772B5847B828,H772B5847B850,H772B5847B878,H772B5847B8A0,H772B5847B8C8,H772B5847B8F0,H772B5847B918,H772B5847B940,H772B5847B968,H772B5847B990,H772B5847B9B8,H772B5847B9E0,H772B5847BA08,H772B5847BA30,H772B5847BA58,H772B5847BA80,H772B5847BAA8,H772B5847BAD0,H772B5847BAF8,H772B5847BB20,H772B5847BB48,H772B5847BB70,H772B5847BB98,H772B5847BBC0,H772B5847BBE8,H772B5847BC10,H772B5847BC38,H772B5847BC60,H772B5847BC88,H772B5847BCB0,H772B5847BCD8,H772B5847BD00,H772B5847BD28,H772B5847BD50,H772B5847BD78,H772B5847BDA0,H772B5847BDC8,H772B5847BDF0,H772B5847BE18,H772B5847BE40,H772B5847BE68,H772B5847BE90,H772B5847BEB8,H772B5847BEE0,H772B5847BF08,H772B5847BF30,H772B5847BF58,H772B5847BF80,H772B5847BFA8,H772B5847BFD0,H772B5847BFF8,H772B5847C020,H772B5847C048,H772B5847C070,H772B5847C098,H772B5847C0C0,H772B5847C0E8,H772B5847C110,H772B5847C138,H772B5847C160,H772B5847C188,H772B5847C1B0,H772B5847C1D8,H772B5847C200,H772B5847C228,H772B5847C250,H772B5847C278,H772B5847C2A0,H772B5847C2C8,H772B5847C2F0,H772B5847C318,H772B5847C340,H772B5847C368,H772B5847C390,H772B5847C3B8,H772B5847C3E0,H772B5847C408,H772B5847C430,H772B5847C458,H772B5847C480,H772B5847C4A8,H772B5847C4D0,H772B5847C4F8,H772B5847C520,H772B5847C548,H772B5847C570,H772B5847C598,H772B5847C5C0,H772B5847C5E8,H772B5847C610,H772B5847C638,H772B5847C660,H772B5847C688,H772B5847C6B0,H772B5847C6D8,H772B5847C700,H772B5847C728,H772B5847C750,H772B5847C778,H772B5847C7A0,H772B5847C7C8,H772B5847C7F0,H772B5847C818,H772B5847C840,H772B5847C868,H772B5847C890,H772B5847C8B8,H772B5847C8E0,H772B5847C908,H772B5847C930,H772B5847C958,H772B5847C980,H772B5847C9A8,H772B5847C9D0,H772B5847C9F8,H772B5847CA20,H772B5847CA48,H772B5847CA70,H772B5847CA98,H772B5847CAC0,H772B5847CAE8,H772B5847CB10,H772B5847CB38,H772B5847CB60,H772B5847CB88,H772B5847CBB0,H772B5847CBD8,H772B5847CC00,H772B5847CC28,H772B5847CC50,H772B5847CC78,H772B5847CCA0,H772B5847CCC8,H772B5847CCF0,H772B5847CD18,H772B5847CD40,H772B5847CD68,H772B5847CD90,H772B5847CDB8,H772B5847CDE0,H772B5847CE08,H772B5847CE30,H772B5847CE58,H772B5847CE80,H772B5847CEA8,H772B5847CED0,H772B5847CEF8,H772B5847CF20,H772B5847CF48,H772B5847CF70,H772B5847CF98,H772B5847CFC0,H772B5847CFE8,H772B5847D010,H772B5847D038,H772B5847D060,H772B5847D088,H772B5847D0B0,H772B5847D0D8,H772B5847D100,H772B5847D128,H772B5847D150,H772B5847D178,H772B5847D1A0,H772B5847D1C8,H772B5847D1F0,H772B5847D218,H772B5847D240,H772B5847D268,H772B5847D290,H772B5847D2B8,H772B5847D2E0,H772B5847D308,H772B5847D330,H772B5847D358,H772B5847D380,H772B5847D3A8,H772B5847D3D0,H772B5847D3F8,H772B5847D420,H772B5847D448,H772B5847D470,H772B5847D498,H772B5847D4C0,H772B5847D4E8 +772B5847AD10:t2:I2104047571236786,H772B5847AD28 +772B5847AD28:F1A:1.73672541216026300829e-15 +772B5847AD38:t2:I0,H772B5847AD50 +772B5847AD50:F1A:9.55866035145563388593e-17 +772B5847AD60:t2:I1693657211986787,H772B5847AD78 +772B5847AD78:F1A:1.27087048348106232125e-16 +772B5847AD88:t2:I1919380038271141,H772B5847ADA0 +772B5847ADA0:F1A:1.49097409624954739056e-16 +772B5847ADB0:t2:I2015384402196343,H772B5847ADC8 +772B5847ADC8:F1A:1.66587336315862684825e-16 +772B5847ADD8:t2:I2068365869448128,H772B5847ADF0 +772B5847ADF0:F1A:1.81361208101190286598e-16 +772B5847AE00:t2:I2101878624052573,H772B5847AE18 +772B5847AE18:F1A:1.94297201531355877741e-16 +772B5847AE28:t2:I2124958784102998,H772B5847AE40 +772B5847AE40:F1A:2.05895006284820926559e-16 +772B5847AE50:t2:I2141808670795147,H772B5847AE68 +772B5847AE68:F1A:2.16468605768954222017e-16 +772B5847AE78:t2:I2154644611568301,H772B5847AE90 +772B5847AE90:F1A:2.26229403922181158232e-16 +772B5847AEA0:t2:I2164744887587275,H772B5847AEB8 +772B5847AEB8:F1A:2.35327189140458915861e-16 +772B5847AEC8:t2:I2172897953696594,H772B5847AEE0 +772B5847AEE0:F1A:2.43872345574287710295e-16 +772B5847AEF0:t2:I2179616279372365,H772B5847AF08 +772B5847AF08:F1A:2.51948798292742250158e-16 +772B5847AF18:t2:I2185247251868649,H772B5847AF30 +772B5847AF30:F1A:2.59621997725281025263e-16 +772B5847AF40:t2:I2190034623107822,H772B5847AF58 +772B5847AF58:F1A:2.66944074736482849525e-16 +772B5847AF68:t2:I2194154434521197,H772B5847AF80 +772B5847AF80:F1A:2.73957296851424460024e-16 +772B5847AF90:t2:I2197736978774660,H772B5847AFA8 +772B5847AFA8:F1A:2.80696460024848035749e-16 +772B5847AFB8:t2:I2200880740891961,H772B5847AFD0 +772B5847AFD0:F1A:2.87190589041139304275e-16 +772B5847AFE0:t2:I2203661538010620,H772B5847AFF8 +772B5847AFF8:F1A:2.93464174847288832596e-16 +772B5847B008:t2:I2206138681109102,H772B5847B020 +772B5847B020:F1A:2.99538093367821129281e-16 +772B5847B030:t2:I2208359231806599,H772B5847B048 +772B5847B048:F1A:3.05430300071924403235e-16 +772B5847B058:t2:I2210361007258210,H772B5847B070 +772B5847B070:F1A:3.11156363389215722701e-16 +772B5847B080:t2:I2212174742388539,H772B5847B098 +772B5847B098:F1A:3.16729880185818151712e-16 +772B5847B0A8:t2:I2213825672704646,H772B5847B0C0 +772B5847B0C0:F1A:3.22162803505499051688e-16 +772B5847B0D0:t2:I2215334711002614,H772B5847B0E8 +772B5847B0E8:F1A:3.27465704079397507757e-16 +772B5847B0F8:t2:I2216719334487595,H772B5847B110 +772B5847B110:F1A:3.32647981168417099987e-16 +772B5847B120:t2:I2217994262139172,H772B5847B138 +772B5847B138:F1A:3.37718034173532322460e-16 +772B5847B148:t2:I2219171977965032,H772B5847B160 +772B5847B160:F1A:3.42683403531193559494e-16 +772B5847B170:t2:I2220263139538712,H772B5847B188 +772B5847B188:F1A:3.47550887317297581051e-16 +772B5847B198:t2:I2221276900117330,H772B5847B1B0 +772B5847B1B0:F1A:3.52326638460020314094e-16 +772B5847B1C0:t2:I2222221164932930,H772B5847B1D8 +772B5847B1D8:F1A:3.57016246339534940285e-16 +772B5847B1E8:t2:I2223102796829069,H772B5847B200 +772B5847B200:F1A:3.61624805715983390475e-16 +772B5847B210:t2:I2223927782546658,H772B5847B228 +772B5847B228:F1A:3.66156975296535397983e-16 +772B5847B238:t2:I2224701368170060,H772B5847B250 +772B5847B250:F1A:3.70617027772360773203e-16 +772B5847B260:t2:I2225428170204312,H772B5847B278 +772B5847B278:F1A:3.75008892787477978824e-16 +772B5847B288:t2:I2226112267248242,H772B5847B2A0 +772B5847B2A0:F1A:3.79336194015495537551e-16 +772B5847B2B0:t2:I2226757276105256,H772B5847B2C8 +772B5847B2C8:F1A:3.83602281296772790489e-16 +772B5847B2D8:t2:I2227366415328399,H772B5847B2F0 +772B5847B2F0:F1A:3.87810258612502468569e-16 +772B5847B300:t2:I2227942558554684,H772B5847B318 +772B5847B318:F1A:3.91963008532576783898e-16 +772B5847B328:t2:I2228488279492521,H772B5847B340 +772B5847B340:F1A:3.96063213662563775295e-16 +772B5847B350:t2:I2229005890047222,H772B5847B368 +772B5847B368:F1A:4.00113375525466896220e-16 +772B5847B378:t2:I2229497472775193,H772B5847B390 +772B5847B390:F1A:4.04115831241433324136e-16 +772B5847B3A0:t2:I2229964908627060,H772B5847B3B8 +772B5847B3B8:F1A:4.08072768309604483145e-16 +772B5847B3C8:t2:I2230409900758597,H772B5847B3E0 +772B5847B3E0:F1A:4.11986237748074422111e-16 +772B5847B3F0:t2:I2230833995044585,H772B5847B408 +772B5847B408:F1A:4.15858165808280641140e-16 +772B5847B418:t2:I2231238597816133,H772B5847B430 +772B5847B430:F1A:4.19690364447407329203e-16 +772B5847B440:t2:I2231624991250191,H772B5847B458 +772B5847B458:F1A:4.23484540715207084057e-16 +772B5847B468:t2:I2231994346765928,H772B5847B480 +772B5847B480:F1A:4.27242305188997608562e-16 +772B5847B490:t2:I2232347736722750,H772B5847B4A8 +772B5847B4A8:F1A:4.30965179571629408372e-16 +772B5847B4B8:t2:I2232686144665934,H772B5847B4D0 +772B5847B4D0:F1A:4.34654603551287596498e-16 +772B5847B4E0:t2:I2233010474325959,H772B5847B4F8 +772B5847B4F8:F1A:4.38311941008545712860e-16 +772B5847B508:t2:I2233321557544881,H772B5847B520 +772B5847B520:F1A:4.41938485644706647812e-16 +772B5847B530:t2:I2233620161276071,H772B5847B548 +772B5847B548:F1A:4.45535466095791365718e-16 +772B5847B558:t2:I2233906993781271,H772B5847B570 +772B5847B570:F1A:4.49104050588287499193e-16 +772B5847B580:t2:I2234182710130335,H772B5847B598 +772B5847B598:F1A:4.52645351185713967562e-16 +772B5847B5A8:t2:I2234447917093496,H772B5847B5C0 +772B5847B5C0:F1A:4.56160427669003807995e-16 +772B5847B5D0:t2:I2234703177503020,H772B5847B5E8 +772B5847B5E8:F1A:4.59650291088494072552e-16 +772B5847B5F8:t2:I2234949014150181,H772B5847B610 +772B5847B610:F1A:4.63115907020816468447e-16 +772B5847B620:t2:I2235185913274316,H772B5847B638 +772B5847B638:F1A:4.66558198560087516686e-16 +772B5847B648:t2:I2235414327692884,H772B5847B660 +772B5847B660:F1A:4.69978049069419496306e-16 +772B5847B670:t2:I2235634679614920,H772B5847B688 +772B5847B688:F1A:4.73376304715832370759e-16 +772B5847B698:t2:I2235847363174595,H772B5847B6B0 +772B5847B6B0:F1A:4.76753776809085264392e-16 +772B5847B6C0:t2:I2236052746716837,H772B5847B6D8 +772B5847B6D8:F1A:4.80111243962701550521e-16 +772B5847B6E8:t2:I2236251174862869,H772B5847B700 +772B5847B700:F1A:4.83449454093500800172e-16 +772B5847B710:t2:I2236442970379967,H772B5847B728 +772B5847B728:F1A:4.86769126274220868624e-16 +772B5847B738:t2:I2236628435876762,H772B5847B750 +772B5847B750:F1A:4.90070952452299375578e-16 +772B5847B760:t2:I2236807855342765,H772B5847B778 +772B5847B778:F1A:4.93355599046541390746e-16 +772B5847B788:t2:I2236981495548562,H772B5847B7A0 +772B5847B7A0:F1A:4.96623708432217831361e-16 +772B5847B7B0:t2:I2237149607321147,H772B5847B7C8 +772B5847B7C8:F1A:4.99875900324090879179e-16 +772B5847B7D8:t2:I2237312426707209,H772B5847B7F0 +772B5847B7F0:F1A:5.03112773065931868701e-16 +772B5847B800:t2:I2237470176035652,H772B5847B818 +772B5847B818:F1A:5.06334904834271949789e-16 +772B5847B828:t2:I2237623064889403,H772B5847B840 +772B5847B840:F1A:5.09542854763389229036e-16 +772B5847B850:t2:I2237771290995388,H772B5847B868 +772B5847B868:F1A:5.12737163997879663320e-16 +772B5847B878:t2:I2237915041040597,H772B5847B890 +772B5847B890:F1A:5.15918356678573644216e-16 +772B5847B8A0:t2:I2238054491421305,H772B5847B8B8 +772B5847B8B8:F1A:5.19086940867034337507e-16 +772B5847B8C8:t2:I2238189808931712,H772B5847B8E0 +772B5847B8E0:F1A:5.22243409413404174016e-16 +772B5847B8F0:t2:I2238321151397660,H772B5847B908 +772B5847B908:F1A:5.25388240771945425068e-16 +772B5847B918:t2:I2238448668260432,H772B5847B930 +772B5847B930:F1A:5.28521899768238198395e-16 +772B5847B940:t2:I2238572501115169,H772B5847B958 +772B5847B958:F1A:5.31644838321661755014e-16 +772B5847B968:t2:I2238692784207942,H772B5847B980 +772B5847B980:F1A:5.34757496126472954545e-16 +772B5847B990:t2:I2238809644895133,H772B5847B9A8 +772B5847B9A8:F1A:5.37860301294523479377e-16 +772B5847B9B8:t2:I2238923204068402,H772B5847B9D0 +772B5847B9D0:F1A:5.40953670962399333412e-16 +772B5847B9E0:t2:I2239033576548190,H772B5847B9F8 +772B5847B9F8:F1A:5.44038011865546709133e-16 +772B5847BA08:t2:I2239140871448443,H772B5847BA20 +772B5847BA20:F1A:5.47113720881736113194e-16 +772B5847BA30:t2:I2239245192514958,H772B5847BA48 +772B5847BA48:F1A:5.50181185546033624966e-16 +772B5847BA58:t2:I2239346638439541,H772B5847BA70 +772B5847BA70:F1A:5.53240784539278360189e-16 +772B5847BA80:t2:I2239445303151952,H772B5847BA98 +772B5847BA98:F1A:5.56292888151909017422e-16 +772B5847BAA8:t2:I2239541276091442,H772B5847BAC0 +772B5847BAC0:F1A:5.59337858724846207834e-16 +772B5847BAD0:t2:I2239634642459498,H772B5847BAE8 +772B5847BAE8:F1A:5.62376051069004345873e-16 +772B5847BAF8:t2:I2239725483455293,H772B5847BB10 +772B5847BB10:F1A:5.65407812864896043333e-16 +772B5847BB20:t2:I2239813876495186,H772B5847BB38 +772B5847BB38:F1A:5.68433485043681410254e-16 +772B5847BB48:t2:I2239899895417494,H772B5847BB60 +772B5847BB60:F1A:5.71453402150920397185e-16 +772B5847BB70:t2:I2239983610673676,H772B5847BB88 +772B5847BB88:F1A:5.74467892694196087369e-16 +772B5847BB98:t2:I2240065089506935,H772B5847BBB0 +772B5847BBB0:F1A:5.77477279475696482238e-16 +772B5847BBC0:t2:I2240144396119183,H772B5847BBD8 +772B5847BBD8:F1A:5.80481879910768565067e-16 +772B5847BBE8:t2:I2240221591827230,H772B5847BC00 +772B5847BC00:F1A:5.83482006333389205125e-16 +772B5847BC10:t2:I2240296735208969,H772B5847BC28 +772B5847BC28:F1A:5.86477966289436525146e-16 +772B5847BC38:t2:I2240369882240293,H772B5847BC50 +772B5847BC50:F1A:5.89470062818587176437e-16 +772B5847BC60:t2:I2240441086423386,H772B5847BC78 +772B5847BC78:F1A:5.92458594725613394191e-16 +772B5847BC88:t2:I2240510398907004,H772B5847BCA0 +772B5847BCA0:F1A:5.95443856841805979446e-16 +772B5847BCB0:t2:I2240577868599305,H772B5847BCC8 +772B5847BCC8:F1A:5.98426140277202811378e-16 +772B5847BCD8:t2:I2240643542273726,H772B5847BCF0 +772B5847BCF0:F1A:6.01405732664266403201e-16 +772B5847BD00:t2:I2240707464668391,H772B5847BD18 +772B5847BD18:F1A:6.04382918393612501158e-16 +772B5847BD28:t2:I2240769678579486,H772B5847BD40 +772B5847BD40:F1A:6.07357978842360566070e-16 +772B5847BD50:t2:I2240830224948980,H772B5847BD68 +772B5847BD68:F1A:6.10331192595643943370e-16 +772B5847BD78:t2:I2240889142947082,H772B5847BD90 +772B5847BD90:F1A:6.13302835661791100703e-16 +772B5847BDA0:t2:I2240946470049769,H772B5847BDB8 +772B5847BDB8:F1A:6.16273181681659631279e-16 +772B5847BDC8:t2:I2241002242111691,H772B5847BDE0 +772B5847BDE0:F1A:6.19242502132584703827e-16 +772B5847BDF0:t2:I2241056493434746,H772B5847BE08 +772B5847BE08:F1A:6.22211066527378790876e-16 +772B5847BE18:t2:I2241109256832602,H772B5847BE30 +772B5847BE30:F1A:6.25179142608799982782e-16 +772B5847BE40:t2:I2241160563691400,H772B5847BE58 +772B5847BE58:F1A:6.28146996539889530228e-16 +772B5847BE68:t2:I2241210444026879,H772B5847BE80 +772B5847BE80:F1A:6.31114893090560423885e-16 +772B5847BE90:t2:I2241258926538122,H772B5847BEA8 +772B5847BEA8:F1A:6.34083095820806000914e-16 +772B5847BEB8:t2:I2241306038658137,H772B5847BED0 +772B5847BED0:F1A:6.37051867260881494958e-16 +772B5847BEE0:t2:I2241351806601435,H772B5847BEF8 +772B5847BEF8:F1A:6.40021469088802472988e-16 +772B5847BF08:t2:I2241396255408788,H772B5847BF20 +772B5847BF20:F1A:6.42992162305489607018e-16 +772B5847BF30:t2:I2241439408989313,H772B5847BF48 +772B5847BF48:F1A:6.45964207407883213683e-16 +772B5847BF58:t2:I2241481290160038,H772B5847BF70 +772B5847BF70:F1A:6.48937864560339654762e-16 +772B5847BF80:t2:I2241521920683062,H772B5847BF98 +772B5847BF98:F1A:6.51913393764615873896e-16 +772B5847BFA8:t2:I2241561321300462,H772B5847BFC0 +772B5847BFC0:F1A:6.54891055028741540820e-16 +772B5847BFD0:t2:I2241599511767028,H772B5847BFE8 +772B5847BFE8:F1A:6.57871108535074132917e-16 +772B5847BFF8:t2:I2241636510880960,H772B5847C010 +772B5847C010:F1A:6.60853814807825874393e-16 +772B5847C020:t2:I2241672336512612,H772B5847C038 +772B5847C038:F1A:6.63839434880350565911e-16 +772B5847C048:t2:I2241707005631362,H772B5847C060 +772B5847C060:F1A:6.66828230462474590443e-16 +772B5847C070:t2:I2241740534330713,H772B5847C088 +772B5847C088:F1A:6.69820464108155789432e-16 +772B5847C098:t2:I2241772937851689,H772B5847C0B0 +772B5847C0B0:F1A:6.72816399383753114503e-16 +772B5847C0C0:t2:I2241804230604585,H772B5847C0D8 +772B5847C0D8:F1A:6.75816301037190058595e-16 +772B5847C0E8:t2:I2241834426189161,H772B5847C100 +772B5847C100:F1A:6.78820435168298025779e-16 +772B5847C110:t2:I2241863537413311,H772B5847C128 +772B5847C128:F1A:6.81829069400625404640e-16 +772B5847C138:t2:I2241891576310281,H772B5847C150 +772B5847C150:F1A:6.84842473055003829332e-16 +772B5847C160:t2:I2241918554154466,H772B5847C178 +772B5847C178:F1A:6.87860917325166366447e-16 +772B5847C188:t2:I2241944481475843,H772B5847C1A0 +772B5847C1A0:F1A:6.90884675455716901816e-16 +772B5847C1B0:t2:I2241969368073071,H772B5847C1C8 +772B5847C1C8:F1A:6.93914022922756903880e-16 +772B5847C1D8:t2:I2241993223025298,H772B5847C1F0 +772B5847C1F0:F1A:6.96949237617482938615e-16 +772B5847C200:t2:I2242016054702685,H772B5847C218 +772B5847C218:F1A:6.99990600033076396841e-16 +772B5847C228:t2:I2242037870775710,H772B5847C240 +772B5847C240:F1A:7.03038393455215079165e-16 +772B5847C250:t2:I2242058678223225,H772B5847C268 +772B5847C268:F1A:7.06092904156548215323e-16 +772B5847C278:t2:I2242078483339331,H772B5847C290 +772B5847C290:F1A:7.09154421595487341536e-16 +772B5847C2A0:t2:I2242097291739040,H772B5847C2B8 +772B5847C2B8:F1A:7.12223238619677884046e-16 +772B5847C2C8:t2:I2242115108362774,H772B5847C2E0 +772B5847C2E0:F1A:7.15299651674530299286e-16 +772B5847C2F0:t2:I2242131937479672,H772B5847C308 +772B5847C308:F1A:7.18383961017206285811e-16 +772B5847C318:t2:I2242147782689725,H772B5847C330 +772B5847C330:F1A:7.21476470936470670108e-16 +772B5847C340:t2:I2242162646924736,H772B5847C358 +772B5847C358:F1A:7.24577489978838698238e-16 +772B5847C368:t2:I2242176532448092,H772B5847C380 +772B5847C380:F1A:7.27687331181469271523e-16 +772B5847C390:t2:I2242189440853337,H772B5847C3A8 +772B5847C3A8:F1A:7.30806312312274287356e-16 +772B5847C3B8:t2:I2242201373061537,H772B5847C3D0 +772B5847C3D0:F1A:7.33934756117740475864e-16 +772B5847C3E0:t2:I2242212329317416,H772B5847C3F8 +772B5847C3F8:F1A:7.37072990578983098735e-16 +772B5847C408:t2:I2242222309184237,H772B5847C420 +772B5847C420:F1A:7.40221349176579965727e-16 +772B5847C430:t2:I2242231311537397,H772B5847C448 +772B5847C448:F1A:7.43380171164764792799e-16 +772B5847C458:t2:I2242239334556717,H772B5847C470 +772B5847C470:F1A:7.46549801855588902443e-16 +772B5847C480:t2:I2242246375717369,H772B5847C498 +772B5847C498:F1A:7.49730592913697934980e-16 +772B5847C4A8:t2:I2242252431779415,H772B5847C4C0 +772B5847C4C0:F1A:7.52922902662405836870e-16 +772B5847C4D0:t2:I2242257498775893,H772B5847C4E8 +772B5847C4E8:F1A:7.56127096401792173910e-16 +772B5847C4F8:t2:I2242261571999416,H772B5847C510 +772B5847C510:F1A:7.59343546739588950455e-16 +772B5847C520:t2:I2242264645987196,H772B5847C538 +772B5847C538:F1A:7.62572633935675575083e-16 +772B5847C548:t2:I2242266714504453,H772B5847C560 +772B5847C560:F1A:7.65814746261048733621e-16 +772B5847C570:t2:I2242267770526109,H772B5847C588 +772B5847C588:F1A:7.69070280372191911716e-16 +772B5847C598:t2:I2242267806216711,H772B5847C5B0 +772B5847C5B0:F1A:7.72339641701829854238e-16 +772B5847C5C0:t2:I2242266812908462,H772B5847C5D8 +772B5847C5D8:F1A:7.75623244867117442328e-16 +772B5847C5E8:t2:I2242264781077289,H772B5847C600 +772B5847C600:F1A:7.78921514096385241347e-16 +772B5847C610:t2:I2242261700316818,H772B5847C628 +772B5847C628:F1A:7.82234883675641084120e-16 +772B5847C638:t2:I2242257559310145,H772B5847C650 +772B5847C650:F1A:7.85563798416108405147e-16 +772B5847C660:t2:I2242252345799276,H772B5847C678 +772B5847C678:F1A:7.88908714144175521500e-16 +772B5847C688:t2:I2242246046552082,H772B5847C6A0 +772B5847C6A0:F1A:7.92270098215227085966e-16 +772B5847C6B0:t2:I2242238647326615,H772B5847C6C8 +772B5847C6C8:F1A:7.95648430052936617556e-16 +772B5847C6D8:t2:I2242230132832625,H772B5847C6F0 +772B5847C6F0:F1A:7.99044201715713004887e-16 +772B5847C700:t2:I2242220486690076,H772B5847C718 +772B5847C718:F1A:8.02457918492125913510e-16 +772B5847C728:t2:I2242209691384458,H772B5847C740 +772B5847C740:F1A:8.05890099527265683393e-16 +772B5847C750:t2:I2242197728218684,H772B5847C768 +772B5847C768:F1A:8.09341278482150088838e-16 +772B5847C778:t2:I2242184577261310,H772B5847C790 +772B5847C790:F1A:8.12812004228450077447e-16 +772B5847C7A0:t2:I2242170217290819,H772B5847C7B8 +772B5847C7B8:F1A:8.16302841580987746960e-16 +772B5847C7C8:t2:I2242154625735679,H772B5847C7E0 +772B5847C7E0:F1A:8.19814372070653286895e-16 +772B5847C7F0:t2:I2242137778609839,H772B5847C808 +772B5847C808:F1A:8.23347194760605041733e-16 +772B5847C818:t2:I2242119650443327,H772B5847C830 +772B5847C830:F1A:8.26901927108847002541e-16 +772B5847C840:t2:I2242100214207556,H772B5847C858 +772B5847C858:F1A:8.30479205880537371959e-16 +772B5847C868:t2:I2242079441234906,H772B5847C880 +772B5847C880:F1A:8.34079688113662879173e-16 +772B5847C890:t2:I2242057301132135,H772B5847C8A8 +772B5847C8A8:F1A:8.37704052142022163322e-16 +772B5847C8B8:t2:I2242033761687079,H772B5847C8D0 +772B5847C8D0:F1A:8.41352998679802824740e-16 +772B5847C8E0:t2:I2242008788768107,H772B5847C8F8 +772B5847C8F8:F1A:8.45027251972409677425e-16 +772B5847C908:t2:I2241982346215682,H772B5847C920 +772B5847C920:F1A:8.48727561018615493666e-16 +772B5847C930:t2:I2241954395725356,H772B5847C948 +772B5847C948:F1A:8.52454700869559619833e-16 +772B5847C958:t2:I2241924896721443,H772B5847C970 +772B5847C970:F1A:8.56209474010623332794e-16 +772B5847C980:t2:I2241893806220517,H772B5847C998 +772B5847C998:F1A:8.59992711832766460322e-16 +772B5847C9A8:t2:I2241861078683830,H772B5847C9C0 +772B5847C9C0:F1A:8.63805276200525889234e-16 +772B5847C9D0:t2:I2241826665857598,H772B5847C9E8 +772B5847C9E8:F1A:8.67648061124558160821e-16 +772B5847C9F8:t2:I2241790516600041,H772B5847CA10 +772B5847CA10:F1A:8.71521994547369801105e-16 +772B5847CA20:t2:I2241752576693881,H772B5847CA38 +772B5847CA38:F1A:8.75428040251717494016e-16 +772B5847CA48:t2:I2241712788642916,H772B5847CA60 +772B5847CA60:F1A:8.79367199902104274846e-16 +772B5847CA70:t2:I2241671091451078,H772B5847CA88 +772B5847CA88:F1A:8.83340515230840795477e-16 +772B5847CA98:t2:I2241627420382235,H772B5847CAB0 +772B5847CAB0:F1A:8.87349070381313453209e-16 +772B5847CAC0:t2:I2241581706698773,H772B5847CAD8 +772B5847CAD8:F1A:8.91393994422408613348e-16 +772B5847CAE8:t2:I2241533877376767,H772B5847CB00 +772B5847CB00:F1A:8.95476464049506774624e-16 +772B5847CB10:t2:I2241483854795281,H772B5847CB28 +772B5847CB28:F1A:8.99597706489109936019e-16 +772B5847CB38:t2:I2241431556397035,H772B5847CB50 +772B5847CB50:F1A:9.03759002626011752555e-16 +772B5847CB60:t2:I2241376894317345,H772B5847CB78 +772B5847CB78:F1A:9.07961690374006801893e-16 +772B5847CB88:t2:I2241319774977817,H772B5847CBA0 +772B5847CBA0:F1A:9.12207168313484609982e-16 +772B5847CBB0:t2:I2241260098640860,H772B5847CBC8 +772B5847CBC8:F1A:9.16496899621913531320e-16 +772B5847CBD8:t2:I2241197758920538,H772B5847CBF0 +772B5847CBF0:F1A:9.20832416326230760072e-16 +772B5847CC00:t2:I2241132642244704,H772B5847CC18 +772B5847CC18:F1A:9.25215323909569332723e-16 +772B5847CC28:t2:I2241064627262652,H772B5847CC40 +772B5847CC40:F1A:9.29647306308641672775e-16 +772B5847CC50:t2:I2240993584191742,H772B5847CC68 +772B5847CC68:F1A:9.34130131342526512592e-16 +772B5847CC78:t2:I2240919374095536,H772B5847CC90 +772B5847CC90:F1A:9.38665656618665978610e-16 +772B5847CCA0:t2:I2240841848084890,H772B5847CCB8 +772B5847CCB8:F1A:9.43255835967670653963e-16 +772B5847CCC8:t2:I2240760846432232,H772B5847CCE0 +772B5847CCE0:F1A:9.47902726465173824760e-16 +772B5847CCF0:t2:I2240676197587784,H772B5847CD08 +772B5847CD08:F1A:9.52608496106627869756e-16 +772B5847CD18:t2:I2240587717084782,H772B5847CD30 +772B5847CD30:F1A:9.57375432209744962925e-16 +772B5847CD40:t2:I2240495206318753,H772B5847CD58 +772B5847CD58:F1A:9.62205950629483835507e-16 +772B5847CD68:t2:I2240398451183567,H772B5847CD80 +772B5847CD80:F1A:9.67102605882305424755e-16 +772B5847CD90:t2:I2240297220544165,H772B5847CDA8 +772B5847CDA8:F1A:9.72068102290162588019e-16 +772B5847CDB8:t2:I2240191264522612,H772B5847CDD0 +772B5847CDD0:F1A:9.77105306270720883776e-16 +772B5847CDE0:t2:I2240080312570155,H772B5847CDF8 +772B5847CDF8:F1A:9.82217259919054108939e-16 +772B5847CE08:t2:I2239964071293331,H772B5847CE20 +772B5847CE20:F1A:9.87407196048067106672e-16 +772B5847CE30:t2:I2239842221996530,H772B5847CE48 +772B5847CE48:F1A:9.92678554880797648454e-16 +772B5847CE58:t2:I2239714417896699,H772B5847CE70 +772B5847CE70:F1A:9.98035002618364491509e-16 +772B5847CE80:t2:I2239580280957725,H772B5847CE98 +772B5847CE98:F1A:1.00348045214361808924e-15 +772B5847CEA8:t2:I2239439398282193,H772B5847CEC0 +772B5847CEC0:F1A:1.00901908616374569449e-15 +772B5847CED0:t2:I2239291317986196,H772B5847CEE8 +772B5847CEE8:F1A:1.01465538314670861133e-15 +772B5847CEF8:t2:I2239135544468203,H772B5847CF10 +772B5847CF10:F1A:1.02039414646831236830e-15 +772B5847CF20:t2:I2238971532964979,H772B5847CF38 +772B5847CF38:F1A:1.02624053726135674640e-15 +772B5847CF48:t2:I2238798683265269,H772B5847CF60 +772B5847CF60:F1A:1.03220011154864564914e-15 +772B5847CF70:t2:I2238616332424351,H772B5847CF88 +772B5847CF88:F1A:1.03827886235153991696e-15 +772B5847CF98:t2:I2238423746288095,H772B5847CFB0 +772B5847CFB0:F1A:1.04448326760004705473e-15 +772B5847CFC0:t2:I2238220109591890,H772B5847CFD8 +772B5847CFD8:F1A:1.05082034483551946539e-15 +772B5847CFE8:t2:I2238004514345216,H772B5847D000 +772B5847D000:F1A:1.05729771390098902296e-15 +772B5847D010:t2:I2237775946143212,H772B5847D028 +772B5847D028:F1A:1.06392366906768007507e-15 +772B5847D038:t2:I2237533267957822,H772B5847D050 +772B5847D050:F1A:1.07070726236329937629e-15 +772B5847D060:t2:I2237275200846753,H772B5847D078 +772B5847D078:F1A:1.07765840026681064032e-15 +772B5847D088:t2:I2237000300869952,H772B5847D0A0 +772B5847D0A0:F1A:1.08478795644034246815e-15 +772B5847D0B0:t2:I2236706931309099,H772B5847D0C8 +772B5847D0C8:F1A:1.09210790381495627955e-15 +772B5847D0D8:t2:I2236393229029147,H772B5847D0F0 +772B5847D0F0:F1A:1.09963147017856282141e-15 +772B5847D100:t2:I2236057063479501,H772B5847D118 +772B5847D118:F1A:1.10737332249357520075e-15 +772B5847D128:t2:I2235695986373246,H772B5847D140 +772B5847D140:F1A:1.11534978658531549289e-15 +772B5847D150:t2:I2235307169458859,H772B5847D168 +772B5847D168:F1A:1.12357911071108333166e-15 +772B5847D178:t2:I2234887326941578,H772B5847D190 +772B5847D190:F1A:1.13208178401648463069e-15 +772B5847D1A0:t2:I2234432617919447,H772B5847D1B8 +772B5847D1B8:F1A:1.14088092425827801405e-15 +772B5847D1C8:t2:I2233938522519765,H772B5847D1E0 +772B5847D1E0:F1A:1.15000275378397924458e-15 +772B5847D1F0:t2:I2233399683022677,H772B5847D208 +772B5847D208:F1A:1.15947718914491892724e-15 +772B5847D218:t2:I2232809697779198,H772B5847D230 +772B5847D230:F1A:1.16933857869109599762e-15 +772B5847D240:t2:I2232160850599817,H772B5847D258 +772B5847D258:F1A:1.17962663529558008258e-15 +772B5847D268:t2:I2231443750584641,H772B5847D280 +772B5847D280:F1A:1.19038762992828902828e-15 +772B5847D290:t2:I2230646845562170,H772B5847D2A8 +772B5847D2A8:F1A:1.20167593925438186168e-15 +772B5847D2B8:t2:I2229755753817986,H772B5847D2D0 +772B5847D2D0:F1A:1.21355608186668970279e-15 +772B5847D2E0:t2:I2228752329126533,H772B5847D2F8 +772B5847D2F8:F1A:1.22610544174505612103e-15 +772B5847D308:t2:I2227613325162504,H772B5847D320 +772B5847D320:F1A:1.23941797891632511077e-15 +772B5847D330:t2:I2226308442121174,H772B5847D348 +772B5847D348:F1A:1.25360939266025668161e-15 +772B5847D358:t2:I2224797391720399,H772B5847D370 +772B5847D370:F1A:1.26882448142550100004e-15 +772B5847D380:t2:I2223025347823832,H772B5847D398 +772B5847D398:F1A:1.28524793190961088468e-15 +772B5847D3A8:t2:I2220915633329809,H772B5847D3C0 +772B5847D3C0:F1A:1.30312066346899851655e-15 +772B5847D3D0:t2:I2218357446087030,H772B5847D3E8 +772B5847D3E8:F1A:1.32276557701953263307e-15 +772B5847D3F8:t2:I2215184158448668,H772B5847D410 +772B5847D410:F1A:1.34463009250111712861e-15 +772B5847D420:t2:I2211132412537369,H772B5847D438 +772B5847D438:F1A:1.36936068351285175171e-15 +772B5847D448:t2:I2205758503851065,H772B5847D460 +772B5847D460:F1A:1.39794366727752399083e-15 +772B5847D470:t2:I2198248265654987,H772B5847D488 +772B5847D488:F1A:1.43199898696613284312e-15 +772B5847D498:t2:I2186916352102141,H772B5847D4B0 +772B5847D4B0:F1A:1.47448486035975958423e-15 +772B5847D4C0:t2:I2167562552481814,H772B5847D4D8 +772B5847D4D8:F1A:1.53178727416111435375e-15 +772B5847D4E8:t2:I2125549880839716,H772B5847D500 +772B5847D500:F1A:1.62276986753129683713e-15 +772B5847D510:Mf0:H772B58410188: +772B5847D528:lI0|I0 +772B5847D538:lI0|H772B5847D548 +772B5847D548:lI0|H772B5847D558 +772B5847D558:lI0|H772B5847D568 +772B5847D568:lI0|H772B5847D578 +772B5847D578:lI0|H772B5847D588 +772B5847D588:lI0|H772B5847D598 +772B5847D598:lI0|H772B5847D5A8 +772B5847D5A8:lI0|H772B5847D5B8 +772B5847D5B8:lI0|H772B5847D5C8 +772B5847D5C8:lI0|H772B5847D5D8 +772B5847D5D8:lI0|H772B5847D5E8 +772B5847D5E8:lI0|H772B5847D5F8 +772B5847D5F8:lI0|H772B5847D608 +772B5847D608:lI0|H772B5847D618 +772B5847D618:lI0|H772B5847D628 +772B5847D628:lI0|N +772B5847D638:lI114527183042123105|H772B5847D648 +772B5847D648:lI160423628620659260|H772B5847D658 +772B5847D658:lI284733707589872850|H772B5847D668 +772B5847D668:lI164435740288387503|H772B5847D678 +772B5847D678:lI259572741793888962|H772B5847D688 +772B5847D688:lI215793509705812255|H772B5847D698 +772B5847D698:lI228241955430903492|H772B5847D6A8 +772B5847D6A8:lI221708554683218499|H772B5847D6B8 +772B5847D6B8:lI212006596549813798|H772B5847D6C8 +772B5847D6C8:lI139215019150089363|H772B5847D6D8 +772B5847D6D8:lI23964000621384961|H772B5847D6E8 +772B5847D6E8:lI55201052708218217|H772B5847D6F8 +772B5847D6F8:lI112969240468397636|H772B5847D708 +772B5847D708:lI22130735059088892|H772B5847D718 +772B5847D718:lI244278597799509466|H772B5847D728 +772B5847D728:lI220175845070832114|H772B5847D738 +772B5847D738:lI43243288828|N +772B5847D748:lI290573448171827402|H772B5847D758 +772B5847D758:lI382251779910418577|H772B5847D768 +772B5847D768:lI423857156240780192|H772B5847D778 +772B5847D778:lI317638803078791815|H772B5847D788 +772B5847D788:lI312577798172065765|H772B5847D798 +772B5847D798:lI305801842905235492|H772B5847D7A8 +772B5847D7A8:lI450887821400921554|H772B5847D7B8 +772B5847D7B8:lI490154825290594607|H772B5847D7C8 +772B5847D7C8:lI507224882549817556|H772B5847D7D8 +772B5847D7D8:lI305131922350994371|H772B5847D7E8 +772B5847D7E8:lI524004876356613068|H772B5847D7F8 +772B5847D7F8:lI399286492428034246|H772B5847D808 +772B5847D808:lI556129459533271918|H772B5847D818 +772B5847D818:lI302163523288674092|H772B5847D828 +772B5847D828:lI295571835370094372|H772B5847D838 +772B5847D838:lI487547435355635071|N +772B5847D848:lI412473694820566502|H772B5847D858 +772B5847D858:lI432883605991317039|H772B5847D868 +772B5847D868:lI525373508288112196|H772B5847D878 +772B5847D878:lI403915169708599875|H772B5847D888 +772B5847D888:lI319067783491633768|H772B5847D898 +772B5847D898:lI301226760020322060|H772B5847D8A8 +772B5847D8A8:lI311627678308842608|H772B5847D8B8 +772B5847D8B8:lI376040681981803602|H772B5847D8C8 +772B5847D8C8:lI339701046172540810|H772B5847D8D8 +772B5847D8D8:lI406476937554306621|H772B5847D8E8 +772B5847D8E8:lI319178240279900411|H772B5847D8F8 +772B5847D8F8:lI538961455727032748|H772B5847D908 +772B5847D908:lI343829982822907227|H772B5847D918 +772B5847D918:lI562090186051299616|H772B5847D928 +772B5847D928:lI294421712295949406|H772B5847D938 +772B5847D938:lI517056752316592047|N +772B5847D948:lI171572743241724754|N +772B5847D958:F1A:5.00000000000000000000e-01 +772B5847D968:lH772B5847D998|H772B5847D978 +772B5847D978:lH772B5847D9B0|H772B5847D988 +772B5847D988:lA6:global|N +772B5847D998:t2:A7:newline,A3:any +772B5847D9B0:t3:A7:capture,AD:all_but_first,A6:binary +772B5847D9D0:lI48|H772B5847D9E0 +772B5847D9E0:lI120|H772B5847D9F0 +772B5847D9F0:lI40|H772B5847DA00 +772B5847DA00:lI91|H772B5847DA10 +772B5847DA10:lI97|H772B5847DA20 +772B5847DA20:lI45|H772B5847DA30 +772B5847DA30:lI122|H772B5847DA40 +772B5847DA40:lI65|H772B5847DA50 +772B5847DA50:lI45|H772B5847DA60 +772B5847DA60:lI90|H772B5847DA70 +772B5847DA70:lI48|H772B5847DA80 +772B5847DA80:lI45|H772B5847DA90 +772B5847DA90:lI57|H772B5847DAA0 +772B5847DAA0:lI93|H772B5847DAB0 +772B5847DAB0:lI43|H772B5847DAC0 +772B5847DAC0:lI41|N +772B5847DAD0:lI49|H772B5847DAE0 +772B5847DAE0:lI54|H772B5847DAF0 +772B5847DAF0:lI35|H772B5847DB00 +772B5847DB00:lI126|H772B5847DB10 +772B5847DB10:lI115|H772B5847DB20 +772B5847DB20:lI44|H772B5847DB30 +772B5847DB30:lI126|H772B5847DB40 +772B5847DB40:lI110|N +772B5847DB50:F1B:-2.73661237329758277870e-01 +772B5847DB60:F1A:3.65415288536100879568e+00 +772B5847DB70:F1B:-3.65415288536100879568e+00 +772B5847DB80:F1B:-5.00000000000000000000e-01 +772B5847DB90:t100:H772B5847E398,H772B5847E3A8,H772B5847E3B8,H772B5847E3C8,H772B5847E3D8,H772B5847E3E8,H772B5847E3F8,H772B5847E408,H772B5847E418,H772B5847E428,H772B5847E438,H772B5847E448,H772B5847E458,H772B5847E468,H772B5847E478,H772B5847E488,H772B5847E498,H772B5847E4A8,H772B5847E4B8,H772B5847E4C8,H772B5847E4D8,H772B5847E4E8,H772B5847E4F8,H772B5847E508,H772B5847E518,H772B5847E528,H772B5847E538,H772B5847E548,H772B5847E558,H772B5847E568,H772B5847E578,H772B5847E588,H772B5847E598,H772B5847E5A8,H772B5847E5B8,H772B5847E5C8,H772B5847E5D8,H772B5847E5E8,H772B5847E5F8,H772B5847E608,H772B5847E618,H772B5847E628,H772B5847E638,H772B5847E648,H772B5847E658,H772B5847E668,H772B5847E678,H772B5847E688,H772B5847E698,H772B5847E6A8,H772B5847E6B8,H772B5847E6C8,H772B5847E6D8,H772B5847E6E8,H772B5847E6F8,H772B5847E708,H772B5847E718,H772B5847E728,H772B5847E738,H772B5847E748,H772B5847E758,H772B5847E768,H772B5847E778,H772B5847E788,H772B5847E798,H772B5847E7A8,H772B5847E7B8,H772B5847E7C8,H772B5847E7D8,H772B5847E7E8,H772B5847E7F8,H772B5847E808,H772B5847E818,H772B5847E828,H772B5847E838,H772B5847E848,H772B5847E858,H772B5847E868,H772B5847E878,H772B5847E888,H772B5847E898,H772B5847E8A8,H772B5847E8B8,H772B5847E8C8,H772B5847E8D8,H772B5847E8E8,H772B5847E8F8,H772B5847E908,H772B5847E918,H772B5847E928,H772B5847E938,H772B5847E948,H772B5847E958,H772B5847E968,H772B5847E978,H772B5847E988,H772B5847E998,H772B5847E9A8,H772B5847E9B8,H772B5847E9C8,H772B5847E9D8,H772B5847E9E8,H772B5847E9F8,H772B5847EA08,H772B5847EA18,H772B5847EA28,H772B5847EA38,H772B5847EA48,H772B5847EA58,H772B5847EA68,H772B5847EA78,H772B5847EA88,H772B5847EA98,H772B5847EAA8,H772B5847EAB8,H772B5847EAC8,H772B5847EAD8,H772B5847EAE8,H772B5847EAF8,H772B5847EB08,H772B5847EB18,H772B5847EB28,H772B5847EB38,H772B5847EB48,H772B5847EB58,H772B5847EB68,H772B5847EB78,H772B5847EB88,H772B5847EB98,H772B5847EBA8,H772B5847EBB8,H772B5847EBC8,H772B5847EBD8,H772B5847EBE8,H772B5847EBF8,H772B5847EC08,H772B5847EC18,H772B5847EC28,H772B5847EC38,H772B5847EC48,H772B5847EC58,H772B5847EC68,H772B5847EC78,H772B5847EC88,H772B5847EC98,H772B5847ECA8,H772B5847ECB8,H772B5847ECC8,H772B5847ECD8,H772B5847ECE8,H772B5847ECF8,H772B5847ED08,H772B5847ED18,H772B5847ED28,H772B5847ED38,H772B5847ED48,H772B5847ED58,H772B5847ED68,H772B5847ED78,H772B5847ED88,H772B5847ED98,H772B5847EDA8,H772B5847EDB8,H772B5847EDC8,H772B5847EDD8,H772B5847EDE8,H772B5847EDF8,H772B5847EE08,H772B5847EE18,H772B5847EE28,H772B5847EE38,H772B5847EE48,H772B5847EE58,H772B5847EE68,H772B5847EE78,H772B5847EE88,H772B5847EE98,H772B5847EEA8,H772B5847EEB8,H772B5847EEC8,H772B5847EED8,H772B5847EEE8,H772B5847EEF8,H772B5847EF08,H772B5847EF18,H772B5847EF28,H772B5847EF38,H772B5847EF48,H772B5847EF58,H772B5847EF68,H772B5847EF78,H772B5847EF88,H772B5847EF98,H772B5847EFA8,H772B5847EFB8,H772B5847EFC8,H772B5847EFD8,H772B5847EFE8,H772B5847EFF8,H772B5847F008,H772B5847F018,H772B5847F028,H772B5847F038,H772B5847F048,H772B5847F058,H772B5847F068,H772B5847F078,H772B5847F088,H772B5847F098,H772B5847F0A8,H772B5847F0B8,H772B5847F0C8,H772B5847F0D8,H772B5847F0E8,H772B5847F0F8,H772B5847F108,H772B5847F118,H772B5847F128,H772B5847F138,H772B5847F148,H772B5847F158,H772B5847F168,H772B5847F178,H772B5847F188,H772B5847F198,H772B5847F1A8,H772B5847F1B8,H772B5847F1C8,H772B5847F1D8,H772B5847F1E8,H772B5847F1F8,H772B5847F208,H772B5847F218,H772B5847F228,H772B5847F238,H772B5847F248,H772B5847F258,H772B5847F268,H772B5847F278,H772B5847F288,H772B5847F298,H772B5847F2A8,H772B5847F2B8,H772B5847F2C8,H772B5847F2D8,H772B5847F2E8,H772B5847F2F8,H772B5847F308,H772B5847F318,H772B5847F328,H772B5847F338,H772B5847F348,H772B5847F358,H772B5847F368,H772B5847F378,H772B5847F388 +772B5847E398:F1A:1.00000000000000000000e+00 +772B5847E3A8:F1A:9.77101701267670819107e-01 +772B5847E3B8:F1A:9.59879091800105999077e-01 +772B5847E3C8:F1A:9.45198953442299094618e-01 +772B5847E3D8:F1A:9.32060075959229905607e-01 +772B5847E3E8:F1A:9.19991505039346457728e-01 +772B5847E3F8:F1A:9.08726440052130324254e-01 +772B5847E408:F1A:8.98095921898342974821e-01 +772B5847E418:F1A:8.87984660755832821977e-01 +772B5847E428:F1A:8.78309655808916844855e-01 +772B5847E438:F1A:8.69008688036856491443e-01 +772B5847E448:F1A:8.60033621196331088399e-01 +772B5847E458:F1A:8.51346258458677507264e-01 +772B5847E468:F1A:8.42915653112203733244e-01 +772B5847E478:F1A:8.34716292986882990590e-01 +772B5847E488:F1A:8.26726833946220929228e-01 +772B5847E498:F1A:8.18929191603701922553e-01 +772B5847E4A8:F1A:8.11307874312655719073e-01 +772B5847E4B8:F1A:8.03849483170963829970e-01 +772B5847E4C8:F1A:7.96542330422958411162e-01 +772B5847E4D8:F1A:7.89376143566024035536e-01 +772B5847E4E8:F1A:7.82341832654801949687e-01 +772B5847E4F8:F1A:7.75431304981186619862e-01 +772B5847E508:F1A:7.68637315798485709628e-01 +772B5847E518:F1A:7.61953346836794831454e-01 +772B5847E528:F1A:7.55373506507095671125e-01 +772B5847E538:F1A:7.48892447219156376370e-01 +772B5847E548:F1A:7.42505296340150611201e-01 +772B5847E558:F1A:7.36207598126862095000e-01 +772B5847E568:F1A:7.29995264561475676324e-01 +772B5847E578:F1A:7.23864533468629667290e-01 +772B5847E588:F1A:7.17811932630721516446e-01 +772B5847E598:F1A:7.11834248878247977110e-01 +772B5847E5A8:F1A:7.05928501332753755015e-01 +772B5847E5B8:F1A:7.00091918136511170978e-01 +772B5847E5C8:F1A:6.94321916126116267520e-01 +772B5847E5D8:F1A:6.88616083004671364343e-01 +772B5847E5E8:F1A:6.82972161644994302243e-01 +772B5847E5F8:F1A:6.77388036218773081920e-01 +772B5847E608:F1A:6.71861719897081655084e-01 +772B5847E618:F1A:6.66391343908749766989e-01 +772B5847E628:F1A:6.60975147776662774746e-01 +772B5847E638:F1A:6.55611470579696931082e-01 +772B5847E648:F1A:6.50298743110816368507e-01 +772B5847E658:F1A:6.45035480820821960357e-01 +772B5847E668:F1A:6.39820277453056140970e-01 +772B5847E678:F1A:6.34651799287623274992e-01 +772B5847E688:F1A:6.29528779924836245918e-01 +772B5847E698:F1A:6.24450015547026060503e-01 +772B5847E6A8:F1A:6.19414360605833991258e-01 +772B5847E6B8:F1A:6.14420723888913444810e-01 +772B5847E6C8:F1A:6.09468064925773100882e-01 +772B5847E6D8:F1A:6.04555390697467331940e-01 +772B5847E6E8:F1A:5.99681752619124819326e-01 +772B5847E6F8:F1A:5.94846243767986893047e-01 +772B5847E708:F1A:5.90047996332825452903e-01 +772B5847E718:F1A:5.85286179263370898163e-01 +772B5847E728:F1A:5.80559996100790343121e-01 +772B5847E738:F1A:5.75868682972353163052e-01 +772B5847E748:F1A:5.71211506735252672051e-01 +772B5847E758:F1A:5.66587763256163889913e-01 +772B5847E768:F1A:5.61996775814523896742e-01 +772B5847E778:F1A:5.57437893618765500925e-01 +772B5847E788:F1A:5.52910490425831846473e-01 +772B5847E798:F1A:5.48413963255265368701e-01 +772B5847E7A8:F1A:5.43947731190025818293e-01 +772B5847E7B8:F1A:5.39511234256951577315e-01 +772B5847E7C8:F1A:5.35103932380457170126e-01 +772B5847E7D8:F1A:5.30725304403661501951e-01 +772B5847E7E8:F1A:5.26374847171684034919e-01 +772B5847E7F8:F1A:5.22052074672321397841e-01 +772B5847E808:F1A:5.17756517229755908183e-01 +772B5847E818:F1A:5.13487720747326514825e-01 +772B5847E828:F1A:5.09245245995747608525e-01 +772B5847E838:F1A:5.05028667943467901580e-01 +772B5847E848:F1A:5.00837575126148348836e-01 +772B5847E858:F1A:4.96671569052489325635e-01 +772B5847E868:F1A:4.92530263643868149170e-01 +772B5847E878:F1A:4.88413284705457584334e-01 +772B5847E888:F1A:4.84320269426682881164e-01 +772B5847E898:F1A:4.80250865909046420477e-01 +772B5847E8A8:F1A:4.76204732719505474670e-01 +772B5847E8B8:F1A:4.72181538467729755570e-01 +772B5847E8C8:F1A:4.68180961405693207844e-01 +772B5847E8D8:F1A:4.64202689048173910980e-01 +772B5847E8E8:F1A:4.60246417812842478767e-01 +772B5847E8F8:F1A:4.56311852678716101117e-01 +772B5847E908:F1A:4.52398706861848243221e-01 +772B5847E918:F1A:4.48506701507202731882e-01 +772B5847E928:F1A:4.44635565395739118522e-01 +772B5847E938:F1A:4.40785034665803765463e-01 +772B5847E948:F1A:4.36954852547985328481e-01 +772B5847E958:F1A:4.33144769112652094911e-01 +772B5847E968:F1A:4.29354541029441261202e-01 +772B5847E978:F1A:4.25583931338021803636e-01 +772B5847E988:F1A:4.21832709229495728120e-01 +772B5847E998:F1A:4.18100649837847948564e-01 +772B5847E9A8:F1A:4.14387534040890903597e-01 +772B5847E9B8:F1A:4.10693148270187990967e-01 +772B5847E9C8:F1A:4.07017284329473150173e-01 +772B5847E9D8:F1A:4.03359739221114288465e-01 +772B5847E9E8:F1A:3.99720314980197000132e-01 +772B5847E9F8:F1A:3.96098818515832229448e-01 +772B5847EA08:F1A:3.92495061459315397467e-01 +772B5847EA18:F1A:3.88908860018788549162e-01 +772B5847EA28:F1A:3.85340034840077061418e-01 +772B5847EA38:F1A:3.81788410873393435629e-01 +772B5847EA48:F1A:3.78253817245618961795e-01 +772B5847EA58:F1A:3.74736087137890860888e-01 +772B5847EA68:F1A:3.71235057668239221140e-01 +772B5847EA78:F1A:3.67750569779032254747e-01 +772B5847EA88:F1A:3.64282468129003722535e-01 +772B5847EA98:F1A:3.60830600989647753973e-01 +772B5847EAA8:F1A:3.57394820145780223175e-01 +772B5847EAB8:F1A:3.53974980800076555187e-01 +772B5847EAC8:F1A:3.50570941481405884410e-01 +772B5847EAD8:F1A:3.47182563956793477367e-01 +772B5847EAE8:F1A:3.43809713146850548515e-01 +772B5847EAF8:F1A:3.40452257044521644502e-01 +772B5847EB08:F1A:3.37110066637005878487e-01 +772B5847EB18:F1A:3.33783015830718232664e-01 +772B5847EB28:F1A:3.30470981379163419867e-01 +772B5847EB38:F1A:3.27173842813601289947e-01 +772B5847EB48:F1A:3.23891482376391037779e-01 +772B5847EB58:F1A:3.20623784956905300003e-01 +772B5847EB68:F1A:3.17370638029913498812e-01 +772B5847EB78:F1A:3.14131931596337066193e-01 +772B5847EB88:F1A:3.10907558126286343025e-01 +772B5847EB98:F1A:3.07697412504291889501e-01 +772B5847EBA8:F1A:3.04501391976649826709e-01 +772B5847EBB8:F1A:3.01319396100802883165e-01 +772B5847EBC8:F1A:2.98151326696685314843e-01 +772B5847EBD8:F1A:2.94997087799961643650e-01 +772B5847EBE8:F1A:2.91856585617094987928e-01 +772B5847EBF8:F1A:2.88729728482182701477e-01 +772B5847EC08:F1A:2.85616426815501589509e-01 +772B5847EC18:F1A:2.82516593083707412415e-01 +772B5847EC28:F1A:2.79430141761637718112e-01 +772B5847EC38:F1A:2.76356989295668098450e-01 +772B5847EC48:F1A:2.73297054068576905639e-01 +772B5847EC58:F1A:2.70250256365875185516e-01 +772B5847EC68:F1A:2.67216518343561137971e-01 +772B5847EC78:F1A:2.64195763997260801847e-01 +772B5847EC88:F1A:2.61187919132720824944e-01 +772B5847EC98:F1A:2.58192911337618902223e-01 +772B5847ECA8:F1A:2.55210669954661684145e-01 +772B5847ECB8:F1A:2.52241126055941899953e-01 +772B5847ECC8:F1A:2.49284212418528244859e-01 +772B5847ECD8:F1A:2.46339863501263633960e-01 +772B5847ECE8:F1A:2.43408015422750118040e-01 +772B5847ECF8:F1A:2.40488605940500393965e-01 +772B5847ED08:F1A:2.37581574431237951828e-01 +772B5847ED18:F1A:2.34686861872329899370e-01 +772B5847ED28:F1A:2.31804410824338585906e-01 +772B5847ED38:F1A:2.28934165414680229622e-01 +772B5847ED48:F1A:2.26076071322380195427e-01 +772B5847ED58:F1A:2.23230075763917457099e-01 +772B5847ED68:F1A:2.20396127480151943212e-01 +772B5847ED78:F1A:2.17574176724331130872e-01 +772B5847ED88:F1A:2.14764175251173583536e-01 +772B5847ED98:F1A:2.11966076307030154569e-01 +772B5847EDA8:F1A:2.09179834621124993710e-01 +772B5847EDB8:F1A:2.06405406397880714087e-01 +772B5847EDC8:F1A:2.03642749310334852941e-01 +772B5847EDD8:F1A:2.00891822494656563380e-01 +772B5847EDE8:F1A:1.98152586545775111215e-01 +772B5847EDF8:F1A:1.95425003514134276728e-01 +772B5847EE08:F1A:1.92709036903589120415e-01 +772B5847EE18:F1A:1.90004651670464957958e-01 +772B5847EE28:F1A:1.87311814223800249257e-01 +772B5847EE38:F1A:1.84630492426799269756e-01 +772B5847EE48:F1A:1.81960655599522541648e-01 +772B5847EE58:F1A:1.79302274522847665539e-01 +772B5847EE68:F1A:1.76655321443734997233e-01 +772B5847EE78:F1A:1.74019770081838748288e-01 +772B5847EE88:F1A:1.71395595637505948616e-01 +772B5847EE98:F1A:1.68782774801211510329e-01 +772B5847EEA8:F1A:1.66181285764482045142e-01 +772B5847EEB8:F1A:1.63591108232365695097e-01 +772B5847EEC8:F1A:1.61012223437511065027e-01 +772B5847EED8:F1A:1.58444614155924312637e-01 +772B5847EEE8:F1A:1.55888264724479197465e-01 +772B5847EEF8:F1A:1.53343161060262828110e-01 +772B5847EF08:F1A:1.50809290681845675763e-01 +772B5847EF18:F1A:1.48286642732574525105e-01 +772B5847EF28:F1A:1.45775208005994028060e-01 +772B5847EF38:F1A:1.43274978973513406055e-01 +772B5847EF48:F1A:1.40785949814444699690e-01 +772B5847EF58:F1A:1.38308116448550705302e-01 +772B5847EF68:F1A:1.35841476571253727545e-01 +772B5847EF78:F1A:1.33386029691669127928e-01 +772B5847EF88:F1A:1.30941777173644302579e-01 +772B5847EF98:F1A:1.28508722279999515470e-01 +772B5847EFA8:F1A:1.26086870220185859326e-01 +772B5847EFB8:F1A:1.23676228201596544176e-01 +772B5847EFC8:F1A:1.21276805484790209388e-01 +772B5847EFD8:F1A:1.18888613442909976681e-01 +772B5847EFE8:F1A:1.16511665625610799646e-01 +772B5847EFF8:F1A:1.14145977827838349117e-01 +772B5847F008:F1A:1.11791568163838006544e-01 +772B5847F018:F1A:1.09448457146811631291e-01 +772B5847F028:F1A:1.07116667774683635428e-01 +772B5847F038:F1A:1.04796225622486902096e-01 +772B5847F048:F1A:1.02487158941935080358e-01 +772B5847F058:F1A:1.00189498768809809315e-01 +772B5847F068:F1A:9.79032790388622842226e-02 +772B5847F078:F1A:9.56285367130088187482e-02 +772B5847F088:F1A:9.33653119126908598302e-02 +772B5847F098:F1A:9.11136480663736342267e-02 +772B5847F0A8:F1A:8.88735920682757890576e-02 +772B5847F0B8:F1A:8.66451944505579607636e-02 +772B5847F0C8:F1A:8.44285095703533744471e-02 +772B5847F0D8:F1A:8.22235958132028627032e-02 +772B5847F0E8:F1A:8.00305158146630557514e-02 +772B5847F0F8:F1A:7.78493367020960391756e-02 +772B5847F108:F1A:7.56801303589270668581e-02 +772B5847F118:F1A:7.35229737139812683511e-02 +772B5847F128:F1A:7.13779490588903747783e-02 +772B5847F138:F1A:6.92451443970067692657e-02 +772B5847F148:F1A:6.71246538277884968737e-02 +772B5847F158:F1A:6.50165779712428421044e-02 +772B5847F168:F1A:6.29210244377581134900e-02 +772B5847F178:F1A:6.08381083495398641836e-02 +772B5847F188:F1A:5.87679529209337581097e-02 +772B5847F198:F1A:5.67106901062029017391e-02 +772B5847F1A8:F1A:5.46664613248889139085e-02 +772B5847F1B8:F1A:5.26354182767921757735e-02 +772B5847F1C8:F1A:5.06177238609477608833e-02 +772B5847F1D8:F1A:4.86135532158685212956e-02 +772B5847F1E8:F1A:4.66230949019303675396e-02 +772B5847F1F8:F1A:4.46465522512944426592e-02 +772B5847F208:F1A:4.26841449164744313194e-02 +772B5847F218:F1A:4.07361106559409325012e-02 +772B5847F228:F1A:3.88027074045261127777e-02 +772B5847F238:F1A:3.68842156885672844968e-02 +772B5847F248:F1A:3.49809414617160835403e-02 +772B5847F258:F1A:3.30932194585785224850e-02 +772B5847F268:F1A:3.12214171919202448935e-02 +772B5847F278:F1A:2.93659397581333136973e-02 +772B5847F288:F1A:2.75272356696030819079e-02 +772B5847F298:F1A:2.57058040085488964666e-02 +772B5847F2A8:F1A:2.39022033057958820101e-02 +772B5847F2B8:F1A:2.21170627073088640890e-02 +772B5847F2C8:F1A:2.03510962300445172324e-02 +772B5847F2D8:F1A:1.86051212757246432761e-02 +772B5847F2E8:F1A:1.68800831525431661861e-02 +772B5847F2F8:F1A:1.51770883079353248457e-02 +772B5847F308:F1A:1.34974506017398795249e-02 +772B5847F318:F1A:1.18427578579078877224e-02 +772B5847F328:F1A:1.02149714397014711870e-02 +772B5847F338:F1A:8.61658276939873159217e-03 +772B5847F348:F1A:7.05087547137322676050e-03 +772B5847F358:F1A:5.52240329925099675962e-03 +772B5847F368:F1A:4.03797259336303050042e-03 +772B5847F378:F1A:2.60907274610216273134e-03 +772B5847F388:F1A:1.26028593049859753868e-03 +772B5847F398:lI126|H772B5847F3A8 +772B5847F3A8:lI99|H772B5847F3B8 +772B5847F3B8:lI126|H772B5847F3C8 +772B5847F3C8:lI99|H772B5847F3D8 +772B5847F3D8:lI46|H772B5847F3E8 +772B5847F3E8:lI126|H772B5847F3F8 +772B5847F3F8:lI49|H772B5847F408 +772B5847F408:lI51|H772B5847F418 +772B5847F418:lI46|H772B5847F428 +772B5847F428:lI49|H772B5847F438 +772B5847F438:lI54|H772B5847F448 +772B5847F448:lI46|H772B5847F458 +772B5847F458:lI48|H772B5847F468 +772B5847F468:lI98|H772B5847F478 +772B5847F478:lI69|H772B5847F488 +772B5847F488:lI126|H772B5847F498 +772B5847F498:lI98|N +772B5847F4A8:lI108|N +772B5847F4B8:lI114|H772B5847F4A8 +772B5847F4C8:lI101|H772B5847F4B8 +772B5847F4D8:lI46|H772B5847F4C8 +772B5847F4E8:lI100|H772B5847F4D8 +772B5847F4F8:lI110|H772B5847F4E8 +772B5847F508:lI97|H772B5847F4F8 +772B5847F518:lI114|H772B5847F508 +772B5847F528:E48:g3AAAABGAUxyNBAyO1qrfH/CIk8ueNUAAAAAAAAAAHcEcmFuZGEAYgJjkaBYdw1ub25vZGVAbm9ob3N0AAAAAAAAAAAAAAAA +772B5847F540:Rf772B45AD8688 +772B5847F558:E48:g3AAAABGAUxyNBAyO1qrfH/CIk8ueNUAAAABAAAAAHcEcmFuZGEBYgJjkaBYdw1ub25vZGVAbm9ob3N0AAAAAAAAAAAAAAAA +772B5847F570:Rf772B45AD8700 +772B5847F588:E48:g3AAAABGAkxyNBAyO1qrfH/CIk8ueNUAAAACAAAAAHcEcmFuZGECYgJjkaBYdw1ub25vZGVAbm9ob3N0AAAAAAAAAAAAAAAA +772B5847F5A0:Rf772B45AD8778 +772B5847F5B8:E48:g3AAAABGAUxyNBAyO1qrfH/CIk8ueNUAAAADAAAAAHcEcmFuZGEDYgJjkaBYdw1ub25vZGVAbm9ob3N0AAAAAAAAAAAAAAAA +772B5847F5D0:Rf772B45AD87F0 +772B5847F5E8:t6:A4:type,A4:next,A4:bits,A7:uniform,A9:uniform_n,A4:jump +772B5847F620:E48:g3AAAABGAUxyNBAyO1qrfH/CIk8ueNUAAAAEAAAAAHcEcmFuZGEEYgJjkaBYdw1ub25vZGVAbm9ob3N0AAAAAAAAAAAAAAAA +772B5847F638:Rf772B45AD8868 +772B5847F650:E48:g3AAAABGAUxyNBAyO1qrfH/CIk8ueNUAAAAFAAAAAHcEcmFuZGEFYgJjkaBYdw1ub25vZGVAbm9ob3N0AAAAAAAAAAAAAAAA +772B5847F668:Rf772B45AD88E0 +772B5847F680:t4:A3:max,A4:type,A4:next,A4:jump +772B5847F6A8:E48:g3AAAABGAUxyNBAyO1qrfH/CIk8ueNUAAAAGAAAAAHcEcmFuZGEGYgJjkaBYdw1ub25vZGVAbm9ob3N0AAAAAAAAAAAAAAAA +772B5847F6C0:Rf772B45AD8958 +772B5847F6D8:E48:g3AAAABGAUxyNBAyO1qrfH/CIk8ueNUAAAAHAAAAAHcEcmFuZGEHYgJjkaBYdw1ub25vZGVAbm9ob3N0AAAAAAAAAAAAAAAA +772B5847F6F0:Rf772B45AD89D0 +772B5847F708:E48:g3AAAABGAkxyNBAyO1qrfH/CIk8ueNUAAAAIAAAAAHcEcmFuZGEIYgJjkaBYdw1ub25vZGVAbm9ob3N0AAAAAAAAAAAAAAAA +772B5847F720:Rf772B45AD8A48 +772B5847F738:t7:A4:type,A4:next,A4:bits,A7:uniform,AD:weak_low_bits,A9:uniform_n,A4:jump +772B5847F778:B18446744073709551615 +772B5847F788:E48:g3AAAABGAUxyNBAyO1qrfH/CIk8ueNUAAAAJAAAAAHcEcmFuZGEJYgJjkaBYdw1ub25vZGVAbm9ob3N0AAAAAAAAAAAAAAAA +772B5847F7A0:Rf772B45AD8AC0 +772B5847F7B8:t3:A3:max,A4:type,A4:next +772B5847F7D8:E48:g3AAAABGAUxyNBAyO1qrfH/CIk8ueNUAAAAKAAAAAHcEcmFuZGEKYgJjkaBYdw1ub25vZGVAbm9ob3N0AAAAAAAAAAAAAAAA +772B5847F7F0:Rf772B45AD8B38 +772B5847F808:E48:g3AAAABGAUxyNBAyO1qrfH/CIk8ueNUAAAALAAAAAHcEcmFuZGELYgJjkaBYdw1ub25vZGVAbm9ob3N0AAAAAAAAAAAAAAAA +772B5847F820:Rf772B45AD8BB0 +772B5847F838:E48:g3AAAABGAUxyNBAyO1qrfH/CIk8ueNUAAAAMAAAAAHcEcmFuZGEMYgJjkaBYdw1ub25vZGVAbm9ob3N0AAAAAAAAAAAAAAAA +772B5847F850:Rf772B45AD8C28 +772B5847F868:t5:A4:type,A4:next,A4:bits,AD:weak_low_bits,A4:jump +772B5847F898:E48:g3AAAABGAUxyNBAyO1qrfH/CIk8ueNUAAAANAAAAAHcEcmFuZGENYgJjkaBYdw1ub25vZGVAbm9ob3N0AAAAAAAAAAAAAAAA +772B5847F8B0:Rf772B45AD8CA0 +772B5847F8C8:E48:g3AAAABGAUxyNBAyO1qrfH/CIk8ueNUAAAAOAAAAAHcEcmFuZGEOYgJjkaBYdw1ub25vZGVAbm9ob3N0AAAAAAAAAAAAAAAA +772B5847F8E0:Rf772B45AD8D18 +772B5847F8F8:E48:g3AAAABGAUxyNBAyO1qrfH/CIk8ueNUAAAAPAAAAAHcEcmFuZGEPYgJjkaBYdw1ub25vZGVAbm9ob3N0AAAAAAAAAAAAAAAA +772B5847F910:Rf772B45AD8D90 +772B5847F928:E48:g3AAAABGAkxyNBAyO1qrfH/CIk8ueNUAAAAQAAAAAHcEcmFuZGEQYgJjkaBYdw1ub25vZGVAbm9ob3N0AAAAAAAAAAAAAAAA +772B5847F940:Rf772B45AD8E08 +772B5847F958:E48:g3AAAABGAUxyNBAyO1qrfH/CIk8ueNUAAAARAAAAAHcEcmFuZGERYgJjkaBYdw1ub25vZGVAbm9ob3N0AAAAAAAAAAAAAAAA +772B5847F970:Rf772B45AD8E80 +772B5847F988:E48:g3AAAABGAUxyNBAyO1qrfH/CIk8ueNUAAAASAAAAAHcEcmFuZGESYgJjkaBYdw1ub25vZGVAbm9ob3N0AAAAAAAAAAAAAAAA +772B5847F9A0:Rf772B45AD8EF8 +772B5847F9B8:E48:g3AAAABGAUxyNBAyO1qrfH/CIk8ueNUAAAATAAAAAHcEcmFuZGETYgJjkaBYdw1ub25vZGVAbm9ob3N0AAAAAAAAAAAAAAAA +772B5847F9D0:Rf772B45AD8F70 +772B5847F9E8:E48:g3AAAABGAUxyNBAyO1qrfH/CIk8ueNUAAAAUAAAAAHcEcmFuZGEUYgJjkaBYdw1ub25vZGVAbm9ob3N0AAAAAAAAAAAAAAAA +772B5847FA00:Rf772B45AD8FE8 +772B5847FA18:E48:g3AAAABGAkxyNBAyO1qrfH/CIk8ueNUAAAAVAAAAAHcEcmFuZGEVYgJjkaBYdw1ub25vZGVAbm9ob3N0AAAAAAAAAAAAAAAA +772B5847FA30:Rf772B45AD9060 +772B5847FA48:E48:g3AAAABGAUxyNBAyO1qrfH/CIk8ueNUAAAAWAAAAAHcEcmFuZGEWYgJjkaBYdw1ub25vZGVAbm9ob3N0AAAAAAAAAAAAAAAA +772B5847FA60:Rf772B45AD90D8 +772B5847FA78:E48:g3AAAABGAUxyNBAyO1qrfH/CIk8ueNUAAAAXAAAAAHcEcmFuZGEXYgJjkaBYdw1ub25vZGVAbm9ob3N0AAAAAAAAAAAAAAAA +772B5847FA90:Rf772B45AD9150 +772B5847FAA8:E48:g3AAAABGAUxyNBAyO1qrfH/CIk8ueNUAAAAYAAAAAHcEcmFuZGEYYgJjkaBYdw1ub25vZGVAbm9ob3N0AAAAAAAAAAAAAAAA +772B5847FAC0:Rf772B45AD91C8 +772B5847FAD8:E48:g3AAAABGAUxyNBAyO1qrfH/CIk8ueNUAAAAZAAAAAHcEcmFuZGEZYgJjkaBYdw1ub25vZGVAbm9ob3N0AAAAAAAAAAAAAAAA +772B5847FAF0:Rf772B45AD9240 +772B5847FB08:E48:g3AAAABGAkxyNBAyO1qrfH/CIk8ueNUAAAAaAAAAAHcEcmFuZGEaYgJjkaBYdw1ub25vZGVAbm9ob3N0AAAAAAAAAAAAAAAA +772B5847FB20:Rf772B45AD92B8 +772B5847FB38:t5:A4:type,A4:next,A4:bits,A7:uniform,A9:uniform_n +772B5847FB68:E48:g3AAAABGAUxyNBAyO1qrfH/CIk8ueNUAAAAbAAAAAHcEcmFuZGEbYgJjkaBYdw1ub25vZGVAbm9ob3N0AAAAAAAAAAAAAAAA +772B5847FB80:Rf772B45AD9330 +772B5847FB98:B2685821657736338717 +772B5847FBA8:B18446744073709551614 +772B5847FBB8:B1181783497276652981 +772B5847FBC8:E48:g3AAAABGAkxyNBAyO1qrfH/CIk8ueNUAAAAcAAAAAHcEcmFuZGEcYgJjkaBYdw1ub25vZGVAbm9ob3N0AAAAAAAAAAAAAAAA +772B5847FBE0:Rf772B45AD93A8 +772B5847FBF8:E48:g3AAAABGAUxyNBAyO1qrfH/CIk8ueNUAAAAdAAAAAHcEcmFuZGEdYgJjkaBYdw1ub25vZGVAbm9ob3N0AAAAAAAAAAAAAAAA +772B5847FC10:Rf772B45AD9420 +772B5847FC28:B11400714819323198485 +772B5847FC38:B13787848793156543929 +772B5847FC48:B10723151780598845931 +772B5847FC58:B9223372036854775808 +772B58480A30:t2:A5:error,AB:not_boolean +772B58480A48:t2:A5:error,A17:global_group_not_runnig +772B58480A60:t2:A5:local,AC:global_group +772B58480A78:t1:AD:connection_id +772B58480A88:Mf1:H772B58480A78:A4:true +772B58480AA8:lA9:undefined|N +772B58480AB8:Mf0:H772B58410188: +772B58480AD0:t2:A4:node,AB:test3844zty +772B58480AE8:t2:A5:error,A15:illegal_function_call +772B58480B00:t2:A5:error,A1A:no global_groups definiton +772B58480B18:t2:H772B58480B30,H772B58480B48 +772B58480B30:Mf0:H772B58410188: +772B58480B48:Mf0:H772B58410188: +772B58480B60:t3:N,N,N +772B58480B80:lI103|H772B58480B90 +772B58480B90:lI108|H772B58480BA0 +772B58480BA0:lI111|H772B58480BB0 +772B58480BB0:lI98|H772B58480BC0 +772B58480BC0:lI97|H772B58480BD0 +772B58480BD0:lI108|H772B58480BE0 +772B58480BE0:lI95|H772B58480BF0 +772B58480BF0:lI103|H772B58480C00 +772B58480C00:lI114|H772B58480C10 +772B58480C10:lI111|H772B58480C20 +772B58480C20:lI117|H772B58480C30 +772B58480C30:lI112|H772B58480C40 +772B58480C40:lI58|H772B58480C50 +772B58480C50:lI32|H772B58480C60 +772B58480C60:lI67|H772B58480C70 +772B58480C70:lI111|H772B58480C80 +772B58480C80:lI117|H772B58480C90 +772B58480C90:lI108|H772B58480CA0 +772B58480CA0:lI100|H772B58480CB0 +772B58480CB0:lI32|H772B58480CC0 +772B58480CC0:lI110|H772B58480CD0 +772B58480CD0:lI111|H772B58480CE0 +772B58480CE0:lI116|H772B58480CF0 +772B58480CF0:lI32|H772B58480D00 +772B58480D00:lI115|H772B58480D10 +772B58480D10:lI121|H772B58480D20 +772B58480D20:lI110|H772B58480D30 +772B58480D30:lI99|H772B58480D40 +772B58480D40:lI104|H772B58480D50 +772B58480D50:lI114|H772B58480D60 +772B58480D60:lI111|H772B58480D70 +772B58480D70:lI110|H772B58480D80 +772B58480D80:lI105|H772B58480D90 +772B58480D90:lI122|H772B58480DA0 +772B58480DA0:lI101|H772B58480DB0 +772B58480DB0:lI32|H772B58480DC0 +772B58480DC0:lI119|H772B58480DD0 +772B58480DD0:lI105|H772B58480DE0 +772B58480DE0:lI116|H772B58480DF0 +772B58480DF0:lI104|H772B58480E00 +772B58480E00:lI32|H772B58480E10 +772B58480E10:lI110|H772B58480E20 +772B58480E20:lI111|H772B58480E30 +772B58480E30:lI100|H772B58480E40 +772B58480E40:lI101|H772B58480E50 +772B58480E50:lI32|H772B58480E60 +772B58480E60:lI126|H772B58480E70 +772B58480E70:lI112|H772B58480E80 +772B58480E80:lI126|H772B58480E90 +772B58480E90:lI110|H772B58480EA0 +772B58480EA0:lI98|H772B58480EB0 +772B58480EB0:lI101|H772B58480EC0 +772B58480EC0:lI99|H772B58480ED0 +772B58480ED0:lI97|H772B58480EE0 +772B58480EE0:lI117|H772B58480EF0 +772B58480EF0:lI115|H772B58480F00 +772B58480F00:lI101|H772B58480F10 +772B58480F10:lI32|H772B58480F20 +772B58480F20:lI103|H772B58480F30 +772B58480F30:lI108|H772B58480F40 +772B58480F40:lI111|H772B58480F50 +772B58480F50:lI98|H772B58480F60 +772B58480F60:lI97|H772B58480F70 +772B58480F70:lI108|H772B58480F80 +772B58480F80:lI95|H772B58480F90 +772B58480F90:lI103|H772B58480FA0 +772B58480FA0:lI114|H772B58480FB0 +772B58480FB0:lI111|H772B58480FC0 +772B58480FC0:lI117|H772B58480FD0 +772B58480FD0:lI112|H772B58480FE0 +772B58480FE0:lI115|H772B58480FF0 +772B58480FF0:lI32|H772B58481000 +772B58481000:lI112|H772B58481010 +772B58481010:lI97|H772B58481020 +772B58481020:lI114|H772B58481030 +772B58481030:lI97|H772B58481040 +772B58481040:lI109|H772B58481050 +772B58481050:lI101|H772B58481060 +772B58481060:lI116|H772B58481070 +772B58481070:lI101|H772B58481080 +772B58481080:lI114|H772B58481090 +772B58481090:lI32|H772B584810A0 +772B584810A0:lI119|H772B584810B0 +772B584810B0:lI101|H772B584810C0 +772B584810C0:lI114|H772B584810D0 +772B584810D0:lI101|H772B584810E0 +772B584810E0:lI32|H772B584810F0 +772B584810F0:lI110|H772B58481100 +772B58481100:lI111|H772B58481110 +772B58481110:lI116|H772B58481120 +772B58481120:lI32|H772B58481130 +772B58481130:lI105|H772B58481140 +772B58481140:lI110|H772B58481150 +772B58481150:lI32|H772B58481160 +772B58481160:lI97|H772B58481170 +772B58481170:lI103|H772B58481180 +772B58481180:lI114|H772B58481190 +772B58481190:lI101|H772B584811A0 +772B584811A0:lI101|H772B584811B0 +772B584811B0:lI109|H772B584811C0 +772B584811C0:lI101|H772B584811D0 +772B584811D0:lI110|H772B584811E0 +772B584811E0:lI116|H772B584811F0 +772B584811F0:lI46|H772B58481200 +772B58481200:lI126|H772B58481210 +772B58481210:lI110|N +772B58481220:t2:A4:erpc,AC:noconnection +772B58481238:t9:A5:gconf,A7:invalid,A9:undefined,N,A6:normal,N,A3:all,N,A7:no_conf +772B58481288:t2:A2:ok,A3:all +772B584812A0:lI108|N +772B584812B0:lI114|H772B584812A0 +772B584812C0:lI101|H772B584812B0 +772B584812D0:lI46|H772B584812C0 +772B584812E0:lI112|H772B584812D0 +772B584812F0:lI117|H772B584812E0 +772B58481300:lI111|H772B584812F0 +772B58481310:lI114|H772B58481300 +772B58481320:lI103|H772B58481310 +772B58481330:lI95|H772B58481320 +772B58481340:lI108|H772B58481330 +772B58481350:lI97|H772B58481340 +772B58481360:lI98|H772B58481350 +772B58481370:lI111|H772B58481360 +772B58481380:lI108|H772B58481370 +772B58481390:lI103|H772B58481380 +772B584813A0:E50:g3AAAABOAO7U8l6EhIOhRghQb58VXvQAAAAAAAAAAHcMZ2xvYmFsX2dyb3VwYQBiB3anklh3DW5vbm9kZUBub2hvc3QAAAAAAAAAAAAAAAA= +772B584813B8:Rf772B45ADDF70 +772B584813D0:E50:g3AAAABOAu7U8l6EhIOhRghQb58VXvQAAAABAAAAAHcMZ2xvYmFsX2dyb3VwYQFiB3anklh3DW5vbm9kZUBub2hvc3QAAAAAAAAAAAAAAAA= +772B584813E8:Rf772B45ADDFE8 +772B58481400:E50:g3AAAABOAu7U8l6EhIOhRghQb58VXvQAAAACAAAAAHcMZ2xvYmFsX2dyb3VwYQJiB3anklh3DW5vbm9kZUBub2hvc3QAAAAAAAAAAAAAAAA= +772B58481418:Rf772B45ADE060 +772B58481430:E50:g3AAAABOAu7U8l6EhIOhRghQb58VXvQAAAADAAAAAHcMZ2xvYmFsX2dyb3VwYQNiB3anklh3DW5vbm9kZUBub2hvc3QAAAAAAAAAAAAAAAA= +772B58481448:Rf772B45ADE0D8 +772B58481460:Rf772B45ADE150 +772B58481478:Rf772B45ADE1C8 +772B58481490:Rf772B45ADE240 +772B584814A8:E50:g3AAAABOA+7U8l6EhIOhRghQb58VXvQAAAAHAAAAAHcMZ2xvYmFsX2dyb3VwYQdiB3anklh3DW5vbm9kZUBub2hvc3QAAAAAAAAAAAAAAAA= +772B584814C0:Rf772B45ADE2B8 +772B584814D8:E50:g3AAAABOAu7U8l6EhIOhRghQb58VXvQAAAAIAAAAAHcMZ2xvYmFsX2dyb3VwYQhiB3anklh3DW5vbm9kZUBub2hvc3QAAAAAAAAAAAAAAAA= +772B584814F0:Rf772B45ADE330 +772B58481508:Rf772B45ADE3A8 +772B58481520:Rf772B45ADE420 +772B58481538:Rf772B45ADE498 +772B584815E8:lN|N +772B584815F8:t2:A4:erpc,A6:badarg +772B58481610:lH772B58481630|H772B58481620 +772B58481620:lA7:monitor|N +772B58481630:t2:A5:reply,AA:error_only +772B58481648:t2:A4:erpc,AC:noconnection +772B58481660:t2:A4:erpc,A7:timeout +772B58481678:Mf0:H772B58410188: +772B58481690:lH772B584816A0|N +772B584816A0:t2:A5:reply,A2:no +772B584816B8:lA4:info|N +772B584816C8:t2:A5:reply,AA:error_only +772B584816E0:t2:A5:error,H772B584816F8 +772B584816F8:t2:A4:erpc,A7:timeout +772B58481710:lI108|N +772B58481720:lI114|H772B58481710 +772B58481730:lI101|H772B58481720 +772B58481740:lI46|H772B58481730 +772B58481750:lI99|H772B58481740 +772B58481760:lI112|H772B58481750 +772B58481770:lI114|H772B58481760 +772B58481780:lI101|H772B58481770 +772B58481790:E48:g3AAAABGAgL4vzN7YoMp6vvx2I7le0oAAAAAAAAAAHcEZXJwY2EAYgAXxflYdw1ub25vZGVAbm9ob3N0AAAAAAAAAAAAAAAA +772B584817A8:Rf772B45ADFD98 +772B584817C0:E48:g3AAAABGAwL4vzN7YoMp6vvx2I7le0oAAAABAAAAAHcEZXJwY2EBYgAXxflYdw1ub25vZGVAbm9ob3N0AAAAAAAAAAAAAAAA +772B584817D8:Rf772B45ADFE10 +772B584817F0:t1:AA:local_call +772B58484620:lA8:infinity|N +772B58484630:lH772B58484640|N +772B58484640:t2:A8:postpone,A5:false +772B58484658:lAA:gen_statem|N +772B58484668:t1:A3:t0q +772B58484678:Mf1:H772B58484668:N +772B58484698:lH772B584846A8|N +772B584846A8:t2:A8:internal,AA:init_state +772B584846C0:t5:A5:state,H772B584846F0,N,H772B58484718,A5:false +772B584846F0:t2:A9:undefined,A9:undefined +772B58484708:t1:A3:t0q +772B58484718:Mf1:H772B58484708:N +772B58484738:t2:A4:exit,A6:normal +772B58484750:lI83|H772B58484760 +772B58484760:lI116|H772B58484770 +772B58484770:lI97|H772B58484780 +772B58484780:lI116|H772B58484790 +772B58484790:lI117|H772B584847A0 +772B584847A0:lI115|H772B584847B0 +772B584847B0:lI32|H772B584847C0 +772B584847C0:lI102|H772B584847D0 +772B584847D0:lI111|H772B584847E0 +772B584847E0:lI114|H772B584847F0 +772B584847F0:lI32|H772B58484800 +772B58484800:lI115|H772B58484810 +772B58484810:lI116|H772B58484820 +772B58484820:lI97|H772B58484830 +772B58484830:lI116|H772B58484840 +772B58484840:lI101|H772B58484850 +772B58484850:lI32|H772B58484860 +772B58484860:lI109|H772B58484870 +772B58484870:lI97|H772B58484880 +772B58484880:lI99|H772B58484890 +772B58484890:lI104|H772B584848A0 +772B584848A0:lI105|H772B584848B0 +772B584848B0:lI110|H772B584848C0 +772B584848C0:lI101|N +772B584848D0:Mf0:H772B58410188: +772B584848E8:lI83|H772B584848F8 +772B584848F8:lI116|H772B58484908 +772B58484908:lI97|H772B58484918 +772B58484918:lI116|H772B58484928 +772B58484928:lI101|N +772B58484938:lI80|H772B58484948 +772B58484948:lI111|H772B58484958 +772B58484958:lI115|H772B58484968 +772B58484968:lI116|H772B58484978 +772B58484978:lI112|H772B58484988 +772B58484988:lI111|H772B58484998 +772B58484998:lI110|H772B584849A8 +772B584849A8:lI101|H772B584849B8 +772B584849B8:lI100|N +772B584849C8:lI76|H772B584849D8 +772B584849D8:lI111|H772B584849E8 +772B584849E8:lI103|H772B584849F8 +772B584849F8:lI103|H772B58484A08 +772B58484A08:lI101|H772B58484A18 +772B58484A18:lI100|H772B58484A28 +772B58484A28:lI32|H772B58484A38 +772B58484A38:lI69|H772B58484A48 +772B58484A48:lI118|H772B58484A58 +772B58484A58:lI101|H772B58484A68 +772B58484A68:lI110|H772B58484A78 +772B58484A78:lI116|H772B58484A88 +772B58484A88:lI115|N +772B58484A98:lI84|H772B58484AA8 +772B58484AA8:lI105|H772B58484AB8 +772B58484AB8:lI109|H772B58484AC8 +772B58484AC8:lI101|H772B58484AD8 +772B58484AD8:lI45|H772B58484AE8 +772B58484AE8:lI111|H772B58484AF8 +772B58484AF8:lI117|H772B58484B08 +772B58484B08:lI116|H772B58484B18 +772B58484B18:lI115|N +772B58484B28:lI77|H772B58484B38 +772B58484B38:lI111|H772B58484B48 +772B58484B48:lI100|H772B58484B58 +772B58484B58:lI117|H772B58484B68 +772B58484B68:lI108|H772B58484B78 +772B58484B78:lI101|H772B58484B88 +772B58484B88:lI115|N +772B58484B98:lI80|H772B58484BA8 +772B58484BA8:lI97|H772B58484BB8 +772B58484BB8:lI114|H772B58484BC8 +772B58484BC8:lI101|H772B58484BD8 +772B58484BD8:lI110|H772B58484BE8 +772B58484BE8:lI116|N +772B58484BF8:lI83|H772B58484C08 +772B58484C08:lI116|H772B58484C18 +772B58484C18:lI97|H772B58484C28 +772B58484C28:lI116|H772B58484C38 +772B58484C38:lI117|H772B58484C48 +772B58484C48:lI115|N +772B58484C58:lI126|H772B58484C68 +772B58484C68:lI116|H772B58484C78 +772B58484C78:lI112|N +772B58484C88:lI126|H772B58484C98 +772B58484C98:lI116|H772B58484CA8 +772B58484CA8:lI112|H772B58484CB8 +772B58484CB8:lI32|H772B58484CC8 +772B58484CC8:lI61|H772B58484CD8 +772B58484CD8:lI62|H772B58484CE8 +772B58484CE8:lI32|H772B58484CF8 +772B58484CF8:lI126|H772B58484D08 +772B58484D08:lI116|H772B58484D18 +772B58484D18:lI112|N +772B58484D28:lI42|H772B58484D38 +772B58484D38:lI68|H772B58484D48 +772B58484D48:lI66|H772B58484D58 +772B58484D58:lI71|H772B58484D68 +772B58484D68:lI42|H772B58484D78 +772B58484D78:lI32|H772B58484D88 +772B58484D88:lI126|H772B58484D98 +772B58484D98:lI116|H772B58484DA8 +772B58484DA8:lI112|H772B58484DB8 +772B58484DB8:lI32|H772B58484DC8 +772B58484DC8:lI126|H772B58484DD8 +772B58484DD8:lI116|H772B58484DE8 +772B58484DE8:lI119|H772B58484DF8 +772B58484DF8:lI32|H772B58484E08 +772B58484E08:lI126|H772B58484E18 +772B58484E18:lI116|H772B58484E28 +772B58484E28:lI115|H772B58484E38 +772B58484E38:lI32|H772B58484E48 +772B58484E48:lI105|H772B58484E58 +772B58484E58:lI110|H772B58484E68 +772B58484E68:lI32|H772B58484E78 +772B58484E78:lI115|H772B58484E88 +772B58484E88:lI116|H772B58484E98 +772B58484E98:lI97|H772B58484EA8 +772B58484EA8:lI116|H772B58484EB8 +772B58484EB8:lI101|H772B58484EC8 +772B58484EC8:lI32|H772B58484ED8 +772B58484ED8:lI126|H772B58484EE8 +772B58484EE8:lI116|H772B58484EF8 +772B58484EF8:lI115|H772B58484F08 +772B58484F08:lI126|H772B58484F18 +772B58484F18:lI110|N +772B58484F28:lI42|H772B58484F38 +772B58484F38:lI68|H772B58484F48 +772B58484F48:lI66|H772B58484F58 +772B58484F58:lI71|H772B58484F68 +772B58484F68:lI42|H772B58484F78 +772B58484F78:lI32|H772B58484F88 +772B58484F88:lI126|H772B58484F98 +772B58484F98:lI116|H772B58484FA8 +772B58484FA8:lI112|H772B58484FB8 +772B58484FB8:lI32|H772B58484FC8 +772B58484FC8:lI116|H772B58484FD8 +772B58484FD8:lI101|H772B58484FE8 +772B58484FE8:lI114|H772B58484FF8 +772B58484FF8:lI109|H772B58485008 +772B58485008:lI105|H772B58485018 +772B58485018:lI110|H772B58485028 +772B58485028:lI97|H772B58485038 +772B58485038:lI116|H772B58485048 +772B58485048:lI101|H772B58485058 +772B58485058:lI32|H772B58485068 +772B58485068:lI126|H772B58485078 +772B58485078:lI116|H772B58485088 +772B58485088:lI112|H772B58485098 +772B58485098:lI32|H772B584850A8 +772B584850A8:lI105|H772B584850B8 +772B584850B8:lI110|H772B584850C8 +772B584850C8:lI32|H772B584850D8 +772B584850D8:lI115|H772B584850E8 +772B584850E8:lI116|H772B584850F8 +772B584850F8:lI97|H772B58485108 +772B58485108:lI116|H772B58485118 +772B58485118:lI101|H772B58485128 +772B58485128:lI32|H772B58485138 +772B58485138:lI126|H772B58485148 +772B58485148:lI116|H772B58485158 +772B58485158:lI112|H772B58485168 +772B58485168:lI126|H772B58485178 +772B58485178:lI110|N +772B58485188:lI42|H772B58485198 +772B58485198:lI68|H772B584851A8 +772B584851A8:lI66|H772B584851B8 +772B584851B8:lI71|H772B584851C8 +772B584851C8:lI42|H772B584851D8 +772B584851D8:lI32|H772B584851E8 +772B584851E8:lI126|H772B584851F8 +772B584851F8:lI116|H772B58485208 +772B58485208:lI112|H772B58485218 +772B58485218:lI32|H772B58485228 +772B58485228:lI115|H772B58485238 +772B58485238:lI116|H772B58485248 +772B58485248:lI97|H772B58485258 +772B58485258:lI114|H772B58485268 +772B58485268:lI116|H772B58485278 +772B58485278:lI95|H772B58485288 +772B58485288:lI116|H772B58485298 +772B58485298:lI105|H772B584852A8 +772B584852A8:lI109|H772B584852B8 +772B584852B8:lI101|H772B584852C8 +772B584852C8:lI114|H772B584852D8 +772B584852D8:lI32|H772B584852E8 +772B584852E8:lI126|H772B584852F8 +772B584852F8:lI116|H772B58485308 +772B58485308:lI112|H772B58485318 +772B58485318:lI32|H772B58485328 +772B58485328:lI105|H772B58485338 +772B58485338:lI110|H772B58485348 +772B58485348:lI32|H772B58485358 +772B58485358:lI115|H772B58485368 +772B58485368:lI116|H772B58485378 +772B58485378:lI97|H772B58485388 +772B58485388:lI116|H772B58485398 +772B58485398:lI101|H772B584853A8 +772B584853A8:lI32|H772B584853B8 +772B584853B8:lI126|H772B584853C8 +772B584853C8:lI116|H772B584853D8 +772B584853D8:lI112|H772B584853E8 +772B584853E8:lI126|H772B584853F8 +772B584853F8:lI110|N +772B58485408:lI42|H772B58485418 +772B58485418:lI68|H772B58485428 +772B58485428:lI66|H772B58485438 +772B58485438:lI71|H772B58485448 +772B58485448:lI42|H772B58485458 +772B58485458:lI32|H772B58485468 +772B58485468:lI126|H772B58485478 +772B58485478:lI116|H772B58485488 +772B58485488:lI112|H772B58485498 +772B58485498:lI32|H772B584854A8 +772B584854A8:lI115|H772B584854B8 +772B584854B8:lI101|H772B584854C8 +772B584854C8:lI110|H772B584854D8 +772B584854D8:lI100|H772B584854E8 +772B584854E8:lI32|H772B584854F8 +772B584854F8:lI126|H772B58485508 +772B58485508:lI116|H772B58485518 +772B58485518:lI112|H772B58485528 +772B58485528:lI32|H772B58485538 +772B58485538:lI116|H772B58485548 +772B58485548:lI111|H772B58485558 +772B58485558:lI32|H772B58485568 +772B58485568:lI126|H772B58485578 +772B58485578:lI116|H772B58485588 +772B58485588:lI119|H772B58485598 +772B58485598:lI126|H772B584855A8 +772B584855A8:lI110|N +772B584855B8:lI42|H772B584855C8 +772B584855C8:lI68|H772B584855D8 +772B584855D8:lI66|H772B584855E8 +772B584855E8:lI71|H772B584855F8 +772B584855F8:lI42|H772B58485608 +772B58485608:lI32|H772B58485618 +772B58485618:lI126|H772B58485628 +772B58485628:lI116|H772B58485638 +772B58485638:lI112|H772B58485648 +772B58485648:lI32|H772B58485658 +772B58485658:lI109|H772B58485668 +772B58485668:lI111|H772B58485678 +772B58485678:lI100|H772B58485688 +772B58485688:lI117|H772B58485698 +772B58485698:lI108|H772B584856A8 +772B584856A8:lI101|H772B584856B8 +772B584856B8:lI32|H772B584856C8 +772B584856C8:lI126|H772B584856D8 +772B584856D8:lI116|H772B584856E8 +772B584856E8:lI112|H772B584856F8 +772B584856F8:lI32|H772B58485708 +772B58485708:lI105|H772B58485718 +772B58485718:lI110|H772B58485728 +772B58485728:lI32|H772B58485738 +772B58485738:lI115|H772B58485748 +772B58485748:lI116|H772B58485758 +772B58485758:lI97|H772B58485768 +772B58485768:lI116|H772B58485778 +772B58485778:lI101|H772B58485788 +772B58485788:lI32|H772B58485798 +772B58485798:lI126|H772B584857A8 +772B584857A8:lI116|H772B584857B8 +772B584857B8:lI112|H772B584857C8 +772B584857C8:lI126|H772B584857D8 +772B584857D8:lI110|N +772B584857E8:lI42|H772B584857F8 +772B584857F8:lI68|H772B58485808 +772B58485808:lI66|H772B58485818 +772B58485818:lI71|H772B58485828 +772B58485828:lI42|H772B58485838 +772B58485838:lI32|H772B58485848 +772B58485848:lI126|H772B58485858 +772B58485858:lI116|H772B58485868 +772B58485868:lI112|H772B58485878 +772B58485878:lI32|H772B58485888 +772B58485888:lI105|H772B58485898 +772B58485898:lI110|H772B584858A8 +772B584858A8:lI115|H772B584858B8 +772B584858B8:lI101|H772B584858C8 +772B584858C8:lI114|H772B584858D8 +772B584858D8:lI116|H772B584858E8 +772B584858E8:lI95|H772B584858F8 +772B584858F8:lI116|H772B58485908 +772B58485908:lI105|H772B58485918 +772B58485918:lI109|H772B58485928 +772B58485928:lI101|H772B58485938 +772B58485938:lI111|H772B58485948 +772B58485948:lI117|H772B58485958 +772B58485958:lI116|H772B58485968 +772B58485968:lI32|H772B58485978 +772B58485978:lI126|H772B58485988 +772B58485988:lI116|H772B58485998 +772B58485998:lI112|H772B584859A8 +772B584859A8:lI32|H772B584859B8 +772B584859B8:lI105|H772B584859C8 +772B584859C8:lI110|H772B584859D8 +772B584859D8:lI32|H772B584859E8 +772B584859E8:lI115|H772B584859F8 +772B584859F8:lI116|H772B58485A08 +772B58485A08:lI97|H772B58485A18 +772B58485A18:lI116|H772B58485A28 +772B58485A28:lI101|H772B58485A38 +772B58485A38:lI32|H772B58485A48 +772B58485A48:lI126|H772B58485A58 +772B58485A58:lI116|H772B58485A68 +772B58485A68:lI112|H772B58485A78 +772B58485A78:lI126|H772B58485A88 +772B58485A88:lI110|N +772B58485A98:lI42|H772B58485AA8 +772B58485AA8:lI68|H772B58485AB8 +772B58485AB8:lI66|H772B58485AC8 +772B58485AC8:lI71|H772B58485AD8 +772B58485AD8:lI42|H772B58485AE8 +772B58485AE8:lI32|H772B58485AF8 +772B58485AF8:lI126|H772B58485B08 +772B58485B08:lI116|H772B58485B18 +772B58485B18:lI112|H772B58485B28 +772B58485B28:lI32|H772B58485B38 +772B58485B38:lI114|H772B58485B48 +772B58485B48:lI101|H772B58485B58 +772B58485B58:lI99|H772B58485B68 +772B58485B68:lI101|H772B58485B78 +772B58485B78:lI105|H772B58485B88 +772B58485B88:lI118|H772B58485B98 +772B58485B98:lI101|H772B58485BA8 +772B58485BA8:lI32|H772B58485BB8 +772B58485BB8:lI126|H772B58485BC8 +772B58485BC8:lI116|H772B58485BD8 +772B58485BD8:lI115|H772B58485BE8 +772B58485BE8:lI32|H772B58485BF8 +772B58485BF8:lI105|H772B58485C08 +772B58485C08:lI110|H772B58485C18 +772B58485C18:lI32|H772B58485C28 +772B58485C28:lI115|H772B58485C38 +772B58485C38:lI116|H772B58485C48 +772B58485C48:lI97|H772B58485C58 +772B58485C58:lI116|H772B58485C68 +772B58485C68:lI101|H772B58485C78 +772B58485C78:lI32|H772B58485C88 +772B58485C88:lI126|H772B58485C98 +772B58485C98:lI116|H772B58485CA8 +772B58485CA8:lI112|H772B58485CB8 +772B58485CB8:lI126|H772B58485CC8 +772B58485CC8:lI110|N +772B58485CD8:lI42|H772B58485CE8 +772B58485CE8:lI68|H772B58485CF8 +772B58485CF8:lI66|H772B58485D08 +772B58485D08:lI71|H772B58485D18 +772B58485D18:lI42|H772B58485D28 +772B58485D28:lI32|H772B58485D38 +772B58485D38:lI126|H772B58485D48 +772B58485D48:lI116|H772B58485D58 +772B58485D58:lI112|H772B58485D68 +772B58485D68:lI32|H772B58485D78 +772B58485D78:lI101|H772B58485D88 +772B58485D88:lI110|H772B58485D98 +772B58485D98:lI116|H772B58485DA8 +772B58485DA8:lI101|H772B58485DB8 +772B58485DB8:lI114|H772B58485DC8 +772B58485DC8:lI32|H772B58485DD8 +772B58485DD8:lI126|H772B58485DE8 +772B58485DE8:lI116|H772B58485DF8 +772B58485DF8:lI112|H772B58485E08 +772B58485E08:lI32|H772B58485E18 +772B58485E18:lI105|H772B58485E28 +772B58485E28:lI110|H772B58485E38 +772B58485E38:lI32|H772B58485E48 +772B58485E48:lI115|H772B58485E58 +772B58485E58:lI116|H772B58485E68 +772B58485E68:lI97|H772B58485E78 +772B58485E78:lI116|H772B58485E88 +772B58485E88:lI101|H772B58485E98 +772B58485E98:lI32|H772B58485EA8 +772B58485EA8:lI126|H772B58485EB8 +772B58485EB8:lI116|H772B58485EC8 +772B58485EC8:lI112|H772B58485ED8 +772B58485ED8:lI126|H772B58485EE8 +772B58485EE8:lI110|N +772B58485EF8:lI99|H772B58485F08 +772B58485F08:lI97|H772B58485F18 +772B58485F18:lI108|H772B58485F28 +772B58485F28:lI108|H772B58485F38 +772B58485F38:lI32|H772B58485F48 +772B58485F48:lI126|H772B58485F58 +772B58485F58:lI116|H772B58485F68 +772B58485F68:lI112|H772B58485F78 +772B58485F78:lI32|H772B58485F88 +772B58485F88:lI102|H772B58485F98 +772B58485F98:lI114|H772B58485FA8 +772B58485FA8:lI111|H772B58485FB8 +772B58485FB8:lI109|H772B58485FC8 +772B58485FC8:lI32|H772B58485FD8 +772B58485FD8:lI126|H772B58485FE8 +772B58485FE8:lI116|H772B58485FF8 +772B58485FF8:lI119|N +772B58486008:lI126|H772B58486018 +772B58486018:lI116|H772B58486028 +772B58486028:lI119|H772B58486038 +772B58486038:lI32|H772B58486048 +772B58486048:lI126|H772B58486058 +772B58486058:lI116|H772B58486068 +772B58486068:lI112|N +772B58486078:t2:A2B:should_not_have_arrived_here_but_instead_in,H772B58486090 +772B58486090:t3:AA:gen_statem,A15:wakeup_from_hibernate,I3 +772B584860B0:t2:A2A:bad_state_enter_action_from_state_function,A8:postpone +772B584860C8:t2:A2A:bad_state_enter_action_from_state_function,A13:pop_callback_module +772B584860E0:t2:AA:gen_statem,A9:terminate +772B584860F8:t3:AC:error_logger,A6:domain,A9:report_cb +772B58486118:Mf3:H772B584860F8:H772B58486170,H772B58486148,H772B5841B5F0 +772B58486148:lA3:otp|N +772B58486158:t2:A3:tag,A9:report_cb +772B58486170:Mf2:H772B58486158:A5:error,H772B5841B5E0 +772B58486198:t3:A4:line,A4:file,A3:mfa +772B584861B8:Mf3:H772B58486198:I4975,H772B584861E8,H772B584862C8 +772B584861E8:lI103|H772B584861F8 +772B584861F8:lI101|H772B58486208 +772B58486208:lI110|H772B58486218 +772B58486218:lI95|H772B58486228 +772B58486228:lI115|H772B58486238 +772B58486238:lI116|H772B58486248 +772B58486248:lI97|H772B58486258 +772B58486258:lI116|H772B58486268 +772B58486268:lI101|H772B58486278 +772B58486278:lI109|H772B58486288 +772B58486288:lI46|H772B58486298 +772B58486298:lI101|H772B584862A8 +772B584862A8:lI114|H772B584862B8 +772B584862B8:lI108|N +772B584862C8:t3:AA:gen_statem,AA:error_info,I7 +772B584862E8:lA12:current_stacktrace|H772B584862F8 +772B584862F8:lAF:registered_name|N +772B58486308:t4:AB:chars_limit,A5:depth,AB:single_line,A8:encoding +772B58486330:Mf4:H772B58486308:A9:unlimited,A9:unlimited,A5:false,A4:utf8 +772B58486368:lI46|H772B58486378 +772B58486378:lI32|H772B58486388 +772B58486388:lI76|H772B58486398 +772B58486398:lI97|H772B584863A8 +772B584863A8:lI98|H772B584863B8 +772B584863B8:lI101|H772B584863C8 +772B584863C8:lI108|H772B584863D8 +772B584863D8:lI58|H772B584863E8 +772B584863E8:lI32|N +772B584863F8:lI46|H772B58486408 +772B58486408:lI32|H772B58486418 +772B58486418:lI83|H772B58486428 +772B58486428:lI116|H772B58486438 +772B58486438:lI97|H772B58486448 +772B58486448:lI99|H772B58486458 +772B58486458:lI107|H772B58486468 +772B58486468:lI58|H772B58486478 +772B58486478:lI32|N +772B58486488:lI46|H772B58486498 +772B58486498:lI32|H772B584864A8 +772B584864A8:lI76|H772B584864B8 +772B584864B8:lI97|H772B584864C8 +772B584864C8:lI115|H772B584864D8 +772B584864D8:lI116|H772B584864E8 +772B584864E8:lI32|H772B584864F8 +772B584864F8:lI101|H772B58486508 +772B58486508:lI118|H772B58486518 +772B58486518:lI101|H772B58486528 +772B58486528:lI110|H772B58486538 +772B58486538:lI116|H772B58486548 +772B58486548:lI58|H772B58486558 +772B58486558:lI32|N +772B58486568:lI46|H772B58486578 +772B58486578:lI32|H772B58486588 +772B58486588:lI76|H772B58486598 +772B58486598:lI111|H772B584865A8 +772B584865A8:lI103|H772B584865B8 +772B584865B8:lI58|H772B584865C8 +772B584865C8:lI32|N +772B584865D8:lH772B584865E8|N +772B584865E8:lI46|N +772B584865F8:lI46|H772B58486608 +772B58486608:lI32|H772B58486618 +772B58486618:lI83|H772B58486628 +772B58486628:lI116|H772B58486638 +772B58486638:lI97|H772B58486648 +772B58486648:lI116|H772B58486658 +772B58486658:lI101|H772B58486668 +772B58486668:lI58|H772B58486678 +772B58486678:lI32|N +772B58486688:lI46|H772B58486698 +772B58486698:lI32|H772B584866A8 +772B584866A8:lI82|H772B584866B8 +772B584866B8:lI101|H772B584866C8 +772B584866C8:lI97|H772B584866D8 +772B584866D8:lI115|H772B584866E8 +772B584866E8:lI111|H772B584866F8 +772B584866F8:lI110|H772B58486708 +772B58486708:lI58|H772B58486718 +772B58486718:lI32|N +772B58486728:lI32|H772B58486738 +772B58486738:lI116|H772B58486748 +772B58486748:lI101|H772B58486758 +772B58486758:lI114|H772B58486768 +772B58486768:lI109|H772B58486778 +772B58486778:lI105|H772B58486788 +772B58486788:lI110|H772B58486798 +772B58486798:lI97|H772B584867A8 +772B584867A8:lI116|H772B584867B8 +772B584867B8:lI105|H772B584867C8 +772B584867C8:lI110|H772B584867D8 +772B584867D8:lI103|N +772B584867E8:lI83|H772B584867F8 +772B584867F8:lI116|H772B58486808 +772B58486808:lI97|H772B58486818 +772B58486818:lI116|H772B58486828 +772B58486828:lI101|H772B58486838 +772B58486838:lI32|H772B58486848 +772B58486848:lI109|H772B58486858 +772B58486858:lI97|H772B58486868 +772B58486868:lI99|H772B58486878 +772B58486878:lI104|H772B58486888 +772B58486888:lI105|H772B58486898 +772B58486898:lI110|H772B584868A8 +772B584868A8:lI101|H772B584868B8 +772B584868B8:lI32|N +772B584868C8:lAB:state_enter|N +772B584868D8:lI126|H772B584868E8 +772B584868E8:lI110|N +772B584868F8:lI42|H772B58486908 +772B58486908:lI42|H772B58486918 +772B58486918:lI32|H772B58486928 +772B58486928:lI80|H772B58486938 +772B58486938:lI114|H772B58486948 +772B58486948:lI111|H772B58486958 +772B58486958:lI99|H772B58486968 +772B58486968:lI101|H772B58486978 +772B58486978:lI115|H772B58486988 +772B58486988:lI115|H772B58486998 +772B58486998:lI32|H772B584869A8 +772B584869A8:lI108|H772B584869B8 +772B584869B8:lI97|H772B584869C8 +772B584869C8:lI98|H772B584869D8 +772B584869D8:lI101|H772B584869E8 +772B584869E8:lI108|H772B584869F8 +772B584869F8:lI32|H772B58486A08 +772B58486A08:lI61|H772B58486A18 +772B58486A18:lI32|N +772B58486A28:lI42|H772B58486A38 +772B58486A38:lI42|H772B58486A48 +772B58486A48:lI32|H772B58486A58 +772B58486A58:lI76|H772B58486A68 +772B58486A68:lI97|H772B58486A78 +772B58486A78:lI115|H772B58486A88 +772B58486A88:lI116|H772B58486A98 +772B58486A98:lI32|H772B58486AA8 +772B58486AA8:lI101|H772B58486AB8 +772B58486AB8:lI118|H772B58486AC8 +772B58486AC8:lI101|H772B58486AD8 +772B58486AD8:lI110|H772B58486AE8 +772B58486AE8:lI116|H772B58486AF8 +772B58486AF8:lI32|H772B58486B08 +772B58486B08:lI61|H772B58486B18 +772B58486B18:lI32|N +772B58486B28:lI42|H772B58486B38 +772B58486B38:lI42|H772B58486B48 +772B58486B48:lI32|H772B58486B58 +772B58486B58:lI81|H772B58486B68 +772B58486B68:lI117|H772B58486B78 +772B58486B78:lI101|H772B58486B88 +772B58486B88:lI117|H772B58486B98 +772B58486B98:lI101|H772B58486BA8 +772B58486BA8:lI100|H772B58486BB8 +772B58486BB8:lI32|H772B58486BC8 +772B58486BC8:lI61|H772B58486BD8 +772B58486BD8:lI32|N +772B58486BE8:lI42|H772B58486BF8 +772B58486BF8:lI42|H772B58486C08 +772B58486C08:lI32|H772B58486C18 +772B58486C18:lI80|H772B58486C28 +772B58486C28:lI111|H772B58486C38 +772B58486C38:lI115|H772B58486C48 +772B58486C48:lI116|H772B58486C58 +772B58486C58:lI112|H772B58486C68 +772B58486C68:lI111|H772B58486C78 +772B58486C78:lI110|H772B58486C88 +772B58486C88:lI101|H772B58486C98 +772B58486C98:lI100|H772B58486CA8 +772B58486CA8:lI32|H772B58486CB8 +772B58486CB8:lI61|H772B58486CC8 +772B58486CC8:lI32|N +772B58486CD8:lI42|H772B58486CE8 +772B58486CE8:lI42|H772B58486CF8 +772B58486CF8:lI32|H772B58486D08 +772B58486D08:lI83|H772B58486D18 +772B58486D18:lI116|H772B58486D28 +772B58486D28:lI97|H772B58486D38 +772B58486D38:lI99|H772B58486D48 +772B58486D48:lI107|H772B58486D58 +772B58486D58:lI116|H772B58486D68 +772B58486D68:lI114|H772B58486D78 +772B58486D78:lI97|H772B58486D88 +772B58486D88:lI99|H772B58486D98 +772B58486D98:lI101|H772B58486DA8 +772B58486DA8:lI32|H772B58486DB8 +772B58486DB8:lI61|H772B58486DC8 +772B58486DC8:lI126|H772B58486DD8 +772B58486DD8:lI110|H772B58486DE8 +772B58486DE8:lI42|H772B58486DF8 +772B58486DF8:lI42|H772B58486E08 +772B58486E08:lI32|H772B58486E18 +772B58486E18:lI32|N +772B58486E28:lI42|H772B58486E38 +772B58486E38:lI42|H772B58486E48 +772B58486E48:lI32|H772B58486E58 +772B58486E58:lI84|H772B58486E68 +772B58486E68:lI105|H772B58486E78 +772B58486E78:lI109|H772B58486E88 +772B58486E88:lI101|H772B58486E98 +772B58486E98:lI45|H772B58486EA8 +772B58486EA8:lI111|H772B58486EB8 +772B58486EB8:lI117|H772B58486EC8 +772B58486EC8:lI116|H772B58486ED8 +772B58486ED8:lI115|H772B58486EE8 +772B58486EE8:lI58|H772B58486EF8 +772B58486EF8:lI32|N +772B58486F08:lI42|H772B58486F18 +772B58486F18:lI42|H772B58486F28 +772B58486F28:lI32|H772B58486F38 +772B58486F38:lI76|H772B58486F48 +772B58486F48:lI111|H772B58486F58 +772B58486F58:lI103|H772B58486F68 +772B58486F68:lI32|H772B58486F78 +772B58486F78:lI61|H772B58486F88 +772B58486F88:lI126|H772B58486F98 +772B58486F98:lI110|H772B58486FA8 +772B58486FA8:lI42|H772B58486FB8 +772B58486FB8:lI42|H772B58486FC8 +772B58486FC8:lI32|H772B58486FD8 +772B58486FD8:lI32|N +772B58486FE8:lI42|H772B58486FF8 +772B58486FF8:lI42|H772B58487008 +772B58487008:lI32|H772B58487018 +772B58487018:lI67|H772B58487028 +772B58487028:lI97|H772B58487038 +772B58487038:lI108|H772B58487048 +772B58487048:lI108|H772B58487058 +772B58487058:lI98|H772B58487068 +772B58487068:lI97|H772B58487078 +772B58487078:lI99|H772B58487088 +772B58487088:lI107|H772B58487098 +772B58487098:lI32|H772B584870A8 +772B584870A8:lI109|H772B584870B8 +772B584870B8:lI111|H772B584870C8 +772B584870C8:lI100|H772B584870D8 +772B584870D8:lI101|H772B584870E8 +772B584870E8:lI32|H772B584870F8 +772B584870F8:lI61|H772B58487108 +772B58487108:lI32|N +772B58487118:lI42|H772B58487128 +772B58487128:lI42|H772B58487138 +772B58487138:lI32|H772B58487148 +772B58487148:lI67|H772B58487158 +772B58487158:lI97|H772B58487168 +772B58487168:lI108|H772B58487178 +772B58487178:lI108|H772B58487188 +772B58487188:lI98|H772B58487198 +772B58487198:lI97|H772B584871A8 +772B584871A8:lI99|H772B584871B8 +772B584871B8:lI107|H772B584871C8 +772B584871C8:lI32|H772B584871D8 +772B584871D8:lI109|H772B584871E8 +772B584871E8:lI111|H772B584871F8 +772B584871F8:lI100|H772B58487208 +772B58487208:lI117|H772B58487218 +772B58487218:lI108|H772B58487228 +772B58487228:lI101|H772B58487238 +772B58487238:lI115|H772B58487248 +772B58487248:lI32|H772B58487258 +772B58487258:lI61|H772B58487268 +772B58487268:lI32|N +772B58487278:lI58|N +772B58487288:lI42|H772B58487298 +772B58487298:lI42|H772B584872A8 +772B584872A8:lI32|H772B584872B8 +772B584872B8:lI82|H772B584872C8 +772B584872C8:lI101|H772B584872D8 +772B584872D8:lI97|H772B584872E8 +772B584872E8:lI115|H772B584872F8 +772B584872F8:lI111|H772B58487308 +772B58487308:lI110|H772B58487318 +772B58487318:lI32|H772B58487328 +772B58487328:lI102|H772B58487338 +772B58487338:lI111|H772B58487348 +772B58487348:lI114|H772B58487358 +772B58487358:lI32|H772B58487368 +772B58487368:lI116|H772B58487378 +772B58487378:lI101|H772B58487388 +772B58487388:lI114|H772B58487398 +772B58487398:lI109|H772B584873A8 +772B584873A8:lI105|H772B584873B8 +772B584873B8:lI110|H772B584873C8 +772B584873C8:lI97|H772B584873D8 +772B584873D8:lI116|H772B584873E8 +772B584873E8:lI105|H772B584873F8 +772B584873F8:lI111|H772B58487408 +772B58487408:lI110|H772B58487418 +772B58487418:lI32|H772B58487428 +772B58487428:lI61|H772B58487438 +772B58487438:lI32|N +772B58487448:lI42|H772B58487458 +772B58487458:lI42|H772B58487468 +772B58487468:lI32|H772B58487478 +772B58487478:lI87|H772B58487488 +772B58487488:lI104|H772B58487498 +772B58487498:lI101|H772B584874A8 +772B584874A8:lI110|H772B584874B8 +772B584874B8:lI32|H772B584874C8 +772B584874C8:lI115|H772B584874D8 +772B584874D8:lI101|H772B584874E8 +772B584874E8:lI114|H772B584874F8 +772B584874F8:lI118|H772B58487508 +772B58487508:lI101|H772B58487518 +772B58487518:lI114|H772B58487528 +772B58487528:lI32|H772B58487538 +772B58487538:lI115|H772B58487548 +772B58487548:lI116|H772B58487558 +772B58487558:lI97|H772B58487568 +772B58487568:lI116|H772B58487578 +772B58487578:lI101|H772B58487588 +772B58487588:lI32|H772B58487598 +772B58487598:lI32|H772B584875A8 +772B584875A8:lI61|H772B584875B8 +772B584875B8:lI32|N +772B584875C8:lI32|H772B584875D8 +772B584875D8:lI116|H772B584875E8 +772B584875E8:lI101|H772B584875F8 +772B584875F8:lI114|H772B58487608 +772B58487608:lI109|H772B58487618 +772B58487618:lI105|H772B58487628 +772B58487628:lI110|H772B58487638 +772B58487638:lI97|H772B58487648 +772B58487648:lI116|H772B58487658 +772B58487658:lI105|H772B58487668 +772B58487668:lI110|H772B58487678 +772B58487678:lI103|H772B58487688 +772B58487688:lI126|H772B58487698 +772B58487698:lI110|N +772B584876A8:lI42|H772B584876B8 +772B584876B8:lI42|H772B584876C8 +772B584876C8:lI32|H772B584876D8 +772B584876D8:lI83|H772B584876E8 +772B584876E8:lI116|H772B584876F8 +772B584876F8:lI97|H772B58487708 +772B58487708:lI116|H772B58487718 +772B58487718:lI101|H772B58487728 +772B58487728:lI32|H772B58487738 +772B58487738:lI109|H772B58487748 +772B58487748:lI97|H772B58487758 +772B58487758:lI99|H772B58487768 +772B58487768:lI104|H772B58487778 +772B58487778:lI105|H772B58487788 +772B58487788:lI110|H772B58487798 +772B58487798:lI101|H772B584877A8 +772B584877A8:lI32|N +772B584877B8:lI32|H772B584877C8 +772B584877C8:lI115|H772B584877D8 +772B584877D8:lI116|H772B584877E8 +772B584877E8:lI97|H772B584877F8 +772B584877F8:lI99|H772B58487808 +772B58487808:lI107|H772B58487818 +772B58487818:lI116|H772B58487828 +772B58487828:lI114|H772B58487838 +772B58487838:lI97|H772B58487848 +772B58487848:lI99|H772B58487858 +772B58487858:lI101|H772B58487868 +772B58487868:lI58|H772B58487878 +772B58487878:lI32|N +772B58487888:lI32|H772B58487898 +772B58487898:lI67|H772B584878A8 +772B584878A8:lI108|H772B584878B8 +772B584878B8:lI105|H772B584878C8 +772B584878C8:lI101|H772B584878D8 +772B584878D8:lI110|H772B584878E8 +772B584878E8:lI116|H772B584878F8 +772B584878F8:lI32|N +772B58487908:lI32|H772B58487918 +772B58487918:lI67|H772B58487928 +772B58487928:lI108|H772B58487938 +772B58487938:lI105|H772B58487948 +772B58487948:lI101|H772B58487958 +772B58487958:lI110|H772B58487968 +772B58487968:lI116|H772B58487978 +772B58487978:lI32|H772B58487988 +772B58487988:lI126|H772B58487998 +772B58487998:lI48|H772B584879A8 +772B584879A8:lI112|H772B584879B8 +772B584879B8:lI32|H772B584879C8 +772B584879C8:lI105|H772B584879D8 +772B584879D8:lI115|H772B584879E8 +772B584879E8:lI32|H772B584879F8 +772B584879F8:lI114|H772B58487A08 +772B58487A08:lI101|H772B58487A18 +772B58487A18:lI109|H772B58487A28 +772B58487A28:lI111|H772B58487A38 +772B58487A38:lI116|H772B58487A48 +772B58487A48:lI101|H772B58487A58 +772B58487A58:lI32|H772B58487A68 +772B58487A68:lI111|H772B58487A78 +772B58487A78:lI110|H772B58487A88 +772B58487A88:lI32|H772B58487A98 +772B58487A98:lI110|H772B58487AA8 +772B58487AA8:lI111|H772B58487AB8 +772B58487AB8:lI100|H772B58487AC8 +772B58487AC8:lI101|H772B58487AD8 +772B58487AD8:lI32|H772B58487AE8 +772B58487AE8:lI126|H772B58487AF8 +772B58487AF8:lI48|H772B58487B08 +772B58487B08:lI112|H772B58487B18 +772B58487B18:lI46|N +772B58487B28:lI32|H772B58487B38 +772B58487B38:lI67|H772B58487B48 +772B58487B48:lI108|H772B58487B58 +772B58487B58:lI105|H772B58487B68 +772B58487B68:lI101|H772B58487B78 +772B58487B78:lI110|H772B58487B88 +772B58487B88:lI116|H772B58487B98 +772B58487B98:lI32|H772B58487BA8 +772B58487BA8:lI126|H772B58487BB8 +772B58487BB8:lI48|H772B58487BC8 +772B58487BC8:lI112|H772B58487BD8 +772B58487BD8:lI32|H772B58487BE8 +772B58487BE8:lI105|H772B58487BF8 +772B58487BF8:lI115|H772B58487C08 +772B58487C08:lI32|H772B58487C18 +772B58487C18:lI100|H772B58487C28 +772B58487C28:lI101|H772B58487C38 +772B58487C38:lI97|H772B58487C48 +772B58487C48:lI100|H772B58487C58 +772B58487C58:lI46|N +772B58487C68:t2:N,N +772B58487C80:lH772B58487C90|N +772B58487C90:lI126|H772B58487CA0 +772B58487CA0:lI110|N +772B58487CB0:lI32|H772B58487CC0 +772B58487CC0:lI115|H772B58487CD0 +772B58487CD0:lI116|H772B58487CE0 +772B58487CE0:lI97|H772B58487CF0 +772B58487CF0:lI99|H772B58487D00 +772B58487D00:lI107|H772B58487D10 +772B58487D10:lI116|H772B58487D20 +772B58487D20:lI114|H772B58487D30 +772B58487D30:lI97|H772B58487D40 +772B58487D40:lI99|H772B58487D50 +772B58487D50:lI101|H772B58487D60 +772B58487D60:lI126|H772B58487D70 +772B58487D70:lI110|H772B58487D80 +772B58487D80:lI42|H772B58487D90 +772B58487D90:lI42|H772B58487DA0 +772B58487DA0:lI32|N +772B58487DB0:lI42|H772B58487DC0 +772B58487DC0:lI42|H772B58487DD0 +772B58487DD0:lI32|H772B58487DE0 +772B58487DE0:lI67|H772B58487DF0 +772B58487DF0:lI108|H772B58487E00 +772B58487E00:lI105|H772B58487E10 +772B58487E10:lI101|H772B58487E20 +772B58487E20:lI110|H772B58487E30 +772B58487E30:lI116|H772B58487E40 +772B58487E40:lI32|N +772B58487E50:lI42|H772B58487E60 +772B58487E60:lI42|H772B58487E70 +772B58487E70:lI32|H772B58487E80 +772B58487E80:lI67|H772B58487E90 +772B58487E90:lI108|H772B58487EA0 +772B58487EA0:lI105|H772B58487EB0 +772B58487EB0:lI101|H772B58487EC0 +772B58487EC0:lI110|H772B58487ED0 +772B58487ED0:lI116|H772B58487EE0 +772B58487EE0:lI32|H772B58487EF0 +772B58487EF0:lI126|H772B58487F00 +772B58487F00:lI112|H772B58487F10 +772B58487F10:lI32|H772B58487F20 +772B58487F20:lI105|H772B58487F30 +772B58487F30:lI115|H772B58487F40 +772B58487F40:lI32|H772B58487F50 +772B58487F50:lI114|H772B58487F60 +772B58487F60:lI101|H772B58487F70 +772B58487F70:lI109|H772B58487F80 +772B58487F80:lI111|H772B58487F90 +772B58487F90:lI116|H772B58487FA0 +772B58487FA0:lI101|H772B58487FB0 +772B58487FB0:lI32|H772B58487FC0 +772B58487FC0:lI111|H772B58487FD0 +772B58487FD0:lI110|H772B58487FE0 +772B58487FE0:lI32|H772B58487FF0 +772B58487FF0:lI110|H772B58488000 +772B58488000:lI111|H772B58488010 +772B58488010:lI100|H772B58488020 +772B58488020:lI101|H772B58488030 +772B58488030:lI32|H772B58488040 +772B58488040:lI126|H772B58488050 +772B58488050:lI112|H772B58488060 +772B58488060:lI126|H772B58488070 +772B58488070:lI110|N +772B58488080:lI42|H772B58488090 +772B58488090:lI42|H772B584880A0 +772B584880A0:lI32|H772B584880B0 +772B584880B0:lI67|H772B584880C0 +772B584880C0:lI108|H772B584880D0 +772B584880D0:lI105|H772B584880E0 +772B584880E0:lI101|H772B584880F0 +772B584880F0:lI110|H772B58488100 +772B58488100:lI116|H772B58488110 +772B58488110:lI32|H772B58488120 +772B58488120:lI126|H772B58488130 +772B58488130:lI112|H772B58488140 +772B58488140:lI32|H772B58488150 +772B58488150:lI105|H772B58488160 +772B58488160:lI115|H772B58488170 +772B58488170:lI32|H772B58488180 +772B58488180:lI100|H772B58488190 +772B58488190:lI101|H772B584881A0 +772B584881A0:lI97|H772B584881B0 +772B584881B0:lI100|H772B584881C0 +772B584881C0:lI126|H772B584881D0 +772B584881D0:lI110|N +772B584881E0:lI112|N +772B584881F0:lI80|N +772B58488200:lI48|N +772B58488210:lI116|N +772B58488220:lH772B58488280|H772B58488230 +772B58488230:lH772B58488298|H772B58488240 +772B58488240:lH772B584882B0|H772B58488250 +772B58488250:lH772B584882C8|H772B58488260 +772B58488260:lH772B584882E0|H772B58488270 +772B58488270:lH772B584882F8|N +772B58488280:t2:AD:format_status,I1 +772B58488298:t2:AD:format_status,I2 +772B584882B0:t2:A9:terminate,I3 +772B584882C8:t2:AB:code_change,I4 +772B584882E0:t2:A9:StateName,I3 +772B584882F8:t2:AC:handle_event,I4 +772B58488310:lH772B58488390|H772B58488320 +772B58488320:lH772B584883A8|H772B58488330 +772B58488330:lH772B584883C0|H772B58488340 +772B58488340:lH772B584883D8|H772B58488350 +772B58488350:lH772B584883F0|H772B58488360 +772B58488360:lH772B58488408|H772B58488370 +772B58488370:lH772B58488420|H772B58488380 +772B58488380:lH772B58488438|N +772B58488390:t2:A4:init,I1 +772B584883A8:t2:AD:callback_mode,I0 +772B584883C0:t2:A9:StateName,I3 +772B584883D8:t2:AC:handle_event,I4 +772B584883F0:t2:A9:terminate,I3 +772B58488408:t2:AB:code_change,I4 +772B58488420:t2:AD:format_status,I2 +772B58488438:t2:AD:format_status,I1 +772B58488450:lI108|N +772B58488460:lI114|H772B58488450 +772B58488470:lI101|H772B58488460 +772B58488480:lI46|H772B58488470 +772B58488490:lI109|H772B58488480 +772B584884A0:lI101|H772B58488490 +772B584884B0:lI116|H772B584884A0 +772B584884C0:lI97|H772B584884B0 +772B584884D0:lI116|H772B584884C0 +772B584884E0:lI115|H772B584884D0 +772B584884F0:lI95|H772B584884E0 +772B58488500:lI110|H772B584884F0 +772B58488510:lI101|H772B58488500 +772B58488520:lI103|H772B58488510 +772B58488530:t5:A4:data,A3:log,A5:state,A9:postponed,A8:timeouts +772B58488560:E4E:g3AAAABMA5MhHKoKYoUTCn41LDSDQA8AAAAAAAAAAHcKZ2VuX3N0YXRlbWEAYgSZCOVYdw1ub25vZGVAbm9ob3N0AAAAAAAAAAAAAAAA +772B58488578:Rf772B45AE7838 +772B58488590:t7:A4:data,A6:reason,A3:log,A5:state,A5:queue,A9:postponed,A8:timeouts +772B584885D0:tD:A5:label,A4:name,A6:reason,A3:log,A5:state,A5:queue,A7:modules,AB:client_info,AD:process_label,AD:callback_mode,A9:postponed,A8:timeouts,AB:state_enter +772B58488640:t4:AB:chars_limit,A5:depth,AB:single_line,A8:encoding +772B58488668:Rf772B45AE78B0 +772B58488680:Rf772B45AE7928 +772B584886B0:Yc6451BC511D70:6451BC511D90:9C +772B584886C8:Yc6451BC511D70:0:9C +772B584886F0:lI27|H772B58488700 +772B58488700:lI91|H772B58488710 +772B58488710:lI126|H772B58488720 +772B58488720:lI119|H772B58488730 +772B58488730:lI59|H772B58488740 +772B58488740:lI126|H772B58488750 +772B58488750:lI119|H772B58488760 +772B58488760:lI109|N +772B58488770:Mf0:H772B58410188: +772B58488788:lI112|H772B58488798 +772B58488798:lI114|H772B584887A8 +772B584887A8:lI105|H772B584887B8 +772B584887B8:lI109|H772B584887C8 +772B584887C8:lI95|H772B584887D8 +772B584887D8:lI116|H772B584887E8 +772B584887E8:lI116|H772B584887F8 +772B584887F8:lI121|N +772B58488808:t2:A5:error,A7:enotsup +772B58488820:lH772B58488850|H772B58488830 +772B58488830:lH772B584888B0|H772B58488840 +772B58488840:lH772B58488930|N +772B58488850:lI76|H772B58488860 +772B58488860:lI67|H772B58488870 +772B58488870:lI95|H772B58488880 +772B58488880:lI65|H772B58488890 +772B58488890:lI76|H772B584888A0 +772B584888A0:lI76|N +772B584888B0:lI76|H772B584888C0 +772B584888C0:lI67|H772B584888D0 +772B584888D0:lI95|H772B584888E0 +772B584888E0:lI67|H772B584888F0 +772B584888F0:lI84|H772B58488900 +772B58488900:lI89|H772B58488910 +772B58488910:lI80|H772B58488920 +772B58488920:lI69|N +772B58488930:lI76|H772B58488940 +772B58488940:lI65|H772B58488950 +772B58488950:lI78|H772B58488960 +772B58488960:lI71|N +772B58488970:lA7:unicode|N +772B58488980:Yh7:G1tIG1sySg== +772B58488998:Yh3:G1tB +772B584889B0:Yh1:Cg== +772B584889C8:Yh1:CA== +772B584889E0:Yh3:G1tD +772B584889F8:Yh4:G1sxSQ== +772B58488A10:Yh3:G1tK +772B58488A28:Yh4:G1s2bg== +772B58488A40:Yh15:G1xbKFswLTldKyk7KFswLTldKylS +772B58488A68:t4:A5:input,A4:echo,A3:tty,A5:canon +772B58488A90:Mf4:H772B58488A68:A4:true,A5:false,A4:true,A5:false +772B58488AC8:lI84|H772B58488AD8 +772B58488AD8:lI69|H772B58488AE8 +772B58488AE8:lI82|H772B58488AF8 +772B58488AF8:lI77|N +772B58488B08:lI99|H772B58488B18 +772B58488B18:lI108|H772B58488B28 +772B58488B28:lI101|H772B58488B38 +772B58488B38:lI97|H772B58488B48 +772B58488B48:lI114|N +772B58488B58:lI99|H772B58488B68 +772B58488B68:lI111|N +772B58488B78:lI117|H772B58488B88 +772B58488B88:lI112|N +772B58488B98:lI100|H772B58488BA8 +772B58488BA8:lI111|N +772B58488BB8:lI98|H772B58488BC8 +772B58488BC8:lI115|N +772B58488BD8:lI98|H772B58488BE8 +772B58488BE8:lI99|N +772B58488BF8:lI110|H772B58488C08 +772B58488C08:lI100|N +772B58488C18:lI73|H772B58488C28 +772B58488C28:lI67|N +772B58488C38:lI116|H772B58488C48 +772B58488C48:lI97|N +772B58488C58:lI68|H772B58488C68 +772B58488C68:lI67|N +772B58488C78:lI117|H772B58488C88 +772B58488C88:lI55|N +772B58488C98:lI117|H772B58488CA8 +772B58488CA8:lI54|N +772B58488CB8:t2:A2:ok,H772B58488CD0 +772B58488CD0:YhA:G1slaSVkOyVkUg== +772B58488CF0:lI99|H772B58488D00 +772B58488D00:lI100|N +772B58488D10:lI120|H772B58488D20 +772B58488D20:lI110|N +772B58488D30:lH772B58488D40|N +772B58488D40:t2:A5:alias,AF:reply_demonitor +772B58488D58:Yh0: +772B58488D68:t2:A11:set_unicode_state,A5:false +772B58488D80:t2:A5:utf16,A6:little +772B58488D98:lI10|N +772B58488DA8:lI27|H772B58488DB8 +772B58488DB8:lI91|H772B58488DC8 +772B58488DC8:lI49|H772B58488DD8 +772B58488DD8:lI109|H772B58488DE8 +772B58488DE8:lI114|H772B58488DF8 +772B58488DF8:lI111|H772B58488E08 +772B58488E08:lI119|H772B58488E18 +772B58488E18:lI115|H772B58488E28 +772B58488E28:lI32|H772B58488E38 +772B58488E38:lI126|H772B58488E48 +772B58488E48:lI119|H772B58488E58 +772B58488E58:lI32|H772B58488E68 +772B58488E68:lI116|H772B58488E78 +772B58488E78:lI111|H772B58488E88 +772B58488E88:lI32|H772B58488E98 +772B58488E98:lI126|H772B58488EA8 +772B58488EA8:lI119|H772B58488EB8 +772B58488EB8:lI32|H772B58488EC8 +772B58488EC8:lI111|H772B58488ED8 +772B58488ED8:lI102|H772B58488EE8 +772B58488EE8:lI32|H772B58488EF8 +772B58488EF8:lI126|H772B58488F08 +772B58488F08:lI119|H772B58488F18 +772B58488F18:lI27|H772B58488F28 +772B58488F28:lI91|H772B58488F38 +772B58488F38:lI48|H772B58488F48 +772B58488F48:lI109|N +772B58488F58:lI13|H772B58488F68 +772B58488F68:lI10|N +772B58488F78:t2:A4:move,I0 +772B58488F90:lN|N +772B58488FA0:Yh1:Bw== +772B58488FB8:t2:N,N +772B58488FD0:Yh1:IA== +772B58488FE8:Yh1:DQ== +772B58489000:Yh2:DQo= +772B58489018:lI94|H772B58489028 +772B58489028:lI63|N +772B58489038:lI0|N +772B58489048:lI92|H772B58489058 +772B58489058:lI36|H772B58489068 +772B58489068:lI60|H772B58489078 +772B58489078:lI91|H772B58489088 +772B58489088:lI94|H772B58489098 +772B58489098:lI62|H772B584890A8 +772B584890A8:lI93|H772B584890B8 +772B584890B8:lI42|H772B584890C8 +772B584890C8:lI62|N +772B584890D8:lI85|H772B584890E8 +772B584890E8:lI84|H772B584890F8 +772B584890F8:lI70|H772B58489108 +772B58489108:lI45|H772B58489118 +772B58489118:lI56|N +772B58489128:lI108|N +772B58489138:lI114|H772B58489128 +772B58489148:lI101|H772B58489138 +772B58489158:lI46|H772B58489148 +772B58489168:lI121|H772B58489158 +772B58489178:lI116|H772B58489168 +772B58489188:lI116|H772B58489178 +772B58489198:lI95|H772B58489188 +772B584891A8:lI109|H772B58489198 +772B584891B8:lI105|H772B584891A8 +772B584891C8:lI114|H772B584891B8 +772B584891D8:lI112|H772B584891C8 +772B584891E8:E4C:g3AAAABKAaQLhtTCRQmyYWRmGlM93q0AAAAAAAAAAHcIcHJpbV90dHlhAGIFIFw2WHcNbm9ub2RlQG5vaG9zdAAAAAAAAAAAAAAAAA== +772B58489200:Rf772B45AEA3B8 +772B58489218:t2:A4:read,A5:write +772B58489230:E4C:g3AAAABKAaQLhtTCRQmyYWRmGlM93q0AAAABAAAAAHcIcHJpbV90dHlhAWIFIFw2WHcNbm9ub2RlQG5vaG9zdAAAAAAAAAAAAAAAAA== +772B58489248:Rf772B45AEA430 +772B58489260:E4C:g3AAAABKAaQLhtTCRQmyYWRmGlM93q0AAAACAAAAAHcIcHJpbV90dHlhAmIFIFw2WHcNbm9ub2RlQG5vaG9zdAAAAAAAAAAAAAAAAA== +772B58489278:Rf772B45AEA4A8 +772B5848B8A8:t2:A5:local,AA:logger_sup +772B5848B8C0:t3:A2:id,A8:shutdown,A5:start +772B5848B8E0:Mf3:H772B5848B8C0:A16:logger_handler_watcher,AB:brutal_kill,H772B5848B910 +772B5848B910:t3:A16:logger_handler_watcher,AA:start_link,N +772B5848B930:t3:A9:intensity,A6:period,A8:strategy +772B5848B950:Mf3:H772B5848B930:I1,I5,AB:one_for_one +772B5848B980:lI108|N +772B5848B990:lI114|H772B5848B980 +772B5848B9A0:lI101|H772B5848B990 +772B5848B9B0:lI46|H772B5848B9A0 +772B5848B9C0:lI112|H772B5848B9B0 +772B5848B9D0:lI117|H772B5848B9C0 +772B5848B9E0:lI115|H772B5848B9D0 +772B5848B9F0:lI95|H772B5848B9E0 +772B5848BA00:lI114|H772B5848B9F0 +772B5848BA10:lI101|H772B5848BA00 +772B5848BA20:lI103|H772B5848BA10 +772B5848BA30:lI103|H772B5848BA20 +772B5848BA40:lI111|H772B5848BA30 +772B5848BA50:lI108|H772B5848BA40 +772B5848BA78:lI126|N +772B5848BA88:t3:A3:key,H772B5848BAA8,N +772B5848BAA8:lI27|H772B5848BAB8 +772B5848BAB8:lI79|N +772B5848BAC8:t2:AD:escape_prefix,A9:meta_meta +772B5848BAE0:t2:AD:escape_prefix,A14:meta_left_sq_bracket +772B5848BAF8:t2:AD:escape_prefix,A8:meta_csi +772B5848BB10:t2:AD:escape_prefix,A4:meta +772B5848BB28:lA6:normal|H772B5848BB38 +772B5848BB38:lA6:search|H772B5848BB48 +772B5848BB48:lAA:tab_expand|H772B5848BB58 +772B5848BB58:lA4:help|N +772B5848BB68:Mf0:H772B58410188: +772B5848BB80:t8:A7:default,H772B5848BC20,H772B5848BC50,H772B5848BC80,H772B5848BCC0,H772B5848BD00,H772B5848BD30,H772B5848BD60 +772B5848BBC8:Mf8:H772B5848BB80:AF:tab_expand_quit,AE:move_expand_up,A10:move_expand_down,A10:scroll_expand_up,A12:scroll_expand_down,AE:move_expand_up,A10:move_expand_down,A9:help_full +772B5848BC20:lI27|H772B5848BC30 +772B5848BC30:lI79|H772B5848BC40 +772B5848BC40:lI65|N +772B5848BC50:lI27|H772B5848BC60 +772B5848BC60:lI79|H772B5848BC70 +772B5848BC70:lI66|N +772B5848BC80:lI27|H772B5848BC90 +772B5848BC90:lI91|H772B5848BCA0 +772B5848BCA0:lI53|H772B5848BCB0 +772B5848BCB0:lI126|N +772B5848BCC0:lI27|H772B5848BCD0 +772B5848BCD0:lI91|H772B5848BCE0 +772B5848BCE0:lI54|H772B5848BCF0 +772B5848BCF0:lI126|N +772B5848BD00:lI27|H772B5848BD10 +772B5848BD10:lI91|H772B5848BD20 +772B5848BD20:lI65|N +772B5848BD30:lI27|H772B5848BD40 +772B5848BD40:lI91|H772B5848BD50 +772B5848BD50:lI66|N +772B5848BD60:lI27|H772B5848BD70 +772B5848BD70:lI104|N +772B5848BD80:tF:A7:default,H772B5848BE90,H772B5848BEA0,H772B5848BEB0,H772B5848BEC0,H772B5848BED0,H772B5848BEE0,H772B5848BF00,H772B5848BF30,H772B5848BF60,H772B5848BFA0,H772B5848BFE0,H772B5848C010,H772B5848C040,H772B5848C060 +772B5848BE00:MfF:H772B5848BD80:AB:search_quit,A14:backward_delete_char,AC:search_found,AC:search_found,A7:skip_up,A9:skip_down,AD:search_cancel,AE:move_expand_up,A10:move_expand_down,A10:scroll_expand_up,A12:scroll_expand_down,AE:move_expand_up,A10:move_expand_down,AD:search_cancel,A14:backward_delete_char +772B5848BE90:lI8|N +772B5848BEA0:lI10|N +772B5848BEB0:lI13|N +772B5848BEC0:lI18|N +772B5848BED0:lI19|N +772B5848BEE0:lI27|H772B5848BEF0 +772B5848BEF0:lI67|N +772B5848BF00:lI27|H772B5848BF10 +772B5848BF10:lI79|H772B5848BF20 +772B5848BF20:lI65|N +772B5848BF30:lI27|H772B5848BF40 +772B5848BF40:lI79|H772B5848BF50 +772B5848BF50:lI66|N +772B5848BF60:lI27|H772B5848BF70 +772B5848BF70:lI91|H772B5848BF80 +772B5848BF80:lI53|H772B5848BF90 +772B5848BF90:lI126|N +772B5848BFA0:lI27|H772B5848BFB0 +772B5848BFB0:lI91|H772B5848BFC0 +772B5848BFC0:lI54|H772B5848BFD0 +772B5848BFD0:lI126|N +772B5848BFE0:lI27|H772B5848BFF0 +772B5848BFF0:lI91|H772B5848C000 +772B5848C000:lI65|N +772B5848C010:lI27|H772B5848C020 +772B5848C020:lI91|H772B5848C030 +772B5848C030:lI66|N +772B5848C040:lI27|H772B5848C050 +772B5848C050:lI99|N +772B5848C060:lI127|N +772B5848C070:t8:A7:default,H772B5848C110,H772B5848C120,H772B5848C150,H772B5848C180,H772B5848C1C0,H772B5848C200,H772B5848C230 +772B5848C0B8:Mf8:H772B5848C070:AF:tab_expand_quit,AF:tab_expand_full,AE:move_expand_up,A10:move_expand_down,A10:scroll_expand_up,A12:scroll_expand_down,AE:move_expand_up,A10:move_expand_down +772B5848C110:lI9|N +772B5848C120:lI27|H772B5848C130 +772B5848C130:lI79|H772B5848C140 +772B5848C140:lI65|N +772B5848C150:lI27|H772B5848C160 +772B5848C160:lI79|H772B5848C170 +772B5848C170:lI66|N +772B5848C180:lI27|H772B5848C190 +772B5848C190:lI91|H772B5848C1A0 +772B5848C1A0:lI53|H772B5848C1B0 +772B5848C1B0:lI126|N +772B5848C1C0:lI27|H772B5848C1D0 +772B5848C1D0:lI91|H772B5848C1E0 +772B5848C1E0:lI54|H772B5848C1F0 +772B5848C1F0:lI126|N +772B5848C200:lI27|H772B5848C210 +772B5848C210:lI91|H772B5848C220 +772B5848C220:lI65|N +772B5848C230:lI27|H772B5848C240 +772B5848C240:lI91|H772B5848C250 +772B5848C250:lI66|N +772B5848C260:lH772B5848D1F0|A14:backward_delete_char +772B5848C270:lH772B5848D1E0|AA:auto_blink +772B5848C280:lH772B5848D1C0|A12:backward_kill_word +772B5848C290:lH772B5848D1A0|AE:transpose_word +772B5848C2A0:lH772B5848D180|A11:format_expression +772B5848C2B0:lH772B5848D160|AB:open_editor +772B5848C2C0:lH772B5848D140|AB:redraw_line +772B5848C2D0:lH772B5848D120|A4:help +772B5848C2E0:lH772B5848D100|AC:forward_word +772B5848C2F0:lH772B5848D0E0|A9:kill_word +772B5848C300:lH772B5848D0C0|AA:clear_line +772B5848C310:lH772B5848D0A0|AD:backward_word +772B5848C320:lH772B5848D070|A11:beginning_of_line +772B5848C330:lH772B5848D040|AB:end_of_line +772B5848C340:lH772B5848D010|AD:backward_char +772B5848C350:lH772B5848CFE0|AC:forward_char +772B5848C360:lH772B5848CFB0|AC:history_down +772B5848C370:lH772B5848CF80|AA:history_up +772B5848C380:lH772B5848CF40|AD:backward_word +772B5848C390:lH772B5848CF00|AC:forward_word +772B5848C3A0:lH772B5848CEC0|A13:forward_delete_char +772B5848C3B0:lH772B5848CE80|AD:backward_word +772B5848C3C0:lH772B5848CE40|AC:forward_word +772B5848C3D0:lH772B5848CDE0|A13:forward_delete_word +772B5848C3E0:lH772B5848CD80|AD:backward_word +772B5848C3F0:lH772B5848CD20|AC:forward_word +772B5848C400:lH772B5848CCC0|AC:forward_line +772B5848C410:lH772B5848CC60|AD:backward_line +772B5848C420:lH772B5848CC00|A11:end_of_expression +772B5848C430:lH772B5848CBA0|A17:beginning_of_expression +772B5848C440:lH772B5848CB40|AD:backward_word +772B5848C450:lH772B5848CAE0|AC:forward_word +772B5848C460:lH772B5848CA80|AC:forward_line +772B5848C470:lH772B5848CA20|AD:backward_line +772B5848C480:lH772B5848CA00|AE:transpose_word +772B5848C490:lH772B5848C9D0|A11:beginning_of_line +772B5848C4A0:lH772B5848C9A0|AB:end_of_line +772B5848C4B0:lH772B5848C970|AD:backward_char +772B5848C4C0:lH772B5848C940|AC:forward_char +772B5848C4D0:lH772B5848C910|AC:history_down +772B5848C4E0:lH772B5848C8E0|AA:history_up +772B5848C4F0:lH772B5848C8C0|AB:redraw_line +772B5848C500:lH772B5848C8A0|AC:forward_word +772B5848C510:lH772B5848C880|A9:kill_word +772B5848C520:lH772B5848C860|AD:backward_word +772B5848C530:lH772B5848C840|A11:end_of_expression +772B5848C540:lH772B5848C820|A17:beginning_of_expression +772B5848C550:lH772B5848C800|A8:new_line +772B5848C560:lH772B5848C7E0|A8:new_line +772B5848C570:lH772B5848C7D0|A4:yank +772B5848C580:lH772B5848C7C0|A12:backward_kill_word +772B5848C590:lH772B5848C7B0|A12:backward_kill_line +772B5848C5A0:lH772B5848C7A0|AE:transpose_char +772B5848C5B0:lH772B5848C790|A6:search +772B5848C5C0:lH772B5848C780|AA:history_up +772B5848C5D0:lH772B5848C770|AB:open_editor +772B5848C5E0:lH772B5848C760|AC:history_down +772B5848C5F0:lH772B5848C750|AF:new_line_finish +772B5848C600:lH772B5848C740|A5:clear +772B5848C610:lH772B5848C730|A9:kill_line +772B5848C620:lH772B5848C720|AF:new_line_finish +772B5848C630:lH772B5848C710|AA:tab_expand +772B5848C640:lH772B5848C700|A14:backward_delete_char +772B5848C650:lH772B5848C6F0|AC:forward_char +772B5848C660:lH772B5848C6E0|AB:end_of_line +772B5848C670:lH772B5848C6D0|A13:forward_delete_char +772B5848C680:lH772B5848C6C0|AD:backward_char +772B5848C690:lH772B5848C6B0|A11:beginning_of_line +772B5848C6A0:lA7:default|A4:none +772B5848C6B0:lI1|N +772B5848C6C0:lI2|N +772B5848C6D0:lI4|N +772B5848C6E0:lI5|N +772B5848C6F0:lI6|N +772B5848C700:lI8|N +772B5848C710:lI9|N +772B5848C720:lI10|N +772B5848C730:lI11|N +772B5848C740:lI12|N +772B5848C750:lI13|N +772B5848C760:lI14|N +772B5848C770:lI15|N +772B5848C780:lI16|N +772B5848C790:lI18|N +772B5848C7A0:lI20|N +772B5848C7B0:lI21|N +772B5848C7C0:lI23|N +772B5848C7D0:lI25|N +772B5848C7E0:lI27|H772B5848C7F0 +772B5848C7F0:lI10|N +772B5848C800:lI27|H772B5848C810 +772B5848C810:lI13|N +772B5848C820:lI27|H772B5848C830 +772B5848C830:lI60|N +772B5848C840:lI27|H772B5848C850 +772B5848C850:lI62|N +772B5848C860:lI27|H772B5848C870 +772B5848C870:lI66|N +772B5848C880:lI27|H772B5848C890 +772B5848C890:lI68|N +772B5848C8A0:lI27|H772B5848C8B0 +772B5848C8B0:lI70|N +772B5848C8C0:lI27|H772B5848C8D0 +772B5848C8D0:lI76|N +772B5848C8E0:lI27|H772B5848C8F0 +772B5848C8F0:lI79|H772B5848C900 +772B5848C900:lI65|N +772B5848C910:lI27|H772B5848C920 +772B5848C920:lI79|H772B5848C930 +772B5848C930:lI66|N +772B5848C940:lI27|H772B5848C950 +772B5848C950:lI79|H772B5848C960 +772B5848C960:lI67|N +772B5848C970:lI27|H772B5848C980 +772B5848C980:lI79|H772B5848C990 +772B5848C990:lI68|N +772B5848C9A0:lI27|H772B5848C9B0 +772B5848C9B0:lI79|H772B5848C9C0 +772B5848C9C0:lI70|N +772B5848C9D0:lI27|H772B5848C9E0 +772B5848C9E0:lI79|H772B5848C9F0 +772B5848C9F0:lI72|N +772B5848CA00:lI27|H772B5848CA10 +772B5848CA10:lI84|N +772B5848CA20:lI27|H772B5848CA30 +772B5848CA30:lI91|H772B5848CA40 +772B5848CA40:lI49|H772B5848CA50 +772B5848CA50:lI59|H772B5848CA60 +772B5848CA60:lI51|H772B5848CA70 +772B5848CA70:lI65|N +772B5848CA80:lI27|H772B5848CA90 +772B5848CA90:lI91|H772B5848CAA0 +772B5848CAA0:lI49|H772B5848CAB0 +772B5848CAB0:lI59|H772B5848CAC0 +772B5848CAC0:lI51|H772B5848CAD0 +772B5848CAD0:lI66|N +772B5848CAE0:lI27|H772B5848CAF0 +772B5848CAF0:lI91|H772B5848CB00 +772B5848CB00:lI49|H772B5848CB10 +772B5848CB10:lI59|H772B5848CB20 +772B5848CB20:lI51|H772B5848CB30 +772B5848CB30:lI67|N +772B5848CB40:lI27|H772B5848CB50 +772B5848CB50:lI91|H772B5848CB60 +772B5848CB60:lI49|H772B5848CB70 +772B5848CB70:lI59|H772B5848CB80 +772B5848CB80:lI51|H772B5848CB90 +772B5848CB90:lI68|N +772B5848CBA0:lI27|H772B5848CBB0 +772B5848CBB0:lI91|H772B5848CBC0 +772B5848CBC0:lI49|H772B5848CBD0 +772B5848CBD0:lI59|H772B5848CBE0 +772B5848CBE0:lI52|H772B5848CBF0 +772B5848CBF0:lI65|N +772B5848CC00:lI27|H772B5848CC10 +772B5848CC10:lI91|H772B5848CC20 +772B5848CC20:lI49|H772B5848CC30 +772B5848CC30:lI59|H772B5848CC40 +772B5848CC40:lI52|H772B5848CC50 +772B5848CC50:lI66|N +772B5848CC60:lI27|H772B5848CC70 +772B5848CC70:lI91|H772B5848CC80 +772B5848CC80:lI49|H772B5848CC90 +772B5848CC90:lI59|H772B5848CCA0 +772B5848CCA0:lI53|H772B5848CCB0 +772B5848CCB0:lI65|N +772B5848CCC0:lI27|H772B5848CCD0 +772B5848CCD0:lI91|H772B5848CCE0 +772B5848CCE0:lI49|H772B5848CCF0 +772B5848CCF0:lI59|H772B5848CD00 +772B5848CD00:lI53|H772B5848CD10 +772B5848CD10:lI66|N +772B5848CD20:lI27|H772B5848CD30 +772B5848CD30:lI91|H772B5848CD40 +772B5848CD40:lI49|H772B5848CD50 +772B5848CD50:lI59|H772B5848CD60 +772B5848CD60:lI53|H772B5848CD70 +772B5848CD70:lI67|N +772B5848CD80:lI27|H772B5848CD90 +772B5848CD90:lI91|H772B5848CDA0 +772B5848CDA0:lI49|H772B5848CDB0 +772B5848CDB0:lI59|H772B5848CDC0 +772B5848CDC0:lI53|H772B5848CDD0 +772B5848CDD0:lI68|N +772B5848CDE0:lI27|H772B5848CDF0 +772B5848CDF0:lI91|H772B5848CE00 +772B5848CE00:lI51|H772B5848CE10 +772B5848CE10:lI59|H772B5848CE20 +772B5848CE20:lI53|H772B5848CE30 +772B5848CE30:lI126|N +772B5848CE40:lI27|H772B5848CE50 +772B5848CE50:lI91|H772B5848CE60 +772B5848CE60:lI51|H772B5848CE70 +772B5848CE70:lI67|N +772B5848CE80:lI27|H772B5848CE90 +772B5848CE90:lI91|H772B5848CEA0 +772B5848CEA0:lI51|H772B5848CEB0 +772B5848CEB0:lI68|N +772B5848CEC0:lI27|H772B5848CED0 +772B5848CED0:lI91|H772B5848CEE0 +772B5848CEE0:lI51|H772B5848CEF0 +772B5848CEF0:lI126|N +772B5848CF00:lI27|H772B5848CF10 +772B5848CF10:lI91|H772B5848CF20 +772B5848CF20:lI53|H772B5848CF30 +772B5848CF30:lI67|N +772B5848CF40:lI27|H772B5848CF50 +772B5848CF50:lI91|H772B5848CF60 +772B5848CF60:lI53|H772B5848CF70 +772B5848CF70:lI68|N +772B5848CF80:lI27|H772B5848CF90 +772B5848CF90:lI91|H772B5848CFA0 +772B5848CFA0:lI65|N +772B5848CFB0:lI27|H772B5848CFC0 +772B5848CFC0:lI91|H772B5848CFD0 +772B5848CFD0:lI66|N +772B5848CFE0:lI27|H772B5848CFF0 +772B5848CFF0:lI91|H772B5848D000 +772B5848D000:lI67|N +772B5848D010:lI27|H772B5848D020 +772B5848D020:lI91|H772B5848D030 +772B5848D030:lI68|N +772B5848D040:lI27|H772B5848D050 +772B5848D050:lI91|H772B5848D060 +772B5848D060:lI70|N +772B5848D070:lI27|H772B5848D080 +772B5848D080:lI91|H772B5848D090 +772B5848D090:lI72|N +772B5848D0A0:lI27|H772B5848D0B0 +772B5848D0B0:lI98|N +772B5848D0C0:lI27|H772B5848D0D0 +772B5848D0D0:lI99|N +772B5848D0E0:lI27|H772B5848D0F0 +772B5848D0F0:lI100|N +772B5848D100:lI27|H772B5848D110 +772B5848D110:lI102|N +772B5848D120:lI27|H772B5848D130 +772B5848D130:lI104|N +772B5848D140:lI27|H772B5848D150 +772B5848D150:lI108|N +772B5848D160:lI27|H772B5848D170 +772B5848D170:lI111|N +772B5848D180:lI27|H772B5848D190 +772B5848D190:lI114|N +772B5848D1A0:lI27|H772B5848D1B0 +772B5848D1B0:lI116|N +772B5848D1C0:lI27|H772B5848D1D0 +772B5848D1D0:lI127|N +772B5848D1E0:lI29|N +772B5848D1F0:lI127|N +772B5848D200:Mn3:H772B5848C510,H772B5848C550,H772B5848C5F0 +772B5848D220:Mn3:H772B5848C630,H772B5848C690,H772B5848C400 +772B5848D240:Mn9:H772B5848C4A0,H772B5848C420,H772B5848C360,H772B5848C600,H772B5848C3C0,H772B5848C4B0,H772B5848C350,H772B5848C3E0,H772B5848C560 +772B5848D290:Mn3:H772B5848C280,H772B5848C4E0,H772B5848C470 +772B5848D2B0:Mn2:H772B5848C5C0,H772B5848C670 +772B5848D2C8:Mn3:H772B5848C660,H772B5848C520,H772B5848C260 +772B5848D2E8:Mn5:H772B5848C570,H772B5848C430,H772B5848C5D0,H772B5848C3B0,H772B5848C2C0 +772B5848D318:Mn4:H772B5848C5B0,H772B5848C530,H772B5848C500,H772B5848C270 +772B5848D340:Mn2:H772B5848C580,H772B5848C620 +772B5848D358:Mn2:H772B5848C6A0,H772B5848C440 +772B5848D370:Mn3:H772B5848C2E0,H772B5848C3A0,H772B5848C450 +772B5848D390:MnA:H772B5848D370,H772B5848C540,H772B5848C4F0,H772B5848C3F0,H772B5848C290,H772B5848C5A0,H772B5848C640,H772B5848C4D0,H772B5848D358,H772B5848D340 +772B5848D3E8:Mn2:H772B5848C390,H772B5848C460 +772B5848D400:Mn6:H772B5848D3E8,H772B5848C310,H772B5848C2F0,H772B5848C680,H772B5848C590,H772B5848C650 +772B5848D438:Mn5:H772B5848C380,H772B5848C490,H772B5848C320,H772B5848C300,H772B5848C2D0 +772B5848D468:Mn4:H772B5848C2B0,H772B5848C5E0,H772B5848C340,H772B5848C610 +772B5848D490:Mn2:H772B5848C410,H772B5848C3D0 +772B5848D4A8:Mn4:H772B5848C370,H772B5848C480,H772B5848C4C0,H772B5848C2A0 +772B5848D4D0:Mh45:F:H772B5848D4A8,H772B5848D490,H772B5848D468,H772B5848D438,H772B5848C330,H772B5848D400,H772B5848D390,H772B5848D318,H772B5848D2E8,H772B5848D2C8,H772B5848D2B0,H772B5848D290,H772B5848D240,H772B5848D220,H772B5848D200 +772B5848D558:lAA:auto_blink|H772B5848D568 +772B5848D568:lAD:backward_char|H772B5848D578 +772B5848D578:lA14:backward_delete_char|H772B5848D588 +772B5848D588:lA14:backward_delete_word|H772B5848D598 +772B5848D598:lA12:backward_kill_line|H772B5848D5A8 +772B5848D5A8:lA12:backward_kill_word|H772B5848D5B8 +772B5848D5B8:lAD:backward_line|H772B5848D5C8 +772B5848D5C8:lAD:backward_word|H772B5848D5D8 +772B5848D5D8:lA17:beginning_of_expression|H772B5848D5E8 +772B5848D5E8:lA11:beginning_of_line|H772B5848D5F8 +772B5848D5F8:lA5:clear|H772B5848D608 +772B5848D608:lAA:clear_line|H772B5848D618 +772B5848D618:lA11:end_of_expression|H772B5848D628 +772B5848D628:lAB:end_of_line|H772B5848D638 +772B5848D638:lA11:format_expression|H772B5848D648 +772B5848D648:lAC:forward_char|H772B5848D658 +772B5848D658:lA13:forward_delete_char|H772B5848D668 +772B5848D668:lA13:forward_delete_word|H772B5848D678 +772B5848D678:lAC:forward_line|H772B5848D688 +772B5848D688:lAC:forward_word|H772B5848D698 +772B5848D698:lA4:help|H772B5848D6A8 +772B5848D6A8:lAC:history_down|H772B5848D6B8 +772B5848D6B8:lAA:history_up|H772B5848D6C8 +772B5848D6C8:lA9:kill_line|H772B5848D6D8 +772B5848D6D8:lA9:kill_word|H772B5848D6E8 +772B5848D6E8:lAE:move_expand_up|H772B5848D6F8 +772B5848D6F8:lA10:move_expand_down|H772B5848D708 +772B5848D708:lAF:new_line_finish|H772B5848D718 +772B5848D718:lA8:new_line|H772B5848D728 +772B5848D728:lA4:none|H772B5848D738 +772B5848D738:lAB:open_editor|H772B5848D748 +772B5848D748:lAB:redraw_line|H772B5848D758 +772B5848D758:lA10:scroll_expand_up|H772B5848D768 +772B5848D768:lA12:scroll_expand_down|H772B5848D778 +772B5848D778:lAD:search_cancel|H772B5848D788 +772B5848D788:lAC:search_found|H772B5848D798 +772B5848D798:lAB:search_quit|H772B5848D7A8 +772B5848D7A8:lA6:search|H772B5848D7B8 +772B5848D7B8:lA9:skip_down|H772B5848D7C8 +772B5848D7C8:lA7:skip_up|H772B5848D7D8 +772B5848D7D8:lAF:tab_expand_full|H772B5848D7E8 +772B5848D7E8:lAF:tab_expand_quit|H772B5848D7F8 +772B5848D7F8:lAA:tab_expand|H772B5848D808 +772B5848D808:lAE:transpose_char|H772B5848D818 +772B5848D818:lAE:transpose_word|H772B5848D828 +772B5848D828:lA4:yank|N +772B5848D838:lI73|H772B5848D848 +772B5848D848:lI110|H772B5848D858 +772B5848D858:lI118|H772B5848D868 +772B5848D868:lI97|H772B5848D878 +772B5848D878:lI108|H772B5848D888 +772B5848D888:lI105|H772B5848D898 +772B5848D898:lI100|H772B5848D8A8 +772B5848D8A8:lI32|H772B5848D8B8 +772B5848D8B8:lI102|H772B5848D8C8 +772B5848D8C8:lI117|H772B5848D8D8 +772B5848D8D8:lI110|H772B5848D8E8 +772B5848D8E8:lI99|H772B5848D8F8 +772B5848D8F8:lI116|H772B5848D908 +772B5848D908:lI105|H772B5848D918 +772B5848D918:lI111|H772B5848D928 +772B5848D928:lI110|H772B5848D938 +772B5848D938:lI32|H772B5848D948 +772B5848D948:lI126|H772B5848D958 +772B5848D958:lI112|H772B5848D968 +772B5848D968:lI32|H772B5848D978 +772B5848D978:lI105|H772B5848D988 +772B5848D988:lI110|H772B5848D998 +772B5848D998:lI32|H772B5848D9A8 +772B5848D9A8:lI101|H772B5848D9B8 +772B5848D9B8:lI110|H772B5848D9C8 +772B5848D9C8:lI116|H772B5848D9D8 +772B5848D9D8:lI114|H772B5848D9E8 +772B5848D9E8:lI121|H772B5848D9F8 +772B5848D9F8:lI32|H772B5848DA08 +772B5848DA08:lI123|H772B5848DA18 +772B5848DA18:lI126|H772B5848DA28 +772B5848DA28:lI112|H772B5848DA38 +772B5848DA38:lI44|H772B5848DA48 +772B5848DA48:lI126|H772B5848DA58 +772B5848DA58:lI112|H772B5848DA68 +772B5848DA68:lI125|H772B5848DA78 +772B5848DA78:lI126|H772B5848DA88 +772B5848DA88:lI110|N +772B5848DA98:lI73|H772B5848DAA8 +772B5848DAA8:lI110|H772B5848DAB8 +772B5848DAB8:lI118|H772B5848DAC8 +772B5848DAC8:lI97|H772B5848DAD8 +772B5848DAD8:lI108|H772B5848DAE8 +772B5848DAE8:lI105|H772B5848DAF8 +772B5848DAF8:lI100|H772B5848DB08 +772B5848DB08:lI32|H772B5848DB18 +772B5848DB18:lI107|H772B5848DB28 +772B5848DB28:lI101|H772B5848DB38 +772B5848DB38:lI121|H772B5848DB48 +772B5848DB48:lI32|H772B5848DB58 +772B5848DB58:lI126|H772B5848DB68 +772B5848DB68:lI112|H772B5848DB78 +772B5848DB78:lI32|H772B5848DB88 +772B5848DB88:lI105|H772B5848DB98 +772B5848DB98:lI110|H772B5848DBA8 +772B5848DBA8:lI32|H772B5848DBB8 +772B5848DBB8:lI101|H772B5848DBC8 +772B5848DBC8:lI110|H772B5848DBD8 +772B5848DBD8:lI116|H772B5848DBE8 +772B5848DBE8:lI114|H772B5848DBF8 +772B5848DBF8:lI121|H772B5848DC08 +772B5848DC08:lI32|H772B5848DC18 +772B5848DC18:lI123|H772B5848DC28 +772B5848DC28:lI126|H772B5848DC38 +772B5848DC38:lI112|H772B5848DC48 +772B5848DC48:lI44|H772B5848DC58 +772B5848DC58:lI126|H772B5848DC68 +772B5848DC68:lI112|H772B5848DC78 +772B5848DC78:lI125|H772B5848DC88 +772B5848DC88:lI126|H772B5848DC98 +772B5848DC98:lI110|N +772B5848DCA8:lI73|H772B5848DCB8 +772B5848DCB8:lI110|H772B5848DCC8 +772B5848DCC8:lI118|H772B5848DCD8 +772B5848DCD8:lI97|H772B5848DCE8 +772B5848DCE8:lI108|H772B5848DCF8 +772B5848DCF8:lI105|H772B5848DD08 +772B5848DD08:lI100|H772B5848DD18 +772B5848DD18:lI32|H772B5848DD28 +772B5848DD28:lI102|H772B5848DD38 +772B5848DD38:lI117|H772B5848DD48 +772B5848DD48:lI110|H772B5848DD58 +772B5848DD58:lI99|H772B5848DD68 +772B5848DD68:lI116|H772B5848DD78 +772B5848DD78:lI105|H772B5848DD88 +772B5848DD88:lI111|H772B5848DD98 +772B5848DD98:lI110|H772B5848DDA8 +772B5848DDA8:lI32|H772B5848DDB8 +772B5848DDB8:lI126|H772B5848DDC8 +772B5848DDC8:lI112|H772B5848DDD8 +772B5848DDD8:lI32|H772B5848DDE8 +772B5848DDE8:lI105|H772B5848DDF8 +772B5848DDF8:lI110|H772B5848DE08 +772B5848DE08:lI32|H772B5848DE18 +772B5848DE18:lI101|H772B5848DE28 +772B5848DE28:lI110|H772B5848DE38 +772B5848DE38:lI116|H772B5848DE48 +772B5848DE48:lI114|H772B5848DE58 +772B5848DE58:lI121|H772B5848DE68 +772B5848DE68:lI32|H772B5848DE78 +772B5848DE78:lI123|H772B5848DE88 +772B5848DE88:lI100|H772B5848DE98 +772B5848DE98:lI101|H772B5848DEA8 +772B5848DEA8:lI102|H772B5848DEB8 +772B5848DEB8:lI97|H772B5848DEC8 +772B5848DEC8:lI117|H772B5848DED8 +772B5848DED8:lI108|H772B5848DEE8 +772B5848DEE8:lI116|H772B5848DEF8 +772B5848DEF8:lI44|H772B5848DF08 +772B5848DF08:lI126|H772B5848DF18 +772B5848DF18:lI112|H772B5848DF28 +772B5848DF28:lI125|H772B5848DF38 +772B5848DF38:lI126|H772B5848DF48 +772B5848DF48:lI110|N +772B5848DF58:lI73|H772B5848DF68 +772B5848DF68:lI110|H772B5848DF78 +772B5848DF78:lI118|H772B5848DF88 +772B5848DF88:lI97|H772B5848DF98 +772B5848DF98:lI108|H772B5848DFA8 +772B5848DFA8:lI105|H772B5848DFB8 +772B5848DFB8:lI100|H772B5848DFC8 +772B5848DFC8:lI32|H772B5848DFD8 +772B5848DFD8:lI101|H772B5848DFE8 +772B5848DFE8:lI110|H772B5848DFF8 +772B5848DFF8:lI116|H772B5848E008 +772B5848E008:lI114|H772B5848E018 +772B5848E018:lI121|H772B5848E028 +772B5848E028:lI32|H772B5848E038 +772B5848E038:lI123|H772B5848E048 +772B5848E048:lI126|H772B5848E058 +772B5848E058:lI112|H772B5848E068 +772B5848E068:lI44|H772B5848E078 +772B5848E078:lI126|H772B5848E088 +772B5848E088:lI112|H772B5848E098 +772B5848E098:lI125|H772B5848E0A8 +772B5848E0A8:lI126|H772B5848E0B8 +772B5848E0B8:lI110|N +772B5848E0C8:lI108|N +772B5848E0D8:lI114|H772B5848E0C8 +772B5848E0E8:lI101|H772B5848E0D8 +772B5848E0F8:lI46|H772B5848E0E8 +772B5848E108:lI121|H772B5848E0F8 +772B5848E118:lI101|H772B5848E108 +772B5848E128:lI107|H772B5848E118 +772B5848E138:lI95|H772B5848E128 +772B5848E148:lI110|H772B5848E138 +772B5848E158:lI105|H772B5848E148 +772B5848E168:lI108|H772B5848E158 +772B5848E178:lI100|H772B5848E168 +772B5848E188:lI101|H772B5848E178 +772B5848E198:E4D:g3AAAABLAn2any7hsHFE9P4TjWfzlMEAAAAAAAAAAHcJZWRsaW5fa2V5YQBiA+zU+Vh3DW5vbm9kZUBub2hvc3QAAAAAAAAAAAAAAAA= +772B5848E1B0:Rf772B45AFA110 +772B5848E1C8:t4:A6:normal,A6:search,A4:help,AA:tab_expand +772B5848E9B0:t2:A5:local,AB:kernel_refc +772B5848E9C8:t2:A2:ok,H772B5848E9F0 +772B5848E9E0:t1:A13:scheduler_wall_time +772B5848E9F0:Mf1:H772B5848E9E0:H772B5848EA10 +772B5848EA10:Mf0:H772B58410188: +772B5848EA28:lA5:flush|N +772B5848EA38:lI108|N +772B5848EA48:lI114|H772B5848EA38 +772B5848EA58:lI101|H772B5848EA48 +772B5848EA68:lI46|H772B5848EA58 +772B5848EA78:lI99|H772B5848EA68 +772B5848EA88:lI102|H772B5848EA78 +772B5848EA98:lI101|H772B5848EA88 +772B5848EAA8:lI114|H772B5848EA98 +772B5848EAB8:lI95|H772B5848EAA8 +772B5848EAC8:lI108|H772B5848EAB8 +772B5848EAD8:lI101|H772B5848EAC8 +772B5848EAE8:lI110|H772B5848EAD8 +772B5848EAF8:lI114|H772B5848EAE8 +772B5848EB08:lI101|H772B5848EAF8 +772B5848EB18:lI107|H772B5848EB08 +772B5848EB28:Rf772B45AFF4D8 +772B5848EB58:t2:A2:ok,H772B5848EB70 +772B5848EB70:t1:A5:state +772B5848EB80:lI82|H772B5848EB90 +772B5848EB90:lI101|H772B5848EBA0 +772B5848EBA0:lI99|H772B5848EBB0 +772B5848EBB0:lI101|H772B5848EBC0 +772B5848EBC0:lI105|H772B5848EBD0 +772B5848EBD0:lI118|H772B5848EBE0 +772B5848EBE0:lI101|H772B5848EBF0 +772B5848EBF0:lI100|H772B5848EC00 +772B5848EC00:lI32|H772B5848EC10 +772B5848EC10:lI83|H772B5848EC20 +772B5848EC20:lI73|H772B5848EC30 +772B5848EC30:lI71|H772B5848EC40 +772B5848EC40:lI85|H772B5848EC50 +772B5848EC50:lI83|H772B5848EC60 +772B5848EC60:lI82|H772B5848EC70 +772B5848EC70:lI49|N +772B5848EC80:lI83|H772B5848EC90 +772B5848EC90:lI73|H772B5848ECA0 +772B5848ECA0:lI71|H772B5848ECB0 +772B5848ECB0:lI84|H772B5848ECC0 +772B5848ECC0:lI69|H772B5848ECD0 +772B5848ECD0:lI82|H772B5848ECE0 +772B5848ECE0:lI77|H772B5848ECF0 +772B5848ECF0:lI32|H772B5848ED00 +772B5848ED00:lI114|H772B5848ED10 +772B5848ED10:lI101|H772B5848ED20 +772B5848ED20:lI99|H772B5848ED30 +772B5848ED30:lI101|H772B5848ED40 +772B5848ED40:lI105|H772B5848ED50 +772B5848ED50:lI118|H772B5848ED60 +772B5848ED60:lI101|H772B5848ED70 +772B5848ED70:lI100|H772B5848ED80 +772B5848ED80:lI32|H772B5848ED90 +772B5848ED90:lI45|H772B5848EDA0 +772B5848EDA0:lI32|H772B5848EDB0 +772B5848EDB0:lI115|H772B5848EDC0 +772B5848EDC0:lI104|H772B5848EDD0 +772B5848EDD0:lI117|H772B5848EDE0 +772B5848EDE0:lI116|H772B5848EDF0 +772B5848EDF0:lI116|H772B5848EE00 +772B5848EE00:lI105|H772B5848EE10 +772B5848EE10:lI110|H772B5848EE20 +772B5848EE20:lI103|H772B5848EE30 +772B5848EE30:lI32|H772B5848EE40 +772B5848EE40:lI100|H772B5848EE50 +772B5848EE50:lI111|H772B5848EE60 +772B5848EE60:lI119|H772B5848EE70 +772B5848EE70:lI110|H772B5848EE80 +772B5848EE80:lI126|H772B5848EE90 +772B5848EE90:lI110|N +772B5848EEA0:lI108|N +772B5848EEB0:lI114|H772B5848EEA0 +772B5848EEC0:lI101|H772B5848EEB0 +772B5848EED0:lI46|H772B5848EEC0 +772B5848EEE0:lI114|H772B5848EED0 +772B5848EEF0:lI101|H772B5848EEE0 +772B5848EF00:lI108|H772B5848EEF0 +772B5848EF10:lI100|H772B5848EF00 +772B5848EF20:lI110|H772B5848EF10 +772B5848EF30:lI97|H772B5848EF20 +772B5848EF40:lI104|H772B5848EF30 +772B5848EF50:lI95|H772B5848EF40 +772B5848EF60:lI108|H772B5848EF50 +772B5848EF70:lI97|H772B5848EF60 +772B5848EF80:lI110|H772B5848EF70 +772B5848EF90:lI103|H772B5848EF80 +772B5848EFA0:lI105|H772B5848EF90 +772B5848EFB0:lI115|H772B5848EFA0 +772B5848EFC0:lI95|H772B5848EFB0 +772B5848EFD0:lI108|H772B5848EFC0 +772B5848EFE0:lI114|H772B5848EFD0 +772B5848EFF0:lI101|H772B5848EFE0 +772B5848F018:lI44|H772B5848F028 +772B5848F028:lI32|N +772B5848F038:lH772B5848F068|H772B5848F048 +772B5848F048:lA6:global|H772B5848F058 +772B5848F058:lA7:unicode|N +772B5848F068:t2:A6:return,A4:list +772B5848F080:lI44|H772B5848F090 +772B5848F090:lI63|H772B5848F0A0 +772B5848F0A0:lI13|H772B5848F0B0 +772B5848F0B0:lI63|H772B5848F0C0 +772B5848F0C0:lI10|H772B5848F0D0 +772B5848F0D0:lI32|H772B5848F0E0 +772B5848F0E0:lI42|N +772B5848F0F0:lI126|H772B5848F100 +772B5848F100:lI116|H772B5848F110 +772B5848F110:lI115|N +772B5848F120:lI59|H772B5848F130 +772B5848F130:lI32|H772B5848F140 +772B5848F140:lI82|H772B5848F150 +772B5848F150:lI101|H772B5848F160 +772B5848F160:lI116|H772B5848F170 +772B5848F170:lI117|H772B5848F180 +772B5848F180:lI114|H772B5848F190 +772B5848F190:lI110|H772B5848F1A0 +772B5848F1A0:lI101|H772B5848F1B0 +772B5848F1B0:lI100|H772B5848F1C0 +772B5848F1C0:lI58|H772B5848F1D0 +772B5848F1D0:lI32|N +772B5848F1E0:lI82|H772B5848F1F0 +772B5848F1F0:lI69|H772B5848F200 +772B5848F200:lI80|H772B5848F210 +772B5848F210:lI79|H772B5848F220 +772B5848F220:lI82|H772B5848F230 +772B5848F230:lI84|H772B5848F240 +772B5848F240:lI95|H772B5848F250 +772B5848F250:lI67|H772B5848F260 +772B5848F260:lI66|H772B5848F270 +772B5848F270:lI47|H772B5848F280 +772B5848F280:lI49|H772B5848F290 +772B5848F290:lI32|H772B5848F2A0 +772B5848F2A0:lI69|H772B5848F2B0 +772B5848F2B0:lI82|H772B5848F2C0 +772B5848F2C0:lI82|H772B5848F2D0 +772B5848F2D0:lI79|H772B5848F2E0 +772B5848F2E0:lI82|H772B5848F2F0 +772B5848F2F0:lI58|H772B5848F300 +772B5848F300:lI32|N +772B5848F310:lI59|H772B5848F320 +772B5848F320:lI32|H772B5848F330 +772B5848F330:lI82|H772B5848F340 +772B5848F340:lI101|H772B5848F350 +772B5848F350:lI97|H772B5848F360 +772B5848F360:lI115|H772B5848F370 +772B5848F370:lI111|H772B5848F380 +772B5848F380:lI110|H772B5848F390 +772B5848F390:lI58|H772B5848F3A0 +772B5848F3A0:lI32|N +772B5848F3B0:lI82|H772B5848F3C0 +772B5848F3C0:lI69|H772B5848F3D0 +772B5848F3D0:lI80|H772B5848F3E0 +772B5848F3E0:lI79|H772B5848F3F0 +772B5848F3F0:lI82|H772B5848F400 +772B5848F400:lI84|H772B5848F410 +772B5848F410:lI95|H772B5848F420 +772B5848F420:lI67|H772B5848F430 +772B5848F430:lI66|H772B5848F440 +772B5848F440:lI47|H772B5848F450 +772B5848F450:lI49|H772B5848F460 +772B5848F460:lI32|H772B5848F470 +772B5848F470:lI67|H772B5848F480 +772B5848F480:lI82|H772B5848F490 +772B5848F490:lI65|H772B5848F4A0 +772B5848F4A0:lI83|H772B5848F4B0 +772B5848F4B0:lI72|H772B5848F4C0 +772B5848F4C0:lI58|H772B5848F4D0 +772B5848F4D0:lI32|N +772B5848F4E0:lA5:depth|H772B5848F4F0 +772B5848F4F0:lAB:chars_limit|H772B5848F500 +772B5848F500:lAB:single_line|N +772B5848F510:lI82|H772B5848F520 +772B5848F520:lI69|H772B5848F530 +772B5848F530:lI80|H772B5848F540 +772B5848F540:lI79|H772B5848F550 +772B5848F550:lI82|H772B5848F560 +772B5848F560:lI84|H772B5848F570 +772B5848F570:lI95|H772B5848F580 +772B5848F580:lI67|H772B5848F590 +772B5848F590:lI66|H772B5848F5A0 +772B5848F5A0:lI47|H772B5848F5B0 +772B5848F5B0:lI50|H772B5848F5C0 +772B5848F5C0:lI32|H772B5848F5D0 +772B5848F5D0:lI69|H772B5848F5E0 +772B5848F5E0:lI82|H772B5848F5F0 +772B5848F5F0:lI82|H772B5848F600 +772B5848F600:lI79|H772B5848F610 +772B5848F610:lI82|H772B5848F620 +772B5848F620:lI58|H772B5848F630 +772B5848F630:lI32|N +772B5848F640:lI82|H772B5848F650 +772B5848F650:lI69|H772B5848F660 +772B5848F660:lI80|H772B5848F670 +772B5848F670:lI79|H772B5848F680 +772B5848F680:lI82|H772B5848F690 +772B5848F690:lI84|H772B5848F6A0 +772B5848F6A0:lI95|H772B5848F6B0 +772B5848F6B0:lI67|H772B5848F6C0 +772B5848F6C0:lI66|H772B5848F6D0 +772B5848F6D0:lI47|H772B5848F6E0 +772B5848F6E0:lI50|H772B5848F6F0 +772B5848F6F0:lI32|H772B5848F700 +772B5848F700:lI67|H772B5848F710 +772B5848F710:lI82|H772B5848F720 +772B5848F720:lI65|H772B5848F730 +772B5848F730:lI83|H772B5848F740 +772B5848F740:lI72|H772B5848F750 +772B5848F750:lI58|H772B5848F760 +772B5848F760:lI32|N +772B5848F770:lI70|H772B5848F780 +772B5848F780:lI79|H772B5848F790 +772B5848F790:lI82|H772B5848F7A0 +772B5848F7A0:lI77|H772B5848F7B0 +772B5848F7B0:lI65|H772B5848F7C0 +772B5848F7C0:lI84|H772B5848F7D0 +772B5848F7D0:lI32|H772B5848F7E0 +772B5848F7E0:lI69|H772B5848F7F0 +772B5848F7F0:lI82|H772B5848F800 +772B5848F800:lI82|H772B5848F810 +772B5848F810:lI79|H772B5848F820 +772B5848F820:lI82|H772B5848F830 +772B5848F830:lI58|H772B5848F840 +772B5848F840:lI32|N +772B5848F850:lI46|H772B5848F860 +772B5848F860:lI46|H772B5848F870 +772B5848F870:lI46|H772B5848F880 +772B5848F880:lI10|N +772B5848F890:lI46|H772B5848F8A0 +772B5848F8A0:lI46|H772B5848F8B0 +772B5848F8B0:lI46|N +772B5848F8C0:t2:A4:unit,AB:microsecond +772B5848F8D8:lI85|H772B5848F8E8 +772B5848F8E8:lI84|H772B5848F8F8 +772B5848F8F8:lI67|H772B5848F908 +772B5848F908:lI32|N +772B5848F918:lI126|H772B5848F928 +772B5848F928:lI116|H772B5848F938 +772B5848F938:lI119|H772B5848F948 +772B5848F948:lI58|H772B5848F958 +772B5848F958:lI126|H772B5848F968 +772B5848F968:lI116|H772B5848F978 +772B5848F978:lI119|H772B5848F988 +772B5848F988:lI47|H772B5848F998 +772B5848F998:lI126|H772B5848F9A8 +772B5848F9A8:lI119|N +772B5848F9B8:lI61|H772B5848F9C8 +772B5848F9C8:lI126|H772B5848F9D8 +772B5848F9D8:lI116|H772B5848F9E8 +772B5848F9E8:lI115|H772B5848F9F8 +772B5848F9F8:lI61|H772B5848FA08 +772B5848FA08:lI61|H772B5848FA18 +772B5848FA18:lI61|H772B5848FA28 +772B5848FA28:lI61|H772B5848FA38 +772B5848FA38:lI32|H772B5848FA48 +772B5848FA48:lI126|H772B5848FA58 +772B5848FA58:lI119|H772B5848FA68 +772B5848FA68:lI45|H772B5848FA78 +772B5848FA78:lI126|H772B5848FA88 +772B5848FA88:lI115|H772B5848FA98 +772B5848FA98:lI45|H772B5848FAA8 +772B5848FAA8:lI126|H772B5848FAB8 +772B5848FAB8:lI52|H772B5848FAC8 +772B5848FAC8:lI119|H772B5848FAD8 +772B5848FAD8:lI58|H772B5848FAE8 +772B5848FAE8:lI58|H772B5848FAF8 +772B5848FAF8:lI126|H772B5848FB08 +772B5848FB08:lI50|H772B5848FB18 +772B5848FB18:lI46|H772B5848FB28 +772B5848FB28:lI46|H772B5848FB38 +772B5848FB38:lI48|H772B5848FB48 +772B5848FB48:lI119|H772B5848FB58 +772B5848FB58:lI58|H772B5848FB68 +772B5848FB68:lI126|H772B5848FB78 +772B5848FB78:lI50|H772B5848FB88 +772B5848FB88:lI46|H772B5848FB98 +772B5848FB98:lI46|H772B5848FBA8 +772B5848FBA8:lI48|H772B5848FBB8 +772B5848FBB8:lI119|H772B5848FBC8 +772B5848FBC8:lI58|H772B5848FBD8 +772B5848FBD8:lI126|H772B5848FBE8 +772B5848FBE8:lI50|H772B5848FBF8 +772B5848FBF8:lI46|H772B5848FC08 +772B5848FC08:lI46|H772B5848FC18 +772B5848FC18:lI48|H772B5848FC28 +772B5848FC28:lI119|H772B5848FC38 +772B5848FC38:lI46|H772B5848FC48 +772B5848FC48:lI126|H772B5848FC58 +772B5848FC58:lI54|H772B5848FC68 +772B5848FC68:lI46|H772B5848FC78 +772B5848FC78:lI46|H772B5848FC88 +772B5848FC88:lI48|H772B5848FC98 +772B5848FC98:lI119|H772B5848FCA8 +772B5848FCA8:lI32|H772B5848FCB8 +772B5848FCB8:lI126|H772B5848FCC8 +772B5848FCC8:lI115|H772B5848FCD8 +772B5848FCD8:lI61|H772B5848FCE8 +772B5848FCE8:lI61|H772B5848FCF8 +772B5848FCF8:lI61|N +772B5848FD08:Mf0:H772B58410188: +772B5848FD20:lI32|H772B5848FD30 +772B5848FD30:lI82|H772B5848FD40 +772B5848FD40:lI69|H772B5848FD50 +772B5848FD50:lI80|H772B5848FD60 +772B5848FD60:lI79|H772B5848FD70 +772B5848FD70:lI82|H772B5848FD80 +772B5848FD80:lI84|N +772B5848FD90:lI68|H772B5848FDA0 +772B5848FDA0:lI101|H772B5848FDB0 +772B5848FDB0:lI99|N +772B5848FDC0:lI78|H772B5848FDD0 +772B5848FDD0:lI111|H772B5848FDE0 +772B5848FDE0:lI118|N +772B5848FDF0:lI79|H772B5848FE00 +772B5848FE00:lI99|H772B5848FE10 +772B5848FE10:lI116|N +772B5848FE20:lI83|H772B5848FE30 +772B5848FE30:lI101|H772B5848FE40 +772B5848FE40:lI112|N +772B5848FE50:lI65|H772B5848FE60 +772B5848FE60:lI117|H772B5848FE70 +772B5848FE70:lI103|N +772B5848FE80:lI74|H772B5848FE90 +772B5848FE90:lI117|H772B5848FEA0 +772B5848FEA0:lI108|N +772B5848FEB0:lI74|H772B5848FEC0 +772B5848FEC0:lI117|H772B5848FED0 +772B5848FED0:lI110|N +772B5848FEE0:lI77|H772B5848FEF0 +772B5848FEF0:lI97|H772B5848FF00 +772B5848FF00:lI121|N +772B5848FF10:lI65|H772B5848FF20 +772B5848FF20:lI112|H772B5848FF30 +772B5848FF30:lI114|N +772B5848FF40:lI77|H772B5848FF50 +772B5848FF50:lI97|H772B5848FF60 +772B5848FF60:lI114|N +772B5848FF70:lI70|H772B5848FF80 +772B5848FF80:lI101|H772B5848FF90 +772B5848FF90:lI98|N +772B5848FFA0:lI74|H772B5848FFB0 +772B5848FFB0:lI97|H772B5848FFC0 +772B5848FFC0:lI110|N +772B5848FFD0:t5:AB:chars_limit,AB:single_line,AD:legacy_header,AF:time_designator,A1A:error_logger_notice_header +772B58490000:Mf5:H772B5848FFD0:A9:unlimited,A4:true,A5:false,I84,A4:info +772B58490040:lH772B58490080|H772B58490050 +772B58490050:lH772B584900A0|H772B58490060 +772B58490060:lA3:msg|H772B58490070 +772B58490070:lH772B584900B0|N +772B58490080:lA10:logger_formatter|H772B58490090 +772B58490090:lA6:header|N +772B584900A0:lI10|N +772B584900B0:lI10|N +772B584900C0:lA4:time|H772B584900D0 +772B584900D0:lH772B58490120|H772B584900E0 +772B584900E0:lA5:level|H772B584900F0 +772B584900F0:lH772B58490130|H772B58490100 +772B58490100:lA3:msg|H772B58490110 +772B58490110:lH772B58490150|N +772B58490120:lI32|N +772B58490130:lI58|H772B58490140 +772B58490140:lI32|N +772B58490150:lI10|N +772B58490160:lA4:time|H772B58490170 +772B58490170:lH772B584901C0|H772B58490180 +772B58490180:lA5:level|H772B58490190 +772B58490190:lH772B584901D0|H772B584901A0 +772B584901A0:lA3:msg|H772B584901B0 +772B584901B0:lH772B584901F0|N +772B584901C0:lI32|N +772B584901D0:lI58|H772B584901E0 +772B584901E0:lI10|N +772B584901F0:lI10|N +772B58490200:lI90|N +772B58490210:lI122|N +772B58490220:lI126|H772B58490230 +772B58490230:lI100|H772B58490240 +772B58490240:lI58|H772B58490250 +772B58490250:lI126|H772B58490260 +772B58490260:lI100|N +772B58490270:t3:A2:ok,H772B58490290,N +772B58490290:lI0|H772B584902A0 +772B584902A0:lI0|N +772B584902B0:lI126|H772B584902C0 +772B584902C0:lI48|H772B584902D0 +772B584902D0:lI116|H772B584902E0 +772B584902E0:lI112|N +772B584902F0:lI126|H772B58490300 +772B58490300:lI116|H772B58490310 +772B58490310:lI112|N +772B58490320:lH772B58490340|H772B58490330 +772B58490330:lH772B58490358|N +772B58490340:t2:AC:check_config,I1 +772B58490358:t2:A6:format,I2 +772B58490370:lI108|N +772B58490380:lI114|H772B58490370 +772B58490390:lI101|H772B58490380 +772B584903A0:lI46|H772B58490390 +772B584903B0:lI114|H772B584903A0 +772B584903C0:lI101|H772B584903B0 +772B584903D0:lI116|H772B584903C0 +772B584903E0:lI116|H772B584903D0 +772B584903F0:lI97|H772B584903E0 +772B58490400:lI109|H772B584903F0 +772B58490410:lI114|H772B58490400 +772B58490420:lI111|H772B58490410 +772B58490430:lI102|H772B58490420 +772B58490440:lI95|H772B58490430 +772B58490450:lI114|H772B58490440 +772B58490460:lI101|H772B58490450 +772B58490470:lI103|H772B58490460 +772B58490480:lI103|H772B58490470 +772B58490490:lI111|H772B58490480 +772B584904A0:lI108|H772B58490490 +772B584904B0:E54:g3AAAABSAaYCznaI7kRY7379YFZGiFQAAAAAAAAAAHcQbG9nZ2VyX2Zvcm1hdHRlcmEAYgUwFnNYdw1ub25vZGVAbm9ob3N0AAAAAAAAAAAAAAAA +772B584904C8:Rf772B45B02E08 +772B584904E0:E54:g3AAAABSAaYCznaI7kRY7379YFZGiFQAAAABAAAAAHcQbG9nZ2VyX2Zvcm1hdHRlcmEBYgUwFnNYdw1ub25vZGVAbm9ob3N0AAAAAAAAAAAAAAAA +772B584904F8:Rf772B45B02E80 +772B58490528:lA4:type|H772B58490538 +772B58490538:lA4:file|H772B58490548 +772B58490548:lA5:modes|H772B58490558 +772B58490558:lAA:file_check|H772B58490568 +772B58490568:lAC:max_no_bytes|H772B58490578 +772B58490578:lAC:max_no_files|H772B58490588 +772B58490588:lA12:compress_on_rotate|N +772B58490598:lA4:type|H772B584905A8 +772B584905A8:lA4:file|H772B584905B8 +772B584905B8:lA5:modes|N +772B584905C8:Mf0:H772B58410188: +772B584905E0:lA3:raw|H772B584905F0 +772B584905F0:lA6:append|N +772B58490600:lA3:raw|N +772B58490610:lA5:write|H772B58490620 +772B58490620:lA6:append|H772B58490630 +772B58490630:lA9:exclusive|N +772B58490640:t2:A5:error,A1D:file_ctrl_process_not_started +772B58490658:lA5:flush|N +772B58490668:lI70|H772B58490678 +772B58490678:lI97|H772B58490688 +772B58490688:lI105|H772B58490698 +772B58490698:lI108|H772B584906A8 +772B584906A8:lI101|H772B584906B8 +772B584906B8:lI100|H772B584906C8 +772B584906C8:lI32|H772B584906D8 +772B584906D8:lI116|H772B584906E8 +772B584906E8:lI111|H772B584906F8 +772B584906F8:lI32|H772B58490708 +772B58490708:lI119|H772B58490718 +772B58490718:lI114|H772B58490728 +772B58490728:lI105|H772B58490738 +772B58490738:lI116|H772B58490748 +772B58490748:lI101|H772B58490758 +772B58490758:lI32|H772B58490768 +772B58490768:lI108|H772B58490778 +772B58490778:lI111|H772B58490788 +772B58490788:lI103|H772B58490798 +772B58490798:lI32|H772B584907A8 +772B584907A8:lI109|H772B584907B8 +772B584907B8:lI101|H772B584907C8 +772B584907C8:lI115|H772B584907D8 +772B584907D8:lI115|H772B584907E8 +772B584907E8:lI97|H772B584907F8 +772B584907F8:lI103|H772B58490808 +772B58490808:lI101|H772B58490818 +772B58490818:lI32|H772B58490828 +772B58490828:lI116|H772B58490838 +772B58490838:lI111|H772B58490848 +772B58490848:lI32|H772B58490858 +772B58490858:lI115|H772B58490868 +772B58490868:lI116|H772B58490878 +772B58490878:lI100|H772B58490888 +772B58490888:lI111|H772B58490898 +772B58490898:lI117|H772B584908A8 +772B584908A8:lI116|H772B584908B8 +772B584908B8:lI44|H772B584908C8 +772B584908C8:lI32|H772B584908D8 +772B584908D8:lI116|H772B584908E8 +772B584908E8:lI114|H772B584908F8 +772B584908F8:lI121|H772B58490908 +772B58490908:lI105|H772B58490918 +772B58490918:lI110|H772B58490928 +772B58490928:lI103|H772B58490938 +772B58490938:lI32|H772B58490948 +772B58490948:lI115|H772B58490958 +772B58490958:lI116|H772B58490968 +772B58490968:lI100|H772B58490978 +772B58490978:lI101|H772B58490988 +772B58490988:lI114|H772B58490998 +772B58490998:lI114|H772B584909A8 +772B584909A8:lI10|N +772B584909B8:t2:A5:error,A6:enoent +772B584909D0:lI46|H772B584909E0 +772B584909E0:lI48|N +772B584909F0:lI46|H772B58490A00 +772B58490A00:lI103|H772B58490A10 +772B58490A10:lI122|N +772B58490A20:lA4:read|H772B58490A30 +772B58490A30:lA6:binary|N +772B58490A40:lA5:write|N +772B58490A50:Yh0: +772B58490A60:lI108|N +772B58490A70:lI114|H772B58490A60 +772B58490A80:lI101|H772B58490A70 +772B58490A90:lI46|H772B58490A80 +772B58490AA0:lI104|H772B58490A90 +772B58490AB0:lI95|H772B58490AA0 +772B58490AC0:lI100|H772B58490AB0 +772B58490AD0:lI116|H772B58490AC0 +772B58490AE0:lI115|H772B58490AD0 +772B58490AF0:lI95|H772B58490AE0 +772B58490B00:lI114|H772B58490AF0 +772B58490B10:lI101|H772B58490B00 +772B58490B20:lI103|H772B58490B10 +772B58490B30:lI103|H772B58490B20 +772B58490B40:lI111|H772B58490B30 +772B58490B50:lI108|H772B58490B40 +772B58490B60:t7:A4:type,A4:file,A12:compress_on_rotate,AA:file_check,AC:max_no_bytes,AC:max_no_files,A5:modes +772B58490BA0:t1:A4:type +772B58490BB0:E50:g3AAAABOAUhV1Jn3Us0SdGgZWifnt7kAAAAAAAAAAHcMbG9nZ2VyX3N0ZF9oYQBiAkKupFh3DW5vbm9kZUBub2hvc3QAAAAAAAAAAAAAAAA= +772B58490BC8:Rf772B45B05488 +772B58490BE0:t4:A12:compress_on_rotate,AA:file_check,AC:max_no_bytes,AC:max_no_files +772B58490C08:tA:A2:fd,A9:file_name,A6:synced,AA:file_check,A5:modes,AC:handler_name,A5:inode,AA:last_check,A8:sync_res,A9:write_res +772B58490C60:Rf772B45B05500 +772B58490C78:t2:AC:handler_name,A3:dev +772B58490C90:t4:A5:count,A4:size,A8:compress,A9:curr_size +772B58490CD0:Mf0:H772B58410188: +772B58490CE8:lAE:sync_mode_qlen|H772B58490CF8 +772B58490CF8:lAE:drop_mode_qlen|H772B58490D08 +772B58490D08:lAA:flush_qlen|H772B58490D18 +772B58490D18:lA12:burst_limit_enable|H772B58490D28 +772B58490D28:lA15:burst_limit_max_count|H772B58490D38 +772B58490D38:lA17:burst_limit_window_time|H772B58490D48 +772B58490D48:lA14:overload_kill_enable|H772B58490D58 +772B58490D58:lA12:overload_kill_qlen|H772B58490D68 +772B58490D68:lA16:overload_kill_mem_size|H772B58490D78 +772B58490D78:lA1B:overload_kill_restart_after|H772B58490D88 +772B58490D88:lA18:filesync_repeat_interval|N +772B58490D98:lA18:filesync_repeat_interval|N +772B58490DA8:lAE:sync_mode_qlen|H772B58490DB8 +772B58490DB8:lAE:drop_mode_qlen|H772B58490DC8 +772B58490DC8:lAA:flush_qlen|H772B58490DD8 +772B58490DD8:lA12:burst_limit_enable|H772B58490DE8 +772B58490DE8:lA15:burst_limit_max_count|H772B58490DF8 +772B58490DF8:lA17:burst_limit_window_time|H772B58490E08 +772B58490E08:lA14:overload_kill_enable|H772B58490E18 +772B58490E18:lA12:overload_kill_qlen|H772B58490E28 +772B58490E28:lA16:overload_kill_mem_size|H772B58490E38 +772B58490E38:lA1B:overload_kill_restart_after|N +772B58490E48:lI95|N +772B58490E58:lAE:sync_mode_qlen|H772B58490E68 +772B58490E68:lAE:drop_mode_qlen|H772B58490E78 +772B58490E78:lAA:flush_qlen|H772B58490E88 +772B58490E88:lA12:burst_limit_enable|H772B58490E98 +772B58490E98:lA15:burst_limit_max_count|H772B58490EA8 +772B58490EA8:lA17:burst_limit_window_time|H772B58490EB8 +772B58490EB8:lA14:overload_kill_enable|H772B58490EC8 +772B58490EC8:lA12:overload_kill_qlen|H772B58490ED8 +772B58490ED8:lA16:overload_kill_mem_size|H772B58490EE8 +772B58490EE8:lA1B:overload_kill_restart_after|H772B58490EF8 +772B58490EF8:lA18:filesync_repeat_interval|H772B58490F08 +772B58490F08:lA3:olp|N +772B58490F18:lA3:olp|N +772B58490F28:lAF:logger_h_common|N +772B58490F38:lI72|H772B58490F48 +772B58490F48:lI97|H772B58490F58 +772B58490F58:lI110|H772B58490F68 +772B58490F68:lI100|H772B58490F78 +772B58490F78:lI108|H772B58490F88 +772B58490F88:lI101|H772B58490F98 +772B58490F98:lI114|H772B58490FA8 +772B58490FA8:lI32|H772B58490FB8 +772B58490FB8:lI126|H772B58490FC8 +772B58490FC8:lI112|H772B58490FD8 +772B58490FD8:lI32|H772B58490FE8 +772B58490FE8:lI111|H772B58490FF8 +772B58490FF8:lI118|H772B58491008 +772B58491008:lI101|H772B58491018 +772B58491018:lI114|H772B58491028 +772B58491028:lI108|H772B58491038 +772B58491038:lI111|H772B58491048 +772B58491048:lI97|H772B58491058 +772B58491058:lI100|H772B58491068 +772B58491068:lI101|H772B58491078 +772B58491078:lI100|H772B58491088 +772B58491088:lI32|H772B58491098 +772B58491098:lI97|H772B584910A8 +772B584910A8:lI110|H772B584910B8 +772B584910B8:lI100|H772B584910C8 +772B584910C8:lI32|H772B584910D8 +772B584910D8:lI115|H772B584910E8 +772B584910E8:lI116|H772B584910F8 +772B584910F8:lI111|H772B58491108 +772B58491108:lI112|H772B58491118 +772B58491118:lI112|H772B58491128 +772B58491128:lI105|H772B58491138 +772B58491138:lI110|H772B58491148 +772B58491148:lI103|N +772B58491158:t2:A5:error,A4:busy +772B58491170:t2:A5:error,AC:handler_busy +772B58491188:lI72|H772B58491198 +772B58491198:lI97|H772B584911A8 +772B584911A8:lI110|H772B584911B8 +772B584911B8:lI100|H772B584911C8 +772B584911C8:lI108|H772B584911D8 +772B584911D8:lI101|H772B584911E8 +772B584911E8:lI114|H772B584911F8 +772B584911F8:lI32|H772B58491208 +772B58491208:lI126|H772B58491218 +772B58491218:lI112|H772B58491228 +772B58491228:lI32|H772B58491238 +772B58491238:lI115|H772B58491248 +772B58491248:lI119|H772B58491258 +772B58491258:lI105|H772B58491268 +772B58491268:lI116|H772B58491278 +772B58491278:lI99|H772B58491288 +772B58491288:lI104|H772B58491298 +772B58491298:lI101|H772B584912A8 +772B584912A8:lI100|H772B584912B8 +772B584912B8:lI32|H772B584912C8 +772B584912C8:lI102|H772B584912D8 +772B584912D8:lI114|H772B584912E8 +772B584912E8:lI111|H772B584912F8 +772B584912F8:lI109|H772B58491308 +772B58491308:lI32|H772B58491318 +772B58491318:lI126|H772B58491328 +772B58491328:lI112|H772B58491338 +772B58491338:lI32|H772B58491348 +772B58491348:lI116|H772B58491358 +772B58491358:lI111|H772B58491368 +772B58491368:lI32|H772B58491378 +772B58491378:lI126|H772B58491388 +772B58491388:lI112|H772B58491398 +772B58491398:lI32|H772B584913A8 +772B584913A8:lI109|H772B584913B8 +772B584913B8:lI111|H772B584913C8 +772B584913C8:lI100|H772B584913D8 +772B584913D8:lI101|N +772B584913E8:lI72|H772B584913F8 +772B584913F8:lI97|H772B58491408 +772B58491408:lI110|H772B58491418 +772B58491418:lI100|H772B58491428 +772B58491428:lI108|H772B58491438 +772B58491438:lI101|H772B58491448 +772B58491448:lI114|H772B58491458 +772B58491458:lI32|H772B58491468 +772B58491468:lI126|H772B58491478 +772B58491478:lI112|H772B58491488 +772B58491488:lI32|H772B58491498 +772B58491498:lI102|H772B584914A8 +772B584914A8:lI108|H772B584914B8 +772B584914B8:lI117|H772B584914C8 +772B584914C8:lI115|H772B584914D8 +772B584914D8:lI104|H772B584914E8 +772B584914E8:lI101|H772B584914F8 +772B584914F8:lI100|H772B58491508 +772B58491508:lI32|H772B58491518 +772B58491518:lI126|H772B58491528 +772B58491528:lI119|H772B58491538 +772B58491538:lI32|H772B58491548 +772B58491548:lI108|H772B58491558 +772B58491558:lI111|H772B58491568 +772B58491568:lI103|H772B58491578 +772B58491578:lI32|H772B58491588 +772B58491588:lI101|H772B58491598 +772B58491598:lI118|H772B584915A8 +772B584915A8:lI101|H772B584915B8 +772B584915B8:lI110|H772B584915C8 +772B584915C8:lI116|H772B584915D8 +772B584915D8:lI115|N +772B584915E8:lI72|H772B584915F8 +772B584915F8:lI97|H772B58491608 +772B58491608:lI110|H772B58491618 +772B58491618:lI100|H772B58491628 +772B58491628:lI108|H772B58491638 +772B58491638:lI101|H772B58491648 +772B58491648:lI114|H772B58491658 +772B58491658:lI32|H772B58491668 +772B58491668:lI126|H772B58491678 +772B58491678:lI112|H772B58491688 +772B58491688:lI32|H772B58491698 +772B58491698:lI114|H772B584916A8 +772B584916A8:lI101|H772B584916B8 +772B584916B8:lI115|H772B584916C8 +772B584916C8:lI116|H772B584916D8 +772B584916D8:lI97|H772B584916E8 +772B584916E8:lI114|H772B584916F8 +772B584916F8:lI116|H772B58491708 +772B58491708:lI101|H772B58491718 +772B58491718:lI100|N +772B58491728:t1:A9:formatter +772B58491738:Mf1:H772B58491728:H772B58491758 +772B58491758:t2:A10:logger_formatter,H772B58491788 +772B58491770:t2:AB:single_line,AD:legacy_header +772B58491788:Mf2:H772B58491770:A5:false,A4:true +772B584917B0:t2:A10:logger_formatter,H772B584917E0 +772B584917C8:t2:AB:single_line,AD:legacy_header +772B584917E0:Mf2:H772B584917C8:A5:false,A4:true +772B58491808:t3:A4:line,A4:file,A3:mfa +772B58491828:Mf3:H772B58491808:I399,H772B58491858,H772B58491988 +772B58491858:lI108|H772B58491868 +772B58491868:lI111|H772B58491878 +772B58491878:lI103|H772B58491888 +772B58491888:lI103|H772B58491898 +772B58491898:lI101|H772B584918A8 +772B584918A8:lI114|H772B584918B8 +772B584918B8:lI95|H772B584918C8 +772B584918C8:lI104|H772B584918D8 +772B584918D8:lI95|H772B584918E8 +772B584918E8:lI99|H772B584918F8 +772B584918F8:lI111|H772B58491908 +772B58491908:lI109|H772B58491918 +772B58491918:lI109|H772B58491928 +772B58491928:lI111|H772B58491938 +772B58491938:lI110|H772B58491948 +772B58491948:lI46|H772B58491958 +772B58491958:lI101|H772B58491968 +772B58491968:lI114|H772B58491978 +772B58491978:lI108|N +772B58491988:t3:AF:logger_h_common,A10:do_log_to_binary,I2 +772B584919A8:Yh22:Rk9STUFUVEVSIEVSUk9SOiBiYWQgcmV0dXJuIHZhbHVlCg== +772B584919E0:t3:A4:line,A4:file,A3:mfa +772B58491A00:Mf3:H772B584919E0:I411,H772B58491A30,H772B58491B60 +772B58491A30:lI108|H772B58491A40 +772B58491A40:lI111|H772B58491A50 +772B58491A50:lI103|H772B58491A60 +772B58491A60:lI103|H772B58491A70 +772B58491A70:lI101|H772B58491A80 +772B58491A80:lI114|H772B58491A90 +772B58491A90:lI95|H772B58491AA0 +772B58491AA0:lI104|H772B58491AB0 +772B58491AB0:lI95|H772B58491AC0 +772B58491AC0:lI99|H772B58491AD0 +772B58491AD0:lI111|H772B58491AE0 +772B58491AE0:lI109|H772B58491AF0 +772B58491AF0:lI109|H772B58491B00 +772B58491B00:lI111|H772B58491B10 +772B58491B10:lI110|H772B58491B20 +772B58491B20:lI46|H772B58491B30 +772B58491B30:lI101|H772B58491B40 +772B58491B40:lI114|H772B58491B50 +772B58491B50:lI108|N +772B58491B60:t3:AF:logger_h_common,AA:try_format,I3 +772B58491B80:lI68|H772B58491B90 +772B58491B90:lI69|H772B58491BA0 +772B58491BA0:lI70|H772B58491BB0 +772B58491BB0:lI65|H772B58491BC0 +772B58491BC0:lI85|H772B58491BD0 +772B58491BD0:lI76|H772B58491BE0 +772B58491BE0:lI84|H772B58491BF0 +772B58491BF0:lI32|H772B58491C00 +772B58491C00:lI70|H772B58491C10 +772B58491C10:lI79|H772B58491C20 +772B58491C20:lI82|H772B58491C30 +772B58491C30:lI77|H772B58491C40 +772B58491C40:lI65|H772B58491C50 +772B58491C50:lI84|H772B58491C60 +772B58491C60:lI84|H772B58491C70 +772B58491C70:lI69|H772B58491C80 +772B58491C80:lI82|H772B58491C90 +772B58491C90:lI32|H772B58491CA0 +772B58491CA0:lI67|H772B58491CB0 +772B58491CB0:lI82|H772B58491CC0 +772B58491CC0:lI65|H772B58491CD0 +772B58491CD0:lI83|H772B58491CE0 +772B58491CE0:lI72|H772B58491CF0 +772B58491CF0:lI69|H772B58491D00 +772B58491D00:lI68|H772B58491D10 +772B58491D10:lI10|N +772B58491D20:lI70|H772B58491D30 +772B58491D30:lI79|H772B58491D40 +772B58491D40:lI82|H772B58491D50 +772B58491D50:lI77|H772B58491D60 +772B58491D60:lI65|H772B58491D70 +772B58491D70:lI84|H772B58491D80 +772B58491D80:lI84|H772B58491D90 +772B58491D90:lI69|H772B58491DA0 +772B58491DA0:lI82|H772B58491DB0 +772B58491DB0:lI32|H772B58491DC0 +772B58491DC0:lI67|H772B58491DD0 +772B58491DD0:lI82|H772B58491DE0 +772B58491DE0:lI65|H772B58491DF0 +772B58491DF0:lI83|H772B58491E00 +772B58491E00:lI72|H772B58491E10 +772B58491E10:lI58|H772B58491E20 +772B58491E20:lI32|H772B58491E30 +772B58491E30:lI126|H772B58491E40 +772B58491E40:lI116|H772B58491E50 +772B58491E50:lI112|N +772B58491E60:t1:A18:filesync_repeat_interval +772B58491E70:Mf1:H772B58491E60:I5000 +772B58491E90:lI108|N +772B58491EA0:lI114|H772B58491E90 +772B58491EB0:lI101|H772B58491EA0 +772B58491EC0:lI46|H772B58491EB0 +772B58491ED0:lI110|H772B58491EC0 +772B58491EE0:lI111|H772B58491ED0 +772B58491EF0:lI109|H772B58491EE0 +772B58491F00:lI109|H772B58491EF0 +772B58491F10:lI111|H772B58491F00 +772B58491F20:lI99|H772B58491F10 +772B58491F30:lI95|H772B58491F20 +772B58491F40:lI104|H772B58491F30 +772B58491F50:lI95|H772B58491F40 +772B58491F60:lI114|H772B58491F50 +772B58491F70:lI101|H772B58491F60 +772B58491F80:lI103|H772B58491F70 +772B58491F90:lI103|H772B58491F80 +772B58491FA0:lI111|H772B58491F90 +772B58491FB0:lI108|H772B58491FA0 +772B58491FC0:t6:A2:id,A7:restart,A8:shutdown,A5:start,A4:type,A7:modules +772B58491FF8:Rf772B45B06590 +772B58492010:Rf772B45B06608 +772B58492028:t1:A4:time +772B58492038:t3:A4:meta,A3:msg,A5:level +772B58492058:t1:A18:filesync_repeat_interval +772B5842F150:t2:AF:erl_prim_loader,H772B5842F168 +772B5842F168:t2:A5:efile,A9:undefined +772B5842EC10:t2:H772B5842EC28,H772B5842EC40 +772B5842EC28:t2:AB:prim_socket,AB:ioctl_flags +772B5842EC40:Mh22:E:H772B5842ECC0,H772B5842ECD8,H772B5842ECF0,H772B5842ED00,H772B5842ED10,H772B5842ED28,H772B5842ED40,H772B5842ED50,H772B5842ED60,H772B5842ED78,H772B5842EDA8,H772B5842EDF0,H772B5842EE08,H772B5842EE28 +772B5842ECC0:Mn2:H772B5842EE38,H772B5842EE48 +772B5842ECD8:Mn2:H772B5842EE60,H772B5842EE70 +772B5842ECF0:lA8:allmulti|I512 +772B5842ED00:lA5:dying|I0 +772B5842ED10:Mn2:H772B5842EE80,H772B5842EE90 +772B5842ED28:Mn2:H772B5842EEA0,H772B5842EEB0 +772B5842ED40:lA5:debug|I4 +772B5842ED50:lA8:loopback|I8 +772B5842ED60:Mn2:H772B5842EEC0,H772B5842EED0 +772B5842ED78:Mn5:H772B5842EEE0,H772B5842EEF0,H772B5842EF00,H772B5842EF10,H772B5842EF20 +772B5842EDA8:Mn8:H772B5842EF30,H772B5842EF40,H772B5842EF50,H772B5842EF60,H772B5842EF70,H772B5842EF80,H772B5842EF90,H772B5842EFA0 +772B5842EDF0:Mn2:H772B5842EFB0,H772B5842EFC0 +772B5842EE08:Mn3:H772B5842EFD0,H772B5842EFE0,H772B5842EFF0 +772B5842EE28:lA7:dormant|I131072 +772B5842EE38:lA9:automedia|I16384 +772B5842EE48:Mn2:H772B5842F000,H772B5842F010 +772B5842EE60:lA9:staticarp|I0 +772B5842EE70:lA9:multicast|I4096 +772B5842EE80:lA5:link2|I0 +772B5842EE90:lA8:lower_up|I65536 +772B5842EEA0:lA5:link0|I0 +772B5842EEB0:lA7:monitor|I0 +772B5842EEC0:lA5:noarp|I128 +772B5842EED0:lA7:oactive|I0 +772B5842EEE0:lAB:pointopoint|I16 +772B5842EEF0:lA6:master|I1024 +772B5842EF00:lAA:knowsepoch|I0 +772B5842EF10:lA8:renaming|I0 +772B5842EF20:lAA:notrailers|I32 +772B5842EF30:lA9:broadcast|I2 +772B5842EF40:lA7:portsel|I8192 +772B5842EF50:lA7:running|I64 +772B5842EF60:lAB:dhcprunning|I0 +772B5842EF70:lA4:echo|I262144 +772B5842EF80:lA2:up|I1 +772B5842EF90:lA7:private|I0 +772B5842EFA0:lA8:ppromisc|I0 +772B5842EFB0:lA7:simplex|I0 +772B5842EFC0:lA5:link1|I0 +772B5842EFD0:lA7:dynamic|I32768 +772B5842EFE0:lA5:slave|I2048 +772B5842EFF0:lA7:promisc|I256 +772B5842F000:lAA:cantconfig|I0 +772B5842F010:lA7:nogroup|I0 +772B58481568:t2:AC:global_group,H772B58481580 +772B58481580:t9:A5:gconf,A9:undefined,AD:nonode@nohost,N,A6:normal,N,A3:all,N,A7:no_conf +772B584920C8:t2:H772B584920E0,I10 +772B584920E0:t2:AD:logger_config,H772B584920F8 +772B584920F8:t2:A10:$handler_config$,A7:default +772B58471948:t2:H772B58471960,I8000 +772B58471960:t2:A13:inet_gethost_native,A7:timeout +772B5846A448:t2:H772B5846A460,I5 +772B5846A460:t2:AD:logger_config,A11:supervisor_bridge +772B5842F038:t2:H772B5842F050,H772B5842F068 +772B5842F050:t2:AB:prim_socket,A9:msg_flags +772B5842F068:MfB:H772B5842F0D8:I32768,I32,I4,I1073741824,I2048,I8,I128,I8192,I16384,I1,I2 +772B5842F0D8:tB:A4:more,A5:trunc,A9:dontroute,AC:cmsg_cloexec,A7:confirm,A6:ctrunc,A3:eor,A8:errqueue,A8:nosignal,A3:oob,A4:peek +772B58471CE0:t2:A12:rex_nodes_observer,H772B58471CF8 +772B58471CF8:E23:g1oAA3cNbm9ub2RlQG5vaG9zdAAAAAAAA5aYQkIAAumgILU= +772B5842EA68:t2:H772B5842EA80,H772B5842EA98 +772B5842EA80:t2:AB:prim_socket,AE:ioctl_requests +772B5842EA98:Mf14:H772B5842EB50:I35092,I35077,I35093,I35097,I35090,I35095,I35091,I35111,I35123,I35184,I35105,I35088,I35099,I35138,I21531,I35094,I35098,I35096,I35106,I35139 +772B5842EB50:t14:A8:sifflags,A6:atmark,A7:gifaddr,AA:gifbrdaddr,A7:gifconf,AA:gifdstaddr,A8:gifflags,A9:gifhwaddr,A8:gifindex,A6:gifmap,A6:gifmtu,A7:gifname,AA:gifnetmask,A9:giftxqlen,A5:nread,A7:sifaddr,AA:sifbrdaddr,AA:sifdstaddr,A6:sifmtu,A9:siftxqlen +772B5845AEA0:t2:H772B5845AEB8,I5 +772B5845AEB8:t2:AD:logger_config,A16:application_controller +772B58492128:t2:H772B58492140,A9:undefined +772B58492140:t2:AD:logger_config,H772B58492158 +772B58492158:t2:A10:$handler_config$,A6:simple +772B58468B58:t2:H772B58468B70,H772B58468B98 +772B58468B70:t2:AC:erl_features,A8:keywords +772B58468B88:lA4:else|N +772B58468B98:lA5:maybe|H772B58468B88 +772B58468AB8:t2:AB:code_server,AB:interactive +772B5848E760:t2:AC:logger_proxy,H772B5848E778 +772B5848E778:t3:AC:logger_proxy,P<0.73.0>,H772B5848E798 +772B5848E798:t2:AA:logger_olp,AC:logger_proxy +772B5848E7C8:t2:H772B5848E7E0,A5:async +772B5848E7E0:t2:AA:logger_olp,AC:logger_proxy +772B58492080:t2:H772B58492098,A5:async +772B58492098:t2:AA:logger_olp,A14:logger_std_h_default +772B5842AB60:t2:H772B5842AB78,H772B5842AB90 +772B5842AB78:t2:AB:prim_socket,A7:options +772B5842AB90:Mh104:10:H772B5842AC20,H772B5842AC70,H772B5842ACD0,H772B5842AD28,H772B5842ADA0,H772B5842ADF0,H772B5842AE50,H772B5842AEA0,H772B5842AEF0,H772B5842AF38,H772B5842AF90,H772B5842AFD8,H772B5842B030,H772B5842B088,H772B5842B0D8,H772B5842B148 +772B5842AC20:Mn9:H772B5842B1B0,H772B5842B1C0,H772B5842B1D0,H772B5842B1E8,H772B5842B210,H772B5842B238,H772B5842B250,H772B5842B278,H772B5842B288 +772B5842AC70:MnB:H772B5842B2A0,H772B5842B2B8,H772B5842B2E0,H772B5842B2F8,H772B5842B310,H772B5842B328,H772B5842B350,H772B5842B368,H772B5842B378,H772B5842B3A0,H772B5842B3B0 +772B5842ACD0:MnA:H772B5842B3C8,H772B5842B3D8,H772B5842B400,H772B5842B428,H772B5842B438,H772B5842B450,H772B5842B470,H772B5842B498,H772B5842B4B0,H772B5842B4D0 +772B5842AD28:MnE:H772B5842B4E0,H772B5842B4F8,H772B5842B508,H772B5842B530,H772B5842B558,H772B5842B570,H772B5842B580,H772B5842B5A8,H772B5842B5C0,H772B5842B5D0,H772B5842B5F8,H772B5842B620,H772B5842B648,H772B5842B660 +772B5842ADA0:Mn9:H772B5842B688,H772B5842B6A0,H772B5842B6B0,H772B5842B6C8,H772B5842B6F0,H772B5842B708,H772B5842B730,H772B5842B750,H772B5842B760 +772B5842ADF0:MnB:H772B5842B780,H772B5842B790,H772B5842B7A8,H772B5842B7B8,H772B5842B7E0,H772B5842B7F8,H772B5842B820,H772B5842B830,H772B5842B840,H772B5842B850,H772B5842B878 +772B5842AE50:Mn9:H772B5842B8A0,H772B5842B8B0,H772B5842B8D8,H772B5842B8F0,H772B5842B918,H772B5842B938,H772B5842B948,H772B5842B960,H772B5842B970 +772B5842AEA0:Mn9:H772B5842B988,H772B5842B9B0,H772B5842B9C0,H772B5842B9D8,H772B5842BA00,H772B5842BA18,H772B5842BA30,H772B5842BA48,H772B5842BA58 +772B5842AEF0:Mn8:H772B5842BA68,H772B5842BA80,H772B5842BAA8,H772B5842BAB8,H772B5842BAD0,H772B5842BAF0,H772B5842BB18,H772B5842BB40 +772B5842AF38:MnA:H772B5842BB58,H772B5842BB80,H772B5842BBA0,H772B5842BBC0,H772B5842BBE8,H772B5842BC00,H772B5842BC18,H772B5842BC40,H772B5842BC68,H772B5842BC80 +772B5842AF90:Mn8:H772B5842BCA0,H772B5842BCB0,H772B5842BCC8,H772B5842BCF0,H772B5842BD00,H772B5842BD10,H772B5842BD28,H772B5842BD40 +772B5842AFD8:MnA:H772B5842BD58,H772B5842BD80,H772B5842BDA0,H772B5842BDC0,H772B5842BDD0,H772B5842BDF8,H772B5842BE10,H772B5842BE20,H772B5842BE38,H772B5842BE58 +772B5842B030:MnA:H772B5842BE68,H772B5842BE78,H772B5842BE90,H772B5842BEA0,H772B5842BEB0,H772B5842BED8,H772B5842BEF0,H772B5842BF00,H772B5842BF18,H772B5842BF40 +772B5842B088:Mn9:H772B5842BF60,H772B5842BF70,H772B5842BF80,H772B5842BF90,H772B5842BFA0,H772B5842BFC0,H772B5842BFE8,H772B5842BFF8,H772B5842C008 +772B5842B0D8:MnD:H772B5842C020,H772B5842C048,H772B5842C060,H772B5842C080,H772B5842C0A8,H772B5842C0B8,H772B5842C0D8,H772B5842C0E8,H772B5842C110,H772B5842C128,H772B5842C140,H772B5842C168,H772B5842C178 +772B5842B148:MnC:H772B5842C190,H772B5842C1A0,H772B5842C1B0,H772B5842C1C0,H772B5842C1D0,H772B5842C1F0,H772B5842C208,H772B5842C220,H772B5842C230,H772B5842C240,H772B5842C258,H772B5842C288 +772B5842B1B0:lH772B5842C2B0|A9:undefined +772B5842B1C0:lH772B5842C2C8|A9:undefined +772B5842B1D0:Mn2:H772B5842C2E0,H772B5842C308 +772B5842B1E8:lH772B5842C318|H772B5842B1F8 +772B5842B1F8:t2:I0,I3 +772B5842B210:lH772B5842C330|H772B5842B220 +772B5842B220:t2:I0,I34 +772B5842B238:Mn2:H772B5842C348,H772B5842C358 +772B5842B250:lH772B5842C380|H772B5842B260 +772B5842B260:t2:I6,I6 +772B5842B278:lH772B5842C398|A9:undefined +772B5842B288:Mn2:H772B5842C3B0,H772B5842C3C0 +772B5842B2A0:Mn2:H772B5842C3D0,H772B5842C3E0 +772B5842B2B8:lH772B5842C408|H772B5842B2C8 +772B5842B2C8:t2:A6:socket,I15 +772B5842B2E0:Mn2:H772B5842C420,H772B5842C430 +772B5842B2F8:Mn2:H772B5842C440,H772B5842C450 +772B5842B310:Mn2:H772B5842C478,H772B5842C488 +772B5842B328:lH772B5842C4B0|H772B5842B338 +772B5842B338:t2:I0,I12 +772B5842B350:Mn2:H772B5842C4C8,H772B5842C4D8 +772B5842B368:lH772B5842C500|A9:undefined +772B5842B378:lH772B5842C518|H772B5842B388 +772B5842B388:t2:I132,I4 +772B5842B3A0:lH772B5842C530|A9:undefined +772B5842B3B0:Mn2:H772B5842C548,H772B5842C558 +772B5842B3C8:lH772B5842C568|A9:undefined +772B5842B3D8:lH772B5842C580|H772B5842B3E8 +772B5842B3E8:t2:I0,I36 +772B5842B400:lH772B5842C598|H772B5842B410 +772B5842B410:t2:I6,I3 +772B5842B428:lH772B5842C5B0|H772B5842B3E8 +772B5842B438:Mn2:H772B5842C5C8,H772B5842C5D8 +772B5842B450:Mn3:H772B5842C5E8,H772B5842C5F8,H772B5842C608 +772B5842B470:lH772B5842C630|H772B5842B480 +772B5842B480:t2:I41,I11 +772B5842B498:Mn2:H772B5842C648,H772B5842C670 +772B5842B4B0:Mn3:H772B5842C698,H772B5842C6A8,H772B5842C6B8 +772B5842B4D0:lH772B5842C6C8|A9:undefined +772B5842B4E0:Mn2:H772B5842C6E0,H772B5842C708 +772B5842B4F8:lH772B5842C718|A9:undefined +772B5842B508:lH772B5842C730|H772B5842B518 +772B5842B518:t2:I0,I41 +772B5842B530:lH772B5842C748|H772B5842B540 +772B5842B540:t2:A6:socket,I18 +772B5842B558:Mn2:H772B5842C760,H772B5842C788 +772B5842B570:lH772B5842C7B0|A9:undefined +772B5842B580:lH772B5842C7C8|H772B5842B590 +772B5842B590:t2:I0,I39 +772B5842B5A8:Mn2:H772B5842C7E0,H772B5842C7F0 +772B5842B5C0:lH772B5842C818|A9:undefined +772B5842B5D0:lH772B5842C830|H772B5842B5E0 +772B5842B5E0:t2:I0,I2 +772B5842B5F8:lH772B5842C848|H772B5842B608 +772B5842B608:t2:I41,I52 +772B5842B620:lH772B5842C860|H772B5842B630 +772B5842B630:t2:I41,I16 +772B5842B648:Mn2:H772B5842C878,H772B5842C888 +772B5842B660:lH772B5842C898|H772B5842B670 +772B5842B670:t2:I0,I35 +772B5842B688:Mn2:H772B5842C8B0,H772B5842C8C0 +772B5842B6A0:lH772B5842C8E8|A9:undefined +772B5842B6B0:Mn2:H772B5842C900,H772B5842C910 +772B5842B6C8:lH772B5842C920|H772B5842B6D8 +772B5842B6D8:t2:I41,I67 +772B5842B6F0:Mn2:H772B5842C938,H772B5842C960 +772B5842B708:lH772B5842C970|H772B5842B718 +772B5842B718:t2:I17,I1 +772B5842B730:Mn3:H772B5842C988,H772B5842C9B0,H772B5842C9C0 +772B5842B750:lH772B5842C9E8|A9:undefined +772B5842B760:Mn3:H772B5842CA00,H772B5842CA28,H772B5842CA40 +772B5842B780:lH772B5842CA68|A9:undefined +772B5842B790:Mn2:H772B5842CA80,H772B5842CAA8 +772B5842B7A8:lH772B5842CAD0|H772B5842B5E0 +772B5842B7B8:lH772B5842CAE8|H772B5842B7C8 +772B5842B7C8:t2:I0,I13 +772B5842B7E0:Mn2:H772B5842CB00,H772B5842CB28 +772B5842B7F8:lH772B5842CB38|H772B5842B808 +772B5842B808:t2:I41,I10 +772B5842B820:lH772B5842CB50|A9:undefined +772B5842B830:lH772B5842CB68|A9:undefined +772B5842B840:lH772B5842CB80|H772B5842B6D8 +772B5842B850:lH772B5842CB98|H772B5842B860 +772B5842B860:t2:A6:socket,I39 +772B5842B878:lH772B5842CBB0|H772B5842B888 +772B5842B888:t2:I41,I22 +772B5842B8A0:lH772B5842CBC8|A9:undefined +772B5842B8B0:Mn4:H772B5842CBE0,H772B5842CBF0,H772B5842CC00,H772B5842CC10 +772B5842B8D8:Mn2:H772B5842CC20,H772B5842CC30 +772B5842B8F0:lH772B5842CC40|H772B5842B900 +772B5842B900:t2:I6,I5 +772B5842B918:Mn3:H772B5842CC58,H772B5842CC68,H772B5842CC90 +772B5842B938:lH772B5842CCA0|A9:undefined +772B5842B948:Mn2:H772B5842CCB8,H772B5842CCC8 +772B5842B960:lH772B5842CCF0|H772B5842B590 +772B5842B970:Mn2:H772B5842CD08,H772B5842CD18 +772B5842B988:lH772B5842CD28|H772B5842B998 +772B5842B998:t2:I132,I13 +772B5842B9B0:lH772B5842CD40|A9:undefined +772B5842B9C0:Mn2:H772B5842CD58,H772B5842CD80 +772B5842B9D8:lH772B5842CDA8|H772B5842B9E8 +772B5842B9E8:t2:I132,I1 +772B5842BA00:Mn2:H772B5842CDC0,H772B5842CDD0 +772B5842BA18:Mn2:H772B5842CDF8,H772B5842CE08 +772B5842BA30:Mn2:H772B5842CE18,H772B5842CE40 +772B5842BA48:lH772B5842CE50|A9:undefined +772B5842BA58:lH772B5842CE68|A9:undefined +772B5842BA68:Mn2:H772B5842CE80,H772B5842CE90 +772B5842BA80:lH772B5842CEB8|H772B5842BA90 +772B5842BA90:t2:I0,I20 +772B5842BAA8:lH772B5842CED0|H772B5842B410 +772B5842BAB8:Mn2:H772B5842CEE8,H772B5842CF10 +772B5842BAD0:Mn3:H772B5842CF20,H772B5842CF30,H772B5842CF40 +772B5842BAF0:lH772B5842CF50|H772B5842BB00 +772B5842BB00:t2:A6:socket,I1 +772B5842BB18:lH772B5842CF68|H772B5842BB28 +772B5842BB28:t2:I0,I37 +772B5842BB40:Mn2:H772B5842CF80,H772B5842CFA8 +772B5842BB58:lH772B5842CFB8|H772B5842BB68 +772B5842BB68:t2:I0,I38 +772B5842BB80:Mn3:H772B5842CFD0,H772B5842CFF8,H772B5842D008 +772B5842BBA0:Mn3:H772B5842D018,H772B5842D040,H772B5842D068 +772B5842BBC0:lH772B5842D078|H772B5842BBD0 +772B5842BBD0:t2:I41,I23 +772B5842BBE8:Mn2:H772B5842D090,H772B5842D0B8 +772B5842BC00:Mn2:H772B5842D0E0,H772B5842D0F0 +772B5842BC18:lH772B5842D100|H772B5842BC28 +772B5842BC28:t2:I41,I26 +772B5842BC40:lH772B5842D118|H772B5842BC50 +772B5842BC50:t2:I41,I21 +772B5842BC68:Mn2:H772B5842D130,H772B5842D140 +772B5842BC80:Mn3:H772B5842D150,H772B5842D160,H772B5842D170 +772B5842BCA0:lH772B5842D180|A9:undefined +772B5842BCB0:Mn2:H772B5842D198,H772B5842D1A8 +772B5842BCC8:lH772B5842D1B8|H772B5842BCD8 +772B5842BCD8:t2:I6,I1 +772B5842BCF0:lH772B5842D1D0|A9:undefined +772B5842BD00:lH772B5842D1E8|A9:undefined +772B5842BD10:Mn2:H772B5842D200,H772B5842D210 +772B5842BD28:Mn2:H772B5842D238,H772B5842D248 +772B5842BD40:Mn2:H772B5842D270,H772B5842D280 +772B5842BD58:Mn4:H772B5842D2A8,H772B5842D2B8,H772B5842D2C8,H772B5842D2D8 +772B5842BD80:Mn3:H772B5842D300,H772B5842D318,H772B5842D328 +772B5842BDA0:Mn3:H772B5842D338,H772B5842D348,H772B5842D358 +772B5842BDC0:lH772B5842D368|H772B5842B670 +772B5842BDD0:lH772B5842D380|H772B5842BDE0 +772B5842BDE0:t2:I41,I49 +772B5842BDF8:Mn2:H772B5842D398,H772B5842D3A8 +772B5842BE10:lH772B5842D3B8|A9:undefined +772B5842BE20:Mn2:H772B5842D3D0,H772B5842D3E0 +772B5842BE38:Mn3:H772B5842D3F0,H772B5842D400,H772B5842D410 +772B5842BE58:lH772B5842D438|A9:undefined +772B5842BE68:lH772B5842D450|A9:undefined +772B5842BE78:Mn2:H772B5842D468,H772B5842D478 +772B5842BE90:lH772B5842D488|H772B5842B388 +772B5842BEA0:lH772B5842D4A0|H772B5842BC28 +772B5842BEB0:lH772B5842D4B8|H772B5842BEC0 +772B5842BEC0:t2:I41,I20 +772B5842BED8:Mn2:H772B5842D4D0,H772B5842D4E0 +772B5842BEF0:lH772B5842D4F0|A9:undefined +772B5842BF00:Mn2:H772B5842D508,H772B5842D518 +772B5842BF18:lH772B5842D528|H772B5842BF28 +772B5842BF28:t2:I41,I54 +772B5842BF40:Mn3:H772B5842D540,H772B5842D568,H772B5842D580 +772B5842BF60:lH772B5842D590|A9:undefined +772B5842BF70:lH772B5842D5A8|H772B5842B630 +772B5842BF80:lH772B5842D5C0|A9:undefined +772B5842BF90:Mn1:H772B5842D5D8 +772B5842BFA0:Mn3:H772B5842D5F0,H772B5842D600,H772B5842D610 +772B5842BFC0:lH772B5842D620|H772B5842BFD0 +772B5842BFD0:t2:I41,I24 +772B5842BFE8:lH772B5842D638|A9:undefined +772B5842BFF8:lH772B5842D650|A9:undefined +772B5842C008:Mn2:H772B5842D668,H772B5842D678 +772B5842C020:lH772B5842D688|H772B5842C030 +772B5842C030:t2:I6,I4 +772B5842C048:Mn2:H772B5842D6A0,H772B5842D6B0 +772B5842C060:Mn3:H772B5842D6C0,H772B5842D6D0,H772B5842D6F8 +772B5842C080:lH772B5842D708|H772B5842C090 +772B5842C090:t2:A6:socket,I25 +772B5842C0A8:lH772B5842D720|H772B5842BB68 +772B5842C0B8:Mn3:H772B5842D738,H772B5842D748,H772B5842D758 +772B5842C0D8:lH772B5842D768|A9:undefined +772B5842C0E8:lH772B5842D780|H772B5842C0F8 +772B5842C0F8:t2:I0,I40 +772B5842C110:Mn2:H772B5842D798,H772B5842D7A8 +772B5842C128:Mn2:H772B5842D7B8,H772B5842D7C8 +772B5842C140:lH772B5842D7D8|H772B5842C150 +772B5842C150:t2:I132,I0 +772B5842C168:lH772B5842D7F0|A9:undefined +772B5842C178:Mn2:H772B5842D808,H772B5842D830 +772B5842C190:lH772B5842D840|A9:undefined +772B5842C1A0:lH772B5842D858|A9:undefined +772B5842C1B0:lH772B5842D870|A9:undefined +772B5842C1C0:lH772B5842D888|H772B5842B718 +772B5842C1D0:Mn3:H772B5842D8A0,H772B5842D8B0,H772B5842D8C0 +772B5842C1F0:Mn2:H772B5842D8D0,H772B5842D8E0 +772B5842C208:Mn2:H772B5842D8F0,H772B5842D900 +772B5842C220:lH772B5842D910|A9:undefined +772B5842C230:lH772B5842D928|A9:undefined +772B5842C240:Mn2:H772B5842D940,H772B5842D950 +772B5842C258:Mn5:H772B5842D960,H772B5842D970,H772B5842D998,H772B5842D9A8,H772B5842D9D0 +772B5842C288:lH772B5842D9E0|H772B5842C298 +772B5842C298:t2:A6:socket,I10 +772B5842C2B0:t2:A3:tcp,A5:noopt +772B5842C2C8:t2:A4:SCTP,AE:adaption_layer +772B5842C2E0:lH772B5842D9F8|H772B5842C2F0 +772B5842C2F0:t2:I41,I51 +772B5842C308:lH772B5842DA10|A9:undefined +772B5842C318:t2:A2:IP,A7:hdrincl +772B5842C330:t2:A2:IP,AE:multicast_loop +772B5842C348:lH772B5842DA28|A9:undefined +772B5842C358:lH772B5842DA40|H772B5842C368 +772B5842C368:t2:I0,I21 +772B5842C380:t2:A3:TCP,A7:keepcnt +772B5842C398:t2:A4:sctp,A10:use_ext_recvinfo +772B5842C3B0:lH772B5842DA58|A9:undefined +772B5842C3C0:lH772B5842DA70|A9:undefined +772B5842C3D0:lH772B5842DA88|A9:undefined +772B5842C3E0:lH772B5842DAA0|H772B5842C3F0 +772B5842C3F0:t2:I41,I19 +772B5842C408:t2:A6:socket,A9:reuseport +772B5842C420:lH772B5842DAB8|A9:undefined +772B5842C430:lH772B5842DAD0|A9:undefined +772B5842C440:lH772B5842DAE8|H772B5842BF28 +772B5842C450:lH772B5842DB00|H772B5842C460 +772B5842C460:t2:I41,I57 +772B5842C478:lH772B5842DB18|A9:undefined +772B5842C488:lH772B5842DB30|H772B5842C498 +772B5842C498:t2:I6,I13 +772B5842C4B0:t2:A2:IP,A7:recvttl +772B5842C4C8:lH772B5842DB48|H772B5842C030 +772B5842C4D8:lH772B5842DB60|H772B5842C4E8 +772B5842C4E8:t2:I0,I9 +772B5842C500:t2:A4:SCTP,A6:status +772B5842C518:t2:A4:SCTP,A9:autoclose +772B5842C530:t2:A4:SCTP,A15:i_want_mapped_v4_addr +772B5842C548:lH772B5842DB78|A9:undefined +772B5842C558:lH772B5842DB90|A9:undefined +772B5842C568:t2:A4:IPv6,A11:esp_network_level +772B5842C580:t2:A2:ip,AF:drop_membership +772B5842C598:t2:A3:TCP,A4:cork +772B5842C5B0:t2:A2:IP,AF:drop_membership +772B5842C5C8:lH772B5842DBA8|H772B5842BDE0 +772B5842C5D8:lH772B5842DBC0|H772B5842B7C8 +772B5842C5E8:lH772B5842DBD8|A9:undefined +772B5842C5F8:lH772B5842DBF0|H772B5842B888 +772B5842C608:lH772B5842DC08|H772B5842C618 +772B5842C618:t2:I0,I15 +772B5842C630:t2:A4:ipv6,A8:flowinfo +772B5842C648:lH772B5842DC20|H772B5842C658 +772B5842C658:t2:I0,I8 +772B5842C670:lH772B5842DC38|H772B5842C680 +772B5842C680:t2:A6:socket,I3 +772B5842C698:lH772B5842DC50|A9:undefined +772B5842C6A8:lH772B5842DC68|H772B5842C368 +772B5842C6B8:lH772B5842DC80|A9:undefined +772B5842C6C8:t2:A4:SCTP,A7:context +772B5842C6E0:lH772B5842DC98|H772B5842C6F0 +772B5842C6F0:t2:I0,I33 +772B5842C708:lH772B5842DCB0|A9:undefined +772B5842C718:t2:A4:IPv6,AC:ipcomp_level +772B5842C730:t2:A2:ip,A8:msfilter +772B5842C748:t2:A6:socket,A8:rcvlowat +772B5842C760:lH772B5842DCC8|H772B5842C770 +772B5842C770:t2:I41,I18 +772B5842C788:lH772B5842DCE0|H772B5842C798 +772B5842C798:t2:A6:socket,I19 +772B5842C7B0:t2:A4:ipv6,AB:leave_group +772B5842C7C8:t2:A2:IP,A15:add_source_membership +772B5842C7E0:lH772B5842DCF8|H772B5842C6F0 +772B5842C7F0:lH772B5842DD10|H772B5842C800 +772B5842C800:t2:I41,I17 +772B5842C818:t2:A4:sctp,AF:auth_active_key +772B5842C830:t2:A2:ip,A3:ttl +772B5842C848:t2:A4:IPv6,A8:hoplimit +772B5842C860:t2:A4:IPv6,AC:unicast_hops +772B5842C878:lH772B5842DD28|A9:undefined +772B5842C888:lH772B5842DD40|H772B5842BC50 +772B5842C898:t2:A2:ip,AE:add_membership +772B5842C8B0:lH772B5842DD58|A9:undefined +772B5842C8C0:lH772B5842DD70|H772B5842C8D0 +772B5842C8D0:t2:I0,I5 +772B5842C8E8:t2:A4:ipv6,AA:pktoptions +772B5842C900:lH772B5842DD88|H772B5842C3F0 +772B5842C910:lH772B5842DDA0|A9:undefined +772B5842C920:t2:A4:IPv6,A6:tclass +772B5842C938:lH772B5842DDB8|H772B5842C948 +772B5842C948:t2:I132,I2 +772B5842C960:lH772B5842DDD0|A9:undefined +772B5842C970:t2:A3:udp,A4:cork +772B5842C988:lH772B5842DDE8|H772B5842C998 +772B5842C998:t2:A6:socket,I42 +772B5842C9B0:lH772B5842DE00|A9:undefined +772B5842C9C0:lH772B5842DE18|H772B5842C9D0 +772B5842C9D0:t2:I0,I14 +772B5842C9E8:t2:A6:socket,A8:rxq_ovfl +772B5842CA00:lH772B5842DE30|H772B5842CA10 +772B5842CA10:t2:A6:socket,I30 +772B5842CA28:Mn2:H772B5842DE48,H772B5842DE58 +772B5842CA40:lH772B5842DE68|H772B5842CA50 +772B5842CA50:t2:I0,I11 +772B5842CA68:t2:A4:sctp,A16:partial_delivery_point +772B5842CA80:lH772B5842DE80|H772B5842CA90 +772B5842CA90:t2:I0,I32 +772B5842CAA8:lH772B5842DE98|H772B5842CAB8 +772B5842CAB8:t2:A6:socket,I38 +772B5842CAD0:t2:A2:IP,A3:ttl +772B5842CAE8:t2:A2:IP,A7:recvtos +772B5842CB00:lH772B5842DEB0|H772B5842CB10 +772B5842CB10:t2:A6:socket,I9 +772B5842CB28:lH772B5842DEC8|H772B5842B9E8 +772B5842CB38:t2:A4:ipv6,A7:authhdr +772B5842CB50:t2:A4:sctp,A15:set_peer_primary_addr +772B5842CB68:t2:A4:ipv6,AA:join_group +772B5842CB80:t2:A4:ipv6,A6:tclass +772B5842CB98:t2:A6:socket,A6:domain +772B5842CBB0:t2:A4:ipv6,AC:router_alert +772B5842CBC8:t2:A4:sctp,AA:hmac_ident +772B5842CBE0:lH772B5842DEE0|H772B5842BEC0 +772B5842CBF0:lH772B5842DEF8|H772B5842C618 +772B5842CC00:lH772B5842DF10|A9:undefined +772B5842CC10:lH772B5842DF28|A9:undefined +772B5842CC20:lH772B5842DF40|A9:undefined +772B5842CC30:lH772B5842DF58|H772B5842B220 +772B5842CC40:t2:A3:TCP,A9:keepintvl +772B5842CC58:lH772B5842DF70|A9:undefined +772B5842CC68:lH772B5842DF88|H772B5842CC78 +772B5842CC78:t2:I0,I22 +772B5842CC90:lH772B5842DFA0|A9:undefined +772B5842CCA0:t2:A2:ip,AB:sendsrcaddr +772B5842CCB8:lH772B5842DFB8|H772B5842B518 +772B5842CCC8:lH772B5842DFD0|H772B5842CCD8 +772B5842CCD8:t2:I41,I25 +772B5842CCF0:t2:A2:ip,A15:add_source_membership +772B5842CD08:lH772B5842DFE8|A9:undefined +772B5842CD18:lH772B5842E000|A9:undefined +772B5842CD28:t2:A4:sctp,A6:maxseg +772B5842CD40:t2:A4:sctp,A13:default_send_params +772B5842CD58:lH772B5842E018|H772B5842CD68 +772B5842CD68:t2:I0,I19 +772B5842CD80:lH772B5842E030|H772B5842CD90 +772B5842CD90:t2:A6:socket,I2 +772B5842CDA8:t2:A4:SCTP,A9:associnfo +772B5842CDC0:lH772B5842E048|H772B5842B608 +772B5842CDD0:lH772B5842E060|H772B5842CDE0 +772B5842CDE0:t2:I41,I1 +772B5842CDF8:lH772B5842E078|H772B5842CC78 +772B5842CE08:lH772B5842E090|A9:undefined +772B5842CE18:lH772B5842E0A8|H772B5842CE28 +772B5842CE28:t2:I132,I8 +772B5842CE40:lH772B5842E0C0|H772B5842C948 +772B5842CE50:t2:A4:sctp,A12:get_peer_addr_info +772B5842CE68:t2:A6:socket,AC:max_msg_size +772B5842CE80:lH772B5842E0D8|A9:undefined +772B5842CE90:lH772B5842E0F0|H772B5842CEA0 +772B5842CEA0:t2:I132,I3 +772B5842CEB8:t2:A2:ip,AF:recvorigdstaddr +772B5842CED0:t2:A3:tcp,A4:cork +772B5842CEE8:lH772B5842E108|H772B5842CEF8 +772B5842CEF8:t2:A6:socket,I7 +772B5842CF10:lH772B5842E120|A9:undefined +772B5842CF20:lH772B5842E138|H772B5842B808 +772B5842CF30:lH772B5842E150|A9:undefined +772B5842CF40:lH772B5842E168|A9:undefined +772B5842CF50:t2:A6:socket,A5:debug +772B5842CF68:t2:A2:ip,AE:unblock_source +772B5842CF80:lH772B5842E180|H772B5842CF90 +772B5842CF90:t2:I41,I59 +772B5842CFA8:lH772B5842E198|A9:undefined +772B5842CFB8:t2:A2:IP,AC:block_source +772B5842CFD0:lH772B5842E1B0|H772B5842CFE0 +772B5842CFE0:t2:I0,I49 +772B5842CFF8:lH772B5842E1C8|A9:undefined +772B5842D008:lH772B5842E1E0|H772B5842B998 +772B5842D018:lH772B5842E1F8|H772B5842D028 +772B5842D028:t2:I6,I2 +772B5842D040:lH772B5842E210|H772B5842D050 +772B5842D050:t2:A6:socket,I29 +772B5842D068:lH772B5842E228|A9:undefined +772B5842D078:t2:A4:IPv6,AC:mtu_discover +772B5842D090:lH772B5842E240|H772B5842D0A0 +772B5842D0A0:t2:A6:socket,I5 +772B5842D0B8:lH772B5842E258|H772B5842D0C8 +772B5842D0C8:t2:I0,I7 +772B5842D0E0:lH772B5842E270|A9:undefined +772B5842D0F0:lH772B5842E288|A9:undefined +772B5842D100:t2:A4:IPv6,A6:v6only +772B5842D118:t2:A4:IPv6,AF:drop_membership +772B5842D130:lH772B5842E2A0|A9:undefined +772B5842D140:lH772B5842E2B8|H772B5842CCD8 +772B5842D150:lH772B5842E2D0|H772B5842C460 +772B5842D160:lH772B5842E2E8|H772B5842CFE0 +772B5842D170:lH772B5842E300|H772B5842C8D0 +772B5842D180:t2:A4:ipv6,A8:checksum +772B5842D198:lH772B5842E318|A9:undefined +772B5842D1A8:lH772B5842E330|A9:undefined +772B5842D1B8:t2:A3:TCP,A7:nodelay +772B5842D1D0:t2:A4:IPv6,AB:leave_group +772B5842D1E8:t2:A4:ipv6,A5:faith +772B5842D200:lH772B5842E348|H772B5842C150 +772B5842D210:lH772B5842E360|H772B5842D220 +772B5842D220:t2:A6:socket,I8 +772B5842D238:lH772B5842E378|H772B5842BFD0 +772B5842D248:lH772B5842E390|H772B5842D258 +772B5842D258:t2:I0,I6 +772B5842D270:lH772B5842E3A8|A9:undefined +772B5842D280:lH772B5842E3C0|H772B5842D290 +772B5842D290:t2:A6:socket,I13 +772B5842D2A8:lH772B5842E3D8|A9:undefined +772B5842D2B8:lH772B5842E3F0|A9:undefined +772B5842D2C8:lH772B5842E408|H772B5842CD68 +772B5842D2D8:lH772B5842E420|H772B5842D2E8 +772B5842D2E8:t2:I41,I66 +772B5842D300:Mn2:H772B5842E438,H772B5842E448 +772B5842D318:lH772B5842E458|H772B5842CF90 +772B5842D328:lH772B5842E470|A9:undefined +772B5842D338:lH772B5842E488|A9:undefined +772B5842D348:lH772B5842E4A0|H772B5842C658 +772B5842D358:lH772B5842E4B8|A9:undefined +772B5842D368:t2:A2:IP,AE:add_membership +772B5842D380:t2:A4:ipv6,AB:recvpktinfo +772B5842D398:lH772B5842E4D0|A9:undefined +772B5842D3A8:lH772B5842E4E8|A9:undefined +772B5842D3B8:t2:A4:sctp,A15:i_want_mapped_v4_addr +772B5842D3D0:lH772B5842E500|H772B5842C800 +772B5842D3E0:lH772B5842E518|H772B5842BB28 +772B5842D3F0:lH772B5842E530|H772B5842CEA0 +772B5842D400:lH772B5842E548|A9:undefined +772B5842D410:lH772B5842E560|H772B5842D420 +772B5842D420:t2:A6:socket,I12 +772B5842D438:t2:A6:socket,A10:exclusiveaddruse +772B5842D450:t2:A3:TCP,A6:md5sig +772B5842D468:lH772B5842E578|H772B5842B260 +772B5842D478:lH772B5842E590|A9:undefined +772B5842D488:t2:A4:sctp,A9:autoclose +772B5842D4A0:t2:A4:ipv6,A6:v6only +772B5842D4B8:t2:A4:IPv6,AE:add_membership +772B5842D4D0:lH772B5842E5A8|H772B5842B1F8 +772B5842D4E0:lH772B5842E5C0|H772B5842D2E8 +772B5842D4F0:t2:A4:ipv6,A9:portrange +772B5842D508:lH772B5842E5D8|H772B5842D0C8 +772B5842D518:lH772B5842E5F0|H772B5842B338 +772B5842D528:t2:A4:IPv6,A7:hopopts +772B5842D540:lH772B5842E608|H772B5842D550 +772B5842D550:t2:I0,I10 +772B5842D568:Mn2:H772B5842E620,H772B5842E630 +772B5842D580:lH772B5842E640|H772B5842BCD8 +772B5842D590:t2:A4:SCTP,A10:peer_addr_params +772B5842D5A8:t2:A4:ipv6,AC:unicast_hops +772B5842D5C0:t2:A4:sctp,A8:maxburst +772B5842D5D8:Mn2:H772B5842E658,H772B5842E668 +772B5842D5F0:lH772B5842E678|A9:undefined +772B5842D600:lH772B5842E690|H772B5842C770 +772B5842D610:lH772B5842E6A8|A9:undefined +772B5842D620:t2:A4:IPv6,A3:mtu +772B5842D638:t2:A4:SCTP,A16:partial_delivery_point +772B5842D650:t2:A4:SCTP,A10:use_ext_recvinfo +772B5842D668:lH772B5842E6C0|A9:undefined +772B5842D678:lH772B5842E6D8|A9:undefined +772B5842D688:t2:A3:TCP,A8:keepidle +772B5842D6A0:lH772B5842E6F0|A9:undefined +772B5842D6B0:lH772B5842E708|H772B5842C4E8 +772B5842D6C0:lH772B5842E720|A9:undefined +772B5842D6D0:lH772B5842E738|H772B5842D6E0 +772B5842D6E0:t2:I132,I11 +772B5842D6F8:lH772B5842E750|H772B5842D550 +772B5842D708:t2:A6:socket,AC:bindtodevice +772B5842D720:t2:A2:ip,AC:block_source +772B5842D738:lH772B5842E768|H772B5842B480 +772B5842D748:lH772B5842E780|H772B5842D028 +772B5842D758:lH772B5842E798|A9:undefined +772B5842D768:t2:A4:sctp,A8:auth_key +772B5842D780:t2:A2:ip,A16:drop_source_membership +772B5842D798:lH772B5842E7B0|H772B5842CA90 +772B5842D7A8:lH772B5842E7C8|H772B5842C498 +772B5842D7B8:lH772B5842E7E0|A9:undefined +772B5842D7C8:lH772B5842E7F8|H772B5842BBD0 +772B5842D7D8:t2:A4:sctp,A7:rtoinfo +772B5842D7F0:t2:A4:IPv6,AA:join_group +772B5842D808:lH772B5842E810|H772B5842D818 +772B5842D818:t2:I0,I1 +772B5842D830:lH772B5842E828|A9:undefined +772B5842D840:t2:A6:socket,A8:rcvtimeo +772B5842D858:t2:A6:socket,A5:error +772B5842D870:t2:A6:socket,A4:mark +772B5842D888:t2:A3:UDP,A4:cork +772B5842D8A0:lH772B5842E840|A9:undefined +772B5842D8B0:lH772B5842E858|A9:undefined +772B5842D8C0:lH772B5842E870|A9:undefined +772B5842D8D0:lH772B5842E888|A9:undefined +772B5842D8E0:lH772B5842E8A0|H772B5842BA90 +772B5842D8F0:lH772B5842E8B8|A9:undefined +772B5842D900:lH772B5842E8D0|H772B5842C2F0 +772B5842D910:t2:A4:sctp,AE:adaption_layer +772B5842D928:t2:A4:SCTP,A11:local_auth_chunks +772B5842D940:lH772B5842E8E8|A9:undefined +772B5842D950:lH772B5842E900|A9:undefined +772B5842D960:lH772B5842E918|A9:undefined +772B5842D970:lH772B5842E930|H772B5842D980 +772B5842D980:t2:A6:socket,I16 +772B5842D998:lH772B5842E948|H772B5842CE28 +772B5842D9A8:lH772B5842E960|H772B5842D9B8 +772B5842D9B8:t2:A6:socket,I6 +772B5842D9D0:lH772B5842E978|H772B5842D258 +772B5842D9E0:t2:A6:socket,A9:oobinline +772B5842D9F8:t2:A4:ipv6,AC:recvhoplimit +772B5842DA10:t2:A4:SCTP,A10:delayed_ack_time +772B5842DA28:t2:A4:ipv6,AB:use_min_mtu +772B5842DA40:t2:A2:IP,A6:minttl +772B5842DA58:t2:A2:ip,A8:dontfrag +772B5842DA70:t2:A3:tcp,A6:md5sig +772B5842DA88:t2:A4:SCTP,A15:set_peer_primary_addr +772B5842DAA0:t2:A4:IPv6,AE:multicast_loop +772B5842DAB8:t2:A3:TCP,A6:nopush +772B5842DAD0:t2:A4:SCTP,AA:auth_chunk +772B5842DAE8:t2:A4:ipv6,A7:hopopts +772B5842DB00:t2:A4:IPv6,A5:rthdr +772B5842DB18:t2:A2:IP,A7:options +772B5842DB30:t2:A3:TCP,AA:congestion +772B5842DB48:t2:A3:tcp,A8:keepidle +772B5842DB60:t2:A2:ip,AA:pktoptions +772B5842DB78:t2:A4:IPv6,A5:faith +772B5842DB90:t2:A4:IPv6,AA:auth_level +772B5842DBA8:t2:A4:IPv6,AB:recvpktinfo +772B5842DBC0:t2:A2:ip,A7:recvtos +772B5842DBD8:t2:A4:sctp,AA:auth_chunk +772B5842DBF0:t2:A4:IPv6,AC:router_alert +772B5842DC08:t2:A2:ip,A8:freebind +772B5842DC20:t2:A2:IP,A7:pktinfo +772B5842DC38:t2:A6:socket,A4:type +772B5842DC50:t2:A2:IP,AB:sendsrcaddr +772B5842DC68:t2:A2:ip,A6:minttl +772B5842DC80:t2:A6:socket,AC:acceptfilter +772B5842DC98:t2:A2:ip,AD:multicast_ttl +772B5842DCB0:t2:A2:ip,AB:recvdstaddr +772B5842DCC8:t2:A4:IPv6,AE:multicast_hops +772B5842DCE0:t2:A6:socket,A8:sndlowat +772B5842DCF8:t2:A2:IP,AD:multicast_ttl +772B5842DD10:t2:A4:ipv6,AC:multicast_if +772B5842DD28:t2:A4:SCTP,A8:maxburst +772B5842DD40:t2:A4:ipv6,AF:drop_membership +772B5842DD58:t2:A6:socket,A8:sndtimeo +772B5842DD70:t2:A2:ip,AC:router_alert +772B5842DD88:t2:A4:ipv6,AE:multicast_loop +772B5842DDA0:t2:A6:socket,A9:bsp_state +772B5842DDB8:t2:A4:SCTP,A7:initmsg +772B5842DDD0:t2:A4:sctp,A10:peer_auth_chunks +772B5842DDE8:t2:A6:socket,A8:peek_off +772B5842DE00:t2:A2:ip,A7:options +772B5842DE18:t2:A2:ip,A3:mtu +772B5842DE30:t2:A6:socket,AA:acceptconn +772B5842DE48:lH772B5842E990|H772B5842C9D0 +772B5842DE58:lH772B5842E9A8|A9:undefined +772B5842DE68:t2:A2:IP,A7:recverr +772B5842DE80:t2:A2:ip,AC:multicast_if +772B5842DE98:t2:A6:socket,A8:protocol +772B5842DEB0:t2:A6:socket,A9:keepalive +772B5842DEC8:t2:A4:sctp,A9:associnfo +772B5842DEE0:t2:A4:ipv6,AE:add_membership +772B5842DEF8:t2:A2:IP,A8:freebind +772B5842DF10:t2:A4:SCTP,AD:reset_streams +772B5842DF28:t2:A4:SCTP,A12:get_peer_addr_info +772B5842DF40:t2:A4:IPv6,A9:portrange +772B5842DF58:t2:A2:ip,AE:multicast_loop +772B5842DF70:t2:A4:IPv6,A8:checksum +772B5842DF88:t2:A2:ip,A8:nodefrag +772B5842DFA0:t2:A6:socket,A9:busy_poll +772B5842DFB8:t2:A2:IP,A8:msfilter +772B5842DFD0:t2:A4:IPv6,A7:recverr +772B5842DFE8:t2:A4:sctp,AC:explicit_eor +772B5842E000:t2:A4:SCTP,AF:auth_active_key +772B5842E018:t2:A2:ip,AB:transparent +772B5842E030:t2:A6:socket,A9:reuseaddr +772B5842E048:t2:A4:ipv6,A8:hoplimit +772B5842E060:t2:A4:IPv6,A8:addrform +772B5842E078:t2:A2:IP,A8:nodefrag +772B5842E090:t2:A4:ipv6,A11:esp_network_level +772B5842E0A8:t2:A4:SCTP,A11:disable_fragments +772B5842E0C0:t2:A4:sctp,A7:initmsg +772B5842E0D8:t2:A4:SCTP,AA:hmac_ident +772B5842E0F0:t2:A4:sctp,A7:nodelay +772B5842E108:t2:A6:socket,A6:sndbuf +772B5842E120:t2:A6:socket,A5:maxdg +772B5842E138:t2:A4:IPv6,A7:authhdr +772B5842E150:t2:A4:sctp,AF:auth_delete_key +772B5842E168:t2:A3:TCP,A6:syncnt +772B5842E180:t2:A4:IPv6,A7:dstopts +772B5842E198:t2:A6:socket,AB:sndbufforce +772B5842E1B0:t2:A2:IP,AD:multicast_all +772B5842E1C8:t2:A2:IP,A8:dontfrag +772B5842E1E0:t2:A4:SCTP,A6:maxseg +772B5842E1F8:t2:A3:TCP,A6:maxseg +772B5842E210:t2:A6:socket,A9:timestamp +772B5842E228:t2:A4:IPv6,AF:esp_trans_level +772B5842E240:t2:A6:socket,A9:dontroute +772B5842E258:t2:A2:ip,A7:retopts +772B5842E270:t2:A4:sctp,AD:reset_streams +772B5842E288:t2:A4:SCTP,A13:default_send_params +772B5842E2A0:t2:A3:TCP,AC:user_timeout +772B5842E2B8:t2:A4:ipv6,A7:recverr +772B5842E2D0:t2:A4:ipv6,A5:rthdr +772B5842E2E8:t2:A2:ip,AD:multicast_all +772B5842E300:t2:A2:IP,AC:router_alert +772B5842E318:t2:A6:socket,A8:peercred +772B5842E330:t2:A4:SCTP,AC:explicit_eor +772B5842E348:t2:A4:SCTP,A7:rtoinfo +772B5842E360:t2:A6:socket,A6:rcvbuf +772B5842E378:t2:A4:ipv6,A3:mtu +772B5842E390:t2:A2:IP,A8:recvopts +772B5842E3A8:t2:A4:SCTP,A13:fragment_interleave +772B5842E3C0:t2:A6:socket,A6:linger +772B5842E3D8:t2:A4:sctp,A10:delayed_ack_time +772B5842E3F0:t2:A3:tcp,AC:user_timeout +772B5842E408:t2:A2:IP,AB:transparent +772B5842E420:t2:A4:ipv6,AA:recvtclass +772B5842E438:lH772B5842E9C0|H772B5842CDE0 +772B5842E448:lH772B5842E9D8|H772B5842D6E0 +772B5842E458:t2:A4:ipv6,A7:dstopts +772B5842E470:t2:A6:socket,A6:setfib +772B5842E488:t2:A4:IPv6,AB:use_min_mtu +772B5842E4A0:t2:A2:ip,A7:pktinfo +772B5842E4B8:t2:A4:sctp,AC:primary_addr +772B5842E4D0:t2:A4:SCTP,A10:peer_auth_chunks +772B5842E4E8:t2:A4:sctp,A10:peer_addr_params +772B5842E500:t2:A4:IPv6,AC:multicast_if +772B5842E518:t2:A2:IP,AE:unblock_source +772B5842E530:t2:A4:SCTP,A7:nodelay +772B5842E548:t2:A2:IP,A6:recvif +772B5842E560:t2:A6:socket,A8:priority +772B5842E578:t2:A3:tcp,A7:keepcnt +772B5842E590:t2:A6:socket,AB:rcvbufforce +772B5842E5A8:t2:A2:ip,A7:hdrincl +772B5842E5C0:t2:A4:IPv6,AA:recvtclass +772B5842E5D8:t2:A2:IP,A7:retopts +772B5842E5F0:t2:A2:ip,A7:recvttl +772B5842E608:t2:A2:IP,AC:mtu_discover +772B5842E620:lH772B5842E9F0|H772B5842B900 +772B5842E630:lH772B5842EA08|H772B5842CA50 +772B5842E640:t2:A3:tcp,A7:nodelay +772B5842E658:lH772B5842EA20|H772B5842D818 +772B5842E668:lH772B5842EA38|H772B5842C0F8 +772B5842E678:t2:A4:ipv6,AC:ipcomp_level +772B5842E690:t2:A4:ipv6,AE:multicast_hops +772B5842E6A8:t2:A4:sctp,A13:fragment_interleave +772B5842E6C0:t2:A3:tcp,A6:syncnt +772B5842E6D8:t2:A4:SCTP,AF:auth_delete_key +772B5842E6F0:t2:A4:sctp,A11:local_auth_chunks +772B5842E708:t2:A2:IP,AA:pktoptions +772B5842E720:t2:A4:SCTP,A8:auth_key +772B5842E738:t2:A4:SCTP,A6:events +772B5842E750:t2:A2:ip,AC:mtu_discover +772B5842E768:t2:A4:IPv6,A8:flowinfo +772B5842E780:t2:A3:tcp,A6:maxseg +772B5842E798:t2:A3:tcp,A4:info +772B5842E7B0:t2:A2:IP,AC:multicast_if +772B5842E7C8:t2:A3:tcp,AA:congestion +772B5842E7E0:t2:A4:sctp,A7:context +772B5842E7F8:t2:A4:ipv6,AC:mtu_discover +772B5842E810:t2:A2:IP,A3:tos +772B5842E828:t2:A4:ipv6,AF:esp_trans_level +772B5842E840:t2:A3:TCP,A5:noopt +772B5842E858:t2:A3:tcp,A6:nopush +772B5842E870:t2:A2:IP,AB:recvdstaddr +772B5842E888:t2:A4:sctp,A6:status +772B5842E8A0:t2:A2:IP,AF:recvorigdstaddr +772B5842E8B8:t2:A4:IPv6,AA:pktoptions +772B5842E8D0:t2:A4:IPv6,AC:recvhoplimit +772B5842E8E8:t2:A4:ipv6,AA:auth_level +772B5842E900:t2:A3:TCP,A4:info +772B5842E918:t2:A2:ip,A6:recvif +772B5842E930:t2:A6:socket,A8:passcred +772B5842E948:t2:A4:sctp,A11:disable_fragments +772B5842E960:t2:A6:socket,A9:broadcast +772B5842E978:t2:A2:ip,A8:recvopts +772B5842E990:t2:A2:IP,A3:mtu +772B5842E9A8:t2:A4:SCTP,AC:primary_addr +772B5842E9C0:t2:A4:ipv6,A8:addrform +772B5842E9D8:t2:A4:sctp,A6:events +772B5842E9F0:t2:A3:tcp,A9:keepintvl +772B5842EA08:t2:A2:ip,A7:recverr +772B5842EA20:t2:A2:ip,A3:tos +772B5842EA38:t2:A2:IP,A16:drop_source_membership +772B584290B8:t2:H772B584290D0,H772B584290E8 +772B584290D0:t2:AB:prim_socket,A9:protocols +772B584290E8:MhAA:10:H772B58429178,H772B584291B8,H772B58429210,H772B58429240,H772B58429278,H772B584292B8,H772B58429300,H772B58429348,H772B58429390,H772B584293C0,H772B58429400,H772B58429440,H772B58429490,H772B584294C0,H772B58429520,H772B58429560 +772B58429178:Mn7:H772B584295A8,H772B584295B8,H772B584295E8,H772B58429600,H772B58429618,H772B58429628,H772B58429658 +772B584291B8:MnA:H772B58429668,H772B58429680,H772B58429690,H772B584296A8,H772B584296D0,H772B584296E0,H772B584296F0,H772B58429720,H772B58429738,H772B58429748 +772B58429210:Mn5:H772B58429758,H772B58429770,H772B584297A0,H772B584297B0,H772B584297E0 +772B58429240:Mn6:H772B58429810,H772B58429840,H772B58429858,H772B58429870,H772B584298A0,H772B584298D0 +772B58429278:Mn7:H772B58429900,H772B58429910,H772B58429920,H772B58429950,H772B58429980,H772B58429990,H772B584299B0 +772B584292B8:Mn8:H772B584299C8,H772B584299D8,H772B584299E8,H772B584299F8,H772B58429A08,H772B58429A18,H772B58429A38,H772B58429A50 +772B58429300:Mn8:H772B58429A60,H772B58429A90,H772B58429AA0,H772B58429AB0,H772B58429AC8,H772B58429AF8,H772B58429B08,H772B58429B18 +772B58429348:Mn8:H772B58429B48,H772B58429B58,H772B58429B68,H772B58429B78,H772B58429B88,H772B58429B98,H772B58429BB8,H772B58429BC8 +772B58429390:Mn5:H772B58429BE0,H772B58429BF0,H772B58429C08,H772B58429C18,H772B58429C28 +772B584293C0:Mn7:H772B58429C58,H772B58429C68,H772B58429C80,H772B58429CA0,H772B58429CB0,H772B58429CE0,H772B58429D10 +772B58429400:Mn7:H772B58429D20,H772B58429D38,H772B58429D58,H772B58429D68,H772B58429D78,H772B58429DA8,H772B58429DB8 +772B58429440:Mn9:H772B58429DD8,H772B58429E10,H772B58429E40,H772B58429E58,H772B58429E98,H772B58429EB0,H772B58429EE0,H772B58429EF8,H772B58429F08 +772B58429490:Mn5:H772B58429F38,H772B58429F50,H772B58429F60,H772B58429F90,H772B58429FA8 +772B584294C0:MnB:H772B58429FB8,H772B58429FD8,H772B5842A008,H772B5842A018,H772B5842A028,H772B5842A038,H772B5842A068,H772B5842A088,H772B5842A098,H772B5842A0C8,H772B5842A0F8 +772B58429520:Mn7:H772B5842A110,H772B5842A120,H772B5842A138,H772B5842A168,H772B5842A178,H772B5842A198,H772B5842A1A8 +772B58429560:Mn8:H772B5842A1C0,H772B5842A1D0,H772B5842A1E8,H772B5842A1F8,H772B5842A210,H772B5842A220,H772B5842A250,H772B5842A268 +772B584295A8:lA6:ipcomp|I108 +772B584295B8:lI94|H772B584295C8 +772B584295C8:lA4:ipip|H772B584295D8 +772B584295D8:lA4:IPIP|N +772B584295E8:Mn2:H772B5842A278,H772B5842A2A8 +772B58429600:Mn2:H772B5842A2D8,H772B5842A2E8 +772B58429618:lA6:IPCOMP|I108 +772B58429628:lI93|H772B58429638 +772B58429638:lA5:ax.25|H772B58429648 +772B58429648:lA5:AX.25|N +772B58429658:lA6:hopopt|I0 +772B58429668:Mn2:H772B5842A2F8,H772B5842A308 +772B58429680:lA3:HIP|I139 +772B58429690:Mn2:H772B5842A318,H772B5842A328 +772B584296A8:Mn4:H772B5842A338,H772B5842A348,H772B5842A358,H772B5842A388 +772B584296D0:lAA:ipv6-nonxt|I59 +772B584296E0:lA3:PUP|I12 +772B584296F0:lI132|H772B58429700 +772B58429700:lA4:sctp|H772B58429710 +772B58429710:lA4:SCTP|N +772B58429720:Mn2:H772B5842A398,H772B5842A3A8 +772B58429738:lA4:wesp|I141 +772B58429748:lAF:Mobility-Header|I135 +772B58429758:Mn2:H772B5842A3B8,H772B5842A3C8 +772B58429770:lI12|H772B58429780 +772B58429780:lA3:pup|H772B58429790 +772B58429790:lA3:PUP|N +772B584297A0:lA5:mptcp|I262 +772B584297B0:lI139|H772B584297C0 +772B584297C0:lA3:hip|H772B584297D0 +772B584297D0:lA3:HIP|N +772B584297E0:lI41|H772B584297F0 +772B584297F0:lA4:ipv6|H772B58429800 +772B58429800:lA4:IPv6|N +772B58429810:lI29|H772B58429820 +772B58429820:lA7:iso-tp4|H772B58429830 +772B58429830:lA7:ISO-TP4|N +772B58429840:Mn2:H772B5842A3D8,H772B5842A3E8 +772B58429858:Mn2:H772B5842A418,H772B5842A428 +772B58429870:lI2|H772B58429880 +772B58429880:lA4:igmp|H772B58429890 +772B58429890:lA4:IGMP|N +772B584298A0:lI98|H772B584298B0 +772B584298B0:lA5:encap|H772B584298C0 +772B584298C0:lA5:ENCAP|N +772B584298D0:lI38|H772B584298E0 +772B584298E0:lA9:idpr-cmtp|H772B584298F0 +772B584298F0:lA9:IDPR-CMTP|N +772B58429900:lA9:IPv6-ICMP|I58 +772B58429910:lA3:TCP|I6 +772B58429920:lI137|H772B58429930 +772B58429930:lAA:mpls-in-ip|H772B58429940 +772B58429940:lAA:MPLS-in-IP|N +772B58429950:lI141|H772B58429960 +772B58429960:lA4:wesp|H772B58429970 +772B58429970:lA4:WESP|N +772B58429980:lA3:egp|I8 +772B58429990:Mn3:H772B5842A438,H772B5842A448,H772B5842A458 +772B584299B0:Mn2:H772B5842A468,H772B5842A478 +772B584299C8:lA4:ipv6|I41 +772B584299D8:lA3:igp|I9 +772B584299E8:lA4:sctp|I132 +772B584299F8:lA7:iso-tp4|I29 +772B58429A08:lA3:IGP|I9 +772B58429A18:Mn3:H772B5842A4A8,H772B5842A4B8,H772B5842A4C8 +772B58429A38:Mn2:H772B5842A4D8,H772B5842A508 +772B58429A50:lAA:IPv6-NoNxt|I59 +772B58429A60:lI44|H772B58429A70 +772B58429A70:lA9:ipv6-frag|H772B58429A80 +772B58429A80:lA9:IPv6-Frag|N +772B58429A90:lA3:hip|I139 +772B58429AA0:lA4:rspf|I73 +772B58429AB0:Mn2:H772B5842A538,H772B5842A548 +772B58429AC8:lI112|H772B58429AD8 +772B58429AD8:lA4:vrrp|H772B58429AE8 +772B58429AE8:lA4:VRRP|N +772B58429AF8:lA7:XNS-IDP|I22 +772B58429B08:lA5:MPTCP|I262 +772B58429B18:lI9|H772B58429B28 +772B58429B28:lA3:igp|H772B58429B38 +772B58429B38:lA3:IGP|N +772B58429B48:lA7:ISO-TP4|I29 +772B58429B58:lA4:SCTP|I132 +772B58429B68:lA3:tcp|I6 +772B58429B78:lA4:IGMP|I2 +772B58429B88:lA2:FC|I133 +772B58429B98:Mn3:H772B5842A558,H772B5842A588,H772B5842A5B8 +772B58429BB8:lA4:ROHC|I142 +772B58429BC8:Mn2:H772B5842A5C8,H772B5842A5D8 +772B58429BE0:lAF:mobility-header|I135 +772B58429BF0:Mn2:H772B5842A5E8,H772B5842A5F8 +772B58429C08:lAA:MPLS-in-IP|I137 +772B58429C18:lA9:idpr-cmtp|I38 +772B58429C28:lI97|H772B58429C38 +772B58429C38:lA7:etherip|H772B58429C48 +772B58429C48:lA7:ETHERIP|N +772B58429C58:lA9:ipv6-opts|I60 +772B58429C68:Mn2:H772B5842A628,H772B5842A658 +772B58429C80:Mn3:H772B5842A668,H772B5842A678,H772B5842A688 +772B58429CA0:lA4:igmp|I2 +772B58429CB0:lI1|H772B58429CC0 +772B58429CC0:lA4:icmp|H772B58429CD0 +772B58429CD0:lA4:ICMP|N +772B58429CE0:lI142|H772B58429CF0 +772B58429CF0:lA4:rohc|H772B58429D00 +772B58429D00:lA4:ROHC|N +772B58429D10:lA3:UDP|I17 +772B58429D20:Mn2:H772B5842A6B8,H772B5842A6C8 +772B58429D38:Mn3:H772B5842A6F8,H772B5842A728,H772B5842A758 +772B58429D58:lA7:UDPLite|I136 +772B58429D68:lA3:RDP|I27 +772B58429D78:lI6|H772B58429D88 +772B58429D88:lA3:tcp|H772B58429D98 +772B58429D98:lA3:TCP|N +772B58429DA8:lA2:fc|I133 +772B58429DB8:lI138|H772B58429DC8 +772B58429DC8:lA5:manet|N +772B58429DD8:Mn6:H772B5842A770,H772B5842A780,H772B5842A790,H772B5842A7A0,H772B5842A7B0,H772B5842A7C0 +772B58429E10:lI57|H772B58429E20 +772B58429E20:lA4:skip|H772B58429E30 +772B58429E30:lA4:SKIP|N +772B58429E40:Mn2:H772B5842A7F0,H772B5842A820 +772B58429E58:lI73|H772B58429E68 +772B58429E68:lA4:rspf|H772B58429E78 +772B58429E78:lA4:CPHB|H772B58429E88 +772B58429E88:lA4:RSPF|N +772B58429E98:Mn2:H772B5842A830,H772B5842A860 +772B58429EB0:lI17|H772B58429EC0 +772B58429EC0:lA3:udp|H772B58429ED0 +772B58429ED0:lA3:UDP|N +772B58429EE0:Mn2:H772B5842A890,H772B5842A8A0 +772B58429EF8:lA2:ah|I51 +772B58429F08:lI33|H772B58429F18 +772B58429F18:lA4:dccp|H772B58429F28 +772B58429F28:lA4:DCCP|N +772B58429F38:Mn2:H772B5842A8D0,H772B5842A8E0 +772B58429F50:lA4:L2TP|I115 +772B58429F60:lI3|H772B58429F70 +772B58429F70:lA3:ggp|H772B58429F80 +772B58429F80:lA3:GGP|N +772B58429F90:Mn2:H772B5842A8F0,H772B5842A900 +772B58429FA8:lA3:GRE|I47 +772B58429FB8:Mn3:H772B5842A910,H772B5842A928,H772B5842A958 +772B58429FD8:lI0|H772B58429FE8 +772B58429FE8:lA2:ip|H772B58429FF8 +772B58429FF8:lA2:IP|N +772B5842A008:lA3:esp|I50 +772B5842A018:lA2:IP|I0 +772B5842A028:lA7:udplite|I136 +772B5842A038:lI27|H772B5842A048 +772B5842A048:lA3:rdp|H772B5842A058 +772B5842A058:lA3:RDP|N +772B5842A068:Mn3:H772B5842A968,H772B5842A978,H772B5842A988 +772B5842A088:lA8:ethernet|I143 +772B5842A098:lI124|H772B5842A0A8 +772B5842A0A8:lA4:isis|H772B5842A0B8 +772B5842A0B8:lA4:ISIS|N +772B5842A0C8:lI51|H772B5842A0D8 +772B5842A0D8:lA2:ah|H772B5842A0E8 +772B5842A0E8:lA8:IPSEC-AH|N +772B5842A0F8:Mn2:H772B5842A9B8,H772B5842A9C8 +772B5842A110:lA4:vmtp|I81 +772B5842A120:Mn2:H772B5842A9D8,H772B5842AA08 +772B5842A138:lI50|H772B5842A148 +772B5842A148:lA3:esp|H772B5842A158 +772B5842A158:lA9:IPSEC-ESP|N +772B5842A168:lA3:HMP|I20 +772B5842A178:Mn3:H772B5842AA18,H772B5842AA28,H772B5842AA38 +772B5842A198:lA4:vrrp|I112 +772B5842A1A8:Mn2:H772B5842AA68,H772B5842AA78 +772B5842A1C0:lA4:rohc|I142 +772B5842A1D0:Mn2:H772B5842AA88,H772B5842AAB8 +772B5842A1E8:lA8:IP-ENCAP|I4 +772B5842A1F8:Mn2:H772B5842AAC8,H772B5842AAD8 +772B5842A210:lA9:IPSEC-ESP|I50 +772B5842A220:lI135|H772B5842A230 +772B5842A230:lAF:mobility-header|H772B5842A240 +772B5842A240:lAF:Mobility-Header|N +772B5842A250:Mn2:H772B5842AAE8,H772B5842AAF8 +772B5842A268:lA3:pup|I12 +772B5842A278:lI4|H772B5842A288 +772B5842A288:lA7:ipencap|H772B5842A298 +772B5842A298:lA8:IP-ENCAP|N +772B5842A2A8:lI136|H772B5842A2B8 +772B5842A2B8:lA7:udplite|H772B5842A2C8 +772B5842A2C8:lA7:UDPLite|N +772B5842A2D8:lA4:ospf|I89 +772B5842A2E8:lA4:IDRP|I45 +772B5842A2F8:lA4:DCCP|I33 +772B5842A308:lA4:isis|I124 +772B5842A318:lA3:pim|I103 +772B5842A328:lA7:ipencap|I4 +772B5842A338:lA3:ggp|I3 +772B5842A348:lA3:DDP|I37 +772B5842A358:lI46|H772B5842A368 +772B5842A368:lA4:rsvp|H772B5842A378 +772B5842A378:lA4:RSVP|N +772B5842A388:lA4:WESP|I141 +772B5842A398:lA4:idrp|I45 +772B5842A3A8:lA4:ICMP|I1 +772B5842A3B8:lA4:RSPF|I73 +772B5842A3C8:lAA:ipv6-route|I43 +772B5842A3D8:lA7:ETHERIP|I97 +772B5842A3E8:lI140|H772B5842A3F8 +772B5842A3F8:lA5:shim6|H772B5842A408 +772B5842A408:lA5:Shim6|N +772B5842A418:lA3:xtp|I36 +772B5842A428:lA7:OSPFIGP|I89 +772B5842A438:lA7:xns-idp|I22 +772B5842A448:lA5:ax.25|I93 +772B5842A458:lA3:udp|I17 +772B5842A468:lA8:IPSEC-AH|I51 +772B5842A478:lI115|H772B5842A488 +772B5842A488:lA4:l2tp|H772B5842A498 +772B5842A498:lA4:L2TP|N +772B5842A4A8:lA3:PIM|I103 +772B5842A4B8:lA5:manet|I138 +772B5842A4C8:lA3:gre|I47 +772B5842A4D8:lI8|H772B5842A4E8 +772B5842A4E8:lA3:egp|H772B5842A4F8 +772B5842A4F8:lA3:EGP|N +772B5842A508:lI143|H772B5842A518 +772B5842A518:lA8:ethernet|H772B5842A528 +772B5842A528:lA8:Ethernet|N +772B5842A538:lA4:dccp|I33 +772B5842A548:lA4:RSVP|I46 +772B5842A558:lI103|H772B5842A568 +772B5842A568:lA3:pim|H772B5842A578 +772B5842A578:lA3:PIM|N +772B5842A588:lI262|H772B5842A598 +772B5842A598:lA5:mptcp|H772B5842A5A8 +772B5842A5A8:lA5:MPTCP|N +772B5842A5B8:lA4:rsvp|I46 +772B5842A5C8:lA5:shim6|I140 +772B5842A5D8:lA7:etherip|I97 +772B5842A5E8:lA9:IDPR-CMTP|I38 +772B5842A5F8:lI36|H772B5842A608 +772B5842A608:lA3:xtp|H772B5842A618 +772B5842A618:lA3:XTP|N +772B5842A628:lI58|H772B5842A638 +772B5842A638:lA9:ipv6-icmp|H772B5842A648 +772B5842A648:lA9:IPv6-ICMP|N +772B5842A658:lA3:rdp|I27 +772B5842A668:lA2:ip|I0 +772B5842A678:lAA:mpls-in-ip|I137 +772B5842A688:lI133|H772B5842A698 +772B5842A698:lA2:fc|H772B5842A6A8 +772B5842A6A8:lA2:FC|N +772B5842A6B8:lA9:IPv6-Frag|I44 +772B5842A6C8:lI60|H772B5842A6D8 +772B5842A6D8:lA9:ipv6-opts|H772B5842A6E8 +772B5842A6E8:lA9:IPv6-Opts|N +772B5842A6F8:lI108|H772B5842A708 +772B5842A708:lA6:ipcomp|H772B5842A718 +772B5842A718:lA6:IPCOMP|N +772B5842A728:lI20|H772B5842A738 +772B5842A738:lA3:hmp|H772B5842A748 +772B5842A748:lA3:HMP|N +772B5842A758:Mn2:H772B5842AB08,H772B5842AB18 +772B5842A770:lA4:SKIP|I57 +772B5842A780:lA4:CPHB|I73 +772B5842A790:lA3:hmp|I20 +772B5842A7A0:lA5:encap|I98 +772B5842A7B0:lA5:ENCAP|I98 +772B5842A7C0:lI43|H772B5842A7D0 +772B5842A7D0:lAA:ipv6-route|H772B5842A7E0 +772B5842A7E0:lAA:IPv6-Route|N +772B5842A7F0:lI81|H772B5842A800 +772B5842A800:lA4:vmtp|H772B5842A810 +772B5842A810:lA4:VMTP|N +772B5842A820:lA2:ST|I5 +772B5842A830:lI89|H772B5842A840 +772B5842A840:lA4:ospf|H772B5842A850 +772B5842A850:lA7:OSPFIGP|N +772B5842A860:lI88|H772B5842A870 +772B5842A870:lA5:eigrp|H772B5842A880 +772B5842A880:lA5:EIGRP|N +772B5842A890:lA4:IPv6|I41 +772B5842A8A0:lI37|H772B5842A8B0 +772B5842A8B0:lA3:ddp|H772B5842A8C0 +772B5842A8C0:lA3:DDP|N +772B5842A8D0:lA4:icmp|I1 +772B5842A8E0:lA4:skip|I57 +772B5842A8F0:lA4:VRRP|I112 +772B5842A900:lA9:ipv6-icmp|I58 +772B5842A910:Mn2:H772B5842AB28,H772B5842AB38 +772B5842A928:lI5|H772B5842A938 +772B5842A938:lA2:st|H772B5842A948 +772B5842A948:lA2:ST|N +772B5842A958:lA4:l2tp|I115 +772B5842A968:lA3:XTP|I36 +772B5842A978:lA3:ddp|I37 +772B5842A988:lI47|H772B5842A998 +772B5842A998:lA3:gre|H772B5842A9A8 +772B5842A9A8:lA3:GRE|N +772B5842A9B8:lA4:ipip|I94 +772B5842A9C8:lA8:Ethernet|I143 +772B5842A9D8:lI22|H772B5842A9E8 +772B5842A9E8:lA7:xns-idp|H772B5842A9F8 +772B5842A9F8:lA7:XNS-IDP|N +772B5842AA08:lA4:VMTP|I81 +772B5842AA18:lA3:EGP|I8 +772B5842AA28:lA3:GGP|I3 +772B5842AA38:lI45|H772B5842AA48 +772B5842AA48:lA4:idrp|H772B5842AA58 +772B5842AA58:lA4:IDRP|N +772B5842AA68:lA5:AX.25|I93 +772B5842AA78:lA5:eigrp|I88 +772B5842AA88:lI59|H772B5842AA98 +772B5842AA98:lAA:ipv6-nonxt|H772B5842AAA8 +772B5842AAA8:lAA:IPv6-NoNxt|N +772B5842AAB8:lA6:HOPOPT|I0 +772B5842AAC8:lA5:Shim6|I140 +772B5842AAD8:lA5:EIGRP|I88 +772B5842AAE8:lA9:ipv6-frag|I44 +772B5842AAF8:lA4:ISIS|I124 +772B5842AB08:lA9:IPv6-Opts|I60 +772B5842AB18:lA4:IPIP|I94 +772B5842AB28:lAA:IPv6-Route|I43 +772B5842AB38:lA2:st|I5 +772B584681B8:t2:H772B584681D0,H772B584681E8 +772B584681D0:t2:AC:erl_features,AD:feature_specs +772B584681E8:Mf1:H772B58468208:H772B58468218 +772B58468208:t1:AA:maybe_expr +772B58468218:Mf7:H772B58468268:H772B58468A48,A8:approved,A9:extension,H772B58468828,H772B584682B8,I27,I25 +772B58468268:t7:A5:short,A6:status,A4:type,AB:description,A8:keywords,A8:approved,AC:experimental +772B584682A8:lA4:else|N +772B584682B8:lA5:maybe|H772B584682A8 +772B584682C8:lI46|N +772B584682D8:lI103|H772B584682C8 +772B584682E8:lI110|H772B584682D8 +772B584682F8:lI105|H772B584682E8 +772B58468308:lI108|H772B584682F8 +772B58468318:lI100|H772B58468308 +772B58468328:lI110|H772B58468318 +772B58468338:lI97|H772B58468328 +772B58468348:lI104|H772B58468338 +772B58468358:lI32|H772B58468348 +772B58468368:lI114|H772B58468358 +772B58468378:lI111|H772B58468368 +772B58468388:lI114|H772B58468378 +772B58468398:lI114|H772B58468388 +772B584683A8:lI101|H772B58468398 +772B584683B8:lI32|H772B584683A8 +772B584683C8:lI100|H772B584683B8 +772B584683D8:lI101|H772B584683C8 +772B584683E8:lI115|H772B584683D8 +772B584683F8:lI97|H772B584683E8 +772B58468408:lI98|H772B584683F8 +772B58468418:lI32|H772B58468408 +772B58468428:lI101|H772B58468418 +772B58468438:lI117|H772B58468428 +772B58468448:lI108|H772B58468438 +772B58468458:lI97|H772B58468448 +772B58468468:lI86|H772B58468458 +772B58468478:lI32|H772B58468468 +772B58468488:lI45|H772B58468478 +772B58468498:lI45|H772B58468488 +772B584684A8:lI32|H772B58468498 +772B584684B8:lI57|H772B584684A8 +772B584684C8:lI52|H772B584684B8 +772B584684D8:lI80|H772B584684C8 +772B584684E8:lI69|H772B584684D8 +772B584684F8:lI69|H772B584684E8 +772B58468508:lI32|H772B584684F8 +772B58468518:lI110|H772B58468508 +772B58468528:lI105|H772B58468518 +772B58468538:lI32|H772B58468528 +772B58468548:lI100|H772B58468538 +772B58468558:lI101|H772B58468548 +772B58468568:lI115|H772B58468558 +772B58468578:lI111|H772B58468568 +772B58468588:lI112|H772B58468578 +772B58468598:lI111|H772B58468588 +772B584685A8:lI114|H772B58468598 +772B584685B8:lI112|H772B584685A8 +772B584685C8:lI32|H772B584685B8 +772B584685D8:lI110|H772B584685C8 +772B584685E8:lI111|H772B584685D8 +772B584685F8:lI105|H772B584685E8 +772B58468608:lI115|H772B584685F8 +772B58468618:lI115|H772B58468608 +772B58468628:lI101|H772B58468618 +772B58468638:lI114|H772B58468628 +772B58468648:lI112|H772B58468638 +772B58468658:lI120|H772B58468648 +772B58468668:lI101|H772B58468658 +772B58468678:lI32|H772B58468668 +772B58468688:lI101|H772B58468678 +772B58468698:lI98|H772B58468688 +772B584686A8:lI121|H772B58468698 +772B584686B8:lI97|H772B584686A8 +772B584686C8:lI109|H772B584686B8 +772B584686D8:lI32|H772B584686C8 +772B584686E8:lI101|H772B584686D8 +772B584686F8:lI104|H772B584686E8 +772B58468708:lI116|H772B584686F8 +772B58468718:lI32|H772B58468708 +772B58468728:lI102|H772B58468718 +772B58468738:lI111|H772B58468728 +772B58468748:lI32|H772B58468738 +772B58468758:lI110|H772B58468748 +772B58468768:lI111|H772B58468758 +772B58468778:lI105|H772B58468768 +772B58468788:lI116|H772B58468778 +772B58468798:lI97|H772B58468788 +772B584687A8:lI116|H772B58468798 +772B584687B8:lI110|H772B584687A8 +772B584687C8:lI101|H772B584687B8 +772B584687D8:lI109|H772B584687C8 +772B584687E8:lI101|H772B584687D8 +772B584687F8:lI108|H772B584687E8 +772B58468808:lI112|H772B584687F8 +772B58468818:lI109|H772B58468808 +772B58468828:lI73|H772B58468818 +772B58468838:lI41|N +772B58468848:lI57|H772B58468838 +772B58468858:lI52|H772B58468848 +772B58468868:lI80|H772B58468858 +772B58468878:lI69|H772B58468868 +772B58468888:lI69|H772B58468878 +772B58468898:lI40|H772B58468888 +772B584688A8:lI32|H772B58468898 +772B584688B8:lI103|H772B584688A8 +772B584688C8:lI110|H772B584688B8 +772B584688D8:lI105|H772B584688C8 +772B584688E8:lI108|H772B584688D8 +772B584688F8:lI100|H772B584688E8 +772B58468908:lI110|H772B584688F8 +772B58468918:lI97|H772B58468908 +772B58468928:lI104|H772B58468918 +772B58468938:lI32|H772B58468928 +772B58468948:lI114|H772B58468938 +772B58468958:lI111|H772B58468948 +772B58468968:lI114|H772B58468958 +772B58468978:lI114|H772B58468968 +772B58468988:lI101|H772B58468978 +772B58468998:lI32|H772B58468988 +772B584689A8:lI100|H772B58468998 +772B584689B8:lI101|H772B584689A8 +772B584689C8:lI115|H772B584689B8 +772B584689D8:lI97|H772B584689C8 +772B584689E8:lI98|H772B584689D8 +772B584689F8:lI32|H772B584689E8 +772B58468A08:lI101|H772B584689F8 +772B58468A18:lI117|H772B58468A08 +772B58468A28:lI108|H772B58468A18 +772B58468A38:lI97|H772B58468A28 +772B58468A48:lI86|H772B58468A38 +772B58468B00:t2:H772B58468B18,H772B58468B30 +772B58468B18:t2:AC:erl_features,A10:enabled_features +772B58468B30:lAA:maybe_expr|N +772B58468BC0:t2:H772B58468BD8,I5 +772B58468BD8:t2:AD:logger_config,AA:supervisor +772B5845AE58:t2:H772B5845AE70,I5 +772B5845AE70:t2:AD:logger_config,A10:$primary_config$ +772B5845B9F8:t2:A13:kernel_os_cmd_shell,H772B5845BA70 +772B5845BA10:lI104|N +772B5845BA20:lI115|H772B5845BA10 +772B5845BA30:lI47|H772B5845BA20 +772B5845BA40:lI110|H772B5845BA30 +772B5845BA50:lI105|H772B5845BA40 +772B5845BA60:lI98|H772B5845BA50 +772B5845BA70:lI47|H772B5845BA60 +772B58468A70:t2:H772B58468A88,A4:true +772B58468A88:t2:AC:erl_features,A9:init_done +772B584101D0:E18:g3F3BmVybGFuZ3cKYWxsb2NfaW5mb2EB +772B584101E0:E19:g3F3BmVybGFuZ3cLYWxsb2Nfc2l6ZXNhAQ== +772B584101F0:E32:g3F3DWVydHNfaW50ZXJuYWx3HWdhdGhlcl9zY2hlZF93YWxsX3RpbWVfcmVzdWx0YQE= +772B58410200:E23:g3F3BmVybGFuZ3cVZ2F0aGVyX2djX2luZm9fcmVzdWx0YQE= +772B58410210:E24:g3F3DWVydHNfaW50ZXJuYWx3D2dhdGhlcl9pb19ieXRlc2EC +772B58410220:E38:g3F3DWVydHNfaW50ZXJuYWx3I2dhdGhlcl9taWNyb3N0YXRlX2FjY291bnRpbmdfcmVzdWx0YQI= +772B58410230:E2F:g3F3DWVydHNfaW50ZXJuYWx3GmdhdGhlcl9zeXN0ZW1fY2hlY2tfcmVzdWx0YQE= +772B58410240:E25:g3F3DWVydHNfaW50ZXJuYWx3EGlzX3Byb2Nlc3NfYWxpdmVhAQ== +772B58410250:E2F:g3F3DWVydHNfaW50ZXJuYWx3GmdldF9pbnRlcm5hbF9zdGF0ZV9ibG9ja2VkYQE= +772B58410260:E11:g3F3BmVybGFuZ3cDYWJzYQE= +772B58410270:E15:g3F3BmVybGFuZ3cHYWRsZXIzMmEB +772B58410280:E15:g3F3BmVybGFuZ3cHYWRsZXIzMmEC +772B58410290:E1D:g3F3BmVybGFuZ3cPYWRsZXIzMl9jb21iaW5lYQM= +772B584102A0:E1A:g3F3BmVybGFuZ3cMYXRvbV90b19saXN0YQE= +772B584102B0:E1C:g3F3BmVybGFuZ3cOYmluYXJ5X3RvX2xpc3RhAQ== +772B584102C0:E1C:g3F3BmVybGFuZ3cOYmluYXJ5X3RvX2xpc3RhAw== +772B584102D0:E1C:g3F3BmVybGFuZ3cOYmluYXJ5X3RvX3Rlcm1hAQ== +772B584102E0:E13:g3F3BmVybGFuZ3cFY3JjMzJhAQ== +772B584102F0:E13:g3F3BmVybGFuZ3cFY3JjMzJhAg== +772B58410300:E1B:g3F3BmVybGFuZ3cNY3JjMzJfY29tYmluZWED +772B58410310:E12:g3F3BmVybGFuZ3cEZGF0ZWEA +772B58410320:E1B:g3F3BmVybGFuZ3cNZGVsZXRlX21vZHVsZWEB +772B58410330:E15:g3F3BmVybGFuZ3cHZGlzcGxheWEB +772B58410340:E1C:g3F3BmVybGFuZ3cOZGlzcGxheV9zdHJpbmdhAg== +772B58410350:E15:g3F3BmVybGFuZ3cHZWxlbWVudGEC +772B58410360:E13:g3F3BmVybGFuZ3cFZXJhc2VhAA== +772B58410370:E13:g3F3BmVybGFuZ3cFZXJhc2VhAQ== +772B58410380:E12:g3F3BmVybGFuZ3cEZXhpdGEB +772B58410390:E12:g3F3BmVybGFuZ3cEZXhpdGEC +772B584103A0:E19:g3F3BmVybGFuZ3cLZXhpdF9zaWduYWxhAg== +772B584103B0:E1B:g3F3BmVybGFuZ3cNZXh0ZXJuYWxfc2l6ZWEB +772B584103C0:E1B:g3F3BmVybGFuZ3cNZXh0ZXJuYWxfc2l6ZWEC +772B584103D0:E13:g3F3BmVybGFuZ3cFZmxvYXRhAQ== +772B584103E0:E1B:g3F3BmVybGFuZ3cNZmxvYXRfdG9fbGlzdGEB +772B584103F0:E1B:g3F3BmVybGFuZ3cNZmxvYXRfdG9fbGlzdGEC +772B58410400:E16:g3F3BmVybGFuZ3cIZnVuX2luZm9hAg== +772B58410410:E24:g3F3DWVydHNfaW50ZXJuYWx3D2dhcmJhZ2VfY29sbGVjdGEB +772B58410420:E11:g3F3BmVybGFuZ3cDZ2V0YQA= +772B58410430:E11:g3F3BmVybGFuZ3cDZ2V0YQE= +772B58410440:E16:g3F3BmVybGFuZ3cIZ2V0X2tleXNhAQ== +772B58410450:E1A:g3F3BmVybGFuZ3cMZ3JvdXBfbGVhZGVyYQA= +772B58410460:E21:g3F3DWVydHNfaW50ZXJuYWx3DGdyb3VwX2xlYWRlcmEC +772B58410470:E21:g3F3DWVydHNfaW50ZXJuYWx3DGdyb3VwX2xlYWRlcmED +772B58410480:E12:g3F3BmVybGFuZ3cEaGFsdGEC +772B58410490:E13:g3F3BmVybGFuZ3cFcGhhc2hhAg== +772B584104A0:E14:g3F3BmVybGFuZ3cGcGhhc2gyYQE= +772B584104B0:E14:g3F3BmVybGFuZ3cGcGhhc2gyYQI= +772B584104C0:E10:g3F3BmVybGFuZ3cCaGRhAQ== +772B584104D0:E1D:g3F3BmVybGFuZ3cPaW50ZWdlcl90b19saXN0YQE= +772B584104E0:E14:g3F3BmVybGFuZ3cGbGVuZ3RoYQE= +772B584104F0:E12:g3F3BmVybGFuZ3cEbGlua2EB +772B58410500:E1A:g3F3BmVybGFuZ3cMbGlzdF90b19hdG9tYQE= +772B58410510:E1C:g3F3BmVybGFuZ3cObGlzdF90b19iaW5hcnlhAQ== +772B58410520:E1B:g3F3BmVybGFuZ3cNbGlzdF90b19mbG9hdGEB +772B58410530:E19:g3F3BmVybGFuZ3cLbGlzdF90b19waWRhAQ== +772B58410540:E1A:g3F3BmVybGFuZ3cMbGlzdF90b19wb3J0YQE= +772B58410550:E19:g3F3BmVybGFuZ3cLbGlzdF90b19yZWZhAQ== +772B58410560:E1B:g3F3BmVybGFuZ3cNbGlzdF90b190dXBsZWEB +772B58410570:E14:g3F3BmVybGFuZ3cGbG9hZGVkYQA= +772B58410580:E17:g3F3BmVybGFuZ3cJbG9jYWx0aW1lYQA= +772B58410590:E28:g3F3BmVybGFuZ3cabG9jYWx0aW1lX3RvX3VuaXZlcnNhbHRpbWVhAg== +772B584105A0:E16:g3F3BmVybGFuZ3cIbWFrZV9yZWZhAA== +772B584105B0:E1C:g3F3BmVybGFuZ3cOdW5pcXVlX2ludGVnZXJhAA== +772B584105C0:E1C:g3F3BmVybGFuZ3cOdW5pcXVlX2ludGVnZXJhAQ== +772B584105D0:E11:g3F3BmVybGFuZ3cDbWQ1YQE= +772B584105E0:E16:g3F3BmVybGFuZ3cIbWQ1X2luaXRhAA== +772B584105F0:E18:g3F3BmVybGFuZ3cKbWQ1X3VwZGF0ZWEC +772B58410600:E17:g3F3BmVybGFuZ3cJbWQ1X2ZpbmFsYQE= +772B58410610:E1B:g3F3BmVybGFuZ3cNbW9kdWxlX2xvYWRlZGEB +772B58410620:E1F:g3F3BmVybGFuZ3cRZnVuY3Rpb25fZXhwb3J0ZWRhAw== +772B58410630:E1A:g3F3BmVybGFuZ3cMbW9uaXRvcl9ub2RlYQI= +772B58410640:E1A:g3F3BmVybGFuZ3cMbW9uaXRvcl9ub2RlYQM= +772B58410650:E12:g3F3BmVybGFuZ3cEbm9kZWEB +772B58410660:E12:g3F3BmVybGFuZ3cEbm9kZWEA +772B58410670:E13:g3F3BmVybGFuZ3cFbm9kZXNhAA== +772B58410680:E13:g3F3BmVybGFuZ3cFbm9kZXNhAQ== +772B58410690:E13:g3F3BmVybGFuZ3cFbm9kZXNhAg== +772B584106A0:E11:g3F3BmVybGFuZ3cDbm93YQA= +772B584106B0:E1C:g3F3BmVybGFuZ3cObW9ub3RvbmljX3RpbWVhAA== +772B584106C0:E1C:g3F3BmVybGFuZ3cObW9ub3RvbmljX3RpbWVhAQ== +772B584106D0:E19:g3F3BmVybGFuZ3cLc3lzdGVtX3RpbWVhAA== +772B584106E0:E19:g3F3BmVybGFuZ3cLc3lzdGVtX3RpbWVhAQ== +772B584106F0:E19:g3F3BmVybGFuZ3cLdGltZV9vZmZzZXRhAA== +772B58410700:E19:g3F3BmVybGFuZ3cLdGltZV9vZmZzZXRhAQ== +772B58410710:E17:g3F3BmVybGFuZ3cJdGltZXN0YW1wYQA= +772B58410720:E1E:g3F3DWVydHNfaW50ZXJuYWx3CW9wZW5fcG9ydGEC +772B58410730:E19:g3F3BmVybGFuZ3cLcGlkX3RvX2xpc3RhAQ== +772B58410740:E13:g3F3BmVybGFuZ3cFcG9ydHNhAA== +772B58410750:E18:g3F3BmVybGFuZ3cKcHJlX2xvYWRlZGEA +772B58410760:E1A:g3F3BmVybGFuZ3cMcHJvY2Vzc19mbGFnYQI= +772B58410770:E21:g3F3DWVydHNfaW50ZXJuYWx3DHByb2Nlc3NfZmxhZ2ED +772B58410780:E1A:g3F3BmVybGFuZ3cMcHJvY2Vzc19pbmZvYQE= +772B58410790:E1A:g3F3BmVybGFuZ3cMcHJvY2Vzc19pbmZvYQI= +772B584107A0:E17:g3F3BmVybGFuZ3cJcHJvY2Vzc2VzYQA= +772B584107B0:E11:g3F3BmVybGFuZ3cDcHV0YQI= +772B584107C0:E16:g3F3BmVybGFuZ3cIcmVnaXN0ZXJhAg== +772B584107D0:E18:g3F3BmVybGFuZ3cKcmVnaXN0ZXJlZGEA +772B584107E0:E13:g3F3BmVybGFuZ3cFcm91bmRhAQ== +772B584107F0:E12:g3F3BmVybGFuZ3cEc2VsZmEA +772B58410800:E18:g3F3BmVybGFuZ3cKc2V0ZWxlbWVudGED +772B58410810:E12:g3F3BmVybGFuZ3cEc2l6ZWEB +772B58410820:E13:g3F3BmVybGFuZ3cFc3Bhd25hAw== +772B58410830:E18:g3F3BmVybGFuZ3cKc3Bhd25fbGlua2ED +772B58410840:E1A:g3F3BmVybGFuZ3cMc3BsaXRfYmluYXJ5YQI= +772B58410850:E18:g3F3BmVybGFuZ3cKc3RhdGlzdGljc2EB +772B58410860:E1C:g3F3BmVybGFuZ3cOdGVybV90b19iaW5hcnlhAQ== +772B58410870:E1C:g3F3BmVybGFuZ3cOdGVybV90b19iaW5hcnlhAg== +772B58410880:E1B:g3F3BmVybGFuZ3cNdGVybV90b19pb3ZlY2EB +772B58410890:E1B:g3F3BmVybGFuZ3cNdGVybV90b19pb3ZlY2EC +772B584108A0:E13:g3F3BmVybGFuZ3cFdGhyb3dhAQ== +772B584108B0:E12:g3F3BmVybGFuZ3cEdGltZWEA +772B584108C0:E10:g3F3BmVybGFuZ3cCdGxhAQ== +772B584108D0:E13:g3F3BmVybGFuZ3cFdHJ1bmNhAQ== +772B584108E0:E1B:g3F3BmVybGFuZ3cNdHVwbGVfdG9fbGlzdGEB +772B584108F0:E1B:g3F3BmVybGFuZ3cNdW5pdmVyc2FsdGltZWEA +772B58410900:E28:g3F3BmVybGFuZ3cadW5pdmVyc2FsdGltZV90b19sb2NhbHRpbWVhAQ== +772B58410910:E14:g3F3BmVybGFuZ3cGdW5saW5rYQE= +772B58410920:E18:g3F3BmVybGFuZ3cKdW5yZWdpc3RlcmEB +772B58410930:E15:g3F3BmVybGFuZ3cHd2hlcmVpc2EB +772B58410940:E17:g3F3BmVybGFuZ3cJc3Bhd25fb3B0YQQ= +772B58410950:E15:g3F3BmVybGFuZ3cHc2V0bm9kZWEC +772B58410960:E1B:g3F3BmVybGFuZ3cNZGlzdF9nZXRfc3RhdGEB +772B58410970:E25:g3F3BmVybGFuZ3cXZGlzdF9jdHJsX2lucHV0X2hhbmRsZXJhAg== +772B58410980:E20:g3F3BmVybGFuZ3cSZGlzdF9jdHJsX3B1dF9kYXRhYQI= +772B58410990:E20:g3F3BmVybGFuZ3cSZGlzdF9jdHJsX2dldF9kYXRhYQE= +772B584109A0:E2D:g3F3BmVybGFuZ3cfZGlzdF9jdHJsX2dldF9kYXRhX25vdGlmaWNhdGlvbmEB +772B584109B0:E1F:g3F3BmVybGFuZ3cRZGlzdF9jdHJsX2dldF9vcHRhAg== +772B584109C0:E1F:g3F3BmVybGFuZ3cRZGlzdF9jdHJsX3NldF9vcHRhAw== +772B584109D0:E1E:g3F3DWVydHNfaW50ZXJuYWx3CXBvcnRfaW5mb2EB +772B584109E0:E1E:g3F3DWVydHNfaW50ZXJuYWx3CXBvcnRfaW5mb2EC +772B584109F0:E1E:g3F3DWVydHNfaW50ZXJuYWx3CXBvcnRfY2FsbGED +772B58410A00:E21:g3F3DWVydHNfaW50ZXJuYWx3DHBvcnRfY29tbWFuZGED +772B58410A10:E21:g3F3DWVydHNfaW50ZXJuYWx3DHBvcnRfY29udHJvbGED +772B58410A20:E1F:g3F3DWVydHNfaW50ZXJuYWx3CnBvcnRfY2xvc2VhAQ== +772B58410A30:E21:g3F3DWVydHNfaW50ZXJuYWx3DHBvcnRfY29ubmVjdGEC +772B58410A40:E28:g3F3DWVydHNfaW50ZXJuYWx3E3JlcXVlc3Rfc3lzdGVtX3Rhc2thAw== +772B58410A50:E28:g3F3DWVydHNfaW50ZXJuYWx3E3JlcXVlc3Rfc3lzdGVtX3Rhc2thBA== +772B58410A60:E27:g3F3DWVydHNfaW50ZXJuYWx3EmNoZWNrX3Byb2Nlc3NfY29kZWEB +772B58410A70:E26:g3F3DWVydHNfaW50ZXJuYWx3EW1hcF90b190dXBsZV9rZXlzYQE= +772B58410A80:E1E:g3F3DWVydHNfaW50ZXJuYWx3CXRlcm1fdHlwZWEB +772B58410A90:E29:g3F3DWVydHNfaW50ZXJuYWx3FG1hcF9oYXNobWFwX2NoaWxkcmVuYQE= +772B58410AA0:E1E:g3F3DWVydHNfaW50ZXJuYWx3CXRpbWVfdW5pdGEA +772B58410AB0:E26:g3F3DWVydHNfaW50ZXJuYWx3EXBlcmZfY291bnRlcl91bml0YQA= +772B58410AC0:E26:g3F3DWVydHNfaW50ZXJuYWx3EWlzX3N5c3RlbV9wcm9jZXNzYQE= +772B58410AD0:E21:g3F3DWVydHNfaW50ZXJuYWx3DHN5c3RlbV9jaGVja2EB +772B58410AE0:E28:g3F3DWVydHNfaW50ZXJuYWx3E3NjaGVkdWxlcl93YWxsX3RpbWVhAQ== +772B58410AF0:E31:g3F3DWVydHNfaW50ZXJuYWx3HGRpcnR5X3Byb2Nlc3NfaGFuZGxlX3NpZ25hbHNhAQ== +772B58410B00:E28:g3F3DWVydHNfaW50ZXJuYWx3E2NyZWF0ZV9kaXN0X2NoYW5uZWxhAw== +772B58410B10:E23:g3F3DWVydHNfaW50ZXJuYWx3DmV0c19zdXBlcl91c2VyYQE= +772B58410B20:E22:g3F3DWVydHNfaW50ZXJuYWx3DXNwYXduX3JlcXVlc3RhBA== +772B58410B30:E27:g3F3DWVydHNfaW50ZXJuYWx3EmRpc3Rfc3Bhd25fcmVxdWVzdGEE +772B58410B40:E28:g3F3DWVydHNfaW50ZXJuYWx3E25vX2F1eF93b3JrX3RocmVhZHNhAA== +772B58410B50:E23:g3F3BmVybGFuZ3cVc3Bhd25fcmVxdWVzdF9hYmFuZG9uYQE= +772B58410B60:E36:g3F3G2VydHNfbGl0ZXJhbF9hcmVhX2NvbGxlY3RvcncTcmVsZWFzZV9hcmVhX3N3aXRjaGEA +772B58410B70:E34:g3F3G2VydHNfbGl0ZXJhbF9hcmVhX2NvbGxlY3RvcncRc2VuZF9jb3B5X3JlcXVlc3RhAw== +772B58410B80:E1B:g3F3BmVybGFuZ3cNcG9ydF9zZXRfZGF0YWEC +772B58410B90:E1B:g3F3BmVybGFuZ3cNcG9ydF9nZXRfZGF0YWEB +772B58410BA0:E22:g3F3DWVydHNfaW50ZXJuYWx3DXRyYWNlX3BhdHRlcm5hAw== +772B58410BB0:E1A:g3F3DWVydHNfaW50ZXJuYWx3BXRyYWNlYQM= +772B58410BC0:E18:g3F3BmVybGFuZ3cKdHJhY2VfaW5mb2EC +772B58410BD0:E1D:g3F3BmVybGFuZ3cPdHJhY2VfZGVsaXZlcmVkYQE= +772B58410BE0:E17:g3F3BmVybGFuZ3cJc2VxX3RyYWNlYQI= +772B58410BF0:E1C:g3F3BmVybGFuZ3cOc2VxX3RyYWNlX2luZm9hAQ== +772B58410C00:E1D:g3F3BmVybGFuZ3cPc2VxX3RyYWNlX3ByaW50YQE= +772B58410C10:E1D:g3F3BmVybGFuZ3cPc2VxX3RyYWNlX3ByaW50YQI= +772B58410C20:E24:g3F3DWVydHNfaW50ZXJuYWx3D3N1c3BlbmRfcHJvY2Vzc2EC +772B58410C30:E1C:g3F3BmVybGFuZ3cOcmVzdW1lX3Byb2Nlc3NhAQ== +772B58410C40:E24:g3F3DWVydHNfaW50ZXJuYWx3D3Byb2Nlc3NfZGlzcGxheWEC +772B58410C50:E1D:g3F3BmVybGFuZ3cPYnVtcF9yZWR1Y3Rpb25zYQE= +772B58410C60:EF:g3F3BG1hdGh3A2Nvc2EB +772B58410C70:E10:g3F3BG1hdGh3BGNvc2hhAQ== +772B58410C80:EF:g3F3BG1hdGh3A3NpbmEB +772B58410C90:E10:g3F3BG1hdGh3BHNpbmhhAQ== +772B58410CA0:EF:g3F3BG1hdGh3A3RhbmEB +772B58410CB0:E10:g3F3BG1hdGh3BHRhbmhhAQ== +772B58410CC0:E10:g3F3BG1hdGh3BGFjb3NhAQ== +772B58410CD0:E11:g3F3BG1hdGh3BWFjb3NoYQE= +772B58410CE0:E10:g3F3BG1hdGh3BGFzaW5hAQ== +772B58410CF0:E11:g3F3BG1hdGh3BWFzaW5oYQE= +772B58410D00:E10:g3F3BG1hdGh3BGF0YW5hAQ== +772B58410D10:E11:g3F3BG1hdGh3BWF0YW5oYQE= +772B58410D20:EF:g3F3BG1hdGh3A2VyZmEB +772B58410D30:E10:g3F3BG1hdGh3BGVyZmNhAQ== +772B58410D40:EF:g3F3BG1hdGh3A2V4cGEB +772B58410D50:EF:g3F3BG1hdGh3A2xvZ2EB +772B58410D60:E10:g3F3BG1hdGh3BGxvZzJhAQ== +772B58410D70:E11:g3F3BG1hdGh3BWxvZzEwYQE= +772B58410D80:E10:g3F3BG1hdGh3BHNxcnRhAQ== +772B58410D90:E11:g3F3BG1hdGh3BWF0YW4yYQI= +772B58410DA0:EF:g3F3BG1hdGh3A3Bvd2EC +772B58410DB0:E19:g3F3BmVybGFuZ3cLc3RhcnRfdGltZXJhAw== +772B58410DC0:E19:g3F3BmVybGFuZ3cLc3RhcnRfdGltZXJhBA== +772B58410DD0:E18:g3F3BmVybGFuZ3cKc2VuZF9hZnRlcmED +772B58410DE0:E18:g3F3BmVybGFuZ3cKc2VuZF9hZnRlcmEE +772B58410DF0:E1A:g3F3BmVybGFuZ3cMY2FuY2VsX3RpbWVyYQE= +772B58410E00:E1A:g3F3BmVybGFuZ3cMY2FuY2VsX3RpbWVyYQI= +772B58410E10:E18:g3F3BmVybGFuZ3cKcmVhZF90aW1lcmEB +772B58410E20:E18:g3F3BmVybGFuZ3cKcmVhZF90aW1lcmEC +772B58410E30:E18:g3F3BmVybGFuZ3cKbWFrZV90dXBsZWEC +772B58410E40:E1C:g3F3BmVybGFuZ3cOYXBwZW5kX2VsZW1lbnRhAg== +772B58410E50:E18:g3F3BmVybGFuZ3cKbWFrZV90dXBsZWED +772B58410E60:E19:g3F3BmVybGFuZ3cLc3lzdGVtX2ZsYWdhAg== +772B58410E70:E19:g3F3BmVybGFuZ3cLc3lzdGVtX2luZm9hAQ== +772B58410E80:E1C:g3F3BmVybGFuZ3cOc3lzdGVtX21vbml0b3JhAA== +772B58410E90:E1C:g3F3BmVybGFuZ3cOc3lzdGVtX21vbml0b3JhAQ== +772B58410EA0:E1C:g3F3BmVybGFuZ3cOc3lzdGVtX21vbml0b3JhAg== +772B58410EB0:E1C:g3F3BmVybGFuZ3cOc3lzdGVtX3Byb2ZpbGVhAg== +772B58410EC0:E1C:g3F3BmVybGFuZ3cOc3lzdGVtX3Byb2ZpbGVhAA== +772B58410ED0:E19:g3F3BmVybGFuZ3cLcmVmX3RvX2xpc3RhAQ== +772B58410EE0:E1A:g3F3BmVybGFuZ3cMcG9ydF90b19saXN0YQE= +772B58410EF0:E19:g3F3BmVybGFuZ3cLZnVuX3RvX2xpc3RhAQ== +772B58410F00:E15:g3F3BmVybGFuZ3cHbW9uaXRvcmEC +772B58410F10:E17:g3F3BmVybGFuZ3cJZGVtb25pdG9yYQE= +772B58410F20:E17:g3F3BmVybGFuZ3cJZGVtb25pdG9yYQI= +772B58410F30:E1E:g3F3BmVybGFuZ3cQaXNfcHJvY2Vzc19hbGl2ZWEB +772B58410F40:E25:g3F3DWVydHNfaW50ZXJuYWx3EGlzX3Byb2Nlc3NfYWxpdmVhAg== +772B58410F50:E13:g3F3BmVybGFuZ3cFZXJyb3JhAQ== +772B58410F60:E13:g3F3BmVybGFuZ3cFZXJyb3JhAg== +772B58410F70:E13:g3F3BmVybGFuZ3cFcmFpc2VhAw== +772B58410F80:E18:g3F3BmVybGFuZ3cKaXNfYnVpbHRpbmED +772B58410F90:E11:g3F3BmVybGFuZ3cDYW5kYQI= +772B58410FA0:E10:g3F3BmVybGFuZ3cCb3JhAg== +772B58410FB0:E11:g3F3BmVybGFuZ3cDeG9yYQI= +772B58410FC0:E11:g3F3BmVybGFuZ3cDbm90YQE= +772B58410FD0:EF:g3F3BmVybGFuZ3cBPmEC +772B58410FE0:E10:g3F3BmVybGFuZ3cCPj1hAg== +772B58410FF0:EF:g3F3BmVybGFuZ3cBPGEC +772B58411000:E10:g3F3BmVybGFuZ3cCPTxhAg== +772B58411010:E11:g3F3BmVybGFuZ3cDPTo9YQI= +772B58411020:E10:g3F3BmVybGFuZ3cCPT1hAg== +772B58411030:E11:g3F3BmVybGFuZ3cDPS89YQI= +772B58411040:E10:g3F3BmVybGFuZ3cCLz1hAg== +772B58411050:EF:g3F3BmVybGFuZ3cBK2EC +772B58411060:EF:g3F3BmVybGFuZ3cBLWEC +772B58411070:EF:g3F3BmVybGFuZ3cBKmEC +772B58411080:EF:g3F3BmVybGFuZ3cBL2EC +772B58411090:E11:g3F3BmVybGFuZ3cDZGl2YQI= +772B584110A0:E11:g3F3BmVybGFuZ3cDcmVtYQI= +772B584110B0:E11:g3F3BmVybGFuZ3cDYm9yYQI= +772B584110C0:E12:g3F3BmVybGFuZ3cEYmFuZGEC +772B584110D0:E12:g3F3BmVybGFuZ3cEYnhvcmEC +772B584110E0:E11:g3F3BmVybGFuZ3cDYnNsYQI= +772B584110F0:E11:g3F3BmVybGFuZ3cDYnNyYQI= +772B58411100:E12:g3F3BmVybGFuZ3cEYm5vdGEB +772B58411110:EF:g3F3BmVybGFuZ3cBLWEB +772B58411120:EF:g3F3BmVybGFuZ3cBK2EB +772B58411130:EF:g3F3BmVybGFuZ3cBIWEC +772B58411140:E12:g3F3BmVybGFuZ3cEc2VuZGEC +772B58411150:E12:g3F3BmVybGFuZ3cEc2VuZGED +772B58411160:E10:g3F3BmVybGFuZ3cCKythAg== +772B58411170:E14:g3F3BmVybGFuZ3cGYXBwZW5kYQI= +772B58411180:E10:g3F3BmVybGFuZ3cCLS1hAg== +772B58411190:E16:g3F3BmVybGFuZ3cIc3VidHJhY3RhAg== +772B584111A0:E15:g3F3BmVybGFuZ3cHaXNfYXRvbWEB +772B584111B0:E15:g3F3BmVybGFuZ3cHaXNfbGlzdGEB +772B584111C0:E16:g3F3BmVybGFuZ3cIaXNfdHVwbGVhAQ== +772B584111D0:E16:g3F3BmVybGFuZ3cIaXNfZmxvYXRhAQ== +772B584111E0:E18:g3F3BmVybGFuZ3cKaXNfaW50ZWdlcmEB +772B584111F0:E17:g3F3BmVybGFuZ3cJaXNfbnVtYmVyYQE= +772B58411200:E14:g3F3BmVybGFuZ3cGaXNfcGlkYQE= +772B58411210:E15:g3F3BmVybGFuZ3cHaXNfcG9ydGEB +772B58411220:E1A:g3F3BmVybGFuZ3cMaXNfcmVmZXJlbmNlYQE= +772B58411230:E17:g3F3BmVybGFuZ3cJaXNfYmluYXJ5YQE= +772B58411240:E19:g3F3BmVybGFuZ3cLaXNfZnVuY3Rpb25hAQ== +772B58411250:E19:g3F3BmVybGFuZ3cLaXNfZnVuY3Rpb25hAg== +772B58411260:E17:g3F3BmVybGFuZ3cJaXNfcmVjb3JkYQI= +772B58411270:E17:g3F3BmVybGFuZ3cJaXNfcmVjb3JkYQM= +772B58411280:E1D:g3F3BmVybGFuZ3cPbWF0Y2hfc3BlY190ZXN0YQM= +772B58411290:E1F:g3F3A2V0c3cUaW50ZXJuYWxfcmVxdWVzdF9hbGxhAA== +772B584112A0:EE:g3F3A2V0c3cDbmV3YQI= +772B584112B0:E11:g3F3A2V0c3cGZGVsZXRlYQE= +772B584112C0:E11:g3F3A2V0c3cGZGVsZXRlYQI= +772B584112D0:E18:g3F3A2V0c3cNZGVsZXRlX29iamVjdGEC +772B584112E0:E10:g3F3A2V0c3cFZmlyc3RhAQ== +772B584112F0:E17:g3F3A2V0c3cMZmlyc3RfbG9va3VwYQE= +772B58411300:E19:g3F3A2V0c3cOaXNfY29tcGlsZWRfbXNhAQ== +772B58411310:E11:g3F3A2V0c3cGbG9va3VwYQI= +772B58411320:E19:g3F3A2V0c3cObG9va3VwX2VsZW1lbnRhAw== +772B58411330:E19:g3F3A2V0c3cObG9va3VwX2VsZW1lbnRhBA== +772B58411340:EF:g3F3A2V0c3cEaW5mb2EB +772B58411350:EF:g3F3A2V0c3cEaW5mb2EC +772B58411360:EF:g3F3A2V0c3cEbGFzdGEB +772B58411370:E16:g3F3A2V0c3cLbGFzdF9sb29rdXBhAQ== +772B58411380:E10:g3F3A2V0c3cFbWF0Y2hhAQ== +772B58411390:E10:g3F3A2V0c3cFbWF0Y2hhAg== +772B584113A0:E10:g3F3A2V0c3cFbWF0Y2hhAw== +772B584113B0:E17:g3F3A2V0c3cMbWF0Y2hfb2JqZWN0YQE= +772B584113C0:E17:g3F3A2V0c3cMbWF0Y2hfb2JqZWN0YQI= +772B584113D0:E17:g3F3A2V0c3cMbWF0Y2hfb2JqZWN0YQM= +772B584113E0:E11:g3F3A2V0c3cGbWVtYmVyYQI= +772B584113F0:EF:g3F3A2V0c3cEbmV4dGEC +772B58411400:E16:g3F3A2V0c3cLbmV4dF9sb29rdXBhAg== +772B58411410:EF:g3F3A2V0c3cEcHJldmEC +772B58411420:E16:g3F3A2V0c3cLcHJldl9sb29rdXBhAg== +772B58411430:E11:g3F3A2V0c3cGaW5zZXJ0YQI= +772B58411440:E15:g3F3A2V0c3cKaW5zZXJ0X25ld2EC +772B58411450:E11:g3F3A2V0c3cGcmVuYW1lYQI= +772B58411460:E18:g3F3A2V0c3cNc2FmZV9maXh0YWJsZWEC +772B58411470:EF:g3F3A2V0c3cEc2xvdGEC +772B58411480:E19:g3F3A2V0c3cOdXBkYXRlX2NvdW50ZXJhAw== +772B58411490:E11:g3F3A2V0c3cGc2VsZWN0YQE= +772B584114A0:E11:g3F3A2V0c3cGc2VsZWN0YQI= +772B584114B0:E11:g3F3A2V0c3cGc2VsZWN0YQM= +772B584114C0:E17:g3F3A2V0c3cMc2VsZWN0X2NvdW50YQI= +772B584114D0:E19:g3F3A2V0c3cOc2VsZWN0X3JldmVyc2VhAQ== +772B584114E0:E19:g3F3A2V0c3cOc2VsZWN0X3JldmVyc2VhAg== +772B584114F0:E19:g3F3A2V0c3cOc2VsZWN0X3JldmVyc2VhAw== +772B58411500:E19:g3F3A2V0c3cOc2VsZWN0X3JlcGxhY2VhAg== +772B58411510:E1D:g3F3A2V0c3cSbWF0Y2hfc3BlY19jb21waWxlYQE= +772B58411520:E1B:g3F3A2V0c3cQbWF0Y2hfc3BlY19ydW5fcmED +772B58411530:E10:g3F3Am9zdwZnZXRlbnZhAQ== +772B58411540:E10:g3F3Am9zdwZwdXRlbnZhAg== +772B58411550:E12:g3F3Am9zdwh1bnNldGVudmEB +772B58411560:E10:g3F3Am9zdwZnZXRwaWRhAA== +772B58411570:E13:g3F3Am9zdwl0aW1lc3RhbXBhAA== +772B58411580:E15:g3F3Am9zdwtzeXN0ZW1fdGltZWEA +772B58411590:E15:g3F3Am9zdwtzeXN0ZW1fdGltZWEB +772B584115A0:E16:g3F3Am9zdwxwZXJmX2NvdW50ZXJhAA== +772B584115B0:E18:g3F3CGVybF9kZGxsdwh0cnlfbG9hZGED +772B584115C0:E1A:g3F3CGVybF9kZGxsdwp0cnlfdW5sb2FkYQI= +772B584115D0:E1E:g3F3CGVybF9kZGxsdw5sb2FkZWRfZHJpdmVyc2EA +772B584115E0:E14:g3F3CGVybF9kZGxsdwRpbmZvYQI= +772B584115F0:E20:g3F3CGVybF9kZGxsdxBmb3JtYXRfZXJyb3JfaW50YQE= +772B58411600:E17:g3F3CGVybF9kZGxsdwdtb25pdG9yYQI= +772B58411610:E19:g3F3CGVybF9kZGxsdwlkZW1vbml0b3JhAQ== +772B58411620:E11:g3F3AnJldwd2ZXJzaW9uYQA= +772B58411630:E11:g3F3AnJldwdjb21waWxlYQE= +772B58411640:E11:g3F3AnJldwdjb21waWxlYQI= +772B58411650:ED:g3F3AnJldwNydW5hAg== +772B58411660:ED:g3F3AnJldwNydW5hAw== +772B58411670:E16:g3F3AnJldwxpbnRlcm5hbF9ydW5hBA== +772B58411680:E13:g3F3BWxpc3RzdwZtZW1iZXJhAg== +772B58411690:E14:g3F3BWxpc3RzdwdyZXZlcnNlYQI= +772B584116A0:E16:g3F3BWxpc3RzdwlrZXltZW1iZXJhAw== +772B584116B0:E16:g3F3BWxpc3RzdwlrZXlzZWFyY2hhAw== +772B584116C0:E14:g3F3BWxpc3RzdwdrZXlmaW5kYQM= +772B584116D0:E1D:g3F3CmVydHNfZGVidWd3C2Rpc2Fzc2VtYmxlYQE= +772B584116E0:E1C:g3F3CmVydHNfZGVidWd3CmJyZWFrcG9pbnRhAg== +772B584116F0:E16:g3F3CmVydHNfZGVidWd3BHNhbWVhAg== +772B58411700:E1B:g3F3CmVydHNfZGVidWd3CWZsYXRfc2l6ZWEB +772B58411710:E24:g3F3CmVydHNfZGVidWd3EmdldF9pbnRlcm5hbF9zdGF0ZWEB +772B58411720:E24:g3F3CmVydHNfZGVidWd3EnNldF9pbnRlcm5hbF9zdGF0ZWEC +772B58411730:E22:g3F3CmVydHNfZGVidWd3EGRpc3RfZXh0X3RvX3Rlcm1hAg== +772B58411740:E1E:g3F3CmVydHNfZGVidWd3DGluc3RydWN0aW9uc2EA +772B58411750:E22:g3F3CmVydHNfZGVidWd3EGludGVycHJldGVyX3NpemVhAA== +772B58411760:E1B:g3F3CmVydHNfZGVidWd3CWRpcnR5X2NwdWEC +772B58411770:E1A:g3F3CmVydHNfZGVidWd3CGRpcnR5X2lvYQI= +772B58411780:E17:g3F3CmVydHNfZGVidWd3BWRpcnR5YQM= +772B58411790:E1E:g3F3CmVydHNfZGVidWd3DGxjbnRfY29udHJvbGEC +772B584117A0:E1E:g3F3CmVydHNfZGVidWd3DGxjbnRfY29udHJvbGEB +772B584117B0:E1E:g3F3CmVydHNfZGVidWd3DGxjbnRfY29sbGVjdGEA +772B584117C0:E1C:g3F3CmVydHNfZGVidWd3CmxjbnRfY2xlYXJhAA== +772B584117D0:E17:g3F3BmVybGFuZ3cJaGliZXJuYXRlYQM= +772B584117E0:E1F:g3F3DGVycm9yX2xvZ2dlcncLd2FybmluZ19tYXBhAA== +772B584117F0:E1D:g3F3BmVybGFuZ3cPZ2V0X21vZHVsZV9pbmZvYQE= +772B58411800:E1D:g3F3BmVybGFuZ3cPZ2V0X21vZHVsZV9pbmZvYQI= +772B58411810:E18:g3F3BmVybGFuZ3cKaXNfYm9vbGVhbmEB +772B58411820:E1B:g3F3BnN0cmluZ3cNbGlzdF90b19mbG9hdGEB +772B58411830:E16:g3F3BmVybGFuZ3cIbWFrZV9mdW5hAw== +772B58411840:E19:g3F3BmVybGFuZ3cLaW9saXN0X3NpemVhAQ== +772B58411850:E1E:g3F3BmVybGFuZ3cQaW9saXN0X3RvX2JpbmFyeWEB +772B58411860:E23:g3F3BmVybGFuZ3cVbGlzdF90b19leGlzdGluZ19hdG9tYQE= +772B58411870:E1A:g3F3BmVybGFuZ3cMaXNfYml0c3RyaW5nYQE= +772B58411880:E18:g3F3BmVybGFuZ3cKdHVwbGVfc2l6ZWEB +772B58411890:E17:g3F3BmVybGFuZ3cJYnl0ZV9zaXplYQE= +772B584118A0:E16:g3F3BmVybGFuZ3cIYml0X3NpemVhAQ== +772B584118B0:E1F:g3F3BmVybGFuZ3cRbGlzdF90b19iaXRzdHJpbmdhAQ== +772B584118C0:E1F:g3F3BmVybGFuZ3cRYml0c3RyaW5nX3RvX2xpc3RhAQ== +772B584118D0:E19:g3F3A2V0c3cOdXBkYXRlX2VsZW1lbnRhAw== +772B584118E0:E1B:g3F3BmVybGFuZ3cNZGVjb2RlX3BhY2tldGED +772B584118F0:E23:g3F3B3VuaWNvZGV3FGNoYXJhY3RlcnNfdG9fYmluYXJ5YQI= +772B58411900:E21:g3F3B3VuaWNvZGV3EmNoYXJhY3RlcnNfdG9fbGlzdGEC +772B58411910:E1A:g3F3B3VuaWNvZGV3C2Jpbl9pc183Yml0YQE= +772B58411920:E1C:g3F3BmVybGFuZ3cOYXRvbV90b19iaW5hcnlhAg== +772B58411930:E1C:g3F3BmVybGFuZ3cOYmluYXJ5X3RvX2F0b21hAg== +772B58411940:E25:g3F3BmVybGFuZ3cXYmluYXJ5X3RvX2V4aXN0aW5nX2F0b21hAg== +772B58411950:E22:g3F3Cm5ldF9rZXJuZWx3EGRmbGFnX3VuaWNvZGVfaW9hAQ== +772B58411960:E14:g3F3A2V0c3cJZ2l2ZV9hd2F5YQM= +772B58411970:E12:g3F3A2V0c3cHc2V0b3B0c2EC +772B58411980:E16:g3F3BmVybGFuZ3cIbG9hZF9uaWZhAg== +772B58411990:E23:g3F3BmVybGFuZ3cVY2FsbF9vbl9sb2FkX2Z1bmN0aW9uYQE= +772B584119A0:E22:g3F3BmVybGFuZ3cUZmluaXNoX2FmdGVyX29uX2xvYWRhAg== +772B584119B0:E1C:g3F3BmVybGFuZ3cOYmluYXJ5X3RvX3Rlcm1hAg== +772B584119C0:E19:g3F3BmVybGFuZ3cLYmluYXJ5X3BhcnRhAg== +772B584119D0:E19:g3F3BmVybGFuZ3cLYmluYXJ5X3BhcnRhAw== +772B584119E0:E1D:g3F3BmJpbmFyeXcPY29tcGlsZV9wYXR0ZXJuYQE= +772B584119F0:E13:g3F3BmJpbmFyeXcFbWF0Y2hhAg== +772B58411A00:E13:g3F3BmJpbmFyeXcFbWF0Y2hhAw== +772B58411A10:E15:g3F3BmJpbmFyeXcHbWF0Y2hlc2EC +772B58411A20:E15:g3F3BmJpbmFyeXcHbWF0Y2hlc2ED +772B58411A30:E23:g3F3BmJpbmFyeXcVbG9uZ2VzdF9jb21tb25fcHJlZml4YQE= +772B58411A40:E23:g3F3BmJpbmFyeXcVbG9uZ2VzdF9jb21tb25fc3VmZml4YQE= +772B58411A50:E13:g3F3BmJpbmFyeXcFZmlyc3RhAQ== +772B58411A60:E12:g3F3BmJpbmFyeXcEbGFzdGEB +772B58411A70:E10:g3F3BmJpbmFyeXcCYXRhAg== +772B58411A80:E12:g3F3BmJpbmFyeXcEcGFydGEC +772B58411A90:E12:g3F3BmJpbmFyeXcEcGFydGED +772B58411AA0:E19:g3F3BmJpbmFyeXcLbGlzdF90b19iaW5hAQ== +772B58411AB0:E12:g3F3BmJpbmFyeXcEY29weWEB +772B58411AC0:E12:g3F3BmJpbmFyeXcEY29weWEC +772B58411AD0:E22:g3F3BmJpbmFyeXcUcmVmZXJlbmNlZF9ieXRlX3NpemVhAQ== +772B58411AE0:E1D:g3F3BmJpbmFyeXcPZW5jb2RlX3Vuc2lnbmVkYQE= +772B58411AF0:E1D:g3F3BmJpbmFyeXcPZW5jb2RlX3Vuc2lnbmVkYQI= +772B58411B00:E1D:g3F3BmJpbmFyeXcPZGVjb2RlX3Vuc2lnbmVkYQE= +772B58411B10:E1D:g3F3BmJpbmFyeXcPZGVjb2RlX3Vuc2lnbmVkYQI= +772B58411B20:E17:g3F3BmVybGFuZ3cJbmlmX2Vycm9yYQE= +772B58411B30:E17:g3F3BmVybGFuZ3cJbmlmX2Vycm9yYQI= +772B58411B40:E25:g3F3CXByaW1fZmlsZXcUaW50ZXJuYWxfbmFtZTJuYXRpdmVhAQ== +772B58411B50:E25:g3F3CXByaW1fZmlsZXcUaW50ZXJuYWxfbmF0aXZlMm5hbWVhAQ== +772B58411B60:E28:g3F3CXByaW1fZmlsZXcXaW50ZXJuYWxfbm9ybWFsaXplX3V0ZjhhAQ== +772B58411B70:E20:g3F3CXByaW1fZmlsZXcPaXNfdHJhbnNsYXRhYmxlYQE= +772B58411B80:E20:g3F3BGZpbGV3FG5hdGl2ZV9uYW1lX2VuY29kaW5nYQA= +772B58411B90:E1C:g3F3BmVybGFuZ3cOY2hlY2tfb2xkX2NvZGVhAQ== +772B58411BA0:E28:g3F3BmVybGFuZ3cadW5pdmVyc2FsdGltZV90b19wb3NpeHRpbWVhAQ== +772B58411BB0:E28:g3F3BmVybGFuZ3cacG9zaXh0aW1lX3RvX3VuaXZlcnNhbHRpbWVhAQ== +772B58411BC0:E18:g3F3BmVybGFuZ3cKZHRfcHV0X3RhZ2EB +772B58411BD0:E18:g3F3BmVybGFuZ3cKZHRfZ2V0X3RhZ2EA +772B58411BE0:E1D:g3F3BmVybGFuZ3cPZHRfZ2V0X3RhZ19kYXRhYQA= +772B58411BF0:E1B:g3F3BmVybGFuZ3cNZHRfc3ByZWFkX3RhZ2EB +772B58411C00:E1C:g3F3BmVybGFuZ3cOZHRfcmVzdG9yZV90YWdhAQ== +772B58411C10:E24:g3F3BmVybGFuZ3cWZHRfcHJlcGVuZF92bV90YWdfZGF0YWEB +772B58411C20:E23:g3F3BmVybGFuZ3cVZHRfYXBwZW5kX3ZtX3RhZ19kYXRhYQE= +772B58411C30:E1C:g3F3BmVybGFuZ3cOZmluaXNoX2xvYWRpbmdhAQ== +772B58411C40:E1C:g3F3BmVybGFuZ3cOaW5zZXJ0X2VsZW1lbnRhAw== +772B58411C50:E1C:g3F3BmVybGFuZ3cOZGVsZXRlX2VsZW1lbnRhAg== +772B58411C60:E1F:g3F3BmVybGFuZ3cRaW50ZWdlcl90b19iaW5hcnlhAQ== +772B58411C70:E1D:g3F3BmVybGFuZ3cPZmxvYXRfdG9fYmluYXJ5YQE= +772B58411C80:E1D:g3F3BmVybGFuZ3cPZmxvYXRfdG9fYmluYXJ5YQI= +772B58411C90:E1D:g3F3BmVybGFuZ3cPYmluYXJ5X3RvX2Zsb2F0YQE= +772B58411CA0:E19:g3F3Amlvdw9wcmludGFibGVfcmFuZ2VhAA== +772B58411CB0:E11:g3F3AnJldwdpbnNwZWN0YQI= +772B58411CC0:E14:g3F3BmVybGFuZ3cGaXNfbWFwYQE= +772B58411CD0:E16:g3F3BmVybGFuZ3cIbWFwX3NpemVhAQ== +772B58411CE0:E10:g3F3BG1hcHN3BGZpbmRhAg== +772B58411CF0:EF:g3F3BG1hcHN3A2dldGEC +772B58411D00:E15:g3F3BG1hcHN3CWZyb21fbGlzdGEB +772B58411D10:E12:g3F3BG1hcHN3BmlzX2tleWEC +772B58411D20:E10:g3F3BG1hcHN3BGtleXNhAQ== +772B58411D30:E11:g3F3BG1hcHN3BW1lcmdlYQI= +772B58411D40:EF:g3F3BG1hcHN3A3B1dGED +772B58411D50:E12:g3F3BG1hcHN3BnJlbW92ZWEC +772B58411D60:E12:g3F3BG1hcHN3BnVwZGF0ZWED +772B58411D70:E12:g3F3BG1hcHN3BnZhbHVlc2EB +772B58411D80:E1D:g3F3DWVydHNfaW50ZXJuYWx3CGNtcF90ZXJtYQI= +772B58411D90:EF:g3F3A2V0c3cEdGFrZWEC +772B58411DA0:E1A:g3F3BmVybGFuZ3cMZnVuX2luZm9fbWZhYQE= +772B58411DB0:E16:g3F3BmVybGFuZ3cIZ2V0X2tleXNhAA== +772B58411DC0:E19:g3F3A2V0c3cOdXBkYXRlX2NvdW50ZXJhBA== +772B58411DD0:E1A:g3F3CmVydHNfZGVidWd3CG1hcF9pbmZvYQE= +772B58411DE0:E2F:g3F3DWVydHNfaW50ZXJuYWx3GmlzX3Byb2Nlc3NfZXhlY3V0aW5nX2RpcnR5YQE= +772B58411DF0:E2D:g3F3DWVydHNfaW50ZXJuYWx3GGNoZWNrX2RpcnR5X3Byb2Nlc3NfY29kZWEC +772B58411E00:E21:g3F3DWVydHNfaW50ZXJuYWx3DHB1cmdlX21vZHVsZWEC +772B58411E10:E13:g3F3BmJpbmFyeXcFc3BsaXRhAg== +772B58411E20:E13:g3F3BmJpbmFyeXcFc3BsaXRhAw== +772B58411E30:E1D:g3F3CmVydHNfZGVidWd3C3NpemVfc2hhcmVkYQE= +772B58411E40:E1D:g3F3CmVydHNfZGVidWd3C2NvcHlfc2hhcmVkYQI= +772B58411E50:E27:g3F3BmVybGFuZ3cZaGFzX3ByZXBhcmVkX2NvZGVfb25fbG9hZGEB +772B58411E60:E10:g3F3BG1hcHN3BHRha2VhAg== +772B58411E70:E13:g3F3BmVybGFuZ3cFZmxvb3JhAQ== +772B58411E80:E12:g3F3BmVybGFuZ3cEY2VpbGEB +772B58411E90:E11:g3F3BG1hdGh3BWZsb29yYQE= +772B58411EA0:E10:g3F3BG1hdGh3BGNlaWxhAQ== +772B58411EB0:E10:g3F3BG1hdGh3BGZtb2RhAg== +772B58411EC0:E14:g3F3Am9zdwpzZXRfc2lnbmFsYQI= +772B58411ED0:E1D:g3F3BmVybGFuZ3cPaW9saXN0X3RvX2lvdmVjYQE= +772B58411EE0:E1F:g3F3DWVydHNfaW50ZXJuYWx3CmdldF9kZmxhZ3NhAA== +772B58411EF0:E23:g3F3DWVydHNfaW50ZXJuYWx3Dm5ld19jb25uZWN0aW9uYQE= +772B58411F00:E1D:g3F3DWVydHNfaW50ZXJuYWx3CG1hcF9uZXh0YQM= +772B58411F10:E12:g3F3A2V0c3cHd2hlcmVpc2EB +772B58411F20:E2C:g3F3DWVydHNfaW50ZXJuYWx3F2dhdGhlcl9hbGxvY19oaXN0b2dyYW1zYQE= +772B58411F30:E28:g3F3DWVydHNfaW50ZXJuYWx3E2dhdGhlcl9jYXJyaWVyX2luZm9hAQ== +772B58411F40:E15:g3F3BmVybGFuZ3cHbWFwX2dldGEC +772B58411F50:E18:g3F3BmVybGFuZ3cKaXNfbWFwX2tleWEC +772B58411F60:E1E:g3F3A2V0c3cTaW50ZXJuYWxfZGVsZXRlX2FsbGEC +772B58411F70:E21:g3F3A2V0c3cWaW50ZXJuYWxfc2VsZWN0X2RlbGV0ZWEC +772B58411F80:E1A:g3F3D3BlcnNpc3RlbnRfdGVybXcDcHV0YQI= +772B58411F90:E1A:g3F3D3BlcnNpc3RlbnRfdGVybXcDZ2V0YQE= +772B58411FA0:E1A:g3F3D3BlcnNpc3RlbnRfdGVybXcDZ2V0YQA= +772B58411FB0:E1C:g3F3D3BlcnNpc3RlbnRfdGVybXcFZXJhc2VhAQ== +772B58411FC0:E1B:g3F3D3BlcnNpc3RlbnRfdGVybXcEaW5mb2EA +772B58411FD0:E2B:g3F3DWVydHNfaW50ZXJuYWx3FmVyYXNlX3BlcnNpc3RlbnRfdGVybXNhAA== +772B58411FE0:E20:g3F3DWVydHNfaW50ZXJuYWx3C2F0b21pY3NfbmV3YQI= +772B58411FF0:E12:g3F3B2F0b21pY3N3A2dldGEC +772B58412000:E12:g3F3B2F0b21pY3N3A3B1dGED +772B58412010:E12:g3F3B2F0b21pY3N3A2FkZGED +772B58412020:E16:g3F3B2F0b21pY3N3B2FkZF9nZXRhAw== +772B58412030:E17:g3F3B2F0b21pY3N3CGV4Y2hhbmdlYQM= +772B58412040:E1F:g3F3B2F0b21pY3N3EGNvbXBhcmVfZXhjaGFuZ2VhBA== +772B58412050:E13:g3F3B2F0b21pY3N3BGluZm9hAQ== +772B58412060:E21:g3F3DWVydHNfaW50ZXJuYWx3DGNvdW50ZXJzX25ld2EB +772B58412070:E21:g3F3DWVydHNfaW50ZXJuYWx3DGNvdW50ZXJzX2dldGEC +772B58412080:E21:g3F3DWVydHNfaW50ZXJuYWx3DGNvdW50ZXJzX2FkZGED +772B58412090:E21:g3F3DWVydHNfaW50ZXJuYWx3DGNvdW50ZXJzX3B1dGED +772B584120A0:E22:g3F3DWVydHNfaW50ZXJuYWx3DWNvdW50ZXJzX2luZm9hAQ== +772B584120B0:E29:g3F3DWVydHNfaW50ZXJuYWx3FHNwYXduX3N5c3RlbV9wcm9jZXNzYQM= +772B584120C0:E1D:g3F3BmVybGFuZ3cPaW50ZWdlcl90b19saXN0YQI= +772B584120D0:E1F:g3F3BmVybGFuZ3cRaW50ZWdlcl90b19iaW5hcnlhAg== +772B584120E0:E1A:g3F3D3BlcnNpc3RlbnRfdGVybXcDZ2V0YQI= +772B584120F0:E2B:g3F3DWVydHNfaW50ZXJuYWx3FmV0c19sb29rdXBfYmluYXJ5X2luZm9hAg== +772B58412100:E22:g3F3DWVydHNfaW50ZXJuYWx3DWV0c19yYXdfZmlyc3RhAQ== +772B58412110:E21:g3F3DWVydHNfaW50ZXJuYWx3DGV0c19yYXdfbmV4dGEC +772B58412120:E2D:g3F3DWVydHNfaW50ZXJuYWx3GGFib3J0X3BlbmRpbmdfY29ubmVjdGlvbmEC +772B58412130:E21:g3F3DWVydHNfaW50ZXJuYWx3DGdldF9jcmVhdGlvbmEA +772B58412140:E24:g3F3DWVydHNfaW50ZXJuYWx3D3ByZXBhcmVfbG9hZGluZ2EC +772B58412150:E23:g3F3DWVydHNfaW50ZXJuYWx3DmJlYW1maWxlX2NodW5rYQI= +772B58412160:E28:g3F3DWVydHNfaW50ZXJuYWx3E2JlYW1maWxlX21vZHVsZV9tZDVhAQ== +772B58412170:ED:g3F3Am9zdwNlbnZhAA== +772B58412180:E13:g3F3BmVybGFuZ3cFYWxpYXNhAQ== +772B58412190:E15:g3F3BmVybGFuZ3cHdW5hbGlhc2EB +772B584121A0:E15:g3F3BmVybGFuZ3cHbW9uaXRvcmED +772B584121B0:E13:g3F3BmVybGFuZ3cFZXJyb3JhAw== +772B584121C0:E15:g3F3BG1hcHN3CWZyb21fa2V5c2EC +772B584121D0:E26:g3F3DWVydHNfaW50ZXJuYWx3EWJpbmFyeV90b19pbnRlZ2VyYQI= +772B584121E0:E24:g3F3DWVydHNfaW50ZXJuYWx3D2xpc3RfdG9faW50ZWdlcmEC +772B584121F0:E11:g3F3BmVybGFuZ3cDbWluYQI= +772B58412200:E11:g3F3BmVybGFuZ3cDbWF4YQI= +772B58412210:E23:g3F3DWVydHNfaW50ZXJuYWx3DnRlcm1fdG9fc3RyaW5nYQI= +772B58412220:E1C:g3F3BGNvZGV3EGNvdmVyYWdlX3N1cHBvcnRhAA== +772B58412230:E1D:g3F3BGNvZGV3EWdldF9jb3ZlcmFnZV9tb2RlYQA= +772B58412240:E1D:g3F3BGNvZGV3EWdldF9jb3ZlcmFnZV9tb2RlYQE= +772B58412250:E18:g3F3BGNvZGV3DGdldF9jb3ZlcmFnZWEC +772B58412260:E1A:g3F3BGNvZGV3DnJlc2V0X2NvdmVyYWdlYQE= +772B58412270:E1D:g3F3BGNvZGV3EXNldF9jb3ZlcmFnZV9tb2RlYQE= +772B58412280:E19:g3F3A2V0c3cOdXBkYXRlX2VsZW1lbnRhBA== +772B58412290:E29:g3F3DWVydHNfaW50ZXJuYWx3FHRyYWNlX3Nlc3Npb25fY3JlYXRlYQM= +772B584122A0:E2A:g3F3DWVydHNfaW50ZXJuYWx3FXRyYWNlX3Nlc3Npb25fZGVzdHJveWEB +772B584122B0:E1A:g3F3DWVydHNfaW50ZXJuYWx3BXRyYWNlYQQ= +772B584122C0:E22:g3F3DWVydHNfaW50ZXJuYWx3DXRyYWNlX3BhdHRlcm5hBA== +772B584122D0:E1F:g3F3DWVydHNfaW50ZXJuYWx3CnRyYWNlX2luZm9hAw== +772B584122E0:E1F:g3F3EmVydHNfdHJhY2VfY2xlYW5lcncFY2hlY2thAA== +772B584122F0:E31:g3F3EmVydHNfdHJhY2VfY2xlYW5lcncXc2VuZF90cmFjZV9jbGVhbl9zaWduYWxhAQ== +772B58412300:E24:g3F3DWVydHNfaW50ZXJuYWx3D2V0c19pbmZvX2JpbmFyeWEB +772B58412310:E1B:g3F3BmVybGFuZ3cNZG1vbml0b3Jfbm9kZWED +772B58412320:E27:g3F3DWVydHNfaW50ZXJuYWx3EmRpc3RfY3RybF9wdXRfZGF0YWEC +772B58412330:E21:g3F3DWVydHNfaW50ZXJuYWx3DGF3YWl0X3Jlc3VsdGEB +772B58412340:E2B:g3F3DWVydHNfaW50ZXJuYWx3FmZsdXNoX21vbml0b3JfbWVzc2FnZXNhAw== +772B58412350:E1F:g3F3BmVybGFuZ3cRY29udmVydF90aW1lX3VuaXRhAw== +772B58412360:E1E:g3F3BmVybGFuZ3cQc2V0X2NwdV90b3BvbG9neWEB +772B58412370:E21:g3F3BmVybGFuZ3cTZm9ybWF0X2NwdV90b3BvbG9neWEB +772B58412380:E2B:g3F3DWVydHNfaW50ZXJuYWx3FmF3YWl0X3BvcnRfc2VuZF9yZXN1bHRhAw== +772B58412390:E34:g3F3DWVydHNfaW50ZXJuYWx3H3N5c3RlbV9mbGFnX3NjaGVkdWxlcl93YWxsX3RpbWVhAQ== +772B584123A0:E38:g3F3DWVydHNfaW50ZXJuYWx3I2F3YWl0X3NjaGVkX3dhbGxfdGltZV9tb2RpZmljYXRpb25zYQI= +772B584123B0:E3E:g3F3DWVydHNfaW50ZXJuYWx3KWF3YWl0X21pY3Jvc3RhdGVfYWNjb3VudGluZ19tb2RpZmljYXRpb25zYQM= +772B584123C0:EE:g3F3AnJldwRncnVuYQM= +772B584123D0:EE:g3F3AnJldwR1cnVuYQM= +772B584123E0:E12:g3F3AnJldwh1Y29tcGlsZWEC +772B584123F0:E27:g3F3B3VuaWNvZGV3GGNoYXJhY3RlcnNfdG9fYmluYXJ5X2ludGEC +772B58412400:E25:g3F3B3VuaWNvZGV3FmNoYXJhY3RlcnNfdG9fbGlzdF9pbnRhAg== +772B58412410:E35:g3F3DWVydHNfaW50ZXJuYWx3IHdhaXRfcmVsZWFzZV9saXRlcmFsX2FyZWFfc3dpdGNoYQE= +772B58412420:E2C:g3F3EGVydHNfY29kZV9wdXJnZXJ3FHBlbmRpbmdfcHVyZ2VfbGFtYmRhYQM= +772B58412430:E18:g3F3BmVybGFuZ3cKZGVsYXlfdHJhcGEC +772B58412440:E23:g3F3EGVydHNfY29kZV9wdXJnZXJ3C21vZHVsZV9pbmZvYQE= +772B58412450:E23:g3F3EGVydHNfY29kZV9wdXJnZXJ3C21vZHVsZV9pbmZvYQA= +772B58412460:E2C:g3F3EGVydHNfY29kZV9wdXJnZXJ3FGZpbmlzaF9hZnRlcl9vbl9sb2FkYQI= +772B58412470:E22:g3F3EGVydHNfY29kZV9wdXJnZXJ3CnNvZnRfcHVyZ2VhAQ== +772B58412480:E1D:g3F3EGVydHNfY29kZV9wdXJnZXJ3BXB1cmdlYQE= +772B58412490:E28:g3F3EGVydHNfY29kZV9wdXJnZXJ3EHdhaXRfZm9yX3JlcXVlc3RhAA== +772B584124A0:E1D:g3F3EGVydHNfY29kZV9wdXJnZXJ3BXN0YXJ0YQA= +772B584124B0:E13:g3F3BmVybGFuZ3cFYXBwbHlhAg== +772B584124C0:E1B:g3F3CGVybF9pbml0dwttb2R1bGVfaW5mb2EB +772B584124D0:E1B:g3F3CGVybF9pbml0dwttb2R1bGVfaW5mb2EA +772B584124E0:E17:g3F3CGVybF9pbml0dwdyZXN0YXJ0YQA= +772B584124F0:E15:g3F3CGVybF9pbml0dwVzdGFydGEC +772B58412500:E13:g3F3BHpsaWJ3B29uX2xvYWRhAA== +772B58412510:E19:g3F3CmVybF90cmFjZXJ3B29uX2xvYWRhAA== +772B58412520:E1A:g3F3C3ByaW1fYnVmZmVydwdvbl9sb2FkYQA= +772B58412530:E18:g3F3CXByaW1fZmlsZXcHb25fbG9hZGEA +772B58412540:E12:g3F3BmVybGFuZ3cEaGFsdGEB +772B58412550:E17:g3F3C3ByaW1fc29ja2V0dwRpbml0YQA= +772B58412560:E1A:g3F3C3ByaW1fc29ja2V0dwdvbl9sb2FkYQA= +772B58412570:E17:g3F3CHByaW1fbmV0dwdvbl9sb2FkYQA= +772B58412580:E17:g3F3BGluaXR3C21vZHVsZV9pbmZvYQE= +772B58412590:E17:g3F3BGluaXR3C21vZHVsZV9pbmZvYQA= +772B584125A0:E20:g3F3BGluaXR3FHJ1bl9vbl9sb2FkX2hhbmRsZXJzYQA= +772B584125B0:E1D:g3F3BGluaXR3EWFyY2hpdmVfZXh0ZW5zaW9uYQA= +772B584125C0:E1D:g3F3BGluaXR3EW9iamZpbGVfZXh0ZW5zaW9uYQA= +772B584125D0:E1C:g3F3BGluaXR3EGNvZGVfcGF0aF9jaG9pY2VhAA== +772B584125E0:E10:g3F3BGluaXR3BGJvb3RhAQ== +772B584125F0:E10:g3F3BGluaXR3BHN0b3BhAQ== +772B58412600:E10:g3F3BGluaXR3BHN0b3BhAA== +772B58412610:E12:g3F3BGluaXR3BnJlYm9vdGEA +772B58412620:E13:g3F3BGluaXR3B3Jlc3RhcnRhAQ== +772B58412630:E13:g3F3BGluaXR3B3Jlc3RhcnRhAA== +772B58412640:E1E:g3F3BGluaXR3EndhaXRfdW50aWxfc3RhcnRlZGEA +772B58412650:E1F:g3F3BGluaXR3E25vdGlmeV93aGVuX3N0YXJ0ZWRhAQ== +772B58412660:E1A:g3F3BGluaXR3Dm1ha2VfcGVybWFuZW50YQI= +772B58412670:E19:g3F3BGluaXR3DWVuc3VyZV9sb2FkZWRhAQ== +772B58412680:E18:g3F3BGluaXR3DGZldGNoX2xvYWRlZGEA +772B58412690:E16:g3F3BGluaXR3CmdldF9zdGF0dXNhAA== +772B584126A0:E17:g3F3BGluaXR3C3NjcmlwdF9uYW1lYQA= +772B584126B0:E15:g3F3BGluaXR3CXNjcmlwdF9pZGEA +772B584126C0:E18:g3F3BGluaXR3DGdldF9hcmd1bWVudGEB +772B584126D0:E1F:g3F3BGluaXR3E2dldF9wbGFpbl9hcmd1bWVudHNhAA== +772B584126E0:E19:g3F3BGluaXR3DWdldF9hcmd1bWVudHNhAA== +772B584126F0:E18:g3F3BGluaXR3DHNldF9jb25maWdmZGEC +772B58412700:E18:g3F3BGluaXR3DGdldF9jb25maWdmZGEB +772B58412710:E17:g3F3CGZpbGVuYW1ldwdhYnNuYW1lYQI= +772B58412720:E1C:g3F3BmVybGFuZ3cOZGlzcGxheV9zdHJpbmdhAQ== +772B58412730:E12:g3F3BmVybGFuZ3cEaGFsdGEA +772B58412740:E1F:g3F3D2VybF9wcmltX2xvYWRlcncIZ2V0X2ZpbGVhAQ== +772B58412750:E14:g3F3BWxpc3Rzdwdmb3JlYWNoYQI= +772B58412760:E1D:g3F3BmVybGFuZ3cPZ2FyYmFnZV9jb2xsZWN0YQA= +772B58412770:E12:g3F3BmxvZ2dlcncEaW5mb2ED +772B58412780:E23:g3F3B3VuaWNvZGV3FGNoYXJhY3RlcnNfdG9fYmluYXJ5YQM= +772B58412790:E1C:g3F3BmVybGFuZ3cOYXRvbV90b19iaW5hcnlhAQ== +772B584127A0:E17:g3F3BmVybGFuZ3cJcG9ydF9pbmZvYQI= +772B584127B0:E1A:g3F3BmVybGFuZ3cMcHVyZ2VfbW9kdWxlYQE= +772B584127C0:E1C:g3F3D2VybF9wcmltX2xvYWRlcncFc3RhcnRhAA== +772B584127D0:E1F:g3F3D2VybF9wcmltX2xvYWRlcncIc2V0X3BhdGhhAQ== +772B584127E0:E18:g3F3BmVybGFuZ3cKc3Bhd25fbGlua2EB +772B584127F0:E18:g3F3CXByaW1fZmlsZXcHZ2V0X2N3ZGEA +772B58412800:E22:g3F3D2VybF9wcmltX2xvYWRlcncLZ2V0X21vZHVsZXNhAg== +772B58412810:E25:g3F3D2VybF9wcmltX2xvYWRlcncOcmVhZF9maWxlX2luZm9hAQ== +772B58412820:E13:g3F3BmVybGFuZ3cFYXBwbHlhAw== +772B58412830:E1A:g3F3BmVybGFuZ3cMZ3JvdXBfbGVhZGVyYQI= +772B58412840:E19:g3F3BGNvZGV3DWVuc3VyZV9sb2FkZWRhAQ== +772B58412850:E16:g3F3CGVybF9zY2FudwZzdHJpbmdhAQ== +772B58412860:E13:g3F3CGVybF9hbm5vdwNuZXdhAQ== +772B58412870:E1C:g3F3CWVybF9wYXJzZXcLcGFyc2VfZXhwcnNhAQ== +772B58412880:E1C:g3F3CGVybF9ldmFsdwxuZXdfYmluZGluZ3NhAA== +772B58412890:E15:g3F3CGVybF9ldmFsdwVleHByc2EC +772B584128A0:E19:g3F3BmVybGFuZ3cLbG9hZF9tb2R1bGVhAg== +772B584128B0:E1D:g3F3BmVybGFuZ3cPbGlzdF90b19pbnRlZ2VyYQE= +772B584128C0:E13:g3F3BmVybGFuZ3cFc3Bhd25hAQ== +772B584128D0:E1B:g3F3BmVybGFuZ3cNc3Bhd25fbW9uaXRvcmEB +772B584128E0:E1B:g3F3BmVybGFuZ3cNdHJhY2VfcGF0dGVybmED +772B584128F0:E13:g3F3BmVybGFuZ3cFdHJhY2VhAw== +772B58412900:E11:g3F3BWxpc3RzdwRzb3J0YQE= +772B58412910:E16:g3F3BGNvZGV3CmFsbF9sb2FkZWRhAA== +772B58412920:E14:g3F3BmlvX2xpYncGZm9ybWF0YQI= +772B58412930:E10:g3F3AmlvdwZmb3JtYXRhAw== +772B58412940:E1D:g3F3BmVybGFuZ3cPcHJlcGFyZV9sb2FkaW5nYQI= +772B58412950:E1E:g3F3C3ByaW1fYnVmZmVydwttb2R1bGVfaW5mb2EB +772B58412960:E1E:g3F3C3ByaW1fYnVmZmVydwttb2R1bGVfaW5mb2EA +772B58412970:E19:g3F3C3ByaW1fYnVmZmVydwZ1bmxvY2thAQ== +772B58412980:E1B:g3F3C3ByaW1fYnVmZmVydwh0cnlfbG9ja2EB +772B58412990:E22:g3F3C3ByaW1fYnVmZmVydw9maW5kX2J5dGVfaW5kZXhhAg== +772B584129A0:E17:g3F3C3ByaW1fYnVmZmVydwR3aXBlYQE= +772B584129B0:E17:g3F3C3ByaW1fYnVmZmVydwRza2lwYQI= +772B584129C0:E18:g3F3C3ByaW1fYnVmZmVydwV3cml0ZWEC +772B584129D0:E1D:g3F3C3ByaW1fYnVmZmVydwpyZWFkX2lvdmVjYQI= +772B584129E0:E17:g3F3C3ByaW1fYnVmZmVydwRyZWFkYQI= +772B584129F0:E17:g3F3C3ByaW1fYnVmZmVydwRzaXplYQE= +772B58412A00:E16:g3F3C3ByaW1fYnVmZmVydwNuZXdhAA== +772B58412A10:E1C:g3F3CXByaW1fZXZhbHcLbW9kdWxlX2luZm9hAQ== +772B58412A20:E1C:g3F3CXByaW1fZXZhbHcLbW9kdWxlX2luZm9hAA== +772B58412A30:E18:g3F3CXByaW1fZXZhbHcHcmVjZWl2ZWEC +772B58412A40:E1C:g3F3CXByaW1faW5ldHcLbW9kdWxlX2luZm9hAQ== +772B58412A50:E1C:g3F3CXByaW1faW5ldHcLbW9kdWxlX2luZm9hAA== +772B58412A60:E1F:g3F3CXByaW1faW5ldHcOaXNfc29ja29wdF92YWxhAg== +772B58412A70:E17:g3F3CXByaW1faW5ldHcGYXR0YWNoYQE= +772B58412A80:E17:g3F3CXByaW1faW5ldHcGZGV0YWNoYQE= +772B58412A90:E17:g3F3CXByaW1faW5ldHcGdW5yZWN2YQI= +772B58412AA0:E1E:g3F3CXByaW1faW5ldHcNZ2V0c2VydmJ5cG9ydGED +772B58412AB0:E1E:g3F3CXByaW1faW5ldHcNZ2V0c2VydmJ5bmFtZWED +772B58412AC0:E1C:g3F3CXByaW1faW5ldHcLZ2V0aG9zdG5hbWVhAQ== +772B58412AD0:E1A:g3F3CXByaW1faW5ldHcJZ2V0c3RhdHVzYQE= +772B58412AE0:E18:g3F3CXByaW1faW5ldHcHZ2V0dHlwZWEB +772B58412AF0:E19:g3F3CXByaW1faW5ldHcIZ2V0aW5kZXhhAQ== +772B58412B00:E19:g3F3CXByaW1faW5ldHcIaWdub3JlZmRhAg== +772B58412B10:E16:g3F3CXByaW1faW5ldHcFZ2V0ZmRhAQ== +772B58412B20:E18:g3F3CXByaW1faW5ldHcHZ2V0c3RhdGEC +772B58412B30:E16:g3F3CXByaW1faW5ldHcFaWZzZXRhAw== +772B58412B40:E16:g3F3CXByaW1faW5ldHcFaWZnZXRhAw== +772B58412B50:E1A:g3F3CXByaW1faW5ldHcJZ2V0aWZsaXN0YQE= +772B58412B60:E1B:g3F3CXByaW1faW5ldHcKZ2V0aWZhZGRyc2EB +772B58412B70:E18:g3F3CXByaW1faW5ldHcHY2hnb3B0c2EC +772B58412B80:E17:g3F3CXByaW1faW5ldHcGY2hnb3B0YQM= +772B58412B90:E18:g3F3CXByaW1faW5ldHcHZ2V0b3B0c2EC +772B58412BA0:E17:g3F3CXByaW1faW5ldHcGZ2V0b3B0YQI= +772B58412BB0:E18:g3F3CXByaW1faW5ldHcHc2V0b3B0c2EC +772B58412BC0:E17:g3F3CXByaW1faW5ldHcGc2V0b3B0YQM= +772B58412BD0:E1A:g3F3CXByaW1faW5ldHcJc29ja25hbWVzYQI= +772B58412BE0:E1A:g3F3CXByaW1faW5ldHcJc29ja25hbWVzYQE= +772B58412BF0:E1C:g3F3CXByaW1faW5ldHcLc2V0c29ja25hbWVhAg== +772B58412C00:E19:g3F3CXByaW1faW5ldHcIc29ja25hbWVhAQ== +772B58412C10:E1A:g3F3CXByaW1faW5ldHcJcGVlcm5hbWVzYQI= +772B58412C20:E1A:g3F3CXByaW1faW5ldHcJcGVlcm5hbWVzYQE= +772B58412C30:E1C:g3F3CXByaW1faW5ldHcLc2V0cGVlcm5hbWVhAg== +772B58412C40:E19:g3F3CXByaW1faW5ldHcIcGVlcm5hbWVhAQ== +772B58412C50:E19:g3F3CXByaW1faW5ldHcIcmVjdmZyb21hAw== +772B58412C60:E19:g3F3CXByaW1faW5ldHcIcmVjdmZyb21hAg== +772B58412C70:E1B:g3F3CXByaW1faW5ldHcKYXN5bmNfcmVjdmED +772B58412C80:E15:g3F3CXByaW1faW5ldHcEcmVjdmED +772B58412C90:E15:g3F3CXByaW1faW5ldHcEcmVjdmEC +772B58412CA0:E19:g3F3CXByaW1faW5ldHcIc2VuZGZpbGVhBA== +772B58412CB0:E18:g3F3CXByaW1faW5ldHcHc2VuZG1zZ2ED +772B58412CC0:E17:g3F3CXByaW1faW5ldHcGc2VuZHRvYQQ= +772B58412CD0:E15:g3F3CXByaW1faW5ldHcEc2VuZGED +772B58412CE0:E15:g3F3CXByaW1faW5ldHcEc2VuZGEC +772B58412CF0:E18:g3F3CXByaW1faW5ldHcHcGVlbG9mZmEC +772B58412D00:E17:g3F3CXByaW1faW5ldHcGbGlzdGVuYQI= +772B58412D10:E17:g3F3CXByaW1faW5ldHcGbGlzdGVuYQE= +772B58412D20:E1D:g3F3CXByaW1faW5ldHcMYXN5bmNfYWNjZXB0YQI= +772B58412D30:E17:g3F3CXByaW1faW5ldHcGYWNjZXB0YQM= +772B58412D40:E17:g3F3CXByaW1faW5ldHcGYWNjZXB0YQI= +772B58412D50:E17:g3F3CXByaW1faW5ldHcGYWNjZXB0YQE= +772B58412D60:E19:g3F3CXByaW1faW5ldHcIY29ubmVjdHhhAg== +772B58412D70:E19:g3F3CXByaW1faW5ldHcIY29ubmVjdHhhAw== +772B58412D80:E1E:g3F3CXByaW1faW5ldHcNYXN5bmNfY29ubmVjdGEE +772B58412D90:E18:g3F3CXByaW1faW5ldHcHY29ubmVjdGEE +772B58412DA0:E18:g3F3CXByaW1faW5ldHcHY29ubmVjdGED +772B58412DB0:E15:g3F3CXByaW1faW5ldHcEYmluZGED +772B58412DC0:E16:g3F3CXByaW1faW5ldHcFY2xvc2VhAQ== +772B58412DD0:E19:g3F3CXByaW1faW5ldHcIc2h1dGRvd25hAg== +772B58412DE0:E17:g3F3CXByaW1faW5ldHcGZmRvcGVuYQU= +772B58412DF0:E17:g3F3CXByaW1faW5ldHcGZmRvcGVuYQQ= +772B58412E00:E15:g3F3CXByaW1faW5ldHcEb3BlbmEE +772B58412E10:E15:g3F3CXByaW1faW5ldHcEb3BlbmED +772B58412E20:E17:g3F3BmVybGFuZ3cJb3Blbl9wb3J0YQI= +772B58412E30:E18:g3F3BmVybGFuZ3cKcG9ydF9jbG9zZWEB +772B58412E40:E1A:g3F3BmVybGFuZ3cMcG9ydF9jb21tYW5kYQM= +772B58412E50:E1A:g3F3BmVybGFuZ3cMcG9ydF9jb21tYW5kYQI= +772B58412E60:E1A:g3F3BmVybGFuZ3cMcG9ydF9jb25uZWN0YQI= +772B58412E70:E10:g3F3BWxpc3RzdwNhbGxhAg== +772B58412E80:E1A:g3F3BmVybGFuZ3cMcG9ydF9jb250cm9sYQM= +772B58412E90:E1C:g3F3CXByaW1fZmlsZXcLbW9kdWxlX2luZm9hAQ== +772B58412EA0:E1C:g3F3CXByaW1fZmlsZXcLbW9kdWxlX2luZm9hAA== +772B58412EB0:E18:g3F3CXByaW1fZmlsZXcHYWx0bmFtZWEB +772B58412EC0:E1D:g3F3CXByaW1fZmlsZXcMbWFrZV9zeW1saW5rYQI= +772B58412ED0:E1A:g3F3CXByaW1fZmlsZXcJbWFrZV9saW5rYQI= +772B58412EE0:E18:g3F3CXByaW1fZmlsZXcHZGVsX2RpcmEB +772B58412EF0:E19:g3F3CXByaW1fZmlsZXcIbWFrZV9kaXJhAQ== +772B58412F00:E17:g3F3CXByaW1fZmlsZXcGcmVuYW1lYQI= +772B58412F10:E17:g3F3CXByaW1fZmlsZXcGZGVsZXRlYQE= +772B58412F20:E18:g3F3CXByaW1fZmlsZXcHc2V0X2N3ZGEB +772B58412F30:E18:g3F3CXByaW1fZmlsZXcHZ2V0X2N3ZGEB +772B58412F40:E20:g3F3CXByaW1fZmlsZXcPd3JpdGVfZmlsZV9pbmZvYQM= +772B58412F50:E20:g3F3CXByaW1fZmlsZXcPd3JpdGVfZmlsZV9pbmZvYQI= +772B58412F60:E21:g3F3CXByaW1fZmlsZXcQcmVhZF9oYW5kbGVfaW5mb2EC +772B58412F70:E21:g3F3CXByaW1fZmlsZXcQcmVhZF9oYW5kbGVfaW5mb2EB +772B58412F80:E1F:g3F3CXByaW1fZmlsZXcOcmVhZF9saW5rX2luZm9hAg== +772B58412F90:E1F:g3F3CXByaW1fZmlsZXcOcmVhZF9saW5rX2luZm9hAQ== +772B58412FA0:E1F:g3F3CXByaW1fZmlsZXcOcmVhZF9maWxlX2luZm9hAg== +772B58412FB0:E1F:g3F3CXByaW1fZmlsZXcOcmVhZF9maWxlX2luZm9hAQ== +772B58412FC0:E1D:g3F3CXByaW1fZmlsZXcMbGlzdF9kaXJfYWxsYQE= +772B58412FD0:E19:g3F3CXByaW1fZmlsZXcIbGlzdF9kaXJhAQ== +772B58412FE0:E1E:g3F3CXByaW1fZmlsZXcNcmVhZF9saW5rX2FsbGEB +772B58412FF0:E1A:g3F3CXByaW1fZmlsZXcJcmVhZF9saW5rYQE= +772B58413000:E1B:g3F3CXByaW1fZmlsZXcKd3JpdGVfZmlsZWEC +772B58413010:E1A:g3F3CXByaW1fZmlsZXcJcmVhZF9maWxlYQE= +772B58413020:E1B:g3F3CXByaW1fZmlsZXcKZ2V0X2hhbmRsZWEB +772B58413030:E23:g3F3CXByaW1fZmlsZXcSaXByZWFkX3MzMmJ1X3AzMmJ1YQM= +772B58413040:E2A:g3F3CXByaW1fZmlsZXcZaW50ZXJuYWxfZ2V0X25pZl9yZXNvdXJjZWEB +772B58413050:E19:g3F3CXByaW1fZmlsZXcIc2VuZGZpbGVhCA== +772B58413060:E17:g3F3CXByaW1fZmlsZXcGcHdyaXRlYQI= +772B58413070:E17:g3F3CXByaW1fZmlsZXcGcHdyaXRlYQM= +772B58413080:E16:g3F3CXByaW1fZmlsZXcFcHJlYWRhAg== +772B58413090:E16:g3F3CXByaW1fZmlsZXcFcHJlYWRhAw== +772B584130A0:E19:g3F3CXByaW1fZmlsZXcIcG9zaXRpb25hAg== +772B584130B0:E19:g3F3CXByaW1fZmlsZXcIZGF0YXN5bmNhAQ== +772B584130C0:E15:g3F3CXByaW1fZmlsZXcEc3luY2EB +772B584130D0:E19:g3F3CXByaW1fZmlsZXcIYWxsb2NhdGVhAw== +772B584130E0:E17:g3F3CXByaW1fZmlsZXcGYWR2aXNlYQQ= +772B584130F0:E19:g3F3CXByaW1fZmlsZXcIdHJ1bmNhdGVhAQ== +772B58413100:E16:g3F3CXByaW1fZmlsZXcFd3JpdGVhAg== +772B58413110:E1A:g3F3CXByaW1fZmlsZXcJcmVhZF9saW5lYQE= +772B58413120:E15:g3F3CXByaW1fZmlsZXcEcmVhZGEC +772B58413130:E16:g3F3CXByaW1fZmlsZXcFY2xvc2VhAQ== +772B58413140:E21:g3F3CXByaW1fZmlsZXcQZmlsZV9kZXNjX3RvX3JlZmEC +772B58413150:E15:g3F3CXByaW1fZmlsZXcEb3BlbmEC +772B58413160:E15:g3F3CXByaW1fZmlsZXcEY29weWED +772B58413170:E16:g3F3CXByaW1fZmlsZXcFc3RhcnRhAA== +772B58413180:E17:g3F3BGZpbGV3C2NvcHlfb3BlbmVkYQM= +772B58413190:E28:g3F3BmVybGFuZ3cabG9jYWx0aW1lX3RvX3VuaXZlcnNhbHRpbWVhAQ== +772B584131A0:E17:g3F3BHpsaWJ3C21vZHVsZV9pbmZvYQE= +772B584131B0:E17:g3F3BHpsaWJ3C21vZHVsZV9pbmZvYQA= +772B584131C0:E12:g3F3BHpsaWJ3Bmd1bnppcGEB +772B584131D0:E10:g3F3BHpsaWJ3BGd6aXBhAQ== +772B584131E0:E11:g3F3BHpsaWJ3BXVuemlwYQE= +772B584131F0:EF:g3F3BHpsaWJ3A3ppcGEB +772B58413200:E16:g3F3BHpsaWJ3CnVuY29tcHJlc3NhAQ== +772B58413210:E14:g3F3BHpsaWJ3CGNvbXByZXNzYQE= +772B58413220:E16:g3F3BHpsaWJ3CmluZmxhdGVFbmRhAQ== +772B58413230:E17:g3F3BHpsaWJ3C3NhZmVJbmZsYXRlYQI= +772B58413240:E13:g3F3BHpsaWJ3B2luZmxhdGVhAw== +772B58413250:E13:g3F3BHpsaWJ3B2luZmxhdGVhAg== +772B58413260:E18:g3F3BHpsaWJ3DGluZmxhdGVSZXNldGEB +772B58413270:E20:g3F3BHpsaWJ3FGluZmxhdGVHZXREaWN0aW9uYXJ5YQE= +772B58413280:E20:g3F3BHpsaWJ3FGluZmxhdGVTZXREaWN0aW9uYXJ5YQI= +772B58413290:E17:g3F3BHpsaWJ3C2luZmxhdGVJbml0YQM= +772B584132A0:E17:g3F3BHpsaWJ3C2luZmxhdGVJbml0YQI= +772B584132B0:E17:g3F3BHpsaWJ3C2luZmxhdGVJbml0YQE= +772B584132C0:E16:g3F3BHpsaWJ3CmRlZmxhdGVFbmRhAQ== +772B584132D0:E13:g3F3BHpsaWJ3B2RlZmxhdGVhAw== +772B584132E0:E13:g3F3BHpsaWJ3B2RlZmxhdGVhAg== +772B584132F0:E19:g3F3BHpsaWJ3DWRlZmxhdGVQYXJhbXNhAw== +772B58413300:E18:g3F3BHpsaWJ3DGRlZmxhdGVSZXNldGEB +772B58413310:E20:g3F3BHpsaWJ3FGRlZmxhdGVTZXREaWN0aW9uYXJ5YQI= +772B58413320:E17:g3F3BHpsaWJ3C2RlZmxhdGVJbml0YQY= +772B58413330:E17:g3F3BHpsaWJ3C2RlZmxhdGVJbml0YQI= +772B58413340:E17:g3F3BHpsaWJ3C2RlZmxhdGVJbml0YQE= +772B58413350:E23:g3F3BHpsaWJ3F3NldF9jb250cm9sbGluZ19wcm9jZXNzYQI= +772B58413360:E11:g3F3BHpsaWJ3BWNsb3NlYQE= +772B58413370:E10:g3F3BHpsaWJ3BG9wZW5hAA== +772B58413380:E22:g3F3D3NvY2tldF9yZWdpc3RyeXcLbW9kdWxlX2luZm9hAQ== +772B58413390:E22:g3F3D3NvY2tldF9yZWdpc3RyeXcLbW9kdWxlX2luZm9hAA== +772B584133A0:E23:g3F3D3NvY2tldF9yZWdpc3RyeXcMbW9uaXRvcmVkX2J5YQE= +772B584133B0:E25:g3F3D3NvY2tldF9yZWdpc3RyeXcOd2hpY2hfbW9uaXRvcnNhAQ== +772B584133C0:E29:g3F3D3NvY2tldF9yZWdpc3RyeXcSbnVtYmVyX29mX21vbml0b3JzYQE= +772B584133D0:E29:g3F3D3NvY2tldF9yZWdpc3RyeXcSbnVtYmVyX29mX21vbml0b3JzYQA= +772B584133E0:E25:g3F3D3NvY2tldF9yZWdpc3RyeXcOY2FuY2VsX21vbml0b3JhAQ== +772B584133F0:E1E:g3F3D3NvY2tldF9yZWdpc3RyeXcHbW9uaXRvcmEC +772B58413400:E1E:g3F3D3NvY2tldF9yZWdpc3RyeXcHbW9uaXRvcmEB +772B58413410:E24:g3F3D3NvY2tldF9yZWdpc3RyeXcNd2hpY2hfc29ja2V0c2EB +772B58413420:E20:g3F3D3NvY2tldF9yZWdpc3RyeXcJbnVtYmVyX29mYQA= +772B58413430:E1C:g3F3D3NvY2tldF9yZWdpc3RyeXcFc3RhcnRhAA== +772B58413440:E13:g3F3BWxpc3RzdwZkZWxldGVhAg== +772B58413450:E12:g3F3BnNvY2tldHcEaW5mb2EB +772B58413460:E2A:g3F3C3ByaW1fc29ja2V0dxdzZW5kZmlsZV9kZWZlcnJlZF9jbG9zZWEB +772B58413470:E1E:g3F3C3ByaW1fc29ja2V0dwttb2R1bGVfaW5mb2EB +772B58413480:E1E:g3F3C3ByaW1fc29ja2V0dwttb2R1bGVfaW5mb2EA +772B58413490:E18:g3F3C3ByaW1fc29ja2V0dwVwX2dldGEB +772B584134A0:E1F:g3F3C3ByaW1fc29ja2V0dwxlbmNfc29ja2FkZHJhAQ== +772B584134B0:E19:g3F3C3ByaW1fc29ja2V0dwZjYW5jZWxhAw== +772B584134C0:E18:g3F3C3ByaW1fc29ja2V0dwVpb2N0bGEE +772B584134D0:E18:g3F3C3ByaW1fc29ja2V0dwVpb2N0bGED +772B584134E0:E18:g3F3C3ByaW1fc29ja2V0dwVpb2N0bGEC +772B584134F0:E1B:g3F3C3ByaW1fc29ja2V0dwhwZWVybmFtZWEB +772B58413500:E1B:g3F3C3ByaW1fc29ja2V0dwhzb2NrbmFtZWEB +772B58413510:E20:g3F3C3ByaW1fc29ja2V0dw1nZXRvcHRfbmF0aXZlYQM= +772B58413520:E19:g3F3C3ByaW1fc29ja2V0dwZnZXRvcHRhAg== +772B58413530:E20:g3F3C3ByaW1fc29ja2V0dw1zZXRvcHRfbmF0aXZlYQM= +772B58413540:E19:g3F3C3ByaW1fc29ja2V0dwZzZXRvcHRhAw== +772B58413550:E1B:g3F3C3ByaW1fc29ja2V0dwhzaHV0ZG93bmEC +772B58413560:E21:g3F3C3ByaW1fc29ja2V0dw5maW5hbGl6ZV9jbG9zZWEB +772B58413570:E18:g3F3C3ByaW1fc29ja2V0dwVjbG9zZWEB +772B58413580:E1A:g3F3C3ByaW1fc29ja2V0dwdyZWN2bXNnYQU= +772B58413590:E1B:g3F3C3ByaW1fc29ja2V0dwhyZWN2ZnJvbWEE +772B584135A0:E17:g3F3C3ByaW1fc29ja2V0dwRyZWN2YQQ= +772B584135B0:E1B:g3F3C3ByaW1fc29ja2V0dwhzZW5kZmlsZWEF +772B584135C0:E1B:g3F3C3ByaW1fc29ja2V0dwhzZW5kZmlsZWEE +772B584135D0:E18:g3F3C3ByaW1fc29ja2V0dwVzZW5kdmED +772B584135E0:E1B:g3F3C3ByaW1fc29ja2V0dwhyZXN0X2lvdmEC +772B584135F0:E1A:g3F3C3ByaW1fc29ja2V0dwdzZW5kbXNnYQU= +772B58413600:E1A:g3F3C3ByaW1fc29ja2V0dwdzZW5kbXNnYQQ= +772B58413610:E19:g3F3C3ByaW1fc29ja2V0dwZzZW5kdG9hBQ== +772B58413620:E19:g3F3C3ByaW1fc29ja2V0dwZzZW5kdG9hBA== +772B58413630:E17:g3F3C3ByaW1fc29ja2V0dwRzZW5kYQQ= +772B58413640:E19:g3F3C3ByaW1fc29ja2V0dwZhY2NlcHRhAg== +772B58413650:E19:g3F3C3ByaW1fc29ja2V0dwZsaXN0ZW5hAg== +772B58413660:E1A:g3F3C3ByaW1fc29ja2V0dwdjb25uZWN0YQE= +772B58413670:E1A:g3F3C3ByaW1fc29ja2V0dwdjb25uZWN0YQM= +772B58413680:E17:g3F3C3ByaW1fc29ja2V0dwRiaW5kYQM= +772B58413690:E17:g3F3C3ByaW1fc29ja2V0dwRiaW5kYQI= +772B584136A0:E17:g3F3C3ByaW1fc29ja2V0dwRvcGVuYQQ= +772B584136B0:E17:g3F3C3ByaW1fc29ja2V0dwRvcGVuYQI= +772B584136C0:E1F:g3F3C3ByaW1fc29ja2V0dwxpc19zdXBwb3J0ZWRhAg== +772B584136D0:E1F:g3F3C3ByaW1fc29ja2V0dwxpc19zdXBwb3J0ZWRhAQ== +772B584136E0:E1B:g3F3C3ByaW1fc29ja2V0dwhzdXBwb3J0c2EC +772B584136F0:E1B:g3F3C3ByaW1fc29ja2V0dwhzdXBwb3J0c2EB +772B58413700:E1B:g3F3C3ByaW1fc29ja2V0dwhzdXBwb3J0c2EA +772B58413710:E1F:g3F3C3ByaW1fc29ja2V0dwx1c2VfcmVnaXN0cnlhAQ== +772B58413720:E1F:g3F3C3ByaW1fc29ja2V0dwxzb2NrZXRfZGVidWdhAQ== +772B58413730:E18:g3F3C3ByaW1fc29ja2V0dwVkZWJ1Z2EB +772B58413740:E17:g3F3C3ByaW1fc29ja2V0dwRpbmZvYQE= +772B58413750:E17:g3F3C3ByaW1fc29ja2V0dwRpbmZvYQA= +772B58413760:E1A:g3F3C3ByaW1fc29ja2V0dwdvbl9sb2FkYQE= +772B58413770:E10:g3F3BG1hcHN3BGZvbGRhAw== +772B58413780:E10:g3F3BWxpc3RzdwNudGhhAg== +772B58413790:E10:g3F3BG1hcHN3BHdpdGhhAg== +772B584137A0:EF:g3F3BG1hcHN3A21hcGEC +772B584137B0:E1B:g3F3CHByaW1fbmV0dwttb2R1bGVfaW5mb2EB +772B584137C0:E1B:g3F3CHByaW1fbmV0dwttb2R1bGVfaW5mb2EA +772B584137D0:E18:g3F3CHByaW1fbmV0dwhpZl9uYW1lc2EA +772B584137E0:E1D:g3F3CHByaW1fbmV0dw1pZl9pbmRleDJuYW1lYQE= +772B584137F0:E1D:g3F3CHByaW1fbmV0dw1pZl9uYW1lMmluZGV4YQE= +772B58413800:E1D:g3F3CHByaW1fbmV0dw1nZXRzZXJ2Ynlwb3J0YQI= +772B58413810:E1D:g3F3CHByaW1fbmV0dw1nZXRzZXJ2YnluYW1lYQI= +772B58413820:E24:g3F3CHByaW1fbmV0dxRnZXRfaXBfYWRkcmVzc190YWJsZWEB +772B58413830:E1C:g3F3CHByaW1fbmV0dwxnZXRfaWZfZW50cnlhAQ== +772B58413840:E22:g3F3CHByaW1fbmV0dxJnZXRfaW50ZXJmYWNlX2luZm9hAQ== +772B58413850:E26:g3F3CHByaW1fbmV0dxZnZXRfYWRhcHRlcnNfYWRkcmVzc2VzYQE= +772B58413860:E1A:g3F3CHByaW1fbmV0dwpnZXRpZmFkZHJzYQE= +772B58413870:E1B:g3F3CHByaW1fbmV0dwtnZXRhZGRyaW5mb2EC +772B58413880:E1B:g3F3CHByaW1fbmV0dwtnZXRuYW1laW5mb2EC +772B58413890:E1B:g3F3CHByaW1fbmV0dwtnZXRob3N0bmFtZWEA +772B584138A0:E15:g3F3CHByaW1fbmV0dwVkZWJ1Z2EB +772B584138B0:E14:g3F3CHByaW1fbmV0dwRpbmZvYQA= +772B584138C0:E17:g3F3CHByaW1fbmV0dwdvbl9sb2FkYQE= +772B584138D0:E1B:g3F3CHByaW1femlwdwttb2R1bGVfaW5mb2EB +772B584138E0:E1B:g3F3CHByaW1femlwdwttb2R1bGVfaW5mb2EA +772B584138F0:E18:g3F3CHByaW1femlwdwhzcGxpdHRlcmED +772B58413900:E15:g3F3CHByaW1femlwdwVjbG9zZWEB +772B58413910:E15:g3F3CHByaW1femlwdwVmb2xkbGED +772B58413920:E14:g3F3CHByaW1femlwdwRvcGVuYQM= +772B58413930:E14:g3F3CHByaW1femlwdwRvcGVuYQE= +772B58413940:E22:g3F3D2VybF9wcmltX2xvYWRlcncLbW9kdWxlX2luZm9hAQ== +772B58413950:E22:g3F3D2VybF9wcmltX2xvYWRlcncLbW9kdWxlX2luZm9hAA== +772B58413960:E22:g3F3D2VybF9wcmltX2xvYWRlcncLaXNfYmFzZW5hbWVhAQ== +772B58413970:E23:g3F3D2VybF9wcmltX2xvYWRlcncMcHJpbV9nZXRfY3dkYQI= +772B58413980:E2A:g3F3D2VybF9wcmltX2xvYWRlcncTcHJpbV9yZWFkX2ZpbGVfaW5mb2ED +772B58413990:E24:g3F3D2VybF9wcmltX2xvYWRlcncNcHJpbV9saXN0X2RpcmEC +772B584139A0:E25:g3F3D2VybF9wcmltX2xvYWRlcncOcHJpbV9yZWFkX2ZpbGVhAg== +772B584139B0:E20:g3F3D2VybF9wcmltX2xvYWRlcncJcHJpbV9pbml0YQA= +772B584139C0:E22:g3F3D2VybF9wcmltX2xvYWRlcncLZ2V0X21vZHVsZXNhAw== +772B584139D0:E2A:g3F3D2VybF9wcmltX2xvYWRlcncTcHVyZ2VfYXJjaGl2ZV9jYWNoZWEA +772B584139E0:E2A:g3F3D2VybF9wcmltX2xvYWRlcncTc2V0X3ByaW1hcnlfYXJjaGl2ZWEE +772B584139F0:E1E:g3F3D2VybF9wcmltX2xvYWRlcncHZ2V0X2N3ZGEB +772B58413A00:E1E:g3F3D2VybF9wcmltX2xvYWRlcncHZ2V0X2N3ZGEA +772B58413A10:E25:g3F3D2VybF9wcmltX2xvYWRlcncOcmVhZF9saW5rX2luZm9hAQ== +772B58413A20:E20:g3F3D2VybF9wcmltX2xvYWRlcncJcmVhZF9maWxlYQE= +772B58413A30:E1F:g3F3D2VybF9wcmltX2xvYWRlcncIbGlzdF9kaXJhAQ== +772B58413A40:E1F:g3F3D2VybF9wcmltX2xvYWRlcncIZ2V0X3BhdGhhAA== +772B58413A50:E19:g3F3BmVybGFuZ3cLbW9kdWxlX2luZm9hAQ== +772B58413A60:E19:g3F3BmVybGFuZ3cLbW9kdWxlX2luZm9hAA== +772B58413A70:E14:g3F3BmVybGFuZ3cGbWVtb3J5YQE= +772B58413A80:E14:g3F3BmVybGFuZ3cGbWVtb3J5YQA= +772B58413A90:E18:g3F3BmVybGFuZ3cKZ2V0X2Nvb2tpZWEB +772B58413AA0:E18:g3F3BmVybGFuZ3cKZ2V0X2Nvb2tpZWEA +772B58413AB0:E18:g3F3BmVybGFuZ3cKc2V0X2Nvb2tpZWEC +772B58413AC0:E18:g3F3BmVybGFuZ3cKc2V0X2Nvb2tpZWEB +772B58413AD0:E17:g3F3BmVybGFuZ3cJcG9ydF9pbmZvYQE= +772B58413AE0:E17:g3F3BmVybGFuZ3cJcG9ydF9jYWxsYQM= +772B58413AF0:E17:g3F3BmVybGFuZ3cJcG9ydF9jYWxsYQI= +772B58413B00:E1C:g3F3BmVybGFuZ3cOc2VuZF9ub3N1c3BlbmRhAw== +772B58413B10:E1C:g3F3BmVybGFuZ3cOc2VuZF9ub3N1c3BlbmRhAg== +772B58413B20:E16:g3F3BmVybGFuZ3cIZnVuX2luZm9hAQ== +772B58413B30:E1D:g3F3BmVybGFuZ3cPZGlzY29ubmVjdF9ub2RlYQE= +772B58413B40:E13:g3F3BmVybGFuZ3cFeWllbGRhAA== +772B58413B50:E1B:g3F3BmVybGFuZ3cNc3Bhd25fcmVxdWVzdGEF +772B58413B60:E1B:g3F3BmVybGFuZ3cNc3Bhd25fcmVxdWVzdGEE +772B58413B70:E1B:g3F3BmVybGFuZ3cNc3Bhd25fcmVxdWVzdGED +772B58413B80:E1B:g3F3BmVybGFuZ3cNc3Bhd25fcmVxdWVzdGEC +772B58413B90:E1B:g3F3BmVybGFuZ3cNc3Bhd25fcmVxdWVzdGEB +772B58413BA0:E17:g3F3BmVybGFuZ3cJc3Bhd25fb3B0YQU= +772B58413BB0:E1B:g3F3BmVybGFuZ3cNc3Bhd25fbW9uaXRvcmEE +772B58413BC0:E18:g3F3BmVybGFuZ3cKc3Bhd25fbGlua2EE +772B58413BD0:E13:g3F3BmVybGFuZ3cFc3Bhd25hBA== +772B58413BE0:E17:g3F3BmVybGFuZ3cJc3Bhd25fb3B0YQM= +772B58413BF0:E17:g3F3BmVybGFuZ3cJc3Bhd25fb3B0YQI= +772B58413C00:E1B:g3F3BmVybGFuZ3cNc3Bhd25fbW9uaXRvcmED +772B58413C10:E1B:g3F3BmVybGFuZ3cNc3Bhd25fbW9uaXRvcmEC +772B58413C20:E18:g3F3BmVybGFuZ3cKc3Bhd25fbGlua2EC +772B58413C30:E13:g3F3BmVybGFuZ3cFc3Bhd25hAg== +772B58413C40:E1B:g3F3BmVybGFuZ3cNdHJhY2VfcGF0dGVybmEC +772B58413C50:E1D:g3F3BmVybGFuZ3cPc3VzcGVuZF9wcm9jZXNzYQE= +772B58413C60:E1D:g3F3BmVybGFuZ3cPc3VzcGVuZF9wcm9jZXNzYQI= +772B58413C70:E15:g3F3BmVybGFuZ3cHc2V0bm9kZWED +772B58413C80:E1A:g3F3BmVybGFuZ3cMcHJvY2Vzc19mbGFnYQM= +772B58413C90:E1D:g3F3BmVybGFuZ3cPcHJvY2Vzc19kaXNwbGF5YQI= +772B58413CA0:E1D:g3F3BmVybGFuZ3cPbGlzdF90b19pbnRlZ2VyYQI= +772B58413CB0:E16:g3F3BmVybGFuZ3cIaXNfYWxpdmVhAA== +772B58413CC0:E2A:g3F3BmVybGFuZ3ccZ2FyYmFnZV9jb2xsZWN0X21lc3NhZ2VfYXJlYWEA +772B58413CD0:E1D:g3F3BmVybGFuZ3cPZ2FyYmFnZV9jb2xsZWN0YQI= +772B58413CE0:E1D:g3F3BmVybGFuZ3cPZ2FyYmFnZV9jb2xsZWN0YQE= +772B58413CF0:E13:g3F3BmVybGFuZ3cFYWxpYXNhAA== +772B58413D00:E20:g3F3BmVybGFuZ3cSY2hlY2tfcHJvY2Vzc19jb2RlYQM= +772B58413D10:E20:g3F3BmVybGFuZ3cSY2hlY2tfcHJvY2Vzc19jb2RlYQI= +772B58413D20:E1F:g3F3BmVybGFuZ3cRYmluYXJ5X3RvX2ludGVnZXJhAg== +772B58413D30:E1F:g3F3BmVybGFuZ3cRYmluYXJ5X3RvX2ludGVnZXJhAQ== +772B58413D40:E25:g3F3BmVybGFuZ3cXYmluYXJ5X3RvX2V4aXN0aW5nX2F0b21hAQ== +772B58413D50:E1C:g3F3BmVybGFuZ3cOYmluYXJ5X3RvX2F0b21hAQ== +772B58413D60:E27:g3F3DWVydHNfaW50ZXJuYWx3EmNoZWNrX3Byb2Nlc3NfY29kZWED +772B58413D70:E26:g3F3DWVydHNfaW50ZXJuYWx3EWR5bmFtaWNfbm9kZV9uYW1lYQA= +772B58413D80:E1C:g3F3Cm5ldF9rZXJuZWx3CmRpc2Nvbm5lY3RhAQ== +772B58413D90:E1E:g3F3Cm5ldF9rZXJuZWx3DHBhc3NpdmVfY25jdGEB +772B58413DA0:E16:g3F3BGF1dGh3CnNldF9jb29raWVhAQ== +772B58413DB0:E16:g3F3BGF1dGh3CnNldF9jb29raWVhAg== +772B58413DC0:E16:g3F3BGF1dGh3CmdldF9jb29raWVhAA== +772B58413DD0:E16:g3F3BGF1dGh3CmdldF9jb29raWVhAQ== +772B58413DE0:E20:g3F3DWVydHNfaW50ZXJuYWx3C21vZHVsZV9pbmZvYQE= +772B58413DF0:E20:g3F3DWVydHNfaW50ZXJuYWx3C21vZHVsZV9pbmZvYQA= +772B58413E00:E23:g3F3DWVydHNfaW50ZXJuYWx3DnRlcm1fdG9fc3RyaW5nYQE= +772B58413E10:E26:g3F3DWVydHNfaW50ZXJuYWx3EWR5bmFtaWNfbm9kZV9uYW1lYQE= +772B58413E20:E1C:g3F3DWVydHNfaW50ZXJuYWx3B2NyYXNoZXJhBg== +772B58413E30:E24:g3F3DWVydHNfaW50ZXJuYWx3D2Rpc3Rfc3Bhd25faW5pdGEB +772B58413E40:E1F:g3F3DWVydHNfaW50ZXJuYWx3CnNwYXduX2luaXRhAQ== +772B58413E50:E36:g3F3DWVydHNfaW50ZXJuYWx3IXNldF9jb2RlX2FuZF9saXRlcmFsX2NsZWFuZXJfcHJpb2EB +772B58413E60:E33:g3F3DWVydHNfaW50ZXJuYWx3HkBmbHVzaF9tb25pdG9yX21lc3NhZ2VzX3JlZm9wdGEA +772B58413E70:E1E:g3F3DWVydHNfaW50ZXJuYWx3CW1jX3JlZmlsbGEB +772B58413E80:E20:g3F3DWVydHNfaW50ZXJuYWx3C21jX2l0ZXJhdG9yYQE= +772B58413E90:E26:g3F3C2tlcm5lbF9yZWZjdxNzY2hlZHVsZXJfd2FsbF90aW1lYQE= +772B58413EA0:E1F:g3F3DGVycm9yX2xvZ2dlcncLd2FybmluZ19tc2dhAg== +772B58413EB0:E1D:g3F3CmVybF90cmFjZXJ3C21vZHVsZV9pbmZvYQE= +772B58413EC0:E1D:g3F3CmVybF90cmFjZXJ3C21vZHVsZV9pbmZvYQA= +772B58413ED0:E20:g3F3CmVybF90cmFjZXJ3DmJlaGF2aW91cl9pbmZvYQE= +772B58413EE0:E17:g3F3CmVybF90cmFjZXJ3BXRyYWNlYQU= +772B58413EF0:E19:g3F3CmVybF90cmFjZXJ3B2VuYWJsZWRhAw== +772B58413F00:E2E:g3F3G2VydHNfbGl0ZXJhbF9hcmVhX2NvbGxlY3RvcncLbW9kdWxlX2luZm9hAQ== +772B58413F10:E2E:g3F3G2VydHNfbGl0ZXJhbF9hcmVhX2NvbGxlY3RvcncLbW9kdWxlX2luZm9hAA== +772B58413F20:E28:g3F3G2VydHNfbGl0ZXJhbF9hcmVhX2NvbGxlY3RvcncFc3RhcnRhAA== +772B58413F30:E25:g3F3EmVydHNfdHJhY2VfY2xlYW5lcncLbW9kdWxlX2luZm9hAQ== +772B58413F40:E25:g3F3EmVydHNfdHJhY2VfY2xlYW5lcncLbW9kdWxlX2luZm9hAA== +772B58413F50:E1F:g3F3EmVydHNfdHJhY2VfY2xlYW5lcncFc3RhcnRhAA== +772B58413F60:E34:g3F3IWVydHNfZGlydHlfcHJvY2Vzc19zaWduYWxfaGFuZGxlcncLbW9kdWxlX2luZm9hAQ== +772B58413F70:E34:g3F3IWVydHNfZGlydHlfcHJvY2Vzc19zaWduYWxfaGFuZGxlcncLbW9kdWxlX2luZm9hAA== +772B58413F80:E2E:g3F3IWVydHNfZGlydHlfcHJvY2Vzc19zaWduYWxfaGFuZGxlcncFc3RhcnRhAA== +772B58413F90:E1A:g3F3B2F0b21pY3N3C21vZHVsZV9pbmZvYQE= +772B58413FA0:E1A:g3F3B2F0b21pY3N3C21vZHVsZV9pbmZvYQA= +772B58413FB0:E16:g3F3B2F0b21pY3N3B3N1Yl9nZXRhAw== +772B58413FC0:E12:g3F3B2F0b21pY3N3A3N1YmED +772B58413FD0:E12:g3F3B2F0b21pY3N3A25ld2EC +772B58413FE0:E1B:g3F3CGNvdW50ZXJzdwttb2R1bGVfaW5mb2EB +772B58413FF0:E1B:g3F3CGNvdW50ZXJzdwttb2R1bGVfaW5mb2EA +772B58414000:E14:g3F3CGNvdW50ZXJzdwRpbmZvYQE= +772B58414010:E13:g3F3CGNvdW50ZXJzdwNwdXRhAw== +772B58414020:E13:g3F3CGNvdW50ZXJzdwNzdWJhAw== +772B58414030:E13:g3F3CGNvdW50ZXJzdwNhZGRhAw== +772B58414040:E13:g3F3CGNvdW50ZXJzdwNnZXRhAg== +772B58414050:E13:g3F3CGNvdW50ZXJzdwNuZXdhAg== +772B58414060:E22:g3F3D3BlcnNpc3RlbnRfdGVybXcLbW9kdWxlX2luZm9hAQ== +772B58414070:E22:g3F3D3BlcnNpc3RlbnRfdGVybXcLbW9kdWxlX2luZm9hAA== +772B58414080:E1B:g3F3BmxvZ2dlcncNZm9ybWF0X3JlcG9ydGEB +772B58414090:E1F:g3F3DmxvZ2dlcl9maWx0ZXJzdwlyZW1vdGVfZ2xhAg== +772B584140A0:E1C:g3F3DmxvZ2dlcl9maWx0ZXJzdwZkb21haW5hAg== +772B584140B0:E28:g3F3FmFwcGxpY2F0aW9uX2NvbnRyb2xsZXJ3CmZvcm1hdF9sb2dhAQ== +772B584140C0:E28:g3F3FmFwcGxpY2F0aW9uX2NvbnRyb2xsZXJ3CmZvcm1hdF9sb2dhAg== +772B584140D0:E1C:g3F3Cmdlbl9zZXJ2ZXJ3CmZvcm1hdF9sb2dhAQ== +772B584140E0:E1C:g3F3Cmdlbl9zZXJ2ZXJ3CmZvcm1hdF9sb2dhAg== +772B584140F0:E19:g3F3CHByb2NfbGlidwlyZXBvcnRfY2JhAg== +772B58414100:E1C:g3F3CnN1cGVydmlzb3J3CmZvcm1hdF9sb2dhAQ== +772B58414110:E1C:g3F3CnN1cGVydmlzb3J3CmZvcm1hdF9sb2dhAg== +772B58414120:E1B:g3F3CWdlbl9ldmVudHcKZm9ybWF0X2xvZ2EB +772B58414130:E1B:g3F3CWdlbl9ldmVudHcKZm9ybWF0X2xvZ2EC +772B58414140:E1C:g3F3CWVybF9wYXJzZXcLbW9kdWxlX2luZm9hAQ== +772B58414150:E1C:g3F3CWVybF9wYXJzZXcLbW9kdWxlX2luZm9hAA== +772B58414160:E1D:g3F3CWVybF9wYXJzZXcMZm9ybWF0X2Vycm9yYQE= +772B58414170:E1F:g3F3CWVybF9wYXJzZXcOcGFyc2VfYW5kX3NjYW5hAQ== +772B58414180:E16:g3F3CWVybF9wYXJzZXcFcGFyc2VhAQ== +772B58414190:E1F:g3F3CWVybF9wYXJzZXcOYW5ub19mcm9tX3Rlcm1hAQ== +772B584141A0:E1D:g3F3CWVybF9wYXJzZXcMYW5ub190b190ZXJtYQE= +772B584141B0:E19:g3F3CWVybF9wYXJzZXcIbmV3X2Fubm9hAQ== +772B584141C0:E1D:g3F3CWVybF9wYXJzZXcMbWFwZm9sZF9hbm5vYQM= +772B584141D0:E1A:g3F3CWVybF9wYXJzZXcJZm9sZF9hbm5vYQM= +772B584141E0:E19:g3F3CWVybF9wYXJzZXcIbWFwX2Fubm9hAg== +772B584141F0:E20:g3F3CWVybF9wYXJzZXcPdHlwZV9wcmVvcF9wcmVjYQE= +772B58414200:E1F:g3F3CWVybF9wYXJzZXcOdHlwZV9pbm9wX3ByZWNhAQ== +772B58414210:E19:g3F3CWVybF9wYXJzZXcIbWF4X3ByZWNhAA== +772B58414220:E1A:g3F3CWVybF9wYXJzZXcJZnVuY19wcmVjYQA= +772B58414230:E1B:g3F3CWVybF9wYXJzZXcKcHJlb3BfcHJlY2EB +772B58414240:E1A:g3F3CWVybF9wYXJzZXcJaW5vcF9wcmVjYQE= +772B58414250:E17:g3F3CWVybF9wYXJzZXcGdG9rZW5zYQI= +772B58414260:E17:g3F3CWVybF9wYXJzZXcGdG9rZW5zYQE= +772B58414270:E19:g3F3CWVybF9wYXJzZXcIYWJzdHJhY3RhAg== +772B58414280:E19:g3F3CWVybF9wYXJzZXcIYWJzdHJhY3RhAQ== +772B58414290:E1A:g3F3CWVybF9wYXJzZXcJbm9ybWFsaXNlYQE= +772B584142A0:E1B:g3F3CWVybF9wYXJzZXcKZmlyc3RfYW5ub2EB +772B584142B0:E1B:g3F3CWVybF9wYXJzZXcKcGFyc2VfdGVybWEB +772B584142C0:E1B:g3F3CWVybF9wYXJzZXcKcGFyc2VfZm9ybWEB +772B584142D0:E1B:g3F3DGVybF9pbnRlcm5hbHcHaXNfdHlwZWEC +772B584142E0:E14:g3F3CGVybF9hbm5vdwRsaW5lYQE= +772B584142F0:E10:g3F3BWxpc3RzdwNtYXBhAg== +772B58414300:E18:g3F3CGVybF9hbm5vdwhsb2NhdGlvbmEB +772B58414310:E1C:g3F3CGVybF9hbm5vdwxlbmRfbG9jYXRpb25hAQ== +772B58414320:E1C:g3F3CGVybF9hbm5vdwxzZXRfbG9jYXRpb25hAg== +772B58414330:E19:g3F3CWV2YWxfYml0c3cIZXhwcl9ncnBhAw== +772B58414340:E1B:g3F3A2VwcHcQZGVmYXVsdF9lbmNvZGluZ2EA +772B58414350:E1A:g3F3CXByb3BsaXN0c3cJZ2V0X3ZhbHVlYQM= +772B58414360:E1A:g3F3CXByb3BsaXN0c3cJZ2V0X3ZhbHVlYQI= +772B58414370:E13:g3F3BG1hcHN3B3RvX2xpc3RhAQ== +772B58414380:E14:g3F3BWxpc3RzdwdyZXZlcnNlYQE= +772B58414390:E1C:g3F3BmlvX2xpYncOZGVlcF9jaGFyX2xpc3RhAQ== +772B584143A0:E13:g3F3BmlvX2xpYncFd3JpdGVhAQ== +772B584143B0:E14:g3F3CGVybF9zY2FudwR0ZXh0YQE= +772B584143C0:E18:g3F3CGVybF9zY2Fudwhsb2NhdGlvbmEB +772B584143D0:E1A:g3F3BmlvX2xpYncMd3JpdGVfc3RyaW5nYQE= +772B584143E0:E18:g3F3BmlvX2xpYncKd3JpdGVfY2hhcmEB +772B584143F0:E18:g3F3BmlvX2xpYncKd3JpdGVfYXRvbWEB +772B58414400:E19:g3F3CGVybF9hbm5vdwlmcm9tX3Rlcm1hAQ== +772B58414410:E17:g3F3CGVybF9hbm5vdwd0b190ZXJtYQE= +772B58414420:E1B:g3F3CGVybF9ldmFsdwttb2R1bGVfaW5mb2EB +772B58414430:E1B:g3F3CGVybF9ldmFsdwttb2R1bGVfaW5mb2EA +772B58414440:E18:g3F3CGVybF9ldmFsdwhldmFsX3N0cmEB +772B58414450:E1C:g3F3CGVybF9ldmFsdwxwYXJ0aWFsX2V2YWxhAQ== +772B58414460:E20:g3F3CGVybF9ldmFsdxBpc19jb25zdGFudF9leHByYQE= +772B58414470:E23:g3F3CGVybF9ldmFsdxNleHRlbmRlZF9wYXJzZV90ZXJtYQE= +772B58414480:E24:g3F3CGVybF9ldmFsdxRleHRlbmRlZF9wYXJzZV9leHByc2EB +772B58414490:E1B:g3F3CGVybF9ldmFsdwtkZWxfYmluZGluZ2EC +772B584144A0:E1B:g3F3CGVybF9ldmFsdwthZGRfYmluZGluZ2ED +772B584144B0:E17:g3F3CGVybF9ldmFsdwdiaW5kaW5nYQI= +772B584144C0:E18:g3F3CGVybF9ldmFsdwhiaW5kaW5nc2EB +772B584144D0:E1C:g3F3CGVybF9ldmFsdwxtYXRjaF9jbGF1c2VhBA== +772B584144E0:E19:g3F3CGVybF9ldmFsdwlleHByX2xpc3RhBA== +772B584144F0:E19:g3F3CGVybF9ldmFsdwlleHByX2xpc3RhAw== +772B58414500:E19:g3F3CGVybF9ldmFsdwlleHByX2xpc3RhAg== +772B58414510:E14:g3F3CGVybF9ldmFsdwRleHByYQU= +772B58414520:E18:g3F3CGVybF9ldmFsdwhmdW5fZGF0YWEB +772B58414530:E1D:g3F3CGVybF9ldmFsdw1jaGVja19jb21tYW5kYQI= +772B58414540:E14:g3F3CGVybF9ldmFsdwRleHByYQQ= +772B58414550:E14:g3F3CGVybF9ldmFsdwRleHByYQM= +772B58414560:E14:g3F3CGVybF9ldmFsdwRleHByYQI= +772B58414570:E15:g3F3CGVybF9ldmFsdwVleHByc2EE +772B58414580:E15:g3F3CGVybF9ldmFsdwVleHByc2ED +772B58414590:E19:g3F3CGVybF9saW50dwlleHByc19vcHRhAw== +772B584145A0:E12:g3F3BWxpc3RzdwVmb2xkbGED +772B584145B0:E23:g3F3A3FsY3cYdHJhbnNmb3JtX2Zyb21fZXZhbHVhdG9yYQI= +772B584145C0:E17:g3F3DGVybF9pbnRlcm5hbHcDYmlmYQM= +772B584145D0:E17:g3F3DGVybF9pbnRlcm5hbHcDYmlmYQI= +772B584145E0:E10:g3F3BWxpc3RzdwNzZXFhAg== +772B584145F0:E19:g3F3CWV2YWxfYml0c3cIZXhwcl9ncnBhBA== +772B58414600:E19:g3F3CGVybF9saW50dwl1c2VkX3ZhcnNhAg== +772B58414610:E14:g3F3BG1hcHN3CGl0ZXJhdG9yYQE= +772B58414620:E13:g3F3BG1hcHN3B2ZvcmVhY2hhAg== +772B58414630:E18:g3F3CWV2YWxfYml0c3cHYmluX2dlbmEH +772B58414640:E10:g3F3BG1hcHN3BG5leHRhAQ== +772B58414650:E1D:g3F3CGVybF9saW50dw1pc19ndWFyZF90ZXN0YQE= +772B58414660:E1B:g3F3CWV2YWxfYml0c3cKbWF0Y2hfYml0c2EH +772B58414670:E12:g3F3B29yZGRpY3R3A25ld2EA +772B58414680:E16:g3F3B29yZGRpY3R3B3RvX2xpc3RhAQ== +772B58414690:E13:g3F3B29yZGRpY3R3BGZpbmRhAg== +772B584146A0:E14:g3F3B29yZGRpY3R3BXN0b3JlYQM= +772B584146B0:E14:g3F3B29yZGRpY3R3BWVyYXNlYQI= +772B584146C0:E16:g3F3BG1hcHN3Cm1lcmdlX3dpdGhhAw== +772B584146D0:E12:g3F3BG1hcHN3BmZpbHRlcmEC +772B584146E0:E15:g3F3B29yZGRpY3R3BmZpbHRlcmEC +772B584146F0:E13:g3F3BWxpc3RzdwZhcHBlbmRhAQ== +772B58414700:E18:g3F3CGVybF9hbm5vdwhzZXRfdGV4dGEC +772B58414710:E14:g3F3CGVybF9hbm5vdwR0ZXh0YQE= +772B58414720:E16:g3F3CGVybF9zY2FudwZ0b2tlbnNhAw== +772B58414730:E14:g3F3BWxpc3RzdwdmbGF0dGVuYQE= +772B58414740:E1D:g3F3CGVybF9saW50dw1pc19ndWFyZF9leHByYQE= +772B58414750:E17:g3F3CGVybF9hbm5vdwdpc19hbm5vYQE= +772B58414760:E1B:g3F3CGVybF9saW50dwttb2R1bGVfaW5mb2EB +772B58414770:E1B:g3F3CGVybF9saW50dwttb2R1bGVfaW5mb2EA +772B58414780:E23:g3F3CGVybF9saW50dxNjaGVja19mb3JtYXRfc3RyaW5nYQI= +772B58414790:E23:g3F3CGVybF9saW50dxNjaGVja19mb3JtYXRfc3RyaW5nYQE= +772B584147A0:E1D:g3F3CGVybF9saW50dw1pc19ndWFyZF90ZXN0YQM= +772B584147B0:E1D:g3F3CGVybF9saW50dw1pc19ndWFyZF90ZXN0YQI= +772B584147C0:E1F:g3F3CGVybF9saW50dw9pc19wYXR0ZXJuX2V4cHJhAQ== +772B584147D0:E16:g3F3CGVybF9saW50dwZtb2R1bGVhAw== +772B584147E0:E16:g3F3CGVybF9saW50dwZtb2R1bGVhAg== +772B584147F0:E16:g3F3CGVybF9saW50dwZtb2R1bGVhAQ== +772B58414800:E15:g3F3CGVybF9saW50dwVleHByc2EC +772B58414810:E1C:g3F3CGVybF9saW50dwxmb3JtYXRfZXJyb3JhAQ== +772B58414820:E1C:g3F3CGVybF9saW50dwx2YWx1ZV9vcHRpb25hBw== +772B58414830:E1C:g3F3CGVybF9saW50dwx2YWx1ZV9vcHRpb25hAw== +772B58414840:E1B:g3F3CGVybF9saW50dwtib29sX29wdGlvbmEE +772B58414850:E21:g3F3B3VuaWNvZGV3EmNoYXJhY3RlcnNfdG9fbGlzdGEB +772B58414860:E18:g3F3B29yZGRpY3R3CWZyb21fbGlzdGEB +772B58414870:E18:g3F3B29yZHNldHN3CWZyb21fbGlzdGEB +772B58414880:E19:g3F3B29yZHNldHN3CmlzX2VsZW1lbnRhAg== +772B58414890:E18:g3F3B2diX3NldHN3CWZyb21fbGlzdGEB +772B584148A0:E14:g3F3B2diX3NldHN3BWVtcHR5YQA= +772B584148B0:E12:g3F3B2diX3NldHN3A25ld2EA +772B584148C0:EF:g3F3BHNldHN3A25ld2EA +772B584148D0:E15:g3F3BWxpc3RzdwhtYXBmb2xkbGED +772B584148E0:E12:g3F3BWxpc3RzdwV1c29ydGEB +772B584148F0:E14:g3F3CGVybF9hbm5vdwRmaWxlYQE= +772B58414900:E18:g3F3CGVybF9hbm5vdwhzZXRfZmlsZWEC +772B58414910:E17:g3F3BHNldHN3C2FkZF9lbGVtZW50YQI= +772B58414920:E17:g3F3B29yZHNldHN3CHN1YnRyYWN0YQI= +772B58414930:E18:g3F3B2diX3NldHN3CWlzX21lbWJlcmEC +772B58414940:E25:g3F3DG90cF9pbnRlcm5hbHcRb2Jzb2xldGVfY2FsbGJhY2thAw== +772B58414950:E16:g3F3B2diX3NldHN3B3RvX2xpc3RhAQ== +772B58414960:E14:g3F3BHNvZnN3CHJlbGF0aW9uYQI= +772B58414970:E1E:g3F3BHNvZnN3EmZhbWlseV90b19yZWxhdGlvbmEB +772B58414980:E14:g3F3BHNvZnN3CGNvbnZlcnNlYQE= +772B58414990:E1E:g3F3BHNvZnN3EnJlbGF0aW9uX3RvX2ZhbWlseWEB +772B584149A0:E20:g3F3BHNvZnN3FGZhbWlseV9zcGVjaWZpY2F0aW9uYQI= +772B584149B0:E17:g3F3BHNvZnN3C3RvX2V4dGVybmFsYQE= +772B584149C0:E13:g3F3BWxpc3RzdwZmaWx0ZXJhAg== +772B584149D0:E14:g3F3B29yZHNldHN3BXVuaW9uYQI= +772B584149E0:E19:g3F3B2diX3NldHN3CmlzX2VsZW1lbnRhAg== +772B584149F0:E1A:g3F3B2diX3NldHN3C2FkZF9lbGVtZW50YQI= +772B58414A00:E19:g3F3BHNvZnN3DWZyb21fZXh0ZXJuYWxhAg== +772B58414A10:E18:g3F3BHNvZnN3DGRyZXN0cmljdGlvbmEC +772B58414A20:E17:g3F3B2diX3NldHN3CHN1YnRyYWN0YQI= +772B58414A30:E13:g3F3B2diX3NldHN3BGZvbGRhAw== +772B58414A40:E1C:g3F3DGVybF9pbnRlcm5hbHcIYXJpdGhfb3BhAg== +772B58414A50:E10:g3F3BWxpc3RzdwNhbnlhAg== +772B58414A60:E1C:g3F3CGVybF9iaXRzdwxzZXRfYml0X3R5cGVhAg== +772B58414A70:E1D:g3F3DGVybF9pbnRlcm5hbHcJdHlwZV90ZXN0YQI= +772B58414A80:E1D:g3F3DGVybF9pbnRlcm5hbHcJZ3VhcmRfYmlmYQI= +772B58414A90:E1B:g3F3DGVybF9pbnRlcm5hbHcHb3BfdHlwZWEC +772B58414AA0:E1A:g3F3B29yZHNldHN3C2FkZF9lbGVtZW50YQI= +772B58414AB0:E1B:g3F3DGVybF9pbnRlcm5hbHcHb2xkX2JpZmEC +772B58414AC0:E1E:g3F3BmlvX2xpYncQbGF0aW4xX2NoYXJfbGlzdGEB +772B58414AD0:E1D:g3F3CGVybF9hbm5vdw1zZXRfZ2VuZXJhdGVkYQI= +772B58414AE0:E13:g3F3BHNldHN3B3RvX2xpc3RhAQ== +772B58414AF0:E14:g3F3BHNvZnN3CHJlbGF0aW9uYQE= +772B58414B00:E13:g3F3BHNvZnN3B3JlbDJmYW1hAQ== +772B58414B10:E1D:g3F3BHNvZnN3EWZhbWlseV90b19kaWdyYXBoYQE= +772B58414B20:E1E:g3F3DWRpZ3JhcGhfdXRpbHN3CXJlYWNoYWJsZWEC +772B58414B30:E15:g3F3B2RpZ3JhcGh3BmRlbGV0ZWEB +772B58414B40:E16:g3F3BWxpc3RzdwlwYXJ0aXRpb25hAg== +772B58414B50:E12:g3F3BWxpc3RzdwVtZXJnZWEB +772B58414B60:E16:g3F3BWxpc3Rzdwlkcm9wd2hpbGVhAg== +772B58414B70:E11:g3F3BWxpc3RzdwRsYXN0YQE= +772B58414B80:E14:g3F3B29yZGRpY3R3BW1lcmdlYQM= +772B58414B90:E1C:g3F3DG90cF9pbnRlcm5hbHcIb2Jzb2xldGVhAw== +772B58414BA0:E21:g3F3DG90cF9pbnRlcm5hbHcNb2Jzb2xldGVfdHlwZWED +772B58414BB0:E21:g3F3DGVybF9pbnRlcm5hbHcNb2xkX3R5cGVfdGVzdGEC +772B58414BC0:E20:g3F3DGVybF9mZWF0dXJlc3cMY29uZmlndXJhYmxlYQA= +772B58414BD0:E12:g3F3BWxpc3RzdwVmb2xkcmED +772B58414BE0:E12:g3F3BnN0cmluZ3cEZmluZGEC +772B58414BF0:E1B:g3F3B29yZHNldHN3DGludGVyc2VjdGlvbmEC +772B58414C00:E1C:g3F3DGVybF9mZWF0dXJlc3cIa2V5d29yZHNhAQ== +772B58414C10:E15:g3F3B29yZGRpY3R3BmlzX2tleWEC +772B58414C20:E17:g3F3BHNvZnN3C25vX2VsZW1lbnRzYQE= +772B58414C30:E18:g3F3CGZpbGVuYW1ldwhiYXNlbmFtZWEB +772B58414C40:E1C:g3F3CWdlbl9ldmVudHcLbW9kdWxlX2luZm9hAQ== +772B58414C50:E1C:g3F3CWdlbl9ldmVudHcLbW9kdWxlX2luZm9hAA== +772B58414C60:E1F:g3F3CWdlbl9ldmVudHcOYmVoYXZpb3VyX2luZm9hAQ== +772B58414C70:E1E:g3F3CWdlbl9ldmVudHcNZm9ybWF0X3N0YXR1c2EC +772B58414C80:E25:g3F3CWdlbl9ldmVudHcUc3lzdGVtX3JlcGxhY2Vfc3RhdGVhAg== +772B58414C90:E21:g3F3CWdlbl9ldmVudHcQc3lzdGVtX2dldF9zdGF0ZWEB +772B58414CA0:E23:g3F3CWdlbl9ldmVudHcSc3lzdGVtX2NvZGVfY2hhbmdlYQQ= +772B58414CB0:E21:g3F3CWdlbl9ldmVudHcQc3lzdGVtX3Rlcm1pbmF0ZWEE +772B58414CC0:E20:g3F3CWdlbl9ldmVudHcPc3lzdGVtX2NvbnRpbnVlYQM= +772B58414CD0:E19:g3F3CWdlbl9ldmVudHcId2FrZV9oaWJhBQ== +772B58414CE0:E15:g3F3CWdlbl9ldmVudHcEc3RvcGED +772B58414CF0:E15:g3F3CWdlbl9ldmVudHcEc3RvcGEB +772B58414D00:E1F:g3F3CWdlbl9ldmVudHcOd2hpY2hfaGFuZGxlcnNhAQ== +772B58414D10:E21:g3F3CWdlbl9ldmVudHcQc3dhcF9zdXBfaGFuZGxlcmED +772B58414D20:E1D:g3F3CWdlbl9ldmVudHcMc3dhcF9oYW5kbGVyYQM= +772B58414D30:E1F:g3F3CWdlbl9ldmVudHcOZGVsZXRlX2hhbmRsZXJhAw== +772B58414D40:E1F:g3F3CWdlbl9ldmVudHcOcmVxaWRzX3RvX2xpc3RhAQ== +772B58414D50:E1B:g3F3CWdlbl9ldmVudHcKcmVxaWRzX2FkZGED +772B58414D60:E1C:g3F3CWdlbl9ldmVudHcLcmVxaWRzX3NpemVhAQ== +772B58414D70:E1B:g3F3CWdlbl9ldmVudHcKcmVxaWRzX25ld2EA +772B58414D80:E1F:g3F3CWdlbl9ldmVudHcOY2hlY2tfcmVzcG9uc2VhAw== +772B58414D90:E1F:g3F3CWdlbl9ldmVudHcOY2hlY2tfcmVzcG9uc2VhAg== +772B58414DA0:E21:g3F3CWdlbl9ldmVudHcQcmVjZWl2ZV9yZXNwb25zZWED +772B58414DB0:E21:g3F3CWdlbl9ldmVudHcQcmVjZWl2ZV9yZXNwb25zZWEC +772B58414DC0:E1E:g3F3CWdlbl9ldmVudHcNd2FpdF9yZXNwb25zZWED +772B58414DD0:E1E:g3F3CWdlbl9ldmVudHcNd2FpdF9yZXNwb25zZWEC +772B58414DE0:E1D:g3F3CWdlbl9ldmVudHcMc2VuZF9yZXF1ZXN0YQU= +772B58414DF0:E1D:g3F3CWdlbl9ldmVudHcMc2VuZF9yZXF1ZXN0YQM= +772B58414E00:E15:g3F3CWdlbl9ldmVudHcEY2FsbGEE +772B58414E10:E15:g3F3CWdlbl9ldmVudHcEY2FsbGED +772B58414E20:E1C:g3F3CWdlbl9ldmVudHcLc3luY19ub3RpZnlhAg== +772B58414E30:E17:g3F3CWdlbl9ldmVudHcGbm90aWZ5YQI= +772B58414E40:E20:g3F3CWdlbl9ldmVudHcPYWRkX3N1cF9oYW5kbGVyYQM= +772B58414E50:E1C:g3F3CWdlbl9ldmVudHcLYWRkX2hhbmRsZXJhAw== +772B58414E60:E18:g3F3CWdlbl9ldmVudHcHaW5pdF9pdGEG +772B58414E70:E1E:g3F3CWdlbl9ldmVudHcNc3RhcnRfbW9uaXRvcmEC +772B58414E80:E1E:g3F3CWdlbl9ldmVudHcNc3RhcnRfbW9uaXRvcmEB +772B58414E90:E1E:g3F3CWdlbl9ldmVudHcNc3RhcnRfbW9uaXRvcmEA +772B58414EA0:E1B:g3F3CWdlbl9ldmVudHcKc3RhcnRfbGlua2EC +772B58414EB0:E1B:g3F3CWdlbl9ldmVudHcKc3RhcnRfbGlua2EB +772B58414EC0:E1B:g3F3CWdlbl9ldmVudHcKc3RhcnRfbGlua2EA +772B58414ED0:E16:g3F3CWdlbl9ldmVudHcFc3RhcnRhAg== +772B58414EE0:E16:g3F3CWdlbl9ldmVudHcFc3RhcnRhAQ== +772B58414EF0:E16:g3F3CWdlbl9ldmVudHcFc3RhcnRhAA== +772B58414F00:E10:g3F3A2dlbncFc3RhcnRhBQ== +772B58414F10:E10:g3F3A2dlbncFc3RhcnRhBg== +772B58414F20:EF:g3F3A2dlbncEbmFtZWEB +772B58414F30:E18:g3F3A2dlbncNZGVidWdfb3B0aW9uc2EC +772B58414F40:E1A:g3F3A2dlbncPaGliZXJuYXRlX2FmdGVyYQE= +772B58414F50:E18:g3F3CHByb2NfbGlidwhpbml0X2Fja2EC +772B58414F60:E17:g3F3A2dlbncMc2VuZF9yZXF1ZXN0YQM= +772B58414F70:E17:g3F3A2dlbncMc2VuZF9yZXF1ZXN0YQU= +772B58414F80:E18:g3F3A2dlbncNd2FpdF9yZXNwb25zZWEC +772B58414F90:E18:g3F3A2dlbncNd2FpdF9yZXNwb25zZWED +772B58414FA0:E1B:g3F3A2dlbncQcmVjZWl2ZV9yZXNwb25zZWEC +772B58414FB0:E1B:g3F3A2dlbncQcmVjZWl2ZV9yZXNwb25zZWED +772B58414FC0:E19:g3F3A2dlbncOY2hlY2tfcmVzcG9uc2VhAg== +772B58414FD0:E19:g3F3A2dlbncOY2hlY2tfcmVzcG9uc2VhAw== +772B58414FE0:E15:g3F3A2dlbncKcmVxaWRzX25ld2EA +772B58414FF0:E16:g3F3A2dlbncLcmVxaWRzX3NpemVhAQ== +772B58415000:E15:g3F3A2dlbncKcmVxaWRzX2FkZGED +772B58415010:E19:g3F3A2dlbncOcmVxaWRzX3RvX2xpc3RhAQ== +772B58415020:EF:g3F3A2dlbncEc3RvcGEB +772B58415030:EF:g3F3A2dlbncEc3RvcGED +772B58415040:EF:g3F3A2dlbncEY2FsbGEE +772B58415050:EF:g3F3A2dlbncEY2FsbGED +772B58415060:E12:g3F3Bmdsb2JhbHcEc2VuZGEC +772B58415070:E19:g3F3CHByb2NfbGlidwloaWJlcm5hdGVhAw== +772B58415080:E1C:g3F3A3N5c3cRaGFuZGxlX3N5c3RlbV9tc2dhBw== +772B58415090:E17:g3F3A3N5c3cMaGFuZGxlX2RlYnVnYQQ= +772B584150A0:E10:g3F3A2dlbncFcmVwbHlhAg== +772B584150B0:EF:g3F3BWxpc3RzdwJ6ZmEC +772B584150C0:E12:g3F3BWxpc3RzdwV1bnppcGEB +772B584150D0:E13:g3F3BmxvZ2dlcncFYWxsb3dhAg== +772B584150E0:E17:g3F3BmxvZ2dlcncJbWFjcm9fbG9nYQQ= +772B584150F0:E18:g3F3A2dlbncNZm9ybWF0X3N0YXR1c2EE +772B58415100:E19:g3F3CHByb2NfbGlidwlnZXRfbGFiZWxhAQ== +772B58415110:E24:g3F3DGVycm9yX2xvZ2dlcncQZ2V0X2Zvcm1hdF9kZXB0aGEA +772B58415120:E18:g3F3BmlvX2xpYncKbGltaXRfdGVybWEC +772B58415130:E14:g3F3BmlvX2xpYncGZm9ybWF0YQM= +772B58415140:E15:g3F3BGNvZGV3CWlzX2xvYWRlZGEB +772B58415150:E16:g3F3B29yZHNldHN3B3RvX2xpc3RhAQ== +772B58415160:E1F:g3F3A2dlbncUZm9ybWF0X3N0YXR1c19oZWFkZXJhAg== +772B58415170:E12:g3F3A3N5c3cHZ2V0X2xvZ2EB +772B58415180:E20:g3F3DWxvZ2dlcl9zZXJ2ZXJ3C21vZHVsZV9pbmZvYQE= +772B58415190:E20:g3F3DWxvZ2dlcl9zZXJ2ZXJ3C21vZHVsZV9pbmZvYQA= +772B584151A0:E24:g3F3DWxvZ2dlcl9zZXJ2ZXJ3D2RvX2ludGVybmFsX2xvZ2EE +772B584151B0:E1E:g3F3DWxvZ2dlcl9zZXJ2ZXJ3CWRpZmZfbWFwc2EC +772B584151C0:E1E:g3F3DWxvZ2dlcl9zZXJ2ZXJ3CXRlcm1pbmF0ZWEC +772B584151D0:E20:g3F3DWxvZ2dlcl9zZXJ2ZXJ3C2hhbmRsZV9pbmZvYQI= +772B584151E0:E20:g3F3DWxvZ2dlcl9zZXJ2ZXJ3C2hhbmRsZV9jYXN0YQI= +772B584151F0:E20:g3F3DWxvZ2dlcl9zZXJ2ZXJ3C2hhbmRsZV9jYWxsYQM= +772B58415200:E19:g3F3DWxvZ2dlcl9zZXJ2ZXJ3BGluaXRhAQ== +772B58415210:E2C:g3F3DWxvZ2dlcl9zZXJ2ZXJ3F3VwZGF0ZV9mb3JtYXR0ZXJfY29uZmlnYQI= +772B58415220:E22:g3F3DWxvZ2dlcl9zZXJ2ZXJ3DXVwZGF0ZV9jb25maWdhAg== +772B58415230:E22:g3F3DWxvZ2dlcl9zZXJ2ZXJ3DXVwZGF0ZV9jb25maWdhAw== +772B58415240:E1F:g3F3DWxvZ2dlcl9zZXJ2ZXJ3CnNldF9jb25maWdhAg== +772B58415250:E1F:g3F3DWxvZ2dlcl9zZXJ2ZXJ3CnNldF9jb25maWdhAw== +772B58415260:E27:g3F3DWxvZ2dlcl9zZXJ2ZXJ3EnVuc2V0X21vZHVsZV9sZXZlbGEB +772B58415270:E27:g3F3DWxvZ2dlcl9zZXJ2ZXJ3EnVuc2V0X21vZHVsZV9sZXZlbGEA +772B58415280:E25:g3F3DWxvZ2dlcl9zZXJ2ZXJ3EHNldF9tb2R1bGVfbGV2ZWxhAg== +772B58415290:E22:g3F3DWxvZ2dlcl9zZXJ2ZXJ3DXJlbW92ZV9maWx0ZXJhAg== +772B584152A0:E1F:g3F3DWxvZ2dlcl9zZXJ2ZXJ3CmFkZF9maWx0ZXJhAg== +772B584152B0:E23:g3F3DWxvZ2dlcl9zZXJ2ZXJ3DnJlbW92ZV9oYW5kbGVyYQE= +772B584152C0:E20:g3F3DWxvZ2dlcl9zZXJ2ZXJ3C2FkZF9oYW5kbGVyYQM= +772B584152D0:E1F:g3F3DWxvZ2dlcl9zZXJ2ZXJ3CnN0YXJ0X2xpbmthAA== +772B584152E0:E1C:g3F3Cmdlbl9zZXJ2ZXJ3CnN0YXJ0X2xpbmthBA== +772B584152F0:E18:g3F3DWxvZ2dlcl9jb25maWd3A25ld2EB +772B58415300:E26:g3F3DGxvZ2dlcl9wcm94eXcSZ2V0X2RlZmF1bHRfY29uZmlnYQA= +772B58415310:E1B:g3F3DWxvZ2dlcl9jb25maWd3BmNyZWF0ZWED +772B58415320:E25:g3F3D2xvZ2dlcl9zaW1wbGVfaHcOYWRkaW5nX2hhbmRsZXJhAQ== +772B58415330:E10:g3F3BXF1ZXVldwNuZXdhAA== +772B58415340:E18:g3F3DWxvZ2dlcl9jb25maWd3A2dldGEC +772B58415350:E18:g3F3DWxvZ2dlcl9jb25maWd3A3NldGED +772B58415360:E1A:g3F3CmxvZ2dlcl9vbHB3CHNldF9vcHRzYQI= +772B58415370:E1A:g3F3DWxvZ2dlcl9jb25maWd3BWV4aXN0YQI= +772B58415380:E25:g3F3DWxvZ2dlcl9jb25maWd3EHNldF9tb2R1bGVfbGV2ZWxhAg== +772B58415390:E27:g3F3DWxvZ2dlcl9jb25maWd3EnVuc2V0X21vZHVsZV9sZXZlbGEB +772B584153A0:E11:g3F3BmxvZ2dlcncDbG9nYQQ= +772B584153B0:E11:g3F3BmxvZ2dlcncDbG9nYQM= +772B584153C0:E16:g3F3Cmdlbl9zZXJ2ZXJ3BGNhbGxhAw== +772B584153D0:E14:g3F3BWxpc3RzdwdrZXl0YWtlYQM= +772B584153E0:E1F:g3F3BmxvZ2dlcncRZmlsdGVyX3N0YWNrdHJhY2VhAg== +772B584153F0:EF:g3F3BXF1ZXVldwJpbmEC +772B58415400:E17:g3F3Cmdlbl9zZXJ2ZXJ3BXJlcGx5YQI= +772B58415410:E10:g3F3BXF1ZXVldwNvdXRhAQ== +772B58415420:E22:g3F3BmxvZ2dlcncUYWRkX2RlZmF1bHRfbWV0YWRhdGFhAQ== +772B58415430:E16:g3F3Cmdlbl9zZXJ2ZXJ3BGNhc3RhAg== +772B58415440:E1B:g3F3DWxvZ2dlcl9jb25maWd3BmRlbGV0ZWEC +772B58415450:E22:g3F3D2xvZ2dlcl9zaW1wbGVfaHcLbW9kdWxlX2luZm9hAQ== +772B58415460:E22:g3F3D2xvZ2dlcl9zaW1wbGVfaHcLbW9kdWxlX2luZm9hAA== +772B58415470:E1A:g3F3D2xvZ2dlcl9zaW1wbGVfaHcDbG9nYQI= +772B58415480:E27:g3F3D2xvZ2dlcl9zaW1wbGVfaHcQcmVtb3ZpbmdfaGFuZGxlcmEB +772B58415490:E17:g3F3BmxvZ2dlcncJdGltZXN0YW1wYQA= +772B584154A0:E20:g3F3BmxvZ2dlcncSZ2V0X2hhbmRsZXJfY29uZmlnYQE= +772B584154B0:E16:g3F3BWxpc3RzdwlkdXBsaWNhdGVhAg== +772B584154C0:E1E:g3F3EGxvZ2dlcl9mb3JtYXR0ZXJ3BmZvcm1hdGEC +772B584154D0:E18:g3F3BWxpc3Rzdwttb2R1bGVfaW5mb2EB +772B584154E0:E18:g3F3BWxpc3Rzdwttb2R1bGVfaW5mb2EA +772B584154F0:E11:g3F3BWxpc3RzdwR1bmlxYQI= +772B58415500:E11:g3F3BWxpc3RzdwR1bmlxYQE= +772B58415510:E11:g3F3BWxpc3RzdwRqb2luYQI= +772B58415520:E12:g3F3BWxpc3RzdwVzcGxpdGEC +772B58415530:E16:g3F3BWxpc3RzdwlzcGxpdHdpdGhhAg== +772B58415540:E13:g3F3BWxpc3RzdwZzZWFyY2hhAg== +772B58415550:E16:g3F3BWxpc3Rzdwl0YWtld2hpbGVhAg== +772B58415560:E15:g3F3BWxpc3RzdwhtYXBmb2xkcmED +772B58415570:E16:g3F3BWxpc3RzdwlmaWx0ZXJtYXBhAg== +772B58415580:E14:g3F3BWxpc3RzdwdmbGF0bWFwYQI= +772B58415590:E14:g3F3BWxpc3RzdwdydW1lcmdlYQI= +772B584155A0:E13:g3F3BWxpc3RzdwZ1bWVyZ2VhAg== +772B584155B0:E15:g3F3BWxpc3RzdwhydW1lcmdlM2ED +772B584155C0:E14:g3F3BWxpc3Rzdwd1bWVyZ2UzYQM= +772B584155D0:E13:g3F3BWxpc3RzdwZ1bWVyZ2VhAQ== +772B584155E0:E14:g3F3BWxpc3RzdwdydW1lcmdlYQM= +772B584155F0:E13:g3F3BWxpc3RzdwZ1bWVyZ2VhAw== +772B58415600:E12:g3F3BWxpc3RzdwV1c29ydGEC +772B58415610:E13:g3F3BWxpc3RzdwZybWVyZ2VhAw== +772B58415620:E12:g3F3BWxpc3RzdwVtZXJnZWED +772B58415630:E11:g3F3BWxpc3RzdwRzb3J0YQI= +772B58415640:E16:g3F3BWxpc3RzdwllbnVtZXJhdGVhAw== +772B58415650:E16:g3F3BWxpc3RzdwllbnVtZXJhdGVhAg== +772B58415660:E16:g3F3BWxpc3RzdwllbnVtZXJhdGVhAQ== +772B58415670:E13:g3F3BWxpc3RzdwZrZXltYXBhAw== +772B58415680:E17:g3F3BWxpc3RzdwpydWtleW1lcmdlYQM= +772B58415690:E16:g3F3BWxpc3Rzdwl1a2V5bWVyZ2VhAw== +772B584156A0:E15:g3F3BWxpc3Rzdwh1a2V5c29ydGEC +772B584156B0:E16:g3F3BWxpc3Rzdwlya2V5bWVyZ2VhAw== +772B584156C0:E15:g3F3BWxpc3RzdwhrZXltZXJnZWED +772B584156D0:E14:g3F3BWxpc3RzdwdrZXlzb3J0YQI= +772B584156E0:E15:g3F3BWxpc3RzdwhrZXlzdG9yZWEE +772B584156F0:E17:g3F3BWxpc3RzdwprZXlyZXBsYWNlYQQ= +772B58415700:E16:g3F3BWxpc3RzdwlrZXlkZWxldGVhAw== +772B58415710:E17:g3F3BWxpc3RzdwpmbGF0bGVuZ3RoYQE= +772B58415720:E14:g3F3BWxpc3RzdwdmbGF0dGVuYQI= +772B58415730:E13:g3F3BWxpc3RzdwZjb25jYXRhAQ== +772B58415740:E13:g3F3BWxpc3RzdwZybWVyZ2VhAg== +772B58415750:E12:g3F3BWxpc3RzdwVtZXJnZWEC +772B58415760:E14:g3F3BWxpc3RzdwdybWVyZ2UzYQM= +772B58415770:E13:g3F3BWxpc3RzdwZtZXJnZTNhAw== +772B58415780:E15:g3F3BWxpc3Rzdwh6aXB3aXRoM2EF +772B58415790:E15:g3F3BWxpc3Rzdwh6aXB3aXRoM2EE +772B584157A0:E14:g3F3BWxpc3Rzdwd6aXB3aXRoYQQ= +772B584157B0:E14:g3F3BWxpc3Rzdwd6aXB3aXRoYQM= +772B584157C0:E13:g3F3BWxpc3RzdwZ1bnppcDNhAQ== +772B584157D0:E11:g3F3BWxpc3RzdwR6aXAzYQQ= +772B584157E0:E11:g3F3BWxpc3RzdwR6aXAzYQM= +772B584157F0:E10:g3F3BWxpc3RzdwN6aXBhAw== +772B58415800:E10:g3F3BWxpc3RzdwN6aXBhAg== +772B58415810:E14:g3F3BWxpc3RzdwdzdWJsaXN0YQI= +772B58415820:E14:g3F3BWxpc3RzdwdzdWJsaXN0YQM= +772B58415830:E10:g3F3BWxpc3RzdwNtYXhhAQ== +772B58415840:E10:g3F3BWxpc3RzdwNtaW5hAQ== +772B58415850:E10:g3F3BWxpc3RzdwNzdW1hAQ== +772B58415860:E10:g3F3BWxpc3RzdwNzZXFhAw== +772B58415870:E15:g3F3BWxpc3Rzdwhkcm9wbGFzdGEB +772B58415880:E13:g3F3BWxpc3RzdwZzdWZmaXhhAg== +772B58415890:E13:g3F3BWxpc3RzdwZwcmVmaXhhAg== +772B584158A0:E14:g3F3BWxpc3RzdwdudGh0YWlsYQI= +772B584158B0:E15:g3F3BWxpc3RzdwhzdWJ0cmFjdGEC +772B584158C0:E13:g3F3BWxpc3RzdwZhcHBlbmRhAg== +772B584158D0:E1D:g3F3CnN1cGVydmlzb3J3C21vZHVsZV9pbmZvYQE= +772B584158E0:E1D:g3F3CnN1cGVydmlzb3J3C21vZHVsZV9pbmZvYQA= +772B584158F0:E20:g3F3CnN1cGVydmlzb3J3DmJlaGF2aW91cl9pbmZvYQE= +772B58415900:E1D:g3F3CnN1cGVydmlzb3J3C2NvZGVfY2hhbmdlYQM= +772B58415910:E1B:g3F3CnN1cGVydmlzb3J3CXRlcm1pbmF0ZWEC +772B58415920:E1D:g3F3CnN1cGVydmlzb3J3C2hhbmRsZV9pbmZvYQI= +772B58415930:E1D:g3F3CnN1cGVydmlzb3J3C2hhbmRsZV9jYXN0YQI= +772B58415940:E1D:g3F3CnN1cGVydmlzb3J3C2hhbmRsZV9jYWxsYQM= +772B58415950:E16:g3F3CnN1cGVydmlzb3J3BGluaXRhAQ== +772B58415960:E25:g3F3CnN1cGVydmlzb3J3E2dldF9jYWxsYmFja19tb2R1bGVhAQ== +772B58415970:E22:g3F3CnN1cGVydmlzb3J3EGNoZWNrX2NoaWxkc3BlY3NhAg== +772B58415980:E22:g3F3CnN1cGVydmlzb3J3EGNoZWNrX2NoaWxkc3BlY3NhAQ== +772B58415990:E20:g3F3CnN1cGVydmlzb3J3DmNvdW50X2NoaWxkcmVuYQE= +772B584159A0:E20:g3F3CnN1cGVydmlzb3J3DndoaWNoX2NoaWxkcmVuYQE= +772B584159B0:E1F:g3F3CnN1cGVydmlzb3J3DWdldF9jaGlsZHNwZWNhAg== +772B584159C0:E21:g3F3CnN1cGVydmlzb3J3D3Rlcm1pbmF0ZV9jaGlsZGEC +772B584159D0:E1E:g3F3CnN1cGVydmlzb3J3DGRlbGV0ZV9jaGlsZGEC +772B584159E0:E1F:g3F3CnN1cGVydmlzb3J3DXJlc3RhcnRfY2hpbGRhAg== +772B584159F0:E1D:g3F3CnN1cGVydmlzb3J3C3N0YXJ0X2NoaWxkYQI= +772B58415A00:E1C:g3F3CnN1cGVydmlzb3J3CnN0YXJ0X2xpbmthAw== +772B58415A10:E1C:g3F3CnN1cGVydmlzb3J3CnN0YXJ0X2xpbmthAg== +772B58415A20:E1C:g3F3Cmdlbl9zZXJ2ZXJ3CnN0YXJ0X2xpbmthAw== +772B58415A30:E15:g3F3A3N5c3cKZ2V0X3N0YXR1c2EB +772B58415A40:E17:g3F3BmxvZ2dlcncJbWFjcm9fbG9nYQU= +772B58415A50:E17:g3F3BG1hcHN3C3VwZGF0ZV93aXRoYQM= +772B58415A60:E16:g3F3A2V0c3cLbW9kdWxlX2luZm9hAQ== +772B58415A70:E16:g3F3A2V0c3cLbW9kdWxlX2luZm9hAA== +772B58415A80:EC:g3F3A2V0c3cBaWED +772B58415A90:EC:g3F3A2V0c3cBaWEC +772B58415AA0:EC:g3F3A2V0c3cBaWEB +772B58415AB0:EC:g3F3A2V0c3cBaWEA +772B58415AC0:E10:g3F3A2V0c3cFdGFibGVhAg== +772B58415AD0:E10:g3F3A2V0c3cFdGFibGVhAQ== +772B58415AE0:E17:g3F3A2V0c3cMdGFiZmlsZV9pbmZvYQE= +772B58415AF0:E13:g3F3A2V0c3cIZmlsZTJ0YWJhAg== +772B58415B00:E13:g3F3A2V0c3cIZmlsZTJ0YWJhAQ== +772B58415B10:E13:g3F3A2V0c3cIdGFiMmZpbGVhAw== +772B58415B20:E13:g3F3A2V0c3cIdGFiMmZpbGVhAg== +772B58415B30:E13:g3F3A2V0c3cIdGFiMmxpc3RhAQ== +772B58415B40:E17:g3F3A2V0c3cMbWF0Y2hfZGVsZXRlYQI= +772B58415B50:E15:g3F3A2V0c3cKaW5pdF90YWJsZWEC +772B58415B60:E12:g3F3A2V0c3cHdGVzdF9tc2EC +772B58415B70:E12:g3F3A2V0c3cHdG9fZGV0c2EC +772B58415B80:E14:g3F3A2V0c3cJZnJvbV9kZXRzYQI= +772B58415B90:E10:g3F3A2V0c3cFZm9sZHJhAw== +772B58415BA0:E10:g3F3A2V0c3cFZm9sZGxhAw== +772B58415BB0:E11:g3F3A2V0c3cGZnVuMm1zYQE= +772B58415BC0:E1E:g3F3A2V0c3cTcmVwYWlyX2NvbnRpbnVhdGlvbmEC +772B58415BD0:E19:g3F3A2V0c3cObWF0Y2hfc3BlY19ydW5hAg== +772B58415BE0:E18:g3F3A2V0c3cNc2VsZWN0X2RlbGV0ZWEC +772B58415BF0:E1D:g3F3A2V0c3cSZGVsZXRlX2FsbF9vYmplY3RzYQE= +772B58415C00:EE:g3F3A2V0c3cDYWxsYQA= +772B58415C10:E28:g3F3DG1zX3RyYW5zZm9ybXcUdHJhbnNmb3JtX2Zyb21fc2hlbGxhAw== +772B58415C20:E20:g3F3DG1zX3RyYW5zZm9ybXcMZm9ybWF0X2Vycm9yYQE= +772B58415C30:E10:g3F3AmlvdwZmb3JtYXRhAg== +772B58415C40:E12:g3F3BGRldHN3BnRvX2V0c2EC +772B58415C50:E14:g3F3BGRldHN3CGZyb21fZXRzYQI= +772B58415C60:E12:g3F3BGZpbGV3BmRlbGV0ZWEB +772B58415C70:E1A:g3F3BGZpbGV3DnJlYWRfZmlsZV9pbmZvYQE= +772B58415C80:E14:g3F3CGRpc2tfbG9ndwRvcGVuYQE= +772B58415C90:E14:g3F3CGRpc2tfbG9ndwRzeW5jYQE= +772B58415CA0:E15:g3F3CGRpc2tfbG9ndwVjbG9zZWEB +772B58415CB0:E16:g3F3CGRpc2tfbG9ndwZiY2h1bmthAw== +772B58415CC0:E15:g3F3CGRpc2tfbG9ndwVjaHVua2ED +772B58415CD0:E10:g3F3A3FsY3cFdGFibGVhAg== +772B58415CE0:E10:g3F3AmlvdwZmb3JtYXRhAQ== +772B58415CF0:E13:g3F3AmlvdwlwdXRfY2hhcnNhAQ== +772B58415D00:E12:g3F3AmlvdwhnZXRfbGluZWEB +772B58415D10:E12:g3F3BnN0cmluZ3cEdHJpbWED +772B58415D20:E13:g3F3BnN0cmluZ3cFc2xpY2VhAw== +772B58415D30:E1A:g3F3CGRpc2tfbG9ndwpibG9nX3Rlcm1zYQI= +772B58415D40:E19:g3F3CGRpc2tfbG9ndwlsb2dfdGVybXNhAg== +772B58415D50:E1B:g3F3CHByb2NfbGlidwttb2R1bGVfaW5mb2EB +772B58415D60:E1B:g3F3CHByb2NfbGlidwttb2R1bGVfaW5mb2EA +772B58415D70:E14:g3F3CHByb2NfbGlidwRzdG9wYQM= +772B58415D80:E14:g3F3CHByb2NfbGlidwRzdG9wYQE= +772B58415D90:E16:g3F3CHByb2NfbGlidwZmb3JtYXRhAw== +772B58415DA0:E16:g3F3CHByb2NfbGlidwZmb3JtYXRhAg== +772B58415DB0:E16:g3F3CHByb2NfbGlidwZmb3JtYXRhAQ== +772B58415DC0:E19:g3F3CHByb2NfbGlidwlzZXRfbGFiZWxhAQ== +772B58415DD0:E26:g3F3CHByb2NfbGlidxZ0cmFuc2xhdGVfaW5pdGlhbF9jYWxsYQE= +772B58415DE0:E1C:g3F3CHByb2NfbGlidwxpbml0aWFsX2NhbGxhAQ== +772B58415DF0:E19:g3F3CHByb2NfbGlidwlpbml0X2ZhaWxhAg== +772B58415E00:E19:g3F3CHByb2NfbGlidwlpbml0X2ZhaWxhAw== +772B58415E10:E18:g3F3CHByb2NfbGlidwhpbml0X2Fja2EB +772B58415E20:E1D:g3F3CHByb2NfbGlidw1zdGFydF9tb25pdG9yYQU= +772B58415E30:E1D:g3F3CHByb2NfbGlidw1zdGFydF9tb25pdG9yYQQ= +772B58415E40:E1D:g3F3CHByb2NfbGlidw1zdGFydF9tb25pdG9yYQM= +772B58415E50:E1A:g3F3CHByb2NfbGlidwpzdGFydF9saW5rYQU= +772B58415E60:E1A:g3F3CHByb2NfbGlidwpzdGFydF9saW5rYQQ= +772B58415E70:E1A:g3F3CHByb2NfbGlidwpzdGFydF9saW5rYQM= +772B58415E80:E15:g3F3CHByb2NfbGlidwVzdGFydGEF +772B58415E90:E15:g3F3CHByb2NfbGlidwVzdGFydGEE +772B58415EA0:E15:g3F3CHByb2NfbGlidwVzdGFydGED +772B58415EB0:E17:g3F3CHByb2NfbGlidwd3YWtlX3VwYQM= +772B58415EC0:E16:g3F3CHByb2NfbGlidwZpbml0X3BhBQ== +772B58415ED0:E16:g3F3CHByb2NfbGlidwZpbml0X3BhAw== +772B58415EE0:E19:g3F3CHByb2NfbGlidwlzcGF3bl9vcHRhBQ== +772B58415EF0:E19:g3F3CHByb2NfbGlidwlzcGF3bl9vcHRhBA== +772B58415F00:E19:g3F3CHByb2NfbGlidwlzcGF3bl9vcHRhAw== +772B58415F10:E19:g3F3CHByb2NfbGlidwlzcGF3bl9vcHRhAg== +772B58415F20:E1A:g3F3CHByb2NfbGlidwpzcGF3bl9saW5rYQQ= +772B58415F30:E1A:g3F3CHByb2NfbGlidwpzcGF3bl9saW5rYQI= +772B58415F40:E15:g3F3CHByb2NfbGlidwVzcGF3bmEE +772B58415F50:E15:g3F3CHByb2NfbGlidwVzcGF3bmEC +772B58415F60:E1A:g3F3CHByb2NfbGlidwpzcGF3bl9saW5rYQM= +772B58415F70:E1A:g3F3CHByb2NfbGlidwpzcGF3bl9saW5rYQE= +772B58415F80:E15:g3F3CHByb2NfbGlidwVzcGF3bmED +772B58415F90:E15:g3F3CHByb2NfbGlidwVzcGF3bmEB +772B58415FA0:EC:g3F3AWN3A3BpZGED +772B58415FB0:E1E:g3F3DGVycm9yX2xvZ2dlcncKbGltaXRfdGVybWEB +772B58415FC0:EF:g3F3A3JwY3cEY2FsbGEE +772B58415FD0:E21:g3F3CWVybF9lcnJvcncQZm9ybWF0X2V4Y2VwdGlvbmEI +772B58415FE0:E22:g3F3BmlvX2xpYncUd3JpdGVfYXRvbV9hc19sYXRpbjFhAQ== +772B58415FF0:E14:g3F3BnN0cmluZ3cGbGVuZ3RoYQE= +772B58416000:E14:g3F3A3N5c3cJdGVybWluYXRlYQM= +772B58416010:E1D:g3F3Cmdlbl9zZXJ2ZXJ3C21vZHVsZV9pbmZvYQE= +772B58416020:E1D:g3F3Cmdlbl9zZXJ2ZXJ3C21vZHVsZV9pbmZvYQA= +772B58416030:E20:g3F3Cmdlbl9zZXJ2ZXJ3DmJlaGF2aW91cl9pbmZvYQE= +772B58416040:E1F:g3F3Cmdlbl9zZXJ2ZXJ3DWZvcm1hdF9zdGF0dXNhAg== +772B58416050:E26:g3F3Cmdlbl9zZXJ2ZXJ3FHN5c3RlbV9yZXBsYWNlX3N0YXRlYQI= +772B58416060:E22:g3F3Cmdlbl9zZXJ2ZXJ3EHN5c3RlbV9nZXRfc3RhdGVhAQ== +772B58416070:E24:g3F3Cmdlbl9zZXJ2ZXJ3EnN5c3RlbV9jb2RlX2NoYW5nZWEE +772B58416080:E22:g3F3Cmdlbl9zZXJ2ZXJ3EHN5c3RlbV90ZXJtaW5hdGVhBA== +772B58416090:E21:g3F3Cmdlbl9zZXJ2ZXJ3D3N5c3RlbV9jb250aW51ZWED +772B584160A0:E1A:g3F3Cmdlbl9zZXJ2ZXJ3CHdha2VfaGliYQY= +772B584160B0:E19:g3F3Cmdlbl9zZXJ2ZXJ3B2luaXRfaXRhBg== +772B584160C0:E1C:g3F3Cmdlbl9zZXJ2ZXJ3CmVudGVyX2xvb3BhBQ== +772B584160D0:E1C:g3F3Cmdlbl9zZXJ2ZXJ3CmVudGVyX2xvb3BhBA== +772B584160E0:E1C:g3F3Cmdlbl9zZXJ2ZXJ3CmVudGVyX2xvb3BhAw== +772B584160F0:E1C:g3F3Cmdlbl9zZXJ2ZXJ3Cm11bHRpX2NhbGxhBA== +772B58416100:E1C:g3F3Cmdlbl9zZXJ2ZXJ3Cm11bHRpX2NhbGxhAw== +772B58416110:E1C:g3F3Cmdlbl9zZXJ2ZXJ3Cm11bHRpX2NhbGxhAg== +772B58416120:E18:g3F3Cmdlbl9zZXJ2ZXJ3BmFiY2FzdGED +772B58416130:E18:g3F3Cmdlbl9zZXJ2ZXJ3BmFiY2FzdGEC +772B58416140:E20:g3F3Cmdlbl9zZXJ2ZXJ3DnJlcWlkc190b19saXN0YQE= +772B58416150:E1C:g3F3Cmdlbl9zZXJ2ZXJ3CnJlcWlkc19hZGRhAw== +772B58416160:E1D:g3F3Cmdlbl9zZXJ2ZXJ3C3JlcWlkc19zaXplYQE= +772B58416170:E1C:g3F3Cmdlbl9zZXJ2ZXJ3CnJlcWlkc19uZXdhAA== +772B58416180:E20:g3F3Cmdlbl9zZXJ2ZXJ3DmNoZWNrX3Jlc3BvbnNlYQM= +772B58416190:E20:g3F3Cmdlbl9zZXJ2ZXJ3DmNoZWNrX3Jlc3BvbnNlYQI= +772B584161A0:E22:g3F3Cmdlbl9zZXJ2ZXJ3EHJlY2VpdmVfcmVzcG9uc2VhAw== +772B584161B0:E22:g3F3Cmdlbl9zZXJ2ZXJ3EHJlY2VpdmVfcmVzcG9uc2VhAg== +772B584161C0:E1F:g3F3Cmdlbl9zZXJ2ZXJ3DXdhaXRfcmVzcG9uc2VhAw== +772B584161D0:E1F:g3F3Cmdlbl9zZXJ2ZXJ3DXdhaXRfcmVzcG9uc2VhAg== +772B584161E0:E1E:g3F3Cmdlbl9zZXJ2ZXJ3DHNlbmRfcmVxdWVzdGEE +772B584161F0:E1E:g3F3Cmdlbl9zZXJ2ZXJ3DHNlbmRfcmVxdWVzdGEC +772B58416200:E16:g3F3Cmdlbl9zZXJ2ZXJ3BGNhbGxhAg== +772B58416210:E16:g3F3Cmdlbl9zZXJ2ZXJ3BHN0b3BhAw== +772B58416220:E16:g3F3Cmdlbl9zZXJ2ZXJ3BHN0b3BhAQ== +772B58416230:E1F:g3F3Cmdlbl9zZXJ2ZXJ3DXN0YXJ0X21vbml0b3JhBA== +772B58416240:E1F:g3F3Cmdlbl9zZXJ2ZXJ3DXN0YXJ0X21vbml0b3JhAw== +772B58416250:E17:g3F3Cmdlbl9zZXJ2ZXJ3BXN0YXJ0YQQ= +772B58416260:E17:g3F3Cmdlbl9zZXJ2ZXJ3BXN0YXJ0YQM= +772B58416270:E18:g3F3A2dlbncNZ2V0X3Byb2NfbmFtZWEB +772B58416280:E15:g3F3A2dlbncKZ2V0X3BhcmVudGEA +772B58416290:E1A:g3F3A2dlbncPdW5yZWdpc3Rlcl9uYW1lYQE= +772B584162A0:E1B:g3F3CGZpbGVuYW1ldwttb2R1bGVfaW5mb2EB +772B584162B0:E1B:g3F3CGZpbGVuYW1ldwttb2R1bGVfaW5mb2EA +772B584162C0:E18:g3F3CGZpbGVuYW1ldwh2YWxpZGF0ZWEB +772B584162D0:E17:g3F3CGZpbGVuYW1ldwdiYXNlZGlyYQM= +772B584162E0:E17:g3F3CGZpbGVuYW1ldwdiYXNlZGlyYQI= +772B584162F0:E17:g3F3CGZpbGVuYW1ldwdmbGF0dGVuYQE= +772B58416300:E1A:g3F3CGZpbGVuYW1ldwpuYXRpdmVuYW1lYQE= +772B58416310:E15:g3F3CGZpbGVuYW1ldwVzcGxpdGEB +772B58416320:E18:g3F3CGZpbGVuYW1ldwhyb290bmFtZWEC +772B58416330:E18:g3F3CGZpbGVuYW1ldwhyb290bmFtZWEB +772B58416340:E18:g3F3CGZpbGVuYW1ldwhwYXRodHlwZWEB +772B58416350:E16:g3F3CGZpbGVuYW1ldwZhcHBlbmRhAg== +772B58416360:E14:g3F3CGZpbGVuYW1ldwRqb2luYQI= +772B58416370:E14:g3F3CGZpbGVuYW1ldwRqb2luYQE= +772B58416380:E19:g3F3CGZpbGVuYW1ldwlleHRlbnNpb25hAQ== +772B58416390:E17:g3F3CGZpbGVuYW1ldwdkaXJuYW1lYQE= +772B584163A0:E18:g3F3CGZpbGVuYW1ldwhiYXNlbmFtZWEC +772B584163B0:E1C:g3F3CGZpbGVuYW1ldwxhYnNuYW1lX2pvaW5hAg== +772B584163C0:E17:g3F3CGZpbGVuYW1ldwdhYnNuYW1lYQE= +772B584163D0:E13:g3F3BGZpbGV3B2dldF9jd2RhAA== +772B584163E0:E13:g3F3BGZpbGV3B2dldF9jd2RhAQ== +772B584163F0:EE:g3F3Am9zdwR0eXBlYQA= +772B58416400:E15:g3F3BmJpbmFyeXcHcmVwbGFjZWEE +772B58416410:E15:g3F3BnN0cmluZ3cHbGV4ZW1lc2EC +772B58416420:E20:g3F3DWxvZ2dlcl9jb25maWd3C21vZHVsZV9pbmZvYQE= +772B58416430:E20:g3F3DWxvZ2dlcl9jb25maWd3C21vZHVsZV9pbmZvYQA= +772B58416440:E21:g3F3DWxvZ2dlcl9jb25maWd3DGxldmVsX3RvX2ludGEB +772B58416450:E25:g3F3DWxvZ2dlcl9jb25maWd3EGdldF9tb2R1bGVfbGV2ZWxhAA== +772B58416460:E18:g3F3DWxvZ2dlcl9jb25maWd3A2dldGED +772B58416470:E1A:g3F3DWxvZ2dlcl9jb25maWd3BWFsbG93YQE= +772B58416480:E1A:g3F3DWxvZ2dlcl9jb25maWd3BWFsbG93YQI= +772B58416490:E16:g3F3A2dlbncLbW9kdWxlX2luZm9hAQ== +772B584164A0:E16:g3F3A2dlbncLbW9kdWxlX2luZm9hAA== +772B584164B0:E22:g3F3A2dlbncXQHdhaXRfcmVzcG9uc2VfcmVjdl9vcHRhAw== +772B584164C0:E12:g3F3A2dlbncHaW5pdF9pdGEH +772B584164D0:E12:g3F3A2dlbncHaW5pdF9pdGEG +772B584164E0:E1A:g3F3Bmdsb2JhbHcMd2hlcmVpc19uYW1lYQE= +772B584164F0:E1B:g3F3Bmdsb2JhbHcNcmVnaXN0ZXJfbmFtZWEC +772B58416500:E1D:g3F3Bmdsb2JhbHcPdW5yZWdpc3Rlcl9uYW1lYQE= +772B58416510:E18:g3F3A3N5c3cNZGVidWdfb3B0aW9uc2EB +772B58416520:E1A:g3F3DGVycm9yX2xvZ2dlcncGZm9ybWF0YQI= +772B58416530:E29:g3F3FmFwcGxpY2F0aW9uX2NvbnRyb2xsZXJ3C21vZHVsZV9pbmZvYQE= +772B58416540:E29:g3F3FmFwcGxpY2F0aW9uX2NvbnRyb2xsZXJ3C21vZHVsZV9pbmZvYQA= +772B58416550:E2E:g3F3FmFwcGxpY2F0aW9uX2NvbnRyb2xsZXJ3EHRlc3RfY2hhbmdlX2FwcHNhAg== +772B58416560:E2C:g3F3FmFwcGxpY2F0aW9uX2NvbnRyb2xsZXJ3DmRvX2NvbmZpZ19kaWZmYQI= +772B58416570:E28:g3F3FmFwcGxpY2F0aW9uX2NvbnRyb2xsZXJ3CmdldF9sb2FkZWRhAQ== +772B58416580:E29:g3F3FmFwcGxpY2F0aW9uX2NvbnRyb2xsZXJ3C2NvZGVfY2hhbmdlYQM= +772B58416590:E27:g3F3FmFwcGxpY2F0aW9uX2NvbnRyb2xsZXJ3CXRlcm1pbmF0ZWEC +772B584165A0:E29:g3F3FmFwcGxpY2F0aW9uX2NvbnRyb2xsZXJ3C2hhbmRsZV9pbmZvYQI= +772B584165B0:E29:g3F3FmFwcGxpY2F0aW9uX2NvbnRyb2xsZXJ3C2hhbmRsZV9jYXN0YQI= +772B584165C0:E29:g3F3FmFwcGxpY2F0aW9uX2NvbnRyb2xsZXJ3C2hhbmRsZV9jYWxsYQM= +772B584165D0:E27:g3F3FmFwcGxpY2F0aW9uX2NvbnRyb2xsZXJ3CXVuc2V0X2VudmED +772B584165E0:E27:g3F3FmFwcGxpY2F0aW9uX2NvbnRyb2xsZXJ3CXVuc2V0X2VudmEC +772B584165F0:E25:g3F3FmFwcGxpY2F0aW9uX2NvbnRyb2xsZXJ3B3NldF9lbnZhBA== +772B58416600:E25:g3F3FmFwcGxpY2F0aW9uX2NvbnRyb2xsZXJ3B3NldF9lbnZhAw== +772B58416610:E25:g3F3FmFwcGxpY2F0aW9uX2NvbnRyb2xsZXJ3B3NldF9lbnZhAg== +772B58416620:E30:g3F3FmFwcGxpY2F0aW9uX2NvbnRyb2xsZXJ3EnBlcm1pdF9hcHBsaWNhdGlvbmEC +772B58416630:E34:g3F3FmFwcGxpY2F0aW9uX2NvbnRyb2xsZXJ3FmdldF9hcHBsaWNhdGlvbl9tb2R1bGVhAQ== +772B58416640:E2D:g3F3FmFwcGxpY2F0aW9uX2NvbnRyb2xsZXJ3D2dldF9hcHBsaWNhdGlvbmEB +772B58416650:E28:g3F3FmFwcGxpY2F0aW9uX2NvbnRyb2xsZXJ3CmdldF9tYXN0ZXJhAQ== +772B58416660:E28:g3F3FmFwcGxpY2F0aW9uX2NvbnRyb2xsZXJ3CnN0YXJ0X3R5cGVhAQ== +772B58416670:E29:g3F3FmFwcGxpY2F0aW9uX2NvbnRyb2xsZXJ3C2dldF9hbGxfa2V5YQE= +772B58416680:E2D:g3F3FmFwcGxpY2F0aW9uX2NvbnRyb2xsZXJ3D2dldF9waWRfYWxsX2tleWEB +772B58416690:E25:g3F3FmFwcGxpY2F0aW9uX2NvbnRyb2xsZXJ3B2dldF9rZXlhAg== +772B584166A0:E29:g3F3FmFwcGxpY2F0aW9uX2NvbnRyb2xsZXJ3C2dldF9waWRfa2V5YQI= +772B584166B0:E29:g3F3FmFwcGxpY2F0aW9uX2NvbnRyb2xsZXJ3C2dldF9hbGxfZW52YQE= +772B584166C0:E2D:g3F3FmFwcGxpY2F0aW9uX2NvbnRyb2xsZXJ3D2dldF9waWRfYWxsX2VudmEB +772B584166D0:E25:g3F3FmFwcGxpY2F0aW9uX2NvbnRyb2xsZXJ3B2dldF9lbnZhAw== +772B584166E0:E25:g3F3FmFwcGxpY2F0aW9uX2NvbnRyb2xsZXJ3B2dldF9lbnZhAg== +772B584166F0:E29:g3F3FmFwcGxpY2F0aW9uX2NvbnRyb2xsZXJ3C2dldF9waWRfZW52YQI= +772B58416700:E2B:g3F3FmFwcGxpY2F0aW9uX2NvbnRyb2xsZXJ3DWNvbmZpZ19jaGFuZ2VhAQ== +772B58416710:E30:g3F3FmFwcGxpY2F0aW9uX2NvbnRyb2xsZXJ3EnByZXBfY29uZmlnX2NoYW5nZWEA +772B58416720:E35:g3F3FmFwcGxpY2F0aW9uX2NvbnRyb2xsZXJ3F2NoYW5nZV9hcHBsaWNhdGlvbl9kYXRhYQI= +772B58416730:E31:g3F3FmFwcGxpY2F0aW9uX2NvbnRyb2xsZXJ3E2NvbnRyb2xfYXBwbGljYXRpb25hAQ== +772B58416740:E22:g3F3FmFwcGxpY2F0aW9uX2NvbnRyb2xsZXJ3BGluZm9hAA== +772B58416750:E31:g3F3FmFwcGxpY2F0aW9uX2NvbnRyb2xsZXJ3E2xvYWRlZF9hcHBsaWNhdGlvbnNhAA== +772B58416760:E30:g3F3FmFwcGxpY2F0aW9uX2NvbnRyb2xsZXJ3EndoaWNoX2FwcGxpY2F0aW9uc2EB +772B58416770:E30:g3F3FmFwcGxpY2F0aW9uX2NvbnRyb2xsZXJ3EndoaWNoX2FwcGxpY2F0aW9uc2EA +772B58416780:E2E:g3F3FmFwcGxpY2F0aW9uX2NvbnRyb2xsZXJ3EHN0b3BfYXBwbGljYXRpb25hAQ== +772B58416790:E34:g3F3FmFwcGxpY2F0aW9uX2NvbnRyb2xsZXJ3FnN0YXJ0X2Jvb3RfYXBwbGljYXRpb25hAg== +772B584167A0:E28:g3F3FmFwcGxpY2F0aW9uX2NvbnRyb2xsZXJ3CmlzX3J1bm5pbmdhAQ== +772B584167B0:E37:g3F3FmFwcGxpY2F0aW9uX2NvbnRyb2xsZXJ3GXN0YXJ0X2FwcGxpY2F0aW9uX3JlcXVlc3RhAg== +772B584167C0:E2F:g3F3FmFwcGxpY2F0aW9uX2NvbnRyb2xsZXJ3EXN0YXJ0X2FwcGxpY2F0aW9uYQI= +772B584167D0:E30:g3F3FmFwcGxpY2F0aW9uX2NvbnRyb2xsZXJ3EnVubG9hZF9hcHBsaWNhdGlvbmEB +772B584167E0:E2E:g3F3FmFwcGxpY2F0aW9uX2NvbnRyb2xsZXJ3EGxvYWRfYXBwbGljYXRpb25hAQ== +772B584167F0:E23:g3F3FmFwcGxpY2F0aW9uX2NvbnRyb2xsZXJ3BXN0YXJ0YQE= +772B58416800:E17:g3F3C2FwcGxpY2F0aW9udwRsb2FkYQE= +772B58416810:E1A:g3F3C2FwcGxpY2F0aW9udwdnZXRfZW52YQI= +772B58416820:E1A:g3F3C2FwcGxpY2F0aW9udwdnZXRfa2V5YQI= +772B58416830:E24:g3F3EmFwcGxpY2F0aW9uX21hc3RlcncKc3RhcnRfbGlua2EC +772B58416840:E1E:g3F3EmFwcGxpY2F0aW9uX21hc3RlcncEc3RvcGEB +772B58416850:E19:g3F3BGNvZGV3DXdoZXJlX2lzX2ZpbGVhAQ== +772B58416860:E18:g3F3BGZpbGV3DGZvcm1hdF9lcnJvcmEB +772B58416870:E1E:g3F3C2FwcGxpY2F0aW9udwtnZXRfYWxsX2VudmEB +772B58416880:E25:g3F3B3VuaWNvZGV3FmNoYXJhY3RlcnNfdG9fbmZjX2xpc3RhAQ== +772B58416890:E24:g3F3A2VwcHcZcmVhZF9lbmNvZGluZ19mcm9tX2JpbmFyeWEB +772B584168A0:E1C:g3F3BmlvX2xpYncOcHJpbnRhYmxlX2xpc3RhAQ== +772B584168B0:E17:g3F3BmxvZ2dlcncJbWFjcm9fbG9nYQM= +772B584168C0:E10:g3F3BGZpbGV3BHJlYWRhAg== +772B584168D0:E21:g3F3DmxvZ2dlcl9maWx0ZXJzdwttb2R1bGVfaW5mb2EB +772B584168E0:E21:g3F3DmxvZ2dlcl9maWx0ZXJzdwttb2R1bGVfaW5mb2EA +772B584168F0:E1E:g3F3DmxvZ2dlcl9maWx0ZXJzdwhwcm9ncmVzc2EC +772B58416900:E1B:g3F3DmxvZ2dlcl9maWx0ZXJzdwVsZXZlbGEC +772B58416910:E1C:g3F3BmxvZ2dlcncOY29tcGFyZV9sZXZlbHNhAg== +772B58416920:E19:g3F3BmxvZ2dlcncLbW9kdWxlX2luZm9hAQ== +772B58416930:E19:g3F3BmxvZ2dlcncLbW9kdWxlX2luZm9hAA== +772B58416940:E1A:g3F3BmxvZ2dlcncMYWRkX2hhbmRsZXJzYQE= +772B58416950:E22:g3F3BmxvZ2dlcncUaW50ZXJuYWxfaW5pdF9sb2dnZXJhAA== +772B58416960:E19:g3F3BmxvZ2dlcncLcmVjb25maWd1cmVhAA== +772B58416970:EF:g3F3BmxvZ2dlcncBaWEB +772B58416980:EF:g3F3BmxvZ2dlcncBaWEA +772B58416990:E18:g3F3BmxvZ2dlcncKZ2V0X2NvbmZpZ2EA +772B584169A0:E24:g3F3BmxvZ2dlcncWdW5zZXRfcHJvY2Vzc19tZXRhZGF0YWEA +772B584169B0:E22:g3F3BmxvZ2dlcncUZ2V0X3Byb2Nlc3NfbWV0YWRhdGFhAA== +772B584169C0:E25:g3F3BmxvZ2dlcncXdXBkYXRlX3Byb2Nlc3NfbWV0YWRhdGFhAQ== +772B584169D0:E22:g3F3BmxvZ2dlcncUc2V0X3Byb2Nlc3NfbWV0YWRhdGFhAQ== +772B584169E0:E1E:g3F3BmxvZ2dlcncQZ2V0X21vZHVsZV9sZXZlbGEA +772B584169F0:E1E:g3F3BmxvZ2dlcncQZ2V0X21vZHVsZV9sZXZlbGEB +772B58416A00:E25:g3F3BmxvZ2dlcncXdW5zZXRfYXBwbGljYXRpb25fbGV2ZWxhAQ== +772B58416A10:E23:g3F3BmxvZ2dlcncVc2V0X2FwcGxpY2F0aW9uX2xldmVsYQI= +772B58416A20:E20:g3F3BmxvZ2dlcncSdW5zZXRfbW9kdWxlX2xldmVsYQA= +772B58416A30:E20:g3F3BmxvZ2dlcncSdW5zZXRfbW9kdWxlX2xldmVsYQE= +772B58416A40:E1E:g3F3BmxvZ2dlcncQc2V0X21vZHVsZV9sZXZlbGEC +772B58416A50:E25:g3F3BmxvZ2dlcncXdXBkYXRlX2Zvcm1hdHRlcl9jb25maWdhAw== +772B58416A60:E25:g3F3BmxvZ2dlcncXdXBkYXRlX2Zvcm1hdHRlcl9jb25maWdhAg== +772B58416A70:E1E:g3F3BmxvZ2dlcncQZ2V0X3Byb3h5X2NvbmZpZ2EA +772B58416A80:E1D:g3F3BmxvZ2dlcncPZ2V0X2hhbmRsZXJfaWRzYQA= +772B58416A90:E20:g3F3BmxvZ2dlcncSZ2V0X2hhbmRsZXJfY29uZmlnYQA= +772B58416AA0:E20:g3F3BmxvZ2dlcncSZ2V0X3ByaW1hcnlfY29uZmlnYQA= +772B58416AB0:E21:g3F3BmxvZ2dlcncTdXBkYXRlX3Byb3h5X2NvbmZpZ2EB +772B58416AC0:E23:g3F3BmxvZ2dlcncVdXBkYXRlX2hhbmRsZXJfY29uZmlnYQI= +772B58416AD0:E23:g3F3BmxvZ2dlcncVdXBkYXRlX2hhbmRsZXJfY29uZmlnYQM= +772B58416AE0:E23:g3F3BmxvZ2dlcncVdXBkYXRlX3ByaW1hcnlfY29uZmlnYQE= +772B58416AF0:E1E:g3F3BmxvZ2dlcncQc2V0X3Byb3h5X2NvbmZpZ2EB +772B58416B00:E20:g3F3BmxvZ2dlcncSc2V0X2hhbmRsZXJfY29uZmlnYQI= +772B58416B10:E20:g3F3BmxvZ2dlcncSc2V0X2hhbmRsZXJfY29uZmlnYQM= +772B58416B20:E20:g3F3BmxvZ2dlcncSc2V0X3ByaW1hcnlfY29uZmlnYQE= +772B58416B30:E20:g3F3BmxvZ2dlcncSc2V0X3ByaW1hcnlfY29uZmlnYQI= +772B58416B40:E1C:g3F3BmxvZ2dlcncOcmVtb3ZlX2hhbmRsZXJhAQ== +772B58416B50:E19:g3F3BmxvZ2dlcncLYWRkX2hhbmRsZXJhAw== +772B58416B60:E23:g3F3BmxvZ2dlcncVcmVtb3ZlX2hhbmRsZXJfZmlsdGVyYQI= +772B58416B70:E23:g3F3BmxvZ2dlcncVcmVtb3ZlX3ByaW1hcnlfZmlsdGVyYQE= +772B58416B80:E20:g3F3BmxvZ2dlcncSYWRkX2hhbmRsZXJfZmlsdGVyYQM= +772B58416B90:E20:g3F3BmxvZ2dlcncSYWRkX3ByaW1hcnlfZmlsdGVyYQI= +772B58416BA0:E1A:g3F3BmxvZ2dlcncMaW50ZXJuYWxfbG9nYQI= +772B58416BB0:E1F:g3F3BmxvZ2dlcncRZm9ybWF0X290cF9yZXBvcnRhAQ== +772B58416BC0:E11:g3F3BmxvZ2dlcncDbG9nYQI= +772B58416BD0:E13:g3F3BmxvZ2dlcncFZGVidWdhAw== +772B58416BE0:E13:g3F3BmxvZ2dlcncFZGVidWdhAg== +772B58416BF0:E13:g3F3BmxvZ2dlcncFZGVidWdhAQ== +772B58416C00:E12:g3F3BmxvZ2dlcncEaW5mb2EC +772B58416C10:E12:g3F3BmxvZ2dlcncEaW5mb2EB +772B58416C20:E14:g3F3BmxvZ2dlcncGbm90aWNlYQM= +772B58416C30:E14:g3F3BmxvZ2dlcncGbm90aWNlYQI= +772B58416C40:E14:g3F3BmxvZ2dlcncGbm90aWNlYQE= +772B58416C50:E15:g3F3BmxvZ2dlcncHd2FybmluZ2ED +772B58416C60:E15:g3F3BmxvZ2dlcncHd2FybmluZ2EC +772B58416C70:E15:g3F3BmxvZ2dlcncHd2FybmluZ2EB +772B58416C80:E13:g3F3BmxvZ2dlcncFZXJyb3JhAw== +772B58416C90:E13:g3F3BmxvZ2dlcncFZXJyb3JhAg== +772B58416CA0:E13:g3F3BmxvZ2dlcncFZXJyb3JhAQ== +772B58416CB0:E16:g3F3BmxvZ2dlcncIY3JpdGljYWxhAw== +772B58416CC0:E16:g3F3BmxvZ2dlcncIY3JpdGljYWxhAg== +772B58416CD0:E16:g3F3BmxvZ2dlcncIY3JpdGljYWxhAQ== +772B58416CE0:E13:g3F3BmxvZ2dlcncFYWxlcnRhAw== +772B58416CF0:E13:g3F3BmxvZ2dlcncFYWxlcnRhAg== +772B58416D00:E13:g3F3BmxvZ2dlcncFYWxlcnRhAQ== +772B58416D10:E17:g3F3BmxvZ2dlcncJZW1lcmdlbmN5YQM= +772B58416D20:E17:g3F3BmxvZ2dlcncJZW1lcmdlbmN5YQI= +772B58416D30:E17:g3F3BmxvZ2dlcncJZW1lcmdlbmN5YQE= +772B58416D40:E24:g3F3BmlvX2xpYncWcHJpbnRhYmxlX3VuaWNvZGVfbGlzdGEB +772B58416D50:E11:g3F3AmlvdwdnZXRvcHRzYQA= +772B58416D60:E13:g3F3BG1hcHN3B3dpdGhvdXRhAg== +772B58416D70:E1A:g3F3C2FwcGxpY2F0aW9udwdnZXRfZW52YQM= +772B58416D80:E1A:g3F3C2FwcGxpY2F0aW9udwdzZXRfZW52YQQ= +772B58416D90:E21:g3F3DmxvZ2dlcl9iYWNrZW5kdwtsb2dfYWxsb3dlZGED +772B58416DA0:E17:g3F3DGxvZ2dlcl9wcm94eXcDbG9nYQE= +772B58416DB0:E19:g3F3Bmtlcm5lbHcLbW9kdWxlX2luZm9hAQ== +772B58416DC0:E19:g3F3Bmtlcm5lbHcLbW9kdWxlX2luZm9hAA== +772B58416DD0:E12:g3F3Bmtlcm5lbHcEaW5pdGEB +772B58416DE0:E1B:g3F3Bmtlcm5lbHcNY29uZmlnX2NoYW5nZWED +772B58416DF0:E12:g3F3Bmtlcm5lbHcEc3RvcGEB +772B58416E00:E13:g3F3Bmtlcm5lbHcFc3RhcnRhAg== +772B58416E10:E21:g3F3Am9zdxdpbnRlcm5hbF9pbml0X2NtZF9zaGVsbGEA +772B58416E20:E1F:g3F3EmVybF9zaWduYWxfaGFuZGxlcncFc3RhcnRhAA== +772B58416E30:E22:g3F3BHBlZXJ3FnN1cGVydmlzaW9uX2NoaWxkX3NwZWNhAA== +772B58416E40:E20:g3F3DGVycm9yX2xvZ2dlcncMZXJyb3JfcmVwb3J0YQE= +772B58416E50:E29:g3F3DGdsb2JhbF9ncm91cHcVZ2xvYmFsX2dyb3Vwc19jaGFuZ2VkYQE= +772B58416E60:E29:g3F3DGdsb2JhbF9ncm91cHcVZ2xvYmFsX2dyb3Vwc19yZW1vdmVkYQE= +772B58416E70:E27:g3F3DGdsb2JhbF9ncm91cHcTZ2xvYmFsX2dyb3Vwc19hZGRlZGEB +772B58416E80:E21:g3F3DmZpbGVfaW9fc2VydmVydwttb2R1bGVfaW5mb2EB +772B58416E90:E21:g3F3DmZpbGVfaW9fc2VydmVydwttb2R1bGVfaW5mb2EA +772B58416EA0:E24:g3F3DmZpbGVfaW9fc2VydmVydw5jb3VudF9hbmRfZmluZGED +772B58416EB0:E20:g3F3DmZpbGVfaW9fc2VydmVydwpzdGFydF9saW5rYQM= +772B58416EC0:E1B:g3F3DmZpbGVfaW9fc2VydmVydwVzdGFydGED +772B58416ED0:E22:g3F3DmZpbGVfaW9fc2VydmVydwxmb3JtYXRfZXJyb3JhAQ== +772B58416EE0:E1C:g3F3DWVybF9wb3NpeF9tc2d3B21lc3NhZ2VhAQ== +772B58416EF0:E1A:g3F3BmlvX2xpYncMY29sbGVjdF9saW5lYQQ= +772B58416F00:E17:g3F3BmlvX2xpYncJZ2V0X3VudGlsYQQ= +772B58416F10:E25:g3F3CGVybF9zY2FudxVjb250aW51YXRpb25fbG9jYXRpb25hAQ== +772B58416F20:E25:g3F3CXByb3BsaXN0c3cUc3Vic3RpdHV0ZV9uZWdhdGlvbnNhAg== +772B58416F30:E17:g3F3CXByb3BsaXN0c3cGdW5mb2xkYQE= +772B58416F40:E17:g3F3C3Jhd19maWxlX2lvdwRvcGVuYQI= +772B58416F50:E1E:g3F3C2ZpbGVfc2VydmVydwttb2R1bGVfaW5mb2EB +772B58416F60:E1E:g3F3C2ZpbGVfc2VydmVydwttb2R1bGVfaW5mb2EA +772B58416F70:E1E:g3F3C2ZpbGVfc2VydmVydwtjb2RlX2NoYW5nZWED +772B58416F80:E1C:g3F3C2ZpbGVfc2VydmVydwl0ZXJtaW5hdGVhAg== +772B58416F90:E1E:g3F3C2ZpbGVfc2VydmVydwtoYW5kbGVfaW5mb2EC +772B58416FA0:E1E:g3F3C2ZpbGVfc2VydmVydwtoYW5kbGVfY2FzdGEC +772B58416FB0:E1E:g3F3C2ZpbGVfc2VydmVydwtoYW5kbGVfY2FsbGED +772B58416FC0:E17:g3F3C2ZpbGVfc2VydmVydwRpbml0YQE= +772B58416FD0:E17:g3F3C2ZpbGVfc2VydmVydwRzdG9wYQA= +772B58416FE0:E1D:g3F3C2ZpbGVfc2VydmVydwpzdGFydF9saW5rYQA= +772B58416FF0:E18:g3F3C2ZpbGVfc2VydmVydwVzdGFydGEA +772B58417000:E1F:g3F3C2ZpbGVfc2VydmVydwxmb3JtYXRfZXJyb3JhAQ== +772B58417010:E1D:g3F3DGVycm9yX2xvZ2dlcncJZXJyb3JfbXNnYQI= +772B58417020:E17:g3F3BGZpbGV3C21vZHVsZV9pbmZvYQE= +772B58417030:E17:g3F3BGZpbGV3C21vZHVsZV9pbmZvYQA= +772B58417040:E14:g3F3BGZpbGV3CHNlbmRmaWxlYQI= +772B58417050:E14:g3F3BGZpbGV3CHNlbmRmaWxlYQU= +772B58417060:E17:g3F3BGZpbGV3C2NoYW5nZV90aW1lYQM= +772B58417070:E17:g3F3BGZpbGV3C2NoYW5nZV90aW1lYQI= +772B58417080:E18:g3F3BGZpbGV3DGNoYW5nZV9ncm91cGEC +772B58417090:E18:g3F3BGZpbGV3DGNoYW5nZV9vd25lcmED +772B584170A0:E18:g3F3BGZpbGV3DGNoYW5nZV9vd25lcmEC +772B584170B0:E17:g3F3BGZpbGV3C2NoYW5nZV9tb2RlYQI= +772B584170C0:E15:g3F3BGZpbGV3CXBhdGhfb3BlbmED +772B584170D0:E17:g3F3BGZpbGV3C3BhdGhfc2NyaXB0YQM= +772B584170E0:E17:g3F3BGZpbGV3C3BhdGhfc2NyaXB0YQI= +772B584170F0:E12:g3F3BGZpbGV3BnNjcmlwdGEC +772B58417100:E12:g3F3BGZpbGV3BnNjcmlwdGEB +772B58417110:E15:g3F3BGZpbGV3CXBhdGhfZXZhbGED +772B58417120:E15:g3F3BGZpbGV3CXBhdGhfZXZhbGEC +772B58417130:E10:g3F3BGZpbGV3BGV2YWxhAg== +772B58417140:E10:g3F3BGZpbGV3BGV2YWxhAQ== +772B58417150:E18:g3F3BGZpbGV3DHBhdGhfY29uc3VsdGEC +772B58417160:E13:g3F3BGZpbGV3B2NvbnN1bHRhAQ== +772B58417170:E22:g3F3BGZpbGV3FmlwcmVhZF9zMzJidV9wMzJidV9pbnRhAw== +772B58417180:E1E:g3F3BGZpbGV3EmlwcmVhZF9zMzJidV9wMzJidWED +772B58417190:E10:g3F3BGZpbGV3BGNvcHlhAw== +772B584171A0:E10:g3F3BGZpbGV3BGNvcHlhAg== +772B584171B0:E14:g3F3BGZpbGV3CHRydW5jYXRlYQE= +772B584171C0:E14:g3F3BGZpbGV3CHBvc2l0aW9uYQI= +772B584171D0:E10:g3F3BGZpbGV3BHN5bmNhAQ== +772B584171E0:E14:g3F3BGZpbGV3CGRhdGFzeW5jYQE= +772B584171F0:E12:g3F3BGZpbGV3BnB3cml0ZWED +772B58417200:E12:g3F3BGZpbGV3BnB3cml0ZWEC +772B58417210:E11:g3F3BGZpbGV3BXdyaXRlYQI= +772B58417220:E11:g3F3BGZpbGV3BXByZWFkYQM= +772B58417230:E11:g3F3BGZpbGV3BXByZWFkYQI= +772B58417240:E15:g3F3BGZpbGV3CXJlYWRfbGluZWEB +772B58417250:E14:g3F3BGZpbGV3CGFsbG9jYXRlYQM= +772B58417260:E12:g3F3BGZpbGV3BmFkdmlzZWEE +772B58417270:E11:g3F3BGZpbGV3BWNsb3NlYQE= +772B58417280:E10:g3F3BGZpbGV3BG9wZW5hAg== +772B58417290:E1F:g3F3BGZpbGV3E3Jhd193cml0ZV9maWxlX2luZm9hAg== +772B584172A0:E1E:g3F3BGZpbGV3EnJhd19yZWFkX2ZpbGVfaW5mb2EB +772B584172B0:E16:g3F3BGZpbGV3CndyaXRlX2ZpbGVhAw== +772B584172C0:E16:g3F3BGZpbGV3CndyaXRlX2ZpbGVhAg== +772B584172D0:E18:g3F3BGZpbGV3DG1ha2Vfc3ltbGlua2EC +772B584172E0:E15:g3F3BGZpbGV3CW1ha2VfbGlua2EC +772B584172F0:E15:g3F3BGZpbGV3CXJlYWRfZmlsZWEC +772B58417300:E15:g3F3BGZpbGV3CXJlYWRfZmlsZWEB +772B58417310:E18:g3F3BGZpbGV3DGxpc3RfZGlyX2FsbGEB +772B58417320:E14:g3F3BGZpbGV3CGxpc3RfZGlyYQE= +772B58417330:E1B:g3F3BGZpbGV3D3dyaXRlX2ZpbGVfaW5mb2ED +772B58417340:E1B:g3F3BGZpbGV3D3dyaXRlX2ZpbGVfaW5mb2EC +772B58417350:E19:g3F3BGZpbGV3DXJlYWRfbGlua19hbGxhAQ== +772B58417360:E15:g3F3BGZpbGV3CXJlYWRfbGlua2EB +772B58417370:E1A:g3F3BGZpbGV3DnJlYWRfbGlua19pbmZvYQI= +772B58417380:E1A:g3F3BGZpbGV3DnJlYWRfbGlua19pbmZvYQE= +772B58417390:E13:g3F3BGZpbGV3B2FsdG5hbWVhAQ== +772B584173A0:E1A:g3F3BGZpbGV3DnJlYWRfZmlsZV9pbmZvYQI= +772B584173B0:E15:g3F3BGZpbGV3CWRlbF9kaXJfcmEB +772B584173C0:E13:g3F3BGZpbGV3B2RlbF9kaXJhAQ== +772B584173D0:E14:g3F3BGZpbGV3CG1ha2VfZGlyYQE= +772B584173E0:E12:g3F3BGZpbGV3BnJlbmFtZWEC +772B584173F0:E12:g3F3BGZpbGV3BmRlbGV0ZWEC +772B58417400:E13:g3F3BGZpbGV3B3NldF9jd2RhAQ== +772B58417410:E14:g3F3CHJhbV9maWxldwRvcGVuYQI= +772B58417420:E11:g3F3AmlvdwdyZXF1ZXN0YQI= +772B58417430:E16:g3F3BnNvY2tldHcIc2VuZGZpbGVhBQ== +772B58417440:E17:g3F3A2VwcHcMc2V0X2VuY29kaW5nYQE= +772B58417450:EE:g3F3AmlvdwRyZWFkYQM= +772B58417460:E19:g3F3Amlvdw9wYXJzZV9lcmxfZXhwcnNhAw== +772B58417470:E13:g3F3B2dlbl90Y3B3BHNlbmRhAg== +772B58417480:E12:g3F3BnNvY2tldHcEc2VuZGEC +772B58417490:E17:g3F3BGNvZGV3C21vZHVsZV9pbmZvYQE= +772B584174A0:E17:g3F3BGNvZGV3C21vZHVsZV9pbmZvYQA= +772B584174B0:E1C:g3F3BGNvZGV3EG1vZGlmaWVkX21vZHVsZXNhAA== +772B584174C0:E19:g3F3BGNvZGV3DW1vZHVsZV9zdGF0dXNhAQ== +772B584174D0:E19:g3F3BGNvZGV3DW1vZHVsZV9zdGF0dXNhAA== +772B584174E0:E11:g3F3BGNvZGV3BWNsYXNoYQA= +772B584174F0:E13:g3F3BGNvZGV3B2dldF9kb2NhAg== +772B58417500:E13:g3F3BGNvZGV3B2dldF9kb2NhAQ== +772B58417510:E19:g3F3BGNvZGV3DXdoZXJlX2lzX2ZpbGVhAg== +772B58417520:E11:g3F3BGNvZGV3BXdoaWNoYQE= +772B58417530:E16:g3F3BGNvZGV3CnN0YXJ0X2xpbmthAA== +772B58417540:E1A:g3F3BGNvZGV3DmZpbmlzaF9sb2FkaW5nYQE= +772B58417550:E1B:g3F3BGNvZGV3D3ByZXBhcmVfbG9hZGluZ2EB +772B58417560:E17:g3F3BGNvZGV3C2F0b21pY19sb2FkYQE= +772B58417570:E21:g3F3BGNvZGV3FWVuc3VyZV9tb2R1bGVzX2xvYWRlZGEB +772B58417580:E17:g3F3BGNvZGV3C2NsZWFyX2NhY2hlYQA= +772B58417590:E14:g3F3BGNvZGV3CGdldF9tb2RlYQA= +772B584175A0:E18:g3F3BGNvZGV3DHJlcGxhY2VfcGF0aGED +772B584175B0:E18:g3F3BGNvZGV3DHJlcGxhY2VfcGF0aGEC +772B584175C0:E15:g3F3BGNvZGV3CWRlbF9wYXRoc2EB +772B584175D0:E14:g3F3BGNvZGV3CGRlbF9wYXRoYQE= +772B584175E0:E16:g3F3BGNvZGV3CmFkZF9wYXRoc2FhAg== +772B584175F0:E16:g3F3BGNvZGV3CmFkZF9wYXRoc2FhAQ== +772B58417600:E16:g3F3BGNvZGV3CmFkZF9wYXRoc3phAg== +772B58417610:E16:g3F3BGNvZGV3CmFkZF9wYXRoc3phAQ== +772B58417620:E15:g3F3BGNvZGV3CWFkZF9wYXRoc2EC +772B58417630:E15:g3F3BGNvZGV3CWFkZF9wYXRoc2EB +772B58417640:E15:g3F3BGNvZGV3CWFkZF9wYXRoYWEC +772B58417650:E15:g3F3BGNvZGV3CWFkZF9wYXRoYWEB +772B58417660:E15:g3F3BGNvZGV3CWFkZF9wYXRoemEC +772B58417670:E15:g3F3BGNvZGV3CWFkZF9wYXRoemEB +772B58417680:E14:g3F3BGNvZGV3CGFkZF9wYXRoYQI= +772B58417690:E14:g3F3BGNvZGV3CGFkZF9wYXRoYQE= +772B584176A0:E14:g3F3BGNvZGV3CGdldF9wYXRoYQA= +772B584176B0:E14:g3F3BGNvZGV3CHNldF9wYXRoYQI= +772B584176C0:E14:g3F3BGNvZGV3CHNldF9wYXRoYQE= +772B584176D0:E15:g3F3BGNvZGV3CWlzX3N0aWNreWEB +772B584176E0:E17:g3F3BGNvZGV3C3Vuc3RpY2tfbW9kYQE= +772B584176F0:E15:g3F3BGNvZGV3CXN0aWNrX21vZGEB +772B58417700:E17:g3F3BGNvZGV3C3Vuc3RpY2tfZGlyYQE= +772B58417710:E15:g3F3BGNvZGV3CXN0aWNrX2RpcmEB +772B58417720:E14:g3F3BGNvZGV3CHByaXZfZGlyYQE= +772B58417730:E18:g3F3BGNvZGV3DGNvbXBpbGVyX2RpcmEA +772B58417740:E13:g3F3BGNvZGV3B2xpYl9kaXJhAg== +772B58417750:E13:g3F3BGNvZGV3B2xpYl9kaXJhAQ== +772B58417760:E13:g3F3BGNvZGV3B2xpYl9kaXJhAA== +772B58417770:E14:g3F3BGNvZGV3CHJvb3RfZGlyYQA= +772B58417780:E10:g3F3BGNvZGV3BHN0b3BhAA== +772B58417790:E19:g3F3BGNvZGV3DWFsbF9hdmFpbGFibGVhAA== +772B584177A0:E1B:g3F3BGNvZGV3D2dldF9vYmplY3RfY29kZWEB +772B584177B0:E16:g3F3BGNvZGV3CnNvZnRfcHVyZ2VhAQ== +772B584177C0:E11:g3F3BGNvZGV3BXB1cmdlYQE= +772B584177D0:E12:g3F3BGNvZGV3BmRlbGV0ZWEB +772B584177E0:E17:g3F3BGNvZGV3C2xvYWRfYmluYXJ5YQM= +772B584177F0:E14:g3F3BGNvZGV3CGxvYWRfYWJzYQI= +772B58417800:E14:g3F3BGNvZGV3CGxvYWRfYWJzYQE= +772B58417810:E15:g3F3BGNvZGV3CWxvYWRfZmlsZWEB +772B58417820:E1D:g3F3BGNvZGV3EW9iamZpbGVfZXh0ZW5zaW9uYQA= +772B58417830:E16:g3F3BGNvZGV3Cm1vZHVsZV9tZDVhAQ== +772B58417840:E15:g3F3BGNvZGV3CWdldF9jaHVua2EC +772B58417850:E1A:g3F3C2NvZGVfc2VydmVydwdhYnNuYW1lYQE= +772B58417860:E1C:g3F3C2NvZGVfc2VydmVydwlpc19sb2FkZWRhAQ== +772B58417870:E1C:g3F3C2NvZGVfc2VydmVydwlpc19zdGlja3lhAQ== +772B58417880:E1B:g3F3C2NvZGVfc2VydmVydwhnZXRfbW9kZWEA +772B58417890:E17:g3F3C2NvZGVfc2VydmVydwRjYWxsYQE= +772B584178A0:E1D:g3F3C2NvZGVfc2VydmVydwpzdGFydF9saW5rYQE= +772B584178B0:E1B:g3F3DGVybF9mZWF0dXJlc3cHZW5hYmxlZGEA +772B584178C0:E16:g3F3CGJlYW1fbGlidwZjaHVua3NhAg== +772B584178D0:E23:g3F3B3VuaWNvZGV3FGNoYXJhY3RlcnNfdG9fYmluYXJ5YQE= +772B584178E0:E22:g3F3DGVycm9yX2xvZ2dlcncOd2FybmluZ19yZXBvcnRhAQ== +772B584178F0:E13:g3F3CGJlYW1fbGlidwNtZDVhAQ== +772B58417900:E1F:g3F3DGVycm9yX2xvZ2dlcncLbW9kdWxlX2luZm9hAQ== +772B58417910:E1F:g3F3DGVycm9yX2xvZ2dlcncLbW9kdWxlX2luZm9hAA== +772B58417920:E17:g3F3DGVycm9yX2xvZ2dlcncDdHR5YQE= +772B58417930:E1B:g3F3DGVycm9yX2xvZ2dlcncHbG9nZmlsZWEB +772B58417940:E29:g3F3DGVycm9yX2xvZ2dlcncVd2hpY2hfcmVwb3J0X2hhbmRsZXJzYQA= +772B58417950:E29:g3F3DGVycm9yX2xvZ2dlcncVZGVsZXRlX3JlcG9ydF9oYW5kbGVyYQE= +772B58417960:E26:g3F3DGVycm9yX2xvZ2dlcncSYWRkX3JlcG9ydF9oYW5kbGVyYQI= +772B58417970:E26:g3F3DGVycm9yX2xvZ2dlcncSYWRkX3JlcG9ydF9oYW5kbGVyYQE= +772B58417980:E1E:g3F3DGVycm9yX2xvZ2dlcncKZXJyb3JfaW5mb2EB +772B58417990:E1C:g3F3DGVycm9yX2xvZ2dlcncIaW5mb19tc2dhAg== +772B584179A0:E1C:g3F3DGVycm9yX2xvZ2dlcncIaW5mb19tc2dhAQ== +772B584179B0:E1F:g3F3DGVycm9yX2xvZ2dlcncLaW5mb19yZXBvcnRhAg== +772B584179C0:E1F:g3F3DGVycm9yX2xvZ2dlcncLaW5mb19yZXBvcnRhAQ== +772B584179D0:E1F:g3F3DGVycm9yX2xvZ2dlcncLd2FybmluZ19tc2dhAQ== +772B584179E0:E22:g3F3DGVycm9yX2xvZ2dlcncOd2FybmluZ19yZXBvcnRhAg== +772B584179F0:E20:g3F3DGVycm9yX2xvZ2dlcncMZXJyb3JfcmVwb3J0YQI= +772B58417A00:E1D:g3F3DGVycm9yX2xvZ2dlcncJZXJyb3JfbXNnYQE= +772B58417A10:E17:g3F3DGVycm9yX2xvZ2dlcncDbG9nYQI= +772B58417A20:E24:g3F3DGVycm9yX2xvZ2dlcncQcmVtb3ZpbmdfaGFuZGxlcmEB +772B58417A30:E22:g3F3DGVycm9yX2xvZ2dlcncOYWRkaW5nX2hhbmRsZXJhAQ== +772B58417A40:E18:g3F3DGVycm9yX2xvZ2dlcncEc3RvcGEA +772B58417A50:E1E:g3F3DGVycm9yX2xvZ2dlcncKc3RhcnRfbGlua2EA +772B58417A60:E19:g3F3DGVycm9yX2xvZ2dlcncFc3RhcnRhAA== +772B58417A70:E2E:g3F3FmxvZ2dlcl9oYW5kbGVyX3dhdGNoZXJ3EHJlZ2lzdGVyX2hhbmRsZXJhAg== +772B58417A80:E19:g3F3BmlvX2xpYncLc2Nhbl9mb3JtYXRhAg== +772B58417A90:E21:g3F3DmxvZ2dlcl9iYWNrZW5kdwttb2R1bGVfaW5mb2EB +772B58417AA0:E21:g3F3DmxvZ2dlcl9iYWNrZW5kdwttb2R1bGVfaW5mb2EA +772B58417AB0:E1E:g3F3C2NvZGVfc2VydmVydwttb2R1bGVfaW5mb2EB +772B58417AC0:E1E:g3F3C2NvZGVfc2VydmVydwttb2R1bGVfaW5mb2EA +772B58417AD0:E1B:g3F3C2NvZGVfc2VydmVydwhpbmZvX21zZ2EC +772B58417AE0:E1C:g3F3C2NvZGVfc2VydmVydwllcnJvcl9tc2dhAg== +772B58417AF0:E25:g3F3C2NvZGVfc2VydmVydxJzeXN0ZW1fY29kZV9jaGFuZ2VhBA== +772B58417B00:E18:g3F3BWhlYXJ0dwttb2R1bGVfaW5mb2EB +772B58417B10:E18:g3F3BWhlYXJ0dwttb2R1bGVfaW5mb2EA +772B58417B20:E12:g3F3BWhlYXJ0dwVjeWNsZWEA +772B58417B30:E18:g3F3BWhlYXJ0dwtnZXRfb3B0aW9uc2EA +772B58417B40:E18:g3F3BWhlYXJ0dwtzZXRfb3B0aW9uc2EB +772B58417B50:E1B:g3F3BWhlYXJ0dw5jbGVhcl9jYWxsYmFja2EA +772B58417B60:E19:g3F3BWhlYXJ0dwxnZXRfY2FsbGJhY2thAA== +772B58417B70:E19:g3F3BWhlYXJ0dwxzZXRfY2FsbGJhY2thAg== +772B58417B80:E16:g3F3BWhlYXJ0dwljbGVhcl9jbWRhAA== +772B58417B90:E14:g3F3BWhlYXJ0dwdnZXRfY21kYQA= +772B58417BA0:E14:g3F3BWhlYXJ0dwdzZXRfY21kYQE= +772B58417BB0:E11:g3F3BWhlYXJ0dwRpbml0YQI= +772B58417BC0:E12:g3F3BWhlYXJ0dwVzdGFydGEA +772B58417BD0:E1E:g3F3C2FwcGxpY2F0aW9udwttb2R1bGVfaW5mb2EB +772B58417BE0:E1E:g3F3C2FwcGxpY2F0aW9udwttb2R1bGVfaW5mb2EA +772B58417BF0:E21:g3F3C2FwcGxpY2F0aW9udw5iZWhhdmlvdXJfaW5mb2EB +772B58417C00:E1D:g3F3C2FwcGxpY2F0aW9udwpzdGFydF90eXBlYQA= +772B58417C10:E21:g3F3C2FwcGxpY2F0aW9udw5nZXRfc3VwZXJ2aXNvcmEB +772B58417C20:E22:g3F3C2FwcGxpY2F0aW9udw9nZXRfYXBwbGljYXRpb25hAQ== +772B58417C30:E22:g3F3C2FwcGxpY2F0aW9udw9nZXRfYXBwbGljYXRpb25hAA== +772B58417C40:E1E:g3F3C2FwcGxpY2F0aW9udwtnZXRfYWxsX2tleWEB +772B58417C50:E1E:g3F3C2FwcGxpY2F0aW9udwtnZXRfYWxsX2tleWEA +772B58417C60:E1A:g3F3C2FwcGxpY2F0aW9udwdnZXRfa2V5YQE= +772B58417C70:E1E:g3F3C2FwcGxpY2F0aW9udwtnZXRfYWxsX2VudmEA +772B58417C80:E1A:g3F3C2FwcGxpY2F0aW9udwdnZXRfZW52YQE= +772B58417C90:E1C:g3F3C2FwcGxpY2F0aW9udwl1bnNldF9lbnZhAw== +772B58417CA0:E1C:g3F3C2FwcGxpY2F0aW9udwl1bnNldF9lbnZhAg== +772B58417CB0:E1A:g3F3C2FwcGxpY2F0aW9udwdzZXRfZW52YQM= +772B58417CC0:E1A:g3F3C2FwcGxpY2F0aW9udwdzZXRfZW52YQI= +772B58417CD0:E1A:g3F3C2FwcGxpY2F0aW9udwdzZXRfZW52YQE= +772B58417CE0:E17:g3F3C2FwcGxpY2F0aW9udwRpbmZvYQA= +772B58417CF0:E26:g3F3C2FwcGxpY2F0aW9udxNsb2FkZWRfYXBwbGljYXRpb25zYQA= +772B58417D00:E25:g3F3C2FwcGxpY2F0aW9udxJ3aGljaF9hcHBsaWNhdGlvbnNhAQ== +772B58417D10:E25:g3F3C2FwcGxpY2F0aW9udxJ3aGljaF9hcHBsaWNhdGlvbnNhAA== +772B58417D20:E17:g3F3C2FwcGxpY2F0aW9udwRzdG9wYQE= +772B58417D30:E19:g3F3C2FwcGxpY2F0aW9udwZwZXJtaXRhAg== +772B58417D40:E1B:g3F3C2FwcGxpY2F0aW9udwh0YWtlb3ZlcmEC +772B58417D50:E1D:g3F3C2FwcGxpY2F0aW9udwpzdGFydF9ib290YQI= +772B58417D60:E1D:g3F3C2FwcGxpY2F0aW9udwpzdGFydF9ib290YQE= +772B58417D70:E21:g3F3C2FwcGxpY2F0aW9udw5lbnN1cmVfc3RhcnRlZGEC +772B58417D80:E21:g3F3C2FwcGxpY2F0aW9udw5lbnN1cmVfc3RhcnRlZGEB +772B58417D90:E18:g3F3C2FwcGxpY2F0aW9udwVzdGFydGEC +772B58417DA0:E18:g3F3C2FwcGxpY2F0aW9udwVzdGFydGEB +772B58417DB0:E25:g3F3C2FwcGxpY2F0aW9udxJlbnN1cmVfYWxsX3N0YXJ0ZWRhAw== +772B58417DC0:E25:g3F3C2FwcGxpY2F0aW9udxJlbnN1cmVfYWxsX3N0YXJ0ZWRhAg== +772B58417DD0:E25:g3F3C2FwcGxpY2F0aW9udxJlbnN1cmVfYWxsX3N0YXJ0ZWRhAQ== +772B58417DE0:E19:g3F3C2FwcGxpY2F0aW9udwZ1bmxvYWRhAQ== +772B58417DF0:E17:g3F3C2FwcGxpY2F0aW9udwRsb2FkYQI= +772B58417E00:E1F:g3F3B2Rpc3RfYWN3EGxvYWRfYXBwbGljYXRpb25hAg== +772B58417E10:E23:g3F3B2Rpc3RfYWN3FHRha2VvdmVyX2FwcGxpY2F0aW9uYQI= +772B58417E20:E2D:g3F3B2Rpc3RfYWN3HnBlcm1pdF9vbmx5X2xvYWRlZF9hcHBsaWNhdGlvbmEC +772B58417E30:E21:g3F3B2Rpc3RfYWN3EnBlcm1pdF9hcHBsaWNhdGlvbmEC +772B58417E40:E23:g3F3EmFwcGxpY2F0aW9uX21hc3RlcncJZ2V0X2NoaWxkYQE= +772B58417E50:E25:g3F3EmFwcGxpY2F0aW9uX21hc3RlcncLbW9kdWxlX2luZm9hAQ== +772B58417E60:E25:g3F3EmFwcGxpY2F0aW9uX21hc3RlcncLbW9kdWxlX2luZm9hAA== +772B58417E70:E22:g3F3EmFwcGxpY2F0aW9uX21hc3RlcncIc3RhcnRfaXRhBA== +772B58417E80:E1E:g3F3EmFwcGxpY2F0aW9uX21hc3RlcncEaW5pdGED +772B58417E90:E24:g3F3EmFwcGxpY2F0aW9uX21hc3RlcncKc3RhcnRfdHlwZWEA +772B58417EA0:E20:g3F3E2FwcGxpY2F0aW9uX3N0YXJ0ZXJ3BXN0YXJ0YQM= +772B58417EB0:E17:g3F3BXRpbWVydwpleGl0X2FmdGVyYQI= +772B58417EC0:E20:g3F3DWVycm9yX2hhbmRsZXJ3C21vZHVsZV9pbmZvYQE= +772B58417ED0:E20:g3F3DWVycm9yX2hhbmRsZXJ3C21vZHVsZV9pbmZvYQA= +772B58417EE0:E22:g3F3DWVycm9yX2hhbmRsZXJ3DXN0dWJfZnVuY3Rpb25hAw== +772B58417EF0:E2A:g3F3DWVycm9yX2hhbmRsZXJ3FXJhaXNlX3VuZGVmX2V4Y2VwdGlvbmED +772B58417F00:E1F:g3F3DWVycm9yX2hhbmRsZXJ3CmJyZWFrcG9pbnRhAw== +772B58417F10:E25:g3F3DWVycm9yX2hhbmRsZXJ3EHVuZGVmaW5lZF9sYW1iZGFhAw== +772B58417F20:E27:g3F3DWVycm9yX2hhbmRsZXJ3EnVuZGVmaW5lZF9mdW5jdGlvbmED +772B58417F30:E1B:g3F3DGxvZ2dlcl9wcm94eXcHcmVzdGFydGEA +772B58417F40:E1F:g3F3DGxvZ2dlcl9wcm94eXcLbW9kdWxlX2luZm9hAQ== +772B58417F50:E1F:g3F3DGxvZ2dlcl9wcm94eXcLbW9kdWxlX2luZm9hAA== +772B58417F60:E1A:g3F3DGxvZ2dlcl9wcm94eXcGbm90aWZ5YQI= +772B58417F70:E1D:g3F3DGxvZ2dlcl9wcm94eXcJdGVybWluYXRlYQI= +772B58417F80:E1F:g3F3DGxvZ2dlcl9wcm94eXcLaGFuZGxlX2luZm9hAg== +772B58417F90:E1F:g3F3DGxvZ2dlcl9wcm94eXcLaGFuZGxlX2xvYWRhAg== +772B58417FA0:E18:g3F3DGxvZ2dlcl9wcm94eXcEaW5pdGEB +772B58417FB0:E1E:g3F3DGxvZ2dlcl9wcm94eXcKY2hpbGRfc3BlY2EA +772B58417FC0:E1E:g3F3DGxvZ2dlcl9wcm94eXcKc3RhcnRfbGlua2EA +772B58417FD0:E19:g3F3CmxvZ2dlcl9vbHB3B2dldF9waWRhAQ== +772B58417FE0:E16:g3F3CmxvZ2dlcl9vbHB3BGxvYWRhAg== +772B58417FF0:E1C:g3F3CmxvZ2dlcl9vbHB3CnN0YXJ0X2xpbmthBA== +772B58418000:E22:g3F3CmxvZ2dlcl9vbHB3EGdldF9kZWZhdWx0X29wdHNhAA== +772B58418010:E19:g3F3CmxvZ2dlcl9vbHB3B2dldF9yZWZhAA== +772B58418020:E1D:g3F3CmxvZ2dlcl9vbHB3C21vZHVsZV9pbmZvYQE= +772B58418030:E1D:g3F3CmxvZ2dlcl9vbHB3C21vZHVsZV9pbmZvYQA= +772B58418040:E16:g3F3CmxvZ2dlcl9vbHB3BGNhc3RhAg== +772B58418050:E16:g3F3CmxvZ2dlcl9vbHB3BGNhbGxhAg== +772B58418060:E1D:g3F3CmxvZ2dlcl9vbHB3C2NvZGVfY2hhbmdlYQM= +772B58418070:E1B:g3F3CmxvZ2dlcl9vbHB3CXRlcm1pbmF0ZWEC +772B58418080:E1D:g3F3CmxvZ2dlcl9vbHB3C2hhbmRsZV9pbmZvYQI= +772B58418090:E1D:g3F3CmxvZ2dlcl9vbHB3C2hhbmRsZV9jYXN0YQI= +772B584180A0:E1D:g3F3CmxvZ2dlcl9vbHB3C2hhbmRsZV9jYWxsYQM= +772B584180B0:E16:g3F3CmxvZ2dlcl9vbHB3BGluaXRhAQ== +772B584180C0:E19:g3F3CmxvZ2dlcl9vbHB3B2dldF9yZWZhAQ== +772B584180D0:E19:g3F3CmxvZ2dlcl9vbHB3B3Jlc3RhcnRhAQ== +772B584180E0:E1A:g3F3CmxvZ2dlcl9vbHB3CGdldF9vcHRzYQE= +772B584180F0:E16:g3F3CmxvZ2dlcl9vbHB3BHN0b3BhAQ== +772B58418100:E17:g3F3CmxvZ2dlcl9vbHB3BXJlc2V0YQE= +772B58418110:E16:g3F3CmxvZ2dlcl9vbHB3BGluZm9hAQ== +772B58418120:E18:g3F3BXRpbWVydwthcHBseV9hZnRlcmEE +772B58418130:E12:g3F3BXRpbWVydwVzbGVlcGEB +772B58418140:E18:g3F3BXF1ZXVldwttb2R1bGVfaW5mb2EB +772B58418150:E18:g3F3BXF1ZXVldwttb2R1bGVfaW5mb2EA +772B58418160:E11:g3F3BXF1ZXVldwRpbml0YQE= +772B58418170:E11:g3F3BXF1ZXVldwRsYWl0YQE= +772B58418180:E11:g3F3BXF1ZXVldwRsaWF0YQE= +772B58418190:E11:g3F3BXF1ZXVldwRsYXN0YQE= +772B584181A0:E11:g3F3BXF1ZXVldwRkYWVoYQE= +772B584181B0:E11:g3F3BXF1ZXVldwRzbm9jYQI= +772B584181C0:E11:g3F3BXF1ZXVldwR0YWlsYQE= +772B584181D0:E11:g3F3BXF1ZXVldwRoZWFkYQE= +772B584181E0:E11:g3F3BXF1ZXVldwRjb25zYQI= +772B584181F0:E1A:g3F3BXF1ZXVldw1kZWxldGVfd2l0aF9yYQI= +772B58418200:E18:g3F3BXF1ZXVldwtkZWxldGVfd2l0aGEC +772B58418210:E15:g3F3BXF1ZXVldwhkZWxldGVfcmEC +772B58418220:E13:g3F3BXF1ZXVldwZkZWxldGVhAg== +772B58418230:E10:g3F3BXF1ZXVldwNhbGxhAg== +772B58418240:E10:g3F3BXF1ZXVldwNhbnlhAg== +772B58418250:E11:g3F3BXF1ZXVldwRmb2xkYQM= +772B58418260:E16:g3F3BXF1ZXVldwlmaWx0ZXJtYXBhAg== +772B58418270:E13:g3F3BXF1ZXVldwZmaWx0ZXJhAg== +772B58418280:E12:g3F3BXF1ZXVldwVzcGxpdGEC +772B58418290:E11:g3F3BXF1ZXVldwRqb2luYQI= +772B584182A0:E14:g3F3BXF1ZXVldwdyZXZlcnNlYQE= +772B584182B0:E13:g3F3BXF1ZXVldwZkcm9wX3JhAQ== +772B584182C0:E11:g3F3BXF1ZXVldwRkcm9wYQE= +772B584182D0:E13:g3F3BXF1ZXVldwZwZWVrX3JhAQ== +772B584182E0:E11:g3F3BXF1ZXVldwRwZWVrYQE= +772B584182F0:E12:g3F3BXF1ZXVldwVnZXRfcmEB +772B58418300:E10:g3F3BXF1ZXVldwNnZXRhAQ== +772B58418310:E12:g3F3BXF1ZXVldwVvdXRfcmEB +772B58418320:E11:g3F3BXF1ZXVldwRpbl9yYQI= +772B58418330:E13:g3F3BXF1ZXVldwZtZW1iZXJhAg== +772B58418340:E16:g3F3BXF1ZXVldwlmcm9tX2xpc3RhAQ== +772B58418350:E14:g3F3BXF1ZXVldwd0b19saXN0YQE= +772B58418360:E10:g3F3BXF1ZXVldwNsZW5hAQ== +772B58418370:E15:g3F3BXF1ZXVldwhpc19lbXB0eWEB +772B58418380:E15:g3F3BXF1ZXVldwhpc19xdWV1ZWEB +772B58418390:E26:g3F3D2xvZ2dlcl9zaW1wbGVfaHcPY2hhbmdpbmdfY29uZmlnYQM= +772B584183A0:E26:g3F3D2xvZ2dlcl9zaW1wbGVfaHcPY2hhbmdpbmdfY29uZmlnYQI= +772B584183B0:E1C:g3F3CXByb3BsaXN0c3cLbW9kdWxlX2luZm9hAQ== +772B584183C0:E1C:g3F3CXByb3BsaXN0c3cLbW9kdWxlX2luZm9hAA== +772B584183D0:E19:g3F3CXByb3BsaXN0c3cIZnJvbV9tYXBhAQ== +772B584183E0:E17:g3F3CXByb3BsaXN0c3cGdG9fbWFwYQI= +772B584183F0:E17:g3F3CXByb3BsaXN0c3cGdG9fbWFwYQE= +772B58418400:E16:g3F3CXByb3BsaXN0c3cFc3BsaXRhAg== +772B58418410:E1A:g3F3CXByb3BsaXN0c3cJbm9ybWFsaXplYQI= +772B58418420:E17:g3F3CXByb3BsaXN0c3cGZXhwYW5kYQI= +772B58418430:E23:g3F3CXByb3BsaXN0c3cSc3Vic3RpdHV0ZV9hbGlhc2VzYQI= +772B58418440:E17:g3F3CXByb3BsaXN0c3cGZGVsZXRlYQI= +772B58418450:E19:g3F3CXByb3BsaXN0c3cIZ2V0X2tleXNhAQ== +772B58418460:E19:g3F3CXByb3BsaXN0c3cIZ2V0X2Jvb2xhAg== +772B58418470:E1E:g3F3CXByb3BsaXN0c3cNYXBwZW5kX3ZhbHVlc2EC +772B58418480:E1F:g3F3CXByb3BsaXN0c3cOZ2V0X2FsbF92YWx1ZXNhAg== +772B58418490:E1B:g3F3CXByb3BsaXN0c3cKaXNfZGVmaW5lZGEC +772B584184A0:E1B:g3F3CXByb3BsaXN0c3cKbG9va3VwX2FsbGEC +772B584184B0:E17:g3F3CXByb3BsaXN0c3cGbG9va3VwYQI= +772B584184C0:E18:g3F3CXByb3BsaXN0c3cHY29tcGFjdGEB +772B584184D0:E19:g3F3CXByb3BsaXN0c3cIcHJvcGVydHlhAg== +772B584184E0:E19:g3F3CXByb3BsaXN0c3cIcHJvcGVydHlhAQ== +772B584184F0:E15:g3F3Am9zdwttb2R1bGVfaW5mb2EB +772B58418500:E15:g3F3Am9zdwttb2R1bGVfaW5mb2EA +772B58418510:ED:g3F3Am9zdwNjbWRhAg== +772B58418520:ED:g3F3Am9zdwNjbWRhAQ== +772B58418530:E19:g3F3Am9zdw9maW5kX2V4ZWN1dGFibGVhAg== +772B58418540:E19:g3F3Am9zdw9maW5kX2V4ZWN1dGFibGVhAQ== +772B58418550:E11:g3F3Am9zdwd2ZXJzaW9uYQA= +772B58418560:E10:g3F3Am9zdwZnZXRlbnZhAg== +772B58418570:E10:g3F3Am9zdwZnZXRlbnZhAA== +772B58418580:E16:g3F3Am9zdwxwZXJmX2NvdW50ZXJhAQ== +772B58418590:E17:g3F3BnN0cmluZ3cJbG93ZXJjYXNlYQE= +772B584185A0:E17:g3F3BHBlZXJ3C21vZHVsZV9pbmZvYQE= +772B584185B0:E17:g3F3BHBlZXJ3C21vZHVsZV9pbmZvYQA= +772B584185C0:E11:g3F3BHBlZXJ3BXN0YXJ0YQA= +772B584185D0:E20:g3F3BHBlZXJ3FHN5c3RlbV9yZXBsYWNlX3N0YXRlYQI= +772B584185E0:E1C:g3F3BHBlZXJ3EHN5c3RlbV9nZXRfc3RhdGVhAQ== +772B584185F0:E1E:g3F3BHBlZXJ3EnN5c3RlbV9jb2RlX2NoYW5nZWEE +772B58418600:E1C:g3F3BHBlZXJ3EHN5c3RlbV90ZXJtaW5hdGVhBA== +772B58418610:E1B:g3F3BHBlZXJ3D3N5c3RlbV9jb250aW51ZWED +772B58418620:E1C:g3F3BHBlZXJ3EGluaXRfc3VwZXJ2aXNpb25hAg== +772B58418630:E1D:g3F3BHBlZXJ3EXN0YXJ0X3N1cGVydmlzaW9uYQA= +772B58418640:E15:g3F3BHBlZXJ3CXRlcm1pbmF0ZWEC +772B58418650:E17:g3F3BHBlZXJ3C2hhbmRsZV9pbmZvYQI= +772B58418660:E17:g3F3BHBlZXJ3C2hhbmRsZV9jYXN0YQI= +772B58418670:E17:g3F3BHBlZXJ3C2hhbmRsZV9jYWxsYQM= +772B58418680:E10:g3F3BHBlZXJ3BGluaXRhAQ== +772B58418690:E10:g3F3BHBlZXJ3BHNlbmRhAw== +772B584186A0:E10:g3F3BHBlZXJ3BGNhc3RhBA== +772B584186B0:E10:g3F3BHBlZXJ3BGNhbGxhBQ== +772B584186C0:E10:g3F3BHBlZXJ3BGNhbGxhBA== +772B584186D0:E15:g3F3BHBlZXJ3CWdldF9zdGF0ZWEB +772B584186E0:E10:g3F3BHBlZXJ3BHN0b3BhAQ== +772B584186F0:E11:g3F3BHBlZXJ3BXN0YXJ0YQE= +772B58418700:E16:g3F3BHBlZXJ3CnN0YXJ0X2xpbmthAQ== +772B58418710:E16:g3F3BHBlZXJ3CnN0YXJ0X2xpbmthAA== +772B58418720:E17:g3F3BHBlZXJ3C3JhbmRvbV9uYW1lYQE= +772B58418730:E17:g3F3BHBlZXJ3C3JhbmRvbV9uYW1lYQA= +772B58418740:E10:g3F3BGVycGN3BGNhbGxhBA== +772B58418750:E1E:g3F3B2luZXRfZGJ3D3JlZ2lzdGVyX3NvY2tldGEC +772B58418760:E13:g3F3BGluZXR3B3NldG9wdHNhAg== +772B58418770:E14:g3F3B2dlbl90Y3B3BWNsb3NlYQE= +772B58418780:E10:g3F3BGVycGN3BGNhbGxhBQ== +772B58418790:E1F:g3F3Cm5ldF9rZXJuZWx3DW1vbml0b3Jfbm9kZXNhAg== +772B584187A0:E10:g3F3BGVycGN3BGNhc3RhBA== +772B584187B0:E17:g3F3BmlvX2xpYncJY2hhcl9saXN0YQE= +772B584187C0:E15:g3F3B2dlbl90Y3B3Bmxpc3RlbmEC +772B584187D0:E10:g3F3BGluZXR3BHBvcnRhAQ== +772B584187E0:E16:g3F3BGluZXR3CmdldGlmYWRkcnNhAA== +772B584187F0:E1B:g3F3Cm5ldF9rZXJuZWx3CWxvbmduYW1lc2EA +772B58418800:E1E:g3F3BmJhc2U2NHcQZW5jb2RlX3RvX3N0cmluZ2EB +772B58418810:E13:g3F3BnN0cmluZ3cFc3BsaXRhAg== +772B58418820:E1C:g3F3A3N5c3cRaGFuZGxlX3N5c3RlbV9tc2dhBg== +772B58418830:E14:g3F3CHVzZXJfc3VwdwRpbml0YQE= +772B58418840:E14:g3F3BmJhc2U2NHcGZGVjb2RlYQE= +772B58418850:E16:g3F3B2dlbl90Y3B3B2Nvbm5lY3RhBA== +772B58418860:E19:g3F3BGluZXR3DXBhcnNlX2FkZHJlc3NhAQ== +772B58418870:E10:g3F3BGluZXR3BG50b2FhAQ== +772B58418880:E1B:g3F3CGJlYW1fbGlidwttb2R1bGVfaW5mb2EB +772B58418890:E1B:g3F3CGJlYW1fbGlidwttb2R1bGVfaW5mb2EA +772B584188A0:E19:g3F3CGJlYW1fbGlidwl0ZXJtaW5hdGVhAg== +772B584188B0:E1B:g3F3CGJlYW1fbGlidwtjb2RlX2NoYW5nZWED +772B584188C0:E1B:g3F3CGJlYW1fbGlidwtoYW5kbGVfaW5mb2EC +772B584188D0:E1B:g3F3CGJlYW1fbGlidwtoYW5kbGVfY2FzdGEC +772B584188E0:E1B:g3F3CGJlYW1fbGlidwtoYW5kbGVfY2FsbGED +772B584188F0:E14:g3F3CGJlYW1fbGlidwRpbml0YQE= +772B58418900:E1E:g3F3CGJlYW1fbGlidw5nZXRfY3J5cHRvX2tleWEB +772B58418910:E22:g3F3CGJlYW1fbGlidxJzaWduaWZpY2FudF9jaHVua3NhAA== +772B58418920:E1C:g3F3CGJlYW1fbGlidwxidWlsZF9tb2R1bGVhAQ== +772B58418930:E1F:g3F3CGJlYW1fbGlidw9tYWtlX2NyeXB0b19rZXlhAg== +772B58418940:E24:g3F3CGJlYW1fbGlidxRjbGVhcl9jcnlwdG9fa2V5X2Z1bmEA +772B58418950:E1E:g3F3CGJlYW1fbGlidw5jcnlwdG9fa2V5X2Z1bmEB +772B58418960:E1C:g3F3CGJlYW1fbGlidwxmb3JtYXRfZXJyb3JhAQ== +772B58418970:E17:g3F3CGJlYW1fbGlidwd2ZXJzaW9uYQE= +772B58418980:E1D:g3F3CGJlYW1fbGlidw1zdHJpcF9yZWxlYXNlYQI= +772B58418990:E1D:g3F3CGJlYW1fbGlidw1zdHJpcF9yZWxlYXNlYQE= +772B584189A0:E1B:g3F3CGJlYW1fbGlidwtzdHJpcF9maWxlc2EC +772B584189B0:E1B:g3F3CGJlYW1fbGlidwtzdHJpcF9maWxlc2EB +772B584189C0:E15:g3F3CGJlYW1fbGlidwVzdHJpcGEC +772B584189D0:E15:g3F3CGJlYW1fbGlidwVzdHJpcGEB +772B584189E0:E19:g3F3CGJlYW1fbGlidwlkaWZmX2RpcnNhAg== +772B584189F0:E18:g3F3CGJlYW1fbGlidwhjbXBfZGlyc2EC +772B58418A00:E13:g3F3CGJlYW1fbGlidwNjbXBhAg== +772B58418A10:E1A:g3F3CGJlYW1fbGlidwphbGxfY2h1bmtzYQE= +772B58418A20:E16:g3F3CGJlYW1fbGlidwZjaHVua3NhAw== +772B58418A30:E14:g3F3CGJlYW1fbGlidwRpbmZvYQE= +772B58418A40:E12:g3F3BHNvZnN3BmRvbWFpbmEB +772B58418A50:E1F:g3F3BHNvZnN3E3N5bW1ldHJpY19wYXJ0aXRpb25hAg== +772B58418A60:E11:g3F3BHNvZnN3BWltYWdlYQI= +772B58418A70:E17:g3F3BHNvZnN3C3Jlc3RyaWN0aW9uYQI= +772B58418A80:E17:g3F3B2ZpbGVsaWJ3CHdpbGRjYXJkYQE= +772B58418A90:E15:g3F3B2ZpbGVsaWJ3BmlzX2RpcmEB +772B58418AA0:E1D:g3F3BmNyeXB0b3cPY3J5cHRvX29uZV90aW1lYQU= +772B58418AB0:E26:g3F3A2VwcHcbcmVzdG9yZV90eXBlZF9yZWNvcmRfZmllbGRzYQE= +772B58418AC0:E13:g3F3BmNyeXB0b3cFc3RhcnRhAA== +772B58418AD0:E19:g3F3BmJpbmFyeXcLbW9kdWxlX2luZm9hAQ== +772B58418AE0:E19:g3F3BmJpbmFyeXcLbW9kdWxlX2luZm9hAA== +772B58418AF0:E18:g3F3BmJpbmFyeXcKZGVjb2RlX2hleGEB +772B58418B00:E18:g3F3BmJpbmFyeXcKZW5jb2RlX2hleGEC +772B58418B10:E18:g3F3BmJpbmFyeXcKZW5jb2RlX2hleGEB +772B58418B20:E15:g3F3BmJpbmFyeXcHcmVwbGFjZWED +772B58418B30:E19:g3F3BmJpbmFyeXcLYmluX3RvX2xpc3RhAw== +772B58418B40:E19:g3F3BmJpbmFyeXcLYmluX3RvX2xpc3RhAg== +772B58418B50:E19:g3F3BmJpbmFyeXcLYmluX3RvX2xpc3RhAQ== +772B58418B60:E1A:g3F3B2diX3NldHN3C21vZHVsZV9pbmZvYQE= +772B58418B70:E1A:g3F3B2diX3NldHN3C21vZHVsZV9pbmZvYQA= +772B58418B80:E18:g3F3B2diX3NldHN3CWZpbHRlcm1hcGEC +772B58418B90:E12:g3F3B2diX3NldHN3A21hcGEC +772B58418BA0:E15:g3F3B2diX3NldHN3BmZpbHRlcmEC +772B58418BB0:E15:g3F3B2diX3NldHN3BmlzX3NldGEB +772B58418BC0:E18:g3F3B2diX3NldHN3CWlzX3N1YnNldGEC +772B58418BD0:E19:g3F3B2diX3NldHN3CmRpZmZlcmVuY2VhAg== +772B58418BE0:E1A:g3F3B2diX3NldHN3C2lzX2Rpc2pvaW50YQI= +772B58418BF0:E1B:g3F3B2diX3NldHN3DGludGVyc2VjdGlvbmEB +772B58418C00:E1B:g3F3B2diX3NldHN3DGludGVyc2VjdGlvbmEC +772B58418C10:E14:g3F3B2diX3NldHN3BXVuaW9uYQE= +772B58418C20:E14:g3F3B2diX3NldHN3BXVuaW9uYQI= +772B58418C30:E13:g3F3B2diX3NldHN3BG5leHRhAQ== +772B58418C40:E1C:g3F3B2diX3NldHN3DWl0ZXJhdG9yX2Zyb21hAw== +772B58418C50:E1C:g3F3B2diX3NldHN3DWl0ZXJhdG9yX2Zyb21hAg== +772B58418C60:E17:g3F3B2diX3NldHN3CGl0ZXJhdG9yYQI= +772B58418C70:E17:g3F3B2diX3NldHN3CGl0ZXJhdG9yYQE= +772B58418C80:E15:g3F3B2diX3NldHN3BmxhcmdlcmEC +772B58418C90:E16:g3F3B2diX3NldHN3B3NtYWxsZXJhAg== +772B58418CA0:E16:g3F3B2diX3NldHN3B2xhcmdlc3RhAQ== +772B58418CB0:E1B:g3F3B2diX3NldHN3DHRha2VfbGFyZ2VzdGEB +772B58418CC0:E17:g3F3B2diX3NldHN3CHNtYWxsZXN0YQE= +772B58418CD0:E1C:g3F3B2diX3NldHN3DXRha2Vfc21hbGxlc3RhAQ== +772B58418CE0:E15:g3F3B2diX3NldHN3BmRlbGV0ZWEC +772B58418CF0:E19:g3F3B2diX3NldHN3CmRlbGV0ZV9hbnlhAg== +772B58418D00:E1A:g3F3B2diX3NldHN3C2RlbF9lbGVtZW50YQI= +772B58418D10:E1A:g3F3B2diX3NldHN3C2Zyb21fb3Jkc2V0YQE= +772B58418D20:E12:g3F3B2diX3NldHN3A2FkZGEC +772B58418D30:E16:g3F3B2diX3NldHN3B2JhbGFuY2VhAQ== +772B58418D40:E15:g3F3B2diX3NldHN3Bmluc2VydGEC +772B58418D50:E18:g3F3B2diX3NldHN3CXNpbmdsZXRvbmEB +772B58418D60:E17:g3F3B2diX3NldHN3CGlzX2VxdWFsYQI= +772B58418D70:E13:g3F3B2diX3NldHN3BHNpemVhAQ== +772B58418D80:E17:g3F3B2diX3NldHN3CGlzX2VtcHR5YQE= +772B58418D90:E1B:g3F3CGdiX3RyZWVzdwttb2R1bGVfaW5mb2EB +772B58418DA0:E1B:g3F3CGdiX3RyZWVzdwttb2R1bGVfaW5mb2EA +772B58418DB0:E13:g3F3CGdiX3RyZWVzdwNtYXBhAg== +772B58418DC0:E14:g3F3CGdiX3RyZWVzdwRuZXh0YQE= +772B58418DD0:E1D:g3F3CGdiX3RyZWVzdw1pdGVyYXRvcl9mcm9tYQM= +772B58418DE0:E1D:g3F3CGdiX3RyZWVzdw1pdGVyYXRvcl9mcm9tYQI= +772B58418DF0:E18:g3F3CGdiX3RyZWVzdwhpdGVyYXRvcmEC +772B58418E00:E18:g3F3CGdiX3RyZWVzdwhpdGVyYXRvcmEB +772B58418E10:E16:g3F3CGdiX3RyZWVzdwZ2YWx1ZXNhAQ== +772B58418E20:E14:g3F3CGdiX3RyZWVzdwRrZXlzYQE= +772B58418E30:E17:g3F3CGdiX3RyZWVzdwd0b19saXN0YQE= +772B58418E40:E16:g3F3CGdiX3RyZWVzdwZsYXJnZXJhAg== +772B58418E50:E17:g3F3CGdiX3RyZWVzdwdzbWFsbGVyYQI= +772B58418E60:E17:g3F3CGdiX3RyZWVzdwdsYXJnZXN0YQE= +772B58418E70:E1C:g3F3CGdiX3RyZWVzdwx0YWtlX2xhcmdlc3RhAQ== +772B58418E80:E18:g3F3CGdiX3RyZWVzdwhzbWFsbGVzdGEB +772B58418E90:E1D:g3F3CGdiX3RyZWVzdw10YWtlX3NtYWxsZXN0YQE= +772B58418EA0:E14:g3F3CGdiX3RyZWVzdwR0YWtlYQI= +772B58418EB0:E18:g3F3CGdiX3RyZWVzdwh0YWtlX2FueWEC +772B58418EC0:E16:g3F3CGdiX3RyZWVzdwZkZWxldGVhAg== +772B58418ED0:E1A:g3F3CGdiX3RyZWVzdwpkZWxldGVfYW55YQI= +772B58418EE0:E1C:g3F3CGdiX3RyZWVzdwxmcm9tX29yZGRpY3RhAQ== +772B58418EF0:E17:g3F3CGdiX3RyZWVzdwdiYWxhbmNlYQE= +772B58418F00:E15:g3F3CGdiX3RyZWVzdwVlbnRlcmED +772B58418F10:E16:g3F3CGdiX3RyZWVzdwZpbnNlcnRhAw== +772B58418F20:E16:g3F3CGdiX3RyZWVzdwZ1cGRhdGVhAw== +772B58418F30:E13:g3F3CGdiX3RyZWVzdwNnZXRhAg== +772B58418F40:E1A:g3F3CGdiX3RyZWVzdwppc19kZWZpbmVkYQI= +772B58418F50:E16:g3F3CGdiX3RyZWVzdwZsb29rdXBhAg== +772B58418F60:E14:g3F3CGdiX3RyZWVzdwRzaXplYQE= +772B58418F70:E18:g3F3CGdiX3RyZWVzdwhpc19lbXB0eWEB +772B58418F80:E15:g3F3CGdiX3RyZWVzdwVlbXB0eWEA +772B58418F90:E1A:g3F3B3VuaWNvZGV3C21vZHVsZV9pbmZvYQE= +772B58418FA0:E1A:g3F3B3VuaWNvZGV3C21vZHVsZV9pbmZvYQA= +772B58418FB0:E28:g3F3B3VuaWNvZGV3GWNoYXJhY3RlcnNfdG9fbmZrY19iaW5hcnlhAQ== +772B58418FC0:E26:g3F3B3VuaWNvZGV3F2NoYXJhY3RlcnNfdG9fbmZrY19saXN0YQE= +772B58418FD0:E27:g3F3B3VuaWNvZGV3GGNoYXJhY3RlcnNfdG9fbmZjX2JpbmFyeWEB +772B58418FE0:E28:g3F3B3VuaWNvZGV3GWNoYXJhY3RlcnNfdG9fbmZrZF9iaW5hcnlhAQ== +772B58418FF0:E26:g3F3B3VuaWNvZGV3F2NoYXJhY3RlcnNfdG9fbmZrZF9saXN0YQE= +772B58419000:E27:g3F3B3VuaWNvZGV3GGNoYXJhY3RlcnNfdG9fbmZkX2JpbmFyeWEB +772B58419010:E25:g3F3B3VuaWNvZGV3FmNoYXJhY3RlcnNfdG9fbmZkX2xpc3RhAQ== +772B58419020:E1E:g3F3B3VuaWNvZGV3D2VuY29kaW5nX3RvX2JvbWEB +772B58419030:E1E:g3F3B3VuaWNvZGV3D2JvbV90b19lbmNvZGluZ2EB +772B58419040:E17:g3F3DHVuaWNvZGVfdXRpbHcDbmZkYQE= +772B58419050:E18:g3F3DHVuaWNvZGVfdXRpbHcEbmZrZGEB +772B58419060:E17:g3F3DHVuaWNvZGVfdXRpbHcDbmZjYQE= +772B58419070:E18:g3F3DHVuaWNvZGVfdXRpbHcEbmZrY2EB +772B58419080:E1F:g3F3DGVybF9mZWF0dXJlc3cLbW9kdWxlX2luZm9hAQ== +772B58419090:E1F:g3F3DGVybF9mZWF0dXJlc3cLbW9kdWxlX2luZm9hAA== +772B584190A0:E18:g3F3DGVybF9mZWF0dXJlc3cEdXNlZGEB +772B584190B0:E1C:g3F3DGVybF9mZWF0dXJlc3cIa2V5d29yZHNhAA== +772B584190C0:E20:g3F3DGVybF9mZWF0dXJlc3cMZm9ybWF0X2Vycm9yYQE= +772B584190D0:E20:g3F3DGVybF9mZWF0dXJlc3cMZm9ybWF0X2Vycm9yYQI= +772B584190E0:E1F:g3F3DGVybF9mZWF0dXJlc3cLa2V5d29yZF9mdW5hBA== +772B584190F0:E1F:g3F3DGVybF9mZWF0dXJlc3cLa2V5d29yZF9mdW5hAg== +772B58419100:E18:g3F3DGVybF9mZWF0dXJlc3cEaW5mb2EB +772B58419110:E18:g3F3DGVybF9mZWF0dXJlc3cEbG9uZ2EB +772B58419120:E19:g3F3DGVybF9mZWF0dXJlc3cFc2hvcnRhAQ== +772B58419130:E17:g3F3DGVybF9mZWF0dXJlc3cDYWxsYQA= +772B58419140:E14:g3F3BnN0cmluZ3cGdG9rZW5zYQI= +772B58419150:E14:g3F3BmlvX2xpYncGZndyaXRlYQI= +772B58419160:E20:g3F3DnN0YW5kYXJkX2Vycm9ydwpzdGFydF9saW5rYQA= +772B58419170:E21:g3F3DnN0YW5kYXJkX2Vycm9ydwttb2R1bGVfaW5mb2EB +772B58419180:E21:g3F3DnN0YW5kYXJkX2Vycm9ydwttb2R1bGVfaW5mb2EA +772B58419190:E1A:g3F3DnN0YW5kYXJkX2Vycm9ydwRpbml0YQE= +772B584191A0:E1F:g3F3DnN0YW5kYXJkX2Vycm9ydwl0ZXJtaW5hdGVhAg== +772B584191B0:E23:g3F3EXN1cGVydmlzb3JfYnJpZGdldwpzdGFydF9saW5rYQM= +772B584191C0:E1B:g3F3BWdyb3Vwdw5sb2dfaW9fcmVxdWVzdGED +772B584191D0:E23:g3F3EXN1cGVydmlzb3JfYnJpZGdldwpmb3JtYXRfbG9nYQE= +772B584191E0:E23:g3F3EXN1cGVydmlzb3JfYnJpZGdldwpmb3JtYXRfbG9nYQI= +772B584191F0:E24:g3F3EXN1cGVydmlzb3JfYnJpZGdldwttb2R1bGVfaW5mb2EB +772B58419200:E24:g3F3EXN1cGVydmlzb3JfYnJpZGdldwttb2R1bGVfaW5mb2EA +772B58419210:E27:g3F3EXN1cGVydmlzb3JfYnJpZGdldw5iZWhhdmlvdXJfaW5mb2EB +772B58419220:E24:g3F3EXN1cGVydmlzb3JfYnJpZGdldwtjb2RlX2NoYW5nZWED +772B58419230:E22:g3F3EXN1cGVydmlzb3JfYnJpZGdldwl0ZXJtaW5hdGVhAg== +772B58419240:E24:g3F3EXN1cGVydmlzb3JfYnJpZGdldwtoYW5kbGVfaW5mb2EC +772B58419250:E24:g3F3EXN1cGVydmlzb3JfYnJpZGdldwtoYW5kbGVfY2FzdGEC +772B58419260:E24:g3F3EXN1cGVydmlzb3JfYnJpZGdldwtoYW5kbGVfY2FsbGED +772B58419270:E1D:g3F3EXN1cGVydmlzb3JfYnJpZGdldwRpbml0YQE= +772B58419280:E23:g3F3EXN1cGVydmlzb3JfYnJpZGdldwpzdGFydF9saW5rYQI= +772B58419290:E19:g3F3B2luZXRfZGJ3CnN0YXJ0X2xpbmthAA== +772B584192A0:E1A:g3F3B2luZXRfZGJ3C21vZHVsZV9pbmZvYQE= +772B584192B0:E1A:g3F3B2luZXRfZGJ3C21vZHVsZV9pbmZvYQA= +772B584192C0:E19:g3F3B2luZXRfZGJ3CmVxX2RvbWFpbnNhAg== +772B584192D0:E16:g3F3B2luZXRfZGJ3B3RvbG93ZXJhAQ== +772B584192E0:E18:g3F3B2luZXRfZGJ3CXRlcm1pbmF0ZWEC +772B584192F0:E1A:g3F3B2luZXRfZGJ3C2hhbmRsZV9pbmZvYQI= +772B58419300:E1A:g3F3B2luZXRfZGJ3C2hhbmRsZV9jYXN0YQI= +772B58419310:E1A:g3F3B2luZXRfZGJ3C2hhbmRsZV9jYWxsYQM= +772B58419320:E13:g3F3B2luZXRfZGJ3BGluaXRhAQ== +772B58419330:E1F:g3F3B2luZXRfZGJ3EHRha2Vfc29ja2V0X3R5cGVhAQ== +772B58419340:E1E:g3F3B2luZXRfZGJ3D3B1dF9zb2NrZXRfdHlwZWEC +772B58419350:E1C:g3F3B2luZXRfZGJ3DWxvb2t1cF9zb2NrZXRhAQ== +772B58419360:E20:g3F3B2luZXRfZGJ3EXVucmVnaXN0ZXJfc29ja2V0YQE= +772B58419370:E20:g3F3B2luZXRfZGJ3EXJlc19nZXRob3N0YnlhZGRyYQM= +772B58419380:E1C:g3F3B2luZXRfZGJ3DWdldGhvc3RieWFkZHJhAg== +772B58419390:E24:g3F3B2luZXRfZGJ3FXJlc19ob3N0ZW50X2J5X2RvbWFpbmED +772B584193A0:E1D:g3F3B2luZXRfZGJ3DmdldF9zZWFyY2hsaXN0YQA= +772B584193B0:E18:g3F3B2luZXRfZGJ3CWdldGJ5bmFtZWEC +772B584193C0:E15:g3F3B2luZXRfZGJ3BmRlbF9ycmEE +772B584193D0:E15:g3F3B2luZXRfZGJ3BmFkZF9ycmEF +772B584193E0:E15:g3F3B2luZXRfZGJ3BmFkZF9ycmEB +772B584193F0:E1F:g3F3B2luZXRfZGJ3EHJlc191cGRhdGVfaG9zdHNhAA== +772B58419400:E1E:g3F3B2luZXRfZGJ3D3Jlc191cGRhdGVfY29uZmEA +772B58419410:E1A:g3F3B2luZXRfZGJ3C2dldGhvc3RuYW1lYQA= +772B58419420:E1B:g3F3B2luZXRfZGJ3DHNvY2tzX29wdGlvbmEB +772B58419430:E1F:g3F3B2luZXRfZGJ3EHJlc19jaGVja19vcHRpb25hAg== +772B58419440:E19:g3F3B2luZXRfZGJ3CnJlc19vcHRpb25hAg== +772B58419450:E19:g3F3B2luZXRfZGJ3CnJlc19vcHRpb25hAQ== +772B58419460:E15:g3F3B2luZXRfZGJ3BmdldF9yY2EA +772B58419470:E1A:g3F3B2luZXRfZGJ3C2FkZF9yY19saXN0YQE= +772B58419480:E19:g3F3B2luZXRfZGJ3CmFkZF9yY19iaW5hAQ== +772B58419490:E15:g3F3B2luZXRfZGJ3BmFkZF9yY2EB +772B584194A0:E1A:g3F3B2luZXRfZGJ3C3NjdHBfbW9kdWxlYQA= +772B584194B0:E1E:g3F3B2luZXRfZGJ3D3NldF9zY3RwX21vZHVsZWEB +772B584194C0:E19:g3F3B2luZXRfZGJ3CnVkcF9tb2R1bGVhAA== +772B584194D0:E1D:g3F3B2luZXRfZGJ3DnNldF91ZHBfbW9kdWxlYQE= +772B584194E0:E19:g3F3B2luZXRfZGJ3CnRjcF9tb2R1bGVhAA== +772B584194F0:E1D:g3F3B2luZXRfZGJ3DnNldF90Y3BfbW9kdWxlYQE= +772B58419500:E1A:g3F3B2luZXRfZGJ3C2NsZWFyX2NhY2hlYQA= +772B58419510:E20:g3F3B2luZXRfZGJ3EXNldF9jYWNoZV9yZWZyZXNoYQE= +772B58419520:E1D:g3F3B2luZXRfZGJ3DnNldF9jYWNoZV9zaXplYQE= +772B58419530:E20:g3F3B2luZXRfZGJ3EWRlbF9zb2Nrc19ub3Byb3h5YQE= +772B58419540:E20:g3F3B2luZXRfZGJ3EWFkZF9zb2Nrc19ub3Byb3h5YQE= +772B58419550:E20:g3F3B2luZXRfZGJ3EWRlbF9zb2Nrc19tZXRob2RzYQA= +772B58419560:E20:g3F3B2luZXRfZGJ3EWRlbF9zb2Nrc19tZXRob2RzYQE= +772B58419570:E20:g3F3B2luZXRfZGJ3EWFkZF9zb2Nrc19tZXRob2RzYQE= +772B58419580:E1D:g3F3B2luZXRfZGJ3DnNldF9zb2Nrc19wb3J0YQE= +772B58419590:E1F:g3F3B2luZXRfZGJ3EHNldF9zb2Nrc19zZXJ2ZXJhAQ== +772B584195A0:E1D:g3F3B2luZXRfZGJ3DmdldF9ob3N0c19maWxlYQA= +772B584195B0:E1D:g3F3B2luZXRfZGJ3DnNldF9ob3N0c19maWxlYQE= +772B584195C0:E1E:g3F3B2luZXRfZGJ3D3NldF9yZXNvbHZfY29uZmEB +772B584195D0:E1C:g3F3B2luZXRfZGJ3DXNldF9kbnNzZWNfb2thAQ== +772B584195E0:E23:g3F3B2luZXRfZGJ3FHNldF91ZHBfcGF5bG9hZF9zaXplYQE= +772B584195F0:E17:g3F3B2luZXRfZGJ3CHNldF9lZG5zYQE= +772B58419600:E18:g3F3B2luZXRfZGJ3CXNldF91c2V2Y2EB +772B58419610:E18:g3F3B2luZXRfZGJ3CXNldF9pbmV0NmEB +772B58419620:E29:g3F3B2luZXRfZGJ3GnNldF9zZXJ2ZmFpbF9yZXRyeV90aW1lb3V0YQE= +772B58419630:E18:g3F3B2luZXRfZGJ3CXNldF9yZXRyeWEB +772B58419640:E1A:g3F3B2luZXRfZGJ3C3NldF90aW1lb3V0YQE= +772B58419650:E1A:g3F3B2luZXRfZGJ3C3NldF9yZWN1cnNlYQE= +772B58419660:E19:g3F3B2luZXRfZGJ3CnNldF9sb29rdXBhAQ== +772B58419670:E19:g3F3B2luZXRfZGJ3CnNldF9kb21haW5hAQ== +772B58419680:E1B:g3F3B2luZXRfZGJ3DHNldF9ob3N0bmFtZWEB +772B58419690:E19:g3F3B2luZXRfZGJ3CmRlbF9zZWFyY2hhAQ== +772B584196A0:E19:g3F3B2luZXRfZGJ3Cmluc19zZWFyY2hhAQ== +772B584196B0:E19:g3F3B2luZXRfZGJ3CmFkZF9zZWFyY2hhAQ== +772B584196C0:E19:g3F3B2luZXRfZGJ3CmRlbF9hbHRfbnNhAg== +772B584196D0:E19:g3F3B2luZXRfZGJ3CmRlbF9hbHRfbnNhAQ== +772B584196E0:E19:g3F3B2luZXRfZGJ3Cmluc19hbHRfbnNhAg== +772B584196F0:E19:g3F3B2luZXRfZGJ3Cmluc19hbHRfbnNhAQ== +772B58419700:E19:g3F3B2luZXRfZGJ3CmFkZF9hbHRfbnNhAg== +772B58419710:E19:g3F3B2luZXRfZGJ3CmFkZF9hbHRfbnNhAQ== +772B58419720:E15:g3F3B2luZXRfZGJ3BmRlbF9uc2EC +772B58419730:E15:g3F3B2luZXRfZGJ3BmRlbF9uc2EB +772B58419740:E15:g3F3B2luZXRfZGJ3Bmluc19uc2EC +772B58419750:E15:g3F3B2luZXRfZGJ3Bmluc19uc2EB +772B58419760:E15:g3F3B2luZXRfZGJ3BmFkZF9uc2EC +772B58419770:E15:g3F3B2luZXRfZGJ3BmFkZF9uc2EB +772B58419780:E1A:g3F3B2luZXRfZGJ3C2NsZWFyX2hvc3RzYQA= +772B58419790:E17:g3F3B2luZXRfZGJ3CGRlbF9ob3N0YQE= +772B584197A0:E17:g3F3B2luZXRfZGJ3CGFkZF9ob3N0YQI= +772B584197B0:E18:g3F3B2luZXRfZGJ3CWFkZF9ob3N0c2EB +772B584197C0:E19:g3F3B2luZXRfZGJ3CmFkZF9yZXNvbHZhAQ== +772B584197D0:E14:g3F3B2luZXRfZGJ3BXJlc2V0YQA= +772B584197E0:E13:g3F3B2luZXRfZGJ3BHN0b3BhAA== +772B584197F0:E14:g3F3B2luZXRfZGJ3BXN0YXJ0YQA= +772B58419800:E17:g3F3C2luZXRfY29uZmlndwRpbml0YQA= +772B58419810:E18:g3F3CmluZXRfcGFyc2V3BnJlc29sdmEB +772B58419820:E17:g3F3CmluZXRfcGFyc2V3BWhvc3RzYQE= +772B58419830:E20:g3F3CmluZXRfcGFyc2V3DnZpc2libGVfc3RyaW5nYQE= +772B58419840:E16:g3F3CmluZXRfcGFyc2V3BGRvdHNhAQ== +772B58419850:E17:g3F3CmluZXRfcGFyc2V3BWhvc3RzYQI= +772B58419860:E18:g3F3CmluZXRfcGFyc2V3BnJlc29sdmEC +772B58419870:E1E:g3F3C2luZXRfY29uZmlndwttb2R1bGVfaW5mb2EB +772B58419880:E1E:g3F3C2luZXRfY29uZmlndwttb2R1bGVfaW5mb2EA +772B58419890:E21:g3F3C2luZXRfY29uZmlndw5kb19sb2FkX3Jlc29sdmEC +772B584198A0:E19:g3F3BGluZXR3DWdldGhvc3RieW5hbWVhAQ== +772B584198B0:E14:g3F3CGluZXRfdWRwdwRvcGVuYQI= +772B584198C0:E17:g3F3BGluZXR3C2dldGhvc3RuYW1lYQE= +772B584198D0:E15:g3F3CGluZXRfdWRwdwVjbG9zZWEB +772B584198E0:E14:g3F3CHdpbjMycmVndwRvcGVuYQE= +772B584198F0:E1A:g3F3CHdpbjMycmVndwpjaGFuZ2Vfa2V5YQI= +772B58419900:E15:g3F3CHdpbjMycmVndwVjbG9zZWEB +772B58419910:E16:g3F3CHdpbjMycmVndwZleHBhbmRhAQ== +772B58419920:E1C:g3F3CmluZXRfcGFyc2V3CnNwbGl0X2xpbmVhAQ== +772B58419930:E15:g3F3CHdpbjMycmVndwV2YWx1ZWEC +772B58419940:E19:g3F3CmluZXRfcGFyc2V3B2FkZHJlc3NhAQ== +772B58419950:E1B:g3F3CGluZXRfdWRwdwttb2R1bGVfaW5mb2EB +772B58419960:E1B:g3F3CGluZXRfdWRwdwttb2R1bGVfaW5mb2EA +772B58419970:E16:g3F3CGluZXRfdWRwdwZmZG9wZW5hAg== +772B58419980:E23:g3F3CGluZXRfdWRwdxNjb250cm9sbGluZ19wcm9jZXNzYQI= +772B58419990:E14:g3F3CGluZXRfdWRwdwRyZWN2YQM= +772B584199A0:E14:g3F3CGluZXRfdWRwdwRyZWN2YQI= +772B584199B0:E17:g3F3CGluZXRfdWRwdwdjb25uZWN0YQM= +772B584199C0:E17:g3F3CGluZXRfdWRwdwdjb25uZWN0YQI= +772B584199D0:E14:g3F3CGluZXRfdWRwdwRzZW5kYQI= +772B584199E0:E14:g3F3CGluZXRfdWRwdwRzZW5kYQQ= +772B584199F0:E14:g3F3CGluZXRfdWRwdwRvcGVuYQE= +772B58419A00:E1C:g3F3CGluZXRfdWRwdwx0cmFuc2xhdGVfaXBhAQ== +772B58419A10:E17:g3F3CGluZXRfdWRwdwdnZXRhZGRyYQI= +772B58419A20:E17:g3F3CGluZXRfdWRwdwdnZXRhZGRyYQE= +772B58419A30:E17:g3F3CGluZXRfdWRwdwdnZXRzZXJ2YQE= +772B58419A40:E19:g3F3BGluZXR3DWdldHNlcnZieW5hbWVhAg== +772B58419A50:E13:g3F3BGluZXR3B2dldGFkZHJhAg== +772B58419A60:E13:g3F3BGluZXR3B2dldGFkZHJhAw== +772B58419A70:E18:g3F3BGluZXR3DHRyYW5zbGF0ZV9pcGEC +772B58419A80:E17:g3F3BGluZXR3C3VkcF9vcHRpb25zYQI= +772B58419A90:E15:g3F3BGluZXR3CW9wZW5fYmluZGEI +772B58419AA0:E15:g3F3BGluZXR3CXVkcF9jbG9zZWEB +772B58419AB0:E23:g3F3BGluZXR3F3VkcF9jb250cm9sbGluZ19wcm9jZXNzYQI= +772B58419AC0:E12:g3F3BGluZXR3BmZkb3BlbmEG +772B58419AD0:E17:g3F3BGluZXR3C21vZHVsZV9pbmZvYQE= +772B58419AE0:E17:g3F3BGluZXR3C21vZHVsZV9pbmZvYQA= +772B58419AF0:E18:g3F3BGluZXR3DGluZXRfYmFja2VuZGEA +772B58419B00:E1B:g3F3BGluZXR3D2Vuc3VyZV9zb2NrYWRkcmEB +772B58419B10:E17:g3F3BGluZXR3C2xvY2tfc29ja2V0YQI= +772B58419B20:E16:g3F3BGluZXR3CnN0b3BfdGltZXJhAQ== +772B58419B30:E13:g3F3BGluZXR3B3RpbWVvdXRhAg== +772B58419B40:E13:g3F3BGluZXR3B3RpbWVvdXRhAQ== +772B58419B50:E17:g3F3BGluZXR3C3N0YXJ0X3RpbWVyYQE= +772B58419B60:E23:g3F3BGluZXR3F3RjcF9jb250cm9sbGluZ19wcm9jZXNzYQI= +772B58419B70:E15:g3F3BGluZXR3CXRjcF9jbG9zZWEB +772B58419B80:E18:g3F3BGluZXR3DGZvcm1hdF9lcnJvcmEB +772B58419B90:ED:g3F3BGluZXR3AWlhAg== +772B58419BA0:ED:g3F3BGluZXR3AWlhAQ== +772B58419BB0:ED:g3F3BGluZXR3AWlhAA== +772B58419BC0:E10:g3F3BGluZXR3BG9wZW5hCA== +772B58419BD0:E20:g3F3BGluZXR3FGdldGhvc3RieW5hbWVfc3RyaW5nYQI= +772B58419BE0:E1E:g3F3BGluZXR3EmdldGhvc3RieW5hbWVfc2VsZmEC +772B58419BF0:E17:g3F3BGluZXR3C2dldGFkZHJzX3RtYQM= +772B58419C00:E17:g3F3BGluZXR3C3NjdHBfbW9kdWxlYQE= +772B58419C10:E18:g3F3BGluZXR3DHNjdHBfb3B0aW9uc2EC +772B58419C20:E1A:g3F3BGluZXR3Dmdlbl91ZHBfbW9kdWxlYQE= +772B58419C30:E16:g3F3BGluZXR3CnVkcF9tb2R1bGVhAg== +772B58419C40:E16:g3F3BGluZXR3CnVkcF9tb2R1bGVhAQ== +772B58419C50:E1A:g3F3BGluZXR3Dmdlbl90Y3BfbW9kdWxlYQE= +772B58419C60:E16:g3F3BGluZXR3CnRjcF9tb2R1bGVhAg== +772B58419C70:E16:g3F3BGluZXR3CnRjcF9tb2R1bGVhAQ== +772B58419C80:E1A:g3F3BGluZXR3Dmxpc3Rlbl9vcHRpb25zYQI= +772B58419C90:E1B:g3F3BGluZXR3D2Nvbm5lY3Rfb3B0aW9uc2EC +772B58419CA0:E11:g3F3BGluZXR3BXN0YXRzYQA= +772B58419CB0:E13:g3F3BGluZXR3B29wdGlvbnNhAA== +772B58419CC0:E24:g3F3BGluZXR3GGlwdjRfbWFwcGVkX2lwdjZfYWRkcmVzc2EB +772B58419CD0:E20:g3F3BGluZXR3FHBhcnNlX3N0cmljdF9hZGRyZXNzYQI= +772B58419CE0:E20:g3F3BGluZXR3FHBhcnNlX3N0cmljdF9hZGRyZXNzYQE= +772B58419CF0:E19:g3F3BGluZXR3DXBhcnNlX2FkZHJlc3NhAg== +772B58419D00:E24:g3F3BGluZXR3GHBhcnNlX2lwdjZzdHJpY3RfYWRkcmVzc2EB +772B58419D10:E24:g3F3BGluZXR3GHBhcnNlX2lwdjRzdHJpY3RfYWRkcmVzc2EB +772B58419D20:E1E:g3F3BGluZXR3EnBhcnNlX2lwdjZfYWRkcmVzc2EB +772B58419D30:E1E:g3F3BGluZXR3EnBhcnNlX2lwdjRfYWRkcmVzc2EB +772B58419D40:E19:g3F3BGluZXR3DWdldHNlcnZieXBvcnRhAg== +772B58419D50:E14:g3F3BGluZXR3CGdldGFkZHJzYQM= +772B58419D60:E14:g3F3BGluZXR3CGdldGFkZHJzYQI= +772B58419D70:E16:g3F3BGluZXR3CmdldGFkZHJfdG1hAw== +772B58419D80:E11:g3F3BGluZXR3BWdldGZkYQE= +772B58419D90:E11:g3F3BGluZXR3BWdldGxsYQE= +772B58419DA0:E19:g3F3BGluZXR3DWlzX2lwX2FkZHJlc3NhAQ== +772B58419DB0:E1B:g3F3BGluZXR3D2lzX2lwdjZfYWRkcmVzc2EB +772B58419DC0:E1B:g3F3BGluZXR3D2lzX2lwdjRfYWRkcmVzc2EB +772B58419DD0:EE:g3F3BGluZXR3AmlwYQE= +772B58419DE0:E10:g3F3BGluZXR3BGluZm9hAQ== +772B58419DF0:E1A:g3F3BGluZXR3DnNvY2tldF90b19saXN0YQE= +772B58419E00:E1C:g3F3BGluZXR3EGdldGhvc3RieWFkZHJfdG1hAg== +772B58419E10:E19:g3F3BGluZXR3DWdldGhvc3RieWFkZHJhAg== +772B58419E20:E19:g3F3BGluZXR3DWdldGhvc3RieWFkZHJhAQ== +772B58419E30:E1C:g3F3BGluZXR3EGdldGhvc3RieW5hbWVfdG1hAw== +772B58419E40:E19:g3F3BGluZXR3DWdldGhvc3RieW5hbWVhAw== +772B58419E50:E19:g3F3BGluZXR3DWdldGhvc3RieW5hbWVhAg== +772B58419E60:E13:g3F3BGluZXR3B2dldHN0YXRhAg== +772B58419E70:E13:g3F3BGluZXR3B2dldHN0YXRhAQ== +772B58419E80:E17:g3F3BGluZXR3C2dldGhvc3RuYW1lYQA= +772B58419E90:E10:g3F3BGluZXR3BHBvcGZhAQ== +772B58419EA0:E11:g3F3BGluZXR3BXB1c2hmYQM= +772B58419EB0:E11:g3F3BGluZXR3BWdldGlmYQE= +772B58419EC0:E11:g3F3BGluZXR3BWdldGlmYQA= +772B58419ED0:E11:g3F3BGluZXR3BWlmc2V0YQI= +772B58419EE0:E11:g3F3BGluZXR3BWlmc2V0YQM= +772B58419EF0:E11:g3F3BGluZXR3BWlmZ2V0YQI= +772B58419F00:E11:g3F3BGluZXR3BWlmZ2V0YQM= +772B58419F10:E15:g3F3BGluZXR3CWdldGlmbGlzdGEA +772B58419F20:E15:g3F3BGluZXR3CWdldGlmbGlzdGEB +772B58419F30:E16:g3F3BGluZXR3CmdldGlmYWRkcnNhAQ== +772B58419F40:E13:g3F3BGluZXR3B2dldG9wdHNhAg== +772B58419F50:E10:g3F3BGluZXR3BHNlbmRhAg== +772B58419F60:E15:g3F3BGluZXR3CXNvY2tuYW1lc2EC +772B58419F70:E15:g3F3BGluZXR3CXNvY2tuYW1lc2EB +772B58419F80:E17:g3F3BGluZXR3C3NldHNvY2tuYW1lYQI= +772B58419F90:E14:g3F3BGluZXR3CHNvY2tuYW1lYQE= +772B58419FA0:E15:g3F3BGluZXR3CXBlZXJuYW1lc2EC +772B58419FB0:E15:g3F3BGluZXR3CXBlZXJuYW1lc2EB +772B58419FC0:E17:g3F3BGluZXR3C3NldHBlZXJuYW1lYQI= +772B58419FD0:E14:g3F3BGluZXR3CHBlZXJuYW1lYQE= +772B58419FE0:E1A:g3F3BGluZXR3DmNhbmNlbF9tb25pdG9yYQE= +772B58419FF0:E13:g3F3BGluZXR3B21vbml0b3JhAQ== +772B5841A000:E11:g3F3BGluZXR3BWNsb3NlYQE= +772B5841A010:E12:g3F3BGluZXR3BmdldF9yY2EA +772B5841A020:E15:g3F3A25ldHcKZ2V0aWZhZGRyc2EC +772B5841A030:E15:g3F3A25ldHcKZ2V0aWZhZGRyc2EB +772B5841A040:E13:g3F3BnNvY2tldHcFaW9jdGxhAg== +772B5841A050:E13:g3F3BnNvY2tldHcFaW9jdGxhAw== +772B5841A060:E1A:g3F3BnNvY2tldHcMaXNfc3VwcG9ydGVkYQI= +772B5841A070:E13:g3F3BnNvY2tldHcFaW9jdGxhBA== +772B5841A080:E12:g3F3BnNvY2tldHcEb3BlbmEE +772B5841A090:E13:g3F3BnNvY2tldHcFY2xvc2VhAQ== +772B5841A0A0:E16:g3F3A25ldHcLZ2V0aG9zdG5hbWVhAA== +772B5841A0B0:E14:g3F3BnNvY2tldHcGZ2V0b3B0YQM= +772B5841A0C0:E18:g3F3A25ldHcNZ2V0c2VydmJ5cG9ydGEC +772B5841A0D0:E18:g3F3A25ldHcNZ2V0c2VydmJ5bmFtZWEC +772B5841A0E0:E16:g3F3CmluZXRfcGFyc2V3BG50b2FhAQ== +772B5841A0F0:E1E:g3F3CmluZXRfcGFyc2V3DGlwdjRfYWRkcmVzc2EB +772B5841A100:E1E:g3F3CmluZXRfcGFyc2V3DGlwdjZfYWRkcmVzc2EB +772B5841A110:E24:g3F3CmluZXRfcGFyc2V3EmlwdjRzdHJpY3RfYWRkcmVzc2EB +772B5841A120:E24:g3F3CmluZXRfcGFyc2V3EmlwdjZzdHJpY3RfYWRkcmVzc2EB +772B5841A130:E20:g3F3CmluZXRfcGFyc2V3DnN0cmljdF9hZGRyZXNzYQE= +772B5841A140:E1F:g3F3CmluZXRfaG9zdHN3DWdldGhvc3RieW5hbWVhAg== +772B5841A150:E20:g3F3CGluZXRfcmVzdxBnZXRob3N0YnluYW1lX3RtYQM= +772B5841A160:E28:g3F3E2luZXRfZ2V0aG9zdF9uYXRpdmV3DWdldGhvc3RieW5hbWVhAg== +772B5841A170:E1F:g3F3CmluZXRfaG9zdHN3DWdldGhvc3RieWFkZHJhAQ== +772B5841A180:E20:g3F3CGluZXRfcmVzdxBnZXRob3N0YnlhZGRyX3RtYQI= +772B5841A190:E28:g3F3E2luZXRfZ2V0aG9zdF9uYXRpdmV3DWdldGhvc3RieWFkZHJhAQ== +772B5841A1A0:E17:g3F3BnN0cmluZ3cJdXBwZXJjYXNlYQE= +772B5841A1B0:E23:g3F3Dmdlbl90Y3Bfc29ja2V0dw13aGljaF9zb2NrZXRzYQA= +772B5841A1C0:E23:g3F3Dmdlbl91ZHBfc29ja2V0dw13aGljaF9zb2NrZXRzYQA= +772B5841A1D0:E1D:g3F3CmluZXRfcGFyc2V3C21vZHVsZV9pbmZvYQE= +772B5841A1E0:E1D:g3F3CmluZXRfcGFyc2V3C21vZHVsZV9pbmZvYQA= +772B5841A1F0:E18:g3F3CmluZXRfcGFyc2V3BmRvbWFpbmEB +772B5841A200:E1A:g3F3CmluZXRfcGFyc2V3CG5ldHdvcmtzYQI= +772B5841A210:E1A:g3F3CmluZXRfcGFyc2V3CG5ldHdvcmtzYQE= +772B5841A220:E1A:g3F3CmluZXRfcGFyc2V3CG5ldG1hc2tzYQI= +772B5841A230:E1A:g3F3CmluZXRfcGFyc2V3CG5ldG1hc2tzYQE= +772B5841A240:E1B:g3F3CmluZXRfcGFyc2V3CXByb3RvY29sc2EC +772B5841A250:E1B:g3F3CmluZXRfcGFyc2V3CXByb3RvY29sc2EB +772B5841A260:E1F:g3F3CmluZXRfcGFyc2V3DW5zc3dpdGNoX2NvbmZhAg== +772B5841A270:E1F:g3F3CmluZXRfcGFyc2V3DW5zc3dpdGNoX2NvbmZhAQ== +772B5841A280:E21:g3F3CmluZXRfcGFyc2V3D2hvc3RfY29uZl9ic2Rvc2EC +772B5841A290:E21:g3F3CmluZXRfcGFyc2V3D2hvc3RfY29uZl9ic2Rvc2EB +772B5841A2A0:E23:g3F3CmluZXRfcGFyc2V3EWhvc3RfY29uZl9mcmVlYnNkYQI= +772B5841A2B0:E23:g3F3CmluZXRfcGFyc2V3EWhvc3RfY29uZl9mcmVlYnNkYQE= +772B5841A2C0:E21:g3F3CmluZXRfcGFyc2V3D2hvc3RfY29uZl9saW51eGEC +772B5841A2D0:E21:g3F3CmluZXRfcGFyc2V3D2hvc3RfY29uZl9saW51eGEB +772B5841A2E0:E15:g3F3CmluZXRfcGFyc2V3A3JwY2EC +772B5841A2F0:E15:g3F3CmluZXRfcGFyc2V3A3JwY2EB +772B5841A300:E1A:g3F3CmluZXRfcGFyc2V3CHNlcnZpY2VzYQI= +772B5841A310:E1A:g3F3CmluZXRfcGFyc2V3CHNlcnZpY2VzYQE= +772B5841A320:E12:g3F3AmlvdwhnZXRfbGluZWEC +772B5841A330:E26:g3F3E2luZXRfZ2V0aG9zdF9uYXRpdmV3C21vZHVsZV9pbmZvYQE= +772B5841A340:E26:g3F3E2luZXRfZ2V0aG9zdF9uYXRpdmV3C21vZHVsZV9pbmZvYQA= +772B5841A350:E22:g3F3E2luZXRfZ2V0aG9zdF9uYXRpdmV3B2NvbnRyb2xhAQ== +772B5841A360:E28:g3F3E2luZXRfZ2V0aG9zdF9uYXRpdmV3DWdldGhvc3RieW5hbWVhAQ== +772B5841A370:E2D:g3F3E2luZXRfZ2V0aG9zdF9uYXRpdmV3EnN5c3RlbV9jb2RlX2NoYW5nZWEE +772B5841A380:E2B:g3F3E2luZXRfZ2V0aG9zdF9uYXRpdmV3EHN5c3RlbV90ZXJtaW5hdGVhBA== +772B5841A390:E2A:g3F3E2luZXRfZ2V0aG9zdF9uYXRpdmV3D3N5c3RlbV9jb250aW51ZWED +772B5841A3A0:E24:g3F3E2luZXRfZ2V0aG9zdF9uYXRpdmV3CW1haW5fbG9vcGEB +772B5841A3B0:E26:g3F3E2luZXRfZ2V0aG9zdF9uYXRpdmV3C3NlcnZlcl9pbml0YQI= +772B5841A3C0:E24:g3F3E2luZXRfZ2V0aG9zdF9uYXRpdmV3CXRlcm1pbmF0ZWEC +772B5841A3D0:E25:g3F3E2luZXRfZ2V0aG9zdF9uYXRpdmV3CnN0YXJ0X2xpbmthAA== +772B5841A3E0:E1F:g3F3E2luZXRfZ2V0aG9zdF9uYXRpdmV3BGluaXRhAQ== +772B5841A3F0:E15:g3F3A3JwY3cKc3RhcnRfbGlua2EA +772B5841A400:E16:g3F3A3JwY3cLbW9kdWxlX2luZm9hAQ== +772B5841A410:E16:g3F3A3JwY3cLbW9kdWxlX2luZm9hAA== +772B5841A420:E10:g3F3A3JwY3cFcGluZm9hAg== +772B5841A430:E10:g3F3A3JwY3cFcGluZm9hAQ== +772B5841A440:EF:g3F3A3JwY3cEcG1hcGED +772B5841A450:E18:g3F3A3JwY3cNcGFyYWxsZWxfZXZhbGEB +772B5841A460:E13:g3F3A3JwY3cIbmJfeWllbGRhAQ== +772B5841A470:E13:g3F3A3JwY3cIbmJfeWllbGRhAg== +772B5841A480:E10:g3F3A3JwY3cFeWllbGRhAQ== +772B5841A490:E15:g3F3A3JwY3cKYXN5bmNfY2FsbGEE +772B5841A4A0:E1C:g3F3A3JwY3cRbXVsdGlfc2VydmVyX2NhbGxhAw== +772B5841A4B0:E1C:g3F3A3JwY3cRbXVsdGlfc2VydmVyX2NhbGxhAg== +772B5841A4C0:E14:g3F3A3JwY3cJbXVsdGljYWxsYQU= +772B5841A4D0:E14:g3F3A3JwY3cJbXVsdGljYWxsYQQ= +772B5841A4E0:E14:g3F3A3JwY3cJbXVsdGljYWxsYQM= +772B5841A4F0:E1A:g3F3A3JwY3cPZXZhbF9ldmVyeXdoZXJlYQQ= +772B5841A500:E1A:g3F3A3JwY3cPZXZhbF9ldmVyeXdoZXJlYQM= +772B5841A510:E11:g3F3A3JwY3cGc2JjYXN0YQM= +772B5841A520:E11:g3F3A3JwY3cGc2JjYXN0YQI= +772B5841A530:E11:g3F3A3JwY3cGYWJjYXN0YQM= +772B5841A540:E11:g3F3A3JwY3cGYWJjYXN0YQI= +772B5841A550:EF:g3F3A3JwY3cEY2FzdGEE +772B5841A560:E16:g3F3A3JwY3cLc2VydmVyX2NhbGxhBA== +772B5841A570:E15:g3F3A3JwY3cKYmxvY2tfY2FsbGEF +772B5841A580:E15:g3F3A3JwY3cKYmxvY2tfY2FsbGEE +772B5841A590:EF:g3F3A3JwY3cEY2FsbGEF +772B5841A5A0:E1B:g3F3A3JwY3cQcHJveHlfdXNlcl9mbHVzaGEA +772B5841A5B0:E16:g3F3A3JwY3cLY29kZV9jaGFuZ2VhAw== +772B5841A5C0:E14:g3F3A3JwY3cJdGVybWluYXRlYQI= +772B5841A5D0:E16:g3F3A3JwY3cLaGFuZGxlX2luZm9hAg== +772B5841A5E0:E16:g3F3A3JwY3cLaGFuZGxlX2Nhc3RhAg== +772B5841A5F0:E16:g3F3A3JwY3cLaGFuZGxlX2NhbGxhAw== +772B5841A600:EF:g3F3A3JwY3cEaW5pdGEB +772B5841A610:EF:g3F3A3JwY3cEc3RvcGEA +772B5841A620:E10:g3F3A3JwY3cFc3RhcnRhAA== +772B5841A630:E18:g3F3BGVycGN3DGV4ZWN1dGVfY2FsbGED +772B5841A640:E18:g3F3BGVycGN3DGlzX2FyZ19lcnJvcmEE +772B5841A650:E16:g3F3BGVycGN3CnRyaW1fc3RhY2thBA== +772B5841A660:E15:g3F3BGVycGN3CW11bHRpY2FsbGEF +772B5841A670:E18:g3F3BGVycGN3DHNlbmRfcmVxdWVzdGEE +772B5841A680:E1C:g3F3BGVycGN3EHJlY2VpdmVfcmVzcG9uc2VhAQ== +772B5841A690:E19:g3F3BGVycGN3DXdhaXRfcmVzcG9uc2VhAg== +772B5841A6A0:E1F:g3F3Cm5ldF9rZXJuZWx3DW1vbml0b3Jfbm9kZXNhAQ== +772B5841A6B0:E18:g3F3BGVycGN3DGV4ZWN1dGVfY2FzdGED +772B5841A6C0:E18:g3F3Bmdsb2JhbHcKc3RhcnRfbGlua2EA +772B5841A6D0:E1D:g3F3Cm5ldF9rZXJuZWx3C21vZHVsZV9pbmZvYQE= +772B5841A6E0:E1D:g3F3Cm5ldF9rZXJuZWx3C21vZHVsZV9pbmZvYQA= +772B5841A6F0:E19:g3F3Cm5ldF9rZXJuZWx3B2dldG9wdHNhAg== +772B5841A700:E19:g3F3Cm5ldF9rZXJuZWx3B3NldG9wdHNhAg== +772B5841A710:E1D:g3F3Cm5ldF9rZXJuZWx3C2Nvbm5lY3R0aW1lYQA= +772B5841A720:E1D:g3F3Cm5ldF9rZXJuZWx3C2VwbWRfbW9kdWxlYQA= +772B5841A730:E25:g3F3Cm5ldF9rZXJuZWx3E3Byb3RvY29sX2NoaWxkc3BlY3NhAA== +772B5841A740:E1C:g3F3Cm5ldF9rZXJuZWx3CnNwYXduX2Z1bmNhBg== +772B5841A750:E1A:g3F3Cm5ldF9rZXJuZWx3CGRvX3NwYXduYQM= +772B5841A760:E1C:g3F3Cm5ldF9rZXJuZWx3CmF1eF90aWNrZXJhBA== +772B5841A770:E1D:g3F3Cm5ldF9rZXJuZWx3C3RpY2tlcl9sb29wYQI= +772B5841A780:E18:g3F3Cm5ldF9rZXJuZWx3BnRpY2tlcmEC +772B5841A790:E1D:g3F3Cm5ldF9rZXJuZWx3C2hhbmRsZV9pbmZvYQI= +772B5841A7A0:E1B:g3F3Cm5ldF9rZXJuZWx3CXRlcm1pbmF0ZWEC +772B5841A7B0:E1D:g3F3Cm5ldF9rZXJuZWx3C2NvZGVfY2hhbmdlYQM= +772B5841A7C0:E1D:g3F3Cm5ldF9rZXJuZWx3C2hhbmRsZV9jYXN0YQI= +772B5841A7D0:E1D:g3F3Cm5ldF9rZXJuZWx3C2hhbmRsZV9jYWxsYQM= +772B5841A7E0:E16:g3F3Cm5ldF9rZXJuZWx3BGluaXRhAQ== +772B5841A7F0:E1C:g3F3Cm5ldF9rZXJuZWx3CnN0YXJ0X2xpbmthAQ== +772B5841A800:E17:g3F3Cm5ldF9rZXJuZWx3BXN0YXJ0YQE= +772B5841A810:E17:g3F3Cm5ldF9rZXJuZWx3BXN0YXJ0YQI= +772B5841A820:E29:g3F3Cm5ldF9rZXJuZWx3F3Bhc3NpdmVfY29ubmVjdF9tb25pdG9yYQI= +772B5841A830:E25:g3F3Cm5ldF9rZXJuZWx3E2hpZGRlbl9jb25uZWN0X25vZGVhAQ== +772B5841A840:E1E:g3F3Cm5ldF9rZXJuZWx3DGNvbm5lY3Rfbm9kZWEB +772B5841A850:E21:g3F3Cm5ldF9rZXJuZWx3D3B1Ymxpc2hfb25fbm9kZWEB +772B5841A860:E22:g3F3Cm5ldF9rZXJuZWx3EGFzeW5jX2Rpc2Nvbm5lY3RhAQ== +772B5841A870:E22:g3F3Cm5ldF9rZXJuZWx3EGdldF9uZXRfdGlja3RpbWVhAA== +772B5841A880:E22:g3F3Cm5ldF9rZXJuZWx3EHNldF9uZXRfdGlja3RpbWVhAQ== +772B5841A890:E22:g3F3Cm5ldF9rZXJuZWx3EHNldF9uZXRfdGlja3RpbWVhAg== +772B5841A8A0:E19:g3F3Cm5ldF9rZXJuZWx3B3ZlcmJvc2VhAQ== +772B5841A8B0:E13:g3F3Cm5ldF9rZXJuZWx3AWlhAQ== +772B5841A8C0:E13:g3F3Cm5ldF9rZXJuZWx3AWlhAA== +772B5841A8D0:E1C:g3F3Cm5ldF9rZXJuZWx3Cm5vZGVzX2luZm9hAA== +772B5841A8E0:E1B:g3F3Cm5ldF9rZXJuZWx3CW5vZGVfaW5mb2EC +772B5841A8F0:E1B:g3F3Cm5ldF9rZXJuZWx3CW5vZGVfaW5mb2EB +772B5841A900:E16:g3F3Cm5ldF9rZXJuZWx3BHN0b3BhAA== +772B5841A910:E1B:g3F3Cm5ldF9rZXJuZWx3CWdldF9zdGF0ZWEA +772B5841A920:E1A:g3F3Cm5ldF9rZXJuZWx3CG5vZGVuYW1lYQA= +772B5841A930:E19:g3F3Cm5ldF9rZXJuZWx3B2FsbG93ZWRhAA== +772B5841A940:E17:g3F3Cm5ldF9rZXJuZWx3BWFsbG93YQE= +772B5841A950:E1E:g3F3Cm5ldF9rZXJuZWx3DGtlcm5lbF9hcHBseWED +772B5841A960:E1C:g3F3EGVybF9kaXN0cmlidXRpb253BHN0b3BhAA== +772B5841A970:E1B:g3F3DGdsb2JhbF9ncm91cHcHcHVibGlzaGEC +772B5841A980:E1D:g3F3EGVybF9kaXN0cmlidXRpb253BXN0YXJ0YQE= +772B5841A990:E13:g3F3BnN0cmluZ3cFc3BsaXRhAw== +772B5841A9A0:E13:g3F3BHJhbmR3B3VuaWZvcm1hAQ== +772B5841A9B0:E17:g3F3BGF1dGh3C3N5bmNfY29va2llYQA= +772B5841A9C0:E1F:g3F3BmNyeXB0b3cRc3Ryb25nX3JhbmRfYnl0ZXNhAQ== +772B5841A9D0:E19:g3F3Bmdsb2JhbHcLbW9kdWxlX2luZm9hAQ== +772B5841A9E0:E19:g3F3Bmdsb2JhbHcLbW9kdWxlX2luZm9hAA== +772B5841A9F0:E1D:g3F3Bmdsb2JhbHcPbm90aWZ5X2FsbF9uYW1lYQM= +772B5841AA00:E20:g3F3Bmdsb2JhbHcScmFuZG9tX25vdGlmeV9uYW1lYQM= +772B5841AA10:E1E:g3F3Bmdsb2JhbHcQcmFuZG9tX2V4aXRfbmFtZWED +772B5841AA20:E18:g3F3Bmdsb2JhbHcKcmVzb2x2ZV9pdGEE +772B5841AA30:E18:g3F3Bmdsb2JhbHcKZ2V0X2xvY2tlcmEA +772B5841AA40:E19:g3F3Bmdsb2JhbHcLY29kZV9jaGFuZ2VhAw== +772B5841AA50:E17:g3F3Bmdsb2JhbHcJdGVybWluYXRlYQI= +772B5841AA60:E19:g3F3Bmdsb2JhbHcLaGFuZGxlX2luZm9hAg== +772B5841AA70:E19:g3F3Bmdsb2JhbHcLaGFuZGxlX2Nhc3RhAg== +772B5841AA80:E19:g3F3Bmdsb2JhbHcLaGFuZGxlX2NhbGxhAw== +772B5841AA90:E12:g3F3Bmdsb2JhbHcEaW5pdGEB +772B5841AAA0:E18:g3F3Bmdsb2JhbHcKZGlzY29ubmVjdGEA +772B5841AAB0:E12:g3F3Bmdsb2JhbHcEaW5mb2EA +772B5841AAC0:E13:g3F3Bmdsb2JhbHcFdHJhbnNhBA== +772B5841AAD0:E13:g3F3Bmdsb2JhbHcFdHJhbnNhAw== +772B5841AAE0:E13:g3F3Bmdsb2JhbHcFdHJhbnNhAg== +772B5841AAF0:E16:g3F3Bmdsb2JhbHcIZGVsX2xvY2thAg== +772B5841AB00:E16:g3F3Bmdsb2JhbHcIZGVsX2xvY2thAQ== +772B5841AB10:E16:g3F3Bmdsb2JhbHcIc2V0X2xvY2thAw== +772B5841AB20:E16:g3F3Bmdsb2JhbHcIc2V0X2xvY2thAg== +772B5841AB30:E16:g3F3Bmdsb2JhbHcIc2V0X2xvY2thAQ== +772B5841AB40:E26:g3F3Bmdsb2JhbHcYdW5yZWdpc3Rlcl9uYW1lX2V4dGVybmFsYQE= +772B5841AB50:E24:g3F3Bmdsb2JhbHcWcmVnaXN0ZXJfbmFtZV9leHRlcm5hbGED +772B5841AB60:E24:g3F3Bmdsb2JhbHcWcmVnaXN0ZXJfbmFtZV9leHRlcm5hbGEC +772B5841AB70:E1E:g3F3Bmdsb2JhbHcQcmVnaXN0ZXJlZF9uYW1lc2EA +772B5841AB80:E1E:g3F3Bmdsb2JhbHcQcmVfcmVnaXN0ZXJfbmFtZWED +772B5841AB90:E1E:g3F3Bmdsb2JhbHcQcmVfcmVnaXN0ZXJfbmFtZWEC +772B5841ABA0:E1B:g3F3Bmdsb2JhbHcNcmVnaXN0ZXJfbmFtZWED +772B5841ABB0:E12:g3F3Bmdsb2JhbHcEc3luY2EB +772B5841ABC0:E12:g3F3Bmdsb2JhbHcEc3luY2EA +772B5841ABD0:E12:g3F3Bmdsb2JhbHcEc3RvcGEA +772B5841ABE0:E13:g3F3Bmdsb2JhbHcFc3RhcnRhAA== +772B5841ABF0:E10:g3F3BHJhbmR3BHNlZWRhAg== +772B5841AC00:E1F:g3F3DGdsb2JhbF9ncm91cHcLcGFydGljaXBhbnRhAQ== +772B5841AC10:E1A:g3F3DGdsb2JhbF9ncm91cHcGbWVtYmVyYQE= +772B5841AC20:E24:g3F3DGdsb2JhbF9ncm91cHcQZ3JvdXBfY29uZmlndXJlZGEA +772B5841AC30:EF:g3F3BHNvZnN3A3NldGEB +772B5841AC40:E10:g3F3BHJhbmR3BHNlZWRhAQ== +772B5841AC50:E2D:g3F3DGdsb2JhbF9ncm91cHcZZ2V0X293bl9ub2Rlc193aXRoX2Vycm9yc2EA +772B5841AC60:E17:g3F3BHJhbmR3C21vZHVsZV9pbmZvYQE= +772B5841AC70:E17:g3F3BHJhbmR3C21vZHVsZV9pbmZvYQA= +772B5841AC80:E15:g3F3BHJhbmR3CWZsb2F0MnN0cmEB +772B5841AC90:E16:g3F3BHJhbmR3Cm1ha2VfZmxvYXRhAw== +772B5841ACA0:E10:g3F3BHJhbmR3BGJjNjRhAQ== +772B5841ACB0:E1E:g3F3BHJhbmR3EmZvcm1hdF9qdW1wY29uc3Q1OGEB +772B5841ACC0:E1B:g3F3BHJhbmR3D3NwbGl0bWl4NjRfbmV4dGEB +772B5841ACD0:E12:g3F3BHJhbmR3BnNlZWQ1OGEC +772B5841ACE0:E16:g3F3BHJhbmR3Cm13YzU5X3NlZWRhAQ== +772B5841ACF0:E16:g3F3BHJhbmR3Cm13YzU5X3NlZWRhAA== +772B5841AD00:E17:g3F3BHJhbmR3C213YzU5X2Zsb2F0YQE= +772B5841AD10:E17:g3F3BHJhbmR3C213YzU5X3ZhbHVlYQE= +772B5841AD20:E19:g3F3BHJhbmR3DW13YzU5X3ZhbHVlMzJhAQ== +772B5841AD30:E11:g3F3BHJhbmR3BW13YzU5YQE= +772B5841AD40:E1F:g3F3BHJhbmR3E2V4cm85MjhfanVtcF8ycG93MjBhAQ== +772B5841AD50:E20:g3F3BHJhbmR3FGV4cm85MjhfanVtcF8ycG93NTEyYQE= +772B5841AD60:E1E:g3F3BHJhbmR3EmV4cm85MjhfbmV4dF9zdGF0ZWEB +772B5841AD70:E18:g3F3BHJhbmR3DGV4cm85MjhfbmV4dGEB +772B5841AD80:E18:g3F3BHJhbmR3DGV4cm85Mjhfc2VlZGEB +772B5841AD90:E15:g3F3BHJhbmR3CWV4c3BfanVtcGEB +772B5841ADA0:E15:g3F3BHJhbmR3CWV4c3BfbmV4dGEB +772B5841ADB0:E14:g3F3BHJhbmR3CG5vcm1hbF9zYQM= +772B5841ADC0:E14:g3F3BHJhbmR3CG5vcm1hbF9zYQE= +772B5841ADD0:E12:g3F3BHJhbmR3Bm5vcm1hbGEC +772B5841ADE0:E12:g3F3BHJhbmR3Bm5vcm1hbGEA +772B5841ADF0:E10:g3F3BHJhbmR3BGp1bXBhAA== +772B5841AE00:E10:g3F3BHJhbmR3BGp1bXBhAQ== +772B5841AE10:E13:g3F3BHJhbmR3B2J5dGVzX3NhAg== +772B5841AE20:E11:g3F3BHJhbmR3BWJ5dGVzYQE= +772B5841AE30:E1A:g3F3BHJhbmR3DnVuaWZvcm1fcmVhbF9zYQE= +772B5841AE40:E18:g3F3BHJhbmR3DHVuaWZvcm1fcmVhbGEA +772B5841AE50:E15:g3F3BHJhbmR3CXVuaWZvcm1fc2EC +772B5841AE60:E15:g3F3BHJhbmR3CXVuaWZvcm1fc2EB +772B5841AE70:E13:g3F3BHJhbmR3B3VuaWZvcm1hAA== +772B5841AE80:E12:g3F3BHJhbmR3BnNlZWRfc2EC +772B5841AE90:E12:g3F3BHJhbmR3BnNlZWRfc2EB +772B5841AEA0:E19:g3F3BHJhbmR3DWV4cG9ydF9zZWVkX3NhAQ== +772B5841AEB0:E17:g3F3BHJhbmR3C2V4cG9ydF9zZWVkYQA= +772B5841AEC0:E22:g3F3EGVybF9kaXN0cmlidXRpb253CnN0YXJ0X2xpbmthAA== +772B5841AED0:E23:g3F3EGVybF9kaXN0cmlidXRpb253C21vZHVsZV9pbmZvYQE= +772B5841AEE0:E23:g3F3EGVybF9kaXN0cmlidXRpb253C21vZHVsZV9pbmZvYQA= +772B5841AEF0:E1C:g3F3EGVybF9kaXN0cmlidXRpb253BGluaXRhAQ== +772B5841AF00:E22:g3F3EGVybF9kaXN0cmlidXRpb253CnN0YXJ0X2xpbmthAQ== +772B5841AF10:E1E:g3F3DGdsb2JhbF9ncm91cHcKc3RhcnRfbGlua2EA +772B5841AF20:E17:g3F3BG1hcHN3C21vZHVsZV9pbmZvYQE= +772B5841AF30:E17:g3F3BG1hcHN3C21vZHVsZV9pbmZvYQA= +772B5841AF40:E1D:g3F3BG1hcHN3EWlzX2l0ZXJhdG9yX3ZhbGlkYQE= +772B5841AF50:E1C:g3F3BG1hcHN3EGdyb3Vwc19mcm9tX2xpc3RhAw== +772B5841AF60:E1C:g3F3BG1hcHN3EGdyb3Vwc19mcm9tX2xpc3RhAg== +772B5841AF70:E14:g3F3BG1hcHN3CGl0ZXJhdG9yYQI= +772B5841AF80:E10:g3F3BG1hcHN3BHNpemVhAQ== +772B5841AF90:E15:g3F3BG1hcHN3CWZpbHRlcm1hcGEC +772B5841AFA0:EF:g3F3BG1hcHN3A2dldGED +772B5841AFB0:E17:g3F3BG1hcHN3C3VwZGF0ZV93aXRoYQQ= +772B5841AFC0:EF:g3F3BG1hcHN3A25ld2EA +772B5841AFD0:E1A:g3F3BG1hcHN3DmludGVyc2VjdF93aXRoYQM= +772B5841AFE0:E15:g3F3BG1hcHN3CWludGVyc2VjdGEC +772B5841AFF0:E1F:g3F3DGdsb2JhbF9ncm91cHcLbW9kdWxlX2luZm9hAQ== +772B5841B000:E1F:g3F3DGdsb2JhbF9ncm91cHcLbW9kdWxlX2luZm9hAA== +772B5841B010:E21:g3F3DGdsb2JhbF9ncm91cHcNZ2V0X293bl9ub2Rlc2EA +772B5841B020:E1F:g3F3DGdsb2JhbF9ncm91cHcLY29kZV9jaGFuZ2VhAw== +772B5841B030:E1D:g3F3DGdsb2JhbF9ncm91cHcJdGVybWluYXRlYQI= +772B5841B040:E1F:g3F3DGdsb2JhbF9ncm91cHcLaGFuZGxlX2luZm9hAg== +772B5841B050:E1F:g3F3DGdsb2JhbF9ncm91cHcLaGFuZGxlX2Nhc3RhAg== +772B5841B060:E1F:g3F3DGdsb2JhbF9ncm91cHcLaGFuZGxlX2NhbGxhAw== +772B5841B070:E18:g3F3DGdsb2JhbF9ncm91cHcEaW5pdGEB +772B5841B080:E18:g3F3DGdsb2JhbF9ncm91cHcEc3RvcGEA +772B5841B090:E19:g3F3DGdsb2JhbF9ncm91cHcFc3RhcnRhAA== +772B5841B0A0:E25:g3F3DGdsb2JhbF9ncm91cHcRd2hlcmVpc19uYW1lX3Rlc3RhAQ== +772B5841B0B0:E1D:g3F3DGdsb2JhbF9ncm91cHcJc2VuZF90ZXN0YQI= +772B5841B0C0:E29:g3F3DGdsb2JhbF9ncm91cHcVcmVnaXN0ZXJlZF9uYW1lc190ZXN0YQE= +772B5841B0D0:E20:g3F3DGdsb2JhbF9ncm91cHcMbmdfYWRkX2NoZWNrYQM= +772B5841B0E0:E20:g3F3DGdsb2JhbF9ncm91cHcMbmdfYWRkX2NoZWNrYQI= +772B5841B0F0:E18:g3F3DGdsb2JhbF9ncm91cHcEaW5mb2EA +772B5841B100:E18:g3F3DGdsb2JhbF9ncm91cHcEc3luY2EA +772B5841B110:E20:g3F3DGdsb2JhbF9ncm91cHcMd2hlcmVpc19uYW1lYQI= +772B5841B120:E20:g3F3DGdsb2JhbF9ncm91cHcMd2hlcmVpc19uYW1lYQE= +772B5841B130:E18:g3F3DGdsb2JhbF9ncm91cHcEc2VuZGED +772B5841B140:E18:g3F3DGdsb2JhbF9ncm91cHcEc2VuZGEC +772B5841B150:E24:g3F3DGdsb2JhbF9ncm91cHcQcmVnaXN0ZXJlZF9uYW1lc2EB +772B5841B160:E1D:g3F3DGdsb2JhbF9ncm91cHcJb3duX25vZGVzYQA= +772B5841B170:E21:g3F3DGdsb2JhbF9ncm91cHcNbW9uaXRvcl9ub2Rlc2EB +772B5841B180:E21:g3F3DGdsb2JhbF9ncm91cHcNZ2xvYmFsX2dyb3Vwc2EA +772B5841B190:E16:g3F3BGVycGN3CnJlcWlkc19uZXdhAA== +772B5841B1A0:E1A:g3F3DWdsb2JhbF9zZWFyY2h3BXN0YXJ0YQI= +772B5841B1B0:E1A:g3F3BGVycGN3DmNoZWNrX3Jlc3BvbnNlYQM= +772B5841B1C0:E18:g3F3BGVycGN3DHNlbmRfcmVxdWVzdGEG +772B5841B1D0:E17:g3F3BGVycGN3C21vZHVsZV9pbmZvYQE= +772B5841B1E0:E17:g3F3BGVycGN3C21vZHVsZV9pbmZvYQA= +772B5841B1F0:E17:g3F3BGVycGN3C2NhbGxfcmVzdWx0YQQ= +772B5841B200:E18:g3F3BGVycGN3DGV4ZWN1dGVfY2FsbGEE +772B5841B210:E10:g3F3BGVycGN3BGNhc3RhAg== +772B5841B220:E15:g3F3BGVycGN3CW11bHRpY2FzdGEE +772B5841B230:E15:g3F3BGVycGN3CW11bHRpY2FzdGEC +772B5841B240:E15:g3F3BGVycGN3CW11bHRpY2FsbGEE +772B5841B250:E15:g3F3BGVycGN3CW11bHRpY2FsbGED +772B5841B260:E15:g3F3BGVycGN3CW11bHRpY2FsbGEC +772B5841B270:E1A:g3F3BGVycGN3DnJlcWlkc190b19saXN0YQE= +772B5841B280:E16:g3F3BGVycGN3CnJlcWlkc19hZGRhAw== +772B5841B290:E17:g3F3BGVycGN3C3JlcWlkc19zaXplYQE= +772B5841B2A0:E1A:g3F3BGVycGN3DmNoZWNrX3Jlc3BvbnNlYQI= +772B5841B2B0:E19:g3F3BGVycGN3DXdhaXRfcmVzcG9uc2VhAw== +772B5841B2C0:E19:g3F3BGVycGN3DXdhaXRfcmVzcG9uc2VhAQ== +772B5841B2D0:E1C:g3F3BGVycGN3EHJlY2VpdmVfcmVzcG9uc2VhAw== +772B5841B2E0:E1C:g3F3BGVycGN3EHJlY2VpdmVfcmVzcG9uc2VhAg== +772B5841B2F0:E18:g3F3BGVycGN3DHNlbmRfcmVxdWVzdGEC +772B5841B300:E10:g3F3BGVycGN3BGNhbGxhAw== +772B5841B310:E10:g3F3BGVycGN3BGNhbGxhAg== +772B5841B320:E15:g3F3CHVzZXJfc3VwdwVzdGFydGEA +772B5841B330:E1B:g3F3CHVzZXJfc3Vwdwttb2R1bGVfaW5mb2EB +772B5841B340:E1B:g3F3CHVzZXJfc3Vwdwttb2R1bGVfaW5mb2EA +772B5841B350:E19:g3F3CHVzZXJfc3Vwdwl0ZXJtaW5hdGVhAg== +772B5841B360:E15:g3F3CHVzZXJfc3VwdwVyZWxheWEB +772B5841B370:E15:g3F3CHVzZXJfZHJ2dwVzdGFydGEB +772B5841B380:E1B:g3F3CHVzZXJfZHJ2dwttb2R1bGVfaW5mb2EB +772B5841B390:E1B:g3F3CHVzZXJfZHJ2dwttb2R1bGVfaW5mb2EA +772B5841B3A0:E1B:g3F3CHVzZXJfZHJ2dwtzd2l0Y2hfbG9vcGED +772B5841B3B0:E16:g3F3CHVzZXJfZHJ2dwZzZXJ2ZXJhAw== +772B5841B3C0:E14:g3F3CHVzZXJfZHJ2dwRpbml0YQM= +772B5841B3D0:E14:g3F3CHVzZXJfZHJ2dwRpbml0YQE= +772B5841B3E0:E1D:g3F3CHVzZXJfZHJ2dw1jYWxsYmFja19tb2RlYQA= +772B5841B3F0:E1D:g3F3CHVzZXJfZHJ2dw13aGVyZWlzX2dyb3VwYQA= +772B5841B400:E1B:g3F3CHVzZXJfZHJ2dwtzdGFydF9zaGVsbGEB +772B5841B410:E1B:g3F3CHVzZXJfZHJ2dwtzdGFydF9zaGVsbGEA +772B5841B420:E15:g3F3CHVzZXJfZHJ2dwVzdGFydGEA +772B5841B430:E16:g3F3Cmdlbl9zdGF0ZW13BGNhbGxhAg== +772B5841B440:E17:g3F3Cmdlbl9zdGF0ZW13BXN0YXJ0YQQ= +772B5841B450:E16:g3F3CHByaW1fdHR5dwZpc2F0dHlhAQ== +772B5841B460:E14:g3F3CHByaW1fdHR5dwRpbml0YQE= +772B5841B470:E17:g3F3CHByaW1fdHR5dwd1bmljb2RlYQE= +772B5841B480:E11:g3F3AmlvdwdzZXRvcHRzYQI= +772B5841B490:E17:g3F3CHByaW1fdHR5dwdoYW5kbGVzYQE= +772B5841B4A0:E12:g3F3BWdyb3VwdwVzdGFydGED +772B5841B4B0:E16:g3F3CHByaW1fdHR5dwZyZWluaXRhAg== +772B5841B4C0:E17:g3F3Cmdlbl9zdGF0ZW13BXJlcGx5YQI= +772B5841B4D0:E17:g3F3CHByaW1fdHR5dwd1bmljb2RlYQI= +772B5841B4E0:E1D:g3F3CHByaW1fdHR5dw1oYW5kbGVfc2lnbmFsYQI= +772B5841B4F0:E1B:g3F3CHByaW1fdHR5dwt3aW5kb3dfc2l6ZWEB +772B5841B500:E13:g3F3BnN0cmluZ3cFY2hvbXBhAQ== +772B5841B510:E1D:g3F3CHByaW1fdHR5dw1lbmFibGVfcmVhZGVyYQE= +772B5841B520:E19:g3F3CHByaW1fdHR5dwlpc19yZWFkZXJhAg== +772B5841B530:E19:g3F3CHByaW1fdHR5dwlpc193cml0ZXJhAg== +772B5841B540:E12:g3F3BWdyb3VwdwVzdGFydGEC +772B5841B550:E12:g3F3BWVkbGludwVzdGFydGEB +772B5841B560:E11:g3F3BWVkbGludwRpbml0YQE= +772B5841B570:E16:g3F3BWVkbGludwllZGl0X2xpbmVhAg== +772B5841B580:E14:g3F3BHBvb2x3CGdldF9ub2RlYQA= +772B5841B590:E1E:g3F3CHByaW1fdHR5dw5oYW5kbGVfcmVxdWVzdGEC +772B5841B5A0:E15:g3F3CHByaW1fdHR5dwV3cml0ZWED +772B5841B5B0:E15:g3F3CHByaW1fdHR5dwV3cml0ZWEC +772B5841B5C0:E16:g3F3B2ZpbGVsaWJ3B2lzX2ZpbGVhAQ== +772B5841B5D0:E1E:g3F3CHByaW1fdHR5dw5kaXNhYmxlX3JlYWRlcmEB +772B5841B5E0:E1C:g3F3Cmdlbl9zdGF0ZW13CmZvcm1hdF9sb2dhAQ== +772B5841B5F0:E1C:g3F3Cmdlbl9zdGF0ZW13CmZvcm1hdF9sb2dhAg== +772B5841B600:E1D:g3F3Cmdlbl9zdGF0ZW13C21vZHVsZV9pbmZvYQE= +772B5841B610:E1D:g3F3Cmdlbl9zdGF0ZW13C21vZHVsZV9pbmZvYQA= +772B5841B620:E20:g3F3Cmdlbl9zdGF0ZW13DmJlaGF2aW91cl9pbmZvYQE= +772B5841B630:E27:g3F3Cmdlbl9zdGF0ZW13FXdha2V1cF9mcm9tX2hpYmVybmF0ZWED +772B5841B640:E1F:g3F3Cmdlbl9zdGF0ZW13DWZvcm1hdF9zdGF0dXNhAg== +772B5841B650:E26:g3F3Cmdlbl9zdGF0ZW13FHN5c3RlbV9yZXBsYWNlX3N0YXRlYQI= +772B5841B660:E22:g3F3Cmdlbl9zdGF0ZW13EHN5c3RlbV9nZXRfc3RhdGVhAQ== +772B5841B670:E24:g3F3Cmdlbl9zdGF0ZW13EnN5c3RlbV9jb2RlX2NoYW5nZWEE +772B5841B680:E22:g3F3Cmdlbl9zdGF0ZW13EHN5c3RlbV90ZXJtaW5hdGVhBA== +772B5841B690:E21:g3F3Cmdlbl9zdGF0ZW13D3N5c3RlbV9jb250aW51ZWED +772B5841B6A0:E19:g3F3Cmdlbl9zdGF0ZW13B2luaXRfaXRhBg== +772B5841B6B0:E1C:g3F3Cmdlbl9zdGF0ZW13CmVudGVyX2xvb3BhBg== +772B5841B6C0:E1C:g3F3Cmdlbl9zdGF0ZW13CmVudGVyX2xvb3BhBQ== +772B5841B6D0:E1C:g3F3Cmdlbl9zdGF0ZW13CmVudGVyX2xvb3BhBA== +772B5841B6E0:E17:g3F3Cmdlbl9zdGF0ZW13BXJlcGx5YQE= +772B5841B6F0:E20:g3F3Cmdlbl9zdGF0ZW13DnJlcWlkc190b19saXN0YQE= +772B5841B700:E1C:g3F3Cmdlbl9zdGF0ZW13CnJlcWlkc19hZGRhAw== +772B5841B710:E1D:g3F3Cmdlbl9zdGF0ZW13C3JlcWlkc19zaXplYQE= +772B5841B720:E1C:g3F3Cmdlbl9zdGF0ZW13CnJlcWlkc19uZXdhAA== +772B5841B730:E20:g3F3Cmdlbl9zdGF0ZW13DmNoZWNrX3Jlc3BvbnNlYQM= +772B5841B740:E20:g3F3Cmdlbl9zdGF0ZW13DmNoZWNrX3Jlc3BvbnNlYQI= +772B5841B750:E22:g3F3Cmdlbl9zdGF0ZW13EHJlY2VpdmVfcmVzcG9uc2VhAw== +772B5841B760:E22:g3F3Cmdlbl9zdGF0ZW13EHJlY2VpdmVfcmVzcG9uc2VhAg== +772B5841B770:E22:g3F3Cmdlbl9zdGF0ZW13EHJlY2VpdmVfcmVzcG9uc2VhAQ== +772B5841B780:E1F:g3F3Cmdlbl9zdGF0ZW13DXdhaXRfcmVzcG9uc2VhAw== +772B5841B790:E1F:g3F3Cmdlbl9zdGF0ZW13DXdhaXRfcmVzcG9uc2VhAg== +772B5841B7A0:E1F:g3F3Cmdlbl9zdGF0ZW13DXdhaXRfcmVzcG9uc2VhAQ== +772B5841B7B0:E1E:g3F3Cmdlbl9zdGF0ZW13DHNlbmRfcmVxdWVzdGEE +772B5841B7C0:E1E:g3F3Cmdlbl9zdGF0ZW13DHNlbmRfcmVxdWVzdGEC +772B5841B7D0:E16:g3F3Cmdlbl9zdGF0ZW13BGNhbGxhAw== +772B5841B7E0:E16:g3F3Cmdlbl9zdGF0ZW13BGNhc3RhAg== +772B5841B7F0:E16:g3F3Cmdlbl9zdGF0ZW13BHN0b3BhAw== +772B5841B800:E16:g3F3Cmdlbl9zdGF0ZW13BHN0b3BhAQ== +772B5841B810:E1F:g3F3Cmdlbl9zdGF0ZW13DXN0YXJ0X21vbml0b3JhBA== +772B5841B820:E1F:g3F3Cmdlbl9zdGF0ZW13DXN0YXJ0X21vbml0b3JhAw== +772B5841B830:E1C:g3F3Cmdlbl9zdGF0ZW13CnN0YXJ0X2xpbmthBA== +772B5841B840:E1C:g3F3Cmdlbl9zdGF0ZW13CnN0YXJ0X2xpbmthAw== +772B5841B850:E17:g3F3Cmdlbl9zdGF0ZW13BXN0YXJ0YQM= +772B5841B860:E1B:g3F3CHByaW1fdHR5dwttb2R1bGVfaW5mb2EB +772B5841B870:E1B:g3F3CHByaW1fdHR5dwttb2R1bGVfaW5mb2EA +772B5841B880:E15:g3F3CHByaW1fdHR5dwV0Z290b2ED +772B5841B890:E15:g3F3CHByaW1fdHR5dwV0Z290b2EC +772B5841B8A0:E15:g3F3CHByaW1fdHR5dwV0Z290b2EB +772B5841B8B0:E18:g3F3CHByaW1fdHR5dwh3Y3N3aWR0aGEB +772B5841B8C0:E1C:g3F3CHByaW1fdHR5dwxzaXplb2Zfd2NoYXJhAA== +772B5841B8D0:E19:g3F3CHByaW1fdHR5dwlucHdjd2lkdGhhAg== +772B5841B8E0:E19:g3F3CHByaW1fdHR5dwlucHdjd2lkdGhhAQ== +772B5841B8F0:E1B:g3F3CHByaW1fdHR5dwt3cml0ZXJfbG9vcGEC +772B5841B900:E16:g3F3CHByaW1fdHR5dwZ3cml0ZXJhAQ== +772B5841B910:E1B:g3F3CHByaW1fdHR5dwtyZWFkZXJfbG9vcGEG +772B5841B920:E16:g3F3CHByaW1fdHR5dwZyZWFkZXJhAQ== +772B5841B930:E1B:g3F3CHByaW1fdHR5dwtyZWFkZXJfc3RvcGEB +772B5841B940:E1A:g3F3CHByaW1fdHR5dwphbnNpX2NvbG9yYQI= +772B5841B950:E1B:g3F3CHByaW1fdHR5dwthbnNpX3JlZ2V4cGEA +772B5841B960:E1B:g3F3DHVuaWNvZGVfdXRpbHcHaXNfd2lkZWEB +772B5841B970:E1B:g3F3BnN0cmluZ3cNbmV4dF9ncmFwaGVtZWEB +772B5841B980:E11:g3F3AnJldwdyZXBsYWNlYQM= +772B5841B990:E15:g3F3Amlvdwttb2R1bGVfaW5mb2EB +772B5841B9A0:E15:g3F3Amlvdwttb2R1bGVfaW5mb2EA +772B5841B9B0:E12:g3F3AmlvdwhyZXF1ZXN0c2EC +772B5841B9C0:E12:g3F3AmlvdwhyZXF1ZXN0c2EB +772B5841B9D0:E11:g3F3AmlvdwdyZXF1ZXN0YQE= +772B5841B9E0:E18:g3F3Amlvdw5wYXJzZV9lcmxfZm9ybWEE +772B5841B9F0:E18:g3F3Amlvdw5wYXJzZV9lcmxfZm9ybWED +772B5841BA00:E18:g3F3Amlvdw5wYXJzZV9lcmxfZm9ybWEC +772B5841BA10:E18:g3F3Amlvdw5wYXJzZV9lcmxfZm9ybWEB +772B5841BA20:E19:g3F3Amlvdw9wYXJzZV9lcmxfZXhwcnNhBA== +772B5841BA30:E19:g3F3Amlvdw9wYXJzZV9lcmxfZXhwcnNhAg== +772B5841BA40:E19:g3F3Amlvdw9wYXJzZV9lcmxfZXhwcnNhAQ== +772B5841BA50:E17:g3F3Amlvdw1zY2FuX2VybF9mb3JtYQQ= +772B5841BA60:E17:g3F3Amlvdw1zY2FuX2VybF9mb3JtYQM= +772B5841BA70:E17:g3F3Amlvdw1zY2FuX2VybF9mb3JtYQI= +772B5841BA80:E17:g3F3Amlvdw1zY2FuX2VybF9mb3JtYQE= +772B5841BA90:E18:g3F3Amlvdw5zY2FuX2VybF9leHByc2EE +772B5841BAA0:E18:g3F3Amlvdw5zY2FuX2VybF9leHByc2ED +772B5841BAB0:E18:g3F3Amlvdw5zY2FuX2VybF9leHByc2EC +772B5841BAC0:E18:g3F3Amlvdw5zY2FuX2VybF9leHByc2EB +772B5841BAD0:EF:g3F3AmlvdwVmcmVhZGED +772B5841BAE0:EF:g3F3AmlvdwVmcmVhZGEC +772B5841BAF0:E10:g3F3AmlvdwZmd3JpdGVhAw== +772B5841BB00:E10:g3F3AmlvdwZmd3JpdGVhAg== +772B5841BB10:E10:g3F3AmlvdwZmd3JpdGVhAQ== +772B5841BB20:EE:g3F3AmlvdwRyZWFkYQQ= +772B5841BB30:EE:g3F3AmlvdwRyZWFkYQI= +772B5841BB40:EE:g3F3AmlvdwRyZWFkYQE= +772B5841BB50:EF:g3F3AmlvdwV3cml0ZWEC +772B5841BB60:EF:g3F3AmlvdwV3cml0ZWEB +772B5841BB70:E11:g3F3AmlvdwdzZXRvcHRzYQE= +772B5841BB80:E11:g3F3AmlvdwdnZXRvcHRzYQE= +772B5841BB90:E16:g3F3AmlvdwxnZXRfcGFzc3dvcmRhAQ== +772B5841BBA0:E16:g3F3AmlvdwxnZXRfcGFzc3dvcmRhAA== +772B5841BBB0:E13:g3F3AmlvdwlnZXRfY2hhcnNhAw== +772B5841BBC0:E13:g3F3AmlvdwlnZXRfY2hhcnNhAg== +772B5841BBD0:EE:g3F3AmlvdwRyb3dzYQE= +772B5841BBE0:EE:g3F3AmlvdwRyb3dzYQA= +772B5841BBF0:E11:g3F3Amlvdwdjb2x1bW5zYQE= +772B5841BC00:E11:g3F3Amlvdwdjb2x1bW5zYQA= +772B5841BC10:EC:g3F3AmlvdwJubGEB +772B5841BC20:EC:g3F3AmlvdwJubGEA +772B5841BC30:E13:g3F3AmlvdwlwdXRfY2hhcnNhAg== +772B5841BC40:E10:g3F3BmlvX2xpYncCbmxhAA== +772B5841BC50:E1A:g3F3DGVkbGluX2V4cGFuZHcGZXhwYW5kYQI= +772B5841BC60:E22:g3F3BWdyb3VwdxVmb3JtYXRfaW9fcmVxdWVzdF9sb2dhAQ== +772B5841BC70:E18:g3F3BWdyb3Vwdwttb2R1bGVfaW5mb2EB +772B5841BC80:E18:g3F3BWdyb3Vwdwttb2R1bGVfaW5mb2EA +772B5841BC90:E18:g3F3BWdyb3VwdwtzZXJ2ZXJfbG9vcGED +772B5841BCA0:E1A:g3F3BWdyb3Vwdw13aGVyZWlzX3NoZWxsYQA= +772B5841BCB0:E13:g3F3BWdyb3VwdwZzZXJ2ZXJhBA== +772B5841BCC0:E11:g3F3BWVkbGludwRpbml0YQA= +772B5841BCD0:E19:g3F3DWdyb3VwX2hpc3Rvcnl3BGxvYWRhAA== +772B5841BCE0:E19:g3F3BWVkbGludwxjdXJyZW50X2xpbmVhAQ== +772B5841BCF0:E19:g3F3BXNoZWxsdwxwcm9tcHRfd2lkdGhhAQ== +772B5841BD00:E12:g3F3BnN0cmluZ3cEdHJpbWEC +772B5841BD10:E1B:g3F3BmlvX2xpYncNY29sbGVjdF9jaGFyc2EE +772B5841BD20:E12:g3F3BWVkbGludwVzdGFydGEC +772B5841BD30:E16:g3F3BWVkbGludwlvdmVyX3dvcmRhAw== +772B5841BD40:E20:g3F3DWVkbGluX2NvbnRleHR3C2dldF9jb250ZXh0YQE= +772B5841BD50:EB:g3F3AWN3AmgxYQI= +772B5841BD60:EB:g3F3AWN3AmgxYQE= +772B5841BD70:E22:g3F3DGVkbGluX2V4cGFuZHcOZm9ybWF0X21hdGNoZXNhAg== +772B5841BD80:E13:g3F3BWVkbGludwZwcm9tcHRhAQ== +772B5841BD90:E18:g3F3BWVkbGludwtyZWRyYXdfbGluZWEB +772B5841BDA0:E17:g3F3BWVkbGludwplcmFzZV9saW5lYQA= +772B5841BDB0:E17:g3F3BWVkbGludwplZGl0X2xpbmUxYQI= +772B5841BDC0:E1A:g3F3BnN0cmluZ3cMdG9fZ3JhcGhlbWVzYQE= +772B5841BDD0:E1E:g3F3BXNoZWxsdxFmb3JtYXRfc2hlbGxfZnVuY2EB +772B5841BDE0:E15:g3F3BnN0cmluZ3cHcmVwbGFjZWED +772B5841BDF0:E18:g3F3DWdyb3VwX2hpc3Rvcnl3A2FkZGEB +772B5841BE00:E1B:g3F3BmlvX2xpYncNZm9ybWF0X3Byb21wdGEC +772B5841BE10:E1C:g3F3CmxvZ2dlcl9zdXB3CnN0YXJ0X2xpbmthAA== +772B5841BE20:E18:g3F3BWVkbGludwttb2R1bGVfaW5mb2EB +772B5841BE30:E18:g3F3BWVkbGludwttb2R1bGVfaW5mb2EA +772B5841BE40:E1A:g3F3BWVkbGludw1jdXJyZW50X2NoYXJzYQE= +772B5841BE50:E19:g3F3BWVkbGludwxsZW5ndGhfYWZ0ZXJhAQ== +772B5841BE60:E1A:g3F3BWVkbGludw1sZW5ndGhfYmVmb3JlYQE= +772B5841BE70:E16:g3F3BWVkbGludwllcmFzZV9pbnBhAQ== +772B5841BE80:E13:g3F3BWVkbGludwZrZXltYXBhAA== +772B5841BE90:E1C:g3F3CWVkbGluX2tleXcLZ2V0X2tleV9tYXBhAA== +772B5841BEA0:E25:g3F3CWVkbGluX2tleXcUZ2V0X3ZhbGlkX2VzY2FwZV9rZXlhAg== +772B5841BEB0:E25:g3F3BXNoZWxsdxhkZWZhdWx0X211bHRpbGluZV9wcm9tcHRhAQ== +772B5841BEC0:E19:g3F3BmlvX2xpYncLbW9kdWxlX2luZm9hAQ== +772B5841BED0:E19:g3F3BmlvX2xpYncLbW9kdWxlX2luZm9hAA== +772B5841BEE0:E1A:g3F3BmlvX2xpYncMY2hhcnNfbGVuZ3RoYQE= +772B5841BEF0:E17:g3F3BmlvX2xpYncJZ2V0X3VudGlsYQM= +772B5841BF00:E1A:g3F3BmlvX2xpYncMY29sbGVjdF9saW5lYQM= +772B5841BF10:E1B:g3F3BmlvX2xpYncNY29sbGVjdF9jaGFyc2ED +772B5841BF20:E23:g3F3BmlvX2xpYncVcHJpbnRhYmxlX2xhdGluMV9saXN0YQE= +772B5841BF30:E24:g3F3BmlvX2xpYncWZGVlcF91bmljb2RlX2NoYXJfbGlzdGEB +772B5841BF40:E23:g3F3BmlvX2xpYncVZGVlcF9sYXRpbjFfY2hhcl9saXN0YQE= +772B5841BF50:E22:g3F3BmlvX2xpYncUd3JpdGVfY2hhcl9hc19sYXRpbjFhAQ== +772B5841BF60:E1F:g3F3BmlvX2xpYncRd3JpdGVfbGF0aW4xX2NoYXJhAQ== +772B5841BF70:E20:g3F3BmlvX2xpYncSd3JpdGVfdW5pY29kZV9jaGFyYQE= +772B5841BF80:E24:g3F3BmlvX2xpYncWd3JpdGVfc3RyaW5nX2FzX2xhdGluMWEC +772B5841BF90:E24:g3F3BmlvX2xpYncWd3JpdGVfc3RyaW5nX2FzX2xhdGluMWEB +772B5841BFA0:E21:g3F3BmlvX2xpYncTd3JpdGVfbGF0aW4xX3N0cmluZ2EC +772B5841BFB0:E21:g3F3BmlvX2xpYncTd3JpdGVfbGF0aW4xX3N0cmluZ2EB +772B5841BFC0:E22:g3F3BmlvX2xpYncUd3JpdGVfdW5pY29kZV9zdHJpbmdhAQ== +772B5841BFD0:E1A:g3F3BmlvX2xpYncMd3JpdGVfc3RyaW5nYQI= +772B5841BFE0:E18:g3F3BmlvX2xpYncKcXVvdGVfYXRvbWEC +772B5841BFF0:E1A:g3F3BmlvX2xpYncMd3JpdGVfYmluYXJ5YQM= +772B5841C000:E13:g3F3BmlvX2xpYncFd3JpdGVhAg== +772B5841C010:E13:g3F3BmlvX2xpYncFd3JpdGVhAw== +772B5841C020:E1B:g3F3BmlvX2xpYncNZm9ybWF0X3Byb21wdGEB +772B5841C030:E19:g3F3BmlvX2xpYncLaW5kZW50YXRpb25hAg== +772B5841C040:E13:g3F3BmlvX2xpYncFcHJpbnRhBA== +772B5841C050:E13:g3F3BmlvX2xpYncFcHJpbnRhAQ== +772B5841C060:E18:g3F3BmlvX2xpYncKYnVpbGRfdGV4dGEC +772B5841C070:E18:g3F3BmlvX2xpYncKYnVpbGRfdGV4dGEB +772B5841C080:E1B:g3F3BmlvX2xpYncNdW5zY2FuX2Zvcm1hdGEB +772B5841C090:E13:g3F3BmlvX2xpYncFZnJlYWRhAw== +772B5841C0A0:E13:g3F3BmlvX2xpYncFZnJlYWRhAg== +772B5841C0B0:E14:g3F3BmlvX2xpYncGZndyaXRlYQM= +772B5841C0C0:E19:g3F3DGlvX2xpYl9mcmVhZHcFZnJlYWRhAg== +772B5841C0D0:E19:g3F3DGlvX2xpYl9mcmVhZHcFZnJlYWRhAw== +772B5841C0E0:E1B:g3F3DWlvX2xpYl9mb3JtYXR3BmZ3cml0ZWEC +772B5841C0F0:E1B:g3F3DWlvX2xpYl9mb3JtYXR3BmZ3cml0ZWED +772B5841C100:E19:g3F3DWlvX2xpYl9mb3JtYXR3BHNjYW5hAg== +772B5841C110:E1B:g3F3DWlvX2xpYl9mb3JtYXR3BnVuc2NhbmEB +772B5841C120:E1A:g3F3DWlvX2xpYl9mb3JtYXR3BWJ1aWxkYQE= +772B5841C130:E1A:g3F3DWlvX2xpYl9mb3JtYXR3BWJ1aWxkYQI= +772B5841C140:E1A:g3F3DWlvX2xpYl9wcmV0dHl3BXByaW50YQE= +772B5841C150:E1A:g3F3DWlvX2xpYl9wcmV0dHl3BXByaW50YQQ= +772B5841C160:E20:g3F3DWlvX2xpYl9mb3JtYXR3C2luZGVudGF0aW9uYQI= +772B5841C170:E21:g3F3DWlvX2xpYl9wcmV0dHl3DGludGVybWVkaWF0ZWEH +772B5841C180:E1A:g3F3DWlvX2xpYl9wcmV0dHl3BXdyaXRlYQE= +772B5841C190:E1D:g3F3DWlvX2xpYl9mb3JtYXR3CGZ3cml0ZV9nYQE= +772B5841C1A0:E1D:g3F3CGVybF9zY2Fudw1yZXNlcnZlZF93b3JkYQE= +772B5841C1B0:E1D:g3F3CmxvZ2dlcl9zdXB3C21vZHVsZV9pbmZvYQE= +772B5841C1C0:E1D:g3F3CmxvZ2dlcl9zdXB3C21vZHVsZV9pbmZvYQA= +772B5841C1D0:E16:g3F3CmxvZ2dlcl9zdXB3BGluaXRhAQ== +772B5841C1E0:E28:g3F3FmxvZ2dlcl9oYW5kbGVyX3dhdGNoZXJ3CnN0YXJ0X2xpbmthAA== +772B5841C1F0:E1C:g3F3CWVkbGluX2tleXcLbW9kdWxlX2luZm9hAQ== +772B5841C200:E1C:g3F3CWVkbGluX2tleXcLbW9kdWxlX2luZm9hAA== +772B5841C210:E29:g3F3FmxvZ2dlcl9oYW5kbGVyX3dhdGNoZXJ3C21vZHVsZV9pbmZvYQE= +772B5841C220:E29:g3F3FmxvZ2dlcl9oYW5kbGVyX3dhdGNoZXJ3C21vZHVsZV9pbmZvYQA= +772B5841C230:E27:g3F3FmxvZ2dlcl9oYW5kbGVyX3dhdGNoZXJ3CXRlcm1pbmF0ZWEC +772B5841C240:E29:g3F3FmxvZ2dlcl9oYW5kbGVyX3dhdGNoZXJ3C2hhbmRsZV9pbmZvYQI= +772B5841C250:E29:g3F3FmxvZ2dlcl9oYW5kbGVyX3dhdGNoZXJ3C2hhbmRsZV9jYXN0YQI= +772B5841C260:E29:g3F3FmxvZ2dlcl9oYW5kbGVyX3dhdGNoZXJ3C2hhbmRsZV9jYWxsYQM= +772B5841C270:E22:g3F3FmxvZ2dlcl9oYW5kbGVyX3dhdGNoZXJ3BGluaXRhAQ== +772B5841C280:E20:g3F3DWlvX2xpYl9mb3JtYXR3C21vZHVsZV9pbmZvYQE= +772B5841C290:E20:g3F3DWlvX2xpYl9mb3JtYXR3C21vZHVsZV9pbmZvYQA= +772B5841C2A0:E1A:g3F3DWlvX2xpYl9wcmV0dHl3BXByaW50YQI= +772B5841C2B0:E1F:g3F3DWtlcm5lbF9jb25maWd3CnN0YXJ0X2xpbmthAA== +772B5841C2C0:E20:g3F3DWtlcm5lbF9jb25maWd3C21vZHVsZV9pbmZvYQE= +772B5841C2D0:E20:g3F3DWtlcm5lbF9jb25maWd3C21vZHVsZV9pbmZvYQA= +772B5841C2E0:E21:g3F3DWtlcm5lbF9jb25maWd3DHNlbmRfdGltZW91dGEC +772B5841C2F0:E20:g3F3DWtlcm5lbF9jb25maWd3C2NvZGVfY2hhbmdlYQM= +772B5841C300:E20:g3F3DWtlcm5lbF9jb25maWd3C2hhbmRsZV9jYXN0YQI= +772B5841C310:E20:g3F3DWtlcm5lbF9jb25maWd3C2hhbmRsZV9jYWxsYQM= +772B5841C320:E1E:g3F3DWtlcm5lbF9jb25maWd3CXRlcm1pbmF0ZWEC +772B5841C330:E20:g3F3DWtlcm5lbF9jb25maWd3C2hhbmRsZV9pbmZvYQI= +772B5841C340:E19:g3F3DWtlcm5lbF9jb25maWd3BGluaXRhAQ== +772B5841C350:E13:g3F3B25ldF9hZG13BHBpbmdhAQ== +772B5841C360:E1D:g3F3C2tlcm5lbF9yZWZjdwpzdGFydF9saW5rYQA= +772B5841C370:E1E:g3F3C2tlcm5lbF9yZWZjdwttb2R1bGVfaW5mb2EB +772B5841C380:E1E:g3F3C2tlcm5lbF9yZWZjdwttb2R1bGVfaW5mb2EA +772B5841C390:E1E:g3F3C2tlcm5lbF9yZWZjdwtjb2RlX2NoYW5nZWED +772B5841C3A0:E1C:g3F3C2tlcm5lbF9yZWZjdwl0ZXJtaW5hdGVhAg== +772B5841C3B0:E1E:g3F3C2tlcm5lbF9yZWZjdwtoYW5kbGVfaW5mb2EC +772B5841C3C0:E1E:g3F3C2tlcm5lbF9yZWZjdwtoYW5kbGVfY2FzdGEC +772B5841C3D0:E1E:g3F3C2tlcm5lbF9yZWZjdwtoYW5kbGVfY2FsbGED +772B5841C3E0:E17:g3F3C2tlcm5lbF9yZWZjdwRpbml0YQE= +772B5841C3F0:E25:g3F3EmVybF9zaWduYWxfaGFuZGxlcncLbW9kdWxlX2luZm9hAQ== +772B5841C400:E25:g3F3EmVybF9zaWduYWxfaGFuZGxlcncLbW9kdWxlX2luZm9hAA== +772B5841C410:E23:g3F3EmVybF9zaWduYWxfaGFuZGxlcncJdGVybWluYXRlYQI= +772B5841C420:E25:g3F3EmVybF9zaWduYWxfaGFuZGxlcncLY29kZV9jaGFuZ2VhAw== +772B5841C430:E25:g3F3EmVybF9zaWduYWxfaGFuZGxlcncLaGFuZGxlX2NhbGxhAg== +772B5841C440:E25:g3F3EmVybF9zaWduYWxfaGFuZGxlcncLaGFuZGxlX2luZm9hAg== +772B5841C450:E26:g3F3EmVybF9zaWduYWxfaGFuZGxlcncMaGFuZGxlX2V2ZW50YQI= +772B5841C460:E1E:g3F3EmVybF9zaWduYWxfaGFuZGxlcncEaW5pdGEB +772B5841C470:E24:g3F3EGxvZ2dlcl9mb3JtYXR0ZXJ3DGNoZWNrX2NvbmZpZ2EB +772B5841C480:E23:g3F3EGxvZ2dlcl9mb3JtYXR0ZXJ3C21vZHVsZV9pbmZvYQE= +772B5841C490:E23:g3F3EGxvZ2dlcl9mb3JtYXR0ZXJ3C21vZHVsZV9pbmZvYQA= +772B5841C4A0:E26:g3F3EGxvZ2dlcl9mb3JtYXR0ZXJ3DmJlaGF2aW91cl9pbmZvYQE= +772B5841C4B0:E11:g3F3AnJldwdyZXBsYWNlYQQ= +772B5841C4C0:E26:g3F3CGNhbGVuZGFydxZzeXN0ZW1fdGltZV90b19yZmMzMzM5YQI= +772B5841C4D0:E22:g3F3DGxvZ2dlcl9zdGRfaHcOYWRkaW5nX2hhbmRsZXJhAQ== +772B5841C4E0:E1F:g3F3DGxvZ2dlcl9zdGRfaHcLbW9kdWxlX2luZm9hAQ== +772B5841C4F0:E1F:g3F3DGxvZ2dlcl9zdGRfaHcLbW9kdWxlX2luZm9hAA== +772B5841C500:E1D:g3F3DGxvZ2dlcl9zdGRfaHcJdGVybWluYXRlYQM= +772B5841C510:E1F:g3F3DGxvZ2dlcl9zdGRfaHcLaGFuZGxlX2luZm9hAw== +772B5841C520:E1F:g3F3DGxvZ2dlcl9zdGRfaHcLcmVzZXRfc3RhdGVhAg== +772B5841C530:E19:g3F3DGxvZ2dlcl9zdGRfaHcFd3JpdGVhBA== +772B5841C540:E1C:g3F3DGxvZ2dlcl9zdGRfaHcIZmlsZXN5bmNhAw== +772B5841C550:E22:g3F3DGxvZ2dlcl9zdGRfaHcOY29uZmlnX2NoYW5nZWRhAw== +772B5841C560:E20:g3F3DGxvZ2dlcl9zdGRfaHcMY2hlY2tfY29uZmlnYQQ= +772B5841C570:E18:g3F3DGxvZ2dlcl9zdGRfaHcEaW5pdGEC +772B5841C580:E21:g3F3DGxvZ2dlcl9zdGRfaHcNZmlsdGVyX2NvbmZpZ2EB +772B5841C590:E17:g3F3DGxvZ2dlcl9zdGRfaHcDbG9nYQI= +772B5841C5A0:E24:g3F3DGxvZ2dlcl9zdGRfaHcQcmVtb3ZpbmdfaGFuZGxlcmEB +772B5841C5B0:E23:g3F3DGxvZ2dlcl9zdGRfaHcPY2hhbmdpbmdfY29uZmlnYQM= +772B5841C5C0:E1C:g3F3DGxvZ2dlcl9zdGRfaHcIZmlsZXN5bmNhAQ== +772B5841C5D0:E1F:g3F3D2xvZ2dlcl9oX2NvbW1vbncIZmlsZXN5bmNhAg== +772B5841C5E0:E25:g3F3D2xvZ2dlcl9oX2NvbW1vbncOYWRkaW5nX2hhbmRsZXJhAQ== +772B5841C5F0:E26:g3F3D2xvZ2dlcl9oX2NvbW1vbncPY2hhbmdpbmdfY29uZmlnYQM= +772B5841C600:E27:g3F3D2xvZ2dlcl9oX2NvbW1vbncQcmVtb3ZpbmdfaGFuZGxlcmEB +772B5841C610:E1A:g3F3D2xvZ2dlcl9oX2NvbW1vbncDbG9nYQI= +772B5841C620:E24:g3F3D2xvZ2dlcl9oX2NvbW1vbncNZmlsdGVyX2NvbmZpZ2EB +772B5841C630:E19:g3F3B2ZpbGVsaWJ3CmVuc3VyZV9kaXJhAQ== +772B5841C640:E23:g3F3D2xvZ2dlcl9oX2NvbW1vbncMZXJyb3Jfbm90aWZ5YQE= +772B5841C650:E22:g3F3D2xvZ2dlcl9oX2NvbW1vbncLbW9kdWxlX2luZm9hAQ== +772B5841C660:E22:g3F3D2xvZ2dlcl9oX2NvbW1vbncLbW9kdWxlX2luZm9hAA== +772B5841C670:E1D:g3F3D2xvZ2dlcl9oX2NvbW1vbncGbm90aWZ5YQI= +772B5841C680:E22:g3F3D2xvZ2dlcl9oX2NvbW1vbncLcmVzZXRfc3RhdGVhAQ== +772B5841C690:E22:g3F3D2xvZ2dlcl9oX2NvbW1vbncLY29kZV9jaGFuZ2VhAw== +772B5841C6A0:E20:g3F3D2xvZ2dlcl9oX2NvbW1vbncJdGVybWluYXRlYQI= +772B5841C6B0:E22:g3F3D2xvZ2dlcl9oX2NvbW1vbncLaGFuZGxlX2luZm9hAg== +772B5841C6C0:E22:g3F3D2xvZ2dlcl9oX2NvbW1vbncLaGFuZGxlX2Nhc3RhAg== +772B5841C6D0:E22:g3F3D2xvZ2dlcl9oX2NvbW1vbncLaGFuZGxlX2NhbGxhAw== +772B5841C6E0:E22:g3F3D2xvZ2dlcl9oX2NvbW1vbncLaGFuZGxlX2xvYWRhAg== +772B5841C6F0:E1B:g3F3D2xvZ2dlcl9oX2NvbW1vbncEaW5pdGEB +772B5841C700:E11:g3F3AWN3CGVybGFuZ3JjYQA= +772B5841C710:E14:g3F3AWN3C21vZHVsZV9pbmZvYQE= +772B5841C720:E14:g3F3AWN3C21vZHVsZV9pbmZvYQA= +772B5841C730:E10:g3F3AWN3B2FwcGNhbGxhBA== +772B5841C740:EA:g3F3AWN3AXlhAg== +772B5841C750:EA:g3F3AWN3AXlhAQ== +772B5841C760:EB:g3F3AWN3AnhtYQE= +772B5841C770:EF:g3F3AWN3BnVwdGltZWEA +772B5841C780:EF:g3F3AWN3Bm1lbW9yeWEB +772B5841C790:EF:g3F3AWN3Bm1lbW9yeWEA +772B5841C7A0:EB:g3F3AWN3AmxzYQE= +772B5841C7B0:EB:g3F3AWN3AmxzYQA= +772B5841C7C0:EB:g3F3AWN3AmNkYQE= +772B5841C7D0:EC:g3F3AWN3A3B3ZGEA +772B5841C7E0:ED:g3F3AWN3BHJlZ3NhAA== +772B5841C7F0:EE:g3F3AWN3BW5yZWdzYQA= +772B5841C800:EE:g3F3AWN3BWZsdXNoYQA= +772B5841C810:EA:g3F3AWN3AW1hAQ== +772B5841C820:EB:g3F3AWN3AmJpYQE= +772B5841C830:E11:g3F3AWN3CGVybGFuZ3JjYQE= +772B5841C840:EB:g3F3AWN3AmxtYQA= +772B5841C850:EB:g3F3AWN3Am1tYQA= +772B5841C860:EA:g3F3AWN3AW1hAA== +772B5841C870:EB:g3F3AWN3AmJ0YQE= +772B5841C880:EA:g3F3AWN3AXFhAA== +772B5841C890:EA:g3F3AWN3AWlhAw== +772B5841C8A0:E15:g3F3AWN3DGRpc3BsYXlfaW5mb2EB +772B5841C8B0:EA:g3F3AWN3AWlhAQ== +772B5841C8C0:EB:g3F3AWN3Am5pYQA= +772B5841C8D0:EA:g3F3AWN3AWlhAA== +772B5841C8E0:EB:g3F3AWN3Am5sYQE= +772B5841C8F0:EA:g3F3AWN3AWxhAQ== +772B5841C900:EB:g3F3AWN3Am5jYQI= +772B5841C910:EB:g3F3AWN3Am5jYQE= +772B5841C920:E11:g3F3AWN3CGxjX2JhdGNoYQE= +772B5841C930:E11:g3F3AWN3CGxjX2JhdGNoYQA= +772B5841C940:EB:g3F3AWN3AmxjYQE= +772B5841C950:EC:g3F3AWN3A2hjYmED +772B5841C960:EC:g3F3AWN3A2hjYmEC +772B5841C970:EC:g3F3AWN3A2hjYmEB +772B5841C980:EB:g3F3AWN3Amh0YQM= +772B5841C990:EB:g3F3AWN3Amh0YQI= +772B5841C9A0:EB:g3F3AWN3Amh0YQE= +772B5841C9B0:EB:g3F3AWN3AmgxYQM= +772B5841C9C0:EA:g3F3AWN3AWhhAw== +772B5841C9D0:EA:g3F3AWN3AWhhAg== +772B5841C9E0:EA:g3F3AWN3AWhhAQ== +772B5841C9F0:EA:g3F3AWN3AWNhAw== +772B5841CA00:EA:g3F3AWN3AWNhAg== +772B5841CA10:EA:g3F3AWN3AWNhAQ== +772B5841CA20:ED:g3F3AWN3BGhlbHBhAA== +772B5841CA30:E1D:g3F3CnNoZWxsX2RvY3N3C3JlbmRlcl90eXBlYQI= +772B5841CA40:E1D:g3F3CnNoZWxsX2RvY3N3C3JlbmRlcl90eXBlYQM= +772B5841CA50:E1D:g3F3CnNoZWxsX2RvY3N3C3JlbmRlcl90eXBlYQQ= +772B5841CA60:E21:g3F3CnNoZWxsX2RvY3N3D3JlbmRlcl9jYWxsYmFja2EC +772B5841CA70:E21:g3F3CnNoZWxsX2RvY3N3D3JlbmRlcl9jYWxsYmFja2ED +772B5841CA80:E21:g3F3CnNoZWxsX2RvY3N3D3JlbmRlcl9jYWxsYmFja2EE +772B5841CA90:E1A:g3F3B2ZpbGVsaWJ3C2ZpbmRfc291cmNlYQE= +772B5841CAA0:E13:g3F3B2NvbXBpbGV3BGZpbGVhAg== +772B5841CAB0:E1F:g3F3B2NvbXBpbGV3EG91dHB1dF9nZW5lcmF0ZWRhAQ== +772B5841CAC0:E23:g3F3CGNhbGVuZGFydxNzZWNvbmRzX3RvX2RheXN0aW1lYQE= +772B5841CAD0:E18:g3F3CnNoZWxsX2RvY3N3BnJlbmRlcmEE +772B5841CAE0:E18:g3F3CnNoZWxsX2RvY3N3BnJlbmRlcmED +772B5841CAF0:E18:g3F3CnNoZWxsX2RvY3N3BnJlbmRlcmEC +772B5841CB00:E1A:g3F3B29yZGRpY3R3C21vZHVsZV9pbmZvYQE= +772B5841CB10:E1A:g3F3B29yZGRpY3R3C21vZHVsZV9pbmZvYQA= +772B5841CB20:E12:g3F3B29yZGRpY3R3A21hcGEC +772B5841CB30:E13:g3F3B29yZGRpY3R3BGZvbGRhAw== +772B5841CB40:E1D:g3F3B29yZGRpY3R3DnVwZGF0ZV9jb3VudGVyYQM= +772B5841CB50:E15:g3F3B29yZGRpY3R3BnVwZGF0ZWEE +772B5841CB60:E15:g3F3B29yZGRpY3R3BnVwZGF0ZWED +772B5841CB70:E1A:g3F3B29yZGRpY3R3C2FwcGVuZF9saXN0YQM= +772B5841CB80:E15:g3F3B29yZGRpY3R3BmFwcGVuZGED +772B5841CB90:E13:g3F3B29yZGRpY3R3BHRha2VhAg== +772B5841CBA0:E19:g3F3B29yZGRpY3R3CmZldGNoX2tleXNhAQ== +772B5841CBB0:E14:g3F3B29yZGRpY3R3BWZldGNoYQI= +772B5841CBC0:E17:g3F3B29yZGRpY3R3CGlzX2VtcHR5YQE= +772B5841CBD0:E13:g3F3B29yZGRpY3R3BHNpemVhAQ== +772B5841CBE0:E1E:g3F3C3Jhd19maWxlX2lvdwttb2R1bGVfaW5mb2EB +772B5841CBF0:E1E:g3F3C3Jhd19maWxlX2lvdwttb2R1bGVfaW5mb2EA +772B5841CC00:E19:g3F3BnN0cmluZ3cLbW9kdWxlX2luZm9hAQ== +772B5841CC10:E19:g3F3BnN0cmluZ3cLbW9kdWxlX2luZm9hAA== +772B5841CC20:E12:g3F3BnN0cmluZ3cEam9pbmEC +772B5841CC30:E16:g3F3BnN0cmluZ3cIdG9fdXBwZXJhAQ== +772B5841CC40:E16:g3F3BnN0cmluZ3cIdG9fbG93ZXJhAQ== +772B5841CC50:E18:g3F3BnN0cmluZ3cKc3ViX3N0cmluZ2ED +772B5841CC60:E18:g3F3BnN0cmluZ3cKc3ViX3N0cmluZ2EC +772B5841CC70:E14:g3F3BnN0cmluZ3cGY2VudHJlYQM= +772B5841CC80:E14:g3F3BnN0cmluZ3cGY2VudHJlYQI= +772B5841CC90:E13:g3F3BnN0cmluZ3cFcmlnaHRhAw== +772B5841CCA0:E13:g3F3BnN0cmluZ3cFcmlnaHRhAg== +772B5841CCB0:E12:g3F3BnN0cmluZ3cEbGVmdGED +772B5841CCC0:E12:g3F3BnN0cmluZ3cEbGVmdGEC +772B5841CCD0:E13:g3F3BnN0cmluZ3cFc3RyaXBhAw== +772B5841CCE0:E13:g3F3BnN0cmluZ3cFc3RyaXBhAg== +772B5841CCF0:E13:g3F3BnN0cmluZ3cFc3RyaXBhAQ== +772B5841CD00:E16:g3F3BnN0cmluZ3cIc3ViX3dvcmRhAw== +772B5841CD10:E16:g3F3BnN0cmluZ3cIc3ViX3dvcmRhAg== +772B5841CD20:E13:g3F3BnN0cmluZ3cFd29yZHNhAg== +772B5841CD30:E13:g3F3BnN0cmluZ3cFd29yZHNhAQ== +772B5841CD40:E14:g3F3BnN0cmluZ3cGY29waWVzYQI= +772B5841CD50:E13:g3F3BnN0cmluZ3cFY2hhcnNhAw== +772B5841CD60:E13:g3F3BnN0cmluZ3cFY2hhcnNhAg== +772B5841CD70:E14:g3F3BnN0cmluZ3cGc3Vic3RyYQM= +772B5841CD80:E14:g3F3BnN0cmluZ3cGc3Vic3RyYQI= +772B5841CD90:E13:g3F3BnN0cmluZ3cFY3NwYW5hAg== +772B5841CDA0:E12:g3F3BnN0cmluZ3cEc3BhbmEC +772B5841CDB0:E12:g3F3BnN0cmluZ3cEcnN0cmEC +772B5841CDC0:E11:g3F3BnN0cmluZ3cDc3RyYQI= +772B5841CDD0:E12:g3F3BnN0cmluZ3cEcmNocmEC +772B5841CDE0:E11:g3F3BnN0cmluZ3cDY2hyYQI= +772B5841CDF0:E14:g3F3BnN0cmluZ3cGY29uY2F0YQI= +772B5841CE00:E11:g3F3BnN0cmluZ3cDbGVuYQE= +772B5841CE10:E1C:g3F3BnN0cmluZ3cObmV4dF9jb2RlcG9pbnRhAQ== +772B5841CE20:E1D:g3F3BnN0cmluZ3cPamFyb19zaW1pbGFyaXR5YQI= +772B5841CE30:E12:g3F3BnN0cmluZ3cEZmluZGED +772B5841CE40:E18:g3F3BnN0cmluZ3cKbnRoX2xleGVtZWED +772B5841CE50:E15:g3F3BnN0cmluZ3cHcmVwbGFjZWEE +772B5841CE60:E14:g3F3BnN0cmluZ3cGcHJlZml4YQI= +772B5841CE70:E16:g3F3BnN0cmluZ3cIdG9fZmxvYXRhAQ== +772B5841CE80:E18:g3F3BnN0cmluZ3cKdG9faW50ZWdlcmEB +772B5841CE90:E16:g3F3BnN0cmluZ3cIY2FzZWZvbGRhAQ== +772B5841CEA0:E17:g3F3BnN0cmluZ3cJdGl0bGVjYXNlYQE= +772B5841CEB0:E12:g3F3BnN0cmluZ3cEdGFrZWEE +772B5841CEC0:E12:g3F3BnN0cmluZ3cEdGFrZWED +772B5841CED0:E12:g3F3BnN0cmluZ3cEdGFrZWEC +772B5841CEE0:E12:g3F3BnN0cmluZ3cEdHJpbWEB +772B5841CEF0:E11:g3F3BnN0cmluZ3cDcGFkYQQ= +772B5841CF00:E11:g3F3BnN0cmluZ3cDcGFkYQM= +772B5841CF10:E11:g3F3BnN0cmluZ3cDcGFkYQI= +772B5841CF20:E13:g3F3BnN0cmluZ3cFc2xpY2VhAg== +772B5841CF30:E15:g3F3BnN0cmluZ3cHcmV2ZXJzZWEB +772B5841CF40:E13:g3F3BnN0cmluZ3cFZXF1YWxhBA== +772B5841CF50:E13:g3F3BnN0cmluZ3cFZXF1YWxhAw== +772B5841CF60:E13:g3F3BnN0cmluZ3cFZXF1YWxhAg== +772B5841CF70:E16:g3F3BnN0cmluZ3cIaXNfZW1wdHlhAQ== +772B5841CF80:E1D:g3F3BnN0cmluZ3cPbGlzdF90b19pbnRlZ2VyYQE= +772B5841CF90:E16:g3F3DHVuaWNvZGVfdXRpbHcCZ2NhAQ== +772B5841CFA0:E1E:g3F3DHVuaWNvZGVfdXRpbHcKd2hpdGVzcGFjZWEA +772B5841CFB0:E1D:g3F3DHVuaWNvZGVfdXRpbHcJdGl0bGVjYXNlYQE= +772B5841CFC0:E16:g3F3DHVuaWNvZGVfdXRpbHcCY3BhAQ== +772B5841CFD0:E1C:g3F3DHVuaWNvZGVfdXRpbHcIY2FzZWZvbGRhAQ== +772B5841CFE0:E1D:g3F3DHVuaWNvZGVfdXRpbHcJdXBwZXJjYXNlYQE= +772B5841CFF0:E1D:g3F3DHVuaWNvZGVfdXRpbHcJbG93ZXJjYXNlYQE= +=binary:6451BC511D70 +9C:XlsbwptdW1tcXSgpIzs/XSooPzooPzooPzooPzo7Wy1hLXpBLVpcZFwvIyYuOj0/JUB+X10rKSp8W2EtekEtWlxkXSsoPzo7Wy1hLXpBLVpcZFwvIyYuOj0/JUB+X10qKSopPwcpfCg/Oig/OlxkezEsNH0oPzo7XGR7MCw0fSkqKT9bXGRBLVBSLVRaY2YtbnEtdXk9Pjx+XSkp +=binary:6451BC4F44C0 +6B:aXQgcmVxdWlyZXMgYSBtb3JlIHJlY2VudCBFcmxhbmcvT1RQIHZlcnNpb24gb3IgaXRzIC5iZWFtIGZpbGUgd2FzIGNvcnJ1cHRlZC4NCihZb3UgYXJlIHJ1bm5pbmcgRXJsYW5nL09UUCA= +=binary:6451BC4F4418 +6C:aXQgY2Fubm90IGJlIGZvdW5kLg0KTWFrZSBzdXJlIHRoYXQgdGhlIG1vZHVsZSBuYW1lIGlzIGNvcnJlY3QgYW5kIHRoYXQgaXRzIC5iZWFtIGZpbGUNCmlzIGluIHRoZSBjb2RlIHBhdGgu +=binary:6451BC50D300 +15E:RVJDUF4BAAAQCAAAAQAAAP//////////AAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIMBGhtuAAAACAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAABuAAAAAAgDAIgAAAAoAAAAAAAAAAAAAAAAAAAAAAAAAABigwCNgwCHkoMALpKDACcdO24AAAAAaOD/p////4f+//9HAAAAAAAAAAAAAAAAAAAAAGR5ACd3AFBuAAAAAAAA/wP+//8H/v//BwAAAAAAAAAAAAAAAAAAAABrkoMAJx07bgAAAABo4P+n////h/7//0cAAAAAAAAAAAAAAAAAAAAAYnkAJ3gAfh0HeACHdwBDgwA9koMAFQdbAAMHkoMACR07WwAEB3kACXgAFW4AAAAAAAD/c/7/HQTIfz5CAAAAAAAAAAAAAAAAAAAAAHgAPXgA0HgBGgA= +=atoms +'-inlined-rev/1-' +'-inlined-append/2-' +'-titlecase/1-lbc$^0/2-0-' +'-to_lower/1-lc$^0/1-0-' +'-to_upper/1-lc$^0/1-0-' +'-join/2-lc$^0/1-0-' +to_upper +to_lower +to_upper_char +to_lower_char +sub_string +centre +r_pad +l_pad +strip_right +strip_left +s_word +sub_word +w_count +words +copies +tokens_multiple_2 +tokens_multiple_1 +tokens_single_2 +tokens_single_1 +substr2 +substr1 +substr +cspan +span +l_prefix +rstr +str +rchr +chr +add_rsorted +str_to_map +str_to_indexmap +gcl_and_length +str_to_gcl_and_length +bin_search_str_2 +bin_search_str_1 +bin_search_str +bin_search_inv_n +bin_search_inv_1 +bin_search_inv +bin_search_loop +bin_pattern +search_cp +search_pattern +bin_search +cp_prefix_1 +cp_prefix +add_non_empty +find_r +find_l +lexeme_skip +nth_lexeme_m +lexeme_pick +lexemes_m +prefix_1 +take_tc +take_t +take_lc +take_l +trim_t +trim_ts +trim_l +trim_ls +casefold_bin +casefold_list +lowercase_bin +lowercase_list +uppercase_bin +uppercase_list +slice_bin +slice_list +slice_trail +slice_lb +slice_l +slice_l0 +reverse_b +reverse_1 +equal_norm_nocase +equal_norm +equal_nocase +equal_1 +length_b +length_1 +cp +next_codepoint +jaro_calc_mt +jaro_detect +jaro_match +jaro_similarity +nth_lexeme +to_number +to_float +to_integer +casefold +titlecase +whitespace +leading +split_string +'-open_1/3-fun-0-' +match_binary +match_writable +match_delayed +compressed_one +match_compressed +add_unless_matched +add_implicit_modes +open_layer +open_1 +reverse_pairs +append_list +fetch_keys +no_source +'-c/2-fun-0-' +'-c/5-fun-0-' +'-h/1-fun-0-' +'-h/2-fun-0-' +'-h/3-fun-0-' +'-h1/1-fun-0-' +'-h1/2-fun-0-' +render +'-h1/3-fun-0-' +'-format_docs/1-fun-0-' +'-lc/1-fun-0-' +'-lc_batch/1-lc$^0/1-0-' +'-i/1-fun-0-' +'-all_procs/0-fun-0-' +'-m/0-fun-0-' +'-lm/0-lc$^0/1-0-' +'-nregs/0-fun-0-' +'-all_regs/0-lc$^0/1-0-' +'-print_node_regs/1-fun-0-' +'-print_node_regs/1-fun-1-' +appcall +parsetools +yecc +y +tools +xref +xm +seconds_to_daystime +get_uptime +uptime +max_length +ls_print +ls +pwd +portformat +portline +procformat +procline +portinfo +pwhereis +pids_and_ports +print_node_regs +all_regs +regs +nregs +split_print_exports +print_exports +get_compile_info +get_compile_options +print_md5 +print_object_file +bi +f_p_e +lm +mm +mformat +bt +patch_old_pinfo +all_procs +iformat +format_label +fetch_label +mfa_string +'more (y/n)? (y) ' +paged_output +less +ni +l +nc +d +split_def +'@o' +'@i' +'@d' +lc_batch +output_generated +purge_and_load +src_suffix +from_opt +from_core +from_asm +is_from_opt +is_outdir_opt +ensure_outdir +ensure_from +report_warnings +compile_and_load +safe_recompile +cwd +compile_info_add_cwd +find_beam_1 +find_beam +source +find_source +old_options +format_docs +render_callback +hcb +render_type +ht +unknown_format +h2 +outdir +logger_h_common_logger_std_h_default_restarting +logger_std_h_default +handler_busy +cancel_repeated_filesync +set_repeated_filesync +check_common_config +string_to_binary +formatter_crashed +try_format +formatter_error +caught +do_log_to_binary +log_to_binary +log_handler_info +restart_impossible +rep_sync_tref +repeated_filesync +last_op +handler_state +ctrl_sync_count +olp +file_ctrl_process_not_started +'-fix_modes/1-lc$^0/1-0-' +'-fix_modes/1-fun-1-' +'-file_ctrl_start/2-fun-0-' +error_notify +maybe_notify_error +decompress_data +decompress_file +compress_data +compress_file +rot_file_name +rotate_files +rotate_file +maybe_rotate_file +maybe_update_compress +maybe_remove_archives +curr_size +rotation +update_rotation +sync_dev +write_to_dev +could_not_create_dir_for_file +could_not_reopen_file +ensure_open +ensure_file +maybe_ensure_file +file_ctrl_loop +open_failed +dev +file_ctrl_init +file_ctrl_call +file_ctrl_filesync +file_write +file_ctrl_stop +file_ctrl_start +delayed_write_close +close_log_file +write_res +sync_res +last_check +inode +handler_name +ensure_dir +open_log_file +write_failed +config_changed +delayed_write +fix_modes +no_repeat +filesync_repeat_interval +fix_file_opts +merge_default_config +normalize_config +modes +max_no_files +max_no_bytes +file_check +compress_on_rotate +check_h_config +file_ctrl_pid +filesync +'-format/2-fun-0-' +'-check_template/1-fun-0-' +check_timezone +check_offset +check_template +check_limit +invalid_formatter_template +do_check_config +offset_to_utc +utc_log +get_utc_config +utc_to_offset +get_offset +get_depth +get_max_size +default_template +add_default_template +add_default_config +month +error_logger_notice_header +add_legacy_title +maybe_add_legacy_header +timestamp_to_datetimemicro +system_time_to_rfc3339 +time_designator +format_time +get_first +get_last +chardata_to_list +limit_depth +reformat +chars_limit_to_opts +format_msg +linearize_template +template +resource +cleanup +pong +ping +'-wait_nodes/2-fun-0-' +sync_nodes_optional +get_sync_optional_nodes +sync_nodes_mandatory +get_sync_mandatory_nodes +sync_nodes_timeout +get_sync_timeout +get_sync_data +check_up +mandatory_nodes_down +wait_nodes +sync_nodes +'__not_used' +dist_ac_took_control +go +logger_proxy_logger_proxy_restarting +cond_lowercase +flat_trunc +prefixed_integer +unprefixed_integer +string_field +limit_field +limit_cdata_to_chars +cdata_to_chars +final +limit_iolist_to_chars +iolist_to_chars +float_data +signbit +abs_float_f +float_f +fwrite_f +float_exp +float_man +abs_float_e +float_e +fwrite_e +column +base +uniconv +control_limited +control_small +decr_pc +build_limited +not_small +build_small +w +count_small +collect_cc +field_value +field_width +modifiers +collect_cseq +collect +print_maps_order +print_strings +print_encoding +print_pad_char +print_precision +print_field_width +control_char +pad_char +precision +strings +width +'-merge/3-fun-0-' +valid_functions +normal_map +meta_o +meta_meta +meta_left_sq_bracket +meta_csi +csi +shell_keymap +'-write/2-fun-0-' +chars_length +test_limit_bitstring +test_limit_map_assoc +test_limit_map_body +test_limit_map +test_limit_tuple +test_limit_tail +test_limit +limit_bitstring +limit_map_assoc +limit_map_body +limit_map +limit_tuple +limit_tail +limit +binrev +collect_line_list +collect_line_bin +collect_chars_list +collect_chars1 +count_and_find_utf8 +printable_latin1_list +deep_unicode_char_list +deep_latin1_char_list +write_char_as_latin1 +write_latin1_char +write_unicode_char +string_char +write_string1 +unicode_as_latin1 +write_string_as_latin1 +write_latin1_string +write_unicode_string +unicode_as_unicode +name_char +name_chars +reserved_word +quote_atom +write_possibly_quoted_atom +tsub +write_binary_body +write_binary +write_map_assoc +write_map_body +write_map +write_ref +write_port +write_tuple +write_tail +fwrite_g +write1 +intermediate +maps_order +add_modifier +do_format_prompt +indentation +test_modules_loaded +build_text +unscan +unscan_format +scan +'-edit_line1/2-lc$^0/1-0-' +'-over_word/3-lc$^0/1-0-' +'-chars_before/1-lc$^0/1-0-' +'-current_line/1-fun-0-' +cp_len +gc_len +current_chars +length_after +length_before +chars_before +default_multiline_prompt +shell_multiline_prompt +multi_line_prompt +erase_inp +over_paren_auto +over_paren +word_char +over_non_word +over_word2 +over_word1 +until_quote +yank +transpose_word +transpose_char +kill_word +kill_line +forward_word +forward_line +forward_delete_word +forward_delete_char +forward_char +end_of_line +clear_line +beginning_of_line +beginning_of_expression +backward_word +backward_line +backward_kill_word +backward_kill_line +backward_delete_word +backward_char +auto_blink +skip_up +skip_down +scroll_expand_up +scroll_expand_down +move_expand_up +move_expand_down +backward_delete_char +do_op +escape_prefix +insert_search +redraw +end_of_expression +tab_expand_quit +tab_expand_full +tab_expand +new_line_finish +new_line +key +get_valid_escape_key +edit +kill_buffer +key_map +get_key_map +no_help +'-normalize_expand_fun/2-fun-0-' +'-get_line1/5-lc$^0/1-0-' +'-normalize_request/1-fun-0-' +normalize_request +format_io_request_log +server_name +is_latin1 +check_encoding +format_prompt +prompt_bytes +edit_password +get_password1 +get_password_line +search_down_stack +search_up_stack +save_line_buffer +pad_stack +get_all_lines +get_lines +save_line +down_stack +up_stack +stack +new_stack +get_line_timeout +remainder_after_nl +edit_line_raw +format_expression1 +format_shell_func +get_chars_echo_off1 +get_chars_echo_off +get_line_echo_off1 +get_line_echo_off +more_data +to_graphemes +edit_line1 +new_search +erase_line +redraw_line +search_result +prompt +search_quit_prompt +search_quit +search_found +search_cancel +history_up +history_down +format_expression +format_matches +h1 +get_context +over_word +help_full +help +expand_full +get_line1 +interrupted +get_chars_n_loop +both +prompt_width +current_line +get_chars_loop +get_chars_line +get_chars_n +get_password_chars +terminal +normalize_expand_fun +send_drv_reqs +send_drv +collect_chars +get_tty_geometry +exit_shell +driver_id +start_shell1 +whereis_shell +line_buffer +dumb +read_mode +convert_binaries +bc_req +default_output +default_input +execute_request +parse_erl_form +scan_erl_form +scan_erl_exprs +fread +conv_reason +get_password +sig +ebadf +canon +'-handle_request/2-lc$^0/1-0-' +'-handle_request/2-lc$^1/1-1-' +'-in_view/1-lc$^0/1-0-' +'-in_view/1-lc$^1/1-1-' +'-in_view/1-lc$^3/1-2-' +'-in_view/1-lc$^2/1-3-' +'-cols_multiline/4-lc$^0/1-0-' +'-characters_to_output/1-fun-0-' +'-characters_to_buffer/1-fun-0-' +'-binary_to_latin1/2-lc$^0/1-0-' +tty_read_signal +tgoto_nif +tgetstr_nif +tgetflag_nif +tgetnum_nif +tgetent_nif +tgoto +tgetstr +tgetflag +tgetnum +tgetent +wcswidth +sizeof_wchar +wcwidth +isprint +tty_window_size +tty_encoding +tty_select +setlocale +tty_set +tty_init +tty_create +encode +char_to_latin1 +binary_to_latin1 +is_usascii +to_latin1 +ansi_sgr +ansi +next_grapheme +insert_buf +characters_to_buffer +characters_to_output +xnfix +is_wide +not_printable +npwcwidth +update_geometry +cols_int +cols +cols_multiline +split_cols_multiline +cols_after_cursor +in_view +right +left +move_cursor +split_cols +last_or_empty +unhandled_request +redraw_prompt_pre_deleted +putc_raw +writer_loop +user_drv_writer +flush_unicode_state +reader_loop +user_drv_reader +winch +cont +reader_stop +reader +writer +init_term +standard_io_encoding +primitive +ansi_color +ansi_bg_color +yellow +white +red +magenta +green +cyan +bright_yellow +bright_white +bright_red +bright_magenta +bright_green +bright_cyan +bright_blue +bright_black +blue +black +ansi_fg_color +ansi_regexp +'StateName' +should_not_have_arrived_here_but_instead_in +'-inlined-loop_state_enter/9-' +'-format_log_single/2-fun-0-' +'-list_timeouts/1-lc$^0/1-0-' +list_timeouts +limit_client_info +terminate_sys_debug +bad_reply_action_from_state_function +do_reply_then_terminate +reply_then_terminate +bad_return_from_callback_mode +state_enter +handle_event_function +callback_mode_result +get_callback_mode +parse_timeout_opts_abs +loop_done +loop_timeouts_update +loop_timeouts_cancel +loop_timeouts_register +loop_timeouts_start +loop_timeouts +loop_next_events +loop_state_change +loop_keep_state +loop_state_transition +loop_actions_next_event_bad +loop_actions_next_event +loop_actions_reply +bad_action_from_state_function +state_timeout +pop_callback_module +bad_state_enter_action_from_state_function +push_callback_module +change_callback_module +loop_actions_list +loop_actions +bad_return_from_state_function +repeat_state_and_data +repeat_state +bad_state_enter_return_from_state_function +stop_and_reply +loop_state_callback_result +loop_state_callback +loop_event +loop_receive_result +t0q +loop_receive +loop_hibernate +wakeup_from_hibernate +event_string +insert_timeout +consume +sys_debug +timeouts +postponed +bad_return_from_init +init_result +params +replies +dirty_timeout +clean_timeout +postpone +'-gr_list/1-inlined-0-' +'-init_local_shell/2-fun-0-' +'-group_opts/1-fun-1-' +'-group_opts/1-fun-0-' +'-gr_list/1-fun-0-' +gr_list +gr_cur_index +gr_cur_pid +gr_del_pid +gr_set_num +gr_set_cur +gr_add_cur +gr_get_info +gr +gr_get_num +gr_new_group +gr_new +handle_req +mktemp +disable_reader +is_file +delete_line +delete_after_cursor +beep +move +move_rel +move_line +move_expand +delete_chars +insert_over +insert_chars_over +insert_chars +putc +redraw_prompt +put_expand +move_combo +expand_below +below +shell_expand_location +expand_fun +group_opts +list_commands +unknown_group +j +r +h +'?' +switch_cmd +blink +edit_line +jcl +shell_esc +more_chars +activate +new_prompt +ctrl_c +contains_ctrl_g_or_ctrl_c +put_chars_sync +die +is_writer +is_reader +enable_reader +chomp +window_size +tty_geometry +get_unicode_state +get_terminal_state +interrupt +switch_loop +ctrl_g +editor_data +editor +handle_signal +open_editor +keep_state +set_unicode_state +keep_state_and_data +reinit +next_state +init_shell +init_local_shell +shell_slogan +init_remote_shell +init_noshell +exit_on_remote_shell_error +handles +init_standard_error +old +next_event +isatty +stdin +state_functions +callback_mode +'tty_sl -c -e' +current_group +whereis_group +start_shell +remsh +initial_shell +oldshell +nouser +noinput +get_user +wait_for_user_p +start_user +relay1 +start_relay +'-inlined-result/4-' +'-receive_response/3-anonymous-0-' +'-reqids_to_list/1-fun-0-' +mcall_map_replies +mcall_abandon +mcall_result +mcall_receive_replies +local_call +mcall_send_requests +mcall_send_request +mcall_local_call +expired +time_left +call_abandon +trim_stack_aux +use_all +nonexisting +call_result +multicast_send_requests +'no global_groups definiton' +illegal_function_call +global_group_not_runnig +not_boolean +'-handle_call/3-inlined-1-' +'-initial_group_setup/3-fun-0-' +'-initial_group_setup/3-fun-1-' +'-schedule_conf_changed_checks/3-fun-0-' +'-make_group_conf/2-lc$^0/1-0-' +'-disconnect_nodes/2-fun-0-' +'-force_nodedown/2-fun-0-' +force_nodedown +disconnect_nodes +check_exit_ggc +check_exit_where +check_exit_send +not_found_ignored +check_exit_reg +check_exit +safesend_nc +not_own_group +safesend +send_monitor +delete_all +global_group_check_dispatcher +lookup_group_conf +alive_state_change_group_conf +make_group_conf +new_group_conf +fetch_new_group_conf +grp_tuple +'node defined twice' +no_name +config_scan +removing_node_state_of_member_node +node_state +conf_changed_check +handle_erpc_response +schedule_conf_changed_checks +log_sync_error +nodeup_conf_check +continue_handle_info +find_name +registered_names_res +find_name_res +send_res +config_ok +illegal_message +own_group_name +own_group_nodes +synced_nodes +no_contact +other_groups +monitoring +conf_check +gconf +names +names_test +whereis_test +test3844zty +not_agreed +sync_error +agreed +no_conf +'invalid global_groups definition' +initial_group_setup +global_group_check +whereis_name_test +send_test +registered_names_test +ng_add_check +own_nodes +'-intersect_with/3-fun-0-' +'-merge_with/3-fun-0-' +'-iterator/2-fun-1-' +'-iterator/2-fun-0-' +try_next +is_iterator_valid_1 +is_iterator_valid +error_type_merge_intersect +error_type_two_maps +groups_from_list_2 +groups_from_list_1 +groups_from_list +with_1 +filter_1 +to_list_internal +to_list_from_iterator +merge_with_1 +intersect_with_iterate +intersect_with_small_map_first +intersect_with +intersect_combiner_v2 +intersect_combiner_v1 +intersect +do_start_link +no_epmd +net_sup_dynamic +'-inlined-get_52/1-' +'-inlined-exsss_next/1-' +'-inlined-exsp_next/1-' +'-inlined-exs1024_next/1-' +'-inlined-exrop_next/1-' +'-exs1024_jump/6-fun-0-' +float2str +make_float +bc64 +normal_fi +format_jumpconst58_value +format_jumcons58_matches +format_jumpconst58 +xorzip_sr +polyjump +splitmix64_next +seed64 +seed58 +seed_nz +seed64_nz +seed58_nz +hash58 +mwc59_seed +mwc59_float +mwc59_value +mwc59_value32 +mwc59 +zero_seed +non_integer_seed +too_many_seed_integers +dummy_seed +dummy_next +dummy_uniform +exrop_jump +exrop_uniform +exrop_next +exrop_seed +exro928_jump_2pow20 +exro928_jump_2pow512 +exro928_jump +exro928ss_uniform +exro928_next_state +exro928_next +exro928ss_next +exro928_seed +exs1024_jump +exs1024_next +exs1024_calc +exs1024_gen1024 +exs1024_seed +exsp_jump +exsplus_jump +exsss_uniform +exsp_uniform +exsss_next +exsp_next +exsss_seed +exsplus_seed +exs64_next +exs64_seed +exsp +exs64 +exs1024s +exs1024 +exrop +exro928ss +dummy +mk_alg +seed_get +seed_put +normal_s +jump +bytes_r +bytes_s +uniform_real_s +uniform_real +uniform_n +uniform_s +exsss +default_seed +seed_s +export_seed_s +rand_seed +export_seed +weak_low_bits +uniform_range +'$4' +'-make_node_vsn_list/2-inlined-0-' +'-do_ops/5-inlined-5-' +'-do_ops/5-inlined-2-' +'-delete_lock/2-inlined-0-' +'-register_name/3-fun-0-' +'-check_dupname/2-lc$^0/1-0-' +'-unregister_name/1-fun-0-' +'-re_register_name/3-fun-0-' +'-register_name_external/3-fun-0-' +'-delete_node_resources/2-fun-0-' +'-check_replies/3-lc$^0/1-0-' +'-resolved/5-fun-0-' +'-resolved/5-fun-1-' +'-resolved/5-fun-2-' +'-resolved/5-fun-3-' +'-resolved/5-fun-4-' +'-resolved/5-fun-5-' +'-start_resolver/2-fun-0-' +'-do_ops/5-lc$^1/1-1-' +'-do_ops/5-lc$^0/1-0-' +'-do_ops/5-fun-2-' +'-do_ops/5-lc$^3/1-3-' +'-do_ops/5-lc$^4/1-4-' +'-do_ops/5-fun-5-' +'-do_ops/5-lc$^6/1-6-' +'-do_ops/5-fun-7-' +'-sync_others/1-fun-0-' +'-sync_others/1-fun-1-' +'-del_name/2-lc$^1/1-1-' +'-del_name/2-lc$^0/1-0-' +'-init_the_locker_fun/1-fun-0-' +'-exclude_known/2-lc$^0/1-0-' +'-delete_lock/2-fun-0-' +'-pid_locks/1-fun-0-' +'-pid_locks/1-lc$^1/1-1-' +'-gns_volatile_multicast/5-fun-0-' +'-node_list/1-fun-0-' +'-make_node_vsn_list/2-fun-0-' +'-mk_known_list/2-fun-0-' +'-mk_known_list/2-fun-1-' +'-add_to_known/2-fun-0-' +'-send_again/1-fun-0-' +'-start_sync/2-fun-0-' +'-sync_init/2-fun-0-' +'-sync_loop/2-fun-0-' +'-start_the_registrar/0-fun-0-' +allow_tuple_fun +unexpected_message +loop_the_registrar +start_the_registrar +get_own_nodes_with_errors +get_own_nodes +check_sync_nodes +synced +sync_loop +sync_init +start_sync +new_node_name +change_our_node_name +send_again +exsplus +random_sleep +get_names +remove_lost_connection_info +save_lost_connection_info +get_lost_connection_info +mk_known_list +make_node_vsn_list +node_list +node_vsn +is_node_potentially_known +gns_volatile_multicast +gns_volatile_send +inform_connection_loss +removing +handle_nodedown +new_resolver +no_longer_a_pid +handle_nodeup +ref_is_locking +pid_locks +delete_lock +pid_is_locking +unlink_pid +dounlink_ext +dolink_ext +notify_all_name +global_name_conflict +random_notify_name +random_exit_name +minmax +resolve_it +exchange_names +reset_node_state +send_cancel_connect_message +send_cancel_connect +kill_resolver +cancel_locker +is_node_local +add_node +remove_node2 +remove_node +find_node_tag2 +find_node_tag +the_boss +delete_global_lock +call_fun +wait_cancel_lock +lock_is_set_wait_cancel +lock_is_set_true_received +exclude_known +random_element +update_locker_known +locker_failed +locker_succeeded +lock_rejected +locker_trace +delete_nonode +lock_nodes_safely +locker_lock_id +send_lock_set +select_node +get_locker +get_state_reply +remove_from_known +do_trace +no_fun +him +the_locker_message_wait_cancel +the_locker_message +loop_the_locker +init_the_locker_fun +start_the_locker +delete_global_name +delete_global_name2 +delete_global_name_keep_pid +del_name +extra_info +lock_still_set +insert_global_name +sync_other +global_connect_retries +sync_others +do_ops +rem_lock +remove_lock +handle_del_lock +is_lock_set +is_global_lock_set +ins_lock +insert_lock +can_set_lock +handle_set_lock +ins_name_ext +ins_name +resend_pre_connect +resolver +start_resolver +do_whereis +cancel_resolved_locker +ops +added +add_to_known +lock +resolve +wait_lock +lock_id +restart_connect +pre_connect +his_the_locker +locker +prot_vsn +check_replies +local_lock_check +set_lock_on_nodes +lock_on_known_nodes +set_lock_known +send_high_level_trace +wait_high_level_trace +delete_node_resources +delete_node_resource_info +save_node_resource_info +nodes_changed +high_level_trace +extra_nodedown +registrar_died +locker_died +not_connected +group_configured +trace_message +group_nodeup +group_nodedown +cancel_connect +init_connect_ack +ignore_node +remove_connection +participant +lost_connection +in_sync +async_del_name +async_del_lock +lock_is_set +init_connect +sync_tag_his +exit_resolver +lock_set +exchange_ops +new_nodes +save_ops +sync_tag_my +resolved +high_level_trace_stop +high_level_trace_start +high_level_trace_get +get_synced +get_protocol_version +get_names_ext +get_known +trans_all_known +register_ext +creation_extension +seed +conf +connect_all +no_trace +global_node_resources +global_lost_connections +global_pid_ids +global_names_ext +global_locks +aborted +trans +del_lock +set_lock +unregister_name_external +register_name_external +global_names +registered_names +re_register_name +global_multi_name_action +global_pid_names +check_dupname +registrar +invalid_key +invalid_configuration +bad_node +ok_pending +nok_pending +already_pending +publish_type +'-merge_opts/2-inlined-0-' +'-monitor_nodes/2-fun-0-' +invalid_option +'-terminate/2-fun-0-' +'-handle_info/2-fun-1-' +'-handle_info/2-fun-0-' +'-restart_distr/1-fun-0-' +'-split_node/1-fun-0-' +'-setopts_new_1/3-fun-0-' +'-setopts_new_1/3-fun-1-' +'-merge_opts/2-fun-0-' +opts_node +merge_opts +dist_nodelay +inet_dist_listen_options +inet_dist_connect_options +setopts_new_1 +setopts_on_listen +send_owner_request +setopts_new +handle_async_response +return_call +getnode +nformat +fetch +fmt_address +display_info +print_info +restart_ticker +all_atoms +reply_waiting1 +reply_waiting +multi_receive +multi_info +get_nodes_info +get_node_info +net_setuptime +connecttime +set_node +proto_error +register_error +duplicate_name +start_protos_listen +wrap_creation +next_creation +strong_rand_bytes +create_creation +sync_cookie +start_protos_no_listen +start_protos +proto_dist +proto_dist_argument +hidden_argument +dist_listen_argument +invalid_parameter_value +epmd_module +childspecs +protocol_childspecs +split_node +valid_name_head +validate_hostname +create_hostpart +hostname_not_allowed +create_name +init_node +get_proto_mod +unsupported_address_type +select_mod +setup_check +net_address +setup +spawn_func +bye +aux_ticker1 +aux_ticker +start_aux_ticker +ticker_loop +get_nodes_up_normal +disconnect_ctrlr +do_disconnect +mk_monitor_nodes_error +unknown_options +bad_option_value +check_options +option_value_mismatch +check_opt +restart_distr_do +restart_distr +delete_connection +up_nodedown +up_pending_nodedown +pending_nodedown +delete_ctrlr +delete_owner +get_conn +restarter_exit +ticker_exit +pending_own_exit +dist_ctrlr_exit +conn_own_exit +accept_exit +listen_exit +do_handle_exit +uniform +generate_node_name +ensure_node_name +transition_period_end +aux_tick +wait_pending +is_pending +inconsistency +remarked +remark +accept_pending_nok +accept_pending +inserted +registered_send +badcookie +unsupported_protocol +controller +accept_connection +name_type +static +ongoing_change_to +is_auth +change_initiated +tick_change +shorter +longer +not_implemented +no_link +up_pending +do_explicit_connect +dist_auto_connect +do_auto_connect_2 +barred_connection +do_auto_connect_1 +tick +sys_dist +ticker +clean_halt +dist_listen +make_init_opts +nodistribution +name_domain +retry_request_maybe +passive_connect_monitor +hidden_connect_node +connect_node +publish +publish_on_node +async_disconnect +ticktime_res +ticktime +get_net_ticktime +new_ticktime +set_net_ticktime +verbose +nodes_info +node_info +nodename +allowed +kernel_apply +execute_cast +'-handle_cast/2-fun-0-' +'-proxy_user/0-fun-0-' +'-start_nodes_observer/0-fun-0-' +rex_nodes_observer +'-start_nodes_observer/0-fun-1-' +'-do_srv_call/3-fun-0-' +'-eval_everywhere/4-fun-0-' +'-parallel_eval/1-lc$^0/1-0-' +'-cnode_call_group_leader_start/1-fun-0-' +cnode_call_group_leader_start +cnode_call_group_leader_state +cnode_call_group_leader_init +rex_stdout +cnode_call_group_leader_put_chars +cnode_call_group_leader_multi_request +cnode_call_group_leader_request +cnode_call_group_leader_loop +pinfo +build_args +pmap +map_nodes +parallel_eval +no_response +response +nb_yield +async_call +rec_nodes +multi_server_call +rpcmulticallify +multicall +send_nodes +eval_everywhere +rpc_check +rpc_check_t +do_srv_call +signal +exception +rpcify_exception +nodes_observer_loop +start_nodes_observer +proxy_user_flush +proxy_user_loop +rex_proxy_user +proxy_user +set_group_leader +trim_stack +is_arg_error +execute_call +features_reply +features_request +nonexisting_name +sbcast +send_stdout_to_caller +block_call +nodes_observer +could_not_start_server +'-restart_port/1-inlined-0-' +'-handle_message/2-inlined-0-' +'-handle_message/2-fun-0-' +'-restart_port/1-fun-0-' +pick_names +ndx +pick_addresses_v6 +pick_addresses_v4 +expand_default_name +return_hostent +malformed_response +inet_gethost_native_sup +wait_reply +getit +soft_restart +debug_level +gethost_poolsize +get_poolsize +gethost_extra_args +gethost_prioritize +get_extra_args +term2string +open_executable +do_open_port +get_rid +do_handle_call +restart_port +handle_message +ign_req_clients +ign_req_index +ign_requests +num_requests +rid +run_once +server_init +'-services/2-fun-0-' +'-rpc/2-fun-0-' +'-hosts/2-fun-0-' +'-resolv/2-fun-0-' +'-host_conf_linux/2-fun-0-' +'-host_conf_freebsd/2-fun-0-' +'-host_conf_bsdos/2-fun-0-' +'-nsswitch_conf/2-fun-0-' +'-protocols/2-fun-0-' +'-netmasks/2-fun-0-' +'-networks/2-fun-0-' +split_mid_comma +split_comma +split_end +split_mid +dig_to_hex +dig_to_dec +separate +ntoa_done +hex_to_int +dec16 +hex +ipv6_addr_done +ipv6_addr_scope +ipv6_addr +ipv4_field +ipv4strict_addr +strip0 +is_dom2 +is_dom_ldh +is_dom1 +port_proto +parse_cs +parse_fd +networks +netmasks +delete_options +noname +services +eafnosupport +'-setopts/2-lc$^0/1-0-' +'-getopts/2-lc$^0/1-0-' +'-do_getifaddrs/2-fun-0-' +'-net_collect_ifopts/3-lc$^0/1-0-' +'-do_getiflist/2-fun-0-' +'-net_getiflist/1-lc$^0/1-0-' +'-hwaddr_from_net_getifaddrs/1-fun-0-' +'-do_ifget/3-fun-0-' +'-do_ifget/3-fun-1-' +'-do_ifset/3-fun-0-' +'-do_ifset/3-fun-1-' +'-getif/0-fun-0-' +'-getif/1-fun-0-' +'-getif/1-fun-1-' +'-net_getif/1-fun-0-' +'-net_getif/1-fun-1-' +'-inet_getif/1-fun-0-' +'-inet_getif/1-fun-1-' +'-do_getif/2-fun-0-' +'-do_gethostname/1-fun-1-' +'-do_gethostname/1-fun-0-' +'-inet_getservbyport/2-fun-0-' +'-inet_getservbyname/2-fun-0-' +'-bindx/3-lc$^1/1-1-' +'-ii/3-fun-0-' +'-ii/3-lc$^1/1-0-' +'-ii/3-fun-2-' +'-info_lines/3-lc$^0/1-0-' +'-i_line/3-lc$^0/1-0-' +'-h_line/1-lc$^0/1-0-' +'-port_list/1-fun-0-' +ensure_sockaddr +lock_socket +udp_sync_input +tcp_sync_input +tcp_controlling_process +tcp_close +exbadseq +exbadport +port_list +sctp_sockets +udp_sockets +tcp_sockets +fmt_port +enotconn +fmt_addr +fmt_status3 +fmt_status2 +fmt_compat_status_merge +fmt_compat_status +fmt_status +which_packet_type +upper +hh_field +h_field +field2string +h_line +i_line +info_lines +smax +ii +show_ports +sent +local_address +foreign_address +i_options_all +change_bindx_0_port +set_bindx_port +open_setopts +open_opts +open_fd +gethostbyaddr_tm_native +gethostbyaddr_self +gethostbyname_string +gethostbyname_self +gethostbyname_tm_native +formerr +wins +getaddrs_tm +binary2filename +filename2binary +add_opt +sctp_opt_ifaddr +sctp_opt +sctp_opts +sctp_options +gen_udp_module +udp_module_1 +udp_add +udp_opt +gen_tcp_module +tcp_module_1 +list_add +backlog +list_opt +listen_opts +inet_default_listen_options +listen_options +con_add +ifaddr +con_opt +connect_opts +inet_default_connect_options +connect_options +stats +ipv4_mapped_ipv6_address +strict_address +parse_strict_address +ipv6strict_address +parse_ipv6strict_address +ipv4strict_address +parse_ipv4strict_address +ipv6_address +parse_ipv6_address +parse_ipv4_address +net_getservbyname +inet_getservbyname +net_getservbyport +inet_getservbyport +getaddrs +getaddr_tm +getll +is_ip_address +is_ipv6_address +is_ipv4_address +pi_replace +states +socket_to_list +gethostbyaddr_tm +nostring +gethostbyname_tm +do_gethostname +popf +pushf +inet_withsocket +esock_withsocket +withsocket +do_getif +inet_getif +net_getif +getif +do_esock_ifset2 +sifhwaddr +dstdaddr +do_esock_ifset +esock_ifset +do_ifset +hwaddr_from_net_getifaddrs +genhwaddr +use_ioctl_for_hwaddr +do_esock_ifget +esock_ifget +do_ifget +inet_getiflist +ensure_unique_names +net_getiflist +do_getiflist2 +do_getiflist +net_flag_to_inet_flag +net_flags_maybe_add_running +net_flags_to_inet_flags +addrs +net_ifs2ifopts +net_collect_ifopts +net_getifaddrs +net_unique_if_names +do_getifaddrs +udp_closed +optuniquify +udp_controlling_process +udp_close +open_bind +udp_opts +translate_ip +getaddr +getserv +bad_encoding +'-init/0-inlined-0-' +'-set_hostname/1-fun-0-' +'-load_hosts/2-fun-0-' +'-win32_load1/3-fun-0-' +'-win32_load1/3-fun-1-' +scan_inetrc +parse_inetrc_skip_line +parse_inetrc +inet_warnings +try_get_rc +inetrc +read_inetrc +valid_type +extract_cfg_files1 +extract_cfg_files +read_rc +win32_get_strings +split_line +win32_split_line +win32_load1 +change_key +nt +win32_load_from_registry +load_hosts +load_resolv +set_search_dom +inet_dns_when_nis +add_dns_lookup +host_conf_bsdos +host_conf_freebsd +host_conf_linux +nsswitch_conf +sunos +netbsd +freebsd +'bsd/os' +do_load_resolv +nonames +shortnames +sname +erl_dist_mode +gethostbyname +'-add_hosts/1-fun-0-' +'-res_cache_answer/1-lc$^0/1-0-' +'-res_filter_rrs/2-lc$^0/1-0-' +'-res_lookup_fun/1-lc$^0/1-0-' +'-res_lookup_fun/1-fun-1-' +'-handle_call/3-lc$^2/1-0-' +chars +'-do_add_host/5-lc$^0/1-0-' +'-do_add_host/5-fun-1-' +'-do_add_host/5-lc$^3/1-1-' +'-do_add_host/5-lc$^2/1-2-' +'-do_del_host/3-lc$^0/1-0-' +'-add_ip_bynms/5-fun-0-' +'-del_ip_bynms/4-fun-0-' +'-load_hosts_list/3-lc$^0/1-0-' +'-load_hosts_list/3-lc$^1/1-1-' +'-rc_opt_req/1-lc$^0/1-0-' +'-do_add_rrs/3-lc$^1/1-1-' +'-do_add_rrs/3-lc$^0/1-0-' +'-lookup_cache_data/2-lc$^0/1-0-' +'-match_rr/5-lc$^0/1-0-' +'-match_rr/5-lc$^1/1-1-' +'-lists_subtract/2-fun-0-' +handle_take_socket_type +handle_put_socket_type +lists_nth +lists_keydelete +lists_subtract +lists_delete +delete_oldest +alloc_entry +delete_expired +stop_timer +init_timer +stripdot_1 +stripdot +eq_domains +rfc_4343_lc +tolower +match_rr_dedup +match_rr +lookup_cache_data +times +do_add_rrs +is_reqname +is_res_set +set_socks_methods +rc_reqname +clear_search +clear_ns +replace_search +replace_ns +rc_opt_req +handle_calls +handle_rc_list +ets_clean_map_keys +load_hosts_list_byname +load_hosts_list_byaddr +load_hosts_list +inet_family +del_ip_bynms +add_ip_bynms +do_del_host +do_add_host +handle_update_file +handle_set_file +refresh_timeout +set_resolv_conf_tm +set_hosts_file_tm +load_hosts_file +res_hosts_file_info +res_resolv_conf_info +listreplace +reset_db +inet_sockets +inet_hosts_file_byname +inet_hosts_byname +inet_cache +inet_backend +take_socket_type +put_socket_type +lookup_socket +unregister_socket +nxdomain +ent_gethostbyaddr +res_gethostbyaddr +ptr +gethostbyaddr +cname +resolve_cnames +res_lookup_fun +res_filter_rrs +hostent +aaaa +make_hostent +dns_rec +res_hostent_by_domain +hostent_by_domain +get_searchlist +getbysearch +dots +getbyname +add_rrs +res_cache_answer +del_rr +dns_rr +add_rr +db_get +res_update +res_hosts_file_tm +res_update_hosts +res_resolv_conf_tm +res_update_conf +hostname +noproxy +methods +socks_option +res_check_search +res_check_ns +res_check_list +res_check_option_absfile +visible_string +res_check_option +res_dnssec_ok +res_recurse +resolv_conf_name +nameserver +hosts_file_name +alt_nameserver +res_optname +res_set +res_id +next_id +res_option +get_rc_hosts +get_rc_ns +get_rc_noproxy +res_alt_ns +cache_refresh_interval +res_res_dnssec_ok +res_domain +res_edns +inet_hosts_byaddr +res_hosts_file +res_inet6 +res_lookup +res_ns +res_resolv_conf +res_retry +res_search +res_servfail_retry_timeout +res_timeout +res_udp_payload_size +res_usevc +socks5_server +socks5_port +socks5_noproxy +socks5_methods +cache_size +cache_refresh +get_rc +valid_lookup +dns +nis +nisplus +yp +translate_lookup +add_rc_list +add_rc_bin +add_rc +sctp_module +set_sctp_module +udp_module +set_udp_module +tcp_module +set_tcp_module +set_cache_refresh +set_cache_size +del_socks_noproxy +add_socks_noproxy +del_socks_methods +add_socks_methods +set_socks_port +set_socks_server +inet_hosts_file_byaddr +get_hosts_file +hosts_file +set_hosts_file +resolv_conf +set_resolv_conf +dnssec_ok +set_dnssec_ok +udp_payload_size +set_udp_payload_size +edns +set_edns +usevc +set_usevc +set_inet6 +servfail_retry_timeout +set_servfail_retry_timeout +retry +set_retry +set_timeout +recurse +set_recurse +set_lookup +set_domain +set_hostname +del_search +ins_search +add_search +del_alt_ns +ins_alt_ns +alt_nameservers +add_alt_ns +del_ns +ins +ins_ns +nameservers +listop +add_ns +clear_hosts +del_host +add_host +add_hosts +resolv +add_resolv +badcall +format_child_log_error_single +format_child_log_progress_single +terminate_pid +no_stderror +standard_error_sup +'-start_port/1-fun-0-' +'-do_setopts/1-fun-0-' +'-wrap_characters_to_binary/3-lc$^0/1-0-' +wrap_characters_to_binary +send_port +put_port +io_requests +rows +columns +get_geometry +do_io_request +get_fd_geometry +log_io_request +onlcr +server +start_port +beam_ssa +v3_core +beam_call_types +beam_trim +core_pp +sys_core_fold_lists +beam_a +beam_ssa_ss +sys_core_bsm +sys_messages +sys_core_inline +beam_ssa_alias +cerl_inline +beam_opcodes +beam_utils +beam_jump +core_lib +cerl +beam_ssa_lint +rec_env +beam_ssa_dead +erl_bifs +sys_coverage +beam_ssa_destructive_update +beam_block +beam_asm +beam_ssa_pp +beam_ssa_bc_size +beam_listing +beam_bounds +beam_validator +beam_ssa_check +sys_pre_attributes +beam_ssa_opt +beam_ssa_codegen +beam_core_to_ssa +core_lint +beam_ssa_bsm +core_parse +beam_dict +cerl_trees +beam_ssa_bool +beam_flatten +beam_doc +sys_core_fold +beam_disasm +beam_clean +beam_ssa_share +beam_ssa_recv +beam_types +cerl_clauses +beam_ssa_type +beam_ssa_throw +sys_core_alias +beam_ssa_pre_codegen +beam_z +sys_core_prepare +beam_digraph +core_scan +rejected_ftr +permanent_ftr +until +while +experimental_ftr_2 +ifn +experimental_ftr_1 +unless +approved_ftr_2 +approved_ftr_1 +init_done +maybe_expr +'-init_features/0-inlined-3-' +'-init_features/0-inlined-2-' +'-configurable/0-lc$^0/1-0-' +'-long/1-lc$^0/1-0-' +'-long/1-lc$^1/1-1-' +'-history/2-fun-0-' +'-history/2-fun-1-' +'-nqTeX/1-fun-0-' +'-keyword_fun/2-fun-0-' +'-add_feature_fun/2-fun-0-' +'-remove_feature_fun/2-fun-0-' +'-feature_error/1-fun-0-' +'-feature_error/1-fun-1-' +'-format_error/1-F/1-0-' +'-init_features/0-fun-0-' +'enable-feature' +'disable-feature' +'-init_features/0-fun-1-' +'-init_features/0-fun-2-' +'-init_features/0-fun-3-' +'-init_features/0-fun-4-' +'-init_features/0-fun-5-' +'-collect_features/1-lc$^0/1-0-' +test_features +add_ftr +feature +collect_features +features_in +set_keywords +enabled_features +ensure_init +init_specs +init_features +incorrect_features +feature_error +configurable_features +remove_features_fun +add_features_fun +remove_feature_fun +add_feature_fun +invalid_features +not_configurable +enable +disable +keyword_fun +invalid_feature +adjust +nqTeX +rejected +experimental +approved +history +long +is_configurable +is_valid +feature_specs +'-characters_to_binary_int/3-fun-0-' +'-i_trans/1-fun-0-' +'-i_trans_chk/1-fun-0-' +'-o_trans/1-fun-7-' +'-o_trans/1-fun-8-' +'-o_trans/1-fun-3-' +'-o_trans/1-fun-4-' +'-o_trans/1-fun-1-' +'-o_trans/1-fun-2-' +'-o_trans/1-fun-0-' +'-o_trans/1-fun-9-' +'-o_trans/1-fun-10-' +'-o_trans/1-fun-5-' +'-o_trans/1-fun-6-' +error_type +do_i_utf32_little +do_i_utf32_big +do_i_utf16_little +do_i_utf16_big +do_i_utf8 +do_i_utf32_little_chk +do_i_utf32_big_chk +do_i_utf16_little_chk +do_i_utf16_big_chk +do_i_utf8_chk +do_o_binary2 +do_o_binary +o_trans +i_trans_chk +i_trans +ml_map +fake_stacktrace +do_characters_to_list +prepend_row_to_acc +acc_to_binary +characters_to_nfkc_binary +nfkc +characters_to_nfkc_list +characters_to_nfc_binary +nfc +characters_to_nfkd_binary +nfkd +characters_to_nfkd_list +characters_to_nfd_binary +nfd +characters_to_nfd_list +encoding_to_bom +bom_to_encoding +no_conversion_needed +take_1 +take_any +from_orddict +enter +update_1 +get_1 +is_defined_1 +lookup_1 +fold_1 +is_set +is_subset_2 +is_subset_1 +is_subset +difference_2 +difference_1 +difference +is_disjoint_1 +is_disjoint +intersection_list +intersection_2 +intersection_1 +union_list +balance_revlist_1 +balance_revlist +push +union_2 +union_1 +mk_set +iterator_from_r +iterator_from_1 +iterator_from +iterator_r +iterator_1 +reversed +ordered +to_list_1 +larger_1 +larger +found +smaller_1 +smaller +largest_1 +largest +take_largest1 +take_largest +smallest_1 +smallest +take_smallest1 +take_smallest +delete_1 +delete_any +del_element +from_ordset +balance_list_1 +balance_list +balance +key_exists +insert_1 +is_member_1 +singleton +is_equal_1 +is_equal +nonono +'-replace/4-fun-0-' +'-replace/4-fun-2-' +'-replace/4-fun-1-' +'-encode_hex1/2-lbc$^0/2-0-' +'-decode_hex1/1-lbc$^0/2-0-' +decode_hex2 +decode_hex1 +decode_hex +encode_hex2 +encode_hex1 +uppercase +encode_hex +insert_replaced +get_opts_replace +splitat +do_replace +bin_to_list +no_debug_info +'-md5/1-lc$^0/1-0-' +'-diff_directories/2-fun-0-' +'-beam_files/1-lc$^0/1-0-' +'-strip_fils/2-lc$^0/1-0-' +'-read_all_but_useless_chunks/1-lc$^0/1-0-' +'-read_all_chunks/1-lc$^0/1-0-' +'-scan_beam/4-lc$^0/1-0-' +'-attributes/2-fun-0-' +'-attributes/2-lc$^1/1-0-' +'-anno_from_forms/1-lc$^0/1-0-' +'-try_load_crypto_fun/1-fun-0-' +'-try_load_crypto_fun/1-fun-1-' +alt_lookup_key +try_load_crypto_fun +f_p_s +crypto_key_fun_from_file_1 +crypto_key_fun_from_file +call_crypto_server_1 +beam_lib__crypto_key_server +call_crypto_server +get_crypto_key +start_crypto +restore_typed_record_fields +anno_from_forms +abstract_v2 +abstract_v1 +old_anno_from_term +crypto_one_time +crypto +des_ede3_cbc +decrypt_chunk +mandatory_chunks +md5_chunks +significant_chunks +assert_directory +maybe_uncompress +beam_filename +read_all +bb +extract_atom +extract_atoms +ensure_atoms +symbol +symbols1 +symbols +locals +labeled_locals +labeled_exports +indexed_imports +imports +chunk_name_to_id +documentation +compile_info +chunk_to_data +erlang_v1 +debug_info_v1 +atom_chunk +abst_chunk +chunks_to_data +del_chunk +get_atom_data +scan_beam2 +scan_beam1 +scan_beam +atoms +check_chunks +beam_symbols +allow_missing_chunks +read_chunk_data +read_all_chunks +filter_funtab_1 +filter_funtab +filter_significant_chunks +read_significant_chunks +is_useless_chunk +read_all_but_useless_chunks +build_chunks +strip_file +strip_fils +strip_rel +cmp_lists +cmp_files +wildcard +beam_files +compare_files +restriction +image +symmetric_partition +compare_dirs +diff_only +diff_directories +read_info +build_module +des3_cbc +make_crypto_key +clear_crypto_key_fun +crypto_key_fun +exists +different_chunks +not_a_directory +not_a_beam_file +chunks_different +unknown_chunk +modules_different +missing_backend +key_missing_or_invalid +invalid_chunk +invalid_beam_file +chunk_too_big +strip_release +strip_files +strip +diff_dirs +cmp_dirs +cmp +all_chunks +ignored +cannot_detach_with_standard_io +'-init/1-fun-0-' +'-handle_call/3-lc$^1/1-1-' +'-verify_args/1-lc$^0/1-0-' +'-verify_args/1-lc$^1/1-1-' +'-encode_port_data/1-lbc$^0/2-0-' +'-maybe_listen/1-lc$^0/1-0-' +'-maybe_listen/1-lc$^1/1-1-' +ntoa +'-command_line/2-lc$^0/1-0-' +'-parse_args/1-lc$^0/1-0-' +'-start_peer_channel_handler/0-fun-3-' +'-start_peer_channel_handler/0-lc$^5/1-2-' +'-start_peer_channel_handler/0-fun-4-' +parse_address +'-start_peer_channel_handler/0-lc$^0/1-0-' +'-start_peer_channel_handler/0-fun-1-' +'-start_peer_channel_handler/0-lc$^2/1-1-' +'-handle_peer_alternative/3-fun-0-' +'-do_call/4-fun-0-' +handle_port_alternative +handle_peer_alternative +io_server_loop +loop_connect +tcp_init +io_server +origin_link +relay +peer_detached +start_peer_channel_handler +peer_channel_terminated +loop_supervision +peer_supervision_connect_timeout +peer_sup_connect_channel +peer_channel_connect_timeout +peer_sup_state +channel_connect +peer_supervision +start_orphan_supervision +init_supervision +start_supervision +notify_started +default_erts +unquote +parse_args +maybe_otp_test_suite +encode_to_string +command_line +longnames +name_arg +prefer_localhost +maybe_listen +boot_complete +handle_port_binary +decode_port_data +encode_port_data +peer_to_origin +origin_to_peer +forward_request +handle_alternative_data +peer_down +maybe_stop +node_name +boot_failed +wait_boot +make_notify_ref +invalid_arg +not_alive +detached +char_list +exec +verify_args +force_disconnect_node +wait_disconnected +deadline +register_socket +get_node +cover +booting +peer_state +connection +post_process_args +get_state +random_name +'-getenv/0-lc$^0/1-0-' +flush_exit +flush_until_down +get_data +validate3 +validate2 +validate1 +os_cmd_shell +kernel_os_cmd_shell +mk_cmd +get_option +max_size +do_cmd +cmd +extensions +reverse_element +split_path +can_be_full_name +lowercase +verify_executable +find_executable1 +find_executable +'-compact/1-lc$^0/1-0-' +'-substitute_aliases/2-lc$^0/1-0-' +'-substitute_negations/2-lc$^0/1-0-' +'-expand/2-lc$^0/1-0-' +'-split/2-lc$^0/1-0-' +'-split/2-lc$^1/1-1-' +'-to_map/1-fun-0-' +from_map +to_map +negations +aliases +apply_stages +key_uniq_1 +key_uniq +expand_3 +expand_2 +expand_1 +expand_0 +expand +substitute_negations_1 +substitute_aliases_1 +substitute_aliases +get_bool +append_values +get_all_values +lookup_all +property +lait +liat +daeh +snoc +tail +delete_with_rear +delete_with_front +delete_with_r +delete_with +delete_rear +delete_front +delete_r +filtermap_r +filter_r +filter_f +split_r1_to_f2 +split_f1_to_r2 +drop_r +peek_r +get_r +out_r +in_r +is_empty +is_queue +'-set_restart_flag/1-fun-0-' +reply_return +noreply_return +'$no_default_return' +try_callback_call +maybe_notify_mode_change +set_mode +overload_levels_ok +flush_load +kill_if_choked +limit_burst +do_self_memory +maybe_self_memory +check_load +reset_restart_flag +set_restart_flag +overload_kill_qlen +overload_kill_mem_size +overload_kill_enable +burst_limit_window_time +burst_limit_max_count +do_check_opts +invalid_olp_levels +invalid_olp_config +check_opts +do_load +apply_after +overload_kill_restart_after +reset_state +mode_ref +last_qlen +last_load_ts +cb_state +burst_win_ts +burst_msg_count +olp_ref +result +restart_failed +get_opts +'$olp_load' +log_failed +try_log +flushed +drop +mode_change +overloaded +handle_load +get_ref +system_logger +sync_mode_qlen +flush_qlen +drop_mode_qlen +burst_limit_enable +get_default_opts +child_spec +no_state +get_pid +'-build_typed_attribute/2-fun-0-' +'-build_typed_attribute/2-fun-1-' +equiv +'-build_attribute/2-fun-0-' +'-attribute_farity_list/1-lc$^0/1-0-' +'-attribute_farity_map/1-lc$^0/1-0-' +'-check_clauses/3-lc$^0/1-0-' +'-first_anno/1-fun-0-' +'-last_anno/1-fun-0-' +'-enc_func/1-fun-2-' +'-enc_func/1-fun-1-' +'-enc_func/1-fun-0-' +'-abstract/3-lc$^0/1-0-' +'-abstract_map_fields/3-lc$^0/1-0-' +'-map_anno/2-fun-0-' +'-fold_anno/3-fun-0-' +'-new_anno/1-fun-0-' +'-anno_to_term/1-fun-0-' +from_term +'-anno_from_term/1-fun-0-' +yeccgoto_typed_record_fields +yeccgoto_typed_exprs +yeccgoto_typed_expr +yeccgoto_typed_attr_val +yeccgoto_type_spec +yeccgoto_type_sigs +yeccgoto_type_sig +yeccgoto_type_guards +yeccgoto_type_guard +yeccgoto_type +yeccgoto_tuple +yeccgoto_try_opt_stacktrace +yeccgoto_try_expr +yeccgoto_try_clauses +yeccgoto_try_clause +yeccgoto_try_catch +yeccgoto_top_types +yeccgoto_top_type +yeccgoto_tail +yeccgoto_strings +yeccgoto_ssa_check_when_clauses +yeccgoto_ssa_check_when_clause +yeccgoto_ssa_check_pats +yeccgoto_ssa_check_pat +yeccgoto_ssa_check_map_key_tuple_elements +yeccgoto_ssa_check_map_key_list +yeccgoto_ssa_check_map_key_elements +yeccgoto_ssa_check_map_key_element +yeccgoto_ssa_check_map_key +yeccgoto_ssa_check_list_lit_ls +yeccgoto_ssa_check_list_lit +yeccgoto_ssa_check_fun_ref +yeccgoto_ssa_check_exprs +yeccgoto_ssa_check_expr +yeccgoto_ssa_check_clause_args_ls +yeccgoto_ssa_check_clause_args +yeccgoto_ssa_check_binary_lit_rest +yeccgoto_ssa_check_binary_lit_bytes_ls +yeccgoto_ssa_check_binary_lit +yeccgoto_ssa_check_args +yeccgoto_ssa_check_anno_clauses +yeccgoto_ssa_check_anno_clause +yeccgoto_ssa_check_anno +yeccgoto_spec_fun +yeccgoto_sigil +yeccgoto_record_tuple +yeccgoto_record_pat_expr +yeccgoto_record_fields +yeccgoto_record_field +yeccgoto_record_expr +yeccgoto_receive_expr +yeccgoto_prefix_op +yeccgoto_pat_exprs +yeccgoto_pat_expr_max +yeccgoto_pat_expr +yeccgoto_pat_argument_list +yeccgoto_opt_bit_type_list +yeccgoto_opt_bit_size_expr +yeccgoto_mult_op +yeccgoto_maybe_match_exprs +yeccgoto_maybe_match +yeccgoto_maybe_expr +yeccgoto_map_tuple +yeccgoto_map_pat_expr +yeccgoto_map_pair_types +yeccgoto_map_pair_type +yeccgoto_map_key +yeccgoto_map_fields +yeccgoto_map_field_exact +yeccgoto_map_field_assoc +yeccgoto_map_field +yeccgoto_map_expr +yeccgoto_map_comprehension +yeccgoto_list_op +yeccgoto_list_comprehension +yeccgoto_list +yeccgoto_lc_exprs +yeccgoto_lc_expr +yeccgoto_integer_or_var +yeccgoto_if_expr +yeccgoto_if_clauses +yeccgoto_if_clause +yeccgoto_guard +yeccgoto_function_clauses +yeccgoto_function_clause +yeccgoto_function_call +yeccgoto_function +yeccgoto_fun_type +yeccgoto_fun_expr +yeccgoto_fun_clauses +yeccgoto_fun_clause +yeccgoto_form +yeccgoto_field_types +yeccgoto_field_type +yeccgoto_exprs +yeccgoto_expr_remote +yeccgoto_expr_max +yeccgoto_expr +yeccgoto_cr_clauses +yeccgoto_cr_clause +yeccgoto_comp_op +yeccgoto_clause_guard +yeccgoto_clause_body_exprs +yeccgoto_clause_body +yeccgoto_clause_args +yeccgoto_case_expr +yeccgoto_bit_type_list +yeccgoto_bit_type +yeccgoto_bit_size_expr +yeccgoto_bit_expr +yeccgoto_binary_type +yeccgoto_binary_comprehension +yeccgoto_binary +yeccgoto_bin_unit_type +yeccgoto_bin_elements +yeccgoto_bin_element +yeccgoto_bin_base_type +yeccgoto_attribute +yeccgoto_attr_val +yeccgoto_atomic +yeccgoto_atom_or_var +yeccgoto_argument_list +yeccgoto_add_op +yeccpars2_686 +yeccpars2_685 +yeccpars2_684 +yeccpars2_683 +yeccpars2_682 +yeccpars2_680 +yeccpars2_679 +yeccpars2_678 +yeccpars2_677 +yeccpars2_676 +yeccpars2_674 +yeccpars2_673 +yeccpars2_670 +yeccpars2_669 +yeccpars2_668 +yeccpars2_666 +yeccpars2_665 +yeccpars2_664 +yeccpars2_662 +yeccpars2_661 +yeccpars2_660 +yeccpars2_658 +yeccpars2_657 +yeccpars2_656 +yeccpars2_655 +yeccpars2_654 +yeccpars2_653 +yeccpars2_652 +yeccpars2_650 +yeccpars2_648 +yeccpars2_647 +yeccpars2_645 +yeccpars2_643 +yeccpars2_642 +yeccpars2_641 +yeccpars2_640 +yeccpars2_639 +yeccpars2_638 +yeccpars2_636 +yeccpars2_634 +yeccpars2_633 +yeccpars2_631 +yeccpars2_630 +yeccpars2_629 +yeccpars2_628 +yeccpars2_627 +yeccpars2_625 +yeccpars2_624 +yeccpars2_623 +yeccpars2_622 +yeccpars2_621 +yeccpars2_620 +yeccpars2_619 +yeccpars2_616 +yeccpars2_615 +yeccpars2_613 +yeccpars2_612 +yeccpars2_611 +yeccpars2_610 +yeccpars2_609 +yeccpars2_608 +yeccpars2_607 +yeccpars2_606 +yeccpars2_605 +yeccpars2_603 +yeccpars2_601 +yeccpars2_600 +yeccpars2_599 +yeccpars2_598 +yeccpars2_597 +yeccpars2_596 +yeccpars2_595 +yeccpars2_594 +yeccpars2_593 +yeccpars2_592 +yeccpars2_591 +yeccpars2_590 +yeccpars2_586 +yeccpars2_585 +yeccpars2_583 +yeccpars2_582 +yeccpars2_581 +yeccpars2_580 +yeccpars2_579 +yeccpars2_578 +yeccpars2_577 +nonempty_list +yeccpars2_576 +yeccpars2_575 +yeccpars2_574 +yeccpars2_573 +yeccpars2_572 +yeccpars2_571 +yeccpars2_570 +yeccpars2_569 +yeccpars2_568 +yeccpars2_567 +yeccpars2_566 +yeccpars2_565 +yeccpars2_564 +yeccpars2_563 +yeccpars2_562 +yeccpars2_561 +yeccpars2_560 +yeccpars2_559 +yeccpars2_558 +yeccpars2_557 +yeccpars2_556 +yeccpars2_554 +yeccpars2_553 +yeccpars2_552 +yeccpars2_551 +yeccpars2_550 +yeccpars2_549 +yeccpars2_548 +yeccpars2_547 +yeccpars2_546 +yeccpars2_545 +yeccpars2_544 +yeccpars2_543 +yeccpars2_542 +yeccpars2_541 +yeccpars2_540 +yeccpars2_539 +yeccpars2_538 +yeccpars2_537 +yeccpars2_536 +yeccpars2_535 +yeccpars2_cont_534 +yeccpars2_534 +yeccpars2_533 +yeccpars2_532 +yeccpars2_531 +yeccpars2_529 +yeccpars2_528 +yeccpars2_527 +yeccpars2_526 +yeccpars2_525 +yeccpars2_524 +yeccpars2_522 +yeccpars2_521 +yeccpars2_520 +yeccpars2_518 +yeccpars2_517 +yeccpars2_516 +yeccpars2_514 +yeccpars2_513 +yeccpars2_512 +yeccpars2_511 +yeccpars2_510 +yeccpars2_509 +yeccpars2_508 +yeccpars2_506 +sigil_suffix +yeccpars2_505 +yeccpars2_504 +yeccpars2_503 +yeccpars2_502 +yeccpars2_501 +yeccpars2_500 +yeccpars2_499 +yeccpars2_498 +yeccpars2_497 +yeccpars2_496 +yeccpars2_495 +yeccpars2_494 +yeccpars2_493 +yeccpars2_492 +yeccpars2_491 +yeccpars2_490 +yeccpars2_489 +yeccpars2_488 +yeccpars2_487 +yeccpars2_485 +yeccpars2_484 +yeccpars2_483 +yeccpars2_481 +yeccpars2_480 +yeccpars2_478 +yeccpars2_477 +yeccpars2_476 +yeccpars2_475 +yeccpars2_474 +yeccpars2_472 +yeccpars2_470 +yeccpars2_469 +yeccpars2_468 +yeccpars2_467 +yeccpars2_466 +yeccpars2_465 +yeccpars2_464 +yeccpars2_463 +yeccpars2_462 +yeccpars2_461 +yeccpars2_460 +yeccpars2_458 +yeccpars2_457 +yeccpars2_456 +yeccpars2_455 +yeccpars2_454 +yeccpars2_453 +yeccpars2_452 +yeccpars2_451 +yeccpars2_450 +yeccpars2_449 +yeccpars2_448 +yeccpars2_447 +yeccpars2_446 +yeccpars2_445 +yeccpars2_443 +yeccpars2_441 +yeccpars2_440 +yeccpars2_439 +yeccpars2_438 +yeccpars2_437 +yeccpars2_436 +yeccpars2_435 +yeccpars2_434 +yeccpars2_433 +yeccpars2_431 +yeccpars2_430 +yeccpars2_429 +yeccpars2_428 +yeccpars2_427 +yeccpars2_426 +yeccpars2_424 +yeccpars2_423 +yeccpars2_421 +yeccpars2_420 +yeccpars2_419 +yeccpars2_417 +yeccpars2_416 +yeccpars2_415 +yeccpars2_414 +yeccpars2_413 +yeccpars2_412 +yeccpars2_411 +yeccpars2_410 +yeccpars2_409 +yeccpars2_408 +yeccpars2_407 +yeccpars2_406 +yeccpars2_404 +yeccpars2_402 +yeccpars2_401 +yeccpars2_399 +yeccpars2_397 +'<=' +yeccpars2_395 +yeccpars2_394 +yeccpars2_393 +yeccpars2_392 +yeccpars2_391 +yeccpars2_390 +yeccpars2_387 +yeccpars2_385 +yeccpars2_384 +yeccpars2_383 +yeccpars2_382 +yeccpars2_381 +yeccpars2_380 +yeccpars2_379 +yeccpars2_377 +yeccpars2_376 +yeccpars2_375 +yeccpars2_373 +yeccpars2_371 +yeccpars2_370 +yeccpars2_369 +yeccpars2_368 +yeccpars2_367 +yeccpars2_366 +yeccpars2_365 +yeccpars2_364 +yeccpars2_363 +yeccpars2_362 +yeccpars2_361 +yeccpars2_360 +yeccpars2_359 +yeccpars2_357 +yeccpars2_356 +yeccpars2_355 +yeccpars2_354 +yeccpars2_353 +yeccpars2_352 +yeccpars2_351 +yeccpars2_350 +yeccpars2_349 +yeccpars2_347 +yeccpars2_345 +yeccpars2_344 +yeccpars2_343 +yeccpars2_342 +yeccpars2_341 +yeccpars2_339 +yeccpars2_337 +yeccpars2_336 +yeccpars2_333 +yeccpars2_332 +yeccpars2_331 +yeccpars2_330 +yeccpars2_329 +yeccpars2_327 +yeccpars2_325 +yeccpars2_324 +yeccpars2_cont_323 +yeccpars2_323 +yeccpars2_321 +yeccpars2_320 +yeccpars2_319 +yeccpars2_318 +yeccpars2_317 +yeccpars2_316 +yeccpars2_314 +yeccpars2_312 +yeccpars2_310 +yeccpars2_308 +yeccpars2_307 +yeccpars2_305 +yeccpars2_303 +yeccpars2_302 +yeccpars2_301 +yeccpars2_300 +yeccpars2_299 +yeccpars2_298 +yeccpars2_296 +yeccpars2_291 +yeccpars2_290 +yeccpars2_288 +yeccpars2_287 +yeccpars2_286 +yeccpars2_285 +yeccpars2_284 +yeccpars2_283 +yeccpars2_282 +'||' +end +'?=' +'<-' +':=' +yeccpars2_281 +yeccpars2_280 +yeccpars2_279 +pass +yeccpars2_278 +yeccpars2_277 +yeccpars2_275 +yeccpars2_274 +yeccpars2_273 +yeccpars2_272 +yeccpars2_271 +yeccpars2_270 +yeccpars2_269 +yeccpars2_268 +yeccpars2_267 +yeccpars2_266 +yeccpars2_265 +yeccpars2_264 +yeccpars2_263 +yeccpars2_261 +yeccpars2_260 +yeccpars2_259 +yeccpars2_257 +yeccpars2_255 +yeccpars2_254 +yeccpars2_253 +yeccpars2_252 +yeccpars2_250 +yeccpars2_249 +yeccpars2_248 +yeccpars2_247 +yeccpars2_246 +yeccpars2_245 +yeccpars2_244 +yeccpars2_243 +yeccpars2_242 +yeccpars2_241 +yeccpars2_239 +yeccpars2_237 +yeccpars2_236 +yeccpars2_235 +yeccpars2_234 +yeccpars2_233 +yeccpars2_232 +yeccpars2_231 +yeccpars2_228 +yeccpars2_227 +yeccpars2_226 +yeccpars2_225 +yeccpars2_224 +yeccpars2_223 +yeccpars2_222 +yeccpars2_221 +yeccpars2_220 +yeccpars2_219 +yeccpars2_218 +yeccpars2_217 +yeccpars2_216 +yeccpars2_215 +yeccpars2_214 +yeccpars2_213 +yeccpars2_212 +yeccpars2_211 +yeccpars2_210 +yeccpars2_209 +yeccpars2_208 +yeccpars2_cont_207 +yeccpars2_207 +yeccpars2_206 +yeccpars2_205 +yeccpars2_204 +yeccpars2_203 +yeccpars2_202 +yeccpars2_201 +yeccpars2_200 +yeccpars2_199 +yeccpars2_198 +yeccpars2_197 +yeccpars2_196 +yeccpars2_195 +yeccpars2_194 +yeccpars2_193 +yeccpars2_192 +yeccpars2_191 +yeccpars2_190 +yeccpars2_189 +yeccpars2_188 +yeccpars2_187 +yeccpars2_186 +float_epsilon +yeccpars2_185 +yeccpars2_184 +yeccpars2_183 +local_fun +yeccpars2_182 +external_fun +yeccpars2_181 +yeccpars2_180 +yeccpars2_179 +yeccpars2_178 +yeccpars2_177 +yeccpars2_176 +yeccpars2_175 +yeccpars2_174 +yeccpars2_173 +yeccpars2_172 +yeccpars2_171 +yeccpars2_170 +yeccpars2_169 +yeccpars2_168 +yeccpars2_167 +yeccpars2_166 +yeccpars2_165 +yeccpars2_164 +yeccpars2_163 +yeccpars2_162 +yeccpars2_161 +yeccpars2_160 +yeccpars2_159 +yeccpars2_158 +yeccpars2_157 +yeccpars2_156 +yeccpars2_155 +yeccpars2_154 +yeccpars2_153 +yeccpars2_152 +yeccpars2_cont_151 +yeccpars2_151 +yeccpars2_150 +yeccpars2_149 +yeccpars2_148 +yeccpars2_147 +yeccpars2_146 +yeccpars2_145 +yeccpars2_144 +yeccpars2_143 +yeccpars2_142 +yeccpars2_141 +yeccpars2_140 +yeccpars2_139 +'...' +yeccpars2_138 +yeccpars2_137 +yeccpars2_136 +yeccpars2_135 +yeccpars2_134 +yeccpars2_133 +'%ssa%' +yeccpars2_131 +yeccpars2_130 +yeccpars2_129 +yeccpars2_128 +yeccpars2_127 +yeccpars2_126 +yeccpars2_125 +yeccpars2_124 +yeccpars2_122 +yeccpars2_121 +yeccpars2_120 +yeccpars2_118 +yeccpars2_116 +yeccpars2_115 +yeccpars2_114 +yeccpars2_113 +yeccpars2_112 +yeccpars2_111 +yeccpars2_110 +yeccpars2_108 +yeccpars2_107 +yeccpars2_106 +yeccpars2_105 +yeccpars2_104 +yeccpars2_103 +yeccpars2_102 +yeccpars2_100 +yeccpars2_99 +yeccpars2_98 +yeccpars2_97 +yeccpars2_96 +yeccpars2_95 +yeccpars2_94 +yeccpars2_93 +yeccpars2_90 +yeccpars2_86 +yeccpars2_85 +yeccpars2_83 +yeccpars2_82 +yeccpars2_81 +yeccpars2_79 +yeccpars2_77 +of +yeccpars2_76 +yeccpars2_75 +yeccpars2_74 +after +yeccpars2_72 +yeccpars2_69 +yeccpars2_62 +yeccpars2_61 +yeccpars2_60 +yeccpars2_59 +yeccpars2_58 +yeccpars2_57 +yeccpars2_56 +yeccpars2_55 +yeccpars2_54 +yeccpars2_53 +yeccpars2_52 +yeccpars2_51 +yeccpars2_50 +yeccpars2_49 +yeccpars2_48 +yeccpars2_47 +yeccpars2_46 +yeccpars2_45 +yeccpars2_44 +yeccpars2_43 +yeccpars2_42 +yeccpars2_41 +yeccpars2_40 +yeccpars2_39 +yeccpars2_38 +yeccpars2_37 +yeccpars2_36 +yeccpars2_35 +yeccpars2_34 +yeccpars2_33 +yeccpars2_32 +yeccpars2_31 +yeccpars2_30 +yeccpars2_29 +begin +yeccpars2_cont_28 +'>>' +yeccpars2_28 +yeccpars2_27 +yeccpars2_26 +yeccpars2_25 +yeccpars2_23 +yeccpars2_22 +yeccpars2_21 +yeccpars2_20 +yeccpars2_19 +yeccpars2_18 +yeccpars2_17 +yeccpars2_16 +yeccpars2_15 +yeccpars2_14 +yeccpars2_13 +yeccpars2_12 +yeccpars2_11 +sigil_prefix +yeccpars2_cont_10 +'<<' +yeccpars2_10 +when +yeccpars2_9 +yeccpars2_8 +yeccpars2_7 +yeccpars2_6 +yeccpars2_5 +yeccpars2_4 +yeccpars2_3 +';' +yeccpars2_2 +yeccpars2_1 +yeccpars2_0 +missing_state_in_action_table +yeccpars2 +write_char +write_string +reserved_symbol +yecctoken2string1 +yecctoken2string +yecctoken_location +yecctoken_to_string +yeccerror +yecctoken_end_location +yecc_end +'$end' +no_func +yeccpars1 +state_is_unknown +missing_in_goto_table +yecc_error_type +yecc_bug +yeccpars0 +return_error +deep_char_list +no_location +parse_and_scan +parse +check_expr +add_anno_check +build_ssa_check_label +modify_anno1 +anno_from_term +new_anno +mapfold_anno +fold_anno +type_preop_prec +'::' +'..' +type_inop_prec +max_prec +func_prec +preop_prec +'=' +inop_prec +tokens_tuple +'|' +',' +tokens_tail +']' +'}' +'{' +'[' +'=>' +abstract_byte +abstract_map_fields +abstract_tuple_list +not_string +abstract_list +enc_func +abstract +loc_lte +find_anno +set_location +end_location +last_anno +first_location +ret_abstr_err +ret_err +s +b +'S' +'B' +build_sigil +build_try +check_clauses +build_fun +build_function +typed +record_fields +record_tuple +farity_list +error_bad_decl +attribute_farity_map +attribute_farity_list +attribute_farity +var_list +build_attribute +abstract2 +type_tag +build_bin_type +build_gen_type +lift_unions +build_constraint +is_subtype +build_compat_constraint +find_arity_from_specs +build_type_spec +typed_record +build_typed_attribute +'(' +')' +'->' +parse_form +':' +badexpr +binary_comprehension +bitlevel_binaries +'-merge_bindings/4-inlined-0-' +'-match_fun/2-inlined-0-' +'-expr/6-RF/20-23-' +'-expr/6-RF/19-22-' +'-expr/6-RF/18-21-' +'-expr/6-RF/17-20-' +'-expr/6-RF/16-19-' +'-expr/6-RF/15-18-' +'-expr/6-RF/14-17-' +'-expr/6-RF/13-16-' +'-expr/6-RF/12-15-' +'-expr/6-RF/11-14-' +'-expr/6-RF/10-13-' +'-expr/6-RF/9-12-' +'-expr/6-RF/8-11-' +'-expr/6-RF/7-10-' +'-expr/6-RF/6-9-' +'-expr/6-RF/5-8-' +'-expr/6-RF/4-7-' +'-expr/6-RF/3-6-' +'-expr/6-RF/2-5-' +'-expr/6-RF/1-4-' +'-expr/6-RF/0-3-' +'-expr/6-fun-0-' +'-expr/6-fun-45-' +'-expr/6-fun-46-' +'-expr/6-fun-23-' +'-expr/6-fun-22-' +'-expr/6-fun-21-' +'-expr/6-fun-20-' +'-expr/6-fun-19-' +'-expr/6-fun-18-' +'-expr/6-fun-17-' +'-expr/6-fun-16-' +'-expr/6-fun-15-' +'-expr/6-fun-14-' +'-expr/6-fun-13-' +'-expr/6-fun-12-' +'-expr/6-fun-11-' +'-expr/6-fun-10-' +'-expr/6-fun-9-' +'-expr/6-fun-8-' +'-expr/6-fun-7-' +'-expr/6-fun-6-' +'-expr/6-fun-5-' +'-expr/6-fun-4-' +'-expr/6-fun-3-' +'-expr/6-lc$^2/1-1-' +'-expr/6-fun-1-' +is_anno +'-find_maxline/1-fun-0-' +'-fun_used_bindings/4-fun-0-' +'-local_func/8-fun-0-' +'-eval_lc1/7-fun-1-' +'-eval_lc1/7-fun-0-' +'-eval_bc1/7-fun-1-' +'-eval_bc1/7-fun-0-' +'-eval_mc1/7-fun-1-' +'-eval_mc1/7-fun-0-' +'-eval_generator/7-fun-0-' +'-eval_b_generate/8-fun-0-' +'-eval_b_generate/8-fun-1-' +'-receive_clauses/8-fun-0-' +'-match1/5-fun-0-' +'-match1/5-fun-1-' +'-match_fun/2-fun-0-' +'-add_bindings/2-fun-0-' +'-merge_bindings/4-fun-0-' +'-merge_bindings/4-fun-1-' +'-to_terms/1-lc$^0/1-0-' +'-token_fixup/1-lc$^0/1-0-' +'-reset_token_anno/1-lc$^0/1-0-' +'-reset_expr_anno/1-lc$^0/1-0-' +'-reset_anno/0-fun-0-' +'-normalise/1-fun-1-' +'-normalise/1-fun-0-' +'-ev_expr/1-lc$^0/1-0-' +anno +all_white +eval_str +ev_expr +eval_expr +is_constant_expr +normalise_list +normalise +extended_parse_term +validate_tag +fixup_mfa +fixup_tag +fixup_text +fixup_ast +reset_anno +reset_expr_anno +reset_token_anno +string_fixup +expr_fixup +'Ref' +'Port' +'Fun' +'.' +'#' +unscannable +set_text +token_fixup +tokens_fixup +extended_parse_exprs +anno_to_term +to_term +to_terms +filter_bindings +merge_bindings +add_bindings +del_binding +add_binding +binding +bindings +match_list +match_map +match_tuple +match_fun +match_bits +match1 +string_to_conses +reference +number +expr_guard_test +guard_expr +guard0 +guard1 +match_clause +receive_clauses +case_clauses +illegal_stacktrace_variable +check_stacktrace_vars +if_clauses +eval_op +eval_named_fun +'-inside-an-interpreted-fun-' +eval_fun +ret_expr +map_assoc +map_exact +eval_map_fields +is_generator +eval_filter +eval_m_generate +bin_gen +eval_b_generate +eval_generate +eval_generator +eval_mc1 +eval_mc +eval_bc1 +eval_bc +eval_lc1 +eval_lc +no_env +do_apply +local_func2 +local_func +unhide_calls +f +m +hide_calls +fun_used_bindings +'$erl_eval_max_line' +find_maxline +apply_error +expr_grp +unbound +not_ok +transform_from_evaluator +k +v +else_clause +argument_limit +undef_record +named_fun_data +check_command +failure +success +maybe_match_exprs +empty_fun_used_vars +'-format_status/2-inlined-0-' +'-do_unlink/2-fun-0-' +parent_terminated +'-terminate_supervised/4-fun-0-' +'-system_code_change/4-fun-0-' +'-system_get_state/1-lc$^0/1-0-' +'-system_replace_state/2-lc$^0/1-0-' +'-report_error/5-fun-0-' +'-report_error/5-fun-1-' +'-report_error/5-fun-2-' +'-the_handlers/1-lc$^0/1-0-' +'-get_modules/1-lc$^0/1-0-' +'-format_status/2-fun-0-' +items +stop_handlers +the_handlers +report_error +gen_event_EXIT +report_terminate +server_call_update +server_call +new_handler +do_swap +server_update +server_notify +swapped +split_and_terminate +s_s_h +server_swap_handler +server_delete_handler +server_add_sup_handler +server_add_handler +terminate_supervised +do_unlink +terminate_server +handle_event +fetch_msg +call1 +swap_sup_handler +swap_handler +sync_notify +add_sup_handler +'no callback module' +process_exited +got_unexpected_message +'-handle_call/3-inlined-0-' +'-set_module_level/2-fun-0-' +'-unset_module_level/1-fun-0-' +'-handle_call/3-fun-7-' +'-handle_call/3-fun-6-' +'-handle_call/3-fun-3-' +handler_not_added +invalid_handler +function_not_exported +'-call_h_async/4-fun-0-' +diffs +logger_process_exited +call_h_reply +call_h_async +changing_config +call_h +illegal_config_change +diff_maps +check_config_change +invalid_formatter +callback_crashed +check_formatter +invalid_filter_default +check_filter_default +invalid_filter +check_filters +invalid_level +check_level +check_mod +invalid_id +check_id +invalid_primary_config +check_config +get_type +sanity_check_1 +invalid_config +sanity_check +default_config +do_remove_filter +do_add_filter +attempting_syncronous_call_to_self +async_req_reply +already_exist +set_opts +get_default_config +'$logger_cb_process' +invalid_formatter_config +change_config +not_a_list_of_modules +simple_handler_process_dead +handler_process_name_already_exists +'-adding_handler/1-fun-0-' +'-replay_buffer/1-F/1-0-' +'-log_internal/2-fun-0-' +'-display/1-lc$^0/1-0-' +'-display_report/1-fun-0-' +'-display_report/1-fun-1-' +display_report +display_date +display_log +log_internal +drop_msg +replay_buffer +dropped +buffer_size +update_buffer +rich +internal_log_event +fields +overlapping_contract +no_missing_return +missing_return +no_extra_return +extra_return +no_underspecs +underspecs +overspecs +specdiffs +no_missing_calls +race_conditions +error_handling +unmatched_returns +no_undefined_callbacks +no_behaviours +no_unknown +no_contracts +no_fail_call +no_opaque +no_fun_app +no_improper_lists +no_unused +no_return +func +item +'-removed_fa/4-inlined-0-' +'-pattern_map/4-inlined-0-' +'-pattern_list/4-inlined-0-' +'-pattern_fields/6-inlined-0-' +'-is_gexpr/2-inlined-0-' +'-import/3-inlined-0-' +'-icrt_export/5-inlined-3-' +'-icrt_export/5-inlined-2-' +'-icrt_export/5-inlined-1-' +'-icrt_export/5-inlined-0-' +'-gexpr_list/3-inlined-0-' +'-func_location_warning/3-inlined-0-' +'-func_location_error/3-inlined-0-' +'-fun_clauses1/3-inlined-0-' +'-expr_list/3-inlined-0-' +'-export_type/3-inlined-0-' +'-export/3-inlined-0-' +'-depr_fa/4-inlined-0-' +'-def_fields/3-inlined-0-' +'-check_unused_types_1/2-inlined-1-' +'-check_undefined_types/1-inlined-2-' +'-check_type_2/3-inlined-1-' +'-check_specs_without_function/1-inlined-0-' +'-check_local_opaque_types/1-inlined-0-' +'-check_fields/6-inlined-0-' +'-check_dialyzer_attribute/2-inlined-6-' +'-bool_option/4-fun-0-' +'-value_option/3-fun-0-' +'-value_option/7-fun-0-' +'-format_mfa/1-lc$^0/1-0-' +'-exprs_opt/3-fun-0-' +'-used_vars/2-fun-0-' +'-compiler_options/1-lc$^0/1-0-' +'-start/2-lc$^0/1-0-' +'-start/2-lc$^1/1-1-' +'-pack_errors/1-fun-0-' +'-pack_errors/1-fun-1-' +'-pack_errors/1-fun-2-' +'-pack_warnings/1-lc$^2/1-1-' +'-pack_warnings/1-lc$^1/1-0-' +'-pack_warnings/1-lc$^0/1-2-' +'-includes_qlc_hrl/2-lc$^0/1-0-' +'-set_file/2-lc$^0/1-0-' +'-anno_set_file/2-fun-0-' +'-bif_clashes/2-lc$^0/1-0-' +'-not_deprecated/2-lc$^2/1-2-' +'-not_deprecated/2-lc$^1/1-1-' +'-not_deprecated/2-lc$^0/1-0-' +'-not_deprecated/2-lc$^4/1-4-' +'-not_deprecated/2-lc$^3/1-3-' +'-not_deprecated/2-lc$^5/1-5-' +'-not_deprecated/2-fun-6-' +'-not_removed/2-lc$^2/1-2-' +'-not_removed/2-lc$^1/1-1-' +'-not_removed/2-lc$^0/1-0-' +'-not_removed/2-lc$^4/1-4-' +'-not_removed/2-lc$^3/1-3-' +'-not_removed/2-fun-5-' +'-disallowed_compile_flags/2-lc$^1/1-1-' +'-disallowed_compile_flags/2-lc$^0/1-0-' +'-disallowed_compile_flags/2-lc$^3/1-3-' +'-disallowed_compile_flags/2-lc$^2/1-2-' +'-behaviour_check/2-lc$^0/1-0-' +'-behaviour_check/2-fun-1-' +'-behaviour_check/2-lc$^2/1-1-' +'-behaviour_missing_callbacks/2-fun-0-' +no_elements +'-behaviour_conflicting/2-fun-0-' +'-check_deprecated/2-lc$^2/1-2-' +'-check_deprecated/2-lc$^1/1-1-' +'-check_deprecated/2-lc$^0/1-0-' +'-check_deprecated/2-fun-3-' +'-depr_fa/4-fun-0-' +'-check_removed/2-lc$^2/1-2-' +'-check_removed/2-lc$^1/1-1-' +'-check_removed/2-lc$^0/1-0-' +'-check_removed/2-fun-3-' +'-removed_fa/4-fun-0-' +'-check_imports/2-lc$^1/1-1-' +'-check_imports/2-lc$^0/1-0-' +'-check_imports/2-lc$^3/1-3-' +'-check_imports/2-lc$^2/1-2-' +'-check_unused_functions/2-lc$^0/1-0-' +'-check_unused_functions/2-lc$^2/1-2-' +'-check_unused_functions/2-lc$^1/1-1-' +'-check_undefined_functions/1-fun-0-' +'-check_undefined_types/1-lc$^0/1-0-' +'-check_undefined_types/1-fun-1-' +'-check_undefined_types/1-fun-2-' +'-check_option_functions/4-lc$^2/1-2-' +'-check_option_functions/4-lc$^1/1-1-' +'-check_option_functions/4-lc$^0/1-0-' +'-check_option_functions/4-lc$^3/1-3-' +'-check_option_functions/4-lc$^4/1-4-' +'-check_nifs/2-lc$^1/1-1-' +'-check_nifs/2-lc$^0/1-0-' +'-check_nifs/2-lc$^2/1-2-' +'-nowarn_function/2-lc$^1/1-1-' +'-nowarn_function/2-lc$^0/1-0-' +'-func_location_warning/3-fun-0-' +'-func_location_error/3-fun-0-' +'-check_untyped_records/2-fun-0-' +'-check_untyped_records/2-lc$^1/1-0-' +'-check_untyped_records/2-fun-2-' +'-check_unused_records/2-lc$^0/1-0-' +'-check_unused_records/2-lc$^3/1-3-' +'-check_unused_records/2-lc$^2/1-2-' +'-check_unused_records/2-lc$^1/1-1-' +'-check_unused_records/2-fun-4-' +'-check_unused_records/2-fun-5-' +'-check_unused_records/2-lc$^6/1-5-' +'-check_unused_records/2-fun-7-' +'-check_callback_information/1-fun-0-' +'-check_callback_information/1-fun-1-' +'-export/3-fun-0-' +'-export_type/3-fun-0-' +'-import/3-fun-0-' +'-check_imports/3-fun-0-' +store +'-add_imports/3-fun-0-' +'-clauses/2-fun-0-' +'-pattern/4-fun-0-' +'-pattern_list/4-fun-0-' +map_key +'-pattern_map/4-fun-0-' +'-pattern_bin/4-fun-0-' +'-good_string_size_type/2-fun-0-' +'-expr_bin/4-fun-0-' +'-gexpr/3-fun-1-' +'-gexpr/3-fun-2-' +'-gexpr/3-fun-0-' +'-gexpr_list/3-fun-0-' +'-is_guard_test/1-fun-0-' +'-is_guard_test/2-fun-0-' +'-is_guard_test/3-lc$^0/1-0-' +'-is_guard_test/3-fun-1-' +'-is_guard_expr/1-fun-0-' +'-is_gexpr/2-fun-0-' +'-is_gexpr_list/2-fun-0-' +'-is_gexpr_fields/4-fun-0-' +'-expr/3-fun-3-' +'-expr/3-fun-2-' +'-expr/3-fun-1-' +'-expr/3-fun-0-' +'-expr_list/3-fun-0-' +'-record_def/4-lc$^0/1-0-' +'-def_fields/3-fun-0-' +'-normalise_fields/1-fun-0-' +'-check_fields/6-fun-0-' +'-pattern_fields/6-fun-0-' +'-pattern_fields/6-fun-1-' +'-init_fields/3-lc$^0/1-0-' +'-type_def/6-fun-0-' +'-warn_redefined_builtin_type/3-lc$^1/1-1-' +'-warn_redefined_builtin_type/3-lc$^0/1-0-' +'-check_type/2-fun-0-' +'-check_type_2/3-fun-5-' +'-check_type_2/3-fun-1-' +'-check_type_2/3-fun-2-' +'-check_type_2/3-fun-3-' +merge_with +'-check_type_2/3-fun-4-' +'-check_type_2/3-fun-0-' +'-check_record_types/5-fun-0-' +'-remove_non_visible/1-lc$^0/1-0-' +'-any_control_characters/1-fun-0-' +constraint +'-check_specs/4-lc$^0/1-0-' +'-check_specs_without_function/1-fun-0-' +'-add_missing_spec_warnings/3-lc$^0/1-0-' +'-add_missing_spec_warnings/3-lc$^1/1-2-' +'-add_missing_spec_warnings/3-lc$^2/1-1-' +'-add_missing_spec_warnings/3-fun-3-' +'-check_unused_types_1/2-lc$^0/1-0-' +'-check_unused_types_1/2-fun-1-' +'-reached_types/1-lc$^1/1-1-' +'-reached_types/1-lc$^0/1-0-' +'-reached_types/1-lc$^2/1-2-' +'-initially_reached_types/1-lc$^0/1-0-' +'-check_local_opaque_types/1-fun-0-' +'-check_dialyzer_attribute/2-lc$^4/1-2-' +'-check_dialyzer_attribute/2-lc$^1/1-4-' +'-check_dialyzer_attribute/2-lc$^0/1-3-' +'-check_dialyzer_attribute/2-lc$^3/1-1-' +'-check_dialyzer_attribute/2-lc$^2/1-0-' +'-check_dialyzer_attribute/2-fun-5-' +'-check_dialyzer_attribute/2-fun-6-' +'-check_dialyzer_attribute/2-fun-7-' +'-icrt_clauses/3-fun-0-' +'-catch_clauses/3-fun-0-' +'-icrt_export/5-fun-0-' +'-icrt_export/5-fun-1-' +'-icrt_export/5-fun-2-' +'-icrt_export/5-fun-3-' +'-icrt_export/5-fun-4-' +'-is_guard_test2_info/1-fun-0-' +'-fun_clauses/3-lc$^0/1-0-' +'-fun_clauses1/3-fun-0-' +'-shadow_vars/4-fun-0-' +'-unused_vars/3-fun-0-' +'-warn_unused_vars/3-fun-0-' +'-warn_unused_vars/3-fun-1-' +'-warn_unused_vars/3-fun-2-' +'-vtupdate/2-fun-0-' +'-vtunsafe/3-lc$^0/1-0-' +'-vtmerge/2-fun-0-' +'-vtmerge/1-fun-0-' +'-vtmerge_pat/3-fun-0-' +matched +'-vtmerge_pat/3-fun-1-' +'-vtnew/2-fun-0-' +'-vtold/2-fun-0-' +'-vt_no_unsafe/1-lc$^0/1-0-' +'-vt_no_unused/1-lc$^0/1-0-' +'-copy_expr/2-fun-0-' +'-feature_keywords/0-fun-0-' +keywords +'-feature_keywords/0-fun-1-' +'-canonicalize_string/1-fun-0-' +'-local_functions/1-lc$^0/1-0-' +'-auto_import_suppressed/1-lc$^0/1-0-' +'-auto_import_suppressed/1-lc$^1/1-1-' +no_guard_bif_clash +bif_clash_specifically_disabled +is_autoimport_suppressed +no_auto_import +auto_import_suppressed +is_imported_from_erlang +is_imported_function +is_local_function +local_functions +control_type +is_modifier +intersection +check_modifiers_1 +check_modifiers +extract_modifiers +extract_sequence_digits +extract_sequence +extract_sequences +check_format_string +args_length +args_list +arguments +check_format_4 +check_format_3 +no_argument_list +check_format_2a +warn +check_format_2 +canonicalize_string +check_format_1 +fwrite +is_format_function +format_function +text +configurable +feature_keywords +test_overriden_by_local +old_type_test +obsolete_type +add_removed_warning +obsolete +q +check_qlc_hrl +is_inline_opt +check_nif_inline +check_load_nif +check_remote_function +is_literal_update +warn_if_literal_update +has_wildcard_field +check_record_info_call +copy_expr +vt_no_unused +vt_no_unsafe +vtold +vtsubtract +vtnew +merge_used +merge_state +merge_annos +vtmerge_pat +vtmerge +vtunsafe +vtupdate +check_old_unused_vars +check_unused_vars +do_expr_var +expr_var +pat_binsize_var +warn_underscore_match_pat_1 +warn_underscore_match_pat +pat_var +fun_clause +fun_clauses1 +fun_clauses +bitstring +bits +bytes +handle_bitstring_gen_pat +comprehension_pattern +handle_generator +is_guard_test2_info +m_generate +generate +b_generate +lc_quals +comprehension_expr +handle_comprehension +icrt_export +stacktrace +taint_stack_var +catch_clause +catch_clauses +icrt_clause +icrt_clauses +try_clauses +is_module_dialyzer_option +is_function_dialyzer_option +check_dialyzer_attribute +check_local_opaque_types +initially_reached_types +reachable +family_to_digraph +rel2fam +reached_types +check_unused_types_1 +check_unused_types +add_missing_spec_warnings +documented +exported +check_functions_without_spec +check_specs_without_function +set_generated +nowarn +bounded_fun +check_specs +any_control_characters +remove_non_visible +latin1_char_list +check_module_name +is_fa +is_fa_list +optional_cbs +callback_decl +spec_decl +obsolete_builtin_type +is_obsolete_builtin_type +is_type +is_default_type +used_type +field_type +check_record_types +seen_multiple +seen_once_union +seen_once +remote_type +ann_type +range +user_type +typed_record_field +check_type_2 +check_type_1 +check_type +no_auto_import_types +typeinfo +type_def +find_field +exist_field +update_fields +ginit_fields +init_fields +pattern_fields +pattern_field +check_field +check_fields +used_record +check_record +exist_record +normalise_fields +def_fields +product +record_def +is_valid_call +warn_invalid_call +is_valid_record +warn_invalid_record +map_fields +check_assoc_fields +record_expr +expr_list +expr_check_match_zero +if +executable_line +catch +old_bif +record_info +else +'named fun' +unused +first_anno +named_fun +mc +maybe_match +maybe +lc +case +bc +try +ssa_check_when +expr +is_gexpr_fields +map_field_exact +map_field_assoc +is_map_fields +is_gexpr_list +comp +arith +op_type +is_gexpr_op +is_gexpr +is_guard_expr +is_guard_test2 +is_guard_test +gexpr_list +bif +guard_bif +record_field +gexpr +type_test +guard_test2 +guard_test +guard_tests +elemtype_check +bittype +bit_size_check +set_bit_type +bit_type +expr_bin +is_bit_size_illegal +pat_bit_size +pat_bit_expr +good_string_size_type +pattern_element_1 +bin_element +pattern_element +pattern_bin +pattern_map +arith_op +is_pattern_expr_1 +partial_eval +is_pattern_expr +check_multi_field_init +pattern_list +var +tuple +bin +record_index +char +cons +op +pattern +head +clause +clauses +function_check_max_args +define_function +call_function +check_on_load +imported +add_imports +check_callback_information +check_unused_records +check_untyped_records +func_location_error +func_location_warning +nowarn_function +check_nifs +check_option_functions +check_bif_clashes +check_undefined_types +drestriction +from_external +check_undefined_functions +reached_functions +initially_reached +union +check_unused_functions +inline +check_inlines +check_imports +ignore_predefined_funcs +removed_desc +removed_fa +removed_cat +check_removed +deprecated_desc +next_version +next_major_release +eventually +deprecated_flag +depr_fa +depr_cat +check_deprecated +behaviour_add_conflict +behaviour_add_conflicts +to_external +family_specification +relation_to_family +converse +family_to_relation +relation +behaviour_conflicting +behaviour_missing_callbacks +obsolete_callback +is_member +behaviour_deprecated +behaviour_callbacks +all_behaviour_callbacks +behaviour_check +check_behaviour +post_traversal_check +disallowed_compile_flags +not_removed +not_deprecated +bif_clashes +dialyzer +function_state +add_element +untrack_doc +update_doc_attr +get_doc_attr +track_doc +opaque +moduledoc +import +export_type +export +doc +callback +behaviour +behavior +attribute_state +start_state +form +map_anno +anno_set_file +set_file +set_form_file +eval_file_attr +eval_file_attribute +includes_qlc_hrl +pre_scan +forms +location +loc +add_lint_warning +add_warning +add_lint_error +bin_seg_size +add_error +pack_warnings +pack_errors +return_status +is_warn_enabled +guard +usage +nowarn_format +warn_format +is_element +unused_vars +underscore_match +export_vars +shadow_vars +bif_clash +deprecated_function +missing_spec_documented +missing_spec_all +keyword_warning +redefined_builtin_type +warn_update_literal +nowarn_update_literal +warn_match_float_zero +nowarn_match_float_zero +warn_singleton_typevar +nowarn_singleton_typevar +warn_redefined_builtin_type +nowarn_redefined_builtin_type +warn_keywords +nowarn_keywords +warn_nif_inline +nowarn_nif_inline +warn_removed +nowarn_removed +warn_missing_spec_all +nowarn_missing_spec_all +warn_missing_spec_documented +nowarn_missing_spec_documented +warn_missing_spec +nowarn_missing_spec +warn_untyped_record +nowarn_untyped_record +warn_obsolete_guard +nowarn_obsolete_guard +warn_deprecated_callback +nowarn_deprecated_callback +warn_deprecated_type +nowarn_deprecated_type +warn_deprecated_function +nowarn_deprecated_function +warn_unused_record +nowarn_unused_record +warn_bif_clash +nowarn_bif_clash +warn_unused_type +nowarn_unused_type +warn_unused_function +nowarn_unused_function +warn_unused_import +nowarn_unused_import +warn_shadow_vars +nowarn_shadow_vars +warn_export_vars +nowarn_export_vars +warn_export_all +nowarn_export_all +warn_underscore_match +nowarn_underscore_match +warn_unused_vars +nowarn_unused_vars +compiler_options +lint +used_vars +exprs_opt +pseudolocals +format_where +format_mna +format_mf +gen_type_paren_1 +gen_type_paren +utf_bittype_size_or_unit +update_literal +unsized_binary_not_at_end +unsized_binary_in_bin_gen_pattern +undefined_module +typed_literal_string +spec_wrong_arity +redefine_module +pmod_unsupported +old_abstract_code +non_latin1_module_unsupported +non_integer_bitsize +no_load_nif +nif_inline +multiple_on_loads +match_float_zero +invalid_record +invalid_call +illegal_record_info +illegal_pattern +illegal_map_key +illegal_map_construction +illegal_map_assoc_in_pattern +illegal_guard_expr +illegal_expr +illegal_bitsize +export_all +empty_module_name +disallowed_nowarn_bif_clash +ctrl_chars_in_module_name +callback_wrong_arity +blank_module_name +bittype_unit +bad_multi_field_init +wildcard_in_update +variable_in_record_def +unused_var +unused_type +unused_record +unused_import +unused_function +untyped_record +undefined_type +undefined_record +undefined_on_load +undefined_nif +undefined_callback +undefined_bittype +undefined_behaviour_callbacks +undefined_behaviour +unbound_var +type_syntax +too_many_arguments +stacktrace_guard +stacktrace_bound +spec_fun_undefined +singleton_typevar +redefine_type +redefine_spec +redefine_record +redefine_optional_callback +redefine_old_bif_import +redefine_import +redefine_function +redefine_callback +redefine_builtin_type +redefine_bif_import +obsolete_guard_overridden +obsolete_guard +not_exported_opaque +missing_spec +missing_qlc_hrl +match_underscore_var_pat +match_underscore_var +invalid_removed +invalid_deprecated +illegal_guard_local_call +illegal_bitsize_local_call +ill_defined_optional_callbacks +ill_defined_behaviour_callbacks +duplicated_export_type +duplicated_export +define_import +call_to_redefined_old_bif +call_to_redefined_bif +bad_removed +bad_on_load_arity +bad_on_load +bad_nowarn_unused_function +bad_nowarn_bif_clash +bad_module +bad_inline +bad_export_type +bad_dialyzer_option +bad_dialyzer_attribute +bad_deprecated +bad_bitsize +unsafe_var +undefined_field +undefined_behaviour_func +shadowed_var +renamed_type +removed_type +removed_callback +redefine_field +field_name_is_variable +exported_var +duplicate_doc_attribute +future_feature +deprecated_type +deprecated_callback +deprecated_builtin_type +bittype_mismatch +conflicting_behaviours +format_error_1 +value_option +bool_option +bad_combination +reached_max_restart_intensity +supervisor_report +child_terminated +already_present +'-terminate_dynamic_children/1-inlined-0-' +'-find_child_by_pid/2-inlined-0-' +failed_to_start_child +'-start_children/2-fun-0-' +'-do_auto_shutdown/2-fun-0-' +'-terminate_children/2-fun-0-' +'-terminate_dynamic_children/1-fun-0-' +'-terminate_dynamic_children/1-fun-1-' +'-wait_dynamic_children/5-fun-0-' +'-find_child_by_pid/2-fun-0-' +'-set_pid/3-fun-0-' +invalid_module +'-validMods/1-fun-0-' +'-add_restart/3-fun-0-' +'-dyn_fold/3-fun-0-' +dyn_init +dyn_args +dyn_exists +dyn_map +dyn_fold +mapsets +dyn_store +dyn_erase +dyn_size +format_child_log_single +limit_child_report +errorContext +report_progress +nb_children +mfargs +restart_type +child_type +extract_child +add_restart +child_to_spec +invalid_modules +validMods +invalid_shutdown +validShutdown +invalid_significant +validSignificant +invalid_mfa +validFunc +validId +invalid_child_type +validChildType +missing_id +missing_start +do_check_childspec +invalid_child_spec +significant +check_childspec +duplicate_child_name +check_startspec +supname +validAutoShutdownForStrategy +invalid_auto_shutdown +validAutoShutdown +invalid_period +validPeriod +invalid_intensity +validIntensity +invalid_strategy +validStrategy +do_check_flags +check_flags +auto_shutdown +set_flags +init_state +children_any1 +children_any +children_fold +children_to_list +children_map +remove_child +update_with +set_pid +get_dynamic_child +find_child_by_pid +find_dynamic_child +find_child_and_args +find_child +split_ids +split_child +del_child +do_save_child +save_child +maps_prepend +wait_dynamic_children +terminate_dynamic_children +child_process_unlinked +unlink_flush +brutal_kill +do_terminate +terminate_children +restart_multiple_children +try_again +rest_for_one +do_auto_shutdown +handle_start_child +update_chsp +update_childspec1 +update_childspec +bad_flags +invalid_type +try_again_restart +count_child +specs +supervisors +workers +restarting +debug_report +do_start_child_i +do_start_child +start_children +bad_start_spec +init_dynamic +start_spec +init_children +supervisor_data +simple_one_for_one +get_callback_module +check_childspecs2 +never +any_significant +all_significant +check_childspecs1 +check_childspecs +count_children +which_children +get_childspec +restart_child +'-zip/3-lc$^0/1-1-' +'-zip/3-lc$^1/1-0-' +'-zip3/4-lc$^0/1-2-' +'-zip3/4-lc$^1/1-1-' +'-zip3/4-lc$^2/1-0-' +'-zipwith/4-lc$^0/1-1-' +'-zipwith/4-lc$^1/1-0-' +'-zipwith3/5-lc$^0/1-2-' +'-zipwith3/5-lc$^1/1-1-' +'-zipwith3/5-lc$^2/1-0-' +bad_filter +'-filter/2-lc$^0/1-0-' +uniq_2 +uniq_1 +rufmerge2_2 +rufmerge2_1 +ufmerge2_2 +ufmerge2_1 +rufmergel +ufmergel +ufsplit_2 +ufsplit_1_1 +ufsplit_1 +rfmerge2_2 +rfmerge2_1 +fmerge2_2 +fmerge2_1 +rfmergel +fmergel +fsplit_2_1 +fsplit_2 +fsplit_1_1 +fsplit_1 +rukeymerge2_2 +rukeymerge2_1 +ukeymerge2_2 +ukeymerge2_1 +rukeymerge3_21_3 +rukeymerge3_12_3 +rukeymerge3_2 +rukeymerge3_1 +ukeymerge3_21_3 +ukeymerge3_12_3 +ukeymerge3_2 +ukeymerge3_1 +rukeymergel +ukeymergel +ukeysplit_2 +ukeysplit_1_1 +ukeysplit_1 +rkeymerge2_2 +rkeymerge2_1 +keymerge2_2 +keymerge2_1 +rkeymerge3_21_3 +rkeymerge3_12_3 +rkeymerge3_2 +rkeymerge3_1 +keymerge3_21_3 +keymerge3_12_3 +keymerge3_2 +keymerge3_1 +rkeymergel +keymergel +keysplit_2_1 +keysplit_2 +keysplit_1_1 +keysplit_1 +rumerge2_2 +rumerge2_1 +umerge2_2 +umerge2_1 +rumerge3_21_3 +rumerge3_12_3 +rumerge3_2 +rumerge3_1 +umerge3_21_3 +umerge3_12_3 +umerge3_2 +umerge3_1 +rumergel +umergel +usplit_2_1 +desc +usplit_2 +usplit_1_1 +asc +usplit_1 +rmerge2_2 +rmerge2_1 +merge2_2 +merge2_1 +rmerge3_21_3 +rmerge3_12_3 +rmerge3_2 +rmerge3_1 +merge3_21_3 +merge3_12_3 +merge3_2 +merge3_1 +rmergel +mergel +split_2_1 +split_2 +split_1_1 +split_1 +join_prepend +splitwith_1 +search_1 +dropwhile_1 +dropwhile +takewhile_1 +takewhile +mapfoldr_1 +mapfoldr +mapfoldl_1 +mapfoldl +foreach_1 +filtermap_1 +filtermap +partition_1 +foldr_1 +foldl_1 +flatmap_1 +map_1 +any_1 +all_1 +rumerge3 +umerge3 +rumerge_1 +rumerge +umerge_1 +usort_1 +rmerge_1 +merge_1 +enumerate_1 +enumerate +keymap +rukeymerge_1 +rukeymerge +ukeymerge_1 +ukeymerge +ukeysort_1 +ukeysort +rkeymerge_1 +rkeymerge +keymerge_1 +keymerge +keysort_1 +keystore2 +keyreplace3 +keydelete3 +flatlength +thing_to_list +rmerge +rmerge3 +merge3 +sort_1 +zipwith3 +zipwith +unzip3 +zip3 +pad +fail +sublist_2 +sum +seq_loop +seq +suffix +nthtail_1 +nth_1 +'-separate_error_info/1-fun-0-' +'-format_link_reports/4-lc$^0/1-0-' +'-format_exception/5-fun-0-' +'-pp_fun/2-fun-0-' +nl +chars_limit_opt +part_separator +report_separator +format_tag +pp_fun +write_atom +write_atom_as_latin1 +format_mfa +format_exception +format_rep +format_link_report +format_link_reports +separate_error_info +format_own_report +do_format +badrpc +proc_info +get_ancestors +get_my_name +translate_process_info +get_process_info +no_trap +adjacents +visit +max_neighbours +neighbours +dict_find_info +get_initial_call +make_neighbour_report +neighbour +make_neighbour_reports1 +linked_info +get_dictionary +clean_dict +cleaned_dict +receive_messages +get_process_messages +get_messages +ancestors +my_info_1 +my_info +crash_report +trans_init +raw_initial_call +set_label +translate_initial_call +make_dummy_args +await_DOWN +kill_flush_EXIT +flush_EXIT +sync_start_monitor +nack +sync_start +exit_reason +exit_p +init_p_do_apply +wake_up +spawn_mon +init_p +'-limit_report/2-lc$^0/1-0-' +'-format_log_multi/2-fun-0-' +'-format_log_state/2-lc$^0/1-0-' +format_log_state +format_client_log +sublist +format_client_log_single +format_server_log_single +'function not exported' +'module could not be loaded' +fix_reason +limit_client_report +no_handle_info +dead +client_stacktrace +process_label +last_message +client_info +get_label +get_log +catch_result +print_event +system_replace_state +system_get_state +handle_common_reply +try_terminate +try_handle_call +try_handle_cast +try_handle_info +handle_continue +try_handle_continue +try_dispatch +do_send +decode_msg +create_callback_cache +wake_hib +callback_cache +handle_debug +mc_cancel_timer +mc_recv_tmo +mc_recv +mc_send +multi_call +do_abcast +abcast +'$gen_cast' +cast_msg +do_cast +nolink +n_objects +read_only +repair +the +a +parse_transform +transformed +be +should +fun +real +called +transform_error +'-table/2-inlined-0-' +'-file2tab/2-inlined-1-' +'-file2tab/2-inlined-0-' +log_terms +'-tab2file/3-fun-1-' +blog_terms +'-tab2file/3-fun-0-' +'-file2tab/2-fun-1-' +'-file2tab/2-fun-0-' +'-table/2-fun-2-' +'-table/2-fun-1-' +'-table/2-fun-0-' +'-table/2-fun-3-' +'-table/2-fun-4-' +'-table/2-fun-5-' +'-table/2-fun-6-' +'-table/2-fun-7-' +'-table/2-fun-8-' +'-table/2-lc$^10/1-2-' +'-table/2-lc$^9/1-1-' +'-table/2-fun-11-' +'-qlc_next/2-fun-0-' +'-qlc_prev/2-fun-0-' +'-qlc_select/1-fun-0-' +'-hform/6-lc$^0/1-0-' +re_match +print_re_num +re_display +re_search +slice +do_display_item +do_display_items +do_display +print_number +trailing +nonl +line_string +choice +'(c)ontinue (q)uit (p)Digits (k)ill /Regexp -->' +'EOT (q)uit (p)Digits (k)ill /Regexp -->' +eot +display_items +pad_right +hform +is_reg +prinfo2 +prinfo +tabs +mem +listify +default_option +traverse +qlc_select +qlc_prev +qlc_next +num_of_objects +is_unique_objects +is_sorted_key +table_info +pre_fun +post_fun +info_fun +format_fun +key_equality +lookup_fun +last_prev +first_next +tabfile_info +cannot_create_table +create_tab +load_table +scan_for_endinfo +md5_and_convert +major_version +get_header_data +chunk +wrap_chunk +bchunk +wrap_bchunk +verify_header_mandatory +count_mandatory +verify +parse_f2t_opts +invalid_object_count +checksum_error +do_read_and_verify +read_error +unsupported_file_version +repaired +file2tab +object_count +md5sum +parse_ft_info_options +malformed_option +unknown_option +filetab_options +parse_ft_options +md5terms +ft_options_to_list +dump_file +eaccess +extended_info +badtab +tab2file +tab2list +init_table_sub +end_of_input +init_table_continue +init_table +test_ms +from_ets +to_dets +to_ets +from_dets +soft_whereis +do_foldr +foldr +transform_from_shell +fun_data +fun2ms +repair_continuation +match_spec_run +select_delete +delete_all_objects +receive_all +'-basenameb/2-lc$^0/1-0-' +'-unix_splitb/1-lc$^0/1-0-' +'-win32_splitb/1-lc$^3/1-4-' +'-win32_splitb/1-lc$^1/1-3-' +'-win32_splitb/1-lc$^0/1-2-' +'-win32_splitb/1-lc$^2/1-1-' +'-win32_splitb/1-lc$^4/1-0-' +'-basedir/3-lc$^0/1-0-' +validate_bin +validate_char +validate_list +validate +basedir_os_type +basedir_join_home +noappdata +basedir_windows_appdata +basedir_windows +basedir_darwin +lexemes +user_data +user_config +basedir_linux +basedir_from_os +author +basedir_name_from_opts +darwin +basedir_os_from_opts +site_data +site_config +windows +user_log +user_cache +basedir +filename_string_to_binary +do_flatten +major_os_type +separators +replace +win32_nativename +nativename +win32_split +unix_split +win32_splitb +fix_driveletter +unix_splitb +rootname2 +maybe_remove_dirsep +join1b +join1 +bad_size +dirjoin1 +dirjoin +fstrip +skip_prefix +basename1 +basenameb +win_basenameb +'-inlined-level_to_int/1-' +'-set/3-lc$^0/1-0-' +'-set_module_level/2-lc$^0/1-0-' +'-unset_module_level/1-lc$^0/1-1-' +'-unset_module_level/1-lc$^1/1-0-' +'-get_module_level/0-lc$^0/1-0-' +'$handler_config$' +'$primary_config$' +'$proxy_config$' +table_key +int_to_level +create +exist +less_or_equal_level +'-call/4-fun-0-' +'-send_request/3-fun-0-' +'-receive_response/3-fun-0-' +'-stop/3-fun-0-' +'$status' +format_status +format_status_header +debug_options +hibernate_after +spawn_opts +could_not_find_registered_name +name_to_pid +process_was_not_started_by_proc_lib +get_parent +process_not_registered_globally +process_not_registered +process_not_registered_via +get_proc_name +unregister_name +register_name +whereis_name +where +via +do_for_proc +reqids_to_list +flush_responses +collection_result +no_reply +check_response +receive_response +'@wait_response_recv_opt' +do_send_request +calling_self +do_call +init_it2 +init_fail +monitor_return +start_monitor +init_it +do_spawn +on_match +filter_remote_gl +filter_progress +filter_level +prefix +filter_domain +neq +lteq +gteq +not_equal +equal +'-get_handler_config/0-lc$^0/1-0-' +'-get_module_level/1-lc$^0/1-0-' +'-print_filters/3-lc$^0/1-0-' +'-print_handlers/2-lc$^0/1-0-' +'-print_custom/3-lc$^0/1-0-' +'-print_module_levels/2-lc$^0/1-0-' +'-reconfigure/0-lc$^0/1-0-' +'-internal_init_logger/0-lc$^0/1-0-' +'-internal_init_logger/0-lc$^1/1-1-' +'-add_handlers/2-fun-0-' +'-get_primary_filters/1-lc$^0/1-0-' +'-get_primary_filters/1-fun-1-' +'-get_proxy_opts/1-lc$^0/1-0-' +proc_meta +add_default_metadata +log_remote +deatomize +tid +do_log_allowed +log_fun_allowed +get_logger_env +get_default_handler_filters +init_default_config +multiple_proxies +get_proxy_opts +multiple_filters +invalid_filters +get_primary_filters +get_primary_filter_default +logger_default_metadata +logger_metadata +get_primary_metadata +get_logger_level +get_logger_type +module_level +check_logger_config +setup_handler +bad_proxy_config +init_kernel_handlers +bad_config +metadata +simple +reconfigure +print_module_levels +print_custom +print_handlers +print_filters +modifier +i_modules +i_proxy +i_handlers +i_primary +i +module_levels +get_config +unset_process_metadata +get_process_metadata +update_process_metadata +'$logger_metadata$' +set_process_metadata +lt +gt +level_to_int +eq +compare_levels +get_module_level +unset_application_level +set_application_level +unset_module_level +set_module_level +update_formatter_config +get_proxy_config +get_handler_ids +filter_config +get_primary_config +update_proxy_config +update_handler_config +update_config +update_primary_config +proxy +set_proxy_config +set_handler_config +set_config +set_primary_config +remove_primary_filter +add_filter +add_primary_filter +printable_unicode_list +format_term_list +critical +alert +emergency +distribution_not_changed +one_for_all +kernel_safe_sup +one_for_one +strategy +period +intensity +global_groups +is_gg_changed +global_groups_added +global_groups_removed +global_groups_changed +do_global_groups_change +is_dist_changed +distribution_changed +do_distribution_change +start_compile_server +start_pg +start_disk_log +boot_server_slaves +get_boot_args +start_boot_server +start_dist_ac +start_distribution +supervision_child_spec +add_handlers +internal_init_cmd_shell +internal_init_logger +'-do_start/4-fun-0-' +'-maybe_add_read_ahead/2-fun-0-' +cbv +cafu +count_and_find +read_size +cast_binary +cat +do_setopts +check_valid_opts +unfold +substitute_negations +err_func +continuation_location +invalid_unicode_error +get_chars_apply +get_chars_notempty +get_chars_empty +convert_enc +collect_line +io_request_loop +requests +get_until +std_reply +io_reply +server_loop +maybe_add_read_ahead +valid_enc +expand_encoding +parse_options +invalid_unicode +'-do_start_slave/3-fun-1-' +'-do_start_slave/3-fun-0-' +relay_loop +relay_start +do_start_slave +no_master +get_line +'-del_dir_r/1-fun-0-' +'-socket_send/1-fun-0-' +'-gen_tcp_send/1-fun-0-' +file_reply +file_request +check_args +check_and_call +character +mode_list +make_binary +file_name_1 +file_name +fname_join +path_open_first +eval_stream2 +parse_erl_exprs +eval_stream +set_encoding +consult_stream +sendfile_send +sendfile_fallback_int +sendfile_fallback +gen_tcp_send +socket_send +'$inet' +chunk_size +change_time +change_group +change_owner +change_mode +path_open +path_script +path_eval +path_consult +consult +ipread_s32bu_p32bu_2 +ipread_s32bu_p32bu_int +copy_opened_int +copy_int +pwrite_int +put_chars +pread_int +get_chars +ram +raw_write_file_info +raw_read_file_info +do_write_file +del_dir_r +terminated +undefined_script +title +sasl +open_file +'$3' +'-add_env/2-inlined-0-' +'-start/1-fun-0-' +'-get_all_env/1-fun-0-' +'-handle_call/3-fun-2-' +'-handle_call/3-fun-5-' +'-handle_call/3-fun-4-' +'-handle_call/3-lc$^3/1-0-' +'-handle_call/3-fun-0-' +'-handle_call/3-fun-1-' +'$gen_call' +'-terminate/2-F/0-0-' +'-terminate/2-fun-1-' +'-load/2-fun-0-' +'-unload/2-fun-0-' +'-find_missing_dependency/2-fun-0-' +'-prim_parse/2-fun-0-' +'-do_change_apps/3-fun-0-' +'-do_change_apps/3-fun-1-' +'-get_cmd_env/1-fun-0-' +'-add_env/2-fun-0-' +'-do_config_diff/3-fun-0-' +'-conf_param_to_conf/1-fun-0-' +'-config_param_to_list/1-lc$^0/1-0-' +'-check_conf/0-fun-0-' +'-read_fd_until_end_and_close/3-Read/4-0-' +'-read_fd_until_end_and_close/3-fun-1-' +'-read_fd_until_end_and_close/3-GetResult/0-1-' +'-reply_to_requester/3-fun-0-' +to_string +default_encoding +read_encoding_from_binary +file_binary_to_list +test_make_apps +test_do_change_appl +test_change_apps +update_permissions +reply_to_requester +single +p +format_log_multi +format_log_single +limit_report +encoding +format_log +info_exited +started_at +info_started +config_error +strip_comment +only_ws +reader_ref +read_fd_until_end_and_close +parse_file +tokens +scan_file +read_from_file_descriptor +load_file_descriptor +check_conf_sys +check_conf +config_param_to_list +invalid_file_desc +characters_to_nfc_list +configfd +conf_param_to_conf +do_config_diff +application_not_found +module_not_defined +do_config_change +do_prep_config_change +check_user +del_env +add_env +get_env_key +merge_app_env +change_app_env +merge_env +get_env_i +handle_make_term_error +make_term +conv +get_cmd_env +get_opt +do_change_appl +is_loaded_app +do_change_apps +invalid_name +badstartspec +invalid_options +make_appl_i +parse_term +splitwith +prim_parse +prim_consult +format_error +make_appl +bad_application +get_restart_type +nd +invalid_restart_type +validRestartType +keyreplaceadd +ksd +keysearchdelete +stop_appl +find_missing_dependency +spawn_starter +check_start_cond +do_load_application +maybe_load_application +get_loaded +del_cntrl +ac_application_run +notify_cntrl_started +cntrl +code_change +shutdown_func +application_terminated +match_delete +ac_application_not_run +stop_it +not_running +failover +ac_start_application_reply +ac_load_application_reply +ac_change_application_req +handle_info +application_start_failure +handle_application_started +handle_cast +loading +start_p_false +zf +ac_load_application_req +not_started +ac_application_stopped +ac_application_unloaded +keydelete +permissions +ac_start_application_req +persistent +check_distributed +distributed +check_para_value +check_para +check_conf_data +'load error' +enter_loop +'$initial_call' +'$ancestors' +get_value +appl +get_key_data +get_key_direct +'$2' +prep_config_change +change_application_data +control_application +bad_environment_value +send_request +ack +legacy_header +formatter +no_domain +super +remote_gl +module_not_found +no_log_file +allready_have_logfile +format_report +worker +'-tty/1-fun-0-' +error_logger_format_depth +get_format_depth +limit_term +add_handler_filter +error_logger_tty_true +remove_handler_filter +error_logger_tty_false +standard_io +get_handler_config +tty +logfile +which_report_handlers +which_handlers +delete_handler +delete_report_handler +add_handler +add_report_handler +printable_list +string_p1 +string_p +format_otp_report +scan_format +report_to_format +maybe_add_domain +report_cb +get_report_cb +std_info +std_warning +fix_warning_type +info_report +fix_warning_tag +maybe_map_warnings +single_line +depth +unlimited +chars_limit +do_log +removing_handler +adding_handler +delete_child +register_handler +start_child +remove_handler_failed +filter_stacktrace +removed_failing_filter +remove_filter +handle_filter_failed +bad_return_value +do_apply_filters +filter_default +apply_filters +handler +log_event +internal_log +removed_failing_handler +do_internal_log +remove_handler +without +call_handlers +handlers +filters +log_allowed +'$1' +on_load_failure +bad_name +'-store_module_and_reply/3-inlined-0-' +'-start_link/1-fun-0-' +'-init/3-fun-0-' +'-init/3-lc$^1/1-0-' +'-get_user_lib_dirs_1/1-lc$^0/1-0-' +'-handle_call/3-lc$^0/1-0-' +'-choose_bundles/1-lc$^0/1-0-' +'-choose_bundles/1-lc$^1/1-1-' +'-vsn_to_num/1-lc$^0/1-0-' +'-is_numstr/1-fun-0-' +'-cache_path/1-lc$^0/1-0-' +'-exclude/2-lc$^0/1-0-' +'-set_path/5-lc$^0/1-0-' +'-try_archive_subdirs/3-fun-0-' +'-stick_dir/3-fun-1-' +'-stick_dir/3-fun-0-' +'-finish_loading/3-fun-3-' +'-finish_loading/3-fun-2-' +'-finish_loading/3-fun-1-' +'-finish_loading/3-fun-0-' +'-finish_loading_ensure/2-lc$^0/1-0-' +pending_on_load +'-abort_if_pending_on_load/2-lc$^0/1-0-' +sticky_directory +'-abort_if_sticky/2-lc$^0/1-0-' +'-do_finish_loading/2-lc$^0/1-0-' +'-do_finish_loading/2-lc$^1/1-2-' +'-do_finish_loading/2-lc$^2/1-1-' +'-store_module_and_reply/3-fun-0-' +'-schedule_on_load/4-fun-0-' +'-finish_on_load_report/2-fun-0-' +finish_on_load_report +on_load_down +schedule_on_load +store_module_and_reply +keep +finish_on_load +handle_loader +run_loader_next +run_loader +schedule_or_run_loader +do_finish_loading +abort_if_sticky +abort_if_pending_on_load +finish_loading_ensure +is_dir +absname_join +absname_when_relative +with_cache +mod_to_bin +get_mods +sticky +'bad request to code' +priv +do_dir +lookup_name +delete_name_dir +delete_name +replace_name +del_ebin_1 +del_ebin +check_pars +replace_path1 +insert_old_shadowed +del_path1 +try_archive_subdirs +archive_subdirs +do_insert_name +insert_name +insert_dir +init_namedb +code_names +create_namedb +maybe_update +keyreplace +do_add +do_check_path +check_path +droplast +split_base +discard_after_hyphen +get_name_from_splitted +get_name +get_arg +add_pa_pz +merge_path1 +merge_path +strip_path +exclude_pa_pz +cache_boot_paths +cache_key +do_cache_path +cache_path +add_loader_path +try_ebin_dirs +keystore +choose +split2 +split1 +is_numstr +is_vsn +vsn_to_num +create_bundle +choose_bundles +stopped +noreply +handle_call +system_terminate +system_continue +unknown_system_msg +system_code_change +change_code +do_sys_cmd +suspend_loop +gen_reply +handle_system_msg +'ON_LOAD_DOWN' +'LOADER_DOWN' +code_call +split_paths +get_user_lib_dirs_1 +get_user_lib_dirs +stop_error +report_problem +send_shutdown +check_callback +check_system +get_heart_cmd +send_heart_cmd +send_heart_beat +do_cycle_port_program +check_schedulers +validate_options +no_reboot_shutdown +port_terminated +bad_callback +bad_cmd +bad_options +wait_ack +bad_heart_flag +check_start_heart +get_heart_timeouts +port_problem +start_portprogram +wait +cycle +get_options +set_options +clear_callback +get_callback +set_callback +clear_cmd +get_cmd +set_cmd +start_error +no_heart +wait_for_init_ack +otp_doc_vsn +generated +mfa +bad_directory +'-all_available/2-lc$^0/1-0-' +rootname +'-all_available/2-fun-1-' +'-all_available/2-F/2-1-' +on_load_not_allowed +'-prepare_loading_3/1-lc$^0/1-0-' +'-partition_on_load/1-fun-0-' +'-load_mods/1-fun-0-' +'-load_bins/1-fun-0-' +'-do_par_fun/2-lc$^0/1-0-' +'-do_par_fun/2-fun-1-' +'-do_par_fun_each/3-fun-0-' +'-load_code_server_prerequisites/0-lc$^0/1-0-' +eep48 +debug_info +'-get_doc/2-fun-0-' +'-get_type_docs_from_ast/1-fun-0-' +'-get_function_docs_from_ast/1-fun-0-' +spec +'-get_function_docs_from_ast/2-fun-0-' +'-module_status/0-lc$^0/1-0-' +'-module_status/1-lc$^0/1-0-' +'-modified_modules/0-lc$^0/1-0-' +path_files +modified_modules +do_beam_file_md5 +beam_file_md5 +module_changed_on_disk +modified +removed +cover_compiled +module_status +warning_report +cache_warning +code_path_cache +maybe_warn_for_cache +nthtail +has_ext +filter2 +decorate +build +search +flatten +clash +filter +get_function_docs_from_ast +signature +attribute +flatmap +get_type_docs_from_ast +no_abstract_code +docs_v1 +raw_abstract_v1 +abstract_code +get_doc_chunk_from_ast +dirname +missing_chunk +chunks +get_doc_chunk +erts +sources +get_doc +non_existing +where_is_file +which +macro_log +allow +start_get_mode +do_s +compiler +do_stick_dirs +nostick +maybe_stick_dirs +load_code_server_prerequisites +do_start +good +bad +do_par_recv +do_par_fun_each +do_par_fun +do_par +load_bins +load_mods +verify_prepared +partition +partition_on_load +prepare_check_uniq_1 +prepare_check_uniq +prepare_loading_3 +prepare_loading_2 +do_prepare_loading +partition_load +'$prepared$' +atomic_load +prepare_ensure +ensure_modules_loaded_2 +usort +ensure_modules_loaded_1 +ensure_modules_loaded +get_mode +replace_path +del_paths +del_path +add_pathsa +add_pathsz +add_paths +add_patha +add_pathz +add_path +normalize_paths +nocache +is_sticky +unstick_mod +stick_mod +unstick_dir +stick_dir +priv_dir +compiler_dir +dir +lib_dir +root_dir +extension +umerge +all_available +get_object_code +is_loaded +int_list +modp +load_binary +concat +basename +load_abs +ensure_prepare_loading +load_ok +load_error +get_object_code_for_loading +load_file +try_decompress +module_md5_1 +module_md5 +get_chunk_1 +get_chunk +start_phase +config_change +only_loaded +'-ensure_all_started/3-lc$^0/1-0-' +'-wait_all_enqueued/3-lc$^0/1-0-' +get_appl_name +get_master +get_supervisor +get_application_module +get_application +get_pid_all_key +get_all_key +get_pid_key +get_key +get_pid_all_env +get_all_env +get_pid_env +get_env +unset_env +set_env +loaded_applications +which_applications +stop_application +distributed_application +permit_only_loaded_application +permit_application +permit +takeover_application +takeover +start_boot_application +ensure_started +reqids_size +wait_all_enqueued +deadlock +no_request +wait_response +wait_one_enqueued +reqids_add +start_application_request +enqueue_dag_leaves +concurrent_dag_start +already_started +start_application +enqueue_or_start_app +is_running +enqueue_or_start +to_list +reqids_new +concurrent +temporary +ensure_all_started +unload_application +load_application +load1 +shutdown_error +'-terminate/2-lc$^0/1-0-' +'-kill_children/1-fun-0-' +exit_after +set_timer +kill_all_procs_1 +kill_all_procs +kill_children +terminate_child +terminate_child_i +get_child_i +prep_stop +loop_it +start_supervisor +start_the_app +start_it_new +start_it_old +bad_keys +start_phases +relay_to_group_leader +keytake +child +terminate_loop +main_loop +init_loop +cast +application_started +ac_tab +appl_data +get_child +start_type +'$handle_undefined_function' +call_undefined_function_handler +stub_function +raise_undef_exception +erlangrc +start_boot +applications_loaded +pool_master +take_over_monitor +rsh_starter +timer_server +stdlib +load +init_kernel_started +mod +maxP +maxT +shell_history_drop +shell_docs_ansi +prevent_overlapping_partitions +net_ticktime +net_tickintensity +logger_sasl_compatible +notice +logger_level +included_applications +optional_applications +applications +ddll_server +os_server +rex +net_sup +kernel_sup +fixtable_server +file_server_2 +boot_server +modules +vsn +start_link +modules_loaded +win32reg +uri_string +unicode_util +sys +supervisor_bridge +sofs +shell_docs_markdown +shell_docs +shell_default +shell +sets +rand +queue +qlc_pt +qlc +proplists +pool +peer +otp_internal +ordsets +orddict +ms_transform +log_mf_h +json +io_lib_pretty +io_lib_fread +io_lib_format +gen_statem +gen_fsm +gb_trees +gb_sets +filelib +file_sorter +eval_bits +escript +error_logger_tty_h +error_logger_file_h +erl_tar +erl_pp +erl_posix_msg +erl_internal +erl_features +erl_expand_records +erl_error +erl_compile +erl_bits +erl_abstract_code +epp +edlin_type_suggestion +edlin_key +edlin_expand +edlin_context +edlin +digraph_utils +digraph +dict +dets_v9 +dets_utils +dets_sup +dets_server +dets +calendar +c +beam_lib +base64 +array +argparse +wrap_log_reader +user_sup +user_drv +rpc +raw_file_io_list +raw_file_io_inflate +raw_file_io_delayed +raw_file_io_deflate +raw_file_io_compressed +raw_file_io +ram_file +pg2 +pg +net_adm +logger_sup +logger_std_h +logger_proxy +logger_olp +logger_handler_watcher +logger_handler +logger_h_common +logger_formatter +logger_disk_log_h +local_udp +local_tcp +kernel_config +inet_udp +inet_tcp_dist +inet_tcp +inet_sctp +inet_res +inet_parse +inet_hosts +inet_gethost_native +inet_epmd_socket +inet_epmd_dist +inet_dns_tsig +inet_dns +inet_db +inet_config +inet6_udp +inet6_tcp_dist +inet6_tcp +inet6_sctp +group_history +group +global_search +global_group +gen_udp_socket +gen_udp +gen_tcp_socket +gen_tcp +gen_sctp +erpc +erl_signal_handler +erl_reply +erl_epmd +erl_distribution +erl_compile_server +erl_boot_server +dist_util +dist_ac +disk_log_sup +disk_log_server +disk_log_1 +disk_log +application_starter +supervisor +proc_lib +logger_simple_h +logger_config +logger_backend +logger_filters +gen_server +gen_event +gen +file_io_server +file_server +erl_lint +code_server +application_master +application_controller +application +preloaded +start_cli +elixir +elixir_root +noshell +home +progname +net +no_uniconde_traslation +no_function +no_data +not_enough_memory +invalid_parameter +invalid_flags +invalid_data +insufficient_buffer +esystem +esocktype +eservice +eoverflow +enxio +enoname +enodata +enametoolong +emem +efault +efamily +efail +ebadflags +eaddrfamily +can_not_complete +address_not_associated +zone_indices +wwanpp2 +wwanpp +well_known +valid_lifetime +unreachable +unicast_addrs +unchanged +transient +testing +tentative +suffix_origin +speed +software_loopback +service +router_advertisement +register_adapter_suffix +receive_only +reasm_size +prefix_origin +prefixes +preferred_lifetime +preferred +phys_addr +out_qlen +out_errors +out_discards +out_nucast_pkts +out_ucast_pkts +out_octets +oper_status +operational +on_link_prefix_length +numericserv +numerichost +no_multicast +not_present +non_operational +nofqdn +netbios_over_tcpip_enabled +name_info +namereqd +multicast_addrs +mask +manual +lower_layer_down +link_layer_address +lease_lifetime +last_change +iso88025_tokenring +ipv6_other_stateful_config +ipv6_managed_address_config_supported +ipv6_index +ipv6_enabled +ipv4_enabled +in_unknown_protos +in_errors +in_discards +in_nucast_pkts +in_ucast_pkts +in_octets +internal_oper_status +ieee80216_wman +ieee80211 +idn +friendly_name +fddi +ethernet_csmacd +duplicate +dns_suffix +dns_server_addrs +dns_eligible +disconnected +ddns_enabled +dhcp_v4_enabled +dhcp +description +deprecated +dad_state +bcast_addr +anycast_addrs +admin_status +address_info +mptcp +'MPTCP' +ethernet +'Ethernet' +rohc +'ROHC' +wesp +'WESP' +shim6 +'Shim6' +hip +'HIP' +manet +'mpls-in-ip' +'MPLS-in-IP' +udplite +'UDPLite' +'mobility-header' +'Mobility-Header' +fc +'FC' +'SCTP' +isis +'ISIS' +l2tp +'L2TP' +vrrp +'VRRP' +ipcomp +'IPCOMP' +pim +'PIM' +encap +'ENCAP' +etherip +'ETHERIP' +'IPIP' +'ax.25' +'AX.25' +ospf +'OSPFIGP' +eigrp +'EIGRP' +vmtp +'VMTP' +rspf +'CPHB' +'RSPF' +'ipv6-opts' +'IPv6-Opts' +'ipv6-nonxt' +'IPv6-NoNxt' +'ipv6-icmp' +'IPv6-ICMP' +'SKIP' +ah +'IPSEC-AH' +esp +'IPSEC-ESP' +gre +'GRE' +rsvp +'RSVP' +idrp +'IDRP' +'ipv6-frag' +'IPv6-Frag' +'ipv6-route' +'IPv6-Route' +'IPv6' +'idpr-cmtp' +'IDPR-CMTP' +ddp +'DDP' +xtp +'XTP' +dccp +'DCCP' +'iso-tp4' +'ISO-TP4' +rdp +'RDP' +'xns-idp' +'XNS-IDP' +hmp +'HMP' +'UDP' +'PUP' +igp +'IGP' +'EGP' +'TCP' +st +'ST' +ipencap +'IP-ENCAP' +ggp +'GGP' +'IGMP' +'ICMP' +hopopt +'HOPOPT' +'IP' +sockets +select_write +select_read +eagain +create_accept_socket +zero +x25 +x25ddn +write_waits +write_tries +write_pkg +write_fails +write_byte +v6only +void +use_min_mtu +use_ext_recvinfo +user_timeout +usec +update_connect_context +update_accept_context +unknown +unicast_hops +unblock_source +txqlen +tunnel6 +tunnel +time_wait +timestamp_enabled +timeout_episodes +transparent +throughput +syn_sent +syn_retrans +syn_rcvd +syncnt +stf +staticarp +spec_dst +socktype +snd_wnd +sndtimeo +sndlowat +sndbufforce +slen +slave +simplex +set_peer_primary_addr +setfib +sendsrcaddr +sendfile_waits +sendfile_tries +sendfile_pkg_max +sendfile_pkg +sendfile_max +sendfile_fails +sendfile_byte +select_sent +select_failed +sec +rxq_ovfl +rtt +rtoinfo +rthdr +router_alert +rm +rights +retopts +reset_streams +renaming +reliability +recvpktinfo +recvorigdstaddr +recvopts +recvif +recvhoplimit +recverr +recvdstaddr +read_tries +read_pkg +read_fails +read_byte +rdm +rcv_wnd +rcv_buf +rcvtimeo +rcvlowat +rcvbufforce +rawip +pup +pronet +promisc +primary_addr +ppp +ppromisc +portsel +portrange +pointopoint +pkttype +pktinfo +peercred +peer_auth_chunks +peer_addr_params +peek +passcred +partial_delivery_point +outgoing +otherhost +origdstaddr +oobinline +oob +on +off +oactive +num_unknown_cmds +num_unexpected_writes +num_unexpected_reads +num_unexpected_connects +num_unexpected_accepts +num_threads +num_general_errors +not_bound +notrailers +nosignal +noopt +nodefrag +noarp +nlen +netrom +multicast_hops +multicast_all +mtu_discover +mss +msfilter +min_rtt +minttl +mincost +metricom +mem_start +mem_end +md5sig +max_msg_size +maxseg +maxdg +maxburst +master +mark +lower_up +lowdelay +local_auth_chunks +localtlk +link2 +link1 +link0 +leave_group +last_ack +knowsepoch +kernel +keepintvl +keepidle +keepcnt +join_group +i_want_mapped_v4_addr +irq +ipv6 +ipv4 +iplevel +ipip +ipcomp_level +ip +integer_range +initmsg +infiniband +implink +igmp +ifindex +ieee1394 +ieee802 +icmp6 +icmp +host +hopopts +hoplimit +hmac_ident +hdrincl +hdh1822 +hatype +gif +get_peer_addr_info +get_overlapped_result +frelay +freebind +fragment_interleave +fin_wait_2 +fin_wait_1 +fast_retrans +fastroute +faith +explicit_eor +events +eui64 +esp_trans_level +esp_network_level +errqueue +eor +egp +eether +echo +dynamic +dying +dup_acks_in +dup +dstopts +drop_source_membership +dormant +dontfrag +dma +dlci +disable_fragments +dhcprunning +delayed_ack_time +default_send_params +data_size +cwnd +ctrunc +credentials +cork +context +connection_time +congestion +confirm +completion_status +cmsg_cloexec +close_wait +checksum +chaos +cellular +cantconfig +cancelled +bytes_retrans +bytes_reordered +bytes_out +bytes_in_flight +bytes_in +busy_poll +bsp_state +bridge +block_source +bindtodevice +base_addr +bad_data +ax25 +automedia +autoclose +auth_level +auth_key +auth_delete_key +auth_chunk +auth_asconf +auth_active_key +authhdr +atm +associnfo +arcnet +appletlk +already +allmulti +alen +add_source_membership +add_socket +addrform +adaption_layer +acc_waits +acc_tries +acc_fails +acc_success +acceptfilter +acceptconn +'6to4' +zerocopy +wstates +write_pkg_max +want +txtime +txstatus +time_exceeded +tcp_info +sourceaddr +socket_level +slist +siftxqlen +sifnetmask +sifmtu +sifdstaddr +sifbrdaddr +sifaddr +send_failure +sender_dry +selected +rstates +remote_addr +remote +reject_route +read_waits +read_pkg_max +rcvall_mcast +rcvall_igmpmcast +rcvall +probe +port_unreach +policy_fail +pkt_toobig +peer_rwnd +peer_error +partial_delivery +otp_socket_option +origin +onoff +offender +num_writers +num_tstreams +num_tseqpkgs +num_tdgrams +num_sockets +num_readers +num_pudp +num_ptcp +num_psctp +num_pip +number_peer_destinations +num_outstreams +num_dlocal +num_dinet6 +num_dinet +num_cnt_bits +num_acceptors +null +nwrite +nspace +nread +not_neighbour +noroute +nogroup +net_unreach +net_unknown +multiaddr +missing +asocmaxrxt +max_instreams +max_init_timeo +max_attempts +local_rwnd +local_addr +listening +io_num_threads +io_backend +iov_max +interface +initial +include +in6_sockaddr +in4_sockaddr +how +host_unreach +host_unknown +giftxqlen +gifnetmask +gifname +gifmtu +gifmap +gifindex +gifhwaddr +gifflags +gifdstaddr +gifconf +gifbrdaddr +gifaddr +genaddr +frag_needed +exclude +eei +dtor +dont +do +dest_unreach +data_io +ctype +counter_wrap +cookie_life +closing +bufsz +boolean +authentication +atmark +assoc_id +association +adm_prohibited +address +addr_unreach +adaptation_layer +symlink +device +no_reuse +dont_need +will_need +random +skip_type_check +gc_buffer +out_of_memory +acquired +lock_order_violation +trace_ts +gc_zlib +unknown_error +version_error +buf_error +mem_error +stream_error +stream_end +already_initialized +not_initialized +sub_get +sub +handle_sys_task +handle_incoming_signals +done +erts_dirty_process_signal_handler +send_clean_req +call_check +unexpected +passive +send_copy_req +send_copy_reqs +check_send_copy_req +switch_area +not_handled_message +working +idle +msg_loop +trace_running_procs +enabled_running_procs +trace_send +trace_running_ports +trace_receive +trace_procs +trace_ports +trace_garbage_collection +trace_call +enabled_send +enabled_running_ports +enabled_receive +enabled_procs +enabled_ports +enabled_garbage_collection +enabled_call +'-inlined-behaviour_info/1-' +optional_callbacks +callbacks +behaviour_info +nif_not_loaded +argument_list_decode_failure +ets_info_binary_iter +ets_info_binary_error +sched_wall_time +kernel_refc +find_lac +code_purger +literal_area_collector +set_code_and_literal_cleaner_prio +'@flush_monitor_messages_refopt' +mc_refill +is_map_iter +mc_iterator +get_cpc_opts +mseg_alloc +allow_gc +'-inlined-error_with_inherited_info/3-' +ensure_tracer_module_loaded +gc_info +schedulers +receive_allocator +insert_info +instance +insert_instance +mk_res_list +get_alloc_info +process_table +module_table +module_refs +loaded_code +fun_table +external_alloc +export_table +export_list +ets_misc +atom_table +atom_space +aa_mem_data +receive_emd +fix_alloc +au_mem_data +sbcs +mbcs_pool +mbcs +au_mem_current +au_mem_blocks_1 +blocks +au_mem_blocks +acc_blocks_size +ets_alloc +eheap_alloc +binary_alloc +au_mem_acc +au_mem_fix +fix_types +fix_proc +proc +msg_ref +ll_ptimer +hl_ptimer +bif_timer +accessor_bif_timer +get_fix_proc +get_memval +memory_1 +rvrs +processor_node +cput_i2e_tag +cput_i2e_tag_map +cput_i2e +cput_e2i +logical +thread +processor +core +cput_e2i_clvl +internal_cpu_topology +get_cookie +auth +set_cookie +passive_cnct +send_nosuspend +fun_info_1 +disconnect +disconnect_node +crasher +new_stacktrace +prepare_loading_1 +is_alive +garbage_collect_message_area +get_gc_opts +gcopt +stderr +bad_option +radix +digits_per_small +trim_zeroes +get_sign +combine_pairs +combine +segmentize_1 +segmentize +big_binary_to_int +clean +'no server found' +ebusy +std_error +error_report +file_error +invalid_current_directory +'-prim_read_file_info/3-inlined-0-' +'-prim_read_file/2-inlined-0-' +'-prim_list_dir/2-inlined-0-' +'-open_archive/4-inlined-0-' +'-foldl_archive/3-inlined-0-' +'-start/0-fun-0-' +'-efile_get_mods_par/3-fun-0-' +'-efile_gm_spawn_1/5-fun-0-' +'-prim_read_file/2-fun-0-' +'-prim_list_dir/2-fun-0-' +'-prim_read_file_info/3-fun-0-' +'-open_archive/4-fun-0-' +'-ensure_virtual_dirs/6-fun-0-' +'-ensure_virtual_dirs/6-fun-1-' +'-foldl_archive/3-fun-0-' +'-load_prim_archive/3-fun-0-' +load_prim_archive +real_path +normalize +win32_pathtype +unix_pathtype +pathtype +absname_vr +volumerelative +relative +absolute +ipv4_addr +ipv4_address +ipv4_list +is_prefix +archive_split +no_match +string_match +no_split +archive +name_split +path_join +path_split +to_strs +keyins +keysort +deep_member +send_all +win32 +is_basename +clear_cache +cache_new +foldl_archive +ensure_virtual_dirs +open_archive +cache +apply_archive +prim_get_cwd +archive_read_file_info +prim_read_file_info +archive_list_dir +prim_list_dir +archive_read_file +prim_read_file +primary +prim_set_primary_archive +do_prim_purge_cache +prim_purge_cache +loader_debug +prim_init +port_error +ll_close +ll_open_set_bind +ll_udp_open +ll_tcp_connect +udp_options +tcp_timeout +tcp_options +inet_stop_port +inet_get_cwd +inet_read_link_info +inet_read_file_info +inet_read_file +inet_list_dir +inet_send_and_rcv +inet_get_file_from_port2 +inet_get_file_from_port1 +inet_get_file_from_port +inet_timeout_handler +inet_exit_port +find_collect +find_loop +connect_master +find_master +bad_return +gm_process +gm_arch_get +gm_get_mods +efile_gm_get_1 +efile_gm_get +efile_gm_spawn_1 +efile_gm_spawn +efile_gm_recv +efile_any_archives +efile_get_mods_par +handle_get_modules +efile_timeout_handler +efile_read_file_info +efile_read_file +efile_list_dir +efile_set_primary_archive +emfile +efile_get_file_from_port3 +efile_get_file_from_port2 +efile_get_file_from_port +handle_timeout +handle_exit +handle_stop +handle_get_cwd +handle_read_link_info +handle_read_file_info +handle_read_file +handle_list_dir +handle_purge_archive_cache +handle_set_primary_archive +handle_get_file +bad_state +report +enotdir +enoent +check_file_result +client_or_request +purge_archive_cache +set_primary_archive +get_path +get_loader_config +set_loader_config +init_ack +noport +efile +start_efile +hosts +start_inet +loader +prim_state +'-filter_fun/0-fun-0-' +'-include_acc/3-fun-0-' +'-get_cd_loop/11-fun-0-' +'-get_cd_loop/11-fun-1-' +'-get_cd_loop/11-fun-2-' +pwrite_binary +pwrite_iolist +skipper +skip_iolist +splitter +split_iolist +local_file_header +local_file_header_from_bin +bad_cd_file_header +cd_file_header +cd_file_header_from_bin +dos_date_time_to_datetime +add_extra_info +cd_file_header_to_file_info +eocd +eocd_and_comment_from_bin +regular +binary_io +set_file_info +prim_file_io +find_eocd_header +seek +bad_eocd +get_end_of_central_dir +get_filename_from_b2 +bad_central_directory +get_file_header +get_cd_loop +get_central_dir +offset_over_z_data_descriptor +unsupported_compression +get_z_all +bad_local_file_header +bad_local_file_offset +get_z_file +get_zip_input +lists_foldl +include_acc +illegal_filter +primzip_file +do_foldl +foldl +primzip +do_open +filter_fun_throw +filter_fun +prim_zip +skip_unicast +skip_multicast +skip_friendly_name +skip_dns_server +skip_anycast +include_wins_info +include_tunnel_bindingorder +include_prefix +include_gateways +include_all_interfaces +include_all_compartments +'-getaddrinfo/2-lc$^0/1-0-' +nif_if_names +nif_if_index2name +nif_if_name2index +nif_getservbyport +nif_getservbyname +nif_get_ip_address_table +nif_get_interface_info +nif_get_if_entry +nif_get_adapters_addresses +nif_getifaddrs +nif_getaddrinfo +nif_getnameinfo +nif_gethostname +if_names +if_index2name +if_name2index +get_ip_address_table +get_if_entry +get_interface_info +no_skips_no_includes +no_skips_all_includes +all_skips_no_includes +all_skips_all_includes +get_adapters_addresses +getaddrinfo +getnameinfo +peek_off +'-supports/2-inlined-0-' +'-init/0-fun-0-' +'-init/0-fun-1-' +'-init/0-fun-2-' +'-init/0-fun-3-' +'-init/0-fun-4-' +'-supports/1-fun-4-' +'-supports/1-fun-3-' +'-supports/1-fun-2-' +'-supports/1-fun-1-' +'-supports/1-fun-0-' +'-supports/2-fun-0-' +'-is_supported/2-fun-4-' +'-is_supported/2-fun-3-' +'-is_supported/2-fun-2-' +'-is_supported/2-fun-1-' +'-is_supported/2-fun-0-' +'-bind/3-lc$^0/1-0-' +'-enc_ioctl_flags/2-fun-0-' +'-merge_sockaddr/2-fun-0-' +'-enc_msg/1-fun-0-' +'-enc_cmsgs/2-lc$^0/1-0-' +level +'-dec_cmsgs/2-lc$^0/1-0-' +nif_cancel +nif_ioctl +nif_peername +nif_sockname +nif_getopt +nif_setopt +nif_shutdown +nif_finalize_close +nif_close +nif_recvmsg +nif_recvfrom +nif_recv +nif_sendfile +nif_sendv +nif_sendmsg +nif_sendto +nif_send +nif_accept +nif_listen +nif_connect +nif_bind +nif_open +nif_supports +nif_command +nif_info +p_get +p_put +ioctl_flag +invalid_ioctl_flag +invalid_socket_option +sndctrlbuf +rcvctrlbuf +rcvbuf +iow +controlling_process +otp +enc_sockopt +dec_cmsgs +enc_cmsgs +enc_msg +msg_flag +enc_msg_flags +enc_path +merge_sockaddr +enc_sockaddr +enc_protocol +enc_ioctl_flags +enc_ioctl_request +cancel +sifflags +ioctl_request +ioctl +value_spec +getopt_native +getopt_result +socket_option +setopt_common +setopt_native +finalize_close +recvmsg +sendv_result +sendv +improper_list +element_not_binary +invalid_iov +rest_iov +msg +with +ctrl +sendmsg_invalid +iov +sendmsg_result +completion +nth +domain +get_is_supported +p_get_is_supported +is_supported +is_supported_option +fold +supports +protocol +options_table +protocols_table +put_supports_table +msg_flags +ioctl_flags +ioctl_requests +options +protocols +socket_debug +debug_filename +use_registry +registry +unknown_monitor +unknown_socket +'-loop/1-fun-0-' +'-do_which_sockets/2-lc$^0/1-0-' +whoami +user_size +user_which_monitors +user_update +user_take +user_lookup +user_delete +sock_which_monitors +sock_update +sock_take +sock_lookup +mon_size +mon_update +mon_take +mon_lookup +mon_delete +do_cancel_monitor_socket +nosock +mon +msocket +do_monitor_socket +do_which_sockets +sock_size +socket +mk_down_msg +error_msg +mk_log_msg +log_msg +handle_unexpected_msg +handle_monitored_by2 +handle_monitored_by +handle_user_down_cleanup +handle_user_down +bad_request +send_down +handle_send_down +user_sock_delete_update +handle_delete_socket +handle_add_socket +sendfile_deferred_close +del +'$socket' +which_monitors +number_of_monitors +cancel_monitor +which_sockets +number_of +socket_registry +enqueue_nif +enqueue_input_1 +enqueue_input +bad_memlevel +arg_mem +bad_windowbits +arg_bitsz +bad_eos_behavior +arg_eos_behavior +bad_compression_method +arg_method +bad_compression_strategy +rle +huffman_only +filtered +arg_strategy +bad_compression_level +best_speed +best_compression +arg_level +bad_flush_mode +full +arg_flush +getStash_nif +setStash_nif +clearStash_nif +restore_progress +save_progress +append_iolist +dequeue_next_chunk +finished +dequeue_all_chunks_1 +dequeue_all_chunks +gunzip +gzip +unzip +zip +data_error +uncompress +finish +compress +inflateEnd_nif +inflateEnd +safeInflate +need_dictionary +inflate_opts +inflate_nif +exception_on_need_dict +inflate +inflateReset_nif +inflateReset +inflateGetDictionary_nif +not_supported +inflateGetDictionary +inflateSetDictionary_nif +inflateSetDictionary +inflateInit_nif +cut +inflateInit +deflateEnd_nif +deflateEnd +deflate_nif +zlib_opts +deflate_opts +deflateParams_nif +deflate +deflateParams +deflateReset_nif +deflateReset +deflateSetDictionary_nif +deflateSetDictionary +deflateInit_nif +deflated +deflateInit +set_controller_nif +set_controlling_process +to_posix_seconds +from_posix_seconds +is_path_translatable +decode_path +encode_path +proplist_get_value +reverse_list +altname_nif +get_cwd_nif +set_cwd_nif +get_device_cwd_nif +del_dir_nif +del_file_nif +make_dir_nif +rename_nif +make_soft_link_nif +make_hard_link_nif +read_info_nif +read_link_nif +list_dir_nif +altname +make_symlink +make_link +del_dir +make_dir +set_cwd +get_dcwd +file_info_convert_ctime +file_info_convert_mtime +universal +file_info_convert_atime +throw_on_error +set_time_nif +set_time +set_permissions_nif +set_permissions +set_owner_nif +set_owner +write_file_info_1 +write_file_info +posix +adjust_times +read_handle_info_1 +read_handle_info +read_info_1 +read_link_info +no_translation +gl +list_dir_convert +list_dir_1 +list_dir_all +list_dir +translate_raw_name +read_link_1 +read_link_all +read_link +write_file +read_file_nif +read_file +read_handle_info_nif +delayed_close_nif +get_handle_nif +truncate_nif +allocate_nif +advise_nif +sync_nif +seek_nif +pwrite_nif +pread_nif +write_nif +read_nif +close_nif +file_desc_to_ref_nif +open_nif +fill_fd_option_map +build_fd_data +not_on_controlling_process +get_fd_data +reset_write_position +get_handle +ipread_s32bu_p32bu_nif +ipread_s32bu_p32bu +internal_get_nif_resource +sequential +pwrite_list +pwrite_plain +pwrite +pread_list +pread +position_1 +bof +cur +datasync +allocate +advise +truncate +write_1 +read_line_1 +read_line +read_1 +r_ahead_size +r_buffer +make_fd +file_desc_to_ref +copy_opened +file_descriptor +helper_loop +bound +connecting +accepting +multicast +no_pointtopoint +no_broadcast +down +up +term +ssl +eprotonosupport +'-bindx/3-lc$^0/1-0-' +'-type_value_2/2-fun-1-' +'-type_value_2/2-fun-0-' +'-enc_value_2/2-lc$^0/1-1-' +'-enc_value_2/2-lc$^1/1-0-' +ctl_cmd +get_ip6 +get_ip4 +get_ip +get_addr +get_addrs +ip6_loopback +ip6_any +ip6_to_bytes +ip4_loopback +ip4_any +ip4_to_bytes +utf8_to_characters +tree +ktree_keys +ktree_update +ktree_insert +ktree_get +is_defined +ktree_is_defined +ktree_empty +len +rev +build_iflist +build_ifaddrs_opts +build_ifaddrs +encode_ifname +enc_time +dec_status +dec_stats +decode_stats +send_oct +send_max +send_cnt +send_avg +recv_oct +recv_max +recv_dvi +recv_cnt +recv_avg +enc_stats +encode_stats +subs_empty_out_q +dec_subs +decode_subs +enc_subs +encode_subs +encode_ifopt_val +encode_ifopts +decode_ifopts +dec_ifopt +enc_ifopt +mtu +dstaddr +broadaddr +type_ifopt +merge_fields +merge_options +need_template +dec +dec_opt_val +decode_opt_val +enc_opts +encode_opts +enc_opt_val +encode_opt_val +enum_name +enum_val +enum_names +enum_vals +borlist +dec_value_tuple +decode +dec_value +flowinfo +scope_id +enc_value_2 +enc_value_tuple +enc_value_1 +enc_value_default +enc_value +family +loopback +uint8 +uint24 +uint16 +sockaddr +sctp_assoc_id +linkaddr +ether +bool8 +binary_or_uint +enum +bitenumlist +type_value_2 +type_value_record +type_value_tuple +type_value_1 +type_value_default +record +type_value +membership +int +uint +mif +opts +type_opt_1 +type_opt +dec_opt +show_econnreset +send_timeout_close +send_timeout +read_packets +read_ahead +pktoptions +nopush +non_block_send +nodelay +multicast_ttl +multicast_loop +multicast_if +low_watermark +low_msgq_watermark +keepalive +high_watermark +high_msgq_watermark +header +exit_on_close +drop_membership +deliver +delay_send +add_membership +enc_opt +is_sockopt_val +attach +detach +unrecv +getservbyport1 +getservbyport +getservbyname1 +getservbyname +gethostname +getstatus +getprotocol +gettype +getindex +ignorefd +getfd +getstat +subscribe +ifset +ifget +getiflist +netmask +broadcast +pointtopoint +getifaddrs_ifget +hwaddr +hwaddr_last +comp_ifaddrs_3 +comp_ifaddrs_2 +comp_ifaddrs_flags +comp_ifaddrs +enotsup +getifaddrs +chgopts +chgopt +getopts +getopt +setopt +socknames +setsockname +sockname +peernames +setpeername +peername +recvfrom0 +recvfrom +async_recv +recv0 +recv +sendfile_1 +sendfile_maybe_uncork +sendfile_maybe_cork +sendmsg +uint32 +do_sendto +sendto +peeloff +listen +async_accept +accept_opts +accept0 +accept +addr_list +connectx +connect_cmd +connect_time +connect_addr +async_connect +sync +bindx_check_addrs +bindx +addr +do_bind +bind +send_pend +close_pend_loop +close_port +shutdown_1 +read_write +drv2protocol +protocol2drv +seqpacket +dgram +enc_type +inet6 +enc_family +bool +fdopen +prim_inet +arg_reg_alloc +prim_eval +peek_head +copying_read +unlock +try_lock +find_byte_index +wipe +write +read_iovec +read +shutdown_timeout +not_allowed +starting +'-notify/1-fun-0-' +'-get_pids/2-lc$^0/1-0-' +'-do_boot/2-fun-0-' +'-eval_script/2-fun-2-' +'-eval_script/2-fun-3-' +'-eval_script/2-fun-1-' +'-eval_script/2-fun-0-' +'-load_modules/2-lc$^0/1-0-' +'-load_modules/2-lc$^1/1-2-' +'-load_modules/2-lc$^2/1-3-' +'-load_modules/2-lc$^3/1-4-' +'-load_modules/2-lc$^4/1-1-' +prepared +'-prepare_loading_fun/0-fun-0-' +'-patch_path/2-lc$^0/1-0-' +'-patch_dir/2-lc$^0/1-1-' +'-patch_dir/2-lc$^1/1-0-' +'-shutdown_timer/1-fun-0-' +'-parse_boot_args/4-fun-0-' +'-run_on_load_handlers/2-fun-0-' +'-run_on_load_handler/2-fun-0-' +standard_error +format +io_lib +'-debug_profile_format_mfas/1-fun-0-' +'-collect_loaded_mfas/0-lc$^1/1-0-' +'-collect_loaded_mfas/0-lc$^0/1-1-' +bad_generator +'-collect_loaded_mfas/2-lc$^0/1-0-' +collect_mfa +collect_mfas +all_loaded +collect_loaded_mfas +sort +debug_profile_format_mfas +snifs +debug_profile_mfas +debug_profile_stop +debug_profile_start +on_load_function_failed +on_load_handler_returned_ok +spawn_monitor +run_on_load_handler +running_on_load_handler +on_load_loop +on_load_handler_init +start_on_load_handler_process +run_on_load +run_on_load_handlers +archive_extension +objfile_extension +set_argument +get_argument1 +to_strings +get_flag_args +get_flag_list +get_flag +update_flag +get_args +has_end_args +flag +start_extra_arg +start_arg2 +start_arg +eval_arg +ending_start_arg +end_args +arg +parse_boot_args +timer +flush_timout +shutdown_time +shutdown_timer +load_module +do_load_module +explain_add_head +otp_release +nofile +explain_ensure_loaded_error +exprs +new_bindings +erl_eval +parse_exprs +erl_parse +erl_anno +dot +erl_scan +eval +start_it +start_em +start_in_kernel +join +funny_splitwith +funny_split +directory +file_info +read_file_info +patch_dir +patch_path +extract_var +add_var +fix_path +make_path +prepare_loading_fun +load_rest +load_failed +get_modules +load_modules +'unexpected command in bootfile' +kernel_load_completed +primLoad +preLoaded +kernelProcess +eval_script +get_cwd +script +'bootfile format error' +'cannot get bootfile' +not_found +get_boot +pz +pa +path_flags +bootfile +invalid_boot_var_argument +boot_var +get_boot_vars_1 +get_boot_vars +no_or_multiple_bindir_variables +bindir +check_bindir +no_or_multiple_root_variables +root +get_root +es +init__boot__on_load_handler +init_debug_flag +init_debug +path +do_boot +add_to_kernel +set_path +start_prim_loader +kernel_pid +terminate +do_unload +logger_server +unload +kill_all_ports +kill_em +get_pids +kill_all_pids +resend +shutdown_loop +shutdown_kernel_pid +get_kernelpid +get_logger +heart +get_heart +prepare_shutdown +global_name_server +global_prepare_shutdown +shutdown_pids +stop_heart +clear_system +do_restart +do_stop +should_unload +stopping +set_flag +config +stdout +io_request +user +do_handle_msg +new_state +handle_msg +loop +new_kernelpid +garb_boot_loop +foreach +get_file +erl_prim_loader +do_ensure_loaded +terminating +progress +boot_loop +crash +halt_string +things_to_string +state +strict +relaxed +code_path_choice +map +b2s +b2a +run_args_to_start_instructions +run_args_to_mfa +interpolate_empty_mfa_args +fold_eval_args +profile_boot +stop_1 +is_bytelist +reboot +interactive +embedded +request +wait_until_started +notify_when_started +make_permanent +ensure_loaded +fetch_loaded +get_status +bs2ss +bs2as +set_script_name +absname +filename +get_script_name +script_name +script_id +get_argument +get_plain_arguments +get_arguments +set_configfd +get_configfd +done_in_microseconds +debug +'-start/2-fun-0-' +'-restart/0-fun-0-' +if_loaded +fatal +boot +continue +died +test_progress +do_test_hard_purge +continued +started +do_test_soft_purge +do_test_purge +cpc_make_requests +cpc_request +cpc_sched_kill +cpc_sched_kill_waiting +cpc_list_rm +cpc_handle_down +cpc_reverse +cpc_result +cpc_receive +cpc_kill +cpc_static +check_proc_code +do_finish_after_on_load +do_soft_purge +do_purge +check_requests +soft_purge +purge +change_prio +test_purge +handle_request +wait_for_request +sleep +other +gc +check_io +aux +prim_net +prim_socket +zlib +prim_buffer +prim_tty +'TRACE' +'DELETE' +'PUT' +'POST' +'HEAD' +'GET' +'OPTIONS' +'Proxy-Connection' +'Keep-Alive' +'Cookie' +'X-Forwarded-For' +'Set-Cookie2' +'Set-Cookie' +'Accept-Ranges' +'Last-Modified' +'Expires' +'Etag' +'Content-Type' +'Content-Range' +'Content-Md5' +'Content-Location' +'Content-Length' +'Content-Language' +'Content-Encoding' +'Content-Base' +'Allow' +'Www-Authenticate' +'Warning' +'Vary' +'Server' +'Retry-After' +'Public' +'Proxy-Authenticate' +'Location' +'Age' +'User-Agent' +'Referer' +'Range' +'Proxy-Authorization' +'Max-Forwards' +'If-Unmodified-Since' +'If-Range' +'If-None-Match' +'If-Match' +'If-Modified-Since' +'Host' +'From' +'Authorization' +'Accept-Language' +'Accept-Encoding' +'Accept-Charset' +'Accept' +'Via' +'Upgrade' +'Transfer-Encoding' +'Pragma' +'Date' +'Connection' +'Cache-Control' +process_low +process_normal +process_high +process_max +characters_to_list_trap_4 +characters_to_list_trap_3 +characters_to_list_trap_2 +characters_to_list_trap_1 +characters_to_utf8_trap +md5_trap +ram_file_drv +sctp_inet +shutdown_ack_sent +shutdown_received +shutdown_sent +shutdown_pending +established +cookie_echoed +cookie_wait +empty +unconfirmed +sackdelay_disable +sackdelay_enable +pmtud_disable +pmtud_enable +hb_demand +hb_disable +hb_enable +partial_delivery_aborted +wrong_anc_data +short_recv +addr_confirmed +addr_made_prim +addr_added +addr_removed +addr_unreachable +addr_available +cant_assoc +shutdown_comp +comm_lost +comm_up +addr_over +unordered +sctp_paddrinfo +sctp_assoc_value +sctp_event_subscribe +sctp_paddrparams +sctp_setadaptation +sctp_setpeerprim +sctp_prim +sctp_assocparams +sctp_pdapi_event +sctp_adaptation_event +sctp_shutdown_event +sctp_send_failed +sctp_remote_error +sctp_paddr_change +sctp_assoc_change +sctp_sndrcvinfo +sctp_get_peer_addr_info +sctp_status +sctp_delayed_ack_time +sctp_events +sctp_default_send_param +sctp_peer_addr_params +sctp_adaptation_layer +sctp_primary_addr +sctp_set_peer_primary_addr +sctp_maxseg +sctp_i_want_mapped_v4_addr +sctp_disable_fragments +sctp_nodelay +sctp_autoclose +sctp_initmsg +sctp_associnfo +sctp_rtoinfo +bind_to_device +netns +ipv6_v6only +recvttl +recvtclass +recvtos +dontroute +exclusiveaddruse +reuseport_lb +reuseport +reuseaddr +sndbuf +recbuf +linger +multi +once +mode +buffer +sctp_error +sctp_passive +sctp +udp_inet +tcp_inet +sendfile +ttl +tclass +tos +empty_out_q +udp_error +udp_passive +tcp_error +tcp_closed +tcp_passive +inet_reply +inet_async +udp +tcp +unspec +inet +spawn_forker +delete_trap +select_trap +replace_trap +count_trap +select_delete_trap +linux +unix +erts_beamasm +send_trace_clean_signal +check +erts_trace_cleaner +trace_session_destroy +trace_session_create +set_coverage_mode +reset_coverage +get_coverage +get_coverage_mode +coverage_support +term_to_string +list_to_integer +binary_to_integer +from_keys +unalias +beamfile_module_md5 +beamfile_chunk +prepare_loading +get_creation +abort_pending_connection +ets_raw_next +ets_raw_first +ets_lookup_binary_info +spawn_system_process +counters_info +counters_put +counters_add +counters_get +counters_new +compare_exchange +exchange +add_get +add +atomics +atomics_new +erase_persistent_terms +persistent_term +internal_select_delete +internal_delete_all +is_map_key +map_get +gather_carrier_info +gather_alloc_histograms +map_next +new_connection +get_dflags +iolist_to_iovec +set_signal +fmod +ceil +floor +has_prepared_code_on_load +copy_shared +size_shared +split +purge_module +check_dirty_process_code +is_process_executing_dirty +map_info +fun_info_mfa +take +cmp_term +values +update +remove +merge +keys +is_key +from_list +find +maps +map_size +is_map +inspect +printable_range +binary_to_float +float_to_binary +integer_to_binary +delete_element +insert_element +finish_loading +dt_append_vm_tag_data +dt_prepend_vm_tag_data +dt_restore_tag +dt_spread_tag +dt_get_tag_data +dt_get_tag +dt_put_tag +posixtime_to_universaltime +universaltime_to_posixtime +check_old_code +native_name_encoding +file +is_translatable +internal_normalize_utf8 +internal_native2name +internal_name2native +prim_file +nif_error +decode_unsigned +encode_unsigned +referenced_byte_size +list_to_bin +part +at +longest_common_suffix +longest_common_prefix +matches +compile_pattern +binary_part +finish_after_on_load +call_on_load_function +load_nif +setopts +give_away +dflag_unicode_io +binary_to_existing_atom +binary_to_atom +atom_to_binary +bin_is_7bit +characters_to_list +characters_to_binary +decode_packet +update_element +bitstring_to_list +list_to_bitstring +bit_size +byte_size +tuple_size +is_bitstring +list_to_existing_atom +iolist_to_binary +iolist_size +make_fun +string +is_boolean +get_module_info +warning_map +hibernate +lcnt_clear +lcnt_collect +lcnt_control +dirty +interpreter_size +instructions +dist_ext_to_term +set_internal_state +get_internal_state +flat_size +same +disassemble +keyfind +keysearch +keymember +reverse +lists +internal_run +run +format_error_int +loaded_drivers +try_unload +try_load +erl_ddll +perf_counter +getpid +unsetenv +putenv +getenv +os +match_spec_run_r +match_spec_compile +select_replace +select_reverse +select_count +select +update_counter +slot +safe_fixtable +rename +insert_new +insert +prev_lookup +prev +next_lookup +next +member +match_object +last_lookup +last +lookup_element +lookup +is_compiled_ms +first_lookup +delete_object +delete +internal_request_all +match_spec_test +is_record +is_function +is_binary +is_reference +is_port +is_pid +is_number +is_integer +is_float +is_tuple +is_list +is_atom +subtract +append +'!' +is_builtin +raise +is_process_alive +fun_to_list +port_to_list +ref_to_list +system_profile +system_monitor +system_info +system_flag +append_element +make_tuple +read_timer +cancel_timer +send_after +start_timer +pow +atan2 +sqrt +log10 +log2 +log +exp +erfc +erf +atanh +atan +asinh +asin +acosh +acos +tanh +tan +sinh +sin +cosh +cos +math +bump_reductions +resume_process +suspend_process +seq_trace_print +seq_trace_info +seq_trace +trace_delivered +trace_info +trace_pattern +port_get_data +port_set_data +send_copy_request +release_area_switch +erts_literal_area_collector +spawn_request_abandon +no_aux_work_threads +dist_spawn_request +ets_super_user +create_dist_channel +dirty_process_handle_signals +system_check +is_system_process +perf_counter_unit +time_unit +map_hashmap_children +term_type +map_to_tuple_keys +check_process_code +request_system_task +port_connect +port_close +port_control +port_command +port_call +port_info +dist_ctrl_set_opt +dist_ctrl_get_opt +dist_ctrl_get_data_notification +dist_ctrl_get_data +dist_ctrl_input_handler +dist_get_stat +setnode +spawn_opt +whereis +unlink +universaltime_to_localtime +universaltime +tuple_to_list +trunc +tl +time +term_to_iovec +term_to_binary +statistics +split_binary +spawn_link +spawn +setelement +self +round +registered +put +process_info +process_flag +pre_loaded +pid_to_list +open_port +system_time +monotonic_time +now +nodes +monitor_node +function_exported +module_loaded +md5_final +md5_update +md5_init +unique_integer +make_ref +localtime_to_universaltime +localtime +list_to_tuple +list_to_ref +list_to_port +list_to_pid +list_to_float +list_to_binary +list_to_atom +link +length +integer_to_list +hd +phash2 +phash +halt +get_keys +get +fun_info +float_to_list +float +external_size +exit_signal +erase +element +display_string +display +delete_module +date +crc32_combine +crc32 +binary_to_term +binary_to_list +atom_to_list +adler32_combine +adler32 +abs +debug_hash_fixed_number_of_locks +auto +nifs +yield +yes +x86 +xor +write_concurrency +wordsize +warning_msg +warning +wall_clock +waiting +wait_release_literal_area_switch +visible +version +value +unsafe +unload_cancelled +unloaded_only +unloaded +unless_suspending +unit +uniq +unblock_normal +unblock +utf32 +utf16 +utf8 +used +use_stdio +urun +unregister +unicode +ungreedy +undef +explicit_unalias +ucp +ucompile +type +try_clause +trim_all +trim +trap_exit +tracer +trace_status +trace_control_word +traced +trace +tpkt +total_run_queue_lengths_all +total_run_queue_lengths +total_heap_size +total_active_tasks_all +total_active_tasks +total +timestamp +'*' +timeout_value +time_offset +threads +thread_pool_size +this +term_to_binary_trap +tag +table_type +table +system_architecture +system_version +system_limit +system_flag_scheduler_wall_time +system +suspending +suspended +suspend +sunrm +success_only +strict_monotonic_timestamp +strict_monotonic +stream +stop +stderr_to_stdout +status +start +stack_size +ssl_tls +spawned +spawn_service +spawn_request_yield +spawn_request +spawn_reply +spawn_init +spawn_driver +spawn_executable +skip +size +silent +sigquit +sigtstp +sigsegv +sigint +sigstop +sigalrm +sigabrt +sigchld +sigill +sigusr2 +sigusr1 +sigterm +signed +sighup +shutdown +short +set_tcw_fake +set_tcw +set_seq_token +set_on_spawn +set_on_link +set_on_first_spawn +set_on_first_link +set_cpu_topology +set +session +serial +sequential_trace_token +sequential_tracer +sensitive +send_to_non_existing_process +send +seconds +second +scope +scientific +scheme +schedulers_online +scheduler_wall_time_all +scheduler_wall_time +scheduler_id +scheduler +sbct +save_calls +safe +runtime +running_procs +running_ports +running +runnable_procs +runnable_ports +runnable +run_queue_lengths_all +run_queue_lengths +run_queue +run_process +reuse +return_trace +return_to_trace +return_to +return_from +resume +restart +reset_seq_trace +reset +report_errors +reply_tag +reply_demonitor +reply +rem +reload +registered_name +register +refc +reductions +recent_size +receive +reason +ready_output +ready_input +ready_error +read_concurrency +re_run_trap +re_pattern +re +raw +queue_size +public +ptab_list_continue +protection +protected +profile +proc_sig +procs +process_dump +process_limit +'$process_label' +process_display +process_count +processes_used +processes +process +private_append +private +priority +print +prepare_on_load +prepare +position +positive +port_op +port_limit +port_count +ports +port +pid +permanent +pending_reload +pending_purge_lambda +pending_process +pending_driver +pending +pause +'++' +'+' +parent +parallelism +packet_size +packet +owner +overlapped_io +outstanding_system_requests_limit +output +out_exiting +out_exited +out +os_version +os_type +os_pid +orelse +ordered_set +or +opt +open_error +open +on_load +on_heap +old_heap_size +old_heap_block_size +ok +offset +off_heap +nouse_stdio +notsup +notify +notempty_atstart +notempty +noteol +notbol +notalive +not_purged +not_owner +not_pending +not_loaded_by_this_process +not_loaded +not_a_list +not +not_suspended +no_start_optimize +no_network +no_integer +no_float +no_fail +nosuspend +normal_exit +noproc +noeol +nodeup +nodedown_reason +nodedown +node_type +node +noconnection +noconnect +no_auto_capture +nomatch +newline +new_uniq +new_ports +new_processes +new_index +new +never_utf +net_kernel_terminated +net_kernel +'/=' +'=/=' +need_gc +native_addresses +native +namelist +named_table +name +nanosecond +nano_seconds +multiline +multi_scheduling +more +monotonic_timestamp +monotonic +monitors +monitor_nodes +monitor +monitored_by +module_info +module +'--' +'-' +minor_version +minor +min_bin_vheap_size +min_heap_size +min +millisecond +milli_seconds +microstate_accounting +microsecond +micro_seconds +meta_match_spec +meta +merge_trap +messages +message_queue_len +message_queue_data +message +memory_types +memory_internal +memory +md5 +mbuf_size +max_heap_size +maximum +max +match_spec_result +match_spec +match_limit_recursion +match_limit +match +major +magic_ref +machine +'<' +low +long_schedule +long_message_queue +long_gc +logger +local +load_failure +load_cancelled +loaded +little +list_to_bitstring_continue +list +links +linked_in_driver +line_length +line_delimiter +line_counters +line +lf +legacy +'=<' +ldflags +latin1 +last_calls +large_heap +label +known +kill_ports +killed +kill +keypos +iovec +iodata +iolist_to_iovec_continue +iolist_size_continue +io +iterator +is_seq_trace +is_constant +invalid +instruction_counts +internal_error +internal +integer +input +inplace +initial_call +init +inherit +info_trap +info_msg +info +index +inconsistent +incomplete +include_shared_binaries +inactive +in_exiting +in +ignore +if_clause +id +httph_bin +http_bin +http_error +http_eoh +http_header +http_request +http_response +https +httph +http +high +hide +hidden +heir +heart_port +heap_type +heap_sizes +heap_size +heap_block_size +have_dt_utag +handle +group_leader +grun +'>' +global +getting_unlinked +getting_linked +gather_system_check_result +gather_sched_wall_time_result +gather_microstate_accounting_result +gather_io_bytes +gather_gc_info_result +get_tcw +get_tail +get_size +get_seq_token +get_internal_state_blocked +get_all_trap +generational +'>=' +gc_minor_start +gc_minor_end +gc_max_heap_size +gc_major_start +gc_major_end +garbage_collection_info +garbage_collection +garbage_collecting +garbage_collect +function_clause +functions +function_counters +function +fullsweep_after +free +format_cpu_topology +format_bs_fail +force +flush_timeout +flush_monitor_messages +flush +flags +firstline +first +fd +fcgi +extra +external +extended +exports +exiting +existing_ports +existing_processes +existing +exited +exit_status +exclusive +exception_trace +exception_from +exact_reductions +'ETS-TRANSFER' +ets_info_binary +ets +erts_internal +erts_dflags +erts_debug +erts_code_purger +error_only +error_logger +error_info +error_handler +erl_signal_server +erlang +erl_tracer +erl_stdlib_errors +erl_kernel_errors +erl_init +erl_erts_errors +'==' +'=:=' +eol +eof +ensure_exactly +ensure_at_least +env +endian +enabled +enable_trace +emulator +emu_type +emu_flavor +einval +dynamic_node_name +dupnames +duplicated +duplicate_bag +dsend_continue_trap +driver_options +driver +dotall +dollar_endonly +'$_' +'$$' +dmonitor_node +div +'/' +dist_spawn_init +dist_data +dist_ctrlr +dist_ctrl_put_data +dist_cmd +dist +discard +disabled +disable_trace +dirty_nif_finalizer +dirty_nif_exception +dirty_io +dirty_execution +dirty_cpu_schedulers_online +dirty_cpu +dirty_bif_trap +dirty_bif_result +dirty_bif_exception +dictionary +deterministic +demonitor +delay_trap +default +decimals +decentralized_counters +debug_flags +data +current_stacktrace +current_location +current_function +creation +crlf +cr +cpu_timestamp +cpu +count +counters +copy_literals +copy +control +continue_exit +context_switches +const +connection_id +connection_closed +connected +connect +convert_time_unit +config_h +compressed +complete +compile +compat_rel +compact +commandv +command +code +closed +close +clock_service +clear +check_gc +characters_to_list_int +characters_to_binary_int +'CHANGE' +cflags +cdr +cd +cause +catchlevel +caseless +case_clause +capture +caller_line +caller +call_trace_return +call_time +call_memory +call_error_handler +call_count +busy_port +busy_limits_msgq +busy_limits_port +busy_dist_port +busy +build_type +build_flavor +bsr_unicode +bsr_anycrlf +bsr +bsl +breakpoint +break_ignored +bxor +bor +bnot +bm +blocked_normal +blocked +block_normal +block +binary_to_term_trap +binary_to_list_continue +binary_longest_suffix_trap +binary_longest_prefix_trap +binary_find_trap +binary_copy_trap +binary +bif_return_trap +bif_handle_signals_return +big +band +bag +bad_map_iterator +badtype +badopt +badsig +badrecord +badmatch +badmap +badkey +badfun +badfile +badarity +badarith +badarg +backtrace_depth +backtrace +awaiting_unload +awaiting_load +await_sched_wall_time_modifications +await_result +await_proc_exit +await_port_send_result +await_microstate_accounting_modifications +await_exit +auto_connect +attributes +atom_used +atom +asynchronous +async_dist +async +asn1 +arity +arg0 +args +apply +anycrlf +any +andthen +andalso +and +anchored +amd64 +already_loaded +already_exists +allow_passive_connect +alloc_util_allocators +allocator_sizes +allocator +allocated_areas +allocated +alloc_sizes +alloc_info +all_names +all_but_first +all +alive +alias +active_tasks_all +active_tasks +active +access +ac +absoluteURI +abs_path +abort +abandoned +'EXIT' +'UP' +'DOWN' +none +no +nil +undefined_lambda +undefined_function +nocatch +undefined +exit +error +throw +return +call +normal +timeout +infinity +'' +'$end_of_table' +'nonode@nohost' +'_' +true +false +=end diff --git a/ex/guix.scm b/ex/guix.scm new file mode 100644 index 0000000..a464b55 --- /dev/null +++ b/ex/guix.scm @@ -0,0 +1,18 @@ +; SPDX-License-Identifier: MPL-2.0 +;; guix.scm — GNU Guix package definition for a2ml_ex +;; Usage: guix shell -f guix.scm + +(use-modules (guix packages) + (guix build-system gnu) + (guix licenses)) + +(package + (name "a2ml_ex") + (version "0.1.0") + (source #f) + (build-system gnu-build-system) + (synopsis "a2ml_ex") + (description "a2ml_ex — part of the hyperpolymath ecosystem.") + (home-page "https://github.com/hyperpolymath/a2ml_ex") + (license ((@@ (guix licenses) license) "MPL-2.0" + "https://github.com/hyperpolymath/palimpsest-license"))) diff --git a/ex/k9iser.toml b/ex/k9iser.toml new file mode 100644 index 0000000..8a1a660 --- /dev/null +++ b/ex/k9iser.toml @@ -0,0 +1,23 @@ +# SPDX-License-Identifier: MPL-2.0 +# Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) +# +# k9iser manifest for a2ml_ex +# A2ML Elixir implementation — Mix-based parser and validator for the A2ML format + +[project] +name = "a2ml_ex" +safety_tier = "hunt" + +[[source]] +path = "mix.exs" +type = "mix" +output = "generated/k9iser/mix-project.k9" + +[[source]] +path = "Justfile" +type = "justfile" +output = "generated/k9iser/justfile-recipes.k9" + +[[constraint]] +rule = "build.dependencies has no banned_packages" +severity = "error" diff --git a/ex/lib/a2_ml.ex b/ex/lib/a2_ml.ex new file mode 100644 index 0000000..c4ff76e --- /dev/null +++ b/ex/lib/a2_ml.ex @@ -0,0 +1,42 @@ +# SPDX-License-Identifier: MPL-2.0 +# (MPL-2.0 preferred; MPL-2.0 required for Hex.pm) + +defmodule A2ML do + @moduledoc """ + A2ML (AI Attestation Markup Language) parser and renderer. + + Provides types, parsing, and rendering for A2ML documents — a lightweight + markup format designed for AI-generated content with provenance tracking + through attestation chains and trust levels. + + ## Quick Start + + iex> {:ok, doc} = A2ML.parse("# Hello\\n\\n@version 1.0\\n\\nA paragraph.") + iex> A2ML.render(doc) + + ## Modules + + - `A2ML.Types` — Core data structures (Document, Block, Attestation, etc.) + - `A2ML.Parser` — Parse A2ML text into a Document AST + - `A2ML.Renderer` — Render a Document AST back to A2ML text + """ + + alias A2ML.Parser + alias A2ML.Renderer + + @doc """ + Parse an A2ML-formatted string into a Document. + + Delegates to `A2ML.Parser.parse/1`. + """ + @spec parse(String.t()) :: {:ok, A2ML.Types.Document.t()} | {:error, term()} + defdelegate parse(input), to: Parser + + @doc """ + Render a Document back to A2ML-formatted text. + + Delegates to `A2ML.Renderer.render/1`. + """ + @spec render(A2ML.Types.Document.t()) :: String.t() + defdelegate render(doc), to: Renderer +end diff --git a/ex/lib/a2ml/parser.ex b/ex/lib/a2ml/parser.ex new file mode 100644 index 0000000..e1dc1ea --- /dev/null +++ b/ex/lib/a2ml/parser.ex @@ -0,0 +1,453 @@ +# SPDX-License-Identifier: MPL-2.0 +# (MPL-2.0 preferred; MPL-2.0 required for Hex.pm) + +defmodule A2ML.Parser do + @moduledoc """ + A2ML document parser. + + Parses A2ML-formatted text into a structured `A2ML.Types.Document` AST. + A2ML syntax is similar to Markdown with extensions for directives (`@`) + and attestation blocks (`!attest`). + """ + + alias A2ML.Types.{Attestation, Directive, Document, TrustLevel} + + @doc """ + Parse an A2ML-formatted string into a Document. + + Returns `{:ok, document}` on success or `{:error, reason}` on failure. + + ## Examples + + iex> A2ML.Parser.parse("# Hello\\n\\nA paragraph.") + {:ok, %A2ML.Types.Document{title: "Hello", blocks: [_], ...}} + + """ + @spec parse(String.t()) :: {:ok, Document.t()} | {:error, term()} + def parse(input) when is_binary(input) do + trimmed = String.trim(input) + + case trimmed do + "" -> + {:error, :empty_input} + + _ -> + {:ok, parse_document(trimmed)} + end + end + + # --------------------------------------------------------------------------- + # Internal parsing + # --------------------------------------------------------------------------- + + defp parse_document(input) do + lines = String.split(input, "\n") + {title, rest_lines} = extract_title(lines) + blocks = parse_blocks(rest_lines) + + directives = extract_directives(blocks) + attestations = extract_attestations(blocks) + + %Document{ + title: title, + directives: directives, + blocks: blocks, + attestations: attestations + } + end + + defp extract_title([first | rest]) do + trimmed = String.trim(first) + + case trimmed do + "# " <> title -> {title, rest} + _ -> {nil, [first | rest]} + end + end + + defp extract_title([]), do: {nil, []} + + defp parse_blocks(lines), do: parse_blocks(lines, []) + + defp parse_blocks([], acc), do: Enum.reverse(acc) + + defp parse_blocks([line | rest], acc) do + trimmed = String.trim(line) + + cond do + # Skip blank lines. + trimmed == "" -> + parse_blocks(rest, acc) + + # Thematic break. + trimmed in ["---", "----", "-----"] -> + parse_blocks(rest, [:thematic_break | acc]) + + # Code block. + String.starts_with?(trimmed, "```") -> + lang = String.trim(String.slice(trimmed, 3..-1//1)) + lang = if lang == "", do: nil, else: lang + {code_lines, remaining} = collect_code_block(rest) + content = Enum.join(code_lines, "\n") + parse_blocks(remaining, [{:code_block, lang, content} | acc]) + + # Directive. + String.starts_with?(trimmed, "@") -> + directive = parse_directive_line(trimmed) + parse_blocks(rest, [{:directive, directive} | acc]) + + # Attestation. + String.starts_with?(trimmed, "!attest") -> + {attest_lines, remaining} = collect_indented_block(rest) + attestation = parse_attestation_block([trimmed | attest_lines]) + parse_blocks(remaining, [{:attestation, attestation} | acc]) + + # Heading. + String.starts_with?(trimmed, "#") -> + {level, text} = parse_heading_line(trimmed) + inlines = parse_inlines(text) + parse_blocks(rest, [{:heading, level, inlines} | acc]) + + # Block quote. + String.starts_with?(trimmed, ">") -> + {quote_lines, remaining} = collect_prefixed_block([line | rest], ">") + + stripped = + Enum.map(quote_lines, fn l -> + t = String.trim(l) + + cond do + String.starts_with?(t, "> ") -> String.slice(t, 2..-1//1) + String.starts_with?(t, ">") -> String.slice(t, 1..-1//1) + true -> t + end + end) + + inner_blocks = parse_blocks(stripped) + parse_blocks(remaining, [{:block_quote, inner_blocks} | acc]) + + # Unordered list. + String.starts_with?(trimmed, "- ") or String.starts_with?(trimmed, "* ") -> + {list_lines, remaining} = collect_list_block([line | rest]) + items = parse_list_items(list_lines, false) + parse_blocks(remaining, [{:list_block, false, items} | acc]) + + # Ordered list. + ordered_list_start?(trimmed) -> + {list_lines, remaining} = collect_list_block([line | rest]) + items = parse_list_items(list_lines, true) + parse_blocks(remaining, [{:list_block, true, items} | acc]) + + # Paragraph (default). + true -> + {para_lines, remaining} = collect_paragraph([line | rest]) + text = Enum.join(para_lines, " ") + inlines = parse_inlines(text) + parse_blocks(remaining, [{:paragraph, inlines} | acc]) + end + end + + defp collect_code_block(lines), do: collect_code_block(lines, []) + + defp collect_code_block([], acc), do: {Enum.reverse(acc), []} + + defp collect_code_block([line | rest], acc) do + if String.starts_with?(String.trim(line), "```") do + {Enum.reverse(acc), rest} + else + collect_code_block(rest, [line | acc]) + end + end + + defp collect_indented_block(lines), do: collect_indented_block(lines, []) + + defp collect_indented_block([], acc), do: {Enum.reverse(acc), []} + + defp collect_indented_block([line | rest] = lines, acc) do + if String.starts_with?(line, " ") or String.starts_with?(line, "\t") do + collect_indented_block(rest, [String.trim(line) | acc]) + else + {Enum.reverse(acc), lines} + end + end + + defp collect_prefixed_block(lines, prefix), + do: collect_prefixed_block(lines, prefix, []) + + defp collect_prefixed_block([], _prefix, acc), do: {Enum.reverse(acc), []} + + defp collect_prefixed_block([line | rest] = lines, prefix, acc) do + trimmed = String.trim(line) + + if String.starts_with?(trimmed, prefix) do + collect_prefixed_block(rest, prefix, [line | acc]) + else + {Enum.reverse(acc), lines} + end + end + + defp collect_list_block(lines), do: collect_list_block(lines, []) + + defp collect_list_block([], acc), do: {Enum.reverse(acc), []} + + defp collect_list_block([line | rest] = lines, acc) do + trimmed = String.trim(line) + + cond do + trimmed == "" -> + {Enum.reverse(acc), rest} + + String.starts_with?(trimmed, "- ") or + String.starts_with?(trimmed, "* ") or + ordered_list_start?(trimmed) or + String.starts_with?(line, " ") or + String.starts_with?(line, "\t") -> + collect_list_block(rest, [line | acc]) + + true -> + {Enum.reverse(acc), lines} + end + end + + defp collect_paragraph(lines), do: collect_paragraph(lines, []) + + defp collect_paragraph([], acc), do: {Enum.reverse(acc), []} + + defp collect_paragraph([line | rest] = lines, acc) do + trimmed = String.trim(line) + + cond do + trimmed == "" -> + {Enum.reverse(acc), rest} + + String.starts_with?(trimmed, "#") or + String.starts_with?(trimmed, "@") or + String.starts_with?(trimmed, "!attest") or + String.starts_with?(trimmed, "```") or + String.starts_with?(trimmed, ">") or + trimmed in ["---", "----", "-----"] -> + {Enum.reverse(acc), lines} + + true -> + collect_paragraph(rest, [trimmed | acc]) + end + end + + defp parse_heading_line(line) do + level = count_leading_hashes(line, 0) + text = String.trim(String.slice(line, level..-1//1)) + {level, text} + end + + defp count_leading_hashes("#" <> rest, n), do: count_leading_hashes(rest, n + 1) + defp count_leading_hashes(_, n), do: n + + defp ordered_list_start?(line) do + case String.split(line, ". ", parts: 2) do + [prefix, _rest] when prefix != "" -> String.match?(prefix, ~r/^\d+$/) + _ -> false + end + end + + defp parse_directive_line(line) do + without_at = String.trim(String.slice(line, 1..-1//1)) + + case String.split(without_at, " ", parts: 2) do + [name, value] -> + %Directive{name: String.trim(name), value: String.trim(value)} + + [name] -> + %Directive{name: String.trim(name), value: ""} + end + end + + defp parse_attestation_block(lines) do + fields = parse_key_value_lines(lines) + identity = Map.get(fields, "identity", "") + role = Map.get(fields, "role", "") + + trust_level = + case TrustLevel.from_string(Map.get(fields, "trust-level", "")) do + {:ok, tl} -> tl + {:error, _} -> :unverified + end + + %Attestation{ + identity: identity, + role: role, + trust_level: trust_level, + timestamp: Map.get(fields, "timestamp"), + note: Map.get(fields, "note") + } + end + + defp parse_key_value_lines(lines) do + lines + |> Enum.reduce(%{}, fn line, acc -> + trimmed = String.trim(line) + + case String.split(trimmed, ":", parts: 2) do + [key, value] -> + Map.put(acc, String.downcase(String.trim(key)), String.trim(value)) + + _ -> + acc + end + end) + end + + defp parse_list_items(lines, _ordered) do + lines + |> split_list_items() + |> Enum.map(fn item_lines -> + text = Enum.join(item_lines, " ") + inlines = parse_inlines(text) + [{:paragraph, inlines}] + end) + end + + defp split_list_items(lines), do: split_list_items(lines, [], []) + + defp split_list_items([], current, acc) do + case current do + [] -> Enum.reverse(acc) + _ -> Enum.reverse([Enum.reverse(current) | acc]) + end + end + + defp split_list_items([line | rest], current, acc) do + trimmed = String.trim(line) + + if String.starts_with?(trimmed, "- ") or + String.starts_with?(trimmed, "* ") or + ordered_list_start?(trimmed) do + item_text = strip_list_marker(trimmed) + + new_acc = + case current do + [] -> acc + _ -> [Enum.reverse(current) | acc] + end + + split_list_items(rest, [item_text], new_acc) + else + split_list_items(rest, [trimmed | current], acc) + end + end + + defp strip_list_marker("- " <> rest), do: rest + defp strip_list_marker("* " <> rest), do: rest + + defp strip_list_marker(line) do + case String.split(line, ". ", parts: 2) do + [prefix, rest] -> + if String.match?(prefix, ~r/^\d+$/), do: rest, else: line + + _ -> + line + end + end + + @doc """ + Parse inline elements from a text string. + + Handles: `**bold**`, `*italic*`, `` `code` ``, and `[text](url)` links. + """ + @spec parse_inlines(String.t()) :: [Inline.t()] + def parse_inlines(input), do: parse_inlines_acc(input, []) |> Enum.reverse() + + defp parse_inlines_acc("", acc), do: acc + + defp parse_inlines_acc("**" <> rest, acc) do + case String.split(rest, "**", parts: 2) do + [inner, after_close] -> + children = parse_inlines(inner) + parse_inlines_acc(after_close, [{:strong, children} | acc]) + + _ -> + {text, remaining} = take_until_special("**" <> rest) + parse_inlines_acc(remaining, [{:text, text} | acc]) + end + end + + defp parse_inlines_acc("*" <> rest, acc) do + case String.split(rest, "*", parts: 2) do + [inner, after_close] -> + children = parse_inlines(inner) + parse_inlines_acc(after_close, [{:emphasis, children} | acc]) + + _ -> + {text, remaining} = take_until_special("*" <> rest) + parse_inlines_acc(remaining, [{:text, text} | acc]) + end + end + + defp parse_inlines_acc("`" <> rest, acc) do + case String.split(rest, "`", parts: 2) do + [code, after_close] -> + parse_inlines_acc(after_close, [{:code, code} | acc]) + + _ -> + {text, remaining} = take_until_special("`" <> rest) + parse_inlines_acc(remaining, [{:text, text} | acc]) + end + end + + defp parse_inlines_acc("[" <> rest, acc) do + case String.split(rest, "](", parts: 2) do + [link_text, after_bracket] -> + case String.split(after_bracket, ")", parts: 2) do + [url, after_close] -> + content = parse_inlines(link_text) + parse_inlines_acc(after_close, [{:link, content, url} | acc]) + + _ -> + {text, remaining} = take_until_special("[" <> rest) + parse_inlines_acc(remaining, [{:text, text} | acc]) + end + + _ -> + {text, remaining} = take_until_special("[" <> rest) + parse_inlines_acc(remaining, [{:text, text} | acc]) + end + end + + defp parse_inlines_acc(input, acc) do + {text, remaining} = take_until_special(input) + parse_inlines_acc(remaining, [{:text, text} | acc]) + end + + defp take_until_special(input), do: take_until_special(input, "") + + defp take_until_special("", acc), do: {acc, ""} + + defp take_until_special(<> = input, acc) + when c in [?*, ?`, ?[] do + case acc do + "" -> + # Take one char literally to avoid infinite loop. + {<>, rest} + + _ -> + {acc, input} + end + end + + defp take_until_special(<>, acc) do + take_until_special(rest, acc <> <>) + end + + defp extract_directives(blocks) do + Enum.flat_map(blocks, fn + {:directive, d} -> [d] + _ -> [] + end) + end + + defp extract_attestations(blocks) do + Enum.flat_map(blocks, fn + {:attestation, a} -> [a] + _ -> [] + end) + end +end diff --git a/ex/lib/a2ml/renderer.ex b/ex/lib/a2ml/renderer.ex new file mode 100644 index 0000000..7479921 --- /dev/null +++ b/ex/lib/a2ml/renderer.ex @@ -0,0 +1,149 @@ +# SPDX-License-Identifier: MPL-2.0 +# (MPL-2.0 preferred; MPL-2.0 required for Hex.pm) + +defmodule A2ML.Renderer do + @moduledoc """ + Render an A2ML Document AST back to A2ML text. + + Produces A2ML-formatted output from a parsed Document structure, + suitable for round-tripping through parse -> modify -> render. + """ + + alias A2ML.Types.{Attestation, Document, TrustLevel} + + @doc """ + Render a Document to A2ML-formatted text. + + Produces a complete document string with title, blocks, and + appropriate blank-line separation. + """ + @spec render(Document.t()) :: String.t() + def render(%Document{} = doc) do + parts = + case doc.title do + nil -> [] + title -> ["# #{title}", ""] + end + + block_strings = + doc.blocks + |> Enum.map(&render_block/1) + |> Enum.intersperse("") + + parts = parts ++ block_strings + + parts + |> Enum.join("\n") + |> String.trim() + |> Kernel.<>("\n") + end + + @doc """ + Render a single Block to A2ML text. + """ + @spec render_block(A2ML.Types.Block.t()) :: String.t() + def render_block({:heading, level, inlines}) do + hashes = String.duplicate("#", level) + "#{hashes} #{render_inlines(inlines)}" + end + + def render_block({:paragraph, inlines}) do + render_inlines(inlines) + end + + def render_block({:code_block, lang, content}) do + opener = if lang, do: "```#{lang}", else: "```" + "#{opener}\n#{content}\n```" + end + + def render_block({:directive, d}) do + base = "@#{d.name} #{d.value}" + + case d.attributes do + [] -> + base + + attrs -> + attr_strs = Enum.map(attrs, fn {k, v} -> "#{k}=#{v}" end) + "#{base} [#{Enum.join(attr_strs, ", ")}]" + end + end + + def render_block({:attestation, a}) do + render_attestation(a) + end + + def render_block(:thematic_break) do + "---" + end + + def render_block({:block_quote, blocks}) do + blocks + |> Enum.map(fn b -> + render_block(b) + |> String.split("\n") + |> Enum.map(fn line -> "> #{line}" end) + |> Enum.join("\n") + end) + |> Enum.join("\n>\n") + end + + def render_block({:list_block, ordered, items}) do + items + |> Enum.with_index(1) + |> Enum.map(fn {item, idx} -> + prefix = if ordered, do: "#{idx}. ", else: "- " + + item_text = + item + |> Enum.map(&render_block/1) + |> Enum.join("\n") + + "#{prefix}#{item_text}" + end) + |> Enum.join("\n") + end + + @doc """ + Render an Attestation to its A2ML block format. + """ + @spec render_attestation(Attestation.t()) :: String.t() + def render_attestation(%Attestation{} = a) do + lines = [ + "!attest", + " identity: #{a.identity}", + " role: #{a.role}", + " trust-level: #{TrustLevel.to_string(a.trust_level)}" + ] + + lines = + case a.timestamp do + nil -> lines + ts -> lines ++ [" timestamp: #{ts}"] + end + + lines = + case a.note do + nil -> lines + n -> lines ++ [" note: #{n}"] + end + + Enum.join(lines, "\n") + end + + @doc """ + Render a list of Inline elements to text. + """ + @spec render_inlines([A2ML.Types.Inline.t()]) :: String.t() + def render_inlines(inlines) do + inlines + |> Enum.map(&render_inline/1) + |> Enum.join("") + end + + defp render_inline({:text, v}), do: v + defp render_inline({:emphasis, c}), do: "*#{render_inlines(c)}*" + defp render_inline({:strong, c}), do: "**#{render_inlines(c)}**" + defp render_inline({:code, v}), do: "`#{v}`" + defp render_inline({:link, c, u}), do: "[#{render_inlines(c)}](#{u})" +end diff --git a/ex/lib/a2ml/types.ex b/ex/lib/a2ml/types.ex new file mode 100644 index 0000000..f85a79d --- /dev/null +++ b/ex/lib/a2ml/types.ex @@ -0,0 +1,200 @@ +# SPDX-License-Identifier: MPL-2.0 +# (MPL-2.0 preferred; MPL-2.0 required for Hex.pm) + +defmodule A2ML.Types do + @moduledoc """ + Core data types for A2ML documents. + + An A2ML document consists of a sequence of `Block` elements, each of + which may contain `Inline` content. `Directive` blocks provide + machine-readable metadata, and `Attestation` records capture the + provenance chain for AI-generated or human-reviewed content. + """ +end + +defmodule A2ML.Types.Document do + @moduledoc """ + A complete A2ML document, containing metadata and a sequence of blocks. + """ + + @type t :: %__MODULE__{ + title: String.t() | nil, + directives: [A2ML.Types.Directive.t()], + blocks: [A2ML.Types.Block.t()], + attestations: [A2ML.Types.Attestation.t()] + } + + defstruct title: nil, + directives: [], + blocks: [], + attestations: [] +end + +defmodule A2ML.Types.Block do + @moduledoc """ + A block-level element in an A2ML document. + + Blocks are separated by blank lines in the source text. + """ + + @type t :: + {:heading, non_neg_integer(), [A2ML.Types.Inline.t()]} + | {:paragraph, [A2ML.Types.Inline.t()]} + | {:code_block, String.t() | nil, String.t()} + | {:directive, A2ML.Types.Directive.t()} + | {:attestation, A2ML.Types.Attestation.t()} + | :thematic_break + | {:block_quote, [t()]} + | {:list_block, boolean(), [[t()]]} +end + +defmodule A2ML.Types.Inline do + @moduledoc """ + An inline-level element within a block. + """ + + @type t :: + {:text, String.t()} + | {:emphasis, [t()]} + | {:strong, [t()]} + | {:code, String.t()} + | {:link, [t()], String.t()} +end + +defmodule A2ML.Types.Directive do + @moduledoc """ + A machine-readable directive that provides metadata or instructions. + + Directives begin with `@` in the source text, e.g. + `@version 1.0` or `@require trust-level:high`. + """ + + @type t :: %__MODULE__{ + name: String.t(), + value: String.t(), + attributes: [{String.t(), String.t()}] + } + + defstruct name: "", + value: "", + attributes: [] +end + +defmodule A2ML.Types.Attestation do + @moduledoc """ + An attestation record capturing who produced or reviewed content. + + Attestation blocks start with `!attest` and record the identity, + role, trust level, and optional timestamp of an author or reviewer. + """ + + @type t :: %__MODULE__{ + identity: String.t(), + role: String.t(), + trust_level: A2ML.Types.TrustLevel.t(), + timestamp: String.t() | nil, + note: String.t() | nil + } + + defstruct identity: "", + role: "", + trust_level: :unverified, + timestamp: nil, + note: nil +end + +defmodule A2ML.Types.TrustLevel do + @moduledoc """ + The degree of trust associated with an attestation. + + Trust levels form a simple ordered scale: + - `:unverified` — Content with no verification or review. + - `:automated` — Content reviewed by an automated tool or linter. + - `:reviewed` — Content reviewed by a human. + - `:verified` — Content that has been formally verified or proven. + """ + + @type t :: :unverified | :automated | :reviewed | :verified + + @doc """ + Parse a trust level from its canonical string representation. + + Returns `{:ok, level}` or `{:error, :unknown_trust_level}`. + """ + @spec from_string(String.t()) :: {:ok, t()} | {:error, :unknown_trust_level} + def from_string(s) do + case String.downcase(String.trim(s)) do + "unverified" -> {:ok, :unverified} + "automated" -> {:ok, :automated} + "reviewed" -> {:ok, :reviewed} + "verified" -> {:ok, :verified} + _ -> {:error, :unknown_trust_level} + end + end + + @doc """ + Return the canonical string representation of a trust level. + """ + @spec to_string(t()) :: String.t() + def to_string(:unverified), do: "unverified" + def to_string(:automated), do: "automated" + def to_string(:reviewed), do: "reviewed" + def to_string(:verified), do: "verified" + + @doc """ + Compare two trust levels. Returns `:lt`, `:eq`, or `:gt`. + """ + @spec compare(t(), t()) :: :lt | :eq | :gt + def compare(a, b), do: compare_int(level_to_int(a), level_to_int(b)) + + defp level_to_int(:unverified), do: 0 + defp level_to_int(:automated), do: 1 + defp level_to_int(:reviewed), do: 2 + defp level_to_int(:verified), do: 3 + + defp compare_int(a, b) when a < b, do: :lt + defp compare_int(a, b) when a > b, do: :gt + defp compare_int(_, _), do: :eq +end + +defmodule A2ML.Types.Manifest do + @moduledoc """ + A high-level manifest extracted from a parsed A2ML document. + + Collects the directives and attestations into a single structure + for convenient programmatic access. + """ + + @type t :: %__MODULE__{ + version: String.t() | nil, + title: String.t() | nil, + directives: [A2ML.Types.Directive.t()], + attestations: [A2ML.Types.Attestation.t()] + } + + defstruct version: nil, + title: nil, + directives: [], + attestations: [] + + @doc """ + Extract a manifest from a parsed Document. + """ + @spec from_document(A2ML.Types.Document.t()) :: t() + def from_document(%A2ML.Types.Document{} = doc) do + version = + doc.directives + |> Enum.find(fn d -> d.name == "version" end) + |> case do + nil -> nil + d -> d.value + end + + %__MODULE__{ + version: version, + title: doc.title, + directives: doc.directives, + attestations: doc.attestations + } + end +end diff --git a/ex/llm-warmup-dev.md b/ex/llm-warmup-dev.md new file mode 100644 index 0000000..106aa4a --- /dev/null +++ b/ex/llm-warmup-dev.md @@ -0,0 +1,16 @@ +# LLM Warmup — a2ml_ex (Developer) + +## What is a2ml_ex? +See README.adoc for overview. + +## Key Commands +- `just setup` — set up development environment +- `just build` — build the project +- `just test` — run tests +- `just doctor` — diagnose issues +- `just heal` — attempt auto-repair + +## Quick Context +- License: MPL-2.0 +- Part of hyperpolymath ecosystem +- See EXPLAINME.adoc for architecture diff --git a/ex/llm-warmup-user.md b/ex/llm-warmup-user.md new file mode 100644 index 0000000..0ae6b1c --- /dev/null +++ b/ex/llm-warmup-user.md @@ -0,0 +1,16 @@ +# LLM Warmup — a2ml_ex (User) + +## What is a2ml_ex? +See README.adoc for overview. + +## Key Commands +- `just setup` — set up development environment +- `just build` — build the project +- `just test` — run tests +- `just doctor` — diagnose issues +- `just heal` — attempt auto-repair + +## Quick Context +- License: MPL-2.0 +- Part of hyperpolymath ecosystem +- See EXPLAINME.adoc for architecture diff --git a/ex/mise.toml b/ex/mise.toml new file mode 100644 index 0000000..6dd983f --- /dev/null +++ b/ex/mise.toml @@ -0,0 +1,57 @@ +[tools] +# Language runtimes +node = "latest" +python = "latest" +rust = "latest" +go = "latest" +zig = "latest" +java = "latest" +bun = "latest" +denojs = "latest" + +# Package managers +npm = "latest" +yarn = "latest" +pnpm = "latest" +pip = "latest" +cargo = "latest" +go-task = "latest" + +# Formatting & Linting +gofmt = "latest" +black = "latest" +isort = "latest" +ruff = "latest" +prettier = "latest" +shfmt = "latest" +stylua = "latest" + +# Build tools +cmake = "latest" +make = "latest" +ninja = "latest" + +# Shell tools +git = "latest" +gnu-sed = "latest" +gnu-tar = "latest" +gnu-grep = "latest" + +# Testing +vitest = "latest" +pytest = "latest" +jest = "latest" + +[env] +# Common environment variables +NODE_ENV = "development" +PYTHONDONTWRITEBYTECODE = "1" +PYTHONUNBUFFERED = "1" + +# Task runner alias +[alias] +task = "go-task" +build = "cargo build --release || npm run build || go build" +test = "cargo test || npm test || go test ./..." +lint = "ruff check . || prettier --check . || black --check ." +fmt = "ruff format . || prettier --write . || black ." diff --git a/ex/mix.exs b/ex/mix.exs new file mode 100644 index 0000000..16bc42d --- /dev/null +++ b/ex/mix.exs @@ -0,0 +1,49 @@ +# SPDX-License-Identifier: MPL-2.0 +# (MPL-2.0 preferred; MPL-2.0 required for Hex.pm) + +defmodule A2ML.MixProject do + use Mix.Project + + @version "0.1.0" + @source_url "https://github.com/hyperpolymath/a2ml_ex" + + def project do + [ + app: :a2ml_ex, + version: @version, + elixir: "~> 1.14", + start_permanent: Mix.env() == :prod, + deps: deps(), + description: description(), + package: package(), + source_url: @source_url + ] + end + + def application do + [ + extra_applications: [:logger] + ] + end + + defp description do + "A2ML (AI Attestation Markup Language) parser and renderer for Elixir." + end + + defp package do + [ + name: "a2ml_ex", + licenses: ["MPL-2.0"], + links: %{ + "GitHub" => @source_url, + "A2ML Specification" => "https://github.com/hyperpolymath/a2ml-showcase" + } + ] + end + + defp deps do + [ + {:ex_doc, "~> 0.34", only: :dev, runtime: false} + ] + end +end diff --git a/ex/mix.lock b/ex/mix.lock new file mode 100644 index 0000000..0c19687 --- /dev/null +++ b/ex/mix.lock @@ -0,0 +1,8 @@ +%{ + "earmark_parser": {:hex, :earmark_parser, "1.4.44", "f20830dd6b5c77afe2b063777ddbbff09f9759396500cdbe7523efd58d7a339c", [:mix], [], "hexpm", "4778ac752b4701a5599215f7030989c989ffdc4f6df457c5f36938cc2d2a2750"}, + "ex_doc": {:hex, :ex_doc, "0.40.1", "67542e4b6dde74811cfd580e2c0149b78010fd13001fda7cfeb2b2c2ffb1344d", [:mix], [{:earmark_parser, "~> 1.4.44", [hex: :earmark_parser, repo: "hexpm", optional: false]}, {:makeup_c, ">= 0.1.0", [hex: :makeup_c, repo: "hexpm", optional: true]}, {:makeup_elixir, "~> 0.14 or ~> 1.0", [hex: :makeup_elixir, repo: "hexpm", optional: false]}, {:makeup_erlang, "~> 0.1 or ~> 1.0", [hex: :makeup_erlang, repo: "hexpm", optional: false]}, {:makeup_html, ">= 0.1.0", [hex: :makeup_html, repo: "hexpm", optional: true]}], "hexpm", "bcef0e2d360d93ac19f01a85d58f91752d930c0a30e2681145feea6bd3516e00"}, + "makeup": {:hex, :makeup, "1.2.1", "e90ac1c65589ef354378def3ba19d401e739ee7ee06fb47f94c687016e3713d1", [:mix], [{:nimble_parsec, "~> 1.4", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "d36484867b0bae0fea568d10131197a4c2e47056a6fbe84922bf6ba71c8d17ce"}, + "makeup_elixir": {:hex, :makeup_elixir, "1.0.1", "e928a4f984e795e41e3abd27bfc09f51db16ab8ba1aebdba2b3a575437efafc2", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}, {:nimble_parsec, "~> 1.2.3 or ~> 1.3", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "7284900d412a3e5cfd97fdaed4f5ed389b8f2b4cb49efc0eb3bd10e2febf9507"}, + "makeup_erlang": {:hex, :makeup_erlang, "1.0.3", "4252d5d4098da7415c390e847c814bad3764c94a814a0b4245176215615e1035", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}], "hexpm", "953297c02582a33411ac6208f2c6e55f0e870df7f80da724ed613f10e6706afd"}, + "nimble_parsec": {:hex, :nimble_parsec, "1.4.2", "8efba0122db06df95bfaa78f791344a89352ba04baedd3849593bfce4d0dc1c6", [:mix], [], "hexpm", "4b21398942dda052b403bbe1da991ccd03a053668d147d53fb8c4e0efe09c973"}, +} diff --git a/ex/setup.sh b/ex/setup.sh new file mode 100755 index 0000000..1fd8d67 --- /dev/null +++ b/ex/setup.sh @@ -0,0 +1,64 @@ +#!/usr/bin/env bash +# SPDX-License-Identifier: MPL-2.0 +# Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) +# +# A2Ml_Ex — Universal Setup Script +# Detects platform and shell, installs just, then hands off to Justfile. + +set -euo pipefail + +echo "═══════════════════════════════════════════════════" +echo " A2Ml_Ex — Setup" +echo "═══════════════════════════════════════════════════" +echo "" + +# Platform detection +OS="$(uname -s)" +ARCH="$(uname -m)" +echo "Platform: $OS $ARCH" + +# Shell detection +CURRENT_SHELL="$(basename "$SHELL" 2>/dev/null || echo "unknown")" +echo "Shell: $CURRENT_SHELL" +echo "" + +# Check for just +if ! command -v just >/dev/null 2>&1; then + echo "just (command runner) is required but not installed." + echo "" + case "$OS" in + Linux) + if command -v cargo >/dev/null 2>&1; then + echo "Installing just via cargo..." + cargo install just + elif command -v brew >/dev/null 2>&1; then + echo "Installing just via Homebrew..." + brew install just + else + echo "Install just from: https://just.systems/man/en/installation.html" + exit 1 + fi + ;; + Darwin) + if command -v brew >/dev/null 2>&1; then + echo "Installing just via Homebrew..." + brew install just + else + echo "Install Homebrew first: https://brew.sh" + echo "Then: brew install just" + exit 1 + fi + ;; + *) + echo "Install just from: https://just.systems/man/en/installation.html" + exit 1 + ;; + esac + echo "" +fi + +echo "Running diagnostics..." +just doctor + +echo "" +echo "Setup complete. Run 'just help-me' for common workflows." diff --git a/ex/stapeln.toml b/ex/stapeln.toml new file mode 100644 index 0000000..49c184b --- /dev/null +++ b/ex/stapeln.toml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 + +[project] +name = "a2ml_ex" +description = "A2ML Elixir implementation" + +[container] +base = "cgr.dev/chainguard/wolfi-base:latest" + +[build] +builder = "elixir" diff --git a/ex/test/a2_ml_test.exs b/ex/test/a2_ml_test.exs new file mode 100644 index 0000000..209ed03 --- /dev/null +++ b/ex/test/a2_ml_test.exs @@ -0,0 +1,130 @@ +# SPDX-License-Identifier: MPL-2.0 +# (MPL-2.0 preferred; MPL-2.0 required for Hex.pm) + +defmodule A2MLTest do + use ExUnit.Case, async: true + + alias A2ML.Types.{Attestation, Directive, Document, Manifest, TrustLevel} + + # --------------------------------------------------------------------------- + # Parser tests + # --------------------------------------------------------------------------- + + test "parse empty input returns error" do + assert A2ML.parse("") == {:error, :empty_input} + assert A2ML.parse(" ") == {:error, :empty_input} + end + + test "parse title only" do + assert {:ok, %Document{title: "Hello A2ML"}} = A2ML.parse("# Hello A2ML") + end + + test "parse heading levels" do + assert {:ok, doc} = A2ML.parse("## Second Level\n\n### Third Level") + assert [{:heading, 2, _}, {:heading, 3, _}] = doc.blocks + end + + test "parse paragraph" do + assert {:ok, doc} = A2ML.parse("This is a simple paragraph.") + assert [{:paragraph, [{:text, "This is a simple paragraph."}]}] = doc.blocks + end + + test "parse directive" do + assert {:ok, doc} = A2ML.parse("@version 1.0") + + assert [{:directive, %Directive{name: "version", value: "1.0"}}] = + doc.blocks + + assert [%Directive{name: "version", value: "1.0"}] = doc.directives + end + + test "parse trust levels" do + assert {:ok, :unverified} = TrustLevel.from_string("unverified") + assert {:ok, :automated} = TrustLevel.from_string("Automated") + assert {:ok, :reviewed} = TrustLevel.from_string("REVIEWED") + assert {:ok, :verified} = TrustLevel.from_string("verified") + assert {:error, :unknown_trust_level} = TrustLevel.from_string("unknown") + end + + test "parse attestation" do + input = "!attest\n identity: Alice\n role: reviewer\n trust-level: reviewed" + assert {:ok, doc} = A2ML.parse(input) + assert [{:attestation, %Attestation{identity: "Alice", role: "reviewer", trust_level: :reviewed}}] = doc.blocks + end + + test "parse full document" do + input = """ + # Test Doc + + @version 2.0 + + A paragraph here. + + !attest + identity: Bob + role: author + trust-level: verified + """ + + assert {:ok, doc} = A2ML.parse(input) + assert doc.title == "Test Doc" + assert [%Directive{name: "version"}] = doc.directives + assert [%Attestation{identity: "Bob"}] = doc.attestations + end + + # --------------------------------------------------------------------------- + # Renderer tests + # --------------------------------------------------------------------------- + + test "render trust level strings" do + assert TrustLevel.to_string(:unverified) == "unverified" + assert TrustLevel.to_string(:automated) == "automated" + assert TrustLevel.to_string(:reviewed) == "reviewed" + assert TrustLevel.to_string(:verified) == "verified" + end + + test "render attestation" do + a = %Attestation{ + identity: "Claude", + role: "agent", + trust_level: :automated, + timestamp: "2026-03-16T12:00:00Z", + note: nil + } + + rendered = A2ML.Renderer.render_attestation(a) + + assert rendered == + "!attest\n identity: Claude\n role: agent\n trust-level: automated\n timestamp: 2026-03-16T12:00:00Z" + end + + test "render roundtrip" do + input = "# Round Trip\n\n@version 1.0\n\nHello, world!" + assert {:ok, doc} = A2ML.parse(input) + output = A2ML.render(doc) + assert {:ok, doc2} = A2ML.parse(output) + assert doc.title == doc2.title + end + + # --------------------------------------------------------------------------- + # Manifest tests + # --------------------------------------------------------------------------- + + test "extract manifest" do + input = "# Manifest Test\n\n@version 3.0\n\n@author Alice" + assert {:ok, doc} = A2ML.parse(input) + manifest = Manifest.from_document(doc) + assert manifest.version == "3.0" + assert manifest.title == "Manifest Test" + end + + # --------------------------------------------------------------------------- + # Trust level comparison + # --------------------------------------------------------------------------- + + test "trust level comparison" do + assert TrustLevel.compare(:unverified, :verified) == :lt + assert TrustLevel.compare(:verified, :unverified) == :gt + assert TrustLevel.compare(:reviewed, :reviewed) == :eq + end +end diff --git a/ex/test/a2ml_aspect_test.exs b/ex/test/a2ml_aspect_test.exs new file mode 100644 index 0000000..b0e2378 --- /dev/null +++ b/ex/test/a2ml_aspect_test.exs @@ -0,0 +1,137 @@ +# SPDX-License-Identifier: MPL-2.0 +# (MPL-2.0 preferred; MPL-2.0 required for Hex.pm) +# +# a2ml_aspect_test.exs — Aspect tests for A2ML parser/renderer. +# +# Tests cross-cutting concerns: security (input safety), correctness, +# performance, and resilience. These complement the unit and contract tests +# by validating behavioural aspects that cut across the whole API surface. + +defmodule A2MLAspectTest do + use ExUnit.Case, async: true + + # --------------------------------------------------------------------------- + # Aspect: Security — empty and nil-like inputs are handled gracefully + # --------------------------------------------------------------------------- + + test "ASPECT security: empty string is handled gracefully without raise" do + result = A2ML.parse("") + assert match?({:error, _}, result) + end + + test "ASPECT security: whitespace-only input handled gracefully" do + result = A2ML.parse(" \n \t ") + assert match?({:error, _}, result) + end + + test "ASPECT security: nil input returns error tuple, does not raise" do + result = + try do + A2ML.parse(nil) + rescue + _ -> {:error, :bad_argument} + end + + assert match?({:error, _}, result) + end + + # --------------------------------------------------------------------------- + # Aspect: Security — very long strings do not crash the parser + # --------------------------------------------------------------------------- + + test "ASPECT security: 1000-character string does not crash parser" do + long_string = String.duplicate("x", 1000) + result = A2ML.parse(long_string) + # A2ML may parse long text as a paragraph — either ok or error, not raise. + assert match?({:ok, _}, result) or match?({:error, _}, result) + end + + test "ASPECT security: heading with 200-character title is safe" do + long_title = String.duplicate("a", 200) + input = "# #{long_title}\n\n@version 1.0" + result = A2ML.parse(input) + assert match?({:ok, _}, result) or match?({:error, _}, result) + end + + # --------------------------------------------------------------------------- + # Aspect: Correctness — attestation fields survive parse/render roundtrip + # --------------------------------------------------------------------------- + + test "ASPECT correctness: attestation fields survive roundtrip" do + input = + "# Attestation Roundtrip\n\n!attest\n identity: Jonathan D.A. Jewell\n role: author\n trust-level: verified\n timestamp: 2026-04-04T00:00:00Z" + + assert {:ok, doc1} = A2ML.parse(input) + assert [attest] = doc1.attestations + assert attest.identity == "Jonathan D.A. Jewell" + assert attest.trust_level == :verified + + rendered = A2ML.render(doc1) + assert {:ok, doc2} = A2ML.parse(rendered) + assert [attest2] = doc2.attestations + assert attest2.identity == attest.identity + assert attest2.trust_level == attest.trust_level + end + + test "ASPECT correctness: multiple directives survive roundtrip" do + input = "# Multi-Directive\n\n@version 1.5\n\n@author Alice\n\n@license MPL-2.0" + assert {:ok, doc1} = A2ML.parse(input) + assert length(doc1.directives) == 3 + + rendered = A2ML.render(doc1) + assert {:ok, doc2} = A2ML.parse(rendered) + assert length(doc2.directives) == 3 + end + + test "ASPECT correctness: document title survives parse/render/parse" do + input = "# My Document\n\nParagraph content." + assert {:ok, doc1} = A2ML.parse(input) + assert doc1.title == "My Document" + + rendered = A2ML.render(doc1) + assert {:ok, doc2} = A2ML.parse(rendered) + assert doc2.title == "My Document" + end + + # --------------------------------------------------------------------------- + # Aspect: Performance — parsing 100 identical inputs completes without error + # --------------------------------------------------------------------------- + + test "ASPECT performance: parse 100 identical inputs without error" do + input = "# Performance Test\n\n@version 1.0\n\nA performance paragraph." + + results = Enum.map(1..100, fn _ -> A2ML.parse(input) end) + + Enum.each(results, fn result -> + assert match?({:ok, _}, result), + "Expected {:ok, _} but got #{inspect(result)}" + end) + end + + test "ASPECT performance: render 100 identical documents without error" do + input = "# Render Performance\n\n@version 2.0\n\nRender test." + assert {:ok, doc} = A2ML.parse(input) + + outputs = Enum.map(1..100, fn _ -> A2ML.render(doc) end) + + Enum.each(outputs, fn out -> + assert is_binary(out) + end) + end + + # --------------------------------------------------------------------------- + # Aspect: Resilience — unusual but syntactically possible inputs + # --------------------------------------------------------------------------- + + test "ASPECT resilience: document with only a directive is handled" do + input = "@version 1.0" + result = A2ML.parse(input) + assert match?({:ok, _}, result) or match?({:error, _}, result) + end + + test "ASPECT resilience: document with only an attestation block is handled" do + input = "!attest\n identity: Bot\n role: scanner\n trust-level: automated" + result = A2ML.parse(input) + assert match?({:ok, _}, result) or match?({:error, _}, result) + end +end diff --git a/ex/test/a2ml_bench_test.exs b/ex/test/a2ml_bench_test.exs new file mode 100644 index 0000000..00a6571 --- /dev/null +++ b/ex/test/a2ml_bench_test.exs @@ -0,0 +1,100 @@ +# SPDX-License-Identifier: MPL-2.0 +# (MPL-2.0 preferred; MPL-2.0 required for Hex.pm) +# +# a2ml_bench_test.exs — Timing/benchmark tests for A2ML parser/renderer. +# +# Uses ExUnit with wall-clock assertions to detect gross performance regressions. +# Not a microbenchmark harness — guards against orders-of-magnitude slowdowns. + +defmodule A2MLBenchTest do + use ExUnit.Case, async: false + + # Maximum acceptable wall-clock time (milliseconds) for the bulk operations. + # Deliberately generous to avoid CI flakiness. + @parse_budget_ms 5_000 + @render_budget_ms 5_000 + @roundtrip_budget_ms 10_000 + + # --------------------------------------------------------------------------- + # Benchmark: parse 500 documents within budget + # --------------------------------------------------------------------------- + + test "bench: parse 500 documents within #{@parse_budget_ms}ms" do + input = "# Bench Parse\n\n@version 1.0\n\nA benchmark paragraph." + + {elapsed_us, _} = + :timer.tc(fn -> + Enum.each(1..500, fn _ -> A2ML.parse(input) end) + end) + + elapsed_ms = div(elapsed_us, 1_000) + + assert elapsed_ms < @parse_budget_ms, + "parse 500 took #{elapsed_ms}ms — exceeded #{@parse_budget_ms}ms budget" + end + + # --------------------------------------------------------------------------- + # Benchmark: render 500 documents within budget + # --------------------------------------------------------------------------- + + test "bench: render 500 documents within #{@render_budget_ms}ms" do + input = + "# Bench Render\n\n@version 2.0\n\n!attest\n identity: Jonathan D.A. Jewell\n role: author\n trust-level: verified" + + assert {:ok, doc} = A2ML.parse(input) + + {elapsed_us, _} = + :timer.tc(fn -> + Enum.each(1..500, fn _ -> A2ML.render(doc) end) + end) + + elapsed_ms = div(elapsed_us, 1_000) + + assert elapsed_ms < @render_budget_ms, + "render 500 took #{elapsed_ms}ms — exceeded #{@render_budget_ms}ms budget" + end + + # --------------------------------------------------------------------------- + # Benchmark: 200 full roundtrips within budget + # --------------------------------------------------------------------------- + + test "bench: 200 full roundtrips within #{@roundtrip_budget_ms}ms" do + input = + "# Roundtrip Bench\n\n@version 3.0\n\n@author Jonathan D.A. Jewell\n\nA paragraph.\n\n!attest\n identity: Bot\n role: scanner\n trust-level: automated" + + {elapsed_us, _} = + :timer.tc(fn -> + Enum.each(1..200, fn _ -> + assert {:ok, doc1} = A2ML.parse(input) + rendered = A2ML.render(doc1) + assert {:ok, _doc2} = A2ML.parse(rendered) + end) + end) + + elapsed_ms = div(elapsed_us, 1_000) + + assert elapsed_ms < @roundtrip_budget_ms, + "200 roundtrips took #{elapsed_ms}ms — exceeded #{@roundtrip_budget_ms}ms budget" + end + + # --------------------------------------------------------------------------- + # Benchmark: trust level from_string 1000 times is fast + # --------------------------------------------------------------------------- + + test "bench: TrustLevel.from_string 1000 calls is fast" do + levels = ["unverified", "automated", "reviewed", "verified", "REVIEWED", "Verified"] + + {elapsed_us, _} = + :timer.tc(fn -> + Enum.each(1..1000, fn i -> + level = Enum.at(levels, rem(i, length(levels))) + A2ML.Types.TrustLevel.from_string(level) + end) + end) + + elapsed_ms = div(elapsed_us, 1_000) + + assert elapsed_ms < 500, + "1000 from_string calls took #{elapsed_ms}ms — expected < 500ms" + end +end diff --git a/ex/test/a2ml_contract_test.exs b/ex/test/a2ml_contract_test.exs new file mode 100644 index 0000000..c0b674b --- /dev/null +++ b/ex/test/a2ml_contract_test.exs @@ -0,0 +1,124 @@ +# SPDX-License-Identifier: MPL-2.0 +# (MPL-2.0 preferred; MPL-2.0 required for Hex.pm) +# +# a2ml_contract_test.exs — Contract/invariant tests for A2ML parser/renderer. +# +# Tests the behavioural contracts that the API must uphold regardless of input. +# Each test validates a named invariant. + +defmodule A2MLContractTest do + use ExUnit.Case, async: true + + alias A2ML.Types.{Manifest, TrustLevel} + + # --------------------------------------------------------------------------- + # INVARIANT: parse of empty/whitespace input returns {:error, :empty_input} + # --------------------------------------------------------------------------- + + test "INVARIANT: parse empty string returns {:error, :empty_input}" do + assert {:error, :empty_input} = A2ML.parse("") + end + + test "INVARIANT: parse whitespace-only string returns {:error, :empty_input}" do + assert {:error, :empty_input} = A2ML.parse(" \n\t ") + end + + # --------------------------------------------------------------------------- + # INVARIANT: parse success always returns {:ok, %A2ML.Types.Document{}} + # --------------------------------------------------------------------------- + + test "INVARIANT: successful parse always returns {:ok, Document}" do + assert {:ok, %A2ML.Types.Document{}} = A2ML.parse("# Hello A2ML") + assert {:ok, %A2ML.Types.Document{}} = A2ML.parse("A simple paragraph.") + assert {:ok, %A2ML.Types.Document{}} = A2ML.parse("@version 1.0") + end + + # --------------------------------------------------------------------------- + # INVARIANT: parse error returns {:error, _} — never raises + # --------------------------------------------------------------------------- + + test "INVARIANT: parse of garbage input returns {:error, _} or {:ok, _} — never raises" do + # A2ML is fairly permissive and may parse some garbage as paragraphs. + # The invariant here is: it must not raise an exception. + garbage_inputs = ["%%%!!!", "12345", "null", "true", "[]"] + + Enum.each(garbage_inputs, fn input -> + result = A2ML.parse(input) + assert match?({:ok, _}, result) or match?({:error, _}, result), + "Expected result tuple for #{inspect(input)}, got #{inspect(result)}" + end) + end + + # --------------------------------------------------------------------------- + # INVARIANT: TrustLevel.from_string returns {:ok, atom} for all valid levels + # --------------------------------------------------------------------------- + + test "INVARIANT: from_string returns {:ok, atom} for all canonical trust level names" do + assert {:ok, :unverified} = TrustLevel.from_string("unverified") + assert {:ok, :automated} = TrustLevel.from_string("automated") + assert {:ok, :reviewed} = TrustLevel.from_string("reviewed") + assert {:ok, :verified} = TrustLevel.from_string("verified") + end + + # --------------------------------------------------------------------------- + # INVARIANT: TrustLevel.from_string is case-insensitive + # --------------------------------------------------------------------------- + + test "INVARIANT: from_string is case-insensitive" do + assert {:ok, :unverified} = TrustLevel.from_string("UNVERIFIED") + assert {:ok, :automated} = TrustLevel.from_string("Automated") + assert {:ok, :reviewed} = TrustLevel.from_string("REVIEWED") + assert {:ok, :verified} = TrustLevel.from_string("Verified") + end + + # --------------------------------------------------------------------------- + # INVARIANT: TrustLevel.from_string returns {:error, :unknown_trust_level} + # for unknown inputs — never {:ok, _} + # --------------------------------------------------------------------------- + + test "INVARIANT: invalid trust level string never returns {:ok, _}" do + assert {:error, :unknown_trust_level} = TrustLevel.from_string("invalid") + assert {:error, :unknown_trust_level} = TrustLevel.from_string("none") + assert {:error, :unknown_trust_level} = TrustLevel.from_string("") + end + + # --------------------------------------------------------------------------- + # INVARIANT: render always returns a String, never nil or raises + # --------------------------------------------------------------------------- + + test "INVARIANT: render always returns a binary string" do + assert {:ok, doc} = A2ML.parse("# Render Contract\n\n@version 1.0") + output = A2ML.render(doc) + assert is_binary(output) + assert byte_size(output) > 0 + end + + # --------------------------------------------------------------------------- + # INVARIANT: Manifest.from_document always returns a Manifest struct + # --------------------------------------------------------------------------- + + test "INVARIANT: Manifest.from_document always returns a Manifest struct" do + assert {:ok, doc} = A2ML.parse("# Title\n\n@version 2.0") + manifest = Manifest.from_document(doc) + assert %Manifest{} = manifest + assert manifest.version == "2.0" + assert manifest.title == "Title" + end + + test "INVARIANT: Manifest.from_document with no directives has nil version" do + assert {:ok, doc} = A2ML.parse("# No Version") + manifest = Manifest.from_document(doc) + assert manifest.version == nil + assert manifest.title == "No Version" + end + + # --------------------------------------------------------------------------- + # INVARIANT: attestations list is always a list (never nil) + # --------------------------------------------------------------------------- + + test "INVARIANT: doc.attestations is always a list even with no attestations" do + assert {:ok, doc} = A2ML.parse("# No Attestations\n\n@version 1.0") + assert is_list(doc.attestations) + assert doc.attestations == [] + end +end diff --git a/ex/test/a2ml_property_test.exs b/ex/test/a2ml_property_test.exs new file mode 100644 index 0000000..be606ad --- /dev/null +++ b/ex/test/a2ml_property_test.exs @@ -0,0 +1,140 @@ +# SPDX-License-Identifier: MPL-2.0 +# (MPL-2.0 preferred; MPL-2.0 required for Hex.pm) +# +# a2ml_property_test.exs — Property-based tests for A2ML parser/renderer. +# +# Validates determinism, idempotency, and structural invariants across +# a range of inputs without relying on external property-testing libraries. + +defmodule A2MLPropertyTest do + use ExUnit.Case, async: true + + alias A2ML.Types.TrustLevel + + # --------------------------------------------------------------------------- + # Property: parse is deterministic — same input always produces same output + # --------------------------------------------------------------------------- + + test "parse is deterministic over 50 identical calls" do + input = "# Determinism Test\n\n@version 1.0\n\nA test paragraph." + + results = Enum.map(1..50, fn _ -> A2ML.parse(input) end) + first = hd(results) + + Enum.each(results, fn result -> + assert result == first, + "parse/1 returned different results on identical input" + end) + end + + # --------------------------------------------------------------------------- + # Property: render is deterministic — rendering the same document yields + # the same string every time + # --------------------------------------------------------------------------- + + test "render is deterministic over 50 identical calls" do + input = "# Render Prop\n\n@version 2.0\n\nHello, A2ML!" + + assert {:ok, doc} = A2ML.parse(input) + outputs = Enum.map(1..50, fn _ -> A2ML.render(doc) end) + first = hd(outputs) + + Enum.each(outputs, fn out -> + assert out == first, + "render/1 returned different results for the same document" + end) + end + + # --------------------------------------------------------------------------- + # Property: all valid trust level strings round-trip through from_string/to_string + # --------------------------------------------------------------------------- + + test "all trust level strings round-trip" do + levels = ["unverified", "automated", "reviewed", "verified"] + + Enum.each(levels, fn name -> + assert {:ok, level} = TrustLevel.from_string(name) + assert TrustLevel.to_string(level) == name + end) + end + + # --------------------------------------------------------------------------- + # Property: trust level compare is anti-symmetric + # compare(a, b) == :lt iff compare(b, a) == :gt + # --------------------------------------------------------------------------- + + test "trust level compare is anti-symmetric" do + pairs = [ + {:unverified, :automated}, + {:unverified, :reviewed}, + {:unverified, :verified}, + {:automated, :reviewed}, + {:automated, :verified}, + {:reviewed, :verified} + ] + + Enum.each(pairs, fn {a, b} -> + assert TrustLevel.compare(a, b) == :lt + assert TrustLevel.compare(b, a) == :gt + end) + end + + # --------------------------------------------------------------------------- + # Property: trust level compare is reflexive — compare(x, x) == :eq + # --------------------------------------------------------------------------- + + test "trust level compare is reflexive" do + Enum.each([:unverified, :automated, :reviewed, :verified], fn level -> + assert TrustLevel.compare(level, level) == :eq + end) + end + + # --------------------------------------------------------------------------- + # Property: roundtrip preserves title across several documents + # --------------------------------------------------------------------------- + + test "roundtrip preserves document title" do + titles = ["Hello World", "My Report", "AI Doc 2026", "Test Title"] + + Enum.each(titles, fn title -> + input = "# #{title}\n\n@version 1.0\n\nContent here." + assert {:ok, doc1} = A2ML.parse(input) + rendered = A2ML.render(doc1) + assert {:ok, doc2} = A2ML.parse(rendered) + assert doc1.title == doc2.title + end) + end + + # --------------------------------------------------------------------------- + # Property: invalid trust level strings never produce :ok + # --------------------------------------------------------------------------- + + test "invalid trust level strings never return {:ok, _}" do + invalid_names = [ + "none", "all", "safe", "high", "low", "admin", "root", + "unknown", "nil", "", "trusted", "REVIEWED1", "aut0mated", + "review", "verif", "unverify", "0", "true", "false" + ] + + Enum.each(invalid_names, fn name -> + result = TrustLevel.from_string(name) + + assert match?({:error, _}, result), + "Expected {:error, _} for #{inspect(name)}, got #{inspect(result)}" + end) + end + + # --------------------------------------------------------------------------- + # Property: directives are preserved across roundtrip + # --------------------------------------------------------------------------- + + test "directives are preserved across roundtrip" do + input = "# Directive Test\n\n@version 3.0\n\n@author Jonathan D.A. Jewell" + assert {:ok, doc1} = A2ML.parse(input) + assert length(doc1.directives) == 2 + + rendered = A2ML.render(doc1) + assert {:ok, doc2} = A2ML.parse(rendered) + assert length(doc1.directives) == length(doc2.directives) + end +end diff --git a/ex/test/test_helper.exs b/ex/test/test_helper.exs new file mode 100644 index 0000000..869559e --- /dev/null +++ b/ex/test/test_helper.exs @@ -0,0 +1 @@ +ExUnit.start() diff --git a/ex/tests/fuzz/placeholder.txt b/ex/tests/fuzz/placeholder.txt new file mode 100644 index 0000000..8621280 --- /dev/null +++ b/ex/tests/fuzz/placeholder.txt @@ -0,0 +1 @@ +Scorecard requirement placeholder diff --git a/gleam/.editorconfig b/gleam/.editorconfig new file mode 100644 index 0000000..bcdbb4d --- /dev/null +++ b/gleam/.editorconfig @@ -0,0 +1,65 @@ +# RSR-template-repo - Editor Configuration +# https://editorconfig.org + +root = true + +[*] +charset = utf-8 +end_of_line = lf +indent_size = 2 +indent_style = space +insert_final_newline = true +trim_trailing_whitespace = true + +[*.md] +trim_trailing_whitespace = false + +[*.adoc] +trim_trailing_whitespace = false + +[*.rs] +indent_size = 4 + +[*.ex] +indent_size = 2 + +[*.exs] +indent_size = 2 + +[*.zig] +indent_size = 4 + +[*.ada] +indent_size = 3 + +[*.adb] +indent_size = 3 + +[*.ads] +indent_size = 3 + +[*.hs] +indent_size = 2 + +[*.res] +indent_size = 2 + +[*.resi] +indent_size = 2 + +[*.ncl] +indent_size = 2 + +[*.rkt] +indent_size = 2 + +[*.scm] +indent_size = 2 + +[*.nix] +indent_size = 2 + +[Justfile] +indent_style = space +indent_size = 4 + diff --git a/gleam/.machine_readable/ADJUST.contractile b/gleam/.machine_readable/ADJUST.contractile new file mode 100644 index 0000000..2fa5968 --- /dev/null +++ b/gleam/.machine_readable/ADJUST.contractile @@ -0,0 +1,126 @@ +; SPDX-License-Identifier: MPL-2.0 +; ADJUST.contractile — Accessibility invariants for a2ml_gleam +; "ADJUST" = Accessibility & Digital Justice for Universal Software & Technology +; +; Part of the contractile family: MUST, TRUST, DUST, INTENT, ADJUST +; This file is machine-readable. LLM/SLM agents MUST NOT violate these invariants. + +; ── Definitions ────────────────────────────────────────────────── +; +; ADJUST (noun/verb) +; The accessibility contractile. Defines how software must adapt to serve +; all users regardless of ability, device, or context. Named for the verb +; "adjust" — to make suitable, to adapt, to accommodate — which is the +; core action of accessible design. +; +; Scope: +; ADJUST governs all user-facing interfaces: GUI, TUI, CLI, web, mobile, +; documentation, error messages, and installation flows. It applies to +; both human users and assistive technologies (screen readers, switch +; devices, braille displays, voice control). +; +; Relationship to other contractiles: +; - MUST: ADJUST invariants are a subset of MUST — violating ADJUST +; is a MUST violation. ADJUST exists separately because accessibility +; rules are numerous enough to warrant their own file, and because +; LLMs frequently forget accessibility unless explicitly reminded. +; - TRUST: ADJUST does not affect trust levels. All trust tiers must +; respect ADJUST invariants equally. +; - DUST: Deprecating a feature does not exempt it from ADJUST until +; it is fully removed. Deprecated UI must remain accessible. +; - INTENT: ADJUST supports the anti-purpose "this software is NOT +; only for able-bodied users with modern hardware." +; +; Standard: WCAG 2.2 Level AA (minimum) +; https://www.w3.org/WAI/WCAG22/quickref/?levels=aaa +; +; Why a separate file: +; Experience shows LLMs and developers alike treat accessibility as an +; afterthought. By placing invariants in a contractile that is loaded +; at session start, we make it structurally impossible to forget. +; +; ── End Definitions ────────────────────────────────────────────── + +(adjust-contractile + (version "1.0.0") + (full-name "Accessibility & Digital Justice for Universal Software & Technology") + (standard "WCAG-2.2-AA") + (repo "a2ml_gleam") + + (invariants + ; ── Visual ── + (adjust "colour-contrast-ratio >= 4.5:1 for normal text") + (adjust "colour-contrast-ratio >= 3:1 for large text (18pt+ or 14pt+ bold)") + (adjust "no information conveyed by colour alone") + (adjust "no flashing or strobing content (3 flashes/second max)") + (adjust "text resizable to 200% without loss of content or function") + (adjust "focus indicators visible on all interactive elements") + + ; ── Keyboard ── + (adjust "all interactive elements reachable via keyboard (Tab/Shift+Tab)") + (adjust "no keyboard traps — user can always Tab away") + (adjust "skip navigation link present on pages with repeated blocks") + (adjust "logical focus order follows visual reading order") + + ; ── Screen reader ── + (adjust "all images have meaningful alt text (or alt='' if decorative)") + (adjust "all form inputs have associated labels") + (adjust "ARIA landmarks used for page regions (main, nav, banner, etc.)") + (adjust "dynamic content updates announced via aria-live regions") + (adjust "semantic HTML used (headings, lists, tables) — not div soup") + + ; ── Interactive ── + (adjust "touch targets minimum 44x44px on mobile/touch interfaces") + (adjust "error messages identify the field and describe the error") + (adjust "error messages not conveyed by colour or position alone") + (adjust "form validation provides suggestions for correction") + + ; ── Media ── + (adjust "video has captions (closed or open)") + (adjust "audio-only content has text transcript") + (adjust "no autoplay of media with sound") + + ; ── Motion ── + (adjust "animations respect prefers-reduced-motion media query") + (adjust "no content depends on motion to convey meaning") + + ; ── CLI/TUI ── + (adjust "CLI output must not rely solely on colour (use symbols: [OK] [FAIL])") + (adjust "TUI must support high-contrast mode") + (adjust "all CLI commands support --help with plain-text output") + (adjust "error messages written in plain language, not jargon or codes alone") + + ; ── Documentation ── + (adjust "docs use clear language, short sentences, logical structure") + (adjust "code examples include comments explaining non-obvious steps") + (adjust "diagrams have text descriptions or alt text") + + ; ── Internationalisation (i18n) ── + (adjust "all user-facing strings externalisable for translation") + (adjust "no hardcoded English in error messages — use message keys") + (adjust "date/time/number formats locale-aware") + (adjust "RTL (right-to-left) layout support where applicable") + (adjust "Unicode handled correctly throughout (UTF-8 everywhere)") + ) + + (related-resources + ; LOL — super-parallel corpus crawler for 1500+ languages + ; Use for linguistic data, translation coverage, and i18n validation + (lol "standards/lol — multilingual NLP corpus, see README.adoc") + (polyglot-i18n "polyglot-i18n — i18n framework and WASM translation engine") + ) + + (enforcement + (ci "accessibility linting in quality.yml workflow") + (pr-block "PR blocked if accessibility regression detected") + (tool "axe-core or pa11y for automated checks on web UI") + (tool "CLI output inspected for colour-only signalling") + (manual "manual screen reader test before major releases") + ) + + (notes + "These are MINIMUM requirements. Exceeding them (AAA) is encouraged." + "When in doubt about an accessibility decision, ask — don't guess." + "Accessibility is not optional polish — it is a structural requirement." + ) +) diff --git a/gleam/.machine_readable/INTENT.contractile b/gleam/.machine_readable/INTENT.contractile new file mode 100644 index 0000000..f4a8cc2 --- /dev/null +++ b/gleam/.machine_readable/INTENT.contractile @@ -0,0 +1,72 @@ +; SPDX-License-Identifier: MPL-2.0 +; INTENT.contractile — Purpose and scope for a2ml_gleam +; Helps LLM/SLM agents understand what this repo IS and IS NOT. +; +; Part of the contractile family: MUST, TRUST, DUST, INTENT, ADJUST + +; ── Definitions ────────────────────────────────────────────────── +; +; INTENT (noun) +; The purpose contractile. Defines what this repository IS, what it is +; NOT (anti-purpose), and which architectural decisions are load-bearing. +; Without INTENT, LLMs drift into scope creep, reverse key decisions, +; or add features that belong in a different repo. +; +; Scope: +; INTENT governs the conceptual boundaries of the project — its reason +; for existing, its domain, and its relationship to the ecosystem. +; It does NOT specify implementation details (that's MUST and code). +; +; Relationship to other contractiles: +; - MUST: INTENT explains WHY certain MUSTs exist. If you don't +; understand a MUST, read INTENT first. +; - TRUST: The "ask-before-touching" section in INTENT maps directly +; to TRUST.trust-deny for the most sensitive areas. +; - ADJUST: INTENT's anti-purpose should include "this software is +; NOT only for users with perfect vision/hearing/mobility." +; - DUST: When INTENT changes (repo pivots), related DUST entries +; should be created for the abandoned direction. +; +; ── End Definitions ────────────────────────────────────────────── + +(intent-contractile + (version "1.0.0") + (repo "a2ml_gleam") + + ; === Purpose (what this repo IS) === + (purpose + "{{ONE_PARAGRAPH_PURPOSE}}" + ) + + ; === Anti-Purpose (what this repo is NOT — prevents scope creep) === + (anti-purpose + "{{ONE_PARAGRAPH_ANTI_PURPOSE}}" + ; Examples: + ; "This is NOT a general-purpose database — it solves one specific problem." + ; "This is NOT a framework — it is a library with a focused API." + ; "This does NOT handle authentication — that is delegated to [other repo]." + ) + + ; === Key Architectural Decisions That Must Not Be Reversed === + (architectural-invariants + ; *REMINDER: List the foundational decisions* + ; ("Idris2 for ABI definitions — dependent types prove interface correctness") + ; ("Zig for FFI — zero-cost C ABI compatibility") + ; ("Elixir for supervision — OTP fault tolerance") + ) + + ; === Sensitive Areas (if in doubt, ask) === + (ask-before-touching + ; *REMINDER: List areas where LLMs should check before modifying* + ; "src/abi/ — formal proofs, changes require re-verification" + ; "ffi/zig/ — C ABI boundary, changes affect all language bindings" + ; ".machine_readable/ — checkpoint files, format is specified" + ) + + ; === Ecosystem Position === + (ecosystem + (belongs-to "{{MONOREPO_OR_STANDALONE}}") + (depends-on ("{{DEP1}}" "{{DEP2}}")) + (depended-on-by ("{{CONSUMER1}}" "{{CONSUMER2}}")) + ) +) diff --git a/gleam/.machine_readable/MUST.contractile b/gleam/.machine_readable/MUST.contractile new file mode 100644 index 0000000..b4c7c04 --- /dev/null +++ b/gleam/.machine_readable/MUST.contractile @@ -0,0 +1,91 @@ +; SPDX-License-Identifier: MPL-2.0 +; MUST.contractile — Baseline invariants for a2ml_gleam +; These constraints MUST NOT be violated. K9 validators enforce them. +; +; Part of the contractile family: MUST, TRUST, DUST, INTENT, ADJUST + +; ── Definitions ────────────────────────────────────────────────── +; +; MUST (noun/verb) +; The hard-constraint contractile. Defines invariants that are structurally +; required for the repository to function correctly and safely. Violating +; a MUST is always a bug — there are no "soft" MUSTs. +; +; Scope: +; MUST governs code, configuration, CI, and structure. It does NOT govern +; style, preference, or approach — those belong in CLAUDE.md or coding +; standards. MUST is for things that break the project if violated. +; +; Relationship to other contractiles: +; - TRUST: MUST is enforced regardless of trust level. Even maximal-trust +; agents cannot violate MUST constraints. +; - ADJUST: All ADJUST invariants are implicitly MUST invariants too. +; ADJUST exists separately for visibility. +; - INTENT: MUST protects the architectural decisions described in INTENT. +; - DUST: When a feature enters DUST (deprecation), its MUST constraints +; remain active until the feature is fully removed. +; +; Enforcement: +; K9 validators in contractiles/k9/ machine-check MUST constraints. +; CI runs these on every PR. Violations block merge. +; +; ── End Definitions ────────────────────────────────────────────── + +(must-contractile + (version "1.0.0") + (repo "a2ml_gleam") + + ; === Universal Invariants (apply to ALL repos) === + + (invariants + ; Paths + (must "no hardcoded absolute paths (/home/*, /mnt/*, /var/mnt/*)") + (must "all paths use env vars, XDG dirs, or relative references") + + ; Language policy + (must "no new TypeScript files") + (must "no new Python files") + (must "no new Go files") + (must "no npm/bun/yarn/pnpm dependencies — Deno only") + + ; Dangerous patterns + (must "no believe_me (Idris2)") + (must "no assert_total (Idris2)") + (must "no Admitted (Coq)") + (must "no sorry (Lean)") + (must "no unsafeCoerce (Haskell)") + (must "no Obj.magic (OCaml)") + (must "no unsafe {} blocks without safety comment (Rust)") + + ; License + (must "SPDX-License-Identifier header on every source file") + (must "no removal or modification of LICENSE file") + + ; Structure + (must ".machine_readable/ directory preserved") + (must "0-AI-MANIFEST.a2ml preserved") + (must "no SCM files in repo root — only in .machine_readable/") + + ; CI + (must "no removal of CI workflows without explicit approval") + (must "all GitHub Actions SHA-pinned") + + ; Code quality + (must "tests must not be deleted or weakened") + (must "generated code in generated/ directory only") + (must "no introduction of OWASP top 10 vulnerabilities") + + ; ABI/FFI (if applicable) + (must "no modification of ABI contracts without proof update") + (must "no removal of formal verification proofs") + ) + + ; === Project-Specific Invariants === + ; *REMINDER: Add invariants specific to this repo* + ; (must "# Add project-specific invariants here") + + (enforcement + (k9-validator "contractiles/k9/must-check.k9.ncl") + (ci "quality.yml runs must-check on every PR") + ) +) diff --git a/gleam/.machine_readable/TRUST.contractile b/gleam/.machine_readable/TRUST.contractile new file mode 100644 index 0000000..06bc5dd --- /dev/null +++ b/gleam/.machine_readable/TRUST.contractile @@ -0,0 +1,80 @@ +; SPDX-License-Identifier: MPL-2.0 +; TRUST.contractile — Trust boundaries for a2ml_gleam +; Defines what LLM/SLM agents are trusted to do without asking. +; +; Part of the contractile family: MUST, TRUST, DUST, INTENT, ADJUST + +; ── Definitions ────────────────────────────────────────────────── +; +; TRUST (noun/verb) +; The permission contractile. Defines the boundary between what an AI +; agent may do autonomously and what requires human approval. Trust is +; graduated — not binary — with four levels from minimal to maximal. +; +; Trust levels: +; - maximal: Agent may read, build, test, lint, format, heal freely. +; Only destructive/external actions require approval. +; - standard: Agent may read and build. Test/lint need approval. +; - restricted: Agent may read only. All modifications need approval. +; - minimal: Agent may read specific files only. Everything else blocked. +; +; Scope: +; TRUST governs AI agent behaviour only. It does not affect human +; contributors — humans follow CONTRIBUTING.md and GOVERNANCE.adoc. +; +; Relationship to other contractiles: +; - MUST: Trust never overrides MUST. Even at maximal trust, MUST +; violations are blocked. +; - ADJUST: Trust does not exempt from ADJUST. All trust tiers must +; produce accessible output. +; - INTENT: TRUST.trust-deny protects the sensitive areas listed in +; INTENT.ask-before-touching. +; - DUST: Deprecated features have the same trust rules as active ones. +; +; ── End Definitions ────────────────────────────────────────────── + +(trust-contractile + (version "1.0.0") + (repo "a2ml_gleam") + + (trust-level "maximal") ; maximal | standard | restricted | minimal + + ; === Maximal Trust (default) === + ; LLM may freely do these without asking: + (trust-actions + "read" ; Read any file in the repo + "build" ; Run build commands + "test" ; Run test suites + "lint" ; Run linters and formatters + "format" ; Auto-format code + "doctor" ; Run self-diagnostics + "heal" ; Attempt automatic repair + "git-status" ; Check git status + "git-diff" ; View diffs + "git-log" ; View history + ) + + ; === Denied Actions (always require human approval) === + (trust-deny + "delete-branch" ; Could lose work + "force-push" ; Overwrites history + "modify-ci-secrets" ; Security sensitive + "publish" ; External visibility + "push-to-main" ; Protected branch + "delete-files-bulk" ; More than 5 files at once + "modify-license" ; Legal implications + "modify-security-policy" ; Security implications + "remove-proofs" ; Formal verification regression + "disable-ci-checks" ; Safety regression + ) + + ; === Trust Boundary === + (trust-boundary "repo") ; LLM confined to this repo unless explicitly told otherwise + + ; === Override === + ; Repos requiring tighter trust override these settings with justification: + ; (override + ; (trust-level "restricted") + ; (reason "Contains production secrets / handles PII / etc.") + ; ) +) diff --git a/gleam/.machine_readable/agent_instructions/README.adoc b/gleam/.machine_readable/agent_instructions/README.adoc new file mode 100644 index 0000000..1cc7487 --- /dev/null +++ b/gleam/.machine_readable/agent_instructions/README.adoc @@ -0,0 +1,41 @@ +// SPDX-License-Identifier: CC-BY-SA-4.0 +// Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) += Agent Instructions +:toc: preamble + +Methodology-aware configuration for AI agents. Read by any AI agent +(Claude, Gemini, Copilot, etc.) at session start. + +== Files + +[cols="1,3"] +|=== +| File | Purpose + +| `methodology.a2ml` +| Default mode, invariants, ring ceiling, priority weights, convergent budget + +| `coverage.a2ml` +| Session coverage tracking — what was visited, what was skipped, what has MUSTs + +| `debt.a2ml` +| Meander debt — things found but not fixed, carried between sessions +|=== + +== How Agents Use These + +1. Read `methodology.a2ml` at session start — know mode, invariants, ceiling +2. Read `coverage.a2ml` — know what was visited last time, what was skipped +3. Read `debt.a2ml` — know what's outstanding from previous sessions +4. At session end, update `coverage.a2ml` and `debt.a2ml` + +== Relationship to Other Files + +* `AGENTIC.a2ml` says WHAT agents can do (permissions, gating) +* `agent_instructions/` says HOW agents should work (methodology) +* `bot_directives/` says what the gitbot-fleet does (fleet-specific) +* `CLAUDE.md` says how Claude specifically should work (Claude-specific) + +== Reference + +ADR-002 in `standards/agentic-a2ml/docs/ADR-002-methodology-layer.adoc` diff --git a/gleam/.machine_readable/agent_instructions/coverage.a2ml b/gleam/.machine_readable/agent_instructions/coverage.a2ml new file mode 100644 index 0000000..6979664 --- /dev/null +++ b/gleam/.machine_readable/agent_instructions/coverage.a2ml @@ -0,0 +1,61 @@ +# SPDX-License-Identifier: MPL-2.0 +# Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) +# +# coverage.a2ml — Session coverage tracking +# Updated at the end of each AI agent session. +# Persists what was visited, what was skipped, and what has MUSTs. +# +# Reference: ADR-002 in standards/agentic-a2ml/docs/ + +[metadata] +version = "1.0.0" +last-updated = "2026-03-24" + +# ============================================================================ +# COVERAGE STATE +# ============================================================================ +# Updated by agents at session end. Tracks which components have been +# visited and which have known MUSTs that were skipped. + +[coverage] +total-components = 0 +visited-components = 0 +coverage-percent = 0 + +# ============================================================================ +# VISITED COMPONENTS +# ============================================================================ +# Component → session date + ring reached +# Agents add entries as they work through components. +# +# Example: +# [coverage.visited.emergency-room] +# date = "2026-03-23" +# ring = 2 +# fixes = 3 +# notes = "boot-guardian built, shutdown-marshal built" + +# ============================================================================ +# SKIPPED COMPONENTS WITH MUSTS +# ============================================================================ +# Components with known MUSTs that were not visited in the most recent session. +# These become P1 inputs for the next session's Phase 0. +# +# Example: +# [coverage.skipped-musts.session-sentinel] +# priority = "P0" +# issue = "56 SIGABRTs in 4 days, D-Bus race condition" +# discovered = "2026-03-23" + +# ============================================================================ +# CHERRY-PICKING AUDIT +# ============================================================================ +# At session end, agents report whether they chose easy work over hard work. +# This is the accountability mechanism for the weighted priority system. +# +# [coverage.cherry-picking] +# easy-high-completed = 3 +# hard-high-completed = 1 +# easy-low-completed = 2 +# hard-low-deferred = 4 +# assessment = "Correctly prioritised — all MUST items addressed before COULDs" diff --git a/gleam/.machine_readable/agent_instructions/debt.a2ml b/gleam/.machine_readable/agent_instructions/debt.a2ml new file mode 100644 index 0000000..c0238c5 --- /dev/null +++ b/gleam/.machine_readable/agent_instructions/debt.a2ml @@ -0,0 +1,49 @@ +# SPDX-License-Identifier: MPL-2.0 +# Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) +# +# debt.a2ml — Meander debt list +# Things found but not fixed. Carried between sessions. +# Becomes the next session's Phase 0 input. +# +# Reference: ADR-002 in standards/agentic-a2ml/docs/ + +[metadata] +version = "1.0.0" +last-updated = "2026-03-24" + +# ============================================================================ +# DEBT ITEMS +# ============================================================================ +# Each item has: component, issue, effort (easy|medium|hard), impact (high|medium|low), +# priority (should|could), and discovered date. +# +# Items are consumed (removed) when fixed. New items are added at session end. +# The debt list prevents the "one more wave" loop — found things are persisted, +# not forgotten, and not used as justification for infinite meandering. + +# ============================================================================ +# SHOULD — would fix next wave +# ============================================================================ +# These are inputs for the next session if the user says "keep going". +# +# Example: +# [[debt.should]] +# component = "system-tools/monitoring/observatory" +# issue = "Stale duplicate of root observatory/" +# effort = "easy" +# impact = "medium" +# discovered = "2026-03-23" + +# ============================================================================ +# COULD — would fix eventually +# ============================================================================ +# These are low-priority items that don't justify a session on their own. +# They get picked up when an agent is in the area for other reasons. +# +# Example: +# [[debt.could]] +# component = "cicada" +# issue = "RSR_OUTLINE.adoc references banned AGPL-3.0" +# effort = "easy" +# impact = "low" +# discovered = "2026-03-23" diff --git a/gleam/.machine_readable/agent_instructions/methodology.a2ml b/gleam/.machine_readable/agent_instructions/methodology.a2ml new file mode 100644 index 0000000..754f357 --- /dev/null +++ b/gleam/.machine_readable/agent_instructions/methodology.a2ml @@ -0,0 +1,107 @@ +# SPDX-License-Identifier: MPL-2.0 +# Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) +# +# methodology.a2ml — AI agent methodology configuration +# Declares how agents should approach work in this repository. +# Read at session start by any AI agent (Claude, Gemini, Copilot, etc.) +# +# Reference: ADR-002 in standards/agentic-a2ml/docs/ + +[metadata] +version = "1.0.0" +last-updated = "2026-03-24" +spec = "https://github.com/hyperpolymath/standards/blob/main/agentic-a2ml/docs/ADR-002-methodology-layer.adoc" + +# ============================================================================ +# MODE SELECTION +# ============================================================================ +# convergent: find gaps, fill them, build infrastructure (default for ops/infra) +# divergent: find what's strongest, push it further (for research/creative) +# hybrid: audit 20% of budget, then focus 80% on top MUSTs (default for most) + +[methodology] +default-mode = "hybrid" +ring-ceiling = 2 # Hard ceiling for ring expansion (0-3) +wave-cap = 2 # Max waves before requiring user "keep going" +spike-required = true # Every session must ship code, not just designs + +# ============================================================================ +# PRIORITY WEIGHTS +# ============================================================================ +# MUST (3x): Blocking the current work → fix immediately +# SHOULD (2x): Degrading quality of current work → fix if in zone +# COULD (1x): Improving quality of adjacent work → add to debt list + +[methodology.priority-weights] +must = 3 +should = 2 +could = 1 + +# ============================================================================ +# CONVERGENT BUDGET (when mode = convergent or hybrid) +# ============================================================================ +# How to allocate effort across work types. +# Prevents over-polishing docs while structural work waits. + +[methodology.convergent-budget] +structural = 70 # % for new modules, compilation fixes, wiring, integration +corrective = 20 # % for bugs found, broken imports, stale references +perfective = 10 # % for SPDX headers, doc updates, formatting, style + +# ============================================================================ +# UNIQUE STRENGTH (when mode = divergent) +# ============================================================================ +# What makes this project special. Agents should DEEPEN this, not broaden it. +# Customise this per project — the template default is generic. + +[methodology.unique-strength] +description = "{{PROJECT_UNIQUE_STRENGTH}}" +deepen-not-broaden = true + +# ============================================================================ +# DIVERGENT INVARIANTS +# ============================================================================ +# Constraints that divergent mode must NOT violate. +# These are the riverbanks — diverge within them, not across. +# "Amplify uniqueness" means deepen, not broaden. +# +# Test before any divergent action: +# "Does this deepen the existing strength, or add a parallel strength?" +# If parallel → stop. Note as cross-project insight. + +[methodology.divergent-invariants] +rules = [ + # Customise per project. Examples: + # "Idris2 only for formal verification — no Lean4, Coq, Agda", + # "believe_me count must remain zero", + # "FFI architecture: Idris2 → RefC → Zig → C ABI (no shortcuts)", +] + +# Optional: language invariant for the core strength +# If set, divergent mode will not introduce other languages for this purpose +# language-invariant = "idris2" + +# ============================================================================ +# CONSTRAINT HINTS +# ============================================================================ +# Help Phase 0 find the critical chain faster. +# Updated at session end with newly discovered constraints. + +[methodology.known-constraints] +constraints = [ + # Customise per project. Examples: + # "End-to-end build has never been verified", + # "libproject.so does not exist yet — all bindings call stubs", +] + +# ============================================================================ +# STATE FILE VALIDATION +# ============================================================================ +# Phase 0 reads STATE.a2ml first but it may be broken. +# These rules detect corrupt/template/stale state files. + +[methodology.state-validation] +reject-if-contains = ["{{PLACEHOLDER}}", "{{PROJECT}}", "rsr-template-repo"] +reject-if-project-name-mismatch = true +staleness-threshold-days = 90 +fallback-files = ["TODO.md", "TODO.adoc", "ROADMAP.adoc", "README.adoc"] diff --git a/gleam/.machine_readable/anchors/ANCHOR.a2ml b/gleam/.machine_readable/anchors/ANCHOR.a2ml new file mode 100644 index 0000000..7d03160 --- /dev/null +++ b/gleam/.machine_readable/anchors/ANCHOR.a2ml @@ -0,0 +1,18 @@ +# ⚓ ANCHOR: a2ml_gleam +# This is the canonical authority for the a2ml_gleam repository. + +id: "org.hyperpolymath.a2ml_gleam" +version: "1.0.0" +clade: "unknown" +status: "active" + +# SSG Configuration (Unified boj-server build) +ssg: + engine: "casket" + output_dir: "public" + boj_trigger: true + cartridge: "ssg-mcp" + +# Relationships +parents: + - "org.hyperpolymath.boj-server" diff --git a/gleam/.machine_readable/contractiles/dust/Dustfile.a2ml b/gleam/.machine_readable/contractiles/dust/Dustfile.a2ml new file mode 100644 index 0000000..0d619ee --- /dev/null +++ b/gleam/.machine_readable/contractiles/dust/Dustfile.a2ml @@ -0,0 +1,22 @@ +# SPDX-License-Identifier: MPL-2.0 +# Dustfile — Cleanup and Hygiene Contract + +[dustfile] +version = "1.0.0" +format = "a2ml" + +[cleanup] +stale-branch-policy = "delete-after-merge" +artifact-retention = "90-days" +cache-policy = "clear-on-release" + +[hygiene] +linting = "required" +formatting = "required" +dead-code-removal = "encouraged" +todo-tracking = "tracked-in-issues" + +[reversibility] +backup-before-destructive = true +rollback-mechanism = "git-revert" +data-retention-policy = "preserve-30-days" diff --git a/gleam/.machine_readable/contractiles/trust/Trustfile.a2ml b/gleam/.machine_readable/contractiles/trust/Trustfile.a2ml new file mode 100644 index 0000000..0c95e15 --- /dev/null +++ b/gleam/.machine_readable/contractiles/trust/Trustfile.a2ml @@ -0,0 +1,22 @@ +# SPDX-License-Identifier: MPL-2.0 +# Trustfile — Integrity and Provenance Contract + +[trustfile] +version = "1.0.0" +format = "a2ml" + +[provenance] +source-control = "git" +forge = "github" +ci-verified = true +signing-policy = "commit-signing-preferred" + +[integrity] +spdx-compliant = true +license-audit = "required" +dependency-pinning = "sha-pinned" + +[verification] +reproducible-builds = "goal" +sbom-generation = "required" +attestation = "sigstore-preferred" diff --git a/gleam/.machine_readable/descriptiles/STATE.a2ml b/gleam/.machine_readable/descriptiles/STATE.a2ml new file mode 100644 index 0000000..9679315 --- /dev/null +++ b/gleam/.machine_readable/descriptiles/STATE.a2ml @@ -0,0 +1,64 @@ +# SPDX-License-Identifier: MPL-2.0 +# Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) +# +# STATE.a2ml — Project state checkpoint (META-TEMPLATE) +# +# This is the STATE file for rsr-template-repo itself. +# When consumed by a new project, replace REPLACED tokens +# and customize sections below for the target project. + +[metadata] +project = "rsr-template-repo" +version = "0.2.0" +last-updated = "2026-02-28" +status = "active" # active | paused | archived + +[project-context] +name = "rsr-template-repo" +purpose = "Canonical RSR-compliant repository template providing scaffolding for all hyperpolymath projects — including CI/CD, AI manifests, ABI/FFI standards, container ecosystem, and governance infrastructure." +completion-percentage = 95 + +[position] +phase = "maintenance" # design | implementation | testing | maintenance | archived +maturity = "production" # experimental | alpha | beta | production | lts + +[route-to-mvp] +milestones = [ + { name = "Phase 0: Core scaffolding (justfile, CI/CD, .machine_readable)", completion = 100 }, + { name = "Phase 1: ABI/FFI standard (Idris2/Zig templates)", completion = 100 }, + { name = "Phase 1b: AI Gatekeeper Protocol (0-AI-MANIFEST.a2ml)", completion = 100 }, + { name = "Phase 1c: TOPOLOGY.md standard and guide", completion = 100 }, + { name = "Phase 1d: Maintenance gate (axes, checklist, approach)", completion = 100 }, + { name = "Phase 1e: Trustfile / contractiles", completion = 100 }, + { name = "Phase 2: Container ecosystem templates (stapeln)", completion = 100 }, + { name = "Phase 3: Multi-forge sync hardening", completion = 0 }, + { name = "Phase 4: Guix reproducible shells", completion = 50 }, +] + +[blockers-and-issues] +# No active blockers + +[critical-next-actions] +actions = [ + "Container templates complete — test with `just container-init`", + "Validate container templates across wolfi-base and static Chainguard images", + "Harden multi-forge sync for GitLab/Bitbucket mirroring edge cases", + "Expand Guix development shell templates", +] + +[maintenance-status] +last-run-utc = "never" +last-report = "docs/reports/maintenance/latest.json" +last-result = "unknown" # unknown | pass | warn | fail +open-warnings = 0 +open-failures = 0 + +[ecosystem] +part-of = ["RSR Framework", "stapeln ecosystem"] +depends-on = ["stapeln", "selur-compose", "cerro-torre", "svalinn", "vordr", "k9-svc"] + +# --------------------------------------------------------------------------- +# NOTE FOR CONSUMERS: When using this template to create a new repo, reset +# the fields above to your project's values and replace all REPLACED +# tokens. The milestones above describe the TEMPLATE's evolution, not yours. +# --------------------------------------------------------------------------- diff --git a/gleam/.machine_readable/integrations/feedback-o-tron.a2ml b/gleam/.machine_readable/integrations/feedback-o-tron.a2ml new file mode 100644 index 0000000..5381604 --- /dev/null +++ b/gleam/.machine_readable/integrations/feedback-o-tron.a2ml @@ -0,0 +1,13 @@ +# SPDX-License-Identifier: MPL-2.0 +# Feedback-o-Tron Integration — Autonomous Bug Reporting + +[integration] +name = "feedback-o-tron" +type = "bug-reporter" +repository = "https://github.com/hyperpolymath/feedback-o-tron" + +[reporting-config] +platforms = ["github", "gitlab", "bugzilla"] +deduplication = true +audit-logging = true +auto-file-upstream = "on-external-dependency-failure" diff --git a/gleam/.machine_readable/integrations/proven.a2ml b/gleam/.machine_readable/integrations/proven.a2ml new file mode 100644 index 0000000..9af33ff --- /dev/null +++ b/gleam/.machine_readable/integrations/proven.a2ml @@ -0,0 +1,18 @@ +# SPDX-License-Identifier: MPL-2.0 +# Proven Integration — Formally Verified Safety Library + +[integration] +name = "proven" +type = "safety-library" +repository = "https://github.com/hyperpolymath/proven" +version = "1.2.0" + +[binding-policy] +approach = "thin-ffi-wrapper" +unsafe-patterns = "replace-with-proven-equivalent" +modules-available = ["SafeMath", "SafeString", "SafeJSON", "SafeURL", "SafeRegex", "SafeSQL", "SafeFile", "SafeTemplate", "SafeCrypto"] + +[adoption-guidance] +priority = "high" +scope = "all-string-json-url-crypto-operations" +migration = "incremental — replace unsafe patterns as encountered" diff --git a/gleam/.machine_readable/integrations/verisimdb.a2ml b/gleam/.machine_readable/integrations/verisimdb.a2ml new file mode 100644 index 0000000..164c522 --- /dev/null +++ b/gleam/.machine_readable/integrations/verisimdb.a2ml @@ -0,0 +1,15 @@ +# SPDX-License-Identifier: MPL-2.0 +# VeriSimDB Feed — Cross-Repo Analytics Data Store + +[integration] +name = "verisimdb" +type = "data-feed" +repository = "https://github.com/hyperpolymath/nextgen-databases" +data-store = "verisimdb-data" + +[feed-config] +emit-scan-results = true +emit-build-metrics = true +emit-dependency-graph = true +format = "hexad" +destination = "verisimdb-data/feeds/" diff --git a/gleam/.machine_readable/integrations/vexometer.a2ml b/gleam/.machine_readable/integrations/vexometer.a2ml new file mode 100644 index 0000000..238b3d2 --- /dev/null +++ b/gleam/.machine_readable/integrations/vexometer.a2ml @@ -0,0 +1,18 @@ +# SPDX-License-Identifier: MPL-2.0 +# Vexometer Integration — Irritation Surface Analysis + +[integration] +name = "vexometer" +type = "friction-measurement" +repository = "https://github.com/hyperpolymath/vexometer" + +[measurement-config] +dimensions = 10 +emit-isa-reports = true +lazy-eliminator = true +satellite-interventions = true + +[hooks] +cli-tools = "measure-on-error" +ui-panels = "measure-on-interaction" +build-failures = "measure-on-failure" diff --git a/gleam/.machine_readable/root-allow.txt b/gleam/.machine_readable/root-allow.txt new file mode 100644 index 0000000..e8ec204 --- /dev/null +++ b/gleam/.machine_readable/root-allow.txt @@ -0,0 +1,88 @@ +# Canonical root allowlist for RSR-templated repositories. +# +# Lists every entry permitted at the repository root. +# Anything tracked at root that is not in this list is drift and +# must be moved into the appropriate subdirectory (or added here +# with a justification comment). +# +# Used by: scripts/check-root-shape.sh +# Authority: TEMPLATE-STANDARDS-AUDIT.adoc, "Proposed Final Directory Map" +# +# Format: one entry per line; '#' starts a comment; trailing '/' marks a directory. +# Blank lines and comment-only lines are ignored. + +# ─── Authority files (template-mandated) ───────────────────────────────────── +README.adoc +AUDIT.adoc +EXPLAINME.adoc +AFFIRMATION.adoc # dated/signed honesty snapshot (README/EXPLAINME/AFFIRMATION trio) +0-AI-MANIFEST.a2ml # thin pointer to .machine_readable/0.1-AI-MANIFEST.a2ml +GOVERNANCE.adoc # governance model (validator accepts root or docs/governance/) +MAINTAINERS.adoc # maintainer roster +CONTRIBUTING.md # Accepted at root OR .github/ — CI (openssf/quality/rhodibot) now checks both; .github/ is the canonical estate location (org-inherited). Allow-listed if present at root. +SECURITY.md # Accepted at root OR .github/ — see CONTRIBUTING.md note above; security-policy contractile now accepts the .github/ copy. +LICENSE +LICENSES/ # REUSE licence texts (MPL-2.0.txt + CC-BY-SA-4.0.txt) for the dual-licence model (code MPL-2.0 / docs CC-BY-SA-4.0) +CHANGELOG.md +CITATION.cff # citation metadata (surfaced at root by #96) + +# ─── Build entry points (must live at root for their tooling) ──────────────── +Justfile # delegates phases to build/just/*.just +coordination.k9 # repo-local session binding (template-mandated) +abi.ipkg # Idris2 package for the ABI seam; sourcedir=src/interface (estate canon: root-level *-abi.ipkg). Single case-consistent src/interface/Abi/ dir. Typecheck: `idris2 --typecheck abi.ipkg`. + +# ─── Conventional dotfiles (tool-required at root) ─────────────────────────── +.editorconfig +.envrc +.gitattributes +.gitignore +.tool-versions +CLAUDE.md # AI session instructions, generated by the arrival-pack from .machine_readable/ a2ml and read by agents at repo root (do not hand-edit; edit the a2ml source) +.hypatia-ignore # repo-scoped Hypatia scanner exemptions; the scanner reads it from the repo root +sonar-project.properties # SonarCloud analysis config; the SonarQube scan action reads it from the repo root + +# ─── Directories ───────────────────────────────────────────────────────────── +.devcontainer/ # VS Code dev container spec; tool-required at root +.git/ +.github/ # CONTRIBUTING.md, CODE_OF_CONDUCT.md, SECURITY.md, workflows/ +.machine_readable/ # AI manifests, contractiles, custom-format configs +.well-known/ +build/ # contractile.just, setup.sh, guix.scm, .guix-channel, Containerfile +ci/ # .gitlab-ci.yml, .pre-commit-config.yaml (root shims if tools require) +docs/ # onboarding/, status/, governance/, ... +docs-template/ # template-only: scaffolding docs copied into new repos +machine-readable-design/ # template-only: design rationale for .machine_readable/ layout +session/ # dispatch.sh, custom-checks.k9, local-hooks.sh + +# Source / test / artifact trees (project-specific but conventional) +src/ +tests/ +benches/ +examples/ +features/ +scripts/ +verification/ +container/ # may host Containerfile if not at build/ + +# ─── Tolerated pending follow-up (re-evaluate when item lands) ─────────────── +.gitlab-ci.yml # TODO: relocate to ci/.gitlab-ci.yml after GitLab project-setting update +.pre-commit-config.yaml # TODO: relocate to ci/.pre-commit-config.yaml after invocation pattern decided +affinescript/ # AffineScript source subtree consumed by this template +tools/ # TODO: consolidate with scripts/ or document the split (pending decision) +CODE_OF_CONDUCT.md # standard +contractile.just # standard +contractiles # standard +gleam.toml # standard +guix.scm # standard +llm-warmup-dev.md # standard +llm-warmup-user.md # standard +manifest.toml # standard +QUICKSTART-DEV.adoc # standard +QUICKSTART-MAINTAINER.adoc # standard +QUICKSTART-USER.adoc # standard +README.md # standard +setup.sh # standard +stapeln.toml # standard +test # standard +TEST-NEEDS.md # standard +TOPOLOGY.md # standard diff --git a/gleam/.tool-versions b/gleam/.tool-versions new file mode 100644 index 0000000..384f9a2 --- /dev/null +++ b/gleam/.tool-versions @@ -0,0 +1 @@ +gleam 1.14.0 diff --git a/gleam/.well-known/ai.txt b/gleam/.well-known/ai.txt new file mode 100644 index 0000000..94dd799 --- /dev/null +++ b/gleam/.well-known/ai.txt @@ -0,0 +1,18 @@ +# SPDX-License-Identifier: MPL-2.0 +# ai.txt - AI interaction policy +# See: https://site.spawning.ai/spawning-ai-txt + +User-Agent: * +Disallow-Training: yes +Disallow-Summarization: no +Disallow-Generation: yes + +# This project's code is licensed under MPL-2.0. +# AI agents may read and analyze this code for assisting contributors. +# AI agents must NOT use this code for model training without explicit consent. +# AI agents must preserve Emotional Lineage. +# +# For AI agent integration instructions, see: +# 0-AI-MANIFEST.a2ml (universal AI entry point) +# AI.a2ml (Claude-specific instructions) +# .machine_readable/ (structured project state) diff --git a/gleam/.well-known/humans.txt b/gleam/.well-known/humans.txt new file mode 100644 index 0000000..a997582 --- /dev/null +++ b/gleam/.well-known/humans.txt @@ -0,0 +1,14 @@ +# SPDX-License-Identifier: MPL-2.0 +# humanstxt.org + +/* TEAM */ +Maintainer: Jonathan D.A. Jewell (hyperpolymath) +Contact: j.d.a.jewell@open.ac.uk +From: United Kingdom + +/* SITE */ +Last update: 2026-03-28 +Standards: RSR (Rhodium Standard Repository) +License: MPL-2.0 +Components: Idris2 ABI, Zig FFI +Tools: just, Podman, Guix diff --git a/gleam/.well-known/security.txt b/gleam/.well-known/security.txt new file mode 100644 index 0000000..9f831e7 --- /dev/null +++ b/gleam/.well-known/security.txt @@ -0,0 +1,9 @@ +# SPDX-License-Identifier: MPL-2.0 +# RFC 9116 - security.txt +# https://securitytxt.org/ + +Contact: mailto:j.d.a.jewell@open.ac.uk +Expires: 2027-12-31T23:59:59.000Z +Preferred-Languages: en +Canonical: https://github.com/hyperpolymath/a2ml_gleam/.well-known/security.txt +Policy: https://github.com/hyperpolymath/a2ml_gleam/blob/main/SECURITY.md diff --git a/gleam/0-AI-MANIFEST.a2ml b/gleam/0-AI-MANIFEST.a2ml new file mode 100644 index 0000000..64e26d7 --- /dev/null +++ b/gleam/0-AI-MANIFEST.a2ml @@ -0,0 +1,26 @@ +# SPDX-License-Identifier: MPL-2.0 +# 0-AI-MANIFEST.a2ml — Universal AI Agent Entry Point + +[manifest] +version = "0.2" +format = "a2ml" + +[canonical-locations] +machine-readable = ".machine_readable/" +state = ".machine_readable/6a2/STATE.a2ml" +meta = ".machine_readable/6a2/META.a2ml" +ecosystem = ".machine_readable/6a2/ECOSYSTEM.a2ml" +contractiles = ".machine_readable/contractiles/" +bot-directives = ".machine_readable/bot_directives/" + +[invariants] +scm-files-location = ".machine_readable/ ONLY — never root" +container-file = "Containerfile — never Dockerfile" +package-manager = "Deno preferred — never npm" +license = "MPL-2.0" + +[session-startup] +step-1 = "Read this manifest" +step-2 = "Read STATE.a2ml for current project state" +step-3 = "Read META.a2ml for architecture decisions" +step-4 = "Read ECOSYSTEM.a2ml for ecosystem position" diff --git a/gleam/ARCHITECTURE.md b/gleam/ARCHITECTURE.md new file mode 100644 index 0000000..607e3d8 --- /dev/null +++ b/gleam/ARCHITECTURE.md @@ -0,0 +1,47 @@ +# Architecture + +## Overview + +This repository follows a modular, maintainable architecture designed for clarity, scalability, and long-term sustainability. + +## Directory Structure + +``` +. +├── src/ # Source code +├── tests/ # Test suites +├── docs/ # Documentation +├── scripts/ # Utility scripts +├── config/ # Configuration files +├── LICENSE # License file +├── LICENSES/ # Full license texts +└── README.adoc # Project documentation +``` + +## Design Principles + +- **Separation of Concerns**: Each module has a single responsibility +- **Testability**: Code is written to be easily testable +- **Documentation**: All public APIs are documented +- **Configuration**: Environment-specific settings are externalized + +## Dependencies + +- External dependencies are minimized and clearly declared +- Version pinning is used for reproducibility + +## Security Considerations + +- Sensitive data is never committed to the repository +- Secrets are managed through environment variables or secure vaults +- Regular dependency audits are performed + +## Maintainability + +- Code follows consistent style guidelines +- Pull requests require review and CI checks +- Issues and discussions are tracked transparently + +--- + +*Last updated: 2026-07-18* diff --git a/gleam/CHANGELOG.md b/gleam/CHANGELOG.md new file mode 100644 index 0000000..9c190cb --- /dev/null +++ b/gleam/CHANGELOG.md @@ -0,0 +1,51 @@ + + +# Changelog + +All notable changes to `a2ml_gleam` will be documented in this file. + +This file is generated from conventional commits by the +[`changelog-reusable.yml`](https://github.com/hyperpolymath/standards/blob/main/.github/workflows/changelog-reusable.yml) +workflow (`hyperpolymath/standards#206`). Adopt the workflow in this repo's CI to keep this file in sync automatically — see +[`templates/cliff.toml`](https://github.com/hyperpolymath/standards/blob/main/templates/cliff.toml) +for the canonical config. + +The format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/); +this project aims to follow [Semantic Versioning](https://semver.org/spec/v2.0.0.html). + +## [Unreleased] + +### Added + +- feat(crg): add crg-grade and crg-badge justfile recipes +- feat: add stapeln.toml container definition +- feat: add UX Justfile with doctor, tour, help-me, assail recipes +- feat: deploy UX Manifesto infrastructure + +### Fixed + +- fix(ci): sync hypatia-scan.yml to canonical (kill cd-scanner build drift) (#19) +- fix(ci): adopt canonical hypatia-scan.yml (env.HOME/scanner-layout + Comment-step gate) (#18) +- fix(scorecard): enforce granular permissions and add fuzzing placeholder + +### Documentation + +- docs: add TOPOLOGY.md +- docs: substantive CRG C annotation (EXPLAINME.adoc) +- docs: add TEST-NEEDS.md and/or PROOF-NEEDS.md from audit +- docs: add EXPLAINME.adoc — prove-it file backing README claims + +### CI + +- ci: deploy dogfood-gate, add Groove manifest and CRG tests + +## Pre-history + +Prior commits to this file's introduction are recorded in git history but not formally classified into Keep-a-Changelog sections. To backfill, run `git cliff -o CHANGELOG.md` locally using the canonical [`cliff.toml`](https://github.com/hyperpolymath/standards/blob/main/templates/cliff.toml) — this is one-shot mechanical work. + +--- + + diff --git a/gleam/CODE_OF_CONDUCT.md b/gleam/CODE_OF_CONDUCT.md new file mode 100644 index 0000000..caeda1c --- /dev/null +++ b/gleam/CODE_OF_CONDUCT.md @@ -0,0 +1,27 @@ + +# Contributor Covenant Code of Conduct + +## Our Pledge + +We pledge to make participation a harassment-free experience for everyone. + +## Our Standards + +**Positive behavior:** +* Using welcoming language +* Being respectful of differing viewpoints +* Accepting constructive criticism +* Focusing on what is best for the community + +**Unacceptable behavior:** +* Harassment, trolling, or personal attacks +* Publishing private information without permission + +## Enforcement + +Report issues to the maintainers. All complaints will be reviewed. + +## Attribution + +Adapted from [Contributor Covenant](https://www.contributor-covenant.org/) v2.1. + diff --git a/gleam/CONTRIBUTING.md b/gleam/CONTRIBUTING.md new file mode 100644 index 0000000..80ecdac --- /dev/null +++ b/gleam/CONTRIBUTING.md @@ -0,0 +1,66 @@ + +# Contributing + +Thank you for your interest in contributing! We follow a "Dual-Track" architecture where human-readable documentation lives in the root and machine-readable policies live in `.machine_readable/`. + +## How to Contribute + +We welcome contributions in many forms: + +- **Code:** Improving the core stack or extensions +- **Documentation:** Enhancing docs or AI manifests +- **Testing:** Adding property-based tests or formal proofs +- **Bug reports:** Filing clear, reproducible issues + +## Getting Started + +1. **Read the AI Manifest:** Start with `0-AI-MANIFEST.a2ml` (if present) to understand the repository structure. +2. **Environment:** Use `nix develop` or `direnv allow` to set up your tools. +3. **Task Runner:** Use `just` to see available commands (`just --list`). + +## Development Workflow + +### Branch Naming + +``` +docs/short-description # Documentation +test/what-added # Test additions +feat/short-description # New features +fix/issue-number-description # Bug fixes +refactor/what-changed # Code improvements +security/what-fixed # Security fixes +``` + +### Commit Messages + +We follow [Conventional Commits](https://www.conventionalcommits.org/): + +``` +(): + +[optional body] + +[optional footer] +``` + +Types: `feat`, `fix`, `docs`, `test`, `refactor`, `ci`, `chore`, `security` + +## Reporting Bugs + +Before reporting: +1. Search existing issues +2. Check if it's already fixed in `main` + +When reporting, include: +- Clear, descriptive title +- Environment details (OS, versions, toolchain) +- Steps to reproduce +- Expected vs actual behaviour + +## Code of Conduct + +All contributors are expected to adhere to our [Code of Conduct](CODE_OF_CONDUCT.md). + +## License + +By contributing, you agree that your contributions will be licensed under the same license as the project (see [LICENSE](LICENSE)). diff --git a/gleam/EXPLAINME.adoc b/gleam/EXPLAINME.adoc new file mode 100644 index 0000000..5e1077c --- /dev/null +++ b/gleam/EXPLAINME.adoc @@ -0,0 +1,66 @@ +// SPDX-License-Identifier: CC-BY-SA-4.0 += a2ml_gleam — Show Me The Receipts +:toc: +:icons: font + +The README makes claims. This file backs them up. + +== Claims Substantiation + +=== Claim 1: "Full A2ML parser with error reporting, manifest extraction, and roundtrip fidelity (parse then render preserves structure)" + +**How it works:** The Gleam parser (`src/a2ml/parser.gleam`) implements recursive descent parsing over A2ML syntax: headings, paragraphs, directives, attestation blocks, trust levels. Each parse rule returns `Result(Parsed, ParseError)`, enabling error accumulation and recovery (e.g., malformed directive doesn't crash, returns error with position). The renderer (`src/a2ml/renderer.gleam`) walks the AST and emits A2ML text. Roundtrip testing (parse text T, render AST, compare output) validates that structure is preserved. Manifest extraction (`src/a2ml/manifest.gleam`) queries the AST for specific directive blocks (e.g., all `@version` directives) without reparsing. + +**Caveat:** Error recovery is best-effort. Deep nesting or circular references may cause panics. Trust-level validation is structural only (checks enum values); cryptographic verification is external. Manifest extraction is key-based lookup, not full XPath-like queries. + +**Evidence:** `src/a2ml/parser.gleam` implements `parse(text: String) -> Result(Document, ParseError)` with error position tracking. `src/a2ml/renderer.gleam` implements `render(doc: Document) -> String`. Tests in `test/` verify round-trip on realistic A2ML documents. + +=== Claim 2: "Pure Gleam library targeting Hex.pm ecosystem (BEAM and JavaScript compilation)" + +**How it works:** Gleam code compiles to either Erlang bytecode (running on BEAM) or JavaScript (targeting Node.js, Deno, browsers via JavaScript backend). The library has no platform-specific code—it uses only Gleam stdlib (which abstracts over BEAM/JS differences). When published to Hex.pm, the Gleam compiler automatically detects both backends and builds for both. Users can import `a2ml_gleam` in their BEAM-based Elixir/Erlang projects OR in JavaScript-based Gleam projects—same library, two runtimes. + +**Caveat:** BEAM and JavaScript have different performance characteristics. The BEAM version may be faster for parsing large documents (concurrent processes), while JavaScript is lighter for simple applications. Some stdlib functions have slightly different semantics across platforms (error types, garbage collection). The library must avoid platform-specific idioms to maintain parity. + +**Evidence:** `gleam.toml` specifies Gleam version and Hex.pm metadata. No `#[cfg]` or platform conditionals in code. CI tests both `gleam build` (BEAM) and `gleam build --target javascript`. Hex.pm publishes both built artifacts. + +== Technology Choices + +[cols="1,2"] +|=== +| Technology | Learn More + +| **Gleam** | Functional language compiling to Erlang/JavaScript +| **BEAM** | Erlang VM (concurrency, fault tolerance) +| **Hex.pm** | Erlang/Elixir package registry +|=== + +== File Map + +[cols="1,3"] +|=== +| Path | Purpose + +| `src/a2ml/` | Core modules +| `src/a2ml/types.gleam` | Type definitions: Document, Block, Inline, Directive, Attestation, TrustLevel +| `src/a2ml/parser.gleam` | Recursive descent parser: text → Result(Document, ParseError) +| `src/a2ml/renderer.gleam` | AST → text: walk tree, emit A2ML syntax +| `src/a2ml/manifest.gleam` | Manifest extraction: query AST for specific directives +| `src/a2ml.gleam` | Main module: re-exports public API +| `test/` | Test suite +| `test/parser_test.gleam` | Parser unit tests: all syntax forms, error cases +| `test/renderer_test.gleam` | Renderer tests: round-trip fidelity +| `test/manifest_test.gleam` | Manifest extraction tests +| `gleam.toml` | Package manifest: name, version, dependencies, exports +| `README.md` | User documentation with examples +|=== + +== Dogfooted Across The Account + +| Project | Integration | +| **panic-attacker** | Can parse Elixir projects' A2ML manifests via BEAM backend +| **ephapax** | Attestation blocks in A2ML can be linearly typed in Ephapax +| **burble** | Audio metadata could be annotated with A2ML trust levels + +== Readiness + +**CRG Grade:** C (Beta) - Parser and renderer working across BEAM and JavaScript, roundtrip tested, Hex.pm integration ready. Production-ready for manifest parsing; advanced features (recursive queries, cryptographic verification) future work. diff --git a/gleam/GOVERNANCE.md b/gleam/GOVERNANCE.md new file mode 100644 index 0000000..e27364c --- /dev/null +++ b/gleam/GOVERNANCE.md @@ -0,0 +1,60 @@ +# Governance + +## Overview + +This project is governed by the following principles and structures to ensure transparent, inclusive, and effective decision-making. + +## Roles and Responsibilities + +### Maintainers + +Maintainers are responsible for: +- Reviewing and merging pull requests +- Managing releases and versioning +- Ensuring code quality and standards +- Triaging issues and bug reports +- Community engagement and support + +### Contributors + +Contributors are expected to: +- Follow the code of conduct +- Submit well-documented pull requests +- Write tests for new functionality +- Maintain existing tests +- Update documentation as needed + +## Decision Making + +### Minor Changes +- Can be made by any maintainer +- Include bug fixes, documentation updates, dependency updates + +### Major Changes +- Require discussion in issues or pull requests +- Include new features, architectural changes, API changes +- Need approval from at least 2 maintainers + +### Breaking Changes +- Require RFC (Request for Comments) process +- Need approval from majority of maintainers +- Must include migration guide + +## Code of Conduct + +All participants are expected to follow our Code of Conduct. Violations can be reported to the maintainers. + +## Communication + +- **Issues**: For bug reports and feature requests +- **Discussions**: For questions and general discussion +- **Pull Requests**: For code contributions + +## Licensing + +All contributions are made under the terms of the repository's LICENSE file. +By submitting a pull request, you agree to license your contributions accordingly. + +--- + +*Last updated: 2026-07-18* diff --git a/gleam/Justfile b/gleam/Justfile new file mode 100644 index 0000000..2997e72 --- /dev/null +++ b/gleam/Justfile @@ -0,0 +1,72 @@ +# SPDX-License-Identifier: MPL-2.0 +# Justfile for a2ml_gleam + +# Default recipe — list available commands +import? "contractile.just" + +default: + @just --list + +# Self-diagnostic — checks dependencies, permissions, paths +doctor: + @echo "Running diagnostics for a2ml_gleam..." + @echo "Checking required tools..." + @command -v just >/dev/null 2>&1 && echo " [OK] just" || echo " [FAIL] just not found" + @command -v git >/dev/null 2>&1 && echo " [OK] git" || echo " [FAIL] git not found" + @echo "Checking for hardcoded paths..." + @grep -rn '/var/mnt/eclipse' --include='*.rs' --include='*.ex' --include='*.res' --include='*.gleam' --include='*.sh' --include='*.toml' . 2>/dev/null | grep -v 'Justfile' | head -5 || echo " [OK] No hardcoded paths in source" + @echo "Diagnostics complete." + +# Guided tour of key features +tour: + @echo "=== a2ml_gleam Tour ===" + @echo "" + @echo "1. Project structure:" + @ls -la + @echo "" + @echo "2. Available commands: just --list" + @echo "" + @echo "3. Read README.adoc or README.md for full overview" + @echo "4. Read EXPLAINME.adoc for architecture decisions" + @echo "5. Run 'just doctor' to check your setup" + @echo "" + @echo "Tour complete! Try 'just --list' to see all available commands." + +# Open feedback channel with diagnostic context +help-me: + @echo "=== a2ml_gleam Help ===" + @echo "Platform: $(uname -s) $(uname -m)" + @echo "Shell: $SHELL" + @echo "" + @echo "To report an issue:" + @echo " https://github.com/hyperpolymath/a2ml_gleam/issues/new" + @echo "" + @echo "Include the output of 'just doctor' in your report." + +# Run panic-attacker pre-commit scan +assail: + @command -v panic-attack >/dev/null 2>&1 && panic-attack assail . || echo "WARN: panic-attack not found — install from https://github.com/hyperpolymath/panic-attacker" + +# LLM context dump +llm-context: + @echo "Project: a2ml_gleam" + @echo "License: MPL-2.0" + @test -f README.adoc && head -30 README.adoc || test -f README.md && head -30 README.md || echo "No README found" + + +# Print the current CRG grade (reads from READINESS.md '**Current Grade:** X' line) +crg-grade: + @grade=$$(grep -oP '(?<=\*\*Current Grade:\*\* )[A-FX]' READINESS.md 2>/dev/null | head -1); \ + [ -z "$$grade" ] && grade="X"; \ + echo "$$grade" + +# Generate a shields.io badge markdown for the current CRG grade +# Looks for '**Current Grade:** X' in READINESS.md; falls back to X +crg-badge: + @grade=$$(grep -oP '(?<=\*\*Current Grade:\*\* )[A-FX]' READINESS.md 2>/dev/null | head -1); \ + [ -z "$$grade" ] && grade="X"; \ + case "$$grade" in \ + A) color="brightgreen" ;; B) color="green" ;; C) color="yellow" ;; \ + D) color="orange" ;; E) color="red" ;; F) color="critical" ;; \ + *) color="lightgrey" ;; esac; \ + echo "[![CRG $$grade](https://img.shields.io/badge/CRG-$$grade-$$color?style=flat-square)](https://github.com/hyperpolymath/standards/tree/main/component-readiness-grades)" diff --git a/gleam/LICENSE b/gleam/LICENSE new file mode 100644 index 0000000..14e2f77 --- /dev/null +++ b/gleam/LICENSE @@ -0,0 +1,373 @@ +Mozilla Public License Version 2.0 +================================== + +1. Definitions +-------------- + +1.1. "Contributor" + means each individual or legal entity that creates, contributes to + the creation of, or owns Covered Software. + +1.2. "Contributor Version" + means the combination of the Contributions of others (if any) used + by a Contributor and that particular Contributor's Contribution. + +1.3. "Contribution" + means Covered Software of a particular Contributor. + +1.4. "Covered Software" + means Source Code Form to which the initial Contributor has attached + the notice in Exhibit A, the Executable Form of such Source Code + Form, and Modifications of such Source Code Form, in each case + including portions thereof. + +1.5. "Incompatible With Secondary Licenses" + means + + (a) that the initial Contributor has attached the notice described + in Exhibit B to the Covered Software; or + + (b) that the Covered Software was made available under the terms of + version 1.1 or earlier of the License, but not also under the + terms of a Secondary License. + +1.6. "Executable Form" + means any form of the work other than Source Code Form. + +1.7. "Larger Work" + means a work that combines Covered Software with other material, in + a separate file or files, that is not Covered Software. + +1.8. "License" + means this document. + +1.9. "Licensable" + means having the right to grant, to the maximum extent possible, + whether at the time of the initial grant or subsequently, any and + all of the rights conveyed by this License. + +1.10. "Modifications" + means any of the following: + + (a) any file in Source Code Form that results from an addition to, + deletion from, or modification of the contents of Covered + Software; or + + (b) any new file in Source Code Form that contains any Covered + Software. + +1.11. "Patent Claims" of a Contributor + means any patent claim(s), including without limitation, method, + process, and apparatus claims, in any patent Licensable by such + Contributor that would be infringed, but for the grant of the + License, by the making, using, selling, offering for sale, having + made, import, or transfer of either its Contributions or its + Contributor Version. + +1.12. "Secondary License" + means either the GNU General Public License, Version 2.0, the GNU + Lesser General Public License, Version 2.1, the GNU Affero General + Public License, Version 3.0, or any later versions of those + licenses. + +1.13. "Source Code Form" + means the form of the work preferred for making modifications. + +1.14. "You" (or "Your") + means an individual or a legal entity exercising rights under this + License. For legal entities, "You" includes any entity that + controls, is controlled by, or is under common control with You. For + purposes of this definition, "control" means (a) the power, direct + or indirect, to cause the direction or management of such entity, + whether by contract or otherwise, or (b) ownership of more than + fifty percent (50%) of the outstanding shares or beneficial + ownership of such entity. + +2. License Grants and Conditions +-------------------------------- + +2.1. Grants + +Each Contributor hereby grants You a world-wide, royalty-free, +non-exclusive license: + +(a) under intellectual property rights (other than patent or trademark) + Licensable by such Contributor to use, reproduce, make available, + modify, display, perform, distribute, and otherwise exploit its + Contributions, either on an unmodified basis, with Modifications, or + as part of a Larger Work; and + +(b) under Patent Claims of such Contributor to make, use, sell, offer + for sale, have made, import, and otherwise transfer either its + Contributions or its Contributor Version. + +2.2. Effective Date + +The licenses granted in Section 2.1 with respect to any Contribution +become effective for each Contribution on the date the Contributor first +distributes such Contribution. + +2.3. Limitations on Grant Scope + +The licenses granted in this Section 2 are the only rights granted under +this License. No additional rights or licenses will be implied from the +distribution or licensing of Covered Software under this License. +Notwithstanding Section 2.1(b) above, no patent license is granted by a +Contributor: + +(a) for any code that a Contributor has removed from Covered Software; + or + +(b) for infringements caused by: (i) Your and any other third party's + modifications of Covered Software, or (ii) the combination of its + Contributions with other software (except as part of its Contributor + Version); or + +(c) under Patent Claims infringed by Covered Software in the absence of + its Contributions. + +This License does not grant any rights in the trademarks, service marks, +or logos of any Contributor (except as may be necessary to comply with +the notice requirements in Section 3.4). + +2.4. Subsequent Licenses + +No Contributor makes additional grants as a result of Your choice to +distribute the Covered Software under a subsequent version of this +License (see Section 10.2) or under the terms of a Secondary License (if +permitted under the terms of Section 3.3). + +2.5. Representation + +Each Contributor represents that the Contributor believes its +Contributions are its original creation(s) or it has sufficient rights +to grant the rights to its Contributions conveyed by this License. + +2.6. Fair Use + +This License is not intended to limit any rights You have under +applicable copyright doctrines of fair use, fair dealing, or other +equivalents. + +2.7. Conditions + +Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted +in Section 2.1. + +3. Responsibilities +------------------- + +3.1. Distribution of Source Form + +All distribution of Covered Software in Source Code Form, including any +Modifications that You create or to which You contribute, must be under +the terms of this License. You must inform recipients that the Source +Code Form of the Covered Software is governed by the terms of this +License, and how they can obtain a copy of this License. You may not +attempt to alter or restrict the recipients' rights in the Source Code +Form. + +3.2. Distribution of Executable Form + +If You distribute Covered Software in Executable Form then: + +(a) such Covered Software must also be made available in Source Code + Form, as described in Section 3.1, and You must inform recipients of + the Executable Form how they can obtain a copy of such Source Code + Form by reasonable means in a timely manner, at a charge no more + than the cost of distribution to the recipient; and + +(b) You may distribute such Executable Form under the terms of this + License, or sublicense it under different terms, provided that the + license for the Executable Form does not attempt to limit or alter + the recipients' rights in the Source Code Form under this License. + +3.3. Distribution of a Larger Work + +You may create and distribute a Larger Work under terms of Your choice, +provided that You also comply with the requirements of this License for +the Covered Software. If the Larger Work is a combination of Covered +Software with a work governed by one or more Secondary Licenses, and the +Covered Software is not Incompatible With Secondary Licenses, this +License permits You to additionally distribute such Covered Software +under the terms of such Secondary License(s), so that the recipient of +the Larger Work may, at their option, further distribute the Covered +Software under the terms of either this License or such Secondary +License(s). + +3.4. Notices + +You may not remove or alter the substance of any license notices +(including copyright notices, patent notices, disclaimers of warranty, +or limitations of liability) contained within the Source Code Form of +the Covered Software, except that You may alter any license notices to +the extent required to remedy known factual inaccuracies. + +3.5. Application of Additional Terms + +You may choose to offer, and to charge a fee for, warranty, support, +indemnity or liability obligations to one or more recipients of Covered +Software. However, You may do so only on Your own behalf, and not on +behalf of any Contributor. You must make it absolutely clear that any +such warranty, support, indemnity, or liability obligation is offered by +You alone, and You hereby agree to indemnify every Contributor for any +liability incurred by such Contributor as a result of warranty, support, +indemnity or liability terms You offer. You may include additional +disclaimers of warranty and limitations of liability specific to any +jurisdiction. + +4. Inability to Comply Due to Statute or Regulation +--------------------------------------------------- + +If it is impossible for You to comply with any of the terms of this +License with respect to some or all of the Covered Software due to +statute, judicial order, or regulation then You must: (a) comply with +the terms of this License to the maximum extent possible; and (b) +describe the limitations and the code they affect. Such description must +be placed in a text file included with all distributions of the Covered +Software under this License. Except to the extent prohibited by statute +or regulation, such description must be sufficiently detailed for a +recipient of ordinary skill to be able to understand it. + +5. Termination +-------------- + +5.1. The rights granted under this License will terminate automatically +if You fail to comply with any of its terms. However, if You become +compliant, then the rights granted under this License from a particular +Contributor are reinstated (a) provisionally, unless and until such +Contributor explicitly and finally terminates Your grants, and (b) on an +ongoing basis, if such Contributor fails to notify You of the +non-compliance by some reasonable means prior to 60 days after You have +come back into compliance. Moreover, Your grants from a particular +Contributor are reinstated on an ongoing basis if such Contributor +notifies You of the non-compliance by some reasonable means, this is the +first time You have received notice of non-compliance with this License +from such Contributor, and You become compliant prior to 30 days after +Your receipt of the notice. + +5.2. If You initiate litigation against any entity by asserting a patent +infringement claim (excluding declaratory judgment actions, +counter-claims, and cross-claims) alleging that a Contributor Version +directly or indirectly infringes any patent, then the rights granted to +You by any and all Contributors for the Covered Software under Section +2.1 of this License shall terminate. + +5.3. In the event of termination under Sections 5.1 or 5.2 above, all +end user license agreements (excluding distributors and resellers) which +have been validly granted by You or Your distributors under this License +prior to termination shall survive termination. + +************************************************************************ +* * +* 6. Disclaimer of Warranty * +* ------------------------- * +* * +* Covered Software is provided under this License on an "as is" * +* basis, without warranty of any kind, either expressed, implied, or * +* statutory, including, without limitation, warranties that the * +* Covered Software is free of defects, merchantable, fit for a * +* particular purpose or non-infringing. The entire risk as to the * +* quality and performance of the Covered Software is with You. * +* Should any Covered Software prove defective in any respect, You * +* (not any Contributor) assume the cost of any necessary servicing, * +* repair, or correction. This disclaimer of warranty constitutes an * +* essential part of this License. No use of any Covered Software is * +* authorized under this License except under this disclaimer. * +* * +************************************************************************ + +************************************************************************ +* * +* 7. Limitation of Liability * +* -------------------------- * +* * +* Under no circumstances and under no legal theory, whether tort * +* (including negligence), contract, or otherwise, shall any * +* Contributor, or anyone who distributes Covered Software as * +* permitted above, be liable to You for any direct, indirect, * +* special, incidental, or consequential damages of any character * +* including, without limitation, damages for lost profits, loss of * +* goodwill, work stoppage, computer failure or malfunction, or any * +* and all other commercial damages or losses, even if such party * +* shall have been informed of the possibility of such damages. This * +* limitation of liability shall not apply to liability for death or * +* personal injury resulting from such party's negligence to the * +* extent applicable law prohibits such limitation. Some * +* jurisdictions do not allow the exclusion or limitation of * +* incidental or consequential damages, so this exclusion and * +* limitation may not apply to You. * +* * +************************************************************************ + +8. Litigation +------------- + +Any litigation relating to this License may be brought only in the +courts of a jurisdiction where the defendant maintains its principal +place of business and such litigation shall be governed by laws of that +jurisdiction, without reference to its conflict-of-law provisions. +Nothing in this Section shall prevent a party's ability to bring +cross-claims or counter-claims. + +9. Miscellaneous +---------------- + +This License represents the complete agreement concerning the subject +matter hereof. If any provision of this License is held to be +unenforceable, such provision shall be reformed only to the extent +necessary to make it enforceable. Any law or regulation which provides +that the language of a contract shall be construed against the drafter +shall not be used to construe this License against a Contributor. + +10. Versions of the License +--------------------------- + +10.1. New Versions + +Mozilla Foundation is the license steward. Except as provided in Section +10.3, no one other than the license steward has the right to modify or +publish new versions of this License. Each version will be given a +distinguishing version number. + +10.2. Effect of New Versions + +You may distribute the Covered Software under the terms of the version +of the License under which You originally received the Covered Software, +or under the terms of any subsequent version published by the license +steward. + +10.3. Modified Versions + +If you create software not governed by this License, and you want to +create a new license for such software, you may create and use a +modified version of this License if you rename the license and remove +any references to the name of the license steward (except to note that +such modified license differs from this License). + +10.4. Distributing Source Code Form that is Incompatible With Secondary +Licenses + +If You choose to distribute Source Code Form that is Incompatible With +Secondary Licenses under the terms of this version of the License, the +notice described in Exhibit B of this License must be attached. + +Exhibit A - Source Code Form License Notice +------------------------------------------- + + This Source Code Form is subject to the terms of the Mozilla Public + License, v. 2.0. If a copy of the MPL was not distributed with this + file, You can obtain one at http://mozilla.org/MPL/2.0/. + +If it is not possible or desirable to put the notice in a particular +file, then You may include the notice in a location (such as a LICENSE +file in a relevant directory) where a recipient would be likely to look +for such a notice. + +You may add additional accurate notices of copyright ownership. + +Exhibit B - "Incompatible With Secondary Licenses" Notice +--------------------------------------------------------- + + This Source Code Form is "Incompatible With Secondary Licenses", as + defined by the Mozilla Public License, v. 2.0. diff --git a/gleam/LICENSES/CC-BY-SA-4.0.txt b/gleam/LICENSES/CC-BY-SA-4.0.txt new file mode 100644 index 0000000..835a683 --- /dev/null +++ b/gleam/LICENSES/CC-BY-SA-4.0.txt @@ -0,0 +1,170 @@ +Creative Commons Attribution-ShareAlike 4.0 International + + Creative Commons Corporation (“Creative Commons”) is not a law firm and does not provide legal services or legal advice. Distribution of Creative Commons public licenses does not create a lawyer-client or other relationship. Creative Commons makes its licenses and related information available on an “as-is” basis. Creative Commons gives no warranties regarding its licenses, any material licensed under their terms and conditions, or any related information. Creative Commons disclaims all liability for damages resulting from their use to the fullest extent possible. + +Using Creative Commons Public Licenses + +Creative Commons public licenses provide a standard set of terms and conditions that creators and other rights holders may use to share original works of authorship and other material subject to copyright and certain other rights specified in the public license below. The following considerations are for informational purposes only, are not exhaustive, and do not form part of our licenses. + +Considerations for licensors: Our public licenses are intended for use by those authorized to give the public permission to use material in ways otherwise restricted by copyright and certain other rights. Our licenses are irrevocable. Licensors should read and understand the terms and conditions of the license they choose before applying it. Licensors should also secure all rights necessary before applying our licenses so that the public can reuse the material as expected. Licensors should clearly mark any material not subject to the license. This includes other CC-licensed material, or material used under an exception or limitation to copyright. More considerations for licensors. + +Considerations for the public: By using one of our public licenses, a licensor grants the public permission to use the licensed material under specified terms and conditions. If the licensor’s permission is not necessary for any reason–for example, because of any applicable exception or limitation to copyright–then that use is not regulated by the license. Our licenses grant only permissions under copyright and certain other rights that a licensor has authority to grant. Use of the licensed material may still be restricted for other reasons, including because others have copyright or other rights in the material. A licensor may make special requests, such as asking that all changes be marked or described. + +Although not required by our licenses, you are encouraged to respect those requests where reasonable. More considerations for the public. + +Creative Commons Attribution-ShareAlike 4.0 International Public License + +By exercising the Licensed Rights (defined below), You accept and agree to be bound by the terms and conditions of this Creative Commons Attribution-ShareAlike 4.0 International Public License ("Public License"). To the extent this Public License may be interpreted as a contract, You are granted the Licensed Rights in consideration of Your acceptance of these terms and conditions, and the Licensor grants You such rights in consideration of benefits the Licensor receives from making the Licensed Material available under these terms and conditions. + +Section 1 – Definitions. + + a. Adapted Material means material subject to Copyright and Similar Rights that is derived from or based upon the Licensed Material and in which the Licensed Material is translated, altered, arranged, transformed, or otherwise modified in a manner requiring permission under the Copyright and Similar Rights held by the Licensor. For purposes of this Public License, where the Licensed Material is a musical work, performance, or sound recording, Adapted Material is always produced where the Licensed Material is synched in timed relation with a moving image. + + b. Adapter's License means the license You apply to Your Copyright and Similar Rights in Your contributions to Adapted Material in accordance with the terms and conditions of this Public License. + + c. BY-SA Compatible License means a license listed at creativecommons.org/compatiblelicenses, approved by Creative Commons as essentially the equivalent of this Public License. + + d. Copyright and Similar Rights means copyright and/or similar rights closely related to copyright including, without limitation, performance, broadcast, sound recording, and Sui Generis Database Rights, without regard to how the rights are labeled or categorized. For purposes of this Public License, the rights specified in Section 2(b)(1)-(2) are not Copyright and Similar Rights. + + e. Effective Technological Measures means those measures that, in the absence of proper authority, may not be circumvented under laws fulfilling obligations under Article 11 of the WIPO Copyright Treaty adopted on December 20, 1996, and/or similar international agreements. + + f. Exceptions and Limitations means fair use, fair dealing, and/or any other exception or limitation to Copyright and Similar Rights that applies to Your use of the Licensed Material. + + g. License Elements means the license attributes listed in the name of a Creative Commons Public License. The License Elements of this Public License are Attribution and ShareAlike. + + h. Licensed Material means the artistic or literary work, database, or other material to which the Licensor applied this Public License. + + i. Licensed Rights means the rights granted to You subject to the terms and conditions of this Public License, which are limited to all Copyright and Similar Rights that apply to Your use of the Licensed Material and that the Licensor has authority to license. + + j. Licensor means the individual(s) or entity(ies) granting rights under this Public License. + + k. Share means to provide material to the public by any means or process that requires permission under the Licensed Rights, such as reproduction, public display, public performance, distribution, dissemination, communication, or importation, and to make material available to the public including in ways that members of the public may access the material from a place and at a time individually chosen by them. + + l. Sui Generis Database Rights means rights other than copyright resulting from Directive 96/9/EC of the European Parliament and of the Council of 11 March 1996 on the legal protection of databases, as amended and/or succeeded, as well as other essentially equivalent rights anywhere in the world. + + m. You means the individual or entity exercising the Licensed Rights under this Public License. Your has a corresponding meaning. + +Section 2 – Scope. + + a. License grant. + + 1. Subject to the terms and conditions of this Public License, the Licensor hereby grants You a worldwide, royalty-free, non-sublicensable, non-exclusive, irrevocable license to exercise the Licensed Rights in the Licensed Material to: + + A. reproduce and Share the Licensed Material, in whole or in part; and + + B. produce, reproduce, and Share Adapted Material. + + 2. Exceptions and Limitations. For the avoidance of doubt, where Exceptions and Limitations apply to Your use, this Public License does not apply, and You do not need to comply with its terms and conditions. + + 3. Term. The term of this Public License is specified in Section 6(a). + + 4. Media and formats; technical modifications allowed. The Licensor authorizes You to exercise the Licensed Rights in all media and formats whether now known or hereafter created, and to make technical modifications necessary to do so. The Licensor waives and/or agrees not to assert any right or authority to forbid You from making technical modifications necessary to exercise the Licensed Rights, including technical modifications necessary to circumvent Effective Technological Measures. For purposes of this Public License, simply making modifications authorized by this Section 2(a)(4) never produces Adapted Material. + + 5. Downstream recipients. + + A. Offer from the Licensor – Licensed Material. Every recipient of the Licensed Material automatically receives an offer from the Licensor to exercise the Licensed Rights under the terms and conditions of this Public License. + + B. Additional offer from the Licensor – Adapted Material. Every recipient of Adapted Material from You automatically receives an offer from the Licensor to exercise the Licensed Rights in the Adapted Material under the conditions of the Adapter’s License You apply. + + C. No downstream restrictions. You may not offer or impose any additional or different terms or conditions on, or apply any Effective Technological Measures to, the Licensed Material if doing so restricts exercise of the Licensed Rights by any recipient of the Licensed Material. + + 6. No endorsement. Nothing in this Public License constitutes or may be construed as permission to assert or imply that You are, or that Your use of the Licensed Material is, connected with, or sponsored, endorsed, or granted official status by, the Licensor or others designated to receive attribution as provided in Section 3(a)(1)(A)(i). + + b. Other rights. + + 1. Moral rights, such as the right of integrity, are not licensed under this Public License, nor are publicity, privacy, and/or other similar personality rights; however, to the extent possible, the Licensor waives and/or agrees not to assert any such rights held by the Licensor to the limited extent necessary to allow You to exercise the Licensed Rights, but not otherwise. + + 2. Patent and trademark rights are not licensed under this Public License. + + 3. To the extent possible, the Licensor waives any right to collect royalties from You for the exercise of the Licensed Rights, whether directly or through a collecting society under any voluntary or waivable statutory or compulsory licensing scheme. In all other cases the Licensor expressly reserves any right to collect such royalties. + +Section 3 – License Conditions. + +Your exercise of the Licensed Rights is expressly made subject to the following conditions. + + a. Attribution. + + 1. If You Share the Licensed Material (including in modified form), You must: + + A. retain the following if it is supplied by the Licensor with the Licensed Material: + + i. identification of the creator(s) of the Licensed Material and any others designated to receive attribution, in any reasonable manner requested by the Licensor (including by pseudonym if designated); + + ii. a copyright notice; + + iii. a notice that refers to this Public License; + + iv. a notice that refers to the disclaimer of warranties; + + v. a URI or hyperlink to the Licensed Material to the extent reasonably practicable; + + B. indicate if You modified the Licensed Material and retain an indication of any previous modifications; and + + C. indicate the Licensed Material is licensed under this Public License, and include the text of, or the URI or hyperlink to, this Public License. + + 2. You may satisfy the conditions in Section 3(a)(1) in any reasonable manner based on the medium, means, and context in which You Share the Licensed Material. For example, it may be reasonable to satisfy the conditions by providing a URI or hyperlink to a resource that includes the required information. + + 3. If requested by the Licensor, You must remove any of the information required by Section 3(a)(1)(A) to the extent reasonably practicable. + + b. ShareAlike.In addition to the conditions in Section 3(a), if You Share Adapted Material You produce, the following conditions also apply. + + 1. The Adapter’s License You apply must be a Creative Commons license with the same License Elements, this version or later, or a BY-SA Compatible License. + + 2. You must include the text of, or the URI or hyperlink to, the Adapter's License You apply. You may satisfy this condition in any reasonable manner based on the medium, means, and context in which You Share Adapted Material. + + 3. You may not offer or impose any additional or different terms or conditions on, or apply any Effective Technological Measures to, Adapted Material that restrict exercise of the rights granted under the Adapter's License You apply. + +Section 4 – Sui Generis Database Rights. + +Where the Licensed Rights include Sui Generis Database Rights that apply to Your use of the Licensed Material: + + a. for the avoidance of doubt, Section 2(a)(1) grants You the right to extract, reuse, reproduce, and Share all or a substantial portion of the contents of the database; + + b. if You include all or a substantial portion of the database contents in a database in which You have Sui Generis Database Rights, then the database in which You have Sui Generis Database Rights (but not its individual contents) is Adapted Material, including for purposes of Section 3(b); and + + c. You must comply with the conditions in Section 3(a) if You Share all or a substantial portion of the contents of the database. +For the avoidance of doubt, this Section 4 supplements and does not replace Your obligations under this Public License where the Licensed Rights include other Copyright and Similar Rights. + +Section 5 – Disclaimer of Warranties and Limitation of Liability. + + a. Unless otherwise separately undertaken by the Licensor, to the extent possible, the Licensor offers the Licensed Material as-is and as-available, and makes no representations or warranties of any kind concerning the Licensed Material, whether express, implied, statutory, or other. This includes, without limitation, warranties of title, merchantability, fitness for a particular purpose, non-infringement, absence of latent or other defects, accuracy, or the presence or absence of errors, whether or not known or discoverable. Where disclaimers of warranties are not allowed in full or in part, this disclaimer may not apply to You. + + b. To the extent possible, in no event will the Licensor be liable to You on any legal theory (including, without limitation, negligence) or otherwise for any direct, special, indirect, incidental, consequential, punitive, exemplary, or other losses, costs, expenses, or damages arising out of this Public License or use of the Licensed Material, even if the Licensor has been advised of the possibility of such losses, costs, expenses, or damages. Where a limitation of liability is not allowed in full or in part, this limitation may not apply to You. + + c. The disclaimer of warranties and limitation of liability provided above shall be interpreted in a manner that, to the extent possible, most closely approximates an absolute disclaimer and waiver of all liability. + +Section 6 – Term and Termination. + + a. This Public License applies for the term of the Copyright and Similar Rights licensed here. However, if You fail to comply with this Public License, then Your rights under this Public License terminate automatically. + + b. Where Your right to use the Licensed Material has terminated under Section 6(a), it reinstates: + + 1. automatically as of the date the violation is cured, provided it is cured within 30 days of Your discovery of the violation; or + + 2. upon express reinstatement by the Licensor. + + c. For the avoidance of doubt, this Section 6(b) does not affect any right the Licensor may have to seek remedies for Your violations of this Public License. + + d. For the avoidance of doubt, the Licensor may also offer the Licensed Material under separate terms or conditions or stop distributing the Licensed Material at any time; however, doing so will not terminate this Public License. + + e. Sections 1, 5, 6, 7, and 8 survive termination of this Public License. + +Section 7 – Other Terms and Conditions. + + a. The Licensor shall not be bound by any additional or different terms or conditions communicated by You unless expressly agreed. + + b. Any arrangements, understandings, or agreements regarding the Licensed Material not stated herein are separate from and independent of the terms and conditions of this Public License. + +Section 8 – Interpretation. + + a. For the avoidance of doubt, this Public License does not, and shall not be interpreted to, reduce, limit, restrict, or impose conditions on any use of the Licensed Material that could lawfully be made without permission under this Public License. + + b. To the extent possible, if any provision of this Public License is deemed unenforceable, it shall be automatically reformed to the minimum extent necessary to make it enforceable. If the provision cannot be reformed, it shall be severed from this Public License without affecting the enforceability of the remaining terms and conditions. + + c. No term or condition of this Public License will be waived and no failure to comply consented to unless expressly agreed to by the Licensor. + + d. Nothing in this Public License constitutes or may be interpreted as a limitation upon, or waiver of, any privileges and immunities that apply to the Licensor or You, including from the legal processes of any jurisdiction or authority. + +Creative Commons is not a party to its public licenses. Notwithstanding, Creative Commons may elect to apply one of its public licenses to material it publishes and in those instances will be considered the “Licensor.” Except for the limited purpose of indicating that material is shared under a Creative Commons public license or as otherwise permitted by the Creative Commons policies published at creativecommons.org/policies, Creative Commons does not authorize the use of the trademark “Creative Commons” or any other trademark or logo of Creative Commons without its prior written consent including, without limitation, in connection with any unauthorized modifications to any of its public licenses or any other arrangements, understandings, or agreements concerning use of licensed material. For the avoidance of doubt, this paragraph does not form part of the public licenses. + +Creative Commons may be contacted at creativecommons.org. diff --git a/gleam/LICENSES/MPL-2.0.txt b/gleam/LICENSES/MPL-2.0.txt new file mode 100644 index 0000000..14e2f77 --- /dev/null +++ b/gleam/LICENSES/MPL-2.0.txt @@ -0,0 +1,373 @@ +Mozilla Public License Version 2.0 +================================== + +1. Definitions +-------------- + +1.1. "Contributor" + means each individual or legal entity that creates, contributes to + the creation of, or owns Covered Software. + +1.2. "Contributor Version" + means the combination of the Contributions of others (if any) used + by a Contributor and that particular Contributor's Contribution. + +1.3. "Contribution" + means Covered Software of a particular Contributor. + +1.4. "Covered Software" + means Source Code Form to which the initial Contributor has attached + the notice in Exhibit A, the Executable Form of such Source Code + Form, and Modifications of such Source Code Form, in each case + including portions thereof. + +1.5. "Incompatible With Secondary Licenses" + means + + (a) that the initial Contributor has attached the notice described + in Exhibit B to the Covered Software; or + + (b) that the Covered Software was made available under the terms of + version 1.1 or earlier of the License, but not also under the + terms of a Secondary License. + +1.6. "Executable Form" + means any form of the work other than Source Code Form. + +1.7. "Larger Work" + means a work that combines Covered Software with other material, in + a separate file or files, that is not Covered Software. + +1.8. "License" + means this document. + +1.9. "Licensable" + means having the right to grant, to the maximum extent possible, + whether at the time of the initial grant or subsequently, any and + all of the rights conveyed by this License. + +1.10. "Modifications" + means any of the following: + + (a) any file in Source Code Form that results from an addition to, + deletion from, or modification of the contents of Covered + Software; or + + (b) any new file in Source Code Form that contains any Covered + Software. + +1.11. "Patent Claims" of a Contributor + means any patent claim(s), including without limitation, method, + process, and apparatus claims, in any patent Licensable by such + Contributor that would be infringed, but for the grant of the + License, by the making, using, selling, offering for sale, having + made, import, or transfer of either its Contributions or its + Contributor Version. + +1.12. "Secondary License" + means either the GNU General Public License, Version 2.0, the GNU + Lesser General Public License, Version 2.1, the GNU Affero General + Public License, Version 3.0, or any later versions of those + licenses. + +1.13. "Source Code Form" + means the form of the work preferred for making modifications. + +1.14. "You" (or "Your") + means an individual or a legal entity exercising rights under this + License. For legal entities, "You" includes any entity that + controls, is controlled by, or is under common control with You. For + purposes of this definition, "control" means (a) the power, direct + or indirect, to cause the direction or management of such entity, + whether by contract or otherwise, or (b) ownership of more than + fifty percent (50%) of the outstanding shares or beneficial + ownership of such entity. + +2. License Grants and Conditions +-------------------------------- + +2.1. Grants + +Each Contributor hereby grants You a world-wide, royalty-free, +non-exclusive license: + +(a) under intellectual property rights (other than patent or trademark) + Licensable by such Contributor to use, reproduce, make available, + modify, display, perform, distribute, and otherwise exploit its + Contributions, either on an unmodified basis, with Modifications, or + as part of a Larger Work; and + +(b) under Patent Claims of such Contributor to make, use, sell, offer + for sale, have made, import, and otherwise transfer either its + Contributions or its Contributor Version. + +2.2. Effective Date + +The licenses granted in Section 2.1 with respect to any Contribution +become effective for each Contribution on the date the Contributor first +distributes such Contribution. + +2.3. Limitations on Grant Scope + +The licenses granted in this Section 2 are the only rights granted under +this License. No additional rights or licenses will be implied from the +distribution or licensing of Covered Software under this License. +Notwithstanding Section 2.1(b) above, no patent license is granted by a +Contributor: + +(a) for any code that a Contributor has removed from Covered Software; + or + +(b) for infringements caused by: (i) Your and any other third party's + modifications of Covered Software, or (ii) the combination of its + Contributions with other software (except as part of its Contributor + Version); or + +(c) under Patent Claims infringed by Covered Software in the absence of + its Contributions. + +This License does not grant any rights in the trademarks, service marks, +or logos of any Contributor (except as may be necessary to comply with +the notice requirements in Section 3.4). + +2.4. Subsequent Licenses + +No Contributor makes additional grants as a result of Your choice to +distribute the Covered Software under a subsequent version of this +License (see Section 10.2) or under the terms of a Secondary License (if +permitted under the terms of Section 3.3). + +2.5. Representation + +Each Contributor represents that the Contributor believes its +Contributions are its original creation(s) or it has sufficient rights +to grant the rights to its Contributions conveyed by this License. + +2.6. Fair Use + +This License is not intended to limit any rights You have under +applicable copyright doctrines of fair use, fair dealing, or other +equivalents. + +2.7. Conditions + +Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted +in Section 2.1. + +3. Responsibilities +------------------- + +3.1. Distribution of Source Form + +All distribution of Covered Software in Source Code Form, including any +Modifications that You create or to which You contribute, must be under +the terms of this License. You must inform recipients that the Source +Code Form of the Covered Software is governed by the terms of this +License, and how they can obtain a copy of this License. You may not +attempt to alter or restrict the recipients' rights in the Source Code +Form. + +3.2. Distribution of Executable Form + +If You distribute Covered Software in Executable Form then: + +(a) such Covered Software must also be made available in Source Code + Form, as described in Section 3.1, and You must inform recipients of + the Executable Form how they can obtain a copy of such Source Code + Form by reasonable means in a timely manner, at a charge no more + than the cost of distribution to the recipient; and + +(b) You may distribute such Executable Form under the terms of this + License, or sublicense it under different terms, provided that the + license for the Executable Form does not attempt to limit or alter + the recipients' rights in the Source Code Form under this License. + +3.3. Distribution of a Larger Work + +You may create and distribute a Larger Work under terms of Your choice, +provided that You also comply with the requirements of this License for +the Covered Software. If the Larger Work is a combination of Covered +Software with a work governed by one or more Secondary Licenses, and the +Covered Software is not Incompatible With Secondary Licenses, this +License permits You to additionally distribute such Covered Software +under the terms of such Secondary License(s), so that the recipient of +the Larger Work may, at their option, further distribute the Covered +Software under the terms of either this License or such Secondary +License(s). + +3.4. Notices + +You may not remove or alter the substance of any license notices +(including copyright notices, patent notices, disclaimers of warranty, +or limitations of liability) contained within the Source Code Form of +the Covered Software, except that You may alter any license notices to +the extent required to remedy known factual inaccuracies. + +3.5. Application of Additional Terms + +You may choose to offer, and to charge a fee for, warranty, support, +indemnity or liability obligations to one or more recipients of Covered +Software. However, You may do so only on Your own behalf, and not on +behalf of any Contributor. You must make it absolutely clear that any +such warranty, support, indemnity, or liability obligation is offered by +You alone, and You hereby agree to indemnify every Contributor for any +liability incurred by such Contributor as a result of warranty, support, +indemnity or liability terms You offer. You may include additional +disclaimers of warranty and limitations of liability specific to any +jurisdiction. + +4. Inability to Comply Due to Statute or Regulation +--------------------------------------------------- + +If it is impossible for You to comply with any of the terms of this +License with respect to some or all of the Covered Software due to +statute, judicial order, or regulation then You must: (a) comply with +the terms of this License to the maximum extent possible; and (b) +describe the limitations and the code they affect. Such description must +be placed in a text file included with all distributions of the Covered +Software under this License. Except to the extent prohibited by statute +or regulation, such description must be sufficiently detailed for a +recipient of ordinary skill to be able to understand it. + +5. Termination +-------------- + +5.1. The rights granted under this License will terminate automatically +if You fail to comply with any of its terms. However, if You become +compliant, then the rights granted under this License from a particular +Contributor are reinstated (a) provisionally, unless and until such +Contributor explicitly and finally terminates Your grants, and (b) on an +ongoing basis, if such Contributor fails to notify You of the +non-compliance by some reasonable means prior to 60 days after You have +come back into compliance. Moreover, Your grants from a particular +Contributor are reinstated on an ongoing basis if such Contributor +notifies You of the non-compliance by some reasonable means, this is the +first time You have received notice of non-compliance with this License +from such Contributor, and You become compliant prior to 30 days after +Your receipt of the notice. + +5.2. If You initiate litigation against any entity by asserting a patent +infringement claim (excluding declaratory judgment actions, +counter-claims, and cross-claims) alleging that a Contributor Version +directly or indirectly infringes any patent, then the rights granted to +You by any and all Contributors for the Covered Software under Section +2.1 of this License shall terminate. + +5.3. In the event of termination under Sections 5.1 or 5.2 above, all +end user license agreements (excluding distributors and resellers) which +have been validly granted by You or Your distributors under this License +prior to termination shall survive termination. + +************************************************************************ +* * +* 6. Disclaimer of Warranty * +* ------------------------- * +* * +* Covered Software is provided under this License on an "as is" * +* basis, without warranty of any kind, either expressed, implied, or * +* statutory, including, without limitation, warranties that the * +* Covered Software is free of defects, merchantable, fit for a * +* particular purpose or non-infringing. The entire risk as to the * +* quality and performance of the Covered Software is with You. * +* Should any Covered Software prove defective in any respect, You * +* (not any Contributor) assume the cost of any necessary servicing, * +* repair, or correction. This disclaimer of warranty constitutes an * +* essential part of this License. No use of any Covered Software is * +* authorized under this License except under this disclaimer. * +* * +************************************************************************ + +************************************************************************ +* * +* 7. Limitation of Liability * +* -------------------------- * +* * +* Under no circumstances and under no legal theory, whether tort * +* (including negligence), contract, or otherwise, shall any * +* Contributor, or anyone who distributes Covered Software as * +* permitted above, be liable to You for any direct, indirect, * +* special, incidental, or consequential damages of any character * +* including, without limitation, damages for lost profits, loss of * +* goodwill, work stoppage, computer failure or malfunction, or any * +* and all other commercial damages or losses, even if such party * +* shall have been informed of the possibility of such damages. This * +* limitation of liability shall not apply to liability for death or * +* personal injury resulting from such party's negligence to the * +* extent applicable law prohibits such limitation. Some * +* jurisdictions do not allow the exclusion or limitation of * +* incidental or consequential damages, so this exclusion and * +* limitation may not apply to You. * +* * +************************************************************************ + +8. Litigation +------------- + +Any litigation relating to this License may be brought only in the +courts of a jurisdiction where the defendant maintains its principal +place of business and such litigation shall be governed by laws of that +jurisdiction, without reference to its conflict-of-law provisions. +Nothing in this Section shall prevent a party's ability to bring +cross-claims or counter-claims. + +9. Miscellaneous +---------------- + +This License represents the complete agreement concerning the subject +matter hereof. If any provision of this License is held to be +unenforceable, such provision shall be reformed only to the extent +necessary to make it enforceable. Any law or regulation which provides +that the language of a contract shall be construed against the drafter +shall not be used to construe this License against a Contributor. + +10. Versions of the License +--------------------------- + +10.1. New Versions + +Mozilla Foundation is the license steward. Except as provided in Section +10.3, no one other than the license steward has the right to modify or +publish new versions of this License. Each version will be given a +distinguishing version number. + +10.2. Effect of New Versions + +You may distribute the Covered Software under the terms of the version +of the License under which You originally received the Covered Software, +or under the terms of any subsequent version published by the license +steward. + +10.3. Modified Versions + +If you create software not governed by this License, and you want to +create a new license for such software, you may create and use a +modified version of this License if you rename the license and remove +any references to the name of the license steward (except to note that +such modified license differs from this License). + +10.4. Distributing Source Code Form that is Incompatible With Secondary +Licenses + +If You choose to distribute Source Code Form that is Incompatible With +Secondary Licenses under the terms of this version of the License, the +notice described in Exhibit B of this License must be attached. + +Exhibit A - Source Code Form License Notice +------------------------------------------- + + This Source Code Form is subject to the terms of the Mozilla Public + License, v. 2.0. If a copy of the MPL was not distributed with this + file, You can obtain one at http://mozilla.org/MPL/2.0/. + +If it is not possible or desirable to put the notice in a particular +file, then You may include the notice in a location (such as a LICENSE +file in a relevant directory) where a recipient would be likely to look +for such a notice. + +You may add additional accurate notices of copyright ownership. + +Exhibit B - "Incompatible With Secondary Licenses" Notice +--------------------------------------------------------- + + This Source Code Form is "Incompatible With Secondary Licenses", as + defined by the Mozilla Public License, v. 2.0. diff --git a/gleam/MAINTAINERS b/gleam/MAINTAINERS new file mode 100644 index 0000000..37f6411 --- /dev/null +++ b/gleam/MAINTAINERS @@ -0,0 +1,43 @@ +# Maintainers + +This file lists the current maintainers of this project. + +## Active Maintainers + +| Name | GitHub | Role | Since | +|------|--------|------|-------| +| Metadatastician | @metadatastician | Primary | Project Start | + +## Emeritus Maintainers + +None at this time. + +## Becoming a Maintainer + +To become a maintainer: + +1. Demonstrate consistent, high-quality contributions +2. Show understanding of the project's goals and architecture +3. Be active in code reviews and community discussions +4. Be nominated by an existing maintainer +5. Be approved by consensus of existing maintainers + +## Maintainer Responsibilities + +- Reviewing and merging pull requests +- Managing releases +- Triaging issues +- Enforcing code standards +- Mentoring new contributors +- Participating in decision-making + +## Maintainer Expectations + +- Respond to issues and PRs in a timely manner +- Follow the code of conduct +- Be transparent in decision-making +- Communicate clearly and respectfully + +--- + +*Last updated: 2026-07-18* diff --git a/gleam/QUICKSTART-DEV.adoc b/gleam/QUICKSTART-DEV.adoc new file mode 100644 index 0000000..7e262f7 --- /dev/null +++ b/gleam/QUICKSTART-DEV.adoc @@ -0,0 +1,39 @@ += A2Ml_Gleam — Developer Quickstart +:toc: preamble + +Clone, build, test, contribute. + +== Prerequisites + +* Git 2.40+ +* just (command runner) +* See `just doctor` output for language-specific requirements + +== Setup + +[source,bash] +---- +git clone https://github.com/hyperpolymath/a2ml_gleam +cd a2ml_gleam +just doctor # verify toolchain +just heal # auto-install missing tools +---- + +== Development Workflow + +[source,bash] +---- +just tour # understand the codebase +just help-me # see available commands +---- + +== Before Committing + +[source,bash] +---- +just assail # run panic-attacker security scan +---- + +== Contributing + +See link:CONTRIBUTING.md[CONTRIBUTING.md] for guidelines. diff --git a/gleam/QUICKSTART-MAINTAINER.adoc b/gleam/QUICKSTART-MAINTAINER.adoc new file mode 100644 index 0000000..1bfe7fe --- /dev/null +++ b/gleam/QUICKSTART-MAINTAINER.adoc @@ -0,0 +1,40 @@ += A2Ml_Gleam — Maintainer Quickstart +:toc: preamble + +Packaging, deployment, and release management. + +== Prerequisites + +* Git 2.40+ +* just (command runner) +* Familiarity with the project (run `just tour` first) + +== CI/CD + +This project uses GitHub Actions. Workflows are in `.github/workflows/`. + +Key workflows: + +* `hypatia-scan.yml` — Neurosymbolic security scanning +* `codeql.yml` — Code analysis +* `scorecard.yml` — OpenSSF Scorecard +* `mirror.yml` — GitLab/Bitbucket mirroring + +== Releasing + +1. Update version in project config +2. Update CHANGELOG.md +3. Tag: `git tag -s v` +4. Push: `git push origin main --tags` + +== Container Build (if applicable) + +[source,bash] +---- +podman build -f Containerfile -t a2ml_gleam:latest . +---- + +== Mirrors + +This repo is mirrored to GitLab and Bitbucket (hyperpolymath accounts) +via the `mirror.yml` workflow. diff --git a/gleam/QUICKSTART-USER.adoc b/gleam/QUICKSTART-USER.adoc new file mode 100644 index 0000000..83dc786 --- /dev/null +++ b/gleam/QUICKSTART-USER.adoc @@ -0,0 +1,33 @@ += A2Ml_Gleam — User Quickstart +:toc: preamble + +Get up and running in 60 seconds. + +== Prerequisites + +* Git 2.40+ +* just (command runner) — https://just.systems + +== Install + +[source,bash] +---- +git clone https://github.com/hyperpolymath/a2ml_gleam +cd a2ml_gleam +just doctor # check toolchain +just heal # auto-install missing tools +---- + +== First Run + +[source,bash] +---- +just tour # guided project tour +just help-me # see common workflows +---- + +== Get Help + +* `just help-me` — common workflows +* `just doctor` — diagnose toolchain issues +* https://github.com/hyperpolymath/a2ml_gleam/issues — report bugs diff --git a/gleam/README.md b/gleam/README.md new file mode 100644 index 0000000..6bf7108 --- /dev/null +++ b/gleam/README.md @@ -0,0 +1,58 @@ + + +[![OpenSSF Scorecard](https://api.securityscorecards.dev/projects/github.com/hyperpolymath/a2ml_gleam/badge)](https://securityscorecards.dev/viewer/?uri=github.com/hyperpolymath/a2ml_gleam) + +A2ML (AI Attestation Markup Language) parser and renderer for Gleam. + +# Overview + +A pure Gleam library for parsing, manipulating, and rendering A2ML +documents. A2ML is a lightweight markup language for expressing AI +attestations, trust levels, and verification metadata. + +# Features + +- Full A2ML parser with error reporting + +- Renderer for A2ML document output + +- Trust level handling (Unverified, Automated, Reviewed, Verified) + +- Attestation and directive support + +- Manifest extraction + +- Roundtrip fidelity (parse then render preserves structure) + +# Installation + +```sh +gleam add a2ml_gleam +``` + +# Usage + +```gleam +import a2ml_gleam/parser +import a2ml_gleam/renderer + +let assert Ok(doc) = parser.parse("# My Document\n\n@version 1.0") +let output = renderer.render(doc) +``` + +# Testing + +```sh +gleam test +``` + +Wondering how this works? See [EXPLAINME.adoc](EXPLAINME.adoc). + +# License + +SPDX-License-Identifier: CC-BY-SA-4.0\ +(MPL-2.0 preferred; MPL-2.0 required for Hex.pm ecosystem)\ +See [LICENSE](LICENSE). diff --git a/gleam/SECURITY.md b/gleam/SECURITY.md new file mode 100644 index 0000000..d6043a9 --- /dev/null +++ b/gleam/SECURITY.md @@ -0,0 +1,17 @@ + + + + +# Security Policy + +## Reporting a Vulnerability + +Please report security vulnerabilities to j.d.a.jewell@open.ac.uk. + +We will acknowledge receipt within 48 hours and provide a detailed response within 7 days. + +## Supported Versions + +| Version | Supported | +|---------|-----------| +| Latest | Yes | diff --git a/gleam/TEST-NEEDS.md b/gleam/TEST-NEEDS.md new file mode 100644 index 0000000..fc48c2c --- /dev/null +++ b/gleam/TEST-NEEDS.md @@ -0,0 +1,49 @@ +# TEST-NEEDS — a2ml_gleam + + + + +## CRG Grade: C — ACHIEVED 2026-04-04 + +## CRG C — Test Coverage Achieved + +CRG C gate requires: unit, smoke, build, P2P (property-based), E2E, +reflexive, contract, aspect, and benchmark tests. + +| Category | File | Count | Notes | +|---------------|-----------------------------------------|-------|---------------------------------------------| +| Unit | `test/a2ml_gleam_test.gleam` | 12 | Parser, renderer, trust levels, attestation | +| Smoke | `test/a2ml_gleam_test.gleam` | — | Covered by minimal parse/render tests | +| Build | `gleam build` | — | CI gate | +| Property/P2P | `test/a2ml_gleam_property_test.gleam` | 6 | Determinism, roundtrip, invalid input loops | +| E2E | `test/a2ml_gleam_test.gleam` | 1 | Full parse/render/re-parse roundtrip | +| Reflexive | `test/a2ml_gleam_property_test.gleam` | 1 | Trust level string roundtrip identity | +| Contract | `test/a2ml_gleam_contract_test.gleam` | 12 | Named invariants (error/ok guarantees) | +| Aspect | `test/a2ml_gleam_aspect_test.gleam` | 13 | Security, correctness, performance, resilience | +| Benchmark | `test/a2ml_gleam_bench_test.gleam` | 5 | Bulk operation correctness guards | + +**Total: 50 tests, 0 failures** + +## Running Tests + +```bash +gleam test +``` + +## Test Taxonomy (Testing Taxonomy v1.0) + +- **Unit**: individual function correctness +- **Smoke**: essential path does not crash +- **Build**: compilation gate (gleam build) +- **Property/P2P**: determinism, algebraic laws, invariants over many inputs +- **E2E**: full parse → render → re-parse pipeline +- **Reflexive**: trust level string roundtrip identity laws +- **Contract**: named behavioural invariants (error-shape guarantee, etc.) +- **Aspect**: cross-cutting concerns (security input safety, performance bounds, resilience) +- **Benchmark**: bulk operation correctness guards (Gleam has no wall-clock assert harness) + +## Remaining Gaps (Future Work) + +- Real fuzz harness (the `tests/fuzz/placeholder.txt` is a scorecard placeholder only) +- Cross-implementation compatibility tests vs a2ml_ex and a2ml-rs +- BEAM vs JS target performance comparison diff --git a/gleam/TOPOLOGY.md b/gleam/TOPOLOGY.md new file mode 100644 index 0000000..505d4d6 --- /dev/null +++ b/gleam/TOPOLOGY.md @@ -0,0 +1,38 @@ + + + + +# TOPOLOGY.md — a2ml_gleam + +## Purpose + +A pure Gleam library for parsing, manipulating, and rendering A2ML (AI Attestation Markup Language) documents. Provides full A2ML parser with error reporting, manifest extraction, and roundtrip fidelity for trust-level handling. + +## Module Map + +``` +a2ml_gleam/ +├── src/ +│ ├── a2ml/ +│ │ ├── parser.gleam # Recursive descent parser, error recovery +│ │ ├── renderer.gleam # AST → A2ML text output +│ │ └── manifest.gleam # Directive extraction and queries +│ └── a2ml.gleam # Module entry point +├── test/ +│ └── a2ml_gleam_test.gleam # Parser/renderer roundtrip tests +└── gleam.toml # Hex package metadata +``` + +## Data Flow + +``` +[A2ML Text] ──► [Parser] ──► [AST] ──► [Renderer] ──► [A2ML Text] + ↓ + [Manifest Extract] +``` + +## Key Invariants + +- Roundtrip fidelity: parse + render preserves document structure +- Error recovery: malformed directives return errors, don't crash +- Trust-level validation: structural only (enum values), cryptographic verification external diff --git a/gleam/contractile.just b/gleam/contractile.just new file mode 100644 index 0000000..9a5827b --- /dev/null +++ b/gleam/contractile.just @@ -0,0 +1,75 @@ +# Auto-generated by: contractile gen-just +# Source directory: contractiles +# Re-generate with: contractile gen-just --dir contractiles +# +# SPDX-License-Identifier: MPL-2.0 + +# === DUST (Recovery & Rollback) === +# Source: Dustfile.a2ml + +# List available dust recovery actions +dust-status: + @echo ' dust-source-rollback: Revert all source changes to last commit [rollback]' + +# Revert all source changes to last commit +dust-source-rollback: + @echo 'Executing rollback for source-rollback' + git checkout HEAD -- . + + +# === INTEND (Declared Future Intent) === +# Source: Intentfile.a2ml + +# Display declared future intents +intend-list: + @echo '=== Declared Intent ===' + @echo '' + @echo 'Features:' + @echo '' + @echo 'Quality:' + + +# === MUST (Physical State Checks) === +# Source: Mustfile.a2ml + +# Run all must checks +must-check: must-license-present must-readme-present must-spdx-headers must-no-banned-files + @echo 'All must checks passed' + +# LICENSE file must exist +must-license-present: + test -f LICENSE + +# README must exist +must-readme-present: + test -f README.adoc || test -f README.md + +# Source files should have SPDX license headers +must-spdx-headers: + find . -name '*.rs' -o -name '*.res' -o -name '*.gleam' | head -20 | xargs -r grep -L 'SPDX-License-Identifier' | wc -l | grep -q '^0$' + +# No Dockerfiles or Makefiles +must-no-banned-files: + test ! -f Dockerfile && test ! -f Makefile + + +# === TRUST (Integrity & Provenance Verification) === +# Source: Trustfile.a2ml + +# Run all trust verifications +trust-verify: trust-license-content trust-no-secrets-committed trust-container-images-pinned + @echo 'All trust verifications passed' + +# LICENSE contains expected SPDX identifier +trust-license-content: + grep -q 'SPDX\|License\|MIT\|Apache\|PMPL\|MPL' LICENSE + +# No .env or credential files in repo +trust-no-secrets-committed: + test ! -f .env && test ! -f credentials.json && test ! -f .env.local + +# Containerfile base images use pinned digests +trust-container-images-pinned: + test ! -f Containerfile || grep -q '@sha256:' Containerfile + + diff --git a/gleam/contractiles/intend/Intentfile.a2ml b/gleam/contractiles/intend/Intentfile.a2ml new file mode 100644 index 0000000..9f2de20 --- /dev/null +++ b/gleam/contractiles/intend/Intentfile.a2ml @@ -0,0 +1,22 @@ +# SPDX-License-Identifier: MPL-2.0 +# Intentfile (A2ML Canonical) +# Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) + +@abstract: +Declared intent and purpose for A2Ml_Gleam. +@end + +## Purpose + +A2Ml_Gleam — + +## Anti-Purpose + +This project is NOT: +- A fork or wrapper around another tool +- A monorepo (unless explicitly structured as one) + +## If In Doubt + +If you are unsure whether a change is in scope, ask. +Sensitive areas: ABI definitions, license headers, CI workflows. diff --git a/gleam/contractiles/must/Mustfile.a2ml b/gleam/contractiles/must/Mustfile.a2ml new file mode 100644 index 0000000..f3527b3 --- /dev/null +++ b/gleam/contractiles/must/Mustfile.a2ml @@ -0,0 +1,42 @@ +# SPDX-License-Identifier: MPL-2.0 +# Mustfile (A2ML Canonical) +# Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) + +@abstract: +Physical State contract for A2Ml_Gleam. Baseline UX Manifesto invariants +that MUST hold at all times. +@end + +@requires: +- section: Core-Files +- section: Banned +@end + +## Core-Files + +### license-present +- description: LICENSE file must exist +- run: test -f LICENSE +- severity: critical + +### readme-present +- description: README must exist +- run: test -f README.adoc || test -f README.md +- severity: critical + +## Banned + +### no-hardcoded-paths +- description: No hardcoded developer paths +- run: "! grep -rn '$HOME\|$ECLIPSE_DIR' --include='*.rs' --include='*.res' --include='*.ex' --include='*.gleam' --include='*.zig' --include='*.sh' . 2>/dev/null | grep -v '.git/' | grep -v 'ux-rollout.jl' | head -1" +- severity: critical + +### no-dockerfiles +- description: No Dockerfiles (use Containerfile) +- run: test ! -f Dockerfile +- severity: warning + +### no-makefiles +- description: No Makefiles (use Justfile) +- run: test ! -f Makefile +- severity: warning diff --git a/gleam/contractiles/trust/Trustfile.a2ml b/gleam/contractiles/trust/Trustfile.a2ml new file mode 100644 index 0000000..f353275 --- /dev/null +++ b/gleam/contractiles/trust/Trustfile.a2ml @@ -0,0 +1,25 @@ +# SPDX-License-Identifier: MPL-2.0 +# Trustfile (A2ML Canonical) +# Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) + +@abstract: +Trust and provenance verification for A2Ml_Gleam. +Maximal trust by default — LLM may read, build, test, lint, format. +@end + +@trust-level: maximal +@trust-boundary: repo +@trust-actions: [read, build, test, lint, format] +@trust-deny: [delete-branch, force-push, modify-ci-secrets, publish] + +## Integrity + +### license-content +- description: LICENSE contains expected SPDX identifier +- run: grep -q 'SPDX\|License\|MIT\|Apache\|PMPL\|MPL' LICENSE +- severity: critical + +### no-secrets-committed +- description: No .env or credential files in repo +- run: test ! -f .env && test ! -f credentials.json && test ! -f .env.local +- severity: critical diff --git a/gleam/docs/architecture.adoc b/gleam/docs/architecture.adoc new file mode 100644 index 0000000..ed3facd --- /dev/null +++ b/gleam/docs/architecture.adoc @@ -0,0 +1,78 @@ +// SPDX-License-Identifier: CC-BY-SA-4.0 +// SPDX-FileCopyrightText: 2026 Jonathan D.A. Jewell (hyperpolymath) <6759885+hyperpolymath@users.noreply.github.com> += Architecture — a2ml_gleam +:revdate: 2026-MM-DD + +== System overview + +One paragraph: what this project does and what it does not do. State the +*invariant* — the property that, if violated, would make the whole project +pointless. Future maintainers will read this paragraph first. + +== Component diagram + +Replace this section with an ASCII or Mermaid diagram. Keep it under 20 +lines — anything bigger belongs in `architecture/`. + +[source] +---- ++------------------+ +------------------+ +| Component A | ---> | Component B | ++------------------+ +------------------+ + | + v ++------------------+ +| Component C | ++------------------+ +---- + +== Data flow + +For each external input, describe: + +* **Source**: where it comes from. +* **Validation**: what guarantees we enforce on entry. +* **Transformation**: high-level processing stages. +* **Sink**: where the result goes. + +== Key invariants + +Enumerate the load-bearing invariants of the system. Each should have: + +. A one-line statement. +. The code location(s) that enforce it. +. The failure mode if the invariant is violated. + +Example: + +[cols="1,2,2,2", options="header"] +|=== +| # | Invariant | Enforced at | Failure mode + +| 1 +| All HTTP requests carry a valid `X-Request-ID`. +| `src/middleware/request_id.rs` +| Logs become unjoinable; correlation breaks. + +| 2 +| The output buffer is always flushed before exit. +| `src/main.rs:88-92` (Drop impl) +| Last ~16KB of log lost on crash. +|=== + +== Dependencies + +* **Internal**: list other hyperpolymath repos this depends on. +* **External**: SHA-pinned (see `Cargo.lock` / `deno.lock` / etc.). +* **Build-time**: tools required to build (just, deno, cargo, …). + +== Out of scope + +Explicit non-goals. Things we deliberately do *not* do, with a one-line +reason for each. This section saves more time than the rest combined. + +== See also + +* link:./usage.adoc[Usage] — consumer perspective. +* link:./contributing.adoc[Contributing] — developer setup. +* link:./decisions/[ADRs] — historical record of why this shape. diff --git a/gleam/docs/contributing.adoc b/gleam/docs/contributing.adoc new file mode 100644 index 0000000..f831cc3 --- /dev/null +++ b/gleam/docs/contributing.adoc @@ -0,0 +1,90 @@ +// SPDX-License-Identifier: CC-BY-SA-4.0 +// SPDX-FileCopyrightText: 2026 Jonathan D.A. Jewell (hyperpolymath) <6759885+hyperpolymath@users.noreply.github.com> += Contributing — a2ml_gleam +:revdate: 2026-MM-DD + +== Audience + +Developers working *on* `a2ml_gleam`. For consumers (people calling +or depending on it) see link:./usage.adoc[usage.adoc]. + +== Local-dev setup + +Prerequisites — the minimum versions and where to get them: + +* `` v`` — ``. +* `` v`` — ``. +* GPG signing key configured (estate policy — all commits must be + signed). See + link:https://github.com/hyperpolymath/standards/blob/main/docs/secure-coding-training.md[standards/docs/secure-coding-training.md]. + +One-shot setup: + +[source,bash] +---- +git clone git@github.com:hyperpolymath/a2ml_gleam.git +cd a2ml_gleam +just setup # installs deps, sets up hooks +just test # runs the full test suite +---- + +== Running tests + +* **Unit**: `just test-unit` — fast, no I/O. +* **Integration**: `just test-int` — uses real services (database, + HTTP, etc.). Estate policy: prefer real over mocked + (see `feedback_integration_tests_real_db` in maintainer's memory). +* **Property**: `just test-prop` — randomised, slower; budget + documented in `docs/proof-debt.md` if applicable. +* **Full**: `just test` — runs all of the above. + +== Code style + +We enforce style via CI (governance-reusable.yml from hyperpolymath/standards). +Locally: + +[source,bash] +---- +just fmt # auto-format +just lint # static checks +---- + +* All commits must be **GPG-signed** (CI enforces; see + link:https://github.com/hyperpolymath/standards[standards]). +* All source files must carry an **SPDX-License-Identifier** header + (CI enforces). +* Conventional commits — `feat`, `fix`, `chore`, `refactor`, `docs`, + `test`, `ci`, `revert` (CHANGELOG is auto-generated from these + via link:https://github.com/hyperpolymath/standards/blob/main/.github/workflows/changelog-reusable.yml[`changelog-reusable.yml`]). + +== Branching & PR workflow + +. Branch off `main` as `claude/` (for AI agents) or + `/` (for humans). +. Make focused, narrow commits — one logical change per commit. +. Open a PR against `main`. +. **Enable auto-merge immediately** on every PR you open + (`gh pr merge --auto --squash`) — estate standing policy + (see standards#196 audit and policies). +. CI must be green. The PR auto-merges when checks pass + reviews land. + +== Adding a new dependency + +. State the *why* in the PR body — what does this dependency unlock? +. Check provenance (maintained, audited, no malicious history). +. Pin to a SHA, not a tag. +. Update `docs/architecture.adoc#Dependencies`. + +== Adding an ADR + +When you make a non-obvious design decision, write it down: + +. Copy `docs/decisions/0001-template.adoc` → `0002-.adoc`. +. Fill in: Context, Decision, Consequences, Alternatives. +. Link the ADR from the README or relevant code as a comment. + +== Reporting issues + +* Bugs in `a2ml_gleam`: file at `hyperpolymath/a2ml_gleam/issues`. +* Estate-wide concerns (policy, conventions, CI): file at + `hyperpolymath/standards/issues`. diff --git a/gleam/docs/decisions/0001-template.adoc b/gleam/docs/decisions/0001-template.adoc new file mode 100644 index 0000000..0ebe392 --- /dev/null +++ b/gleam/docs/decisions/0001-template.adoc @@ -0,0 +1,53 @@ +// SPDX-License-Identifier: CC-BY-SA-4.0 +// SPDX-FileCopyrightText: 2026 Jonathan D.A. Jewell (hyperpolymath) <6759885+hyperpolymath@users.noreply.github.com> += ADR-0001 — Use Architecture Decision Records +:revdate: 2026-MM-DD +:status: ACCEPTED + +== Context + +We need a lightweight way to record significant architectural decisions +and the reasoning behind them, so future maintainers (and AI agents) +can understand *why* the project is shaped as it is. + +== Decision + +Adopt link:https://adr.github.io/[Architecture Decision Records (ADRs)] +in `docs/decisions/`, numbered sequentially (0001, 0002, ...). + +* Each ADR is a single `.adoc` file. +* The first ADR (this one) records the decision to use ADRs. +* Status values: PROPOSED, ACCEPTED, DEPRECATED, SUPERSEDED. +* When a decision is overturned, the new ADR records the supersession + and updates the old one's status to `SUPERSEDED by 00NN`. + +== Consequences + +. **Positive**: future readers see *why* without git-archaeology. +. **Positive**: design alternatives are documented, not just the + winning choice. +. **Positive**: ADRs are reviewable in PRs — the design discussion + happens alongside the code that implements it. +. **Negative**: maintenance burden — every non-obvious decision now + warrants an ADR. (We mitigate by keeping ADRs short; "non-obvious" + is a judgment call.) +. **Negative**: ADRs can rot. We accept this; the SUPERSEDED chain + is the recovery mechanism. + +== Alternatives considered + +. **Comments in code** — too local; doesn't capture cross-cutting + decisions. +. **Wiki / external doc** — drifts from code; not in PR review. +. **Commit messages** — too transient and not discoverable. +. **No record** — discarded; this is how every project ends up with + "I don't know why we do it this way" debt. + +== Companion ADRs + +* (None yet — this is the first ADR.) + +== References + +* MADR template — `https://adr.github.io/madr/` +* Estate convention — `hyperpolymath/standards/docs/RSR_OUTLINE.adoc` diff --git a/gleam/docs/tech-debt-2026-05-26.md b/gleam/docs/tech-debt-2026-05-26.md new file mode 100644 index 0000000..be976eb --- /dev/null +++ b/gleam/docs/tech-debt-2026-05-26.md @@ -0,0 +1,57 @@ + + +# Tech-Debt Audit — a2ml_gleam — 2026-05-26 + +**Source:** estate-wide automated scan 2026-05-26. +**Companion:** [`hyperpolymath/standards` 2026-05-26-estate-*-debt audits](https://github.com/hyperpolymath/standards/tree/main/docs/audits). +**Combined severity:** `MEDIUM`. + +This file records the *raw findings* — it does not by itself fix the debt. Each section ends with a 'Recommended next move' line; closing the debt is follow-up work. + +## 1. Proof debt + +No proof-bearing files (`*.v`, `*.lean`, `*.agda`, `*.idr`, `*.idr2`, `*.fst`, `*.dfy`, `*.tla`, `*.ads`, `*.adb`) found in this repo. + +**Recommended next move:** none. + +## 2. Licence debt + +| Field | Value | +|---|---| +| LICENSE file | `LICENSE` | +| SPDX header | `MPL-2.0` | +| Manifest licence | `NONE` | +| Body classifier | `Palimp-MPL-2.0` | +| Severity | `ok` | + +**Recommended next move:** none for licence. + +## 3. Documentation debt + +| Field | Value | +|---|---| +| README lines | 58 | +| `docs/` files | 0 | +| `docs/` LoC | 0 | +| CHANGELOG.md | N | +| CONTRIBUTING.md | Y | +| CODE_OF_CONDUCT.md | Y | +| SECURITY.md | Y | +| Severity | `MEDIUM` | + +**Recommended next move:** introduce a `docs/` directory. The README at 58 lines has likely grown to do the work of `docs/` — split it into a thin README + `docs/architecture.md`, `docs/usage.md`, etc. Heavy-wiki exemplars to copy from: `affinescript`, `boj-server`, `echidna`, `hypatia`. + +Additionally: **CHANGELOG.md is missing.** 65% of estate repos lack one — adopting a CHANGELOG (or auto-generating via `git-cliff`) is a recommended estate-wide follow-up. + +## Cross-references + +- Estate proof-debt audit: `hyperpolymath/standards/docs/audits/2026-05-26-estate-proof-debt.md` +- Estate licence-debt audit: `hyperpolymath/standards/docs/audits/2026-05-26-estate-licence-debt.md` +- Estate documentation-debt audit: `hyperpolymath/standards/docs/audits/2026-05-26-estate-documentation-debt.md` + +--- + +🤖 Generated by Claude Code estate-wide tech-debt scan (2026-05-26). This file is informational — closing the debt is follow-up work owned by the maintainer. diff --git a/gleam/docs/troubleshooting.adoc b/gleam/docs/troubleshooting.adoc new file mode 100644 index 0000000..279eb8b --- /dev/null +++ b/gleam/docs/troubleshooting.adoc @@ -0,0 +1,57 @@ +// SPDX-License-Identifier: CC-BY-SA-4.0 +// SPDX-FileCopyrightText: 2026 Jonathan D.A. Jewell (hyperpolymath) <6759885+hyperpolymath@users.noreply.github.com> += Troubleshooting — a2ml_gleam +:revdate: 2026-MM-DD + +This file is a *living FAQ* — known failure modes and recovery paths. +Add a new entry every time you debug something that took more than 15 +minutes; future-you (and other maintainers) will thank you. + +== Known failure modes + +=== `` + +**Symptom**: short reproduction. What does the user see? + +**Cause**: root cause (one or two sentences). + +**Fix**: +[source,bash] +---- + +---- + +**Avoidance**: how to not hit this again (config setting, doc link, etc.). + +--- + +=== `` + +(Replace this and the above example with real entries as you encounter +them.) + +== Diagnostic toolkit + +When something is wrong, run these first: + +[source,bash] +---- +just doctor # runs all available self-checks +just version # prints the version & build hash +just log-tail # last N lines of logs +---- + +== When to escalate + +. Filed an issue with: version, OS, exact command, full error output, + and the symptom in plain English. +. Linked from the issue: the relevant ADR(s) and any related issues. +. For *security*-relevant findings, see + link:./../SECURITY.md[SECURITY.md] — do **not** file public issues. + +== Where to look for more help + +* `docs/architecture.adoc` — internals. +* `docs/decisions/` — historical record of why things are this shape. +* `https://github.com/hyperpolymath/a2ml_gleam/issues?q=is%3Aissue+` — has anyone hit this before? +* `https://github.com/hyperpolymath/standards/issues` — for estate-wide problems. diff --git a/gleam/docs/usage.adoc b/gleam/docs/usage.adoc new file mode 100644 index 0000000..d89bed9 --- /dev/null +++ b/gleam/docs/usage.adoc @@ -0,0 +1,81 @@ +// SPDX-License-Identifier: CC-BY-SA-4.0 +// SPDX-FileCopyrightText: 2026 Jonathan D.A. Jewell (hyperpolymath) <6759885+hyperpolymath@users.noreply.github.com> += Usage — a2ml_gleam +:revdate: 2026-MM-DD + +== Audience + +This document is for *consumers* of `a2ml_gleam` — people who depend +on it, call it, or include it. For developers working *on* it, see +link:./contributing.adoc[contributing.adoc]. + +== Quickstart + +The shortest path from zero to a working call: + +[source,bash] +---- +# 1. Install +just install # or: cargo install --path . / deno task install + +# 2. Configure +cp examples/config.example.toml ./config.toml +# Edit minimal required fields. + +# 3. Run +just run # or the equivalent for your language +---- + +Expected output: + +[source] +---- +a2ml_gleam v0.0.0 +Listening on 127.0.0.1:8080 +---- + +== Common use cases + +For each canonical use case, give: + +. A one-line statement of the goal. +. The minimal invocation. +. Expected output / side effect. + +=== Use case 1: + +(Replace with real content.) + +=== Use case 2: + +== Configuration reference + +Document every configurable field. Keep this section authoritative — if +the code grows a new option, this table must grow too (CI can be wired +to enforce this). + +[cols="1,1,1,3", options="header"] +|=== +| Field | Type | Default | Meaning + +| `` | `` | `` | +|=== + +== Stability guarantees + +Be explicit: + +* **Stable**: API surfaces that follow SemVer (breaking change = major bump). +* **Unstable**: behind a flag / pre-1.0 / explicitly marked. +* **Internal**: documented for reference but no compatibility promise. + +== Limits & known constraints + +* Maximum supported ``: ``. +* `` is not yet implemented; track at issue `#`. +* On ``, `` behaves differently because ``. + +== See also + +* link:./architecture.adoc[Architecture] — how it works internally. +* link:./troubleshooting.adoc[Troubleshooting] — when things go wrong. diff --git a/gleam/gleam.toml b/gleam/gleam.toml new file mode 100644 index 0000000..a561ed3 --- /dev/null +++ b/gleam/gleam.toml @@ -0,0 +1,12 @@ +name = "a2ml_gleam" +version = "0.1.0" +description = "A2ML (AI Attestation Markup Language) parser and renderer for Gleam" +licences = ["MPL-2.0"] +repository = { type = "github", user = "hyperpolymath", repo = "a2ml_gleam" } +links = [{ title = "A2ML Specification", href = "https://github.com/hyperpolymath/a2ml-showcase" }] + +[dependencies] +gleam_stdlib = ">= 0.44.0 and < 2.0.0" + +[dev-dependencies] +gleeunit = ">= 1.0.0 and < 2.0.0" diff --git a/gleam/guix.scm b/gleam/guix.scm new file mode 100644 index 0000000..4f90062 --- /dev/null +++ b/gleam/guix.scm @@ -0,0 +1,18 @@ +; SPDX-License-Identifier: MPL-2.0 +;; guix.scm — GNU Guix package definition for a2ml_gleam +;; Usage: guix shell -f guix.scm + +(use-modules (guix packages) + (guix build-system gnu) + (guix licenses)) + +(package + (name "a2ml_gleam") + (version "0.1.0") + (source #f) + (build-system gnu-build-system) + (synopsis "a2ml_gleam") + (description "a2ml_gleam — part of the hyperpolymath ecosystem.") + (home-page "https://github.com/hyperpolymath/a2ml_gleam") + (license ((@@ (guix licenses) license) "MPL-2.0" + "https://github.com/hyperpolymath/palimpsest-license"))) diff --git a/gleam/llm-warmup-dev.md b/gleam/llm-warmup-dev.md new file mode 100644 index 0000000..126ff8a --- /dev/null +++ b/gleam/llm-warmup-dev.md @@ -0,0 +1,16 @@ +# LLM Warmup — a2ml_gleam (Developer) + +## What is a2ml_gleam? +See README.adoc for overview. + +## Key Commands +- `just setup` — set up development environment +- `just build` — build the project +- `just test` — run tests +- `just doctor` — diagnose issues +- `just heal` — attempt auto-repair + +## Quick Context +- License: MPL-2.0 +- Part of hyperpolymath ecosystem +- See EXPLAINME.adoc for architecture diff --git a/gleam/llm-warmup-user.md b/gleam/llm-warmup-user.md new file mode 100644 index 0000000..41a9387 --- /dev/null +++ b/gleam/llm-warmup-user.md @@ -0,0 +1,16 @@ +# LLM Warmup — a2ml_gleam (User) + +## What is a2ml_gleam? +See README.adoc for overview. + +## Key Commands +- `just setup` — set up development environment +- `just build` — build the project +- `just test` — run tests +- `just doctor` — diagnose issues +- `just heal` — attempt auto-repair + +## Quick Context +- License: MPL-2.0 +- Part of hyperpolymath ecosystem +- See EXPLAINME.adoc for architecture diff --git a/gleam/manifest.toml b/gleam/manifest.toml new file mode 100644 index 0000000..c79796d --- /dev/null +++ b/gleam/manifest.toml @@ -0,0 +1,11 @@ +# This file was generated by Gleam +# You typically do not need to edit this file + +packages = [ + { name = "gleam_stdlib", version = "0.70.0", build_tools = ["gleam"], requirements = [], otp_app = "gleam_stdlib", source = "hex", outer_checksum = "86949BF5D1F0E4AC0AB5B06F235D8A5CC11A2DFC33BF22F752156ED61CA7D0FF" }, + { name = "gleeunit", version = "1.9.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleeunit", source = "hex", outer_checksum = "DA9553CE58B67924B3C631F96FE3370C49EB6D6DC6B384EC4862CC4AAA718F3C" }, +] + +[requirements] +gleam_stdlib = { version = ">= 0.44.0 and < 2.0.0" } +gleeunit = { version = ">= 1.0.0 and < 2.0.0" } diff --git a/gleam/mise.toml b/gleam/mise.toml new file mode 100644 index 0000000..6dd983f --- /dev/null +++ b/gleam/mise.toml @@ -0,0 +1,57 @@ +[tools] +# Language runtimes +node = "latest" +python = "latest" +rust = "latest" +go = "latest" +zig = "latest" +java = "latest" +bun = "latest" +denojs = "latest" + +# Package managers +npm = "latest" +yarn = "latest" +pnpm = "latest" +pip = "latest" +cargo = "latest" +go-task = "latest" + +# Formatting & Linting +gofmt = "latest" +black = "latest" +isort = "latest" +ruff = "latest" +prettier = "latest" +shfmt = "latest" +stylua = "latest" + +# Build tools +cmake = "latest" +make = "latest" +ninja = "latest" + +# Shell tools +git = "latest" +gnu-sed = "latest" +gnu-tar = "latest" +gnu-grep = "latest" + +# Testing +vitest = "latest" +pytest = "latest" +jest = "latest" + +[env] +# Common environment variables +NODE_ENV = "development" +PYTHONDONTWRITEBYTECODE = "1" +PYTHONUNBUFFERED = "1" + +# Task runner alias +[alias] +task = "go-task" +build = "cargo build --release || npm run build || go build" +test = "cargo test || npm test || go test ./..." +lint = "ruff check . || prettier --check . || black --check ." +fmt = "ruff format . || prettier --write . || black ." diff --git a/gleam/scripts/check-no-md-in-docs.sh b/gleam/scripts/check-no-md-in-docs.sh new file mode 100644 index 0000000..102a6b8 --- /dev/null +++ b/gleam/scripts/check-no-md-in-docs.sh @@ -0,0 +1,57 @@ +#!/usr/bin/env bash +# SPDX-License-Identifier: MPL-2.0 +# Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) +# +# check-no-md-in-docs.sh — enforce "AsciiDoc by default for general docs". +# +# Estate rule: .adoc for general docs (TOPOLOGY, READINESS, ROADMAP, etc.); +# .md only for files GitHub's community-health rules special-case by name +# (CONTRIBUTING, CODE_OF_CONDUCT, SECURITY, CHANGELOG, etc.) — those live at +# root or in .github/, never under docs/. +# +# Fails if any .md files exist under docs/. Add justified entries to the +# ALLOWED list below if a docs/-rooted .md is genuinely needed (rare). +# +# Exit codes: +# 0 — no .md files under docs/ (or all matches are allow-listed) +# 1 — disallowed .md files found +# 2 — usage / setup error + +set -euo pipefail + +REPO_ROOT="${1:-.}" +DOCS_DIR="$REPO_ROOT/docs" + +# Justified exceptions, relative to repo root. Empty by default. +ALLOWED=() + +if [ ! -d "$DOCS_DIR" ]; then + echo "PASS: no docs/ directory (nothing to check)" + exit 0 +fi + +mapfile -t HITS < <(find "$DOCS_DIR" -name '*.md' -type f 2>/dev/null | sort) + +EXTRAS=() +for hit in "${HITS[@]}"; do + rel="${hit#"$REPO_ROOT/"}" + skip=0 + for allowed in "${ALLOWED[@]}"; do + if [ "$rel" = "$allowed" ]; then skip=1; break; fi + done + if [ $skip -eq 0 ]; then EXTRAS+=("$rel"); fi +done + +if [ ${#EXTRAS[@]} -eq 0 ]; then + echo "PASS: no .md files under docs/ (${#HITS[@]} total found, ${#ALLOWED[@]} allow-listed)" + exit 0 +fi + +echo "FAIL: ${#EXTRAS[@]} .md files found under docs/ (estate rule: AsciiDoc by default):" >&2 +for e in "${EXTRAS[@]}"; do + echo " - $e" >&2 +done +echo "" >&2 +echo "Convert these to .adoc, or add a justified entry to the ALLOWED list" >&2 +echo "in scripts/check-no-md-in-docs.sh." >&2 +exit 1 diff --git a/gleam/scripts/check-no-vlang.sh b/gleam/scripts/check-no-vlang.sh new file mode 100644 index 0000000..f2125a3 --- /dev/null +++ b/gleam/scripts/check-no-vlang.sh @@ -0,0 +1,81 @@ +#!/usr/bin/env bash +# SPDX-License-Identifier: MPL-2.0 +# Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) +# +# check-no-vlang.sh — enforce "V-lang is banned in the estate". +# +# Estate rule: V-lang (vlang.io) is banned estate-wide (2026-04-10). It was +# migrated to Zig — the estate's default FFI/API/gateway language — via the +# `zig-unified-api-adapter`. Zig is ALLOWED and is deliberately NOT matched by +# this check; only V-lang references are treated as drift and must be removed. +# +# Searches for V-lang-specific content patterns in tracked files. The .v file +# extension is intentionally NOT used as a marker because Coq theorem files +# share that extension; this check looks at content patterns instead. +# +# Excludes: +# .git/ (vcs internals) +# affinescript/ (a separately-licensed AffineScript subtree; pattern hits +# there are not estate-managed and false-positive on `.v` mentions in +# linguistic / academic prose). +# +# Exit codes: +# 0 — no V-lang references found +# 1 — V-lang references found (treat as drift) +# 2 — usage / setup error + +set -euo pipefail + +REPO_ROOT="${1:-.}" + +# Patterns that uniquely indicate V-lang code, scaffolding, or naming. +# Zig is the estate FFI/API default and is deliberately NOT matched here. +# Coq's `.v` extension and the affinescript subtree are excluded by path. +PATTERNS=( + 'gen-v-connector' + 'V-TRIPLE' + 'v-triple' + 'vlang' + 'connectors/v-' +) + +PATTERN_OR=$(IFS='|'; echo "${PATTERNS[*]}") + +# Files that document the V-lang ban itself (the rule's own description +# legitimately names "V-lang", "vlang", "V-TRIPLE", etc.). Excluded by name. +DOC_EXCLUSIONS=( + "estate-rules.yml" # the workflow that calls this script + "check-no-vlang.sh" # this script itself + "PLAYBOOK.a2ml" # documents the [rsr-repo-skeleton] rules + "feedback_v_lang_banned.md" # memory entry documenting the ban + "project_zig_unified_api.md" # memory entry documenting the replacement +) + +EXCLUDE_ARGS=() +for f in "${DOC_EXCLUSIONS[@]}"; do + EXCLUDE_ARGS+=(--exclude="$f") +done + +# Build grep arguments. Use -r to recurse, -n for line numbers, -i for +# case-insensitive matching. Exclude .git, the affinescript subtree, and +# files that legitimately document the ban. +HITS=$(grep -rni -E "$PATTERN_OR" "$REPO_ROOT" \ + --exclude-dir=.git \ + --exclude-dir=affinescript \ + --exclude-dir=node_modules \ + "${EXCLUDE_ARGS[@]}" \ + 2>/dev/null || true) + +if [ -z "$HITS" ]; then + echo "PASS: no V-lang references" + exit 0 +fi + +# Count matches +LINES=$(echo "$HITS" | wc -l | tr -d ' ') + +echo "FAIL: $LINES V-lang reference(s) found (estate rule: V-lang is banned):" >&2 +echo "$HITS" | sed 's|^| |' >&2 +echo "" >&2 +echo "V-lang has been replaced by Zig (the zig-unified-api-adapter). Remove these references." >&2 +exit 1 diff --git a/gleam/scripts/check-root-shape.sh b/gleam/scripts/check-root-shape.sh new file mode 100644 index 0000000..8f75343 --- /dev/null +++ b/gleam/scripts/check-root-shape.sh @@ -0,0 +1,70 @@ +#!/usr/bin/env bash +# SPDX-License-Identifier: MPL-2.0 +# Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) +# +# check-root-shape.sh — fail when the repository root contains entries that +# are not on the canonical allowlist (.machine_readable/root-allow.txt). +# +# Companion to scripts/validate-template.sh: that script enforces required +# files; this one enforces that nothing else has crept in. +# +# Exit codes: +# 0 — root matches allowlist +# 1 — extras found at root (drift) +# 2 — usage / setup error + +set -euo pipefail + +REPO_ROOT="${1:-.}" +ALLOW_FILE="${REPO_ROOT}/.machine_readable/root-allow.txt" + +if [ ! -f "$ALLOW_FILE" ]; then + echo "ERROR: allowlist not found at $ALLOW_FILE" >&2 + exit 2 +fi + +# Build the allow set: strip comments, trailing slashes, and blank lines. +mapfile -t ALLOW < <( + sed -E 's/[[:space:]]*#.*$//' "$ALLOW_FILE" \ + | sed -E 's|/$||' \ + | awk 'NF' +) + +declare -A ALLOW_SET=() +for entry in "${ALLOW[@]}"; do + ALLOW_SET["$entry"]=1 +done + +# Enumerate everything tracked or present at the repository root. +mapfile -t ACTUAL < <( + cd "$REPO_ROOT" && \ + find . -mindepth 1 -maxdepth 1 \ + ! -name '.' \ + -printf '%f\n' \ + | sort +) + +EXTRAS=() +for entry in "${ACTUAL[@]}"; do + if [ -z "${ALLOW_SET[$entry]+x}" ]; then + EXTRAS+=("$entry") + fi +done + +if [ ${#EXTRAS[@]} -eq 0 ]; then + echo "PASS: root matches allowlist (${#ACTUAL[@]} entries, ${#ALLOW[@]} permitted)" + exit 0 +fi + +echo "FAIL: ${#EXTRAS[@]} root entries are not on the allowlist:" >&2 +for e in "${EXTRAS[@]}"; do + if [ -d "$REPO_ROOT/$e" ]; then + echo " - $e/ (directory)" >&2 + else + echo " - $e" >&2 + fi +done +echo "" >&2 +echo "Either move them into the appropriate subdirectory, or add a justified" >&2 +echo "entry to .machine_readable/root-allow.txt." >&2 +exit 1 diff --git a/gleam/scripts/invariant-path.sh b/gleam/scripts/invariant-path.sh new file mode 100755 index 0000000..3f7c05b --- /dev/null +++ b/gleam/scripts/invariant-path.sh @@ -0,0 +1,31 @@ +#!/usr/bin/env bash +set -euo pipefail + +SCRIPT_DIR="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd)" +REPO_ROOT="$(cd -- "${SCRIPT_DIR}/.." && pwd)" +IP_ROOT="${REPO_ROOT}/../invariant-path" + +if [[ ! -f "${IP_ROOT}/Cargo.toml" ]]; then + echo "invariant-path workspace not found at ${IP_ROOT}" >&2 + exit 1 +fi + +if [[ $# -eq 0 ]]; then + set -- scan --profile generic --file "${REPO_ROOT}/README.adoc" --artifact-uri "repo://README.adoc" +elif [[ "$1" == "scan" ]]; then + shift + has_profile="false" + for arg in "$@"; do + if [[ "$arg" == "--profile" ]]; then + has_profile="true" + break + fi + done + if [[ "${has_profile}" == "true" ]]; then + set -- scan "$@" + else + set -- scan --profile generic "$@" + fi +fi + +exec cargo run --manifest-path "${IP_ROOT}/Cargo.toml" -p invariant-path-cli -- "$@" diff --git a/gleam/scripts/validate-template.sh b/gleam/scripts/validate-template.sh new file mode 100755 index 0000000..cdc914d --- /dev/null +++ b/gleam/scripts/validate-template.sh @@ -0,0 +1,382 @@ +#!/bin/bash +# SPDX-License-Identifier: MPL-2.0 +# Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) +# +# RSR Template Validation Script +# Verifies that a repository follows the RSR template structure and contains all required files +# +# Exit codes: +# 0 = validation passed +# 1 = validation failed with errors +# 2 = validation failed with warnings (but can proceed) + +set -euo pipefail + +REPO_ROOT="${1:-.}" +VERBOSE="${2:-0}" +ERRORS=0 +WARNINGS=0 + +# ANSI colors +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +BLUE='\033[0;34m' +NC='\033[0m' # No Color + +# Helper functions +log_error() { + echo -e "${RED}ERROR${NC}: $*" >&2 + ERRORS=$((ERRORS + 1)) +} + +log_warning() { + echo -e "${YELLOW}WARN${NC}: $*" >&2 + WARNINGS=$((WARNINGS + 1)) +} + +log_info() { + echo -e "${BLUE}INFO${NC}: $*" >&2 +} + +log_pass() { + echo -e "${GREEN}PASS${NC}: $*" >&2 +} + +check_file_exists() { + local file="$1" + local description="${2:-}" + if [ -f "$REPO_ROOT/$file" ]; then + [ "$VERBOSE" = "1" ] && log_pass "File exists: $file" + return 0 + else + log_error "Required file missing: $file ${description:+(${description})}" + return 1 + fi +} + +check_dir_exists() { + local dir="$1" + local description="${2:-}" + if [ -d "$REPO_ROOT/$dir" ]; then + [ "$VERBOSE" = "1" ] && log_pass "Directory exists: $dir" + return 0 + else + log_error "Required directory missing: $dir ${description:+(${description})}" + return 1 + fi +} + +# Case-tolerant ABI seam checks: accept the canonical case-consistent +# src/interface/Abi/ (matches `module Abi.*`) OR a lowercase src/interface/abi/ +# that some downstream repos ship. Never require BOTH (that would be a case-fold +# collision on case-insensitive filesystems). +check_abi_dir_exists() { + local description="${1:-}" + if [ -d "$REPO_ROOT/src/interface/Abi" ] || [ -d "$REPO_ROOT/src/interface/abi" ]; then + [ "$VERBOSE" = "1" ] && log_pass "Directory exists: src/interface/{Abi,abi}" + return 0 + fi + log_error "Required directory missing: src/interface/Abi ${description:+(${description})}" + return 1 +} +check_abi_file_exists() { + local fname="$1" + local description="${2:-}" + if [ -f "$REPO_ROOT/src/interface/Abi/$fname" ] || [ -f "$REPO_ROOT/src/interface/abi/$fname" ]; then + [ "$VERBOSE" = "1" ] && log_pass "File exists: src/interface/{Abi,abi}/$fname" + return 0 + fi + log_error "Required file missing: src/interface/Abi/$fname ${description:+(${description})}" + return 1 +} + +has_spdx_header() { + local file="$1" + if head -10 "$file" | grep -q "SPDX-License-Identifier"; then + return 0 + fi + return 1 +} + +has_placeholder() { + local file="$1" + if grep -q "{{REPO\|{{OWNER\|{{FORGE\|{{PROJECT\|{{project\|{{AUTHOR" "$file" 2>/dev/null; then + return 0 + fi + return 1 +} + +#============================================================================== +# VALIDATION PHASE 1: CORE STRUCTURE +#============================================================================== + +echo "" +log_info "Phase 1: Core repository structure" +echo "" + +# Root files +check_file_exists "0-AI-MANIFEST.a2ml" "AI manifest (universal entry point)" +check_file_exists "README.adoc" "High-level pitch" +check_file_exists "EXPLAINME.adoc" "Developer deep-dive" +check_file_exists "LICENSE" "License file" +check_file_exists "Justfile" "Task runner" +check_file_exists "AUDIT.adoc" "Release audit gate" + +# Directories +check_dir_exists ".machine_readable" "Machine-readable metadata" +check_dir_exists ".github" "GitHub community metadata" +check_abi_dir_exists "Idris2 ABI definitions" +check_dir_exists "src/interface/ffi" "Zig FFI implementation" +check_dir_exists "src/interface/generated/abi" "Generated C headers" +check_dir_exists "docs" "Documentation" + +#============================================================================== +# VALIDATION PHASE 2: MACHINE-READABLE METADATA +#============================================================================== + +echo "" +log_info "Phase 2: Machine-readable metadata (.machine_readable/)" +echo "" + +check_file_exists ".machine_readable/descriptiles/STATE.a2ml" "Project state" +check_file_exists ".machine_readable/descriptiles/META.a2ml" "Architecture decisions" +check_file_exists ".machine_readable/descriptiles/ECOSYSTEM.a2ml" "Ecosystem position" +check_file_exists ".machine_readable/descriptiles/anchors/ANCHOR.a2ml" "Semantic boundary anchor" +check_file_exists ".machine_readable/policies/MAINTENANCE-AXES.a2ml" "Maintenance axes" + +#============================================================================== +# VALIDATION PHASE 3: REQUIRED WORKFLOWS (17 minimum) +#============================================================================== + +echo "" +log_info "Phase 3: GitHub Actions workflows" +echo "" + +REQUIRED_WORKFLOWS=( + "hypatia-scan.yml" + "codeql.yml" + "scorecard.yml" + "quality.yml" + "mirror.yml" + "instant-sync.yml" + "guix-policy.yml" + "security-policy.yml" + "wellknown-enforcement.yml" + "workflow-linter.yml" + "npm-bun-blocker.yml" + "ts-blocker.yml" + "secret-scanner.yml" +) + +# Check required workflows +for workflow in "${REQUIRED_WORKFLOWS[@]}"; do + if [ -f "$REPO_ROOT/.github/workflows/$workflow" ]; then + [ "$VERBOSE" = "1" ] && log_pass "Workflow found: $workflow" + else + log_error "Required workflow missing: $workflow" + fi +done + +# Verify all workflows have SPDX headers and proper structure +WORKFLOW_FILES=$(find "$REPO_ROOT/.github/workflows" -name "*.yml" -type f 2>/dev/null || true) +WORKFLOW_COUNT=$(echo "$WORKFLOW_FILES" | grep -c "." || true) + +if [ "$WORKFLOW_COUNT" -ge 15 ]; then + log_pass "Found $WORKFLOW_COUNT workflows (>= 15 expected)" +else + log_warning "Found only $WORKFLOW_COUNT workflows (expected >= 15)" +fi + +# Spot-check workflow files for issues +while IFS= read -r workflow_file; do + if [ -z "$workflow_file" ]; then continue; fi + + # Check for SPDX header (optional in YAML workflows, but best practice) + if ! head -5 "$workflow_file" | grep -q "SPDX-License-Identifier"; then + log_warning "Workflow missing SPDX header: $(basename "$workflow_file")" + fi + + # Check for proper YAML structure + if ! grep -q "^name:" "$workflow_file"; then + log_error "Workflow missing 'name' field: $(basename "$workflow_file")" + fi +done <<< "$WORKFLOW_FILES" + +#============================================================================== +# VALIDATION PHASE 4: ABI/FFI SOURCE FILES +#============================================================================== + +echo "" +log_info "Phase 4: Idris2 ABI and Zig FFI source files" +echo "" + +# Idris2 ABI files +check_abi_file_exists "Types.idr" "Core type definitions" +check_abi_file_exists "Layout.idr" "Memory layout specifications" +check_abi_file_exists "Foreign.idr" "FFI foreign declarations" + +# Zig FFI files +check_file_exists "src/interface/ffi/build.zig" "Zig build configuration" +check_file_exists "src/interface/ffi/src/main.zig" "Zig implementation" +check_file_exists "src/interface/ffi/test/integration_test.zig" "Integration tests" + +#============================================================================== +# VALIDATION PHASE 5: PLACEHOLDER TOKENS +#============================================================================== + +echo "" +log_info "Phase 5: Placeholder token replacement (skipped in template repo)" +echo "" + +# Note: Template repo is allowed to have placeholders +# For derived repos, we'd check that placeholders are replaced +if [ "$(basename "$REPO_ROOT")" = "rsr-template-repo" ]; then + log_pass "Skipping placeholder check for template repo" +else + # Check that key files don't have unresolved placeholders + for file in "$REPO_ROOT/README.adoc" "$REPO_ROOT/Justfile" "$REPO_ROOT/.machine_readable/descriptiles/STATE.a2ml"; do + if [ -f "$file" ]; then + if has_placeholder "$file"; then + log_warning "File contains unresolved placeholders: $(basename "$file")" + fi + fi + done +fi + +#============================================================================== +# VALIDATION PHASE 6: SPDX LICENSE HEADERS +#============================================================================== + +echo "" +log_info "Phase 6: SPDX License Headers" +echo "" + +# Check source files for SPDX headers (excluding build artifacts) +SOURCE_FILES=$(find "$REPO_ROOT/src" -type f \( -name "*.idr" -o -name "*.zig" \) \ + ! -path "*/.zig-cache/*" ! -path "*/zig-cache/*" 2>/dev/null || true) +SOURCE_COUNT=$(echo "$SOURCE_FILES" | grep -c "." || true) +SPDX_COUNT=0 + +while IFS= read -r src_file; do + if [ -z "$src_file" ]; then continue; fi + if has_spdx_header "$src_file"; then + SPDX_COUNT=$((SPDX_COUNT + 1)) + else + log_warning "Source file missing SPDX header: $(basename "$src_file")" + fi +done <<< "$SOURCE_FILES" + +if [ "$SOURCE_COUNT" -gt 0 ]; then + PERCENT=$((SPDX_COUNT * 100 / SOURCE_COUNT)) + log_pass "SPDX headers: $SPDX_COUNT/$SOURCE_COUNT ($PERCENT%)" + if [ "$PERCENT" -lt 100 ]; then + log_warning "Not all source files have SPDX headers" + fi +fi + +#============================================================================== +# VALIDATION PHASE 7: BUILD VERIFICATION +#============================================================================== + +echo "" +log_info "Phase 7: Build system verification" +echo "" + +# Check Zig build +if [ -f "$REPO_ROOT/src/interface/ffi/build.zig" ]; then + if command -v zig &> /dev/null; then + cd "$REPO_ROOT/src/interface/ffi" + if zig build 2>&1 | grep -q "error"; then + log_error "Zig build failed" + else + log_pass "Zig build successful" + fi + cd - > /dev/null + else + log_warning "Zig compiler not found - skipping Zig build check" + fi +else + log_error "Zig build.zig not found" +fi + +# Check Idris2. Prefer a REAL typecheck via the package (abi.ipkg sets the +# sourcedir so the `module Abi.*` namespace resolves); this catches namespace / +# path / import breakage that a bare per-file `idris2 --check` masks as a +# tolerated "module name does not match file name" warning. +if command -v idris2 &> /dev/null; then + if [ -f "$REPO_ROOT/abi.ipkg" ]; then + if (cd "$REPO_ROOT" && idris2 --typecheck abi.ipkg) > /dev/null 2>&1; then + log_pass "Idris2 ABI typechecks (abi.ipkg)" + else + log_error "Idris2 ABI does NOT typecheck (abi.ipkg)" + fi + else + # No package: fall back to a best-effort per-file syntax check (warns on + # the expected namespace/path mismatch). Look in either case of the dir. + IDS_FILES=$(find "$REPO_ROOT/src/interface/Abi" "$REPO_ROOT/src/interface/abi" -name "*.idr" -type f 2>/dev/null || true) + while IFS= read -r ids_file; do + if [ -z "$ids_file" ]; then continue; fi + if ! idris2 --check "$ids_file" 2>&1 | grep -q "Error"; then + log_pass "Idris2 syntax OK: $(basename "$ids_file")" + else + log_warning "Idris2 syntax issue: $(basename "$ids_file")" + fi + done <<< "$IDS_FILES" + fi +else + log_warning "Idris2 compiler not found - skipping Idris2 syntax checks" +fi + +#============================================================================== +# VALIDATION PHASE 8: DOCUMENTATION +#============================================================================== + +echo "" +log_info "Phase 8: Documentation requirements" +echo "" + +check_file_exists "docs/developer/ABI-FFI-README.adoc" "ABI/FFI documentation" +# TOPOLOGY may live at root or under docs/architecture/, .md or .adoc +if [ -f "$REPO_ROOT/TOPOLOGY.adoc" ] || [ -f "$REPO_ROOT/TOPOLOGY.md" ] || \ + [ -f "$REPO_ROOT/docs/architecture/TOPOLOGY.adoc" ] || [ -f "$REPO_ROOT/docs/architecture/TOPOLOGY.md" ]; then + [ "$VERBOSE" = "1" ] && log_pass "Architecture topology found" +else + log_error "Required file missing: TOPOLOGY (root or docs/architecture/, .adoc or .md)" +fi +# CONTRIBUTING.md may live at root or in .github/ (GitHub auto-discovers either) +if [ -f "$REPO_ROOT/CONTRIBUTING.md" ] || [ -f "$REPO_ROOT/.github/CONTRIBUTING.md" ]; then + [ "$VERBOSE" = "1" ] && log_pass "Contribution guide found" +else + log_error "Required file missing: CONTRIBUTING.md (root or .github/)" +fi + +# Governance can be at root or in docs/governance/ +if [ -f "$REPO_ROOT/GOVERNANCE.adoc" ] || [ -f "$REPO_ROOT/GOVERNANCE.md" ] || [ -d "$REPO_ROOT/docs/governance" ]; then + [ "$VERBOSE" = "1" ] && log_pass "Governance files found" +else + log_warning "Governance documentation not found" +fi + +#============================================================================== +# VALIDATION SUMMARY +#============================================================================== + +echo "" +echo "═══════════════════════════════════════════════════════════════════════════════" +echo "VALIDATION SUMMARY" +echo "═══════════════════════════════════════════════════════════════════════════════" +echo "" +echo -e "Errors: ${RED}${ERRORS}${NC}" +echo -e "Warnings: ${YELLOW}${WARNINGS}${NC}" +echo "" + +if [ "$ERRORS" -eq 0 ]; then + echo -e "${GREEN}✓ Validation PASSED${NC}" + [ "$WARNINGS" -gt 0 ] && echo -e " (with $WARNINGS warnings)" + exit 0 +else + echo -e "${RED}✗ Validation FAILED${NC}" + echo " Please fix the errors above." + exit 1 +fi diff --git a/gleam/setup.sh b/gleam/setup.sh new file mode 100755 index 0000000..8546512 --- /dev/null +++ b/gleam/setup.sh @@ -0,0 +1,64 @@ +#!/usr/bin/env bash +# SPDX-License-Identifier: MPL-2.0 +# Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) +# +# A2Ml_Gleam — Universal Setup Script +# Detects platform and shell, installs just, then hands off to Justfile. + +set -euo pipefail + +echo "═══════════════════════════════════════════════════" +echo " A2Ml_Gleam — Setup" +echo "═══════════════════════════════════════════════════" +echo "" + +# Platform detection +OS="$(uname -s)" +ARCH="$(uname -m)" +echo "Platform: $OS $ARCH" + +# Shell detection +CURRENT_SHELL="$(basename "$SHELL" 2>/dev/null || echo "unknown")" +echo "Shell: $CURRENT_SHELL" +echo "" + +# Check for just +if ! command -v just >/dev/null 2>&1; then + echo "just (command runner) is required but not installed." + echo "" + case "$OS" in + Linux) + if command -v cargo >/dev/null 2>&1; then + echo "Installing just via cargo..." + cargo install just + elif command -v brew >/dev/null 2>&1; then + echo "Installing just via Homebrew..." + brew install just + else + echo "Install just from: https://just.systems/man/en/installation.html" + exit 1 + fi + ;; + Darwin) + if command -v brew >/dev/null 2>&1; then + echo "Installing just via Homebrew..." + brew install just + else + echo "Install Homebrew first: https://brew.sh" + echo "Then: brew install just" + exit 1 + fi + ;; + *) + echo "Install just from: https://just.systems/man/en/installation.html" + exit 1 + ;; + esac + echo "" +fi + +echo "Running diagnostics..." +just doctor + +echo "" +echo "Setup complete. Run 'just help-me' for common workflows." diff --git a/gleam/sonar-project.properties b/gleam/sonar-project.properties new file mode 100644 index 0000000..fa6029c --- /dev/null +++ b/gleam/sonar-project.properties @@ -0,0 +1,5 @@ +sonar.projectKey=a2ml_gleam +sonar.organization=hyperpolymath +sonar.sources=src +sonar.tests=test +sonar.language=gleam diff --git a/gleam/src/a2ml_gleam.gleam b/gleam/src/a2ml_gleam.gleam new file mode 100644 index 0000000..8b09e5c --- /dev/null +++ b/gleam/src/a2ml_gleam.gleam @@ -0,0 +1,38 @@ +// SPDX-License-Identifier: MPL-2.0 +// (MPL-2.0 preferred; MPL-2.0 required for Hex.pm) +// +// a2ml_gleam — A2ML (AI Attestation Markup Language) parser and renderer. +// +// Provides types, parsing, and rendering for A2ML documents — a lightweight +// markup format designed for AI-generated content with provenance tracking +// through attestation chains and trust levels. +// +// ## Example +// +// ```gleam +// import a2ml_gleam +// import a2ml_gleam/parser +// import a2ml_gleam/renderer +// +// let input = "# My Document\n\n@version 1.0\n\nHello, A2ML!" +// let assert Ok(doc) = parser.parse(input) +// let output = renderer.render(doc) +// ``` + +import a2ml_gleam/parser +import a2ml_gleam/renderer +import a2ml_gleam/types.{type Document} + +/// Parse an A2ML-formatted string into a Document. +/// +/// Re-exports `parser.parse` for convenience. +pub fn parse(input: String) -> Result(Document, parser.ParseError) { + parser.parse(input) +} + +/// Render a Document back to A2ML-formatted text. +/// +/// Re-exports `renderer.render` for convenience. +pub fn render(doc: Document) -> String { + renderer.render(doc) +} diff --git a/gleam/src/a2ml_gleam/parser.gleam b/gleam/src/a2ml_gleam/parser.gleam new file mode 100644 index 0000000..0262b7c --- /dev/null +++ b/gleam/src/a2ml_gleam/parser.gleam @@ -0,0 +1,660 @@ +// SPDX-License-Identifier: MPL-2.0 +// (MPL-2.0 preferred; MPL-2.0 required for Hex.pm) +// +// a2ml_gleam/parser — A2ML document parser. +// +// Parses A2ML-formatted text into a structured Document AST. +// A2ML syntax is similar to Markdown with extensions for directives (@) +// and attestation blocks (!attest). + +import a2ml_gleam/types.{ + type Attestation, type Block, type Directive, type Document, type Inline, + type Manifest, type TrustLevel, Attestation, AttestationBlock, Automated, + BlockQuote, CodeBlock, Directive, DirectiveBlock, Document, Emphasis, Heading, + Link, ListBlock, Manifest, Paragraph, Reviewed, Strong, Text, ThematicBreak, + Unverified, Verified, +} +import gleam/list +import gleam/result +import gleam/string + +/// Error type for parse failures. +pub type ParseError { + /// The input was empty or contained only whitespace. + EmptyInput + /// A syntax error was encountered at the given line number. + SyntaxError(line: Int, message: String) + /// An unknown trust level string was encountered. + UnknownTrustLevel(value: String) +} + +/// Parse an A2ML-formatted string into a Document. +/// +/// Returns `Ok(Document)` on success or `Error(ParseError)` on failure. +pub fn parse(input: String) -> Result(Document, ParseError) { + let trimmed = string.trim(input) + case trimmed { + "" -> Error(EmptyInput) + _ -> Ok(parse_document(trimmed)) + } +} + +/// Parse a trust level from its canonical string representation. +/// +/// Recognised values (case-insensitive): "unverified", "automated", +/// "reviewed", "verified". +pub fn parse_trust_level(input: String) -> Result(TrustLevel, ParseError) { + case string.lowercase(string.trim(input)) { + "unverified" -> Ok(Unverified) + "automated" -> Ok(Automated) + "reviewed" -> Ok(Reviewed) + "verified" -> Ok(Verified) + other -> Error(UnknownTrustLevel(other)) + } +} + +/// Extract a Manifest from a parsed Document. +/// +/// Collects the version directive (if any), title, directives, and +/// attestations into a convenient summary structure. +pub fn extract_manifest(doc: Document) -> Manifest { + let version = + doc.directives + |> list.find(fn(d: Directive) { d.name == "version" }) + |> result.map(fn(d: Directive) { d.value }) + + Manifest( + version: version, + title: doc.title, + directives: doc.directives, + attestations: doc.attestations, + ) +} + +// --------------------------------------------------------------------------- +// Internal parsing helpers +// --------------------------------------------------------------------------- + +/// Parse a full document from non-empty trimmed input. +fn parse_document(input: String) -> Document { + let lines = string.split(input, "\n") + let #(title, rest_lines) = extract_title(lines) + let blocks = parse_blocks(rest_lines, []) + + // Separate directives and attestations from blocks. + let directives = extract_directives(blocks) + let attestations = extract_attestations(blocks) + + Document( + title: title, + directives: directives, + blocks: blocks, + attestations: attestations, + ) +} + +/// Extract the title from the first line if it starts with "# ". +fn extract_title(lines: List(String)) -> #(Result(String, Nil), List(String)) { + case lines { + [first, ..rest] -> { + let trimmed = string.trim(first) + case string.starts_with(trimmed, "# ") { + True -> #(Ok(string.drop_start(trimmed, 2)), rest) + False -> #(Error(Nil), lines) + } + } + [] -> #(Error(Nil), []) + } +} + +/// Parse lines into a list of Block elements. +fn parse_blocks(lines: List(String), acc: List(Block)) -> List(Block) { + case lines { + [] -> list.reverse(acc) + [line, ..rest] -> { + let trimmed = string.trim(line) + case trimmed { + // Skip blank lines between blocks. + "" -> parse_blocks(rest, acc) + + // Thematic break: three or more dashes. + "---" | "----" | "-----" -> parse_blocks(rest, [ThematicBreak, ..acc]) + + _ -> { + case string.starts_with(trimmed, "```") { + // Code block. + True -> { + let lang = string.trim(string.drop_start(trimmed, 3)) + let lang_result = case lang { + "" -> Error(Nil) + l -> Ok(l) + } + let #(code_lines, remaining) = collect_code_block(rest, []) + let content = string.join(code_lines, "\n") + let block = CodeBlock(language: lang_result, content: content) + parse_blocks(remaining, [block, ..acc]) + } + False -> + case string.starts_with(trimmed, "@") { + // Directive block. + True -> { + let directive = parse_directive_line(trimmed) + parse_blocks(rest, [DirectiveBlock(directive), ..acc]) + } + False -> + case string.starts_with(trimmed, "!attest") { + // Attestation block. + True -> { + let #(attest_lines, remaining) = + collect_indented_block(rest, []) + let attestation = + parse_attestation_block([trimmed, ..attest_lines]) + parse_blocks(remaining, [ + AttestationBlock(attestation), + ..acc + ]) + } + False -> + case string.starts_with(trimmed, "#") { + // Heading. + True -> { + let #(level, text) = parse_heading_line(trimmed) + let inlines = parse_inlines(text) + parse_blocks(rest, [ + Heading(level: level, content: inlines), + ..acc + ]) + } + False -> + case string.starts_with(trimmed, ">") { + // Block quote. + True -> { + let #(quote_lines, remaining) = + collect_prefixed_block(lines, ">", []) + let stripped = + list.map(quote_lines, fn(l) { + let t = string.trim(l) + case string.starts_with(t, "> ") { + True -> string.drop_start(t, 2) + False -> + case string.starts_with(t, ">") { + True -> string.drop_start(t, 1) + False -> t + } + } + }) + let inner_blocks = parse_blocks(stripped, []) + parse_blocks(remaining, [ + BlockQuote(inner_blocks), + ..acc + ]) + } + False -> + case + string.starts_with(trimmed, "- ") + || string.starts_with(trimmed, "* ") + { + // Unordered list. + True -> { + let #(list_lines, remaining) = + collect_list_block(lines, []) + let items = + parse_list_items(list_lines, False) + parse_blocks(remaining, [ + ListBlock(ordered: False, items: items), + ..acc + ]) + } + False -> + case is_ordered_list_start(trimmed) { + // Ordered list. + True -> { + let #(list_lines, remaining) = + collect_list_block(lines, []) + let items = + parse_list_items(list_lines, True) + parse_blocks(remaining, [ + ListBlock(ordered: True, items: items), + ..acc + ]) + } + // Paragraph (default). + False -> { + let #(para_lines, remaining) = + collect_paragraph(lines, []) + let text = string.join(para_lines, " ") + let inlines = parse_inlines(text) + parse_blocks(remaining, [ + Paragraph(inlines), + ..acc + ]) + } + } + } + } + } + } + } + } + } + } + } + } +} + +/// Collect lines until a closing ``` fence is found. +fn collect_code_block( + lines: List(String), + acc: List(String), +) -> #(List(String), List(String)) { + case lines { + [] -> #(list.reverse(acc), []) + [line, ..rest] -> { + case string.starts_with(string.trim(line), "```") { + True -> #(list.reverse(acc), rest) + False -> collect_code_block(rest, [line, ..acc]) + } + } + } +} + +/// Collect lines that are indented (continuation of a block). +fn collect_indented_block( + lines: List(String), + acc: List(String), +) -> #(List(String), List(String)) { + case lines { + [] -> #(list.reverse(acc), []) + [line, ..rest] -> { + case string.starts_with(line, " ") || string.starts_with(line, "\t") { + True -> collect_indented_block(rest, [string.trim(line), ..acc]) + False -> #(list.reverse(acc), lines) + } + } + } +} + +/// Collect lines starting with a given prefix (e.g. ">"). +fn collect_prefixed_block( + lines: List(String), + prefix: String, + acc: List(String), +) -> #(List(String), List(String)) { + case lines { + [] -> #(list.reverse(acc), []) + [line, ..rest] -> { + let trimmed = string.trim(line) + case string.starts_with(trimmed, prefix) { + True -> collect_prefixed_block(rest, prefix, [line, ..acc]) + False -> #(list.reverse(acc), lines) + } + } + } +} + +/// Collect contiguous list lines (starting with - / * or indented continuations). +fn collect_list_block( + lines: List(String), + acc: List(String), +) -> #(List(String), List(String)) { + case lines { + [] -> #(list.reverse(acc), []) + [line, ..rest] -> { + let trimmed = string.trim(line) + case trimmed { + "" -> #(list.reverse(acc), rest) + _ -> + case + string.starts_with(trimmed, "- ") + || string.starts_with(trimmed, "* ") + || is_ordered_list_start(trimmed) + || string.starts_with(line, " ") + || string.starts_with(line, "\t") + { + True -> collect_list_block(rest, [line, ..acc]) + False -> #(list.reverse(acc), lines) + } + } + } + } +} + +/// Collect a paragraph (non-blank, non-special lines). +fn collect_paragraph( + lines: List(String), + acc: List(String), +) -> #(List(String), List(String)) { + case lines { + [] -> #(list.reverse(acc), []) + [line, ..rest] -> { + let trimmed = string.trim(line) + case trimmed { + "" -> #(list.reverse(acc), rest) + _ -> + case + string.starts_with(trimmed, "#") + || string.starts_with(trimmed, "@") + || string.starts_with(trimmed, "!attest") + || string.starts_with(trimmed, "```") + || string.starts_with(trimmed, ">") + || trimmed == "---" + || trimmed == "----" + || trimmed == "-----" + { + True -> #(list.reverse(acc), lines) + False -> collect_paragraph(rest, [trimmed, ..acc]) + } + } + } + } +} + +/// Parse a heading line like "## Some Title" into (level, text). +fn parse_heading_line(line: String) -> #(Int, String) { + let level = count_leading_hashes(line, 0) + let text = string.trim(string.drop_start(line, level)) + #(level, text) +} + +/// Count leading '#' characters. +fn count_leading_hashes(s: String, n: Int) -> Int { + case string.starts_with(s, "#") { + True -> count_leading_hashes(string.drop_start(s, 1), n + 1) + False -> n + } +} + +/// Check if a line starts with a number followed by ". ". +fn is_ordered_list_start(line: String) -> Bool { + case string.split_once(line, ". ") { + Ok(#(prefix, _)) -> string.length(prefix) > 0 && is_all_digits(prefix) + Error(_) -> False + } +} + +/// Check if a string is all ASCII digits. +fn is_all_digits(s: String) -> Bool { + s + |> string.to_graphemes + |> list.all(fn(c) { + c == "0" + || c == "1" + || c == "2" + || c == "3" + || c == "4" + || c == "5" + || c == "6" + || c == "7" + || c == "8" + || c == "9" + }) +} + +/// Parse list items from collected list lines. +fn parse_list_items(lines: List(String), _ordered: Bool) -> List(List(Block)) { + // Split on lines that start a new item. + split_list_items(lines, []) + |> list.map(fn(item_text) { + let text = string.join(item_text, " ") + let inlines = parse_inlines(text) + [Paragraph(inlines)] + }) +} + +/// Split list lines into groups, one per item. +fn split_list_items( + lines: List(String), + acc: List(List(String)), +) -> List(List(String)) { + case lines { + [] -> list.reverse(acc) + [line, ..rest] -> { + let trimmed = string.trim(line) + let item_text = strip_list_marker(trimmed) + // Check if this is a new item marker. + case + string.starts_with(trimmed, "- ") + || string.starts_with(trimmed, "* ") + || is_ordered_list_start(trimmed) + { + True -> split_list_items(rest, [[item_text], ..acc]) + False -> + // Continuation line — append to current item. + case acc { + [current, ..rest_items] -> + split_list_items(rest, [ + list.append(current, [trimmed]), + ..rest_items + ]) + [] -> split_list_items(rest, [[trimmed]]) + } + } + } + } +} + +/// Strip the list marker prefix ("- ", "* ", "1. ") from a line. +fn strip_list_marker(line: String) -> String { + case string.starts_with(line, "- ") || string.starts_with(line, "* ") { + True -> string.drop_start(line, 2) + False -> + case string.split_once(line, ". ") { + Ok(#(prefix, rest)) -> + case is_all_digits(prefix) { + True -> rest + False -> line + } + Error(_) -> line + } + } +} + +/// Parse a directive line like "@version 1.0" into a Directive. +fn parse_directive_line(line: String) -> Directive { + let without_at = string.drop_start(string.trim(line), 1) + case string.split_once(without_at, " ") { + Ok(#(name, value)) -> + Directive( + name: string.trim(name), + value: string.trim(value), + attributes: [], + ) + Error(_) -> + Directive(name: string.trim(without_at), value: "", attributes: []) + } +} + +/// Parse an attestation block from its collected lines. +fn parse_attestation_block(lines: List(String)) -> Attestation { + let fields = parse_key_value_lines(lines) + let identity = find_field(fields, "identity") + let role = find_field(fields, "role") + let trust_str = find_field(fields, "trust-level") + let trust_level = case parse_trust_level(trust_str) { + Ok(tl) -> tl + Error(_) -> Unverified + } + let timestamp = case find_field(fields, "timestamp") { + "" -> Error(Nil) + ts -> Ok(ts) + } + let note = case find_field(fields, "note") { + "" -> Error(Nil) + n -> Ok(n) + } + + Attestation( + identity: identity, + role: role, + trust_level: trust_level, + timestamp: timestamp, + note: note, + ) +} + +/// Parse key-value pairs from indented lines (e.g. " identity: Alice"). +fn parse_key_value_lines(lines: List(String)) -> List(#(String, String)) { + lines + |> list.filter_map(fn(line) { + let trimmed = string.trim(line) + case string.split_once(trimmed, ":") { + Ok(#(key, value)) -> + Ok(#(string.lowercase(string.trim(key)), string.trim(value))) + Error(_) -> Error(Nil) + } + }) +} + +/// Find a field value by key, returning "" if not found. +fn find_field(fields: List(#(String, String)), key: String) -> String { + fields + |> list.find(fn(pair) { pair.0 == key }) + |> result.map(fn(pair) { pair.1 }) + |> result.unwrap("") +} + +/// Parse inline elements from a text string. +/// +/// Handles: **bold**, *italic*, `code`, and [text](url) links. +pub fn parse_inlines(input: String) -> List(Inline) { + parse_inlines_acc(input, []) + |> list.reverse +} + +/// Internal inline parser accumulating results. +fn parse_inlines_acc(input: String, acc: List(Inline)) -> List(Inline) { + case input { + "" -> acc + _ -> { + case string.starts_with(input, "**") { + True -> { + let rest = string.drop_start(input, 2) + case string.split_once(rest, "**") { + Ok(#(inner, after)) -> { + let children = parse_inlines(inner) + parse_inlines_acc(after, [Strong(children), ..acc]) + } + Error(_) -> { + // No closing **, treat as text. + let #(text, remaining) = take_until_special(input, "") + parse_inlines_acc(remaining, [Text(text), ..acc]) + } + } + } + False -> + case string.starts_with(input, "*") { + True -> { + let rest = string.drop_start(input, 1) + case string.split_once(rest, "*") { + Ok(#(inner, after)) -> { + let children = parse_inlines(inner) + parse_inlines_acc(after, [Emphasis(children), ..acc]) + } + Error(_) -> { + let #(text, remaining) = take_until_special(input, "") + parse_inlines_acc(remaining, [Text(text), ..acc]) + } + } + } + False -> + case string.starts_with(input, "`") { + True -> { + let rest = string.drop_start(input, 1) + case string.split_once(rest, "`") { + Ok(#(code, after)) -> + parse_inlines_acc(after, [types.Code(value: code), ..acc]) + Error(_) -> { + let #(text, remaining) = take_until_special(input, "") + parse_inlines_acc(remaining, [Text(text), ..acc]) + } + } + } + False -> + case string.starts_with(input, "[") { + True -> { + let rest = string.drop_start(input, 1) + case string.split_once(rest, "](") { + Ok(#(link_text, after_bracket)) -> + case string.split_once(after_bracket, ")") { + Ok(#(url, after)) -> { + let content = parse_inlines(link_text) + parse_inlines_acc(after, [ + Link(content: content, url: url), + ..acc + ]) + } + Error(_) -> { + let #(text, remaining) = + take_until_special(input, "") + parse_inlines_acc(remaining, [Text(text), ..acc]) + } + } + Error(_) -> { + let #(text, remaining) = take_until_special(input, "") + parse_inlines_acc(remaining, [Text(text), ..acc]) + } + } + } + False -> { + // Plain text until the next special character. + let #(text, remaining) = take_until_special(input, "") + parse_inlines_acc(remaining, [Text(text), ..acc]) + } + } + } + } + } + } + } +} + +/// Take text characters until a special inline character is reached. +fn take_until_special(input: String, acc: String) -> #(String, String) { + case input { + "" -> #(acc, "") + _ -> { + case + string.starts_with(input, "*") + || string.starts_with(input, "`") + || string.starts_with(input, "[") + { + True -> + case acc { + "" -> { + // If we're at a special char but haven't accumulated anything, + // take one character literally to avoid infinite loops. + let char = string.slice(input, 0, 1) + #(char, string.drop_start(input, 1)) + } + _ -> #(acc, input) + } + False -> { + let char = string.slice(input, 0, 1) + take_until_special(string.drop_start(input, 1), acc <> char) + } + } + } + } +} + +/// Extract all Directive blocks from a list of blocks. +fn extract_directives(blocks: List(Block)) -> List(Directive) { + blocks + |> list.filter_map(fn(block) { + case block { + DirectiveBlock(d) -> Ok(d) + _ -> Error(Nil) + } + }) +} + +/// Extract all Attestation blocks from a list of blocks. +fn extract_attestations(blocks: List(Block)) -> List(Attestation) { + blocks + |> list.filter_map(fn(block) { + case block { + AttestationBlock(a) -> Ok(a) + _ -> Error(Nil) + } + }) +} diff --git a/gleam/src/a2ml_gleam/renderer.gleam b/gleam/src/a2ml_gleam/renderer.gleam new file mode 100644 index 0000000..d285e42 --- /dev/null +++ b/gleam/src/a2ml_gleam/renderer.gleam @@ -0,0 +1,163 @@ +// SPDX-License-Identifier: MPL-2.0 +// (MPL-2.0 preferred; MPL-2.0 required for Hex.pm) +// +// a2ml_gleam/renderer — Render an A2ML Document AST back to A2ML text. +// +// Produces A2ML-formatted output from a parsed Document structure, +// suitable for round-tripping through parse -> modify -> render. + +import a2ml_gleam/types.{ + type Attestation, type Block, type Document, type Inline, type TrustLevel, + AttestationBlock, Automated, BlockQuote, CodeBlock, DirectiveBlock, Emphasis, + Heading, Link, ListBlock, Paragraph, Reviewed, Strong, Text, ThematicBreak, + Unverified, Verified, +} +import gleam/int +import gleam/list +import gleam/string + +/// Render a Document to A2ML-formatted text. +/// +/// Produces a complete document string with title, blocks, and +/// appropriate blank-line separation. +pub fn render(doc: Document) -> String { + let parts = [] + + // Render title if present. + let parts = case doc.title { + Ok(title) -> list.append(parts, ["# " <> title, ""]) + Error(_) -> parts + } + + // Render each block. + let block_strings = + doc.blocks + |> list.map(render_block) + |> list.intersperse("") + + let parts = list.append(parts, block_strings) + + string.join(parts, "\n") + |> string.trim + |> fn(s) { s <> "\n" } +} + +/// Render a single Block to A2ML text. +pub fn render_block(block: Block) -> String { + case block { + Heading(level: level, content: inlines) -> { + let hashes = string.repeat("#", level) + hashes <> " " <> render_inlines(inlines) + } + + Paragraph(content: inlines) -> render_inlines(inlines) + + CodeBlock(language: lang, content: content) -> { + let opener = case lang { + Ok(l) -> "```" <> l + Error(_) -> "```" + } + opener <> "\n" <> content <> "\n```" + } + + DirectiveBlock(directive: d) -> { + let base = "@" <> d.name <> " " <> d.value + case d.attributes { + [] -> base + attrs -> { + let attr_strs = + attrs + |> list.map(fn(pair) { pair.0 <> "=" <> pair.1 }) + base <> " [" <> string.join(attr_strs, ", ") <> "]" + } + } + } + + AttestationBlock(attestation: a) -> render_attestation(a) + + ThematicBreak -> "---" + + BlockQuote(children: blocks) -> { + blocks + |> list.map(fn(b) { + render_block(b) + |> string.split("\n") + |> list.map(fn(line) { "> " <> line }) + |> string.join("\n") + }) + |> string.join("\n>\n") + } + + ListBlock(ordered: ordered, items: items) -> { + items + |> list.index_map(fn(item, idx) { + let prefix = case ordered { + True -> int.to_string(idx + 1) <> ". " + False -> "- " + } + let item_text = + item + |> list.map(render_block) + |> string.join("\n") + prefix <> item_text + }) + |> string.join("\n") + } + } +} + +/// Render an Attestation to its A2ML block format. +pub fn render_attestation(attestation: Attestation) -> String { + let lines = [ + "!attest", + " identity: " <> attestation.identity, + " role: " <> attestation.role, + " trust-level: " <> render_trust_level(attestation.trust_level), + ] + + let lines = case attestation.timestamp { + Ok(ts) -> list.append(lines, [" timestamp: " <> ts]) + Error(_) -> lines + } + + let lines = case attestation.note { + Ok(n) -> list.append(lines, [" note: " <> n]) + Error(_) -> lines + } + + string.join(lines, "\n") +} + +/// Render a TrustLevel to its canonical string representation. +pub fn render_trust_level(level: TrustLevel) -> String { + case level { + Unverified -> "unverified" + Automated -> "automated" + Reviewed -> "reviewed" + Verified -> "verified" + } +} + +/// Render a list of Inline elements to text. +pub fn render_inlines(inlines: List(Inline)) -> String { + inlines + |> list.map(render_inline) + |> string.join("") +} + +/// Render a single Inline element to text. +fn render_inline(inline: Inline) -> String { + case inline { + Text(value: v) -> v + Emphasis(children: c) -> "*" <> render_inlines(c) <> "*" + Strong(children: c) -> "**" <> render_inlines(c) <> "**" + types.Code(value: v) -> "`" <> v <> "`" + Link(content: c, url: u) -> "[" <> render_inlines(c) <> "](" <> u <> ")" + } +} + +/// Convenience: render a Document to a String, ignoring the Result wrapper +/// from render (which always succeeds). +pub fn to_string(doc: Document) -> String { + render(doc) +} diff --git a/gleam/src/a2ml_gleam/types.gleam b/gleam/src/a2ml_gleam/types.gleam new file mode 100644 index 0000000..200d498 --- /dev/null +++ b/gleam/src/a2ml_gleam/types.gleam @@ -0,0 +1,125 @@ +// SPDX-License-Identifier: MPL-2.0 +// (MPL-2.0 preferred; MPL-2.0 required for Hex.pm) +// +// a2ml_gleam/types — Core data types for A2ML documents. +// +// An A2ML document consists of a sequence of Block elements, each of which +// may contain Inline content. Directive blocks provide machine-readable +// metadata, and Attestation records capture the provenance chain for +// AI-generated or human-reviewed content. + +/// A complete A2ML document, containing metadata and a sequence of blocks. +pub type Document { + Document( + /// Optional document title (extracted from a leading `# title` line). + title: Result(String, Nil), + /// Top-level directives that apply to the whole document. + directives: List(Directive), + /// The ordered sequence of content blocks that make up the document body. + blocks: List(Block), + /// Attestation chain recording authorship and review provenance. + attestations: List(Attestation), + ) +} + +/// A block-level element in an A2ML document. +/// +/// Blocks are separated by blank lines in the source text. +pub type Block { + /// A heading with a depth (1 = `#`, 2 = `##`, etc.) and inline content. + Heading(level: Int, content: List(Inline)) + /// A paragraph of inline content. + Paragraph(content: List(Inline)) + /// A fenced or indented code block with an optional language tag. + CodeBlock(language: Result(String, Nil), content: String) + /// A directive block (starts with `@`). + DirectiveBlock(directive: Directive) + /// An attestation block (starts with `!attest`). + AttestationBlock(attestation: Attestation) + /// A horizontal rule / thematic break. + ThematicBreak + /// A block quotation containing nested blocks. + BlockQuote(children: List(Block)) + /// An unordered or ordered list. + ListBlock(ordered: Bool, items: List(List(Block))) +} + +/// An inline-level element within a block. +pub type Inline { + /// Plain, unformatted text. + Text(value: String) + /// Emphasised text (typically rendered as *italic*). + Emphasis(children: List(Inline)) + /// Strongly emphasised text (typically rendered as **bold**). + Strong(children: List(Inline)) + /// Inline code span. + Code(value: String) + /// A hyperlink with display content and a target URL. + Link(content: List(Inline), url: String) +} + +/// A machine-readable directive that provides metadata or instructions. +/// +/// Directives begin with `@` in the source text, e.g. +/// `@version 1.0` or `@require trust-level:high`. +pub type Directive { + Directive( + /// The directive name (the identifier immediately after `@`). + name: String, + /// The directive value or argument string. + value: String, + /// Optional key-value attributes attached to the directive. + attributes: List(#(String, String)), + ) +} + +/// An attestation record capturing who produced or reviewed content. +/// +/// Attestation blocks start with `!attest` and record the identity, +/// role, trust level, and optional timestamp of an author or reviewer. +pub type Attestation { + Attestation( + /// The identity of the attester (person, tool, or agent name). + identity: String, + /// The role of the attester (e.g. "author", "reviewer", "agent"). + role: String, + /// The trust level assigned to this attestation. + trust_level: TrustLevel, + /// An optional ISO-8601 timestamp for when the attestation was made. + timestamp: Result(String, Nil), + /// Optional free-form notes or justification. + note: Result(String, Nil), + ) +} + +/// The degree of trust associated with an attestation. +/// +/// Trust levels form a simple ordered scale from unverified content +/// through to formally verified proofs. +pub type TrustLevel { + /// Content with no verification or review. + Unverified + /// Content reviewed by an automated tool or linter. + Automated + /// Content reviewed by a human. + Reviewed + /// Content that has been formally verified or proven. + Verified +} + +/// A high-level manifest extracted from a parsed A2ML document. +/// +/// Collects the directives and attestations into a single structure +/// for convenient programmatic access. +pub type Manifest { + Manifest( + /// The document version, if declared via `@version`. + version: Result(String, Nil), + /// The document title, if present. + title: Result(String, Nil), + /// All directives found in the document. + directives: List(Directive), + /// All attestations found in the document. + attestations: List(Attestation), + ) +} diff --git a/gleam/stapeln.toml b/gleam/stapeln.toml new file mode 100644 index 0000000..732e0c4 --- /dev/null +++ b/gleam/stapeln.toml @@ -0,0 +1,8 @@ +# SPDX-License-Identifier: MPL-2.0 + +[project] +name = "a2ml_gleam" +description = "A2ML Gleam implementation" + +[container] +base = "cgr.dev/chainguard/wolfi-base:latest" diff --git a/gleam/test/a2ml_gleam_aspect_test.gleam b/gleam/test/a2ml_gleam_aspect_test.gleam new file mode 100644 index 0000000..45e0140 --- /dev/null +++ b/gleam/test/a2ml_gleam_aspect_test.gleam @@ -0,0 +1,143 @@ +// SPDX-License-Identifier: MPL-2.0 +// (MPL-2.0 preferred; MPL-2.0 required for Hex.pm) +// +// a2ml_gleam_aspect_test — Aspect tests for A2ML parser/renderer. +// +// Tests cross-cutting concerns: security (input safety), correctness, +// performance, and resilience. These complement the unit and contract tests +// by validating behavioural aspects that cut across the whole API surface. + +import a2ml_gleam/parser +import a2ml_gleam/renderer +import a2ml_gleam/types.{Verified} +import gleam/list +import gleam/string + +// --------------------------------------------------------------------------- +// Aspect: Security — empty and whitespace inputs are handled gracefully +// --------------------------------------------------------------------------- + +pub fn aspect_security_empty_input_test() { + let assert Error(_) = parser.parse("") +} + +pub fn aspect_security_whitespace_only_test() { + let assert Error(_) = parser.parse(" \n \t ") +} + +// --------------------------------------------------------------------------- +// Aspect: Security — very long strings do not panic the parser +// --------------------------------------------------------------------------- + +pub fn aspect_security_long_string_test() { + let long = string.repeat("x", 1000) + let result = parser.parse(long) + // A2ML may parse long text as a paragraph — either ok or error, not panic. + case result { + Ok(_) -> Nil + Error(_) -> Nil + } +} + +pub fn aspect_security_long_title_test() { + let long_title = string.repeat("a", 200) + let input = "# " <> long_title <> "\n\n@version 1.0" + let result = parser.parse(input) + case result { + Ok(_) -> Nil + Error(_) -> Nil + } +} + +// --------------------------------------------------------------------------- +// Aspect: Correctness — attestation fields survive roundtrip +// --------------------------------------------------------------------------- + +pub fn aspect_correctness_attestation_roundtrip_test() { + let input = + "# Attestation Roundtrip\n\n!attest\n identity: Jonathan D.A. Jewell\n role: author\n trust-level: verified\n timestamp: 2026-04-04T00:00:00Z" + + let assert Ok(doc1) = parser.parse(input) + let assert [a] = doc1.attestations + let assert True = a.identity == "Jonathan D.A. Jewell" + let assert True = a.trust_level == Verified + + let rendered = renderer.render(doc1) + let assert Ok(doc2) = parser.parse(rendered) + let assert [a2] = doc2.attestations + let assert True = a2.identity == a.identity + let assert True = a2.trust_level == a.trust_level +} + +pub fn aspect_correctness_multiple_attestations_roundtrip_test() { + let input = + "# Two Attestors\n\n!attest\n identity: Alice\n role: author\n trust-level: reviewed\n\n!attest\n identity: Bob\n role: reviewer\n trust-level: reviewed" + + let assert Ok(doc1) = parser.parse(input) + let assert True = list.length(doc1.attestations) == 2 + + let rendered = renderer.render(doc1) + let assert Ok(doc2) = parser.parse(rendered) + let assert True = list.length(doc2.attestations) == 2 +} + +pub fn aspect_correctness_directive_value_survives_roundtrip_test() { + let input = "# Directive Roundtrip\n\n@version 2.5" + let assert Ok(doc1) = parser.parse(input) + let rendered = renderer.render(doc1) + let assert Ok(doc2) = parser.parse(rendered) + let manifest1 = parser.extract_manifest(doc1) + let manifest2 = parser.extract_manifest(doc2) + let assert True = manifest1.version == manifest2.version +} + +// --------------------------------------------------------------------------- +// Aspect: Performance — parsing 100 identical inputs completes without error +// --------------------------------------------------------------------------- + +pub fn aspect_performance_parse_100_identical_test() { + let input = "# Performance Test\n\n@version 1.0\n\nA performance paragraph." + + list.range(from: 1, to: 100) + |> list.each(fn(_) { + let assert Ok(_) = parser.parse(input) + }) +} + +pub fn aspect_performance_render_100_identical_test() { + let input = "# Render Performance\n\n@version 2.0\n\nRender test." + let assert Ok(doc) = parser.parse(input) + + list.range(from: 1, to: 100) + |> list.each(fn(_) { + let out = renderer.render(doc) + let assert True = out != "" + }) +} + +// --------------------------------------------------------------------------- +// Aspect: Resilience — unusual but syntactically possible inputs +// --------------------------------------------------------------------------- + +pub fn aspect_resilience_directive_only_test() { + let result = parser.parse("@version 1.0") + case result { + Ok(_) -> Nil + Error(_) -> Nil + } +} + +pub fn aspect_resilience_attestation_only_test() { + let input = + "!attest\n identity: Bot\n role: scanner\n trust-level: automated" + let result = parser.parse(input) + case result { + Ok(_) -> Nil + Error(_) -> Nil + } +} + +pub fn aspect_resilience_unknown_trust_level_returns_error_test() { + let assert Error(parser.UnknownTrustLevel(_)) = + parser.parse_trust_level("notreal") +} diff --git a/gleam/test/a2ml_gleam_bench_test.gleam b/gleam/test/a2ml_gleam_bench_test.gleam new file mode 100644 index 0000000..902395f --- /dev/null +++ b/gleam/test/a2ml_gleam_bench_test.gleam @@ -0,0 +1,101 @@ +// SPDX-License-Identifier: MPL-2.0 +// (MPL-2.0 preferred; MPL-2.0 required for Hex.pm) +// +// a2ml_gleam_bench_test — Timing/benchmark tests for A2ML parser/renderer. +// +// Uses repetition-based guards to detect gross performance regressions. +// Gleam does not have a built-in benchmarking harness, so these tests +// verify that bulk operations complete without error rather than asserting +// wall-clock bounds (which would be flaky in CI). + +import a2ml_gleam/parser +import a2ml_gleam/renderer +import a2ml_gleam/types.{Automated, Reviewed, Unverified, Verified} +import gleam/list + +// --------------------------------------------------------------------------- +// Benchmark: parse 500 documents without error +// --------------------------------------------------------------------------- + +pub fn bench_parse_500_test() { + let input = "# Bench Parse\n\n@version 1.0\n\nA benchmark paragraph." + + list.range(from: 1, to: 500) + |> list.each(fn(_) { + let assert Ok(_) = parser.parse(input) + }) +} + +// --------------------------------------------------------------------------- +// Benchmark: render 500 documents without error +// --------------------------------------------------------------------------- + +pub fn bench_render_500_test() { + let input = + "# Bench Render\n\n@version 2.0\n\n!attest\n identity: Jonathan D.A. Jewell\n role: author\n trust-level: verified" + + let assert Ok(doc) = parser.parse(input) + + list.range(from: 1, to: 500) + |> list.each(fn(_) { + let out = renderer.render(doc) + let assert True = out != "" + }) +} + +// --------------------------------------------------------------------------- +// Benchmark: 200 full roundtrips without error +// --------------------------------------------------------------------------- + +pub fn bench_200_roundtrips_test() { + let input = + "# Roundtrip Bench\n\n@version 3.0\n\n@author Jonathan D.A. Jewell\n\nA paragraph.\n\n!attest\n identity: Bot\n role: scanner\n trust-level: automated" + + list.range(from: 1, to: 200) + |> list.each(fn(_) { + let assert Ok(doc1) = parser.parse(input) + let rendered = renderer.render(doc1) + let assert Ok(_doc2) = parser.parse(rendered) + }) +} + +// --------------------------------------------------------------------------- +// Benchmark: parse_trust_level 1000 times without error +// --------------------------------------------------------------------------- + +pub fn bench_parse_trust_level_1000_test() { + let levels = ["unverified", "automated", "reviewed", "verified"] + let count = list.length(levels) + + list.range(from: 0, to: 999) + |> list.each(fn(i) { + let level = case i % count { + 0 -> "unverified" + 1 -> "automated" + 2 -> "reviewed" + _ -> "verified" + } + let _ = parser.parse_trust_level(level) + Nil + }) +} + +// --------------------------------------------------------------------------- +// Benchmark: render_trust_level 1000 times without error +// --------------------------------------------------------------------------- + +pub fn bench_render_trust_level_1000_test() { + let count = 4 + + list.range(from: 0, to: 999) + |> list.each(fn(i) { + let level = case i % count { + 0 -> Unverified + 1 -> Automated + 2 -> Reviewed + _ -> Verified + } + let _ = renderer.render_trust_level(level) + Nil + }) +} diff --git a/gleam/test/a2ml_gleam_contract_test.gleam b/gleam/test/a2ml_gleam_contract_test.gleam new file mode 100644 index 0000000..b08eb41 --- /dev/null +++ b/gleam/test/a2ml_gleam_contract_test.gleam @@ -0,0 +1,130 @@ +// SPDX-License-Identifier: MPL-2.0 +// (MPL-2.0 preferred; MPL-2.0 required for Hex.pm) +// +// a2ml_gleam_contract_test — Contract/invariant tests for A2ML parser/renderer. +// +// Tests the behavioural contracts that the API must uphold regardless of input. +// Each test validates a named invariant. + +import a2ml_gleam/parser +import a2ml_gleam/renderer +import a2ml_gleam/types.{Automated, Reviewed, Unverified, Verified} +import gleam/string + +// --------------------------------------------------------------------------- +// INVARIANT: parse of empty string returns Error(EmptyInput) +// --------------------------------------------------------------------------- + +pub fn invariant_parse_empty_returns_error_test() { + let assert Error(parser.EmptyInput) = parser.parse("") +} + +pub fn invariant_parse_whitespace_returns_error_test() { + let assert Error(parser.EmptyInput) = parser.parse(" \n\t ") +} + +// --------------------------------------------------------------------------- +// INVARIANT: parse success returns Ok(Document) +// --------------------------------------------------------------------------- + +pub fn invariant_parse_title_ok_test() { + let assert Ok(_doc) = parser.parse("# Hello A2ML") +} + +pub fn invariant_parse_paragraph_ok_test() { + let assert Ok(_doc) = parser.parse("A simple paragraph.") +} + +pub fn invariant_parse_directive_ok_test() { + let assert Ok(_doc) = parser.parse("@version 1.0") +} + +// --------------------------------------------------------------------------- +// INVARIANT: parse_trust_level returns Ok for all canonical levels +// --------------------------------------------------------------------------- + +pub fn invariant_parse_trust_level_ok_for_canonical_test() { + let assert Ok(Unverified) = parser.parse_trust_level("unverified") + let assert Ok(Automated) = parser.parse_trust_level("automated") + let assert Ok(Reviewed) = parser.parse_trust_level("reviewed") + let assert Ok(Verified) = parser.parse_trust_level("verified") +} + +// --------------------------------------------------------------------------- +// INVARIANT: parse_trust_level is case-insensitive +// --------------------------------------------------------------------------- + +pub fn invariant_parse_trust_level_case_insensitive_test() { + let assert Ok(Unverified) = parser.parse_trust_level("UNVERIFIED") + let assert Ok(Automated) = parser.parse_trust_level("Automated") + let assert Ok(Reviewed) = parser.parse_trust_level("REVIEWED") + let assert Ok(Verified) = parser.parse_trust_level("Verified") +} + +// --------------------------------------------------------------------------- +// INVARIANT: parse_trust_level returns Error for unknown inputs +// --------------------------------------------------------------------------- + +pub fn invariant_parse_trust_level_error_for_unknown_test() { + let assert Error(parser.UnknownTrustLevel(_)) = + parser.parse_trust_level("invalid") + let assert Error(parser.UnknownTrustLevel(_)) = + parser.parse_trust_level("none") + let assert Error(parser.UnknownTrustLevel(_)) = parser.parse_trust_level("") +} + +// --------------------------------------------------------------------------- +// INVARIANT: render always returns a non-empty string +// --------------------------------------------------------------------------- + +pub fn invariant_render_returns_non_empty_string_test() { + let assert Ok(doc) = parser.parse("# Render Contract\n\n@version 1.0") + let output = renderer.render(doc) + let assert True = output != "" +} + +// --------------------------------------------------------------------------- +// INVARIANT: render_trust_level produces stable lowercase strings +// --------------------------------------------------------------------------- + +pub fn invariant_render_trust_level_stable_test() { + let assert True = renderer.render_trust_level(Unverified) == "unverified" + let assert True = renderer.render_trust_level(Automated) == "automated" + let assert True = renderer.render_trust_level(Reviewed) == "reviewed" + let assert True = renderer.render_trust_level(Verified) == "verified" +} + +// --------------------------------------------------------------------------- +// INVARIANT: attestations list is always a list (never absent) +// --------------------------------------------------------------------------- + +pub fn invariant_attestations_always_list_test() { + let assert Ok(doc) = parser.parse("# No Attestations\n\n@version 1.0") + let assert True = doc.attestations == [] +} + +// --------------------------------------------------------------------------- +// INVARIANT: manifest version is Ok when @version directive is present +// --------------------------------------------------------------------------- + +pub fn invariant_manifest_version_present_test() { + let assert Ok(doc) = parser.parse("# Manifest\n\n@version 3.0") + let manifest = parser.extract_manifest(doc) + let assert True = manifest.version == Ok("3.0") +} + +pub fn invariant_manifest_version_absent_test() { + let assert Ok(doc) = parser.parse("# No Version") + let manifest = parser.extract_manifest(doc) + let assert True = manifest.version == Error(Nil) +} + +// --------------------------------------------------------------------------- +// INVARIANT: rendered output contains the pedigree section markers +// --------------------------------------------------------------------------- + +pub fn invariant_render_title_in_output_test() { + let assert Ok(doc) = parser.parse("# My Title\n\n@version 1.0") + let output = renderer.render(doc) + let assert True = string.contains(output, "# My Title") +} diff --git a/gleam/test/a2ml_gleam_property_test.gleam b/gleam/test/a2ml_gleam_property_test.gleam new file mode 100644 index 0000000..d50d61e --- /dev/null +++ b/gleam/test/a2ml_gleam_property_test.gleam @@ -0,0 +1,117 @@ +// SPDX-License-Identifier: MPL-2.0 +// (MPL-2.0 preferred; MPL-2.0 required for Hex.pm) +// +// a2ml_gleam_property_test — Property-based tests for A2ML parser/renderer. +// +// Validates determinism, idempotency, and structural invariants across +// a range of inputs without relying on external property-testing libraries. + +import a2ml_gleam/parser +import a2ml_gleam/renderer +import a2ml_gleam/types.{Automated, Reviewed, Unverified, Verified} +import gleam/list + +// --------------------------------------------------------------------------- +// Property: parse is deterministic — same input always produces same output +// --------------------------------------------------------------------------- + +pub fn parse_is_deterministic_test() { + let input = "# Determinism Test\n\n@version 1.0\n\nA test paragraph." + + let result1 = parser.parse(input) + let result2 = parser.parse(input) + let assert True = result1 == result2 +} + +// --------------------------------------------------------------------------- +// Property: parse determinism over 20 calls (manual property loop) +// --------------------------------------------------------------------------- + +pub fn parse_deterministic_20_calls_test() { + let input = "# Loop Test\n\n@version 2.0\n\nHello, A2ML!" + + let first = parser.parse(input) + + list.range(from: 1, to: 20) + |> list.each(fn(_) { + let result = parser.parse(input) + let assert True = result == first + }) +} + +// --------------------------------------------------------------------------- +// Property: render is deterministic — same document always renders identically +// --------------------------------------------------------------------------- + +pub fn render_is_deterministic_test() { + let input = "# Render Prop\n\n@version 1.0\n\nParagraph." + + let assert Ok(doc) = parser.parse(input) + let out1 = renderer.render(doc) + let out2 = renderer.render(doc) + let assert True = out1 == out2 +} + +// --------------------------------------------------------------------------- +// Property: all valid trust level strings round-trip +// --------------------------------------------------------------------------- + +pub fn trust_level_strings_roundtrip_test() { + let assert Ok(Unverified) = parser.parse_trust_level("unverified") + let assert Ok(Automated) = parser.parse_trust_level("automated") + let assert Ok(Reviewed) = parser.parse_trust_level("reviewed") + let assert Ok(Verified) = parser.parse_trust_level("verified") + + let assert True = renderer.render_trust_level(Unverified) == "unverified" + let assert True = renderer.render_trust_level(Automated) == "automated" + let assert True = renderer.render_trust_level(Reviewed) == "reviewed" + let assert True = renderer.render_trust_level(Verified) == "verified" +} + +// --------------------------------------------------------------------------- +// Property: roundtrip preserves document title +// --------------------------------------------------------------------------- + +pub fn roundtrip_preserves_title_test() { + let titles = ["Hello World", "My Report", "AI Document 2026", "Test"] + + list.each(titles, fn(title) { + let input = "# " <> title <> "\n\n@version 1.0\n\nContent." + let assert Ok(doc1) = parser.parse(input) + let rendered = renderer.render(doc1) + let assert Ok(doc2) = parser.parse(rendered) + let assert True = doc1.title == doc2.title + }) +} + +// --------------------------------------------------------------------------- +// Property: invalid trust level strings never produce Ok +// --------------------------------------------------------------------------- + +pub fn invalid_trust_levels_never_ok_test() { + let invalid = [ + "none", "all", "safe", "high", "low", "admin", "unknown", "", "trusted", + "reviewed1", "aut0mated", + ] + + list.each(invalid, fn(name) { + let result = parser.parse_trust_level(name) + let assert Error(_) = result + }) +} + +// --------------------------------------------------------------------------- +// Property: directives count is preserved across roundtrip +// --------------------------------------------------------------------------- + +pub fn directives_count_preserved_roundtrip_test() { + let input = + "# Multi-Directive\n\n@version 1.5\n\n@author Alice\n\n@license MPL-2.0" + + let assert Ok(doc1) = parser.parse(input) + let assert True = list.length(doc1.directives) == 3 + + let rendered = renderer.render(doc1) + let assert Ok(doc2) = parser.parse(rendered) + let assert True = list.length(doc1.directives) == list.length(doc2.directives) +} diff --git a/gleam/test/a2ml_gleam_test.gleam b/gleam/test/a2ml_gleam_test.gleam new file mode 100644 index 0000000..0e452a7 --- /dev/null +++ b/gleam/test/a2ml_gleam_test.gleam @@ -0,0 +1,128 @@ +// SPDX-License-Identifier: MPL-2.0 +// (MPL-2.0 preferred; MPL-2.0 required for Hex.pm) + +import a2ml_gleam/parser +import a2ml_gleam/renderer +import a2ml_gleam/types.{ + Attestation, AttestationBlock, Automated, Directive, DirectiveBlock, Heading, + Paragraph, Reviewed, Text, Unverified, Verified, +} +import gleeunit + +pub fn main() -> Nil { + gleeunit.main() +} + +// --------------------------------------------------------------------------- +// Parser tests +// --------------------------------------------------------------------------- + +pub fn parse_empty_input_test() { + let result = parser.parse("") + let assert True = result == Error(parser.EmptyInput) +} + +pub fn parse_title_only_test() { + let assert Ok(doc) = parser.parse("# Hello A2ML") + let assert True = doc.title == Ok("Hello A2ML") +} + +pub fn parse_heading_levels_test() { + let assert Ok(doc) = parser.parse("## Second Level\n\n### Third Level") + let assert [Heading(level: 2, content: _), Heading(level: 3, content: _)] = + doc.blocks +} + +pub fn parse_paragraph_test() { + let assert Ok(doc) = parser.parse("This is a simple paragraph.") + let assert [Paragraph(content: [Text(value: "This is a simple paragraph.")])] = + doc.blocks +} + +pub fn parse_directive_test() { + let assert Ok(doc) = parser.parse("@version 1.0") + let assert [ + DirectiveBlock(directive: Directive( + name: "version", + value: "1.0", + attributes: [], + )), + ] = doc.blocks + let assert [Directive(name: "version", value: "1.0", attributes: [])] = + doc.directives +} + +pub fn parse_trust_level_test() { + let assert Ok(Unverified) = parser.parse_trust_level("unverified") + let assert Ok(Automated) = parser.parse_trust_level("Automated") + let assert Ok(Reviewed) = parser.parse_trust_level("REVIEWED") + let assert Ok(Verified) = parser.parse_trust_level("verified") + let assert Error(parser.UnknownTrustLevel("unknown")) = + parser.parse_trust_level("unknown") +} + +pub fn parse_attestation_test() { + let input = + "!attest\n identity: Alice\n role: reviewer\n trust-level: reviewed" + let assert Ok(doc) = parser.parse(input) + let assert [AttestationBlock(attestation: a)] = doc.blocks + let assert True = a.identity == "Alice" + let assert True = a.role == "reviewer" + let assert True = a.trust_level == Reviewed +} + +pub fn parse_full_document_test() { + let input = + "# Test Doc\n\n@version 2.0\n\nA paragraph here.\n\n!attest\n identity: Bob\n role: author\n trust-level: verified" + let assert Ok(doc) = parser.parse(input) + let assert True = doc.title == Ok("Test Doc") + let assert [Directive(name: "version", ..)] = doc.directives + let assert [Attestation(identity: "Bob", ..)] = doc.attestations +} + +// --------------------------------------------------------------------------- +// Renderer tests +// --------------------------------------------------------------------------- + +pub fn render_trust_level_test() { + let assert True = renderer.render_trust_level(Unverified) == "unverified" + let assert True = renderer.render_trust_level(Automated) == "automated" + let assert True = renderer.render_trust_level(Reviewed) == "reviewed" + let assert True = renderer.render_trust_level(Verified) == "verified" +} + +pub fn render_attestation_test() { + let a = + Attestation( + identity: "Claude", + role: "agent", + trust_level: Automated, + timestamp: Ok("2026-03-16T12:00:00Z"), + note: Error(Nil), + ) + let rendered = renderer.render_attestation(a) + let assert True = + rendered + == "!attest\n identity: Claude\n role: agent\n trust-level: automated\n timestamp: 2026-03-16T12:00:00Z" +} + +pub fn render_roundtrip_test() { + let input = "# Round Trip\n\n@version 1.0\n\nHello, world!" + let assert Ok(doc) = parser.parse(input) + let output = renderer.render(doc) + // Re-parse the output to verify structural equivalence. + let assert Ok(doc2) = parser.parse(output) + let assert True = doc.title == doc2.title +} + +// --------------------------------------------------------------------------- +// Manifest tests +// --------------------------------------------------------------------------- + +pub fn extract_manifest_test() { + let input = "# Manifest Test\n\n@version 3.0\n\n@author Alice" + let assert Ok(doc) = parser.parse(input) + let manifest = parser.extract_manifest(doc) + let assert True = manifest.version == Ok("3.0") + let assert True = manifest.title == Ok("Manifest Test") +} diff --git a/gleam/tests/fuzz/placeholder.txt b/gleam/tests/fuzz/placeholder.txt new file mode 100644 index 0000000..8621280 --- /dev/null +++ b/gleam/tests/fuzz/placeholder.txt @@ -0,0 +1 @@ +Scorecard requirement placeholder diff --git a/haskell/.devcontainer/Containerfile b/haskell/.devcontainer/Containerfile new file mode 100644 index 0000000..edaa454 --- /dev/null +++ b/haskell/.devcontainer/Containerfile @@ -0,0 +1,32 @@ +# SPDX-License-Identifier: MPL-2.0 +# Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) +# +# Dev Container image for a2ml-haskell +# Base: Chainguard Wolfi (minimal, supply-chain-secure) +# Build: podman build -t a2ml-haskell-dev -f .devcontainer/Containerfile . + +FROM cgr.dev/chainguard/wolfi-base:latest + +# Install common development tools +RUN apk update && apk add --no-cache \ + bash \ + curl \ + git \ + openssh-client \ + ca-certificates \ + build-base \ + posix-libc-utils \ + shadow \ + && rm -rf /var/cache/apk/* + +# Create non-root dev user (matches devcontainer.json remoteUser) +RUN groupadd -g 1000 nonroot || true \ + && useradd -m -u 1000 -g 1000 -s /bin/bash nonroot || true + +# Set workspace directory +WORKDIR /workspaces/a2ml-haskell + +# Default shell +ENV SHELL=/bin/bash + +USER nonroot diff --git a/haskell/.devcontainer/README.adoc b/haskell/.devcontainer/README.adoc new file mode 100644 index 0000000..3706230 --- /dev/null +++ b/haskell/.devcontainer/README.adoc @@ -0,0 +1,27 @@ +// SPDX-License-Identifier: CC-BY-SA-4.0 += Dev Container Usage +:author: Jonathan D.A. Jewell + +== Overview + +This dev container uses `cgr.dev/chainguard/wolfi-base` with git, curl, bash, and just pre-installed. Dev container features add git, just, and nickel automatically. + +== VS Code (Local) + +. Install the *Dev Containers* extension (`ms-vscode-remote.remote-containers`). +. Set `dev.containers.dockerPath` to `podman` in VS Code settings. +. Open the repo folder, then choose **Reopen in Container** from the command palette. + +== GitHub Codespaces + +. From the repository on GitHub, click **Code > Codespaces > New codespace**. +. The container builds automatically from this configuration. + +== Gitpod + +. Prefix the repo URL with `https://gitpod.io/#` to launch a workspace. +. Gitpod reads `devcontainer.json` and builds the environment. + +== Customization + +Replace `a2ml-haskell` placeholders in both `devcontainer.json` and `Containerfile` with your actual project name. Run `just deps` to verify the environment after first launch. diff --git a/haskell/.devcontainer/devcontainer.json b/haskell/.devcontainer/devcontainer.json new file mode 100644 index 0000000..e4b6d6b --- /dev/null +++ b/haskell/.devcontainer/devcontainer.json @@ -0,0 +1,69 @@ +// SPDX-License-Identifier: MPL-2.0 +// Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) +// +// Dev Container configuration for a2ml-haskell +// Works with: VS Code Dev Containers, GitHub Codespaces, Gitpod +// Container runtime: Podman (recommended) or any OCI-compliant runtime +{ + "name": "a2ml-haskell", + + "build": { + "dockerfile": "Containerfile", + "context": ".." + }, + + "features": { + "ghcr.io/devcontainers/features/git:1": { + "ppa": false, + "version": "latest" + }, + "ghcr.io/jdx/devcontainer-features/just:1": {}, + "ghcr.io/nickel-lang/devcontainer-feature:0": {} + }, + + "postCreateCommand": "just deps", + + "remoteUser": "nonroot", + + "containerEnv": { + "EDITOR": "code --wait", + "LANG": "C.UTF-8" + }, + + "customizations": { + "vscode": { + "extensions": [ + "EditorConfig.EditorConfig", + "eamodio.gitlens", + "streetsidesoftware.code-spell-checker", + "timonwong.shellcheck", + "tamasfe.even-better-toml", + "skellock.just", + "redhat.vscode-yaml", + "DavidAnson.vscode-markdownlint", + "asciidoctor.asciidoctor-vscode", + "usernamehw.errorlens" + ], + "settings": { + "editor.formatOnSave": true, + "editor.insertSpaces": true, + "editor.tabSize": 2, + "files.trimTrailingWhitespace": true, + "files.insertFinalNewline": true, + "files.trimFinalNewlines": true, + "[makefile]": { + "editor.insertSpaces": false + } + } + }, + "codespaces": { + "openFiles": [ + "README.adoc" + ] + } + }, + + "forwardPorts": [], + + "shutdownAction": "stopContainer" +} diff --git a/haskell/.editorconfig b/haskell/.editorconfig new file mode 100644 index 0000000..bcdbb4d --- /dev/null +++ b/haskell/.editorconfig @@ -0,0 +1,65 @@ +# RSR-template-repo - Editor Configuration +# https://editorconfig.org + +root = true + +[*] +charset = utf-8 +end_of_line = lf +indent_size = 2 +indent_style = space +insert_final_newline = true +trim_trailing_whitespace = true + +[*.md] +trim_trailing_whitespace = false + +[*.adoc] +trim_trailing_whitespace = false + +[*.rs] +indent_size = 4 + +[*.ex] +indent_size = 2 + +[*.exs] +indent_size = 2 + +[*.zig] +indent_size = 4 + +[*.ada] +indent_size = 3 + +[*.adb] +indent_size = 3 + +[*.ads] +indent_size = 3 + +[*.hs] +indent_size = 2 + +[*.res] +indent_size = 2 + +[*.resi] +indent_size = 2 + +[*.ncl] +indent_size = 2 + +[*.rkt] +indent_size = 2 + +[*.scm] +indent_size = 2 + +[*.nix] +indent_size = 2 + +[Justfile] +indent_style = space +indent_size = 4 + diff --git a/haskell/.envrc b/haskell/.envrc new file mode 100644 index 0000000..2f1d290 --- /dev/null +++ b/haskell/.envrc @@ -0,0 +1,27 @@ +# SPDX-License-Identifier: MPL-2.0 +# Activate development environment +# Install direnv: https://direnv.net/ + +# Load .tool-versions if asdf is available +if has asdf; then + use asdf +fi + +# Load Guix shell if guix.scm exists +if has guix && [ -f guix.scm ]; then + use guix +fi + +# Load Nix flake if flake.nix exists +if has nix && [ -f flake.nix ]; then + use flake +fi + +# Project environment variables +export PROJECT_NAME="a2ml-haskell" +export RSR_TIER="infrastructure" +# export DATABASE_URL="..." +# export API_KEY="..." + +# Source .env if it exists (gitignored) +dotenv_if_exists diff --git a/haskell/.guix-channel b/haskell/.guix-channel new file mode 100644 index 0000000..91644df --- /dev/null +++ b/haskell/.guix-channel @@ -0,0 +1,22 @@ +;; SPDX-License-Identifier: MPL-2.0 +;; Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) +;; +;; Guix channel definition for a2ml-haskell +;; +;; To use this channel, add to ~/.config/guix/channels.scm: +;; +;; (channel +;; (name 'a2ml-haskell) +;; (url "https://github.com/hyperpolymath/a2ml-haskell") +;; (branch "main")) +;; +;; Then: guix pull + +(channel + (version 0) + (url "https://github.com/hyperpolymath/a2ml-haskell") + (dependencies + (channel + (name 'guix) + (url "https://git.savannah.gnu.org/git/guix.git") + (branch "master")))) diff --git a/haskell/.hypatia-ignore b/haskell/.hypatia-ignore new file mode 100644 index 0000000..c72542f --- /dev/null +++ b/haskell/.hypatia-ignore @@ -0,0 +1,2 @@ +cicd_rules/banned_language_file:a2ml-haskell.cabal +cicd_rules/banned_language_file:Setup.hs diff --git a/haskell/.machine_readable/0.1-AI-MANIFEST.a2ml b/haskell/.machine_readable/0.1-AI-MANIFEST.a2ml new file mode 100644 index 0000000..9d2bc7a --- /dev/null +++ b/haskell/.machine_readable/0.1-AI-MANIFEST.a2ml @@ -0,0 +1,29 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "machine-readable-pillar" +level: 1 +parent: "../0-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Registry for all machine-readable metadata, policies, and internal + automation scripts. + +canonical_locations: + state: "STATE.a2ml" + meta: "META.a2ml" + ecosystem: "ECOSYSTEM.a2ml" + agentic: "AGENTIC.a2ml" + neurosym: "NEUROSYM.a2ml" + playbook: "PLAYBOOK.a2ml" + anchors: "anchors/" + policies: "policies/" + ai_configs: "ai/" + compliance: "compliance/" + scripts: "scripts/" + +invariants: + - "Metadata files MUST follow a2ml format" + - "Internal automation MUST live in scripts/ subfolder" diff --git a/haskell/.machine_readable/6a2/AGENTIC.a2ml b/haskell/.machine_readable/6a2/AGENTIC.a2ml new file mode 100644 index 0000000..a8f6b17 --- /dev/null +++ b/haskell/.machine_readable/6a2/AGENTIC.a2ml @@ -0,0 +1,36 @@ +# SPDX-License-Identifier: MPL-2.0 +# Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) +# +# AGENTIC.a2ml — AI agent constraints and capabilities +# Defines what AI agents can and cannot do in this repository. + +[metadata] +version = "0.1.0" +last-updated = "2026-04-11" + +[agent-permissions] +can-edit-source = true +can-edit-tests = true +can-edit-docs = true +can-edit-config = true +can-create-files = true + +[agent-constraints] +# What AI agents must NOT do: +# - Never use banned language patterns (believe_me, unsafeCoerce, etc.) +# - Never commit secrets or credentials +# - Never use banned languages (TypeScript, Python, Go, etc.) +# - Never place state files in repository root (must be in .machine_readable/) +# - Never use AGPL license (use MPL-2.0) + +[maintenance-integrity] +fail-closed = true +require-evidence-per-step = true +allow-silent-skip = false +require-rerun-after-fix = true +release-claim-requires-hard-pass = true + +[automation-hooks] +# on-enter: Read 0-AI-MANIFEST.a2ml, then STATE.a2ml +# on-exit: Update STATE.a2ml with session outcomes +# on-commit: Run just validate-rsr diff --git a/haskell/.machine_readable/6a2/ECOSYSTEM.a2ml b/haskell/.machine_readable/6a2/ECOSYSTEM.a2ml new file mode 100644 index 0000000..b8a88b9 --- /dev/null +++ b/haskell/.machine_readable/6a2/ECOSYSTEM.a2ml @@ -0,0 +1,26 @@ +# SPDX-License-Identifier: MPL-2.0 +# Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) +# +# ECOSYSTEM.a2ml — Project ecosystem position +# Relationships, dependencies, integration points. + +[metadata] +version = "0.1.0" +last-updated = "2026-04-11" + +[project] +name = "a2ml-haskell" +purpose = "" # TODO: describe project purpose +role = "" # TODO: describe project role # e.g. ffi-infrastructure, cli-tool, library, service + +[position-in-ecosystem] +tier = "infrastructure" # 1 | 2 | infrastructure + +[related-projects] +# relationship types: sibling-standard, dependency, dependent, inspiration, potential-consumer +# - { name = "language-bridges", relationship = "sibling-standard" } +# - { name = "hypatia", relationship = "potential-consumer" } + +[integration-points] +# External systems this project connects to +# - { system = "gitbot-fleet", direction = "outbound", protocol = "repository_dispatch" } diff --git a/haskell/.machine_readable/6a2/META.a2ml b/haskell/.machine_readable/6a2/META.a2ml new file mode 100644 index 0000000..d9b09e6 --- /dev/null +++ b/haskell/.machine_readable/6a2/META.a2ml @@ -0,0 +1,53 @@ +# SPDX-License-Identifier: MPL-2.0 +# Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) +# +# META.a2ml — Project meta-level information +# Architecture decisions, design rationale, governance. + +[metadata] +version = "0.1.0" +last-updated = "2026-04-11" + +[project-info] +type = "library" # TODO: update type (library|binary|service|website|monorepo) # library | binary | monorepo | service | website +languages = [] # e.g. ["rust", "zig", "idris2"] +license = "MPL-2.0" +author = "Jonathan D.A. Jewell (hyperpolymath)" + +[architecture-decisions] +# ADR format: status = proposed | accepted | deprecated | superseded | rejected +# - { id = "ADR-001", title = "Use Zig for FFI", status = "accepted", date = "2026-02-14" } + +[development-practices] +build-tool = "just" +container-runtime = "podman" +ci-platform = "github-actions" +package-manager = "guix" # guix | nix | cargo | mix + +[maintenance-axes] +scoping-first = true +execution-order = "axis-1 > axis-2 > axis-3" +axis-1 = "must > intend > like" +axis-2 = "corrective > adaptive > perfective" +axis-3 = "systems > compliance > effects" + +[scoping] +sources = "README, roadmap, status docs, maintenance checklist, CI/security docs" +marker-scan = "TODO/FIXME/XXX/HACK/STUB/PARTIAL" +idris-unsound-scan = "believe_me/assert_total" + +[axis-2-maintenance-rules] +corrective-first = true +adaptive-second = true +adaptive-focus = "scope-change reconciliation, stale-reference removal, obsolete-work culling" +perfective-third = true +perfective-source = "axis-1 honest state after corrective/adaptive updates" + +[axis-3-audit-rules] +audit-focus = "systems in place, documentation explains actual state, safety/security accounted for, observed effects reviewed" +compliance-focus = "seams/compromises/exception register, bounded exceptions, anti-drift checks" +drift-risk-example = "single exception broadening into policy violation (e.g. ReScript->TypeScript spread)" +effects-evidence = "benchmark execution/results and maintainer status dialogue/review" + +[design-rationale] +# Key design decisions and their reasoning diff --git a/haskell/.machine_readable/6a2/NEUROSYM.a2ml b/haskell/.machine_readable/6a2/NEUROSYM.a2ml new file mode 100644 index 0000000..1acf7a3 --- /dev/null +++ b/haskell/.machine_readable/6a2/NEUROSYM.a2ml @@ -0,0 +1,23 @@ +# SPDX-License-Identifier: MPL-2.0 +# Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) +# +# NEUROSYM.a2ml — Neurosymbolic integration metadata +# Configuration for Hypatia scanning and symbolic reasoning. + +[metadata] +version = "0.1.0" +last-updated = "2026-04-11" + +[hypatia-config] +scan-enabled = true +scan-depth = "standard" # quick | standard | deep +report-format = "logtalk" + +[symbolic-rules] +# Custom symbolic rules for this project +# - { name = "no-unsafe-ffi", pattern = "believe_me|unsafeCoerce", severity = "critical" } + +[neural-config] +# Neural pattern detection settings +# confidence-threshold = 0.85 +# model = "hypatia-v2" diff --git a/haskell/.machine_readable/6a2/PLAYBOOK.a2ml b/haskell/.machine_readable/6a2/PLAYBOOK.a2ml new file mode 100644 index 0000000..6408e1c --- /dev/null +++ b/haskell/.machine_readable/6a2/PLAYBOOK.a2ml @@ -0,0 +1,35 @@ +# SPDX-License-Identifier: MPL-2.0 +# Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) +# +# PLAYBOOK.a2ml — Operational playbook +# Runbooks, incident response, deployment procedures. + +[metadata] +version = "0.1.0" +last-updated = "2026-04-11" + +[deployment] +# method = "gitops" # gitops | manual | ci-triggered +# target = "container" # container | binary | library | wasm + +[incident-response] +# 1. Check .machine_readable/STATE.a2ml for current status +# 2. Review recent commits and CI results +# 3. Run `just validate` to check compliance +# 4. Run `just security` to audit for vulnerabilities + +[release-process] +# 1. Update version in STATE.a2ml, META.a2ml, Justfile +# 2. Run `just release-preflight` (validate + quality + security + maint-hard-pass) +# 3. Optional local permission hardening: `just perms-snapshot && just perms-lock` +# 4. Tag and push +# 5. Restore local permissions if needed: `just perms-restore` +# 6. Run `just container-push` if applicable + +[maintenance-operations] +# Baseline audit: +# just maint-audit +# Hard release gate: +# just maint-hard-pass +# Permission audit: +# just perms-audit diff --git a/haskell/.machine_readable/6a2/STATE.a2ml b/haskell/.machine_readable/6a2/STATE.a2ml new file mode 100644 index 0000000..9e17d94 --- /dev/null +++ b/haskell/.machine_readable/6a2/STATE.a2ml @@ -0,0 +1,64 @@ +# SPDX-License-Identifier: MPL-2.0 +# Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) +# +# STATE.a2ml — Project state checkpoint (META-TEMPLATE) +# +# This is the STATE file for a2ml-haskell. +# When consumed by a new project, replace REMOVED tokens +# and customize sections below for the target project. + +[metadata] +project = "a2ml-haskell" +version = "0.2.0" +last-updated = "2026-02-28" +status = "active" # active | paused | archived + +[project-context] +name = "a2ml-haskell" +purpose = "Canonical RSR-compliant repository template providing scaffolding for all hyperpolymath projects — including CI/CD, AI manifests, ABI/FFI standards, container ecosystem, and governance infrastructure." +completion-percentage = 95 + +[position] +phase = "maintenance" # design | implementation | testing | maintenance | archived +maturity = "production" # experimental | alpha | beta | production | lts + +[route-to-mvp] +milestones = [ + { name = "Phase 0: Core scaffolding (justfile, CI/CD, .machine_readable)", completion = 100 }, + { name = "Phase 1: ABI/FFI standard (Idris2/Zig templates)", completion = 100 }, + { name = "Phase 1b: AI Gatekeeper Protocol (0-AI-MANIFEST.a2ml)", completion = 100 }, + { name = "Phase 1c: TOPOLOGY.md standard and guide", completion = 100 }, + { name = "Phase 1d: Maintenance gate (axes, checklist, approach)", completion = 100 }, + { name = "Phase 1e: Trustfile / contractiles", completion = 100 }, + { name = "Phase 2: Container ecosystem templates (stapeln)", completion = 100 }, + { name = "Phase 3: Multi-forge sync hardening", completion = 0 }, + { name = "Phase 4: Nix/Guix reproducible shells", completion = 50 }, +] + +[blockers-and-issues] +# No active blockers + +[critical-next-actions] +actions = [ + "Container templates complete — test with `just container-init`", + "Validate container templates across wolfi-base and static Chainguard images", + "Harden multi-forge sync for GitLab/Bitbucket mirroring edge cases", + "Expand Nix/Guix development shell templates", +] + +[maintenance-status] +last-run-utc = "never" +last-report = "docs/reports/maintenance/latest.json" +last-result = "unknown" # unknown | pass | warn | fail +open-warnings = 0 +open-failures = 0 + +[ecosystem] +part-of = ["RSR Framework", "stapeln ecosystem"] +depends-on = ["stapeln", "selur-compose", "cerro-torre", "svalinn", "vordr", "k9-svc"] + +# --------------------------------------------------------------------------- +# NOTE FOR CONSUMERS: When using this template to create a new repo, reset +# the fields above to your project's values and replace all REMOVED +# tokens. The milestones above describe the TEMPLATE's evolution, not yours. +# --------------------------------------------------------------------------- diff --git a/haskell/.machine_readable/ADJUST.contractile b/haskell/.machine_readable/ADJUST.contractile new file mode 100644 index 0000000..ba0d3a0 --- /dev/null +++ b/haskell/.machine_readable/ADJUST.contractile @@ -0,0 +1,126 @@ +; SPDX-License-Identifier: MPL-2.0 +; ADJUST.contractile — Accessibility invariants for a2ml-haskell +; "ADJUST" = Accessibility & Digital Justice for Universal Software & Technology +; +; Part of the contractile family: MUST, TRUST, DUST, INTENT, ADJUST +; This file is machine-readable. LLM/SLM agents MUST NOT violate these invariants. + +; ── Definitions ────────────────────────────────────────────────── +; +; ADJUST (noun/verb) +; The accessibility contractile. Defines how software must adapt to serve +; all users regardless of ability, device, or context. Named for the verb +; "adjust" — to make suitable, to adapt, to accommodate — which is the +; core action of accessible design. +; +; Scope: +; ADJUST governs all user-facing interfaces: GUI, TUI, CLI, web, mobile, +; documentation, error messages, and installation flows. It applies to +; both human users and assistive technologies (screen readers, switch +; devices, braille displays, voice control). +; +; Relationship to other contractiles: +; - MUST: ADJUST invariants are a subset of MUST — violating ADJUST +; is a MUST violation. ADJUST exists separately because accessibility +; rules are numerous enough to warrant their own file, and because +; LLMs frequently forget accessibility unless explicitly reminded. +; - TRUST: ADJUST does not affect trust levels. All trust tiers must +; respect ADJUST invariants equally. +; - DUST: Deprecating a feature does not exempt it from ADJUST until +; it is fully removed. Deprecated UI must remain accessible. +; - INTENT: ADJUST supports the anti-purpose "this software is NOT +; only for able-bodied users with modern hardware." +; +; Standard: WCAG 2.2 Level AA (minimum) +; https://www.w3.org/WAI/WCAG22/quickref/?levels=aaa +; +; Why a separate file: +; Experience shows LLMs and developers alike treat accessibility as an +; afterthought. By placing invariants in a contractile that is loaded +; at session start, we make it structurally impossible to forget. +; +; ── End Definitions ────────────────────────────────────────────── + +(adjust-contractile + (version "1.0.0") + (full-name "Accessibility & Digital Justice for Universal Software & Technology") + (standard "WCAG-2.2-AA") + (repo "a2ml-haskell") + + (invariants + ; ── Visual ── + (adjust "colour-contrast-ratio >= 4.5:1 for normal text") + (adjust "colour-contrast-ratio >= 3:1 for large text (18pt+ or 14pt+ bold)") + (adjust "no information conveyed by colour alone") + (adjust "no flashing or strobing content (3 flashes/second max)") + (adjust "text resizable to 200% without loss of content or function") + (adjust "focus indicators visible on all interactive elements") + + ; ── Keyboard ── + (adjust "all interactive elements reachable via keyboard (Tab/Shift+Tab)") + (adjust "no keyboard traps — user can always Tab away") + (adjust "skip navigation link present on pages with repeated blocks") + (adjust "logical focus order follows visual reading order") + + ; ── Screen reader ── + (adjust "all images have meaningful alt text (or alt='' if decorative)") + (adjust "all form inputs have associated labels") + (adjust "ARIA landmarks used for page regions (main, nav, banner, etc.)") + (adjust "dynamic content updates announced via aria-live regions") + (adjust "semantic HTML used (headings, lists, tables) — not div soup") + + ; ── Interactive ── + (adjust "touch targets minimum 44x44px on mobile/touch interfaces") + (adjust "error messages identify the field and describe the error") + (adjust "error messages not conveyed by colour or position alone") + (adjust "form validation provides suggestions for correction") + + ; ── Media ── + (adjust "video has captions (closed or open)") + (adjust "audio-only content has text transcript") + (adjust "no autoplay of media with sound") + + ; ── Motion ── + (adjust "animations respect prefers-reduced-motion media query") + (adjust "no content depends on motion to convey meaning") + + ; ── CLI/TUI ── + (adjust "CLI output must not rely solely on colour (use symbols: [OK] [FAIL])") + (adjust "TUI must support high-contrast mode") + (adjust "all CLI commands support --help with plain-text output") + (adjust "error messages written in plain language, not jargon or codes alone") + + ; ── Documentation ── + (adjust "docs use clear language, short sentences, logical structure") + (adjust "code examples include comments explaining non-obvious steps") + (adjust "diagrams have text descriptions or alt text") + + ; ── Internationalisation (i18n) ── + (adjust "all user-facing strings externalisable for translation") + (adjust "no hardcoded English in error messages — use message keys") + (adjust "date/time/number formats locale-aware") + (adjust "RTL (right-to-left) layout support where applicable") + (adjust "Unicode handled correctly throughout (UTF-8 everywhere)") + ) + + (related-resources + ; LOL — super-parallel corpus crawler for 1500+ languages + ; Use for linguistic data, translation coverage, and i18n validation + (lol "standards/lol — multilingual NLP corpus, see README.adoc") + (polyglot-i18n "polyglot-i18n — i18n framework and WASM translation engine") + ) + + (enforcement + (ci "accessibility linting in quality.yml workflow") + (pr-block "PR blocked if accessibility regression detected") + (tool "axe-core or pa11y for automated checks on web UI") + (tool "CLI output inspected for colour-only signalling") + (manual "manual screen reader test before major releases") + ) + + (notes + "These are MINIMUM requirements. Exceeding them (AAA) is encouraged." + "When in doubt about an accessibility decision, ask — don't guess." + "Accessibility is not optional polish — it is a structural requirement." + ) +) diff --git a/haskell/.machine_readable/CLADE.a2ml b/haskell/.machine_readable/CLADE.a2ml new file mode 100644 index 0000000..9acd486 --- /dev/null +++ b/haskell/.machine_readable/CLADE.a2ml @@ -0,0 +1,47 @@ +# SPDX-License-Identifier: MPL-2.0 +# Clade declaration — part of the gv-clade-index registry +# See: https://github.com/hyperpolymath/gv-clade-index + +[identity] +uuid = "87d21d3c-110b-50d9-8f16-ac0f2e3c4f4a" +primary-forge = "github" +primary-owner = "hyperpolymath" +canonical-name = "a2ml-haskell" +prefixed-name = "rm-a2ml-haskell" + +[clade] +primary = "rm" +secondary = ["gv"] +assigned = "2026-03-16" +rationale = "" + +[forges] +github = "hyperpolymath/a2ml-haskell" +gitlab = "hyperpolymath/a2ml-haskell" +bitbucket = "hyperpolymath/a2ml-haskell" + +[lineage] +type = "standalone" +parent = "RSR template — scaffold for new repos" +born = "2026-03-16" + +# Lifecycle status (added by clade-status-backfill; see gv-clade-index ADR 0006). +# Identity (uuid) and status are SEPARATE layers: uuid is immortal; phase is a +# mutable pointer. No phase is terminal (extinct -> active is a legal "Gitassic +# Park" transition on the same uuid). A rename is NOT a phase change — the old +# prefixed-name goes to aliases[], uuid and phase are untouched. +[status] +# One of: reserved incubating active dormant | merged superseded archived extinct +phase = "active" +since = "2026-03-16" +present = true +aliases = [] +merged-into = "" +superseded-by = "" +successors = [] +ended = "" + +[[status.history]] +phase = "active" +since = "2026-03-16" +note = "backfilled default — correct if the true phase differs" diff --git a/haskell/.machine_readable/ENSAID_CONFIG.a2ml b/haskell/.machine_readable/ENSAID_CONFIG.a2ml new file mode 100644 index 0000000..25ae657 --- /dev/null +++ b/haskell/.machine_readable/ENSAID_CONFIG.a2ml @@ -0,0 +1,96 @@ +# SPDX-License-Identifier: MPL-2.0 +# Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) +# +# ENSAID_CONFIG.a2ml — eNSAID Environment Configuration +# Per-repo configuration for PanLL and eNSAID-compatible tools. +# +# Canonical location: .machine_readable/ENSAID_CONFIG.a2ml +# Spec: https://github.com/hyperpolymath/standards/tree/main/ensaid-config +# +# Naming convention: +# - UPPERCASE + underscore = non-executable machine-readable file +# - Lives in .machine_readable/ alongside STATE.a2ml, META.a2ml, etc. + +# ───────────────────────────────────────────────────────────────── +# [ensaid] — Core eNSAID identity and version +# ───────────────────────────────────────────────────────────────── +[ensaid] +version = "1.0.0" +tool = "panll" + +# ───────────────────────────────────────────────────────────────── +# [workspace] — Workspace mode, protection, and execution policy +# ───────────────────────────────────────────────────────────────── +[workspace] +mode = "rhodium" # rhodium | gold | silver | bronze +protection = "open" # open | guarded | locked +execution = "live" # live | dry-run | approval-required + +# ───────────────────────────────────────────────────────────────── +# [preferences] — User/repo-level display and behaviour preferences +# ───────────────────────────────────────────────────────────────── +[preferences] +humidity = "medium" # high | medium | low (drift aura intensity) +default-arrangement = "default-3-panel" # workspace arrangement ID +auto-connect = true # auto-connect panels to backends on load + +# ───────────────────────────────────────────────────────────────── +# [panels] — Panel visibility, enablement, and isolation overrides +# ───────────────────────────────────────────────────────────────── +[panels] +version = "1.0.0" + +# By default, all panels are available. Uncomment to restrict: +# [[panels.enabled]] +# id = "valence-shell" +# isolation = "native" +# auto-connect = true +# +# [[panels.enabled]] +# id = "editor-bridge" +# isolation = "native" +# auto-connect = true + +# Panels to hide for this repo context: +# [panels.disabled] +# ids = [] + +# ───────────────────────────────────────────────────────────────── +# [workflows] — Automation Router event-driven cross-panel rules +# ───────────────────────────────────────────────────────────────── +[workflows] +version = "1.0.0" + +# Example: rebuild on file save +# [[workflows.rule]] +# name = "build-on-save" +# trigger = { event = "file-changed", pattern = "src/**/*.res" } +# condition = { panel = "build-dashboard", field = "watchMode", equals = true } +# action = { panel = "build-dashboard", message = "TriggerBuild", args = { target = "game" } } +# approval = "auto-fire" # auto-fire | require-approval | approve-once | dry-run-first + +# ───────────────────────────────────────────────────────────────── +# [clades] — Panel clade trait and capability overrides +# ───────────────────────────────────────────────────────────────── +[clades] +version = "1.0.0" + +# Example: add a custom capability to a panel clade +# [[clades.override]] +# id = "build-dashboard" +# traits = { has-work-items = true } +# capabilities-add = ["CustomCheck"] + +# ───────────────────────────────────────────────────────────────── +# [portfolios] — Custom panel bundles for this repo's workflow +# ───────────────────────────────────────────────────────────────── +[portfolios] +version = "1.0.0" + +# Example: a custom portfolio for this project +# [[portfolios.custom]] +# id = "{{project}}-dev" +# name = "a2ml-haskell Development" +# description = "Panels for a2ml-haskell development" +# panels = ["valence-shell", "editor-bridge", "build-dashboard"] +# default-isolation = "native" diff --git a/haskell/.machine_readable/INTENT.contractile b/haskell/.machine_readable/INTENT.contractile new file mode 100644 index 0000000..be44e83 --- /dev/null +++ b/haskell/.machine_readable/INTENT.contractile @@ -0,0 +1,72 @@ +; SPDX-License-Identifier: MPL-2.0 +; INTENT.contractile — Purpose and scope for a2ml-haskell +; Helps LLM/SLM agents understand what this repo IS and IS NOT. +; +; Part of the contractile family: MUST, TRUST, DUST, INTENT, ADJUST + +; ── Definitions ────────────────────────────────────────────────── +; +; INTENT (noun) +; The purpose contractile. Defines what this repository IS, what it is +; NOT (anti-purpose), and which architectural decisions are load-bearing. +; Without INTENT, LLMs drift into scope creep, reverse key decisions, +; or add features that belong in a different repo. +; +; Scope: +; INTENT governs the conceptual boundaries of the project — its reason +; for existing, its domain, and its relationship to the ecosystem. +; It does NOT specify implementation details (that's MUST and code). +; +; Relationship to other contractiles: +; - MUST: INTENT explains WHY certain MUSTs exist. If you don't +; understand a MUST, read INTENT first. +; - TRUST: The "ask-before-touching" section in INTENT maps directly +; to TRUST.trust-deny for the most sensitive areas. +; - ADJUST: INTENT's anti-purpose should include "this software is +; NOT only for users with perfect vision/hearing/mobility." +; - DUST: When INTENT changes (repo pivots), related DUST entries +; should be created for the abandoned direction. +; +; ── End Definitions ────────────────────────────────────────────── + +(intent-contractile + (version "1.0.0") + (repo "a2ml-haskell") + + ; === Purpose (what this repo IS) === + (purpose + "{{ONE_PARAGRAPH_PURPOSE}}" + ) + + ; === Anti-Purpose (what this repo is NOT — prevents scope creep) === + (anti-purpose + "{{ONE_PARAGRAPH_ANTI_PURPOSE}}" + ; Examples: + ; "This is NOT a general-purpose database — it solves one specific problem." + ; "This is NOT a framework — it is a library with a focused API." + ; "This does NOT handle authentication — that is delegated to [other repo]." + ) + + ; === Key Architectural Decisions That Must Not Be Reversed === + (architectural-invariants + ; *REMINDER: List the foundational decisions* + ; ("Idris2 for ABI definitions — dependent types prove interface correctness") + ; ("Zig for FFI — zero-cost C ABI compatibility") + ; ("Elixir for supervision — OTP fault tolerance") + ) + + ; === Sensitive Areas (if in doubt, ask) === + (ask-before-touching + ; *REMINDER: List areas where LLMs should check before modifying* + ; "src/abi/ — formal proofs, changes require re-verification" + ; "ffi/zig/ — C ABI boundary, changes affect all language bindings" + ; ".machine_readable/ — checkpoint files, format is specified" + ) + + ; === Ecosystem Position === + (ecosystem + (belongs-to "{{MONOREPO_OR_STANDALONE}}") + (depends-on ("{{DEP1}}" "{{DEP2}}")) + (depended-on-by ("{{CONSUMER1}}" "{{CONSUMER2}}")) + ) +) diff --git a/haskell/.machine_readable/MUST.contractile b/haskell/.machine_readable/MUST.contractile new file mode 100644 index 0000000..65015c7 --- /dev/null +++ b/haskell/.machine_readable/MUST.contractile @@ -0,0 +1,91 @@ +; SPDX-License-Identifier: MPL-2.0 +; MUST.contractile — Baseline invariants for a2ml-haskell +; These constraints MUST NOT be violated. K9 validators enforce them. +; +; Part of the contractile family: MUST, TRUST, DUST, INTENT, ADJUST + +; ── Definitions ────────────────────────────────────────────────── +; +; MUST (noun/verb) +; The hard-constraint contractile. Defines invariants that are structurally +; required for the repository to function correctly and safely. Violating +; a MUST is always a bug — there are no "soft" MUSTs. +; +; Scope: +; MUST governs code, configuration, CI, and structure. It does NOT govern +; style, preference, or approach — those belong in CLAUDE.md or coding +; standards. MUST is for things that break the project if violated. +; +; Relationship to other contractiles: +; - TRUST: MUST is enforced regardless of trust level. Even maximal-trust +; agents cannot violate MUST constraints. +; - ADJUST: All ADJUST invariants are implicitly MUST invariants too. +; ADJUST exists separately for visibility. +; - INTENT: MUST protects the architectural decisions described in INTENT. +; - DUST: When a feature enters DUST (deprecation), its MUST constraints +; remain active until the feature is fully removed. +; +; Enforcement: +; K9 validators in contractiles/k9/ machine-check MUST constraints. +; CI runs these on every PR. Violations block merge. +; +; ── End Definitions ────────────────────────────────────────────── + +(must-contractile + (version "1.0.0") + (repo "a2ml-haskell") + + ; === Universal Invariants (apply to ALL repos) === + + (invariants + ; Paths + (must "no hardcoded absolute paths (/home/*, /mnt/*, /var/mnt/*)") + (must "all paths use env vars, XDG dirs, or relative references") + + ; Language policy + (must "no new TypeScript files") + (must "no new Python files") + (must "no new Go files") + (must "no npm/bun/yarn/pnpm dependencies — Deno only") + + ; Dangerous patterns + (must "no believe_me (Idris2)") + (must "no assert_total (Idris2)") + (must "no Admitted (Coq)") + (must "no sorry (Lean)") + (must "no unsafeCoerce (Haskell)") + (must "no Obj.magic (OCaml)") + (must "no unsafe {} blocks without safety comment (Rust)") + + ; License + (must "SPDX-License-Identifier header on every source file") + (must "no removal or modification of LICENSE file") + + ; Structure + (must ".machine_readable/ directory preserved") + (must "0-AI-MANIFEST.a2ml preserved") + (must "no SCM files in repo root — only in .machine_readable/") + + ; CI + (must "no removal of CI workflows without explicit approval") + (must "all GitHub Actions SHA-pinned") + + ; Code quality + (must "tests must not be deleted or weakened") + (must "generated code in generated/ directory only") + (must "no introduction of OWASP top 10 vulnerabilities") + + ; ABI/FFI (if applicable) + (must "no modification of ABI contracts without proof update") + (must "no removal of formal verification proofs") + ) + + ; === Project-Specific Invariants === + ; *REMINDER: Add invariants specific to this repo* + ; (must "# Add project-specific invariants here") + + (enforcement + (k9-validator "contractiles/k9/must-check.k9.ncl") + (ci "quality.yml runs must-check on every PR") + ) +) diff --git a/haskell/.machine_readable/README.adoc b/haskell/.machine_readable/README.adoc new file mode 100644 index 0000000..471d6c7 --- /dev/null +++ b/haskell/.machine_readable/README.adoc @@ -0,0 +1 @@ += .machine_readable Pillar diff --git a/haskell/.machine_readable/TRUST.contractile b/haskell/.machine_readable/TRUST.contractile new file mode 100644 index 0000000..d790399 --- /dev/null +++ b/haskell/.machine_readable/TRUST.contractile @@ -0,0 +1,80 @@ +; SPDX-License-Identifier: MPL-2.0 +; TRUST.contractile — Trust boundaries for a2ml-haskell +; Defines what LLM/SLM agents are trusted to do without asking. +; +; Part of the contractile family: MUST, TRUST, DUST, INTENT, ADJUST + +; ── Definitions ────────────────────────────────────────────────── +; +; TRUST (noun/verb) +; The permission contractile. Defines the boundary between what an AI +; agent may do autonomously and what requires human approval. Trust is +; graduated — not binary — with four levels from minimal to maximal. +; +; Trust levels: +; - maximal: Agent may read, build, test, lint, format, heal freely. +; Only destructive/external actions require approval. +; - standard: Agent may read and build. Test/lint need approval. +; - restricted: Agent may read only. All modifications need approval. +; - minimal: Agent may read specific files only. Everything else blocked. +; +; Scope: +; TRUST governs AI agent behaviour only. It does not affect human +; contributors — humans follow CONTRIBUTING.md and GOVERNANCE.adoc. +; +; Relationship to other contractiles: +; - MUST: Trust never overrides MUST. Even at maximal trust, MUST +; violations are blocked. +; - ADJUST: Trust does not exempt from ADJUST. All trust tiers must +; produce accessible output. +; - INTENT: TRUST.trust-deny protects the sensitive areas listed in +; INTENT.ask-before-touching. +; - DUST: Deprecated features have the same trust rules as active ones. +; +; ── End Definitions ────────────────────────────────────────────── + +(trust-contractile + (version "1.0.0") + (repo "a2ml-haskell") + + (trust-level "maximal") ; maximal | standard | restricted | minimal + + ; === Maximal Trust (default) === + ; LLM may freely do these without asking: + (trust-actions + "read" ; Read any file in the repo + "build" ; Run build commands + "test" ; Run test suites + "lint" ; Run linters and formatters + "format" ; Auto-format code + "doctor" ; Run self-diagnostics + "heal" ; Attempt automatic repair + "git-status" ; Check git status + "git-diff" ; View diffs + "git-log" ; View history + ) + + ; === Denied Actions (always require human approval) === + (trust-deny + "delete-branch" ; Could lose work + "force-push" ; Overwrites history + "modify-ci-secrets" ; Security sensitive + "publish" ; External visibility + "push-to-main" ; Protected branch + "delete-files-bulk" ; More than 5 files at once + "modify-license" ; Legal implications + "modify-security-policy" ; Security implications + "remove-proofs" ; Formal verification regression + "disable-ci-checks" ; Safety regression + ) + + ; === Trust Boundary === + (trust-boundary "repo") ; LLM confined to this repo unless explicitly told otherwise + + ; === Override === + ; Repos requiring tighter trust override these settings with justification: + ; (override + ; (trust-level "restricted") + ; (reason "Contains production secrets / handles PII / etc.") + ; ) +) diff --git a/haskell/.machine_readable/agent_instructions/README.adoc b/haskell/.machine_readable/agent_instructions/README.adoc new file mode 100644 index 0000000..1cc7487 --- /dev/null +++ b/haskell/.machine_readable/agent_instructions/README.adoc @@ -0,0 +1,41 @@ +// SPDX-License-Identifier: CC-BY-SA-4.0 +// Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) += Agent Instructions +:toc: preamble + +Methodology-aware configuration for AI agents. Read by any AI agent +(Claude, Gemini, Copilot, etc.) at session start. + +== Files + +[cols="1,3"] +|=== +| File | Purpose + +| `methodology.a2ml` +| Default mode, invariants, ring ceiling, priority weights, convergent budget + +| `coverage.a2ml` +| Session coverage tracking — what was visited, what was skipped, what has MUSTs + +| `debt.a2ml` +| Meander debt — things found but not fixed, carried between sessions +|=== + +== How Agents Use These + +1. Read `methodology.a2ml` at session start — know mode, invariants, ceiling +2. Read `coverage.a2ml` — know what was visited last time, what was skipped +3. Read `debt.a2ml` — know what's outstanding from previous sessions +4. At session end, update `coverage.a2ml` and `debt.a2ml` + +== Relationship to Other Files + +* `AGENTIC.a2ml` says WHAT agents can do (permissions, gating) +* `agent_instructions/` says HOW agents should work (methodology) +* `bot_directives/` says what the gitbot-fleet does (fleet-specific) +* `CLAUDE.md` says how Claude specifically should work (Claude-specific) + +== Reference + +ADR-002 in `standards/agentic-a2ml/docs/ADR-002-methodology-layer.adoc` diff --git a/haskell/.machine_readable/agent_instructions/coverage.a2ml b/haskell/.machine_readable/agent_instructions/coverage.a2ml new file mode 100644 index 0000000..6979664 --- /dev/null +++ b/haskell/.machine_readable/agent_instructions/coverage.a2ml @@ -0,0 +1,61 @@ +# SPDX-License-Identifier: MPL-2.0 +# Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) +# +# coverage.a2ml — Session coverage tracking +# Updated at the end of each AI agent session. +# Persists what was visited, what was skipped, and what has MUSTs. +# +# Reference: ADR-002 in standards/agentic-a2ml/docs/ + +[metadata] +version = "1.0.0" +last-updated = "2026-03-24" + +# ============================================================================ +# COVERAGE STATE +# ============================================================================ +# Updated by agents at session end. Tracks which components have been +# visited and which have known MUSTs that were skipped. + +[coverage] +total-components = 0 +visited-components = 0 +coverage-percent = 0 + +# ============================================================================ +# VISITED COMPONENTS +# ============================================================================ +# Component → session date + ring reached +# Agents add entries as they work through components. +# +# Example: +# [coverage.visited.emergency-room] +# date = "2026-03-23" +# ring = 2 +# fixes = 3 +# notes = "boot-guardian built, shutdown-marshal built" + +# ============================================================================ +# SKIPPED COMPONENTS WITH MUSTS +# ============================================================================ +# Components with known MUSTs that were not visited in the most recent session. +# These become P1 inputs for the next session's Phase 0. +# +# Example: +# [coverage.skipped-musts.session-sentinel] +# priority = "P0" +# issue = "56 SIGABRTs in 4 days, D-Bus race condition" +# discovered = "2026-03-23" + +# ============================================================================ +# CHERRY-PICKING AUDIT +# ============================================================================ +# At session end, agents report whether they chose easy work over hard work. +# This is the accountability mechanism for the weighted priority system. +# +# [coverage.cherry-picking] +# easy-high-completed = 3 +# hard-high-completed = 1 +# easy-low-completed = 2 +# hard-low-deferred = 4 +# assessment = "Correctly prioritised — all MUST items addressed before COULDs" diff --git a/haskell/.machine_readable/agent_instructions/debt.a2ml b/haskell/.machine_readable/agent_instructions/debt.a2ml new file mode 100644 index 0000000..c0238c5 --- /dev/null +++ b/haskell/.machine_readable/agent_instructions/debt.a2ml @@ -0,0 +1,49 @@ +# SPDX-License-Identifier: MPL-2.0 +# Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) +# +# debt.a2ml — Meander debt list +# Things found but not fixed. Carried between sessions. +# Becomes the next session's Phase 0 input. +# +# Reference: ADR-002 in standards/agentic-a2ml/docs/ + +[metadata] +version = "1.0.0" +last-updated = "2026-03-24" + +# ============================================================================ +# DEBT ITEMS +# ============================================================================ +# Each item has: component, issue, effort (easy|medium|hard), impact (high|medium|low), +# priority (should|could), and discovered date. +# +# Items are consumed (removed) when fixed. New items are added at session end. +# The debt list prevents the "one more wave" loop — found things are persisted, +# not forgotten, and not used as justification for infinite meandering. + +# ============================================================================ +# SHOULD — would fix next wave +# ============================================================================ +# These are inputs for the next session if the user says "keep going". +# +# Example: +# [[debt.should]] +# component = "system-tools/monitoring/observatory" +# issue = "Stale duplicate of root observatory/" +# effort = "easy" +# impact = "medium" +# discovered = "2026-03-23" + +# ============================================================================ +# COULD — would fix eventually +# ============================================================================ +# These are low-priority items that don't justify a session on their own. +# They get picked up when an agent is in the area for other reasons. +# +# Example: +# [[debt.could]] +# component = "cicada" +# issue = "RSR_OUTLINE.adoc references banned AGPL-3.0" +# effort = "easy" +# impact = "low" +# discovered = "2026-03-23" diff --git a/haskell/.machine_readable/agent_instructions/methodology.a2ml b/haskell/.machine_readable/agent_instructions/methodology.a2ml new file mode 100644 index 0000000..bb46892 --- /dev/null +++ b/haskell/.machine_readable/agent_instructions/methodology.a2ml @@ -0,0 +1,107 @@ +# SPDX-License-Identifier: MPL-2.0 +# Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) +# +# methodology.a2ml — AI agent methodology configuration +# Declares how agents should approach work in this repository. +# Read at session start by any AI agent (Claude, Gemini, Copilot, etc.) +# +# Reference: ADR-002 in standards/agentic-a2ml/docs/ + +[metadata] +version = "1.0.0" +last-updated = "2026-03-24" +spec = "https://github.com/hyperpolymath/standards/blob/main/agentic-a2ml/docs/ADR-002-methodology-layer.adoc" + +# ============================================================================ +# MODE SELECTION +# ============================================================================ +# convergent: find gaps, fill them, build infrastructure (default for ops/infra) +# divergent: find what's strongest, push it further (for research/creative) +# hybrid: audit 20% of budget, then focus 80% on top MUSTs (default for most) + +[methodology] +default-mode = "hybrid" +ring-ceiling = 2 # Hard ceiling for ring expansion (0-3) +wave-cap = 2 # Max waves before requiring user "keep going" +spike-required = true # Every session must ship code, not just designs + +# ============================================================================ +# PRIORITY WEIGHTS +# ============================================================================ +# MUST (3x): Blocking the current work → fix immediately +# SHOULD (2x): Degrading quality of current work → fix if in zone +# COULD (1x): Improving quality of adjacent work → add to debt list + +[methodology.priority-weights] +must = 3 +should = 2 +could = 1 + +# ============================================================================ +# CONVERGENT BUDGET (when mode = convergent or hybrid) +# ============================================================================ +# How to allocate effort across work types. +# Prevents over-polishing docs while structural work waits. + +[methodology.convergent-budget] +structural = 70 # % for new modules, compilation fixes, wiring, integration +corrective = 20 # % for bugs found, broken imports, stale references +perfective = 10 # % for SPDX headers, doc updates, formatting, style + +# ============================================================================ +# UNIQUE STRENGTH (when mode = divergent) +# ============================================================================ +# What makes this project special. Agents should DEEPEN this, not broaden it. +# Customise this per project — the template default is generic. + +[methodology.unique-strength] +description = "Robustness" +deepen-not-broaden = true + +# ============================================================================ +# DIVERGENT INVARIANTS +# ============================================================================ +# Constraints that divergent mode must NOT violate. +# These are the riverbanks — diverge within them, not across. +# "Amplify uniqueness" means deepen, not broaden. +# +# Test before any divergent action: +# "Does this deepen the existing strength, or add a parallel strength?" +# If parallel → stop. Note as cross-project insight. + +[methodology.divergent-invariants] +rules = [ + # Customise per project. Examples: + # "Idris2 only for formal verification — no Lean4, Coq, Agda", + # "believe_me count must remain zero", + # "FFI architecture: Idris2 → RefC → Zig → C ABI (no shortcuts)", +] + +# Optional: language invariant for the core strength +# If set, divergent mode will not introduce other languages for this purpose +# language-invariant = "idris2" + +# ============================================================================ +# CONSTRAINT HINTS +# ============================================================================ +# Help Phase 0 find the critical chain faster. +# Updated at session end with newly discovered constraints. + +[methodology.known-constraints] +constraints = [ + # Customise per project. Examples: + # "End-to-end build has never been verified", + # "libproject.so does not exist yet — all bindings call stubs", +] + +# ============================================================================ +# STATE FILE VALIDATION +# ============================================================================ +# Phase 0 reads STATE.a2ml first but it may be broken. +# These rules detect corrupt/template/stale state files. + +[methodology.state-validation] +reject-if-contains = ["REMOVED", "a2ml-haskell", "rsr-template-repo"] +reject-if-project-name-mismatch = true +staleness-threshold-days = 90 +fallback-files = ["TODO.md", "TODO.adoc", "ROADMAP.adoc", "README.adoc"] diff --git a/haskell/.machine_readable/ai/.clinerules b/haskell/.machine_readable/ai/.clinerules new file mode 100644 index 0000000..eb95175 --- /dev/null +++ b/haskell/.machine_readable/ai/.clinerules @@ -0,0 +1,43 @@ +# SPDX-License-Identifier: MPL-2.0 +# Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) +# Authoritative source: docs/AI-CONVENTIONS.md + +# STARTUP: Read 0-AI-MANIFEST.a2ml first, then .machine_readable/STATE.a2ml. + +# LICENSE +# All original code: MPL-2.0. +# Never AGPL-3.0. MPL-2.0 only as platform-required fallback. +# SPDX header required on every source file. +# Copyright: Jonathan D.A. Jewell (hyperpolymath) + +# STATE FILES (.machine_readable/ ONLY) +# Never create in repo root: STATE.a2ml, META.a2ml, ECOSYSTEM.a2ml, +# AGENTIC.a2ml, NEUROSYM.a2ml, PLAYBOOK.a2ml. +# The .machine_readable/ directory is the single source of truth. + +# BANNED PATTERNS +# Idris2: believe_me, assert_total, assert_smaller, unsafePerformIO +# Haskell: unsafeCoerce, unsafePerformIO, undefined, error +# OCaml: Obj.magic, Obj.repr, Obj.obj +# Coq: Admitted +# Lean: sorry +# Rust: transmute (unless FFI with // SAFETY: comment) + +# BANNED LANGUAGES +# TypeScript -> ReScript +# Node.js / npm / bun -> Deno +# Go -> Rust +# Python -> Julia or Rust + +# CONTAINERS +# Runtime: Podman (never Docker). +# File: Containerfile (never Dockerfile). +# Base: cgr.dev/chainguard/wolfi-base:latest or cgr.dev/chainguard/static:latest. + +# ABI/FFI +# ABI: Idris2 with dependent types (src/interface/abi/). +# FFI: Zig with C ABI (src/interface/ffi/). +# Headers: src/interface/generated/. + +# BUILD: Use just (justfile) for all tasks. +# STYLE: Descriptive names. Document all files. SPDX headers everywhere. diff --git a/haskell/.machine_readable/ai/.cursorrules b/haskell/.machine_readable/ai/.cursorrules new file mode 100644 index 0000000..5255a80 --- /dev/null +++ b/haskell/.machine_readable/ai/.cursorrules @@ -0,0 +1,47 @@ +# SPDX-License-Identifier: MPL-2.0 +# Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) +# Authoritative source: docs/AI-CONVENTIONS.md + +# Read 0-AI-MANIFEST.a2ml in the repo root FIRST for canonical file locations. + +# LICENSE +# All original code: MPL-2.0 (SPDX header required on every file). +# Never use AGPL-3.0. Fallback to MPL-2.0 only when platform requires it. +# Copyright: Jonathan D.A. Jewell (hyperpolymath) + +# STATE FILES +# .a2ml metadata files go in .machine_readable/ ONLY. +# Never create STATE.a2ml, META.a2ml, ECOSYSTEM.a2ml, AGENTIC.a2ml, +# NEUROSYM.a2ml, or PLAYBOOK.a2ml in the repository root. + +# BANNED PATTERNS +# Idris2: believe_me, assert_total, assert_smaller, unsafePerformIO +# Haskell: unsafeCoerce, unsafePerformIO, undefined, error +# OCaml: Obj.magic, Obj.repr, Obj.obj +# Coq: Admitted +# Lean: sorry +# Rust: transmute (unless FFI with // SAFETY: comment) + +# BANNED LANGUAGES +# TypeScript -> use ReScript +# Node.js / npm / bun -> use Deno +# Go -> use Rust +# Python -> use Julia or Rust + +# CONTAINERS +# Runtime: Podman (never Docker) +# File: Containerfile (never Dockerfile) +# Base: cgr.dev/chainguard/wolfi-base:latest + +# ABI/FFI STANDARD +# ABI definitions: Idris2 with dependent types (src/interface/abi/) +# FFI implementation: Zig with C ABI (src/interface/ffi/) +# Generated C headers: src/interface/generated/ + +# BUILD SYSTEM +# Use just (justfile) for all build, test, lint, and format tasks. + +# CODE STYLE +# Use descriptive variable names. +# Annotate and document all files. +# Add SPDX-License-Identifier header to every source file. diff --git a/haskell/.machine_readable/ai/.windsurfrules b/haskell/.machine_readable/ai/.windsurfrules new file mode 100644 index 0000000..eb95175 --- /dev/null +++ b/haskell/.machine_readable/ai/.windsurfrules @@ -0,0 +1,43 @@ +# SPDX-License-Identifier: MPL-2.0 +# Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) +# Authoritative source: docs/AI-CONVENTIONS.md + +# STARTUP: Read 0-AI-MANIFEST.a2ml first, then .machine_readable/STATE.a2ml. + +# LICENSE +# All original code: MPL-2.0. +# Never AGPL-3.0. MPL-2.0 only as platform-required fallback. +# SPDX header required on every source file. +# Copyright: Jonathan D.A. Jewell (hyperpolymath) + +# STATE FILES (.machine_readable/ ONLY) +# Never create in repo root: STATE.a2ml, META.a2ml, ECOSYSTEM.a2ml, +# AGENTIC.a2ml, NEUROSYM.a2ml, PLAYBOOK.a2ml. +# The .machine_readable/ directory is the single source of truth. + +# BANNED PATTERNS +# Idris2: believe_me, assert_total, assert_smaller, unsafePerformIO +# Haskell: unsafeCoerce, unsafePerformIO, undefined, error +# OCaml: Obj.magic, Obj.repr, Obj.obj +# Coq: Admitted +# Lean: sorry +# Rust: transmute (unless FFI with // SAFETY: comment) + +# BANNED LANGUAGES +# TypeScript -> ReScript +# Node.js / npm / bun -> Deno +# Go -> Rust +# Python -> Julia or Rust + +# CONTAINERS +# Runtime: Podman (never Docker). +# File: Containerfile (never Dockerfile). +# Base: cgr.dev/chainguard/wolfi-base:latest or cgr.dev/chainguard/static:latest. + +# ABI/FFI +# ABI: Idris2 with dependent types (src/interface/abi/). +# FFI: Zig with C ABI (src/interface/ffi/). +# Headers: src/interface/generated/. + +# BUILD: Use just (justfile) for all tasks. +# STYLE: Descriptive names. Document all files. SPDX headers everywhere. diff --git a/haskell/.machine_readable/ai/0.2-AI-MANIFEST.a2ml b/haskell/.machine_readable/ai/0.2-AI-MANIFEST.a2ml new file mode 100644 index 0000000..869cbee --- /dev/null +++ b/haskell/.machine_readable/ai/0.2-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "ai-registry" +level: 2 +parent: "../0.1-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Sub-registry for ai metadata. diff --git a/haskell/.machine_readable/ai/AI.a2ml b/haskell/.machine_readable/ai/AI.a2ml new file mode 100644 index 0000000..c683d30 --- /dev/null +++ b/haskell/.machine_readable/ai/AI.a2ml @@ -0,0 +1,16 @@ + +# AI Assistant Instructions + +## Repository Focus +- `rsr-template-repo` is treated as a Rhodium Standard Repository; obey the Rhodium policies and keep `.machine_readable/` authoritative. +- All machine-readable content lives under `.machine_readable/` — state files (a2ml), bot directives, and contractiles. +- Prefer to keep generated files out of source control, and regenerate them with the documented commands before committing. + +## Workflow +1. Inspect `.machine_readable/STATE.a2ml` for blockers and next actions. +2. Respect any constraints listed inside `.machine_readable/AGENTIC.a2ml` when tooling changes are requested. +3. After finishing edits, update STATE with your outcomes and commit with a concise, imperative message. + +## Delivery Promises +- Mention in summaries whether STATE, `.machine_readable/contractiles/`, or `.machine_readable/bot_directives/` changed. +- Keep this file in sync with the repository's status; update it if the governance changes. diff --git a/haskell/.machine_readable/ai/PLACEHOLDERS.adoc b/haskell/.machine_readable/ai/PLACEHOLDERS.adoc new file mode 100644 index 0000000..3eb3693 --- /dev/null +++ b/haskell/.machine_readable/ai/PLACEHOLDERS.adoc @@ -0,0 +1,142 @@ += Template Placeholders +# Template Placeholders + +All placeholders in this template follow the `REMOVED` pattern. +After cloning, replace them with your project-specific values. + +## Recommended: Interactive Bootstrap + +```bash +just init +``` + +This interactively prompts for all values, replaces every placeholder, +validates the result, and runs k9-svc checks if available. + +## Manual Replace + +```bash +# If you prefer manual replacement (run from repo root) + +sed -i 's/Jonathan D.A. Jewell/Jane Doe/g' $(grep -rl 'Jonathan D.A. Jewell' .) +sed -i 's/j.d.a.jewell@open.ac.uk/jane@example.org/g' $(grep -rl 'j.d.a.jewell@open.ac.uk' .) +sed -i 's/hyperpolymath/my-org/g' $(grep -rl 'hyperpolymath' .) +sed -i 's/a2ml-haskell/my-project/g' $(grep -rl 'a2ml-haskell' .) +sed -i 's/a2ml-haskell/MY_PROJECT/g' $(grep -rl 'a2ml-haskell' .) +sed -i 's/{{project}}/my_project/g' $(grep -rl '{{project}}' .) +sed -i 's/a2ml-haskell/my-project/g' $(grep -rl 'a2ml-haskell' .) +sed -i 's/github.com/github.com/g' $(grep -rl 'github.com' .) +sed -i "s/2026/$(date +%Y)/g" $(grep -rl '2026' .) +sed -i "s/2026-07-08/$(date +%Y-%m-%d)/g" $(grep -rl '2026-07-08' .) +``` + +## Placeholder Reference + +### Author & Copyright + +| Placeholder | Description | Example | Files | +|---|---|---|---| +| `Jonathan D.A. Jewell` | Full legal name | `Jane Doe` | SPDX headers (all files), MAINTAINERS.md, .mailmap, .reuse/dep5, docs/AI-CONVENTIONS.md | +| `j.d.a.jewell@open.ac.uk` | Primary contact email | `jane@example.org` | SPDX headers (all files), .mailmap, .reuse/dep5, .well-known/humans.txt | +| `{{AUTHOR_EMAIL_ALT}}` | Previous/secondary email (for .mailmap) | `old@example.com` | .mailmap | +| `hyperpolymath` | Author's organization/affiliation | `Acme University` | project-metadata.k9.ncl | +| `Jewell` | Author surname (for citations) | `Doe` | docs/CITATIONS.adoc | +| `Jonathan` | Author first name (for citations) | `Jane` | docs/CITATIONS.adoc | +| `J.` | Author initials (for citations) | `J.` | docs/CITATIONS.adoc | + +### Project Identity + +| Placeholder | Description | Example | Files | +|---|---|---|---| +| `a2ml-haskell` | Human-readable project name | `My Project` | SECURITY.md, CODE_OF_CONDUCT.md, TOPOLOGY.md, STATE.a2ml, Justfile, GOVERNANCE.md, MAINTAINERS.md, flake.nix, devcontainer.json | +| `a2ml-haskell` | One-line description | `A tool for X` | flake.nix | +| `a2ml-haskell` | Uppercase identifier (for Idris2 modules, C macros) | `MY_PROJECT` | ABI-FFI-README.md, src/interface/abi/*.idr, src/interface/ffi/*.zig | +| `{{project}}` | Lowercase identifier (for C symbols, filenames) | `my_project` | ABI-FFI-README.md, src/interface/ffi/*.zig | +| `a2ml-haskell` | Repository name (slug) | `my-project` | CONTRIBUTING.md, SECURITY.md, CODE_OF_CONDUCT.md, cliff.toml | +| `hyperpolymath` | GitHub/GitLab org or username | `my-org` | SPDX headers, CONTRIBUTING.md, SECURITY.md, GOVERNANCE.md, MAINTAINERS.md, CODEOWNERS, mirror.yml, cliff.toml | +| `github.com` | Git forge domain | `github.com` | CONTRIBUTING.md | + +### Dates + +| Placeholder | Description | Example | Files | +|---|---|---|---| +| `2026` | Current year | `2026` | SPDX headers (all files), GOVERNANCE.md, MAINTAINERS.md | +| `2026-07-08` | Current date (ISO) | `2026-02-14` | STATE.a2ml, MAINTAINERS.md | +| `2026-07-08` | Last updated date | `2026-02-14` | TOPOLOGY.md, THREAT-MODEL.md | + +### Contact & Security + +| Placeholder | Description | Example | Files | +|---|---|---|---| +| `security@example.com` | Security contact email | `security@example.org` | SECURITY.md | +| `0000000000000000000000000000000000000000` | 40-char PGP fingerprint | `ABCD 1234 ...` | SECURITY.md | +| `https://keys.openpgp.org/vks/v1/by-fingerprint/0000000000000000000000000000000000000000` | URL to public PGP key | `https://keys.openpgp.org/...` | SECURITY.md | +| `https://github.com/hyperpolymath` | Project website | `https://example.org` | SECURITY.md | +| `conduct@example.com` | Conduct reports email | `conduct@example.org` | CODE_OF_CONDUCT.md | +| `Code of Conduct Committee` | Conduct committee name | `Code of Conduct Committee` | CODE_OF_CONDUCT.md | +| `48 hours` | SLA for initial response | `48 hours` | CODE_OF_CONDUCT.md | + +### Git + +| Placeholder | Description | Example | Files | +|---|---|---|---| +| `main` | Main branch name | `main` | CONTRIBUTING.md | + +### Build + +| Placeholder | Description | Example | Files | +|---|---|---|---| +| `MPL-2.0` | License name | `MPL-2.0` | ABI-FFI-README.md | +| `A hyperpolymath project` | One-line project description | `FFI bridges between languages` | STATE.a2ml | + +### AI Manifest + +| Placeholder | Description | Example | Files | +|---|---|---|---| +| `[YOUR-REPO-NAME]` | Repository name | `my-project` | 0-AI-MANIFEST.a2ml | +| `[DATE]` | Creation date | `2026-02-14` | 0-AI-MANIFEST.a2ml | +| `[YOUR-NAME/ORG]` | Maintainer name | `hyperpolymath` | 0-AI-MANIFEST.a2ml | + +### AI Installation Guide + +| Marker | Description | Files | +|---|---|---| +| `[TODO-AI-INSTALL]` | Unfilled section in AI installation guide | `docs/AI_INSTALLATION_GUIDE.adoc`, `docs/AI-INSTALL-README-SECTION.adoc`, `README.adoc` | + +These are **not** standard `REMOVED` markers -- they are TODO markers +that must be replaced with project-specific content before release. They mark +sections where the developer (or AI) must fill in: + +- What questions the AI should ask the user +- Exact prerequisite check and install commands +- Privacy notice specific to this project +- Complete installation command block +- Credential setup instructions (URLs, scopes, env vars) +- Verification commands and expected output +- Error handling table +- Example conversation + +**finishbot checks:** `just validate-ai-install` verifies no `[TODO-AI-INSTALL]` markers remain. + +## Deletion Markers + +Some files contain deletion instructions: + +| Marker | Meaning | File | +|---|---|---| +| `{{~ ... ~}}` | Delete this entire line after reading | ABI-FFI-README.md (line 1) | + +## Verification + +After replacing all placeholders, verify none remain: + +```bash +grep -rn '{{' . --include='*.md' --include='*.adoc' --include='*.a2ml' \ + --include='*.scm' --include='*.idr' --include='*.zig' --include='*.res' \ + --include='Justfile' --include='*.nix' --include='*.toml' --include='*.yml' \ + --include='*.yaml' --include='*.hs' --include='*.ncl' --include='*.txt' \ + --include='*.json' --include='Containerfile' --include='dep5' \ + | grep -v 'PLACEHOLDERS.md' | grep -v 'node_modules' +``` + +If the above command produces no output, all placeholders have been replaced. diff --git a/haskell/.machine_readable/ai/README.adoc b/haskell/.machine_readable/ai/README.adoc new file mode 100644 index 0000000..121bbc8 --- /dev/null +++ b/haskell/.machine_readable/ai/README.adoc @@ -0,0 +1,22 @@ += AI Guidance Directory + +Put AI-facing instructions in this folder. + +Examples: + +* `CLAUDE.md` +* `COPILOT.md` +* `GEMINI.md` +* `AI.a2ml` +* `AI.djot` + +Avoid scattering agent instruction files around the repo root. + +Recommended machine read order: + +* `.machine_readable/anchors/ANCHOR.a2ml` +* `.machine_readable/policies/MAINTENANCE-AXES.a2ml` +* `.machine_readable/policies/MAINTENANCE-CHECKLIST.a2ml` +* `.machine_readable/policies/SOFTWARE-DEVELOPMENT-APPROACH.a2ml` +* `.machine_readable/STATE.a2ml` +* `.machine_readable/META.a2ml` diff --git a/haskell/.machine_readable/anchors/0.2-AI-MANIFEST.a2ml b/haskell/.machine_readable/anchors/0.2-AI-MANIFEST.a2ml new file mode 100644 index 0000000..45038e1 --- /dev/null +++ b/haskell/.machine_readable/anchors/0.2-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "anchors-registry" +level: 2 +parent: "../0.1-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Sub-registry for anchors metadata. diff --git a/haskell/.machine_readable/anchors/ANCHOR.a2ml b/haskell/.machine_readable/anchors/ANCHOR.a2ml new file mode 100644 index 0000000..bf00fcd --- /dev/null +++ b/haskell/.machine_readable/anchors/ANCHOR.a2ml @@ -0,0 +1,62 @@ +# SPDX-License-Identifier: MPL-2.0 +# Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) +# +# ANCHOR.a2ml - authoritative anchor for this repository + +[metadata] +version = "1.0.0" +last-updated = "2026-07-08" + +[anchor] +schema = "hyperpolymath.anchor/1" +repo = "hyperpolymath/a2ml-haskell" +authority = "upstream-canonical" + +purpose = [ + "Define canonical semantics and policy boundaries for this repository.", + "Declare what downstream/satellite repos can extend but not redefine.", + "Provide a stable golden path and invariant contract for release readiness.", +] + +[identity] +project = "a2ml-haskell" +kind = "{{PROJECT_KIND}}" # language | library | service | tool +one-sentence = "A hyperpolymath project" +domain = "{{PROJECT_DOMAIN}}" + +[semantic-authority] +policy = "canonical" + +owns = [ + "Project semantics and specification", + "Invariant definitions and contractiles", + "Reference implementation behavior", +] + +[implementation-policy] +allowed = ["Rust", "Idris2", "Zig", "Scheme", "Shell", "Just", "AsciiDoc", "Markdown"] +forbidden = ["Node.js", "npm"] + +[golden-path] +smoke-test-command = [ + "just test", + "just quality", +] + +success-criteria = [ + "Core tests pass", + "Quality gates pass", + "No unresolved critical security findings", +] + +[satellite-policy] +must-pin-upstream = true +must-declare-authority = true +must-have-anchor = true +must-have-golden-path = true + +[semantic-authority-files] +language-spec = "SPECIFICATION.md" +formal-proofs = "docs/proofs/PROOFS.adoc" +type-theory = "docs/theory/THEORY.adoc" +algorithms = "docs/theory/ALGORITHMS.adoc" diff --git a/haskell/.machine_readable/anchors/README.adoc b/haskell/.machine_readable/anchors/README.adoc new file mode 100644 index 0000000..1b27c02 --- /dev/null +++ b/haskell/.machine_readable/anchors/README.adoc @@ -0,0 +1 @@ += anchors Registry diff --git a/haskell/.machine_readable/compliance/reuse/dep5 b/haskell/.machine_readable/compliance/reuse/dep5 new file mode 100644 index 0000000..4aed28e --- /dev/null +++ b/haskell/.machine_readable/compliance/reuse/dep5 @@ -0,0 +1,54 @@ +Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ +Upstream-Name: a2ml-haskell +Upstream-Contact: Jonathan D.A. Jewell +Source: https://github.com/hyperpolymath/a2ml-haskell + +# Default: all files are MPL-2.0 +Files: * +Copyright: 2026 Jonathan D.A. Jewell (hyperpolymath) +License: MPL-2.0 + +# Configuration files that cannot carry headers +Files: .editorconfig .gitignore .gitattributes .tool-versions .mailmap +Copyright: 2026 Jonathan D.A. Jewell (hyperpolymath) +License: MPL-2.0 + +# Machine-readable state files +Files: .machine_readable/*.a2ml +Copyright: 2026 Jonathan D.A. Jewell (hyperpolymath) +License: MPL-2.0 + +# Bot directives +Files: .machine_readable/bot_directives/* +Copyright: 2026 Jonathan D.A. Jewell (hyperpolymath) +License: MPL-2.0 + +# Contractiles +Files: .machine_readable/contractiles/* +Copyright: 2026 Jonathan D.A. Jewell (hyperpolymath) +License: MPL-2.0 + +# GitHub/CI configuration +Files: .github/* .github/**/* +Copyright: 2026 Jonathan D.A. Jewell (hyperpolymath) +License: MPL-2.0 + +# Generated files +Files: generated/* +Copyright: 2026 Jonathan D.A. Jewell (hyperpolymath) +License: MPL-2.0 + +# Lockfiles and auto-generated +Files: *.lock Cargo.lock flake.lock +Copyright: 2026 Jonathan D.A. Jewell (hyperpolymath) +License: MPL-2.0 + +# Devcontainer config (JSON, no comments) +Files: .devcontainer/*.json +Copyright: 2026 Jonathan D.A. Jewell (hyperpolymath) +License: MPL-2.0 + +# Git-cliff config +Files: cliff.toml +Copyright: 2026 Jonathan D.A. Jewell (hyperpolymath) +License: MPL-2.0 diff --git a/haskell/.machine_readable/compliance/rust/deny.toml b/haskell/.machine_readable/compliance/rust/deny.toml new file mode 100644 index 0000000..0534a85 --- /dev/null +++ b/haskell/.machine_readable/compliance/rust/deny.toml @@ -0,0 +1,65 @@ +# SPDX-License-Identifier: MPL-2.0 +# cargo-deny configuration for RSR-compliant repositories +# Run: cargo deny check +# Docs: https://embarkstudios.github.io/cargo-deny/ + +[graph] +targets = [] +all-features = true + +# --- Advisory database --------------------------------------------------- +[advisories] +db-path = "~/.cargo/advisory-db" +db-urls = ["https://github.com/rustsec/advisory-db"] +# Fail on any known vulnerability +vulnerability = "deny" +unmaintained = "warn" +yanked = "warn" +notice = "warn" + +# --- License policy ------------------------------------------------------- +[licenses] +unlicensed = "deny" +confidence-threshold = 0.8 + +allow = [ + "MPL-2.0", + "MPL-2.0", + "MIT", + "Apache-2.0", + "BSD-2-Clause", + "BSD-3-Clause", + "ISC", + "Zlib", + "Unicode-3.0", + "Unicode-DFS-2016", +] + +deny = [ + "AGPL-3.0-only", + "AGPL-3.0-or-later", +] + +copyleft = "warn" + +[[licenses.exceptions]] +allow = ["OpenSSL"] +name = "ring" + +# --- Crate bans ------------------------------------------------------------ +[bans] +multiple-versions = "warn" +wildcards = "allow" +highlight = "all" + +deny = [ + # Known-bad crates + { name = "openssl", wrappers = ["openssl-sys"] }, +] + +# --- Source restrictions ---------------------------------------------------- +[sources] +unknown-registry = "deny" +unknown-git = "warn" +allow-registry = ["https://github.com/rust-lang/crates.io-index"] +allow-git = [] diff --git a/haskell/.machine_readable/configs/0.2-AI-MANIFEST.a2ml b/haskell/.machine_readable/configs/0.2-AI-MANIFEST.a2ml new file mode 100644 index 0000000..6e41e6c --- /dev/null +++ b/haskell/.machine_readable/configs/0.2-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "configs-registry" +level: 2 +parent: "../0.1-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Sub-registry for configs metadata. diff --git a/haskell/.machine_readable/configs/README.adoc b/haskell/.machine_readable/configs/README.adoc new file mode 100644 index 0000000..616b9e7 --- /dev/null +++ b/haskell/.machine_readable/configs/README.adoc @@ -0,0 +1 @@ += configs Registry diff --git a/haskell/.machine_readable/configs/git-cliff/cliff.toml b/haskell/.machine_readable/configs/git-cliff/cliff.toml new file mode 100644 index 0000000..9188572 --- /dev/null +++ b/haskell/.machine_readable/configs/git-cliff/cliff.toml @@ -0,0 +1,119 @@ +# SPDX-License-Identifier: MPL-2.0 +# Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) +# +# git-cliff configuration for conventional commit changelog generation. +# https://git-cliff.org/docs/configuration +# +# Placeholders — replace before first use: +# hyperpolymath — GitHub organization or username +# a2ml-haskell — GitHub repository name + +[changelog] +# Changelog header +header = """ +# Changelog\n +All notable changes to this project will be documented in this file.\n +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).\n +\n +""" +# Template for the changelog body +# https://keats.github.io/tera/docs/#introduction +body = """ +{%- macro remote_url() -%} + https://github.com/hyperpolymath/a2ml-haskell +{%- endmacro -%} + +{% if version -%} + ## [{{ version | trim_start_matches(pat="v") }}] - {{ timestamp | date(format="%Y-%m-%d") }} +{% else -%} + ## [Unreleased] +{% endif -%} + +{% for group, commits in commits | group_by(attribute="group") %} + ### {{ group | striptags | trim }} + {% for commit in commits %} + - {% if commit.scope %}**{{ commit.scope }}:** {% endif %}\ + {% if commit.breaking %}[**BREAKING**] {% endif %}\ + {{ commit.message | upper_first }}\ + {%- if commit.links %} \ + ({% for link in commit.links %}[{{ link.text }}]({{ link.href }}){% endfor %}){% endif -%} + {% endfor %} +{% endfor %} + +{%- if github -%} +{% if github.contributors | filter(attribute="is_first_time", value=true) | length != 0 %} + ### New Contributors +{%- for contributor in github.contributors | filter(attribute="is_first_time", value=true) %} + * @{{ contributor.username }} made their first contribution + {%- if contributor.pr_number %} in \ + [#{{ contributor.pr_number }}]({{ self::remote_url() }}/pull/{{ contributor.pr_number }}) + {%- endif %} +{%- endfor %} +{% endif -%} +{% endif -%} + +""" +# Template for the changelog footer +footer = """ +{%- macro remote_url() -%} + https://github.com/hyperpolymath/a2ml-haskell +{%- endmacro -%} + +{% for release in releases -%} + {% if release.version -%} + {% if release.previous.version -%} + [{{ release.version | trim_start_matches(pat="v") }}]: \ + {{ self::remote_url() }}/compare/{{ release.previous.version }}...{{ release.version }} + {% endif -%} + {% else -%} + {% if release.previous.version -%} + [Unreleased]: {{ self::remote_url() }}/compare/{{ release.previous.version }}...HEAD + {% endif -%} + {% endif -%} +{% endfor %} + +""" +# Remove leading and trailing whitespace from templates +trim = true + +[git] +# Parse conventional commits +# https://www.conventionalcommits.org +conventional_commits = true +# Filter out unconventional commits +filter_unconventional = true +# Process each line of a commit as an individual commit +split_commits = false +# Regex for commit preprocessing +commit_preprocessors = [ + # Remove issue numbers from commit messages + { pattern = '\((\w+\s)?#([0-9]+)\)', replace = "" }, +] +# Regex for parsing and grouping commits +commit_parsers = [ + { message = "^feat", group = "Features" }, + { message = "^fix", group = "Bug Fixes" }, + { message = "^security", group = "Security" }, + { message = "^perf", group = "Performance" }, + { message = "^refactor", group = "Refactoring" }, + { message = "^docs", group = "Documentation" }, + { message = "^style", group = "Styling" }, + { message = "^test", group = "Testing" }, + { message = "^ci", group = "CI/CD" }, + { message = "^chore\\(release\\)", skip = true }, + { message = "^chore\\(deps.*\\)", skip = true }, + { message = "^chore\\(pr\\)", skip = true }, + { message = "^chore", group = "Miscellaneous" }, + { body = ".*security", group = "Security" }, +] +# Protect breaking changes from being skipped by a commit parser +protect_breaking_commits = false +# Filter out merge commits +filter_merge_commits = true +# Filter out commits by tag pattern (skip pre-releases) +# tag_pattern = "v[0-9].*" +# Regex for skipping tags +# skip_tags = "beta|alpha" +# Sort commits within each group by oldest first +sort_commits = "oldest" diff --git a/haskell/.machine_readable/contractiles/README.adoc b/haskell/.machine_readable/contractiles/README.adoc new file mode 100644 index 0000000..d40fcd1 --- /dev/null +++ b/haskell/.machine_readable/contractiles/README.adoc @@ -0,0 +1,19 @@ += Contractiles Template Set +:toc: +:sectnums: + +This directory contains the generalized contractiles templates. Copy the `.machine_readable/contractiles/` directory into a new repo to establish a consistent operational, validation, trust, recovery, and intent framework. + +== Fill-In Instructions + +1. Update the Mustfile to reflect your real invariants (paths, schema versions, ports). +2. Replace Trustfile.hs placeholders with your actual key paths and verification commands. +3. Adjust Dustfile handlers to match your rollback and recovery tooling. +4. Update Intentfile to mirror the roadmap you want the system to evolve toward. + +== Contents + +* `must/Mustfile` - required invariants and validations. +* `trust/Trustfile.hs` - cryptographic verification steps. +* `dust/Dustfile` - rollback and recovery semantics. +* `lust/Intentfile` - future intent and roadmap direction. diff --git a/haskell/.machine_readable/contractiles/dust/Dustfile.a2ml b/haskell/.machine_readable/contractiles/dust/Dustfile.a2ml new file mode 100644 index 0000000..be38a8c --- /dev/null +++ b/haskell/.machine_readable/contractiles/dust/Dustfile.a2ml @@ -0,0 +1,44 @@ +# SPDX-License-Identifier: MPL-2.0 +# Dustfile — Cleanup and hygiene contract +# Author: Jonathan D.A. Jewell + +@abstract: +What should be cleaned up or removed from this repository. +These are housekeeping items, not blockers. +@end + +## Stale Files + +### no-stale-snapshots +- description: No dated status/completion files in root +- run: "! ls *-STATUS-*.md *-COMPLETION-*.md *-COMPLETE.md *-VERIFIED-*.md 2>/dev/null | head -1 | grep -q ." +- severity: info + +### no-ai-djot +- description: AI.djot is superseded by 0-AI-MANIFEST.a2ml +- run: test ! -f AI.djot +- severity: warning + +### no-next-steps +- description: NEXT_STEPS.md superseded by ROADMAP +- run: test ! -f NEXT_STEPS.md +- severity: info + +## Build Artifacts + +### no-tracked-artifacts +- description: No build artifacts tracked in git +- run: "! git ls-files lib/bs/ lib/ocaml/ target/release/ _build/ 2>/dev/null | head -1 | grep -q ." +- severity: warning + +## Format Duplicates + +### no-duplicate-contributing +- description: Only one CONTRIBUTING format (keep .md) +- run: "! (test -f CONTRIBUTING.md && test -f CONTRIBUTING.adoc)" +- severity: warning + +### no-duplicate-readme +- description: Only one README format +- run: "! (test -f README.md && test -f README.adoc && [ $(wc -l < README.md) -gt 5 ])" +- severity: warning diff --git a/haskell/.machine_readable/contractiles/k9/README.adoc b/haskell/.machine_readable/contractiles/k9/README.adoc new file mode 100644 index 0000000..005ce58 --- /dev/null +++ b/haskell/.machine_readable/contractiles/k9/README.adoc @@ -0,0 +1,177 @@ +// SPDX-License-Identifier: CC-BY-SA-4.0 += K9 Contractiles +:toc: left +:icons: font + +== What Are K9 Contractiles? + +K9 contractiles are self-validating components that combine configuration, validation, and deployment logic in a single file format. They implement the RSR principle of "self-describing artifacts" by embedding contracts and orchestration directly in the component. + +== The Three Security Levels + +K9 components declare their trust requirements using "The Leash" security model: + +[horizontal] +`'Kennel`:: Pure data, no execution (safest) +`'Yard`:: Nickel evaluation with contracts (medium trust) +`'Hunt`:: Full execution with Just recipes (requires signature) + +== Example Components + +This directory contains example K9 contractiles for common repository tasks: + +=== Kennel Level (Pure Data) + +**File:** `examples/project-metadata.k9.ncl` + +Pure configuration data with no execution. Safe to include in any repository. + +**Use cases:** +- Project metadata (name, version, description) +- Build configuration +- Tool settings +- Data schemas + +**Security:** No signature required, data-only. + +=== Yard Level (Validated Config) + +**File:** `examples/ci-config.k9.ncl` + +Configuration with Nickel contracts for runtime validation. Evaluated safely without I/O. + +**Use cases:** +- CI/CD configuration with validation +- Deployment parameters +- Database schemas with constraints +- API specifications + +**Security:** Signature recommended, Nickel evaluation only. + +=== Hunt Level (Full Execution) + +**File:** `examples/setup-repo.k9.ncl` + +Full execution with Just recipes. Can run shell commands and modify filesystem. + +**Use cases:** +- Repository setup scripts +- Deployment automation +- System configuration +- Package installation + +**Security:** **Signature required**, full system access. + +== Usage in Your Repository + +=== 1. Create K9 Components + +Choose the appropriate security level for your use case: + +[source,bash] +---- +# Kennel: Pure configuration +cp .machine_readable/contractiles/k9/examples/project-metadata.k9.ncl config/metadata.k9.ncl + +# Yard: Validated configuration +cp .machine_readable/contractiles/k9/examples/ci-config.k9.ncl .github/ci.k9.ncl + +# Hunt: Full automation +cp .machine_readable/contractiles/k9/examples/setup-repo.k9.ncl scripts/setup.k9.ncl +---- + +=== 2. Validate Components + +[source,bash] +---- +# Validate Nickel syntax and contracts +nickel typecheck config/metadata.k9.ncl + +# Verify Hunt-level signature (if signed) +./must verify scripts/setup.k9.ncl +---- + +=== 3. Execute Components + +[source,bash] +---- +# Kennel: Export as JSON +nickel export config/metadata.k9.ncl > metadata.json + +# Yard: Evaluate with validation +nickel eval .github/ci.k9.ncl + +# Hunt: Run with Just (dry-run first!) +./must --dry-run run scripts/setup.k9.ncl +./must run scripts/setup.k9.ncl +---- + +== Integration with RSR + +K9 contractiles integrate with other RSR standards: + +**STATE.a2ml**:: K9 components can generate or validate STATE.a2ml +**ECOSYSTEM.a2ml**:: K9 can automate cross-repo operations +**META.a2ml**:: K9 can enforce architectural decisions + +== Security Best Practices + +=== For Kennel/Yard Components + +✅ **Safe to use without signatures** + +✅ **Review Nickel code before use** + +✅ **Validate contracts match expectations** + +=== For Hunt Components + +⚠️ **ALWAYS verify signatures** + +⚠️ **Review Just recipes carefully** + +⚠️ **Run dry-run mode first** + +⚠️ **Never run as root unless required** + +⚠️ **Sandbox external components** + +**See:** https://github.com/hyperpolymath/k9-svc/blob/main/docs/SECURITY-BEST-PRACTICES.adoc + +== Template Files + +Use these as starting points for your own K9 components: + +- `template-kennel.k9.ncl` - Pure data template +- `template-yard.k9.ncl` - Validated config template +- `template-hunt.k9.ncl` - Full execution template + +== Dependencies + +To use K9 contractiles in your repository: + +[source,bash] +---- +# Install Nickel (configuration language) +curl -L https://github.com/tweag/nickel/releases/latest/download/nickel-linux-x86_64 -o nickel +chmod +x nickel && sudo mv nickel /usr/local/bin/ + +# Install Just (task runner, for Hunt level) +cargo install just + +# Clone K9-SVC (for must shim and tooling) +git clone https://github.com/hyperpolymath/k9-svc.git +---- + +== Learn More + +- **K9-SVC Specification:** https://github.com/hyperpolymath/k9-svc/blob/main/SPEC.adoc +- **K9 User Guide:** https://github.com/hyperpolymath/k9-svc/blob/main/GUIDE.adoc +- **Security Documentation:** https://github.com/hyperpolymath/k9-svc/blob/main/docs/SECURITY-FAQ.adoc +- **IANA Media Type:** `application/vnd.k9+nickel` + +== Contributing + +When adding K9 contractiles to your repository: + +1. Use appropriate security level (Kennel > Yard > Hunt) +2. Document what each component does +3. Include validation contracts in Yard/Hunt components +4. Sign Hunt-level components before committing +5. Add K9 validation to CI/CD pipeline + +**Questions?** Open an issue on https://github.com/hyperpolymath/k9-svc diff --git a/haskell/.machine_readable/contractiles/k9/examples/ci-config.k9.ncl b/haskell/.machine_readable/contractiles/k9/examples/ci-config.k9.ncl new file mode 100644 index 0000000..9fe314e --- /dev/null +++ b/haskell/.machine_readable/contractiles/k9/examples/ci-config.k9.ncl @@ -0,0 +1,126 @@ +K9! +# SPDX-License-Identifier: MPL-2.0 +# Example Yard-level K9 component: CI/CD configuration with validation +# Security Level: Yard (Nickel evaluation, contract validation) +# Signature recommended but not required + +{ + pedigree = { + schema_version = "1.0.0", + component_type = "ci-configuration", + security = { + leash = 'Yard, + trust_level = "validated-config", + allow_network = false, + allow_filesystem_write = false, + allow_subprocess = false, + }, + metadata = { + name = "ci-config", + version = "1.0.0", + description = "CI/CD configuration with runtime validation", + author = "Jonathan D.A. Jewell ", + }, + }, + + # CI/CD configuration with Nickel contracts + ci = { + # Platform must be a known CI provider + platform + | [| 'GitHubActions, 'GitLabCI, 'CircleCI, 'TravisCI |] + = 'GitHubActions, + + # Build matrix with validation + matrix = { + # Operating systems to test on + os + | Array String + | std.array.NonEmpty + = ["ubuntu-latest", "macos-latest"], + + # Language versions to test + versions + | Array String + | std.array.NonEmpty + = ["stable", "beta"], + }, + + # Workflow steps with validation + steps = [ + { + name = "Checkout", + action = "actions/checkout@v4", + # Version must be SHA-pinned for security + sha | String | std.string.NonEmpty = "b4ffde65f46336ab88eb53be808477a3936bae11", + }, + { + name = "Build", + run = "just build", + }, + { + name = "Test", + run = "just test", + }, + { + name = "Lint", + run = "just lint", + }, + ], + + # Deployment configuration + deploy = { + enabled | Bool = false, + + # Only deploy from main branch + branch + | String + | std.contract.from_predicate (fun b => b == "main" || b == "master") + = "main", + + # Deployment requires manual approval + requires_approval | Bool = true, + }, + + # Security scanning + security = { + enabled | Bool = true, + + scanners = [ + { + name = "CodeQL", + languages = ["rust", "javascript"], + }, + { + name = "OSSF Scorecard", + enabled = true, + }, + { + name = "TruffleHog", + scan_for = "secrets", + }, + ], + }, + + # Notification settings + notifications = { + on_success = "never", + on_failure = "always", + channels = ["email"], + }, + }, + + # Validation rules (enforced by Nickel) + validation = { + # At least one OS must be specified + check_os = std.array.length ci.matrix.os > 0, + + # At least one version must be tested + check_versions = std.array.length ci.matrix.versions > 0, + + # Must have at least build and test steps + check_steps = std.array.length ci.steps >= 2, + + # Security scanning must be enabled + check_security = ci.security.enabled == true, + }, +} diff --git a/haskell/.machine_readable/contractiles/k9/examples/project-metadata.k9.ncl b/haskell/.machine_readable/contractiles/k9/examples/project-metadata.k9.ncl new file mode 100644 index 0000000..de98d52 --- /dev/null +++ b/haskell/.machine_readable/contractiles/k9/examples/project-metadata.k9.ncl @@ -0,0 +1,57 @@ +K9! +# SPDX-License-Identifier: MPL-2.0 +# Example Kennel-level K9 component: Project metadata +# Security Level: Kennel (pure data, no execution) +# No signature required + +{ + pedigree = { + schema_version = "1.0.0", + component_type = "project-metadata", + security = { + leash = 'Kennel, + trust_level = "data-only", + allow_network = false, + allow_filesystem_write = false, + allow_subprocess = false, + }, + metadata = { + name = "project-metadata", + version = "1.0.0", + description = "Pure data configuration for project metadata", + author = "Jonathan D.A. Jewell ", + }, + }, + + # Project configuration + project = { + name = "my-project", + version = "0.1.0", + description = "A project following Rhodium Standard Repositories", + + repository = { + url = "https://github.com/hyperpolymath/my-project", + type = "git", + }, + + author = { + name = "Jonathan D.A. Jewell", + email = "j.d.a.jewell@open.ac.uk", + organization = "hyperpolymath", + }, + + license = "MPL-2.0", + + keywords = [ + "rhodium-standard", + "rsr", + "hyperpolymath", + ], + }, + + # Export as JSON for other tools + export = { + format = "json", + destination = "project-metadata.json", + }, +} diff --git a/haskell/.machine_readable/contractiles/k9/examples/setup-repo.k9.ncl b/haskell/.machine_readable/contractiles/k9/examples/setup-repo.k9.ncl new file mode 100644 index 0000000..c2c44e9 --- /dev/null +++ b/haskell/.machine_readable/contractiles/k9/examples/setup-repo.k9.ncl @@ -0,0 +1,167 @@ +K9! +# SPDX-License-Identifier: MPL-2.0 +# Example Hunt-level K9 component: Repository setup automation +# Security Level: Hunt (full execution with Just recipes) +# ⚠️ SIGNATURE REQUIRED - DO NOT RUN WITHOUT VERIFICATION + +{ + pedigree = { + schema_version = "1.0.0", + component_type = "repository-setup", + security = { + leash = 'Hunt, + trust_level = "full-system-access", + allow_network = true, + allow_filesystem_write = true, + allow_subprocess = true, + signature_required = true, + }, + metadata = { + name = "setup-repo", + version = "1.0.0", + description = "Automated repository setup with RSR standards", + author = "Jonathan D.A. Jewell ", + }, + warnings = [ + "This component has full system access", + "Only run from trusted sources with verified signatures", + "Review Just recipes before execution", + "Use dry-run mode first: ./must --dry-run run setup-repo.k9.ncl", + ], + }, + + # Configuration with contracts + config = { + repo_name + | String + | std.string.NonEmpty + = "my-new-repo", + + repo_type + | [| 'Library, 'Application, 'Tool, 'Specification |] + = 'Application, + + primary_language + | String + | std.string.NonEmpty + = "rust", + + # RSR compliance features to enable + features = { + checkpoint_files | Bool = true, # STATE.a2ml, ECOSYSTEM.a2ml, META.a2ml + security_workflows | Bool = true, # CodeQL, Scorecard, etc. + quality_checks | Bool = true, # Linting, formatting + mirroring | Bool = false, # GitLab/Bitbucket mirrors + }, + + # Git configuration + git = { + default_branch = "main", + initial_commit | Bool = true, + remote_url | String = "", + }, + }, + + # Just recipes for execution + # These run when: ./must run setup-repo.k9.ncl + recipes = { + # Main entry point + default = { + recipe = "setup", + description = "Set up RSR-compliant repository", + }, + + # Individual setup tasks + setup = { + dependencies = ["check-env", "create-structure", "init-git", "setup-workflows"], + commands = [ + "echo '✅ Repository setup complete!'", + "echo 'Run: git status to see changes'", + ], + }, + + "check-env" = { + description = "Verify required tools are installed", + commands = [ + "command -v git || (echo 'ERROR: git not found' && exit 1)", + "command -v just || (echo 'ERROR: just not found' && exit 1)", + "command -v nickel || (echo 'ERROR: nickel not found' && exit 1)", + "echo '✓ All required tools present'", + ], + }, + + "create-structure" = { + description = "Create RSR directory structure", + commands = [ + "mkdir -p src/ docs/ tests/ scripts/", + "mkdir -p .github/workflows/", + "mkdir -p .machine_readable/contractiles/k9/", + "echo '✓ Directory structure created'", + ], + }, + + "init-git" = { + description = "Initialize Git repository", + commands = [ + "git init -b %{config.git.default_branch}", + "git config user.name 'Jonathan D.A. Jewell'", + "git config user.email 'j.d.a.jewell@open.ac.uk'", + "echo '✓ Git initialized'", + ], + }, + + "setup-workflows" = { + description = "Add RSR-compliant workflows", + commands = [ + # This would copy workflow templates + # In a real implementation, would fetch from rsr-template-repo + "echo '✓ Workflows configured'", + ], + }, + + "create-checkpoint-files" = { + description = "Create STATE.a2ml, ECOSYSTEM.a2ml, META.a2ml", + commands = [ + "echo '(state (version \"1.0.0\") (project \"%{config.repo_name}\"))' > STATE.a2ml", + "echo '(ecosystem (version \"1.0.0\") (name \"%{config.repo_name}\"))' > ECOSYSTEM.a2ml", + "echo '(meta (version \"1.0.0\") (project \"%{config.repo_name}\"))' > META.a2ml", + "echo '✓ Checkpoint files created'", + ], + }, + + "add-license" = { + description = "Add MPL-2.0 license", + commands = [ + "curl -sL https://raw.githubusercontent.com/hyperpolymath/pmpl/main/LICENSE -o LICENSE", + "echo '✓ License added'", + ], + }, + + "add-readme" = { + description = "Create README.adoc from template", + commands = [ + "echo '= %{config.repo_name}' > README.adoc", + "echo '' >> README.adoc", + "echo 'Part of the Hyperpolymath ecosystem.' >> README.adoc", + "echo '✓ README created'", + ], + }, + + clean = { + description = "Remove generated files (careful!)", + commands = [ + "echo '⚠️ This will delete all generated files'", + "echo 'Press Ctrl+C to cancel, or wait 5 seconds...'", + "sleep 5", + "rm -f STATE.a2ml ECOSYSTEM.a2ml META.a2ml", + "echo '✓ Cleaned'", + ], + }, + }, + + # Validation (Yard-level checks before Hunt execution) + validation = { + check_repo_name = std.string.length config.repo_name > 0, + check_language = std.string.length config.primary_language > 0, + }, +} diff --git a/haskell/.machine_readable/contractiles/k9/template-hunt.k9.ncl b/haskell/.machine_readable/contractiles/k9/template-hunt.k9.ncl new file mode 100644 index 0000000..b3fcb47 --- /dev/null +++ b/haskell/.machine_readable/contractiles/k9/template-hunt.k9.ncl @@ -0,0 +1,136 @@ +K9! +# SPDX-License-Identifier: MPL-2.0 +# K9 Hunt-level template: Full execution with Just recipes +# Security Level: Hunt (full system access) +# ⚠️ SIGNATURE REQUIRED - Review carefully before use + +{ + pedigree = { + schema_version = "1.0.0", + component_type = "TODO: describe component type (e.g., 'deployment', 'setup-script')", + security = { + leash = 'Hunt, + trust_level = "full-system-access", + allow_network = true, + allow_filesystem_write = true, + allow_subprocess = true, + signature_required = true, + }, + metadata = { + name = "TODO: component-name", + version = "1.0.0", + description = "TODO: Detailed description of what this component does", + author = "Jonathan D.A. Jewell ", + }, + warnings = [ + "This component has full system access", + "Only run from trusted sources with verified signatures", + "Review all Just recipes before execution", + "Use dry-run mode first: ./must --dry-run run your-file.k9.ncl", + ], + side_effects = [ + "TODO: List what files/directories this creates or modifies", + "TODO: List what commands this executes", + "TODO: List what network access this requires", + ], + }, + + # Configuration with contracts (Yard-level validation) + config = { + # Add your configuration here with appropriate contracts + target_dir + | String + | std.string.NonEmpty + = "/tmp/k9-output", + + dry_run | Bool = false, + + # Add more config as needed + }, + + # Just recipes for execution + # These run when: ./must run your-file.k9.ncl + recipes = { + # Main entry point (runs by default) + default = { + recipe = "TODO: main-task", + description = "TODO: What the default recipe does", + }, + + # Define your recipes here + "main-task" = { + dependencies = ["check-prerequisites"], + commands = [ + "echo 'TODO: Add your commands here'", + # Example: Create directory + # "mkdir -p %{config.target_dir}", + # Example: Run a command + # "just build", + # Example: Conditional execution + # "@if [ \"%{config.dry_run}\" = \"true\" ]; then echo '[DRY-RUN] Would execute'; else actual-command; fi", + ], + }, + + "check-prerequisites" = { + description = "Verify required tools and permissions", + commands = [ + # Example: Check for required tools + # "command -v git || (echo 'ERROR: git not found' && exit 1)", + # Example: Check permissions + # "[ -w %{config.target_dir} ] || (echo 'ERROR: Cannot write to target directory' && exit 1)", + "echo '✓ Prerequisites checked'", + ], + }, + + # Add more recipes as needed + "build" = { + description = "Build the project", + commands = [ + "echo 'TODO: Add build commands'", + ], + }, + + "deploy" = { + description = "Deploy the application", + dependencies = ["build"], + commands = [ + "echo 'TODO: Add deployment commands'", + ], + }, + + "clean" = { + description = "Clean up generated files", + commands = [ + "echo '⚠️ This will delete files - waiting 3 seconds...'", + "sleep 3", + "echo 'TODO: Add cleanup commands'", + # "rm -rf %{config.target_dir}", + ], + }, + }, + + # Validation (Yard-level checks before Hunt execution) + validation = { + check_target_dir = std.string.length config.target_dir > 0, + # Add more validation as needed + }, +} + +# Usage: +# 1. Fill in TODO items above +# 2. Define configuration with contracts +# 3. Implement Just recipes with your commands +# 4. Test with dry-run: ./must --dry-run run your-file.k9.ncl +# 5. Review dry-run output carefully +# 6. Sign the component: ./must sign your-file.k9.ncl +# 7. Distribute with signature: your-file.k9.ncl.sig +# 8. Users verify and run: ./must verify && ./must run your-file.k9.ncl +# +# Security checklist: +# ✓ All TODO items filled in +# ✓ side_effects documented accurately +# ✓ Commands reviewed for safety +# ✓ No hardcoded secrets or credentials +# ✓ Proper error handling in recipes +# ✓ Tested in dry-run mode +# ✓ Component signed with trusted key diff --git a/haskell/.machine_readable/contractiles/k9/template-kennel.k9.ncl b/haskell/.machine_readable/contractiles/k9/template-kennel.k9.ncl new file mode 100644 index 0000000..4228b26 --- /dev/null +++ b/haskell/.machine_readable/contractiles/k9/template-kennel.k9.ncl @@ -0,0 +1,54 @@ +K9! +# SPDX-License-Identifier: MPL-2.0 +# K9 Kennel-level template: Pure data configuration +# Security Level: Kennel (data-only, no execution) +# No signature required - safe for any use + +{ + pedigree = { + schema_version = "1.0.0", + component_type = "TODO: describe component type (e.g., 'build-config', 'metadata')", + security = { + leash = 'Kennel, + trust_level = "data-only", + allow_network = false, + allow_filesystem_write = false, + allow_subprocess = false, + }, + metadata = { + name = "TODO: component-name", + version = "1.0.0", + description = "TODO: Brief description of what this component contains", + author = "Jonathan D.A. Jewell ", + }, + }, + + # Your configuration data here + config = { + # Example: Pure data values + setting_1 = "value", + setting_2 = 42, + setting_3 = true, + + nested = { + key = "value", + }, + + list = [ + "item1", + "item2", + ], + }, + + # Optional: Export format specification + export = { + format = "json", # or "yaml", "toml" + destination = "output.json", + }, +} + +# Usage: +# 1. Fill in TODO items above +# 2. Add your configuration data to config = { ... } +# 3. Validate: nickel typecheck your-file.k9.ncl +# 4. Export: nickel export your-file.k9.ncl > output.json diff --git a/haskell/.machine_readable/contractiles/k9/template-yard.k9.ncl b/haskell/.machine_readable/contractiles/k9/template-yard.k9.ncl new file mode 100644 index 0000000..a723f5a --- /dev/null +++ b/haskell/.machine_readable/contractiles/k9/template-yard.k9.ncl @@ -0,0 +1,84 @@ +K9! +# SPDX-License-Identifier: MPL-2.0 +# K9 Yard-level template: Configuration with validation +# Security Level: Yard (Nickel evaluation with contracts) +# Signature recommended but not required + +{ + pedigree = { + schema_version = "1.0.0", + component_type = "TODO: describe component type (e.g., 'validated-config', 'schema')", + security = { + leash = 'Yard, + trust_level = "validated-config", + allow_network = false, + allow_filesystem_write = false, + allow_subprocess = false, + }, + metadata = { + name = "TODO: component-name", + version = "1.0.0", + description = "TODO: Brief description with validation details", + author = "Jonathan D.A. Jewell ", + }, + }, + + # Configuration with Nickel contracts for validation + config = { + # Example: String that cannot be empty + name + | String + | std.string.NonEmpty + = "TODO: default value", + + # Example: Number with range constraint + port + | Number + | std.contract.from_predicate (fun p => p > 0 && p < 65536) + = 8080, + + # Example: Boolean flag + enabled | Bool = true, + + # Example: Enum (one of several values) + environment + | [| 'Development, 'Staging, 'Production |] + = 'Development, + + # Example: List with non-empty constraint + items + | Array String + | std.array.NonEmpty + = ["item1", "item2"], + + # Example: Nested object with contracts + database = { + host | String | std.string.NonEmpty = "localhost", + port | Number | std.contract.from_predicate (fun p => p > 0 && p < 65536) = 5432, + name | String | std.string.NonEmpty = "mydb", + }, + }, + + # Validation rules (additional cross-field checks) + validation = { + # Example: Check that at least one item exists + check_items = std.array.length config.items > 0, + + # Example: Check that production has secure settings + check_production = + if config.environment == 'Production then + config.enabled == true + else + true, + + # Add your custom validation rules here + }, +} + +# Usage: +# 1. Fill in TODO items above +# 2. Define your config with appropriate contracts +# 3. Add validation rules in validation = { ... } +# 4. Validate: nickel typecheck your-file.k9.ncl +# 5. Evaluate: nickel eval your-file.k9.ncl +# 6. If validation passes, use in your application diff --git a/haskell/.machine_readable/contractiles/lust/Intentfile.a2ml b/haskell/.machine_readable/contractiles/lust/Intentfile.a2ml new file mode 100644 index 0000000..f75d38e --- /dev/null +++ b/haskell/.machine_readable/contractiles/lust/Intentfile.a2ml @@ -0,0 +1,37 @@ +# SPDX-License-Identifier: MPL-2.0 +# Intentfile — Design intent and aspirations +# Author: Jonathan D.A. Jewell + +@abstract: +What this repository INTENDS to become. Aspirational goals and +design philosophy — not current state, but target state. +@end + +## Architecture Intent + +### formal-verification +- description: All critical code paths should have formal proofs +- target: Idris2 dependent types for ABI, Coq/Lean for algorithms +- status: aspiration + +### reproducible-builds +- description: Builds should be bit-for-bit reproducible +- target: Guix + Nix + Containerfile +- status: aspiration + +### zero-dangerous-patterns +- description: No believe_me, sorry, Admitted, unsafeCoerce in any code +- target: All proofs completed, no escape hatches +- status: in-progress + +## Quality Intent + +### comprehensive-testing +- description: 80%+ code coverage with meaningful tests +- target: Unit + integration + conformance + property-based +- status: aspiration + +### documentation-complete +- description: Every public API documented, every directory has README +- target: Full API reference + architecture guide +- status: in-progress diff --git a/haskell/.machine_readable/contractiles/must/Mustfile.a2ml b/haskell/.machine_readable/contractiles/must/Mustfile.a2ml new file mode 100644 index 0000000..215c510 --- /dev/null +++ b/haskell/.machine_readable/contractiles/must/Mustfile.a2ml @@ -0,0 +1,69 @@ +# SPDX-License-Identifier: MPL-2.0 +# Mustfile — Physical state contract +# Author: Jonathan D.A. Jewell + +@abstract: +What MUST be true about this repository's files and configuration. +These are hard requirements — CI fails if any check fails. +@end + +## File Presence + +### license-present +- description: LICENSE file must exist +- run: test -f LICENSE +- severity: critical + +### readme-present +- description: README.adoc or README.md must exist +- run: test -f README.adoc || test -f README.md +- severity: critical + +### security-policy +- description: SECURITY.md must exist +- run: test -f SECURITY.md +- severity: critical + +### ai-manifest +- description: 0-AI-MANIFEST.a2ml must exist +- run: test -f 0-AI-MANIFEST.a2ml +- severity: critical + +### contributing +- description: CONTRIBUTING.md must exist (GitHub community health) +- run: test -f CONTRIBUTING.md +- severity: warning + +### editorconfig +- description: .editorconfig must exist +- run: test -f .editorconfig +- severity: warning + +## SPDX Compliance + +### spdx-headers +- description: All source files must have SPDX-License-Identifier +- run: "! find src/ -name '*.rs' -o -name '*.res' -o -name '*.idr' -o -name '*.zig' 2>/dev/null | head -20 | xargs grep -L 'SPDX-License-Identifier' 2>/dev/null | head -1 | grep -q ." +- severity: warning + +### no-agpl +- description: No AGPL-3.0 references in dotfiles +- run: "! grep -r 'AGPL-3.0' .gitignore .gitattributes .editorconfig 2>/dev/null | head -1 | grep -q ." +- severity: critical + +## Dangerous Patterns + +### no-believe-me +- description: No believe_me in Idris2 code +- run: "! grep -r 'believe_me' --include='*.idr' . 2>/dev/null | grep -v node_modules | head -1 | grep -q ." +- severity: critical + +### no-sorry +- description: No sorry in Lean code +- run: "! grep -r 'sorry' --include='*.lean' . 2>/dev/null | grep -v node_modules | head -1 | grep -q ." +- severity: critical + +### no-admitted +- description: No Admitted in Coq code +- run: "! grep -r 'Admitted' --include='*.v' . 2>/dev/null | grep -v node_modules | head -1 | grep -q ." +- severity: critical diff --git a/haskell/.machine_readable/contractiles/trust/Trustfile.a2ml b/haskell/.machine_readable/contractiles/trust/Trustfile.a2ml new file mode 100644 index 0000000..f2a4f95 --- /dev/null +++ b/haskell/.machine_readable/contractiles/trust/Trustfile.a2ml @@ -0,0 +1,50 @@ +# SPDX-License-Identifier: MPL-2.0 +# Trustfile — Integrity and provenance verification +# Author: Jonathan D.A. Jewell + +@abstract: +Integrity invariants for this repository. These verify that the repo +has not been tampered with, secrets are not leaked, and provenance +is traceable. +@end + +## Secrets + +### no-secrets-committed +- description: No credential files in repo +- run: test ! -f .env && test ! -f credentials.json && test ! -f .env.local && test ! -f .env.production +- severity: critical + +### no-private-keys +- description: No private key files committed +- run: "! find . -name '*.pem' -o -name '*.key' -o -name 'id_rsa' -o -name 'id_ed25519' 2>/dev/null | grep -v node_modules | head -1 | grep -q ." +- severity: critical + +### no-tokens-in-source +- description: No hardcoded API tokens in source +- run: "! grep -rE '(api[_-]?key|secret|token|password)\s*[:=]\s*[\"'\\''][A-Za-z0-9]{16,}' --include='*.js' --include='*.ts' --include='*.res' --include='*.py' . 2>/dev/null | grep -v node_modules | head -1 | grep -q ." +- severity: critical + +## Provenance + +### author-correct +- description: Git author matches expected identity +- run: "git log -1 --format='%ae' | grep -qE '(hyperpolymath|j\\.d\\.a\\.jewell)'" +- severity: warning + +### license-content +- description: LICENSE contains expected identifier +- run: grep -q 'PMPL\|MPL\|MIT\|Apache\|LGPL' LICENSE +- severity: warning + +## Container Security + +### container-images-pinned +- description: Containerfile uses pinned base images +- run: test ! -f Containerfile || grep -q 'cgr.dev\|@sha256:' Containerfile +- severity: warning + +### no-dockerfile +- description: No Dockerfile (use Containerfile) +- run: test ! -f Dockerfile +- severity: warning diff --git a/haskell/.machine_readable/integrations/feedback-o-tron.a2ml b/haskell/.machine_readable/integrations/feedback-o-tron.a2ml new file mode 100644 index 0000000..5381604 --- /dev/null +++ b/haskell/.machine_readable/integrations/feedback-o-tron.a2ml @@ -0,0 +1,13 @@ +# SPDX-License-Identifier: MPL-2.0 +# Feedback-o-Tron Integration — Autonomous Bug Reporting + +[integration] +name = "feedback-o-tron" +type = "bug-reporter" +repository = "https://github.com/hyperpolymath/feedback-o-tron" + +[reporting-config] +platforms = ["github", "gitlab", "bugzilla"] +deduplication = true +audit-logging = true +auto-file-upstream = "on-external-dependency-failure" diff --git a/haskell/.machine_readable/integrations/proven.a2ml b/haskell/.machine_readable/integrations/proven.a2ml new file mode 100644 index 0000000..9af33ff --- /dev/null +++ b/haskell/.machine_readable/integrations/proven.a2ml @@ -0,0 +1,18 @@ +# SPDX-License-Identifier: MPL-2.0 +# Proven Integration — Formally Verified Safety Library + +[integration] +name = "proven" +type = "safety-library" +repository = "https://github.com/hyperpolymath/proven" +version = "1.2.0" + +[binding-policy] +approach = "thin-ffi-wrapper" +unsafe-patterns = "replace-with-proven-equivalent" +modules-available = ["SafeMath", "SafeString", "SafeJSON", "SafeURL", "SafeRegex", "SafeSQL", "SafeFile", "SafeTemplate", "SafeCrypto"] + +[adoption-guidance] +priority = "high" +scope = "all-string-json-url-crypto-operations" +migration = "incremental — replace unsafe patterns as encountered" diff --git a/haskell/.machine_readable/integrations/verisimdb.a2ml b/haskell/.machine_readable/integrations/verisimdb.a2ml new file mode 100644 index 0000000..164c522 --- /dev/null +++ b/haskell/.machine_readable/integrations/verisimdb.a2ml @@ -0,0 +1,15 @@ +# SPDX-License-Identifier: MPL-2.0 +# VeriSimDB Feed — Cross-Repo Analytics Data Store + +[integration] +name = "verisimdb" +type = "data-feed" +repository = "https://github.com/hyperpolymath/nextgen-databases" +data-store = "verisimdb-data" + +[feed-config] +emit-scan-results = true +emit-build-metrics = true +emit-dependency-graph = true +format = "hexad" +destination = "verisimdb-data/feeds/" diff --git a/haskell/.machine_readable/integrations/vexometer.a2ml b/haskell/.machine_readable/integrations/vexometer.a2ml new file mode 100644 index 0000000..238b3d2 --- /dev/null +++ b/haskell/.machine_readable/integrations/vexometer.a2ml @@ -0,0 +1,18 @@ +# SPDX-License-Identifier: MPL-2.0 +# Vexometer Integration — Irritation Surface Analysis + +[integration] +name = "vexometer" +type = "friction-measurement" +repository = "https://github.com/hyperpolymath/vexometer" + +[measurement-config] +dimensions = 10 +emit-isa-reports = true +lazy-eliminator = true +satellite-interventions = true + +[hooks] +cli-tools = "measure-on-error" +ui-panels = "measure-on-interaction" +build-failures = "measure-on-failure" diff --git a/haskell/.machine_readable/policies/.maintenance-perms-ignore b/haskell/.machine_readable/policies/.maintenance-perms-ignore new file mode 100644 index 0000000..2c8c409 --- /dev/null +++ b/haskell/.machine_readable/policies/.maintenance-perms-ignore @@ -0,0 +1,5 @@ +# Regex patterns for justified permission-policy exceptions. +# One pattern per line. +# Example: +# ^vendor/ +# ^third_party/ diff --git a/haskell/.machine_readable/policies/0.2-AI-MANIFEST.a2ml b/haskell/.machine_readable/policies/0.2-AI-MANIFEST.a2ml new file mode 100644 index 0000000..01a1914 --- /dev/null +++ b/haskell/.machine_readable/policies/0.2-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "policies-registry" +level: 2 +parent: "../0.1-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Sub-registry for policies metadata. diff --git a/haskell/.machine_readable/policies/MAINTENANCE-AXES.a2ml b/haskell/.machine_readable/policies/MAINTENANCE-AXES.a2ml new file mode 100644 index 0000000..64476f3 --- /dev/null +++ b/haskell/.machine_readable/policies/MAINTENANCE-AXES.a2ml @@ -0,0 +1,54 @@ +# SPDX-License-Identifier: MPL-2.0 +# Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) +# +# Canonical maintenance governance model + +[metadata] +version = "1.0.0" +last-updated = "2026-07-08" +scope = "repo" + +[discovery] +human-entrypoints = [ + "README.adoc", + "docs/maintenance/MAINTENANCE-CHECKLIST.md", + "docs/practice/SOFTWARE-DEVELOPMENT-APPROACH.adoc", +] +machine-entrypoints = [ + ".machine_readable/policies/MAINTENANCE-AXES.a2ml", + ".machine_readable/policies/MAINTENANCE-CHECKLIST.a2ml", + ".machine_readable/policies/SOFTWARE-DEVELOPMENT-APPROACH.a2ml", + ".machine_readable/META.a2ml", + ".machine_readable/ai/README.adoc", + ".machine_readable/bot_directives/README.scm", +] +bots = ["hypatia", "gitbot-fleet", "repo visitors"] + +[axes] +axis-1 = "must > intend > like" +axis-2 = "corrective > adaptive > perfective" +axis-3 = "systems > compliance > effects" +execution-order = "axis-1 > axis-2 > axis-3" + +[axis-1-scoping] +required = true +sources = "README, roadmap, status docs, maintenance checklist, CI/security docs" +markers = "TODO/FIXME/XXX/HACK/STUB/PARTIAL" +idris-unsound-markers = "believe_me/assert_total" +output = "scoped work assembly in must/intend/like buckets" + +[axis-2-maintenance] +corrective-first = true +adaptive-second = true +adaptive-focus = "scope changes, stale references, obsolete work culling" +perfective-third = true +perfective-source = "honest state from axis-1 after corrective/adaptive updates" + +[axis-3-audit] +systems-check = true +compliance-check = true +effects-check = true +compliance-focus = "seams/compromises/exception register and anti-drift" +compliance-tooling = "panic-attack" +effects-tooling = "ecological checking with sustainabot guidance" +effects-evidence = "benchmark evidence and maintainer dialogue/status review" diff --git a/haskell/.machine_readable/policies/MAINTENANCE-CHECKLIST.a2ml b/haskell/.machine_readable/policies/MAINTENANCE-CHECKLIST.a2ml new file mode 100644 index 0000000..eaee720 --- /dev/null +++ b/haskell/.machine_readable/policies/MAINTENANCE-CHECKLIST.a2ml @@ -0,0 +1,159 @@ +# SPDX-License-Identifier: MPL-2.0 +# Cross-repo maintenance baseline (machine-readable canonical) + +[metadata] +version = "1.1.0" +last-updated = "2026-02-24" +scope = "cross-repo" +source-human = "docs/maintenance/MAINTENANCE-CHECKLIST.adoc" +companion-human = "docs/practice/SOFTWARE-DEVELOPMENT-APPROACH.adoc" +companion-machine = ".machine_readable/policies/SOFTWARE-DEVELOPMENT-APPROACH.a2ml" + +[policy] +single-source = true +notes = "Use this file as canonical machine policy and keep markdown synchronized." + +[maintenance-axes] +scoping-first = true +execution-order = ["scoping", "axis-1", "axis-2", "axis-3"] +axis-1 = "must > intend > like" +axis-2 = "corrective > adaptive > perfective" +axis-3 = "systems > compliance > effects" + +[scoping] +inputs_required = [ + "README", + "roadmap", + "status-docs", + "maintenance-checklist", + "ci-and-security-docs", +] + +marker_scan_required = [ + "TODO", + "FIXME", + "XXX", + "HACK", + "STUB", + "PARTIAL", +] + +idris_unsound_scan_required = [ + "believe_me", + "assert_total", +] + +scope_assembly_buckets = ["must", "intend", "like"] + +[axis-2-maintenance-rules] +corrective-first = true +adaptive-second = true +adaptive_examples = [ + "scope-change reconciliation", + "stale-reference removal", + "obsolete-work culling", +] +perfective-third = true +perfective_source = "axis-1 honest state after corrective/adaptive updates" + +[axis-3-audit-rules] +systems-check = true +documentation-honesty-check = true +safety-security-accounted-check = true +effects-review-check = true +benchmark-evidence-required = true +maintainer-dialogue-review-required = true +compliance-seams-check = true +exception-register-required = true +exception-bounded-scope-required = true +policy-drift-contamination-check = true +example-drift-risk = "single TypeScript exception causing broad ReScript->TypeScript migration" +compliance-tooling = "panic-attack" +effects-tooling = "ecological checking with sustainabot guidance" + +[generic-cleanup-finish-off] +root-cleanup-required = true +stale-work-cull-required = true +docs-parity-required = true +machine-human-sync-required = true +compliance-finish-off-required = true +effects-finish-off-required = true +release-prep-summary-required = true +next-actions-required = ["corrective", "adaptive", "perfective"] + +[must] +root_control_files = [ + ".gitignore", + ".gitattributes", + ".editorconfig", + ".tool-versions", + "Containerfile", + "Justfile", +] + +root_hosting_files = [ + "CNAME", + ".nojekyll", +] + +ownership_files = [ + "MAINTAINER", + ".github/CODEOWNERS", +] + +machine_readable_required = [ + ".machine_readable/anchors/ANCHOR.a2ml", + ".machine_readable/contractiles/", + ".machine_readable/ai/", + ".machine_readable/bot_directives/", +] + +contractiles_required = [ + "Mustfile", + "Trustfile", + "Intentfile", +] + +security_required = [ + ".well-known/security.txt", + "ci-security-scan", +] + +quality_gate_required = [ + "format", + "lint", + "unit-tests", + "integration-tests", + "p2p-tests", + "e2e-tests", + "bench-smoke", + "docs-check", + "security-scan", +] + +abi_ffi_policy = [ + "ABI Idris2 in src/interface/abi/*.idr", + "FFI Zig in ffi/**/*.zig", +] + +[should] +docs_primary_format = "adoc" +docs_structure = [ + "docs/theory", + "docs/practice", + "docs/whitepapers/academic", + "docs/whitepapers/industry", + "docs/proofs", + "docs/reports", +] + +root_minimization = true +well_known_metadata = true +roadmap_honesty_with_dates = true +ci_doc_format_policy = true + +[could] +generate_human_from_machine = true +mode_aware_bots = ["corrective", "adaptive", "perfective", "audit"] +topology_dashboard = true +exception_registry = true diff --git a/haskell/.machine_readable/policies/README.adoc b/haskell/.machine_readable/policies/README.adoc new file mode 100644 index 0000000..b7e25f5 --- /dev/null +++ b/haskell/.machine_readable/policies/README.adoc @@ -0,0 +1 @@ += policies Registry diff --git a/haskell/.machine_readable/policies/SOFTWARE-DEVELOPMENT-APPROACH.a2ml b/haskell/.machine_readable/policies/SOFTWARE-DEVELOPMENT-APPROACH.a2ml new file mode 100644 index 0000000..093573a --- /dev/null +++ b/haskell/.machine_readable/policies/SOFTWARE-DEVELOPMENT-APPROACH.a2ml @@ -0,0 +1,53 @@ +# SPDX-License-Identifier: MPL-2.0 +# General software development approach (machine-readable) + +[metadata] +version = "1.0.0" +last-updated = "2026-02-24" +scope = "cross-repo" +source-human = "docs/practice/SOFTWARE-DEVELOPMENT-APPROACH.adoc" + +[execution] +order = ["axis-1", "axis-2", "axis-3"] + +[axis-1] +name = "scope" +priority = "must > intend > like" +inputs = [ + "README", + "roadmap", + "status-docs", + "ci-and-security-docs", +] +marker-scan = ["TODO", "FIXME", "XXX", "HACK", "STUB", "PARTIAL"] +idris-unsound-scan = ["believe_me", "assert_total"] +output = "scoped-work-assembly" + +[axis-2] +name = "maintenance" +priority = "corrective > adaptive > perfective" +corrective = "defect/regression/safety/security fixes" +adaptive = "scope reconciliation, stale-reference removal, obsolete-work culling" +perfective = "quality improvements derived from axis-1 honest state" + +[axis-3] +name = "audit" +priority = "systems > compliance > effects" +systems = "required systems present and operating" +compliance = "exceptions explicit, bounded, and drift-resistant" +effects = "benchmark/operational impact evidence captured and reviewed" +compliance-tooling = "panic-attack" +effects-tooling = "ecological checking with sustainabot guidance" + +[cleanup-finish-off] +root-cleanup = true +stale-work-cull = true +docs-sync-human-machine = true +compliance-audit = true +effects-audit = true +release-summary = ["must", "should", "could"] +next-actions = ["corrective", "adaptive", "perfective"] + +[collaboration] +maintainer-dialogue-required = true +dialogue-topics = ["what changed", "why", "remaining risks"] diff --git a/haskell/.machine_readable/root-allow.txt b/haskell/.machine_readable/root-allow.txt new file mode 100644 index 0000000..d96a86b --- /dev/null +++ b/haskell/.machine_readable/root-allow.txt @@ -0,0 +1 @@ +.hypatia-ignore diff --git a/haskell/.machine_readable/scripts/0.2-AI-MANIFEST.a2ml b/haskell/.machine_readable/scripts/0.2-AI-MANIFEST.a2ml new file mode 100644 index 0000000..615df84 --- /dev/null +++ b/haskell/.machine_readable/scripts/0.2-AI-MANIFEST.a2ml @@ -0,0 +1,18 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "automation-scripts-unit" +level: 2 +parent: "../0.1-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Internal automation logic for the project lifecycle, forge sync, + verification triggers, and maintenance. + +canonical_locations: + maintenance: "maintenance/" + lifecycle: "lifecycle/" + forge: "forge/" + verification: "verification/" diff --git a/haskell/.machine_readable/scripts/forge/0.3-AI-MANIFEST.a2ml b/haskell/.machine_readable/scripts/forge/0.3-AI-MANIFEST.a2ml new file mode 100644 index 0000000..4bbd6cf --- /dev/null +++ b/haskell/.machine_readable/scripts/forge/0.3-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "automation-unit-forge" +level: 3 +parent: "../0.2-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Internal automation logic for project forge. diff --git a/haskell/.machine_readable/scripts/forge/README.adoc b/haskell/.machine_readable/scripts/forge/README.adoc new file mode 100644 index 0000000..31adef6 --- /dev/null +++ b/haskell/.machine_readable/scripts/forge/README.adoc @@ -0,0 +1 @@ += Forge Scripts diff --git a/haskell/.machine_readable/scripts/forge/forge-sync.sh b/haskell/.machine_readable/scripts/forge/forge-sync.sh new file mode 100755 index 0000000..330e54b --- /dev/null +++ b/haskell/.machine_readable/scripts/forge/forge-sync.sh @@ -0,0 +1,25 @@ +#!/usr/bin/env bash +# SPDX-License-Identifier: MPL-2.0 +# +# forge-sync.sh — Multi-forge mirroring script +# +# Synchronises the local repository with GitHub, GitLab, and Codeberg. +# Usage: ./forge-sync.sh + +set -euo pipefail + +REMOTES=("origin" "gitlab" "codeberg") + +echo "=== RSR Forge Synchronisation ===" + +for remote in "${REMOTES[@]}"; do + if git remote | grep -q "^$remote$"; then + echo "Pushing to $remote..." + git push "$remote" --all + git push "$remote" --tags + else + echo "Skip: Remote '$remote' not configured." + fi +done + +echo "Sync complete." diff --git a/haskell/.machine_readable/scripts/forge/git-cleanup.sh b/haskell/.machine_readable/scripts/forge/git-cleanup.sh new file mode 100755 index 0000000..4fec1a2 --- /dev/null +++ b/haskell/.machine_readable/scripts/forge/git-cleanup.sh @@ -0,0 +1,8 @@ +#!/usr/bin/env bash +# git-cleanup.sh — Repository hygiene script +set -euo pipefail +echo "Cleaning up merged branches..." +git fetch -p +git branch --merged | grep -v "\*" | grep -v "main" | xargs -n 1 git branch -d || echo "No branches to clean." +echo "Pruning remote tracking branches..." +git remote prune origin diff --git a/haskell/.machine_readable/scripts/lifecycle/0.3-AI-MANIFEST.a2ml b/haskell/.machine_readable/scripts/lifecycle/0.3-AI-MANIFEST.a2ml new file mode 100644 index 0000000..3182d17 --- /dev/null +++ b/haskell/.machine_readable/scripts/lifecycle/0.3-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "automation-unit-lifecycle" +level: 3 +parent: "../0.2-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Internal automation logic for project lifecycle. diff --git a/haskell/.machine_readable/scripts/lifecycle/README.adoc b/haskell/.machine_readable/scripts/lifecycle/README.adoc new file mode 100644 index 0000000..8d262b1 --- /dev/null +++ b/haskell/.machine_readable/scripts/lifecycle/README.adoc @@ -0,0 +1 @@ += Lifecycle Scripts diff --git a/haskell/.machine_readable/scripts/lifecycle/install-tools.sh b/haskell/.machine_readable/scripts/lifecycle/install-tools.sh new file mode 100755 index 0000000..408df64 --- /dev/null +++ b/haskell/.machine_readable/scripts/lifecycle/install-tools.sh @@ -0,0 +1,27 @@ +#!/usr/bin/env bash +# SPDX-License-Identifier: MPL-2.0 +# +# install-tools.sh — Developer toolchain installer +# +# Detects and installs the required project toolchain (asdf, nix, or guix). + +set -euo pipefail + +echo "=== RSR Toolchain Installer ===" + +if [ -f "flake.nix" ] && command -v nix &>/dev/null; then + echo "Nix detected. Setting up development shell..." + nix develop --command echo "Nix shell verified." +elif [ -f ".tool-versions" ] && command -v asdf &>/dev/null; then + echo "asdf detected. Installing plugins and tools..." + while read -r line; do + plugin=$(echo "$line" | awk '{print $1}') + asdf plugin add "$plugin" || true + done < .tool-versions + asdf install +else + echo "No standard toolchain (Nix/asdf) detected or installed." + echo "Please refer to README.adoc for manual setup instructions." +fi + +echo "Installer complete." diff --git a/haskell/.machine_readable/scripts/maintenance/maint-assault.sh b/haskell/.machine_readable/scripts/maintenance/maint-assault.sh new file mode 100644 index 0000000..f170cab --- /dev/null +++ b/haskell/.machine_readable/scripts/maintenance/maint-assault.sh @@ -0,0 +1,44 @@ +#!/usr/bin/env bash +# SPDX-License-Identifier: MPL-2.0 +# +# maint-assault.sh — High-rigor stress testing using panic-attacker +# +# This script runs a full assault (static + dynamic) on the project binary +# to detect logic-based bug signatures and environmental vulnerabilities. + +set -euo pipefail + +BINARY_NAME="{{project}}" +REPORT_PATH="docs/reports/security/assault-latest.json" +PA_BIN="${PANIC_ATTACK_BIN:-panic-attack}" + +echo "=== High-Rigor Security Assault ===" + +# 1. Verify environment +if ! command -v "$PA_BIN" &>/dev/null; then + echo "Error: panic-attack tool not found." + echo "Please install it or set PANIC_ATTACK_BIN environment variable." + exit 1 +fi + +if [ ! -f "target/release/$BINARY_NAME" ]; then + echo "Warning: Release binary not found at target/release/$BINARY_NAME" + echo "Running build first..." + just build --release +fi + +# 2. Run Assault +echo "Initiating full assault on $BINARY_NAME..." +mkdir -p "$(dirname "$REPORT_PATH")" + +"$PA_BIN" assault "target/release/$BINARY_NAME" + --source . + --intensity medium + --duration 10 + --output "$REPORT_PATH" + +echo "" +echo "=== Assault Complete ===" +echo "Report generated: $REPORT_PATH" +echo "To review interactively, run:" +echo " $PA_BIN tui $REPORT_PATH" diff --git a/haskell/.machine_readable/scripts/verification/0.3-AI-MANIFEST.a2ml b/haskell/.machine_readable/scripts/verification/0.3-AI-MANIFEST.a2ml new file mode 100644 index 0000000..460e069 --- /dev/null +++ b/haskell/.machine_readable/scripts/verification/0.3-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "automation-unit-verification" +level: 3 +parent: "../0.2-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Internal automation logic for project verification. diff --git a/haskell/.machine_readable/scripts/verification/README.adoc b/haskell/.machine_readable/scripts/verification/README.adoc new file mode 100644 index 0000000..277b4aa --- /dev/null +++ b/haskell/.machine_readable/scripts/verification/README.adoc @@ -0,0 +1 @@ += Verification Scripts diff --git a/haskell/.tool-versions b/haskell/.tool-versions new file mode 100644 index 0000000..f8af37b --- /dev/null +++ b/haskell/.tool-versions @@ -0,0 +1,9 @@ +# Uncomment and customize for your project +# rust nightly +# just 1.40.0 +# nickel 1.10.0 +# gleam 1.8.0 +# elixir 1.18.0 +# erlang 27.2 +# zig 0.14.0 +# idris2 0.7.0 diff --git a/haskell/.well-known/ai.txt b/haskell/.well-known/ai.txt new file mode 100644 index 0000000..94dd799 --- /dev/null +++ b/haskell/.well-known/ai.txt @@ -0,0 +1,18 @@ +# SPDX-License-Identifier: MPL-2.0 +# ai.txt - AI interaction policy +# See: https://site.spawning.ai/spawning-ai-txt + +User-Agent: * +Disallow-Training: yes +Disallow-Summarization: no +Disallow-Generation: yes + +# This project's code is licensed under MPL-2.0. +# AI agents may read and analyze this code for assisting contributors. +# AI agents must NOT use this code for model training without explicit consent. +# AI agents must preserve Emotional Lineage. +# +# For AI agent integration instructions, see: +# 0-AI-MANIFEST.a2ml (universal AI entry point) +# AI.a2ml (Claude-specific instructions) +# .machine_readable/ (structured project state) diff --git a/haskell/.well-known/humans.txt b/haskell/.well-known/humans.txt new file mode 100644 index 0000000..d27e48c --- /dev/null +++ b/haskell/.well-known/humans.txt @@ -0,0 +1,14 @@ +# SPDX-License-Identifier: MPL-2.0 +# humanstxt.org + +/* TEAM */ +Maintainer: Jonathan D.A. Jewell (hyperpolymath) +Contact: j.d.a.jewell@open.ac.uk +From: United Kingdom + +/* SITE */ +Last update: 2026-07-08 +Standards: RSR (Rhodium Standard Repository) +License: MPL-2.0 +Components: Idris2 ABI, Zig FFI +Tools: just, Podman, Guix diff --git a/haskell/.well-known/security.txt b/haskell/.well-known/security.txt new file mode 100644 index 0000000..a775a58 --- /dev/null +++ b/haskell/.well-known/security.txt @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +# RFC 9116 - security.txt +# https://securitytxt.org/ + +Contact: mailto:security@example.com +Expires: 2026-12-31T23:59:59.000Z +Encryption: https://keys.openpgp.org/vks/v1/by-fingerprint/0000000000000000000000000000000000000000 +Preferred-Languages: en +Canonical: https://github.com/hyperpolymath/a2ml-haskell/.well-known/security.txt +Policy: https://github.com/hyperpolymath/a2ml-haskell/blob/main/SECURITY.md +Hiring: https://https://github.com/hyperpolymath/careers diff --git a/haskell/0-AI-MANIFEST.a2ml b/haskell/0-AI-MANIFEST.a2ml new file mode 100644 index 0000000..c0d4864 --- /dev/null +++ b/haskell/0-AI-MANIFEST.a2ml @@ -0,0 +1,121 @@ +# ⚠️ STOP - CRITICAL READING REQUIRED + +**THIS FILE MUST BE READ FIRST BY ALL AI AGENTS** + +## WHAT IS THIS? + +This is the AI manifest for **[YOUR-REPO-NAME]**. It declares: +- Canonical file locations (where things MUST be, and nowhere else) +- Critical invariants (rules that must NEVER be violated) +- Repository structure and organization + +## CANONICAL LOCATIONS (UNIVERSAL RULE) + +### Machine-Readable Metadata: `.machine_readable/` ONLY + +These 6 a2ml files MUST exist in `.machine_readable/` directory ONLY: +1. **STATE.a2ml** - Project state, progress, blockers +2. **META.a2ml** - Architecture decisions, governance +3. **ECOSYSTEM.a2ml** - Position in ecosystem, relationships +4. **AGENTIC.a2ml** - AI agent interaction patterns +5. **NEUROSYM.a2ml** - Neurosymbolic integration config +6. **PLAYBOOK.a2ml** - Operational runbook + +**CRITICAL:** If ANY of these files exist in the root directory, this is an ERROR. + +### Anchor File: `.machine_readable/anchors/ANCHOR.a2ml` ONLY + +Canonical authority and semantic-boundary declaration MUST exist at: + +` .machine_readable/anchors/ANCHOR.a2ml ` + +Do not place `ANCHOR.a2ml` at repository root. + +### Maintenance Policies: `.machine_readable/policies/` ONLY + +Canonical maintenance/governance files MUST exist under: + +` .machine_readable/policies/ ` + +Minimum required files: +- `MAINTENANCE-AXES.a2ml` +- `MAINTENANCE-CHECKLIST.a2ml` +- `SOFTWARE-DEVELOPMENT-APPROACH.a2ml` + +Do not place maintenance policy files in repository root. + +### Bot Directives: `.machine_readable/bot_directives/` ONLY + +Bot-specific instructions for your automated agents. + +### Contractiles: `.machine_readable/contractiles/` ONLY + +Policy enforcement contracts (k9, dust, lust, must, trust). + +### AI Configuration & Guides: `.machine_readable/ai/` ONLY + +- `AI.a2ml` - Language-specific or LLM-specific patterns +- `PLACEHOLDERS.md` - Bootstrap guide + +### Community & Forge Metadata: `.github/` ONLY + +- `CODEOWNERS` - Review assignments +- `MAINTAINERS` - Machine-readable contact list +- `SUPPORT` - Support channels +- `SECURITY.md` - Technical security policy +- `CONTRIBUTING.md` - Technical contribution manual +- `CODE_OF_CONDUCT.md` - Conduct rules + +### Agent Instructions + +- `0-AI-MANIFEST.a2ml` - THIS FILE (universal entry point) + +## CORE INVARIANTS + +1. **No state file duplication** - Root must NOT contain STATE.a2ml, META.a2ml, etc. +2. **Single source of truth** - `.machine_readable/` is authoritative +3. **No stale metadata** - If root state files exist, they are OUT OF DATE +4. **License consistency** - All code MPL-2.0 unless platform requires MPL-2.0 +5. **Author attribution** - Always "Jonathan D.A. Jewell " +6. **Container images** - MUST use Chainguard base (`cgr.dev/chainguard/wolfi-base:latest` or `cgr.dev/chainguard/static:latest`) +7. **Container runtime** - Podman, never Docker. Files are `Containerfile`, never `Dockerfile` +8. **Container orchestration** - `selur-compose`, never `docker-compose` + +## REPOSITORY STRUCTURE + +This repo follows the **Dual-Track** architecture: + +``` +[YOUR-REPO-NAME]/ +├── 0-AI-MANIFEST.a2ml # THIS FILE (start here) +├── README.adoc # High-level orientation (Rich Human) +├── ROADMAP.adoc # Future direction +├── CONTRIBUTING.adoc # Human contribution guide +├── GOVERNANCE.adoc # Decision-making model +├── Justfile # Task runner +├── Containerfile # OCI build +├── LICENSE # Primary license +├── src/ # Source code +│ └── interface/ # Verified Interface Seams +│ ├── abi/ # Idris2 ABI (The Spec) +│ ├── ffi/ # Zig FFI (The Bridge) +│ └── generated/ # C Headers (The Result) +├── container/ # Stapeln container ecosystem +├── docs/ # Technical depths +│ ├── attribution/ # Citations, owners, maintainers (adoc) +│ ├── architecture/ # Topology, diagrams +│ ├── theory/ # Domain theory +│ └── practice/ # Manuals +├── docs/legal/ # Legal exhibits and full texts +└── .machine_readable/ # ALL machine-readable metadata +``` + +## SESSION STARTUP CHECKLIST + +✅ Read THIS file (0-AI-MANIFEST.a2ml) first +✅ Understand canonical location: `.machine_readable/` +✅ State understanding of canonical locations + +## ATTESTATION PROOF + +**"I have read the AI manifest. All machine-readable content (state files, anchors, policies, bot directives, contractiles, AI guides) is located in `.machine_readable/` ONLY, and community metadata is in `.github/`. I will not create duplicate files in the root directory."** diff --git a/haskell/ARCHITECTURE.md b/haskell/ARCHITECTURE.md new file mode 100644 index 0000000..607e3d8 --- /dev/null +++ b/haskell/ARCHITECTURE.md @@ -0,0 +1,47 @@ +# Architecture + +## Overview + +This repository follows a modular, maintainable architecture designed for clarity, scalability, and long-term sustainability. + +## Directory Structure + +``` +. +├── src/ # Source code +├── tests/ # Test suites +├── docs/ # Documentation +├── scripts/ # Utility scripts +├── config/ # Configuration files +├── LICENSE # License file +├── LICENSES/ # Full license texts +└── README.adoc # Project documentation +``` + +## Design Principles + +- **Separation of Concerns**: Each module has a single responsibility +- **Testability**: Code is written to be easily testable +- **Documentation**: All public APIs are documented +- **Configuration**: Environment-specific settings are externalized + +## Dependencies + +- External dependencies are minimized and clearly declared +- Version pinning is used for reproducibility + +## Security Considerations + +- Sensitive data is never committed to the repository +- Secrets are managed through environment variables or secure vaults +- Regular dependency audits are performed + +## Maintainability + +- Code follows consistent style guidelines +- Pull requests require review and CI checks +- Issues and discussions are tracked transparently + +--- + +*Last updated: 2026-07-18* diff --git a/haskell/CHANGELOG.md b/haskell/CHANGELOG.md new file mode 100644 index 0000000..7845f99 --- /dev/null +++ b/haskell/CHANGELOG.md @@ -0,0 +1,15 @@ +# 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). + +## [0.1.0.0] - 2026-03-16 + +### Added +- Initial release. +- `Data.A2ML.Types` — Core AST types (Document, Block, Inline, Directive, Attestation, TrustLevel, Manifest). +- `Data.A2ML.Parser` — Parse `.a2ml` files into the typed AST. +- `Data.A2ML.Renderer` — Render the AST back to A2ML surface syntax. +- `Data.A2ML` — Convenience re-export module. diff --git a/haskell/CODE_OF_CONDUCT.md b/haskell/CODE_OF_CONDUCT.md new file mode 100644 index 0000000..caeda1c --- /dev/null +++ b/haskell/CODE_OF_CONDUCT.md @@ -0,0 +1,27 @@ + +# Contributor Covenant Code of Conduct + +## Our Pledge + +We pledge to make participation a harassment-free experience for everyone. + +## Our Standards + +**Positive behavior:** +* Using welcoming language +* Being respectful of differing viewpoints +* Accepting constructive criticism +* Focusing on what is best for the community + +**Unacceptable behavior:** +* Harassment, trolling, or personal attacks +* Publishing private information without permission + +## Enforcement + +Report issues to the maintainers. All complaints will be reviewed. + +## Attribution + +Adapted from [Contributor Covenant](https://www.contributor-covenant.org/) v2.1. + diff --git a/haskell/CONTRIBUTING.md b/haskell/CONTRIBUTING.md new file mode 100644 index 0000000..80ecdac --- /dev/null +++ b/haskell/CONTRIBUTING.md @@ -0,0 +1,66 @@ + +# Contributing + +Thank you for your interest in contributing! We follow a "Dual-Track" architecture where human-readable documentation lives in the root and machine-readable policies live in `.machine_readable/`. + +## How to Contribute + +We welcome contributions in many forms: + +- **Code:** Improving the core stack or extensions +- **Documentation:** Enhancing docs or AI manifests +- **Testing:** Adding property-based tests or formal proofs +- **Bug reports:** Filing clear, reproducible issues + +## Getting Started + +1. **Read the AI Manifest:** Start with `0-AI-MANIFEST.a2ml` (if present) to understand the repository structure. +2. **Environment:** Use `nix develop` or `direnv allow` to set up your tools. +3. **Task Runner:** Use `just` to see available commands (`just --list`). + +## Development Workflow + +### Branch Naming + +``` +docs/short-description # Documentation +test/what-added # Test additions +feat/short-description # New features +fix/issue-number-description # Bug fixes +refactor/what-changed # Code improvements +security/what-fixed # Security fixes +``` + +### Commit Messages + +We follow [Conventional Commits](https://www.conventionalcommits.org/): + +``` +(): + +[optional body] + +[optional footer] +``` + +Types: `feat`, `fix`, `docs`, `test`, `refactor`, `ci`, `chore`, `security` + +## Reporting Bugs + +Before reporting: +1. Search existing issues +2. Check if it's already fixed in `main` + +When reporting, include: +- Clear, descriptive title +- Environment details (OS, versions, toolchain) +- Steps to reproduce +- Expected vs actual behaviour + +## Code of Conduct + +All contributors are expected to adhere to our [Code of Conduct](CODE_OF_CONDUCT.md). + +## License + +By contributing, you agree that your contributions will be licensed under the same license as the project (see [LICENSE](LICENSE)). diff --git a/haskell/Containerfile b/haskell/Containerfile new file mode 100644 index 0000000..fe8bacd --- /dev/null +++ b/haskell/Containerfile @@ -0,0 +1,41 @@ +# SPDX-License-Identifier: MPL-2.0 +# Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) +# +# Containerfile for a2ml-haskell +# Build: podman build -t {{project}}:latest -f Containerfile . +# Run: podman run --rm -it {{project}}:latest +# Seal: selur seal {{project}}:latest + +# --- Build stage --- +FROM cgr.dev/chainguard/wolfi-base:latest AS build + +# TODO: Install build dependencies for your stack +# Examples: +# RUN apk add --no-cache rust cargo # Rust +# RUN apk add --no-cache elixir erlang # Elixir +# RUN apk add --no-cache zig # Zig + +WORKDIR /build +COPY . . + +# TODO: Replace with your build command +# Examples: +# RUN cargo build --release +# RUN mix deps.get && MIX_ENV=prod mix release +# RUN zig build -Doptimize=ReleaseSafe + +# --- Runtime stage --- +FROM cgr.dev/chainguard/static:latest + +# Copy built artifact from build stage +# TODO: Replace with your binary/artifact path +# Examples: +# COPY --from=build /build/target/release/{{project}} /usr/local/bin/ +# COPY --from=build /build/_build/prod/rel/{{project}} /app/ +# COPY --from=build /build/zig-out/bin/{{project}} /usr/local/bin/ + +# Non-root user (chainguard images default to nonroot) +USER nonroot + +# TODO: Replace with your entrypoint +# ENTRYPOINT ["/usr/local/bin/{{project}}"] diff --git a/haskell/EXPLAINME.adoc b/haskell/EXPLAINME.adoc new file mode 100644 index 0000000..72a6609 --- /dev/null +++ b/haskell/EXPLAINME.adoc @@ -0,0 +1,202 @@ +// SPDX-License-Identifier: CC-BY-SA-4.0 += a2ml-haskell — Show Me The Receipts +Jonathan D.A. Jewell +:toc: +:icons: font + +The README makes claims. This file backs them up. + +== A2ML Parser and Renderer for Haskell + +[quote, a2ml-haskell.cabal] +____ +A Haskell library for parsing and rendering A2ML (Attested Markup Language) +documents. A2ML is an attestation-native markup format designed for documents +that carry trust metadata, cryptographic attestations, and provenance +information. +____ + +`Data.A2ML.Parser` (`src/Data/A2ML/Parser.hs`) implements a line-oriented, +purely functional parser over `Text`. The top-level function `parseA2ML :: +Text -> Either ParseError Document` returns a typed sum on failure rather than +crashing. Internally, `parseLines` → `parseBlocks` recurse over the line list, +pattern-matching on headings (`# ... #####`), directive blocks +(`@name: ... @end`), bullet items (`- ` or `* `), and plain paragraph lines. +Inline formatting (`**bold**`, `*italic*`) is handled by `parseInlines` and +its helper `parseInlinesItalic` using `Data.Text.breakOn` — no regex, no +mutable state. + +The Haskell variant models directives as multi-line blocks (`@name: ... @end`), +which is a richer surface syntax than the single-line `@name value` used in +`a2ml-rs`. Both parsers share the same output semantics for `Document` and +`Attestation`, but diverge on directives: `Data.A2ML.Types` uses a +`DirectiveName` sum type with known constructors (`DirAbstract`, `DirRefs`, +`DirAttestation`, `DirMeta`, `DirCustom Text`) rather than a free-form string pair. + +**Caveat:** The inline parser handles `**bold**` and `*italic*` via +left-to-right `breakOn`; nested or interleaved emphasis (e.g. +`*a **b** c*`) is not yet handled correctly. Link `[text](url)` and +`@ref(id)` patterns are declared in the module signature but the parser +implementation falls through to `PlainText` for those cases — the +infrastructure is present, the pattern matching is incomplete. The fuzz +corpus (`tests/fuzz/`) is a placeholder only. + +- Parser entry: `src/Data/A2ML/Parser.hs:49` (`parseA2ML :: Text -> Either ParseError Document`) +- Type definitions: `src/Data/A2ML/Types.hs` (Document, Block, Inline, DirectiveName, Attestation, TrustLevel, Manifest, Reference) +- Renderer: `src/Data/A2ML/Renderer.hs` +- Top-level re-export: `src/Data/A2ML.hs` +- Learn more: https://hackage.haskell.org/package/a2ml (forthcoming), https://github.com/hyperpolymath/a2ml + +== Cryptographic Attestation Model + +[quote, src/Data/A2ML/Types.hs] +____ +A cryptographic attestation attached to content. +attestationSigner :: Text +attestationAlgorithm :: Text +attestationSignature :: Text +attestationTimestamp :: Maybe Text +____ + +The Haskell `Attestation` type goes further than the Rust binding: it records +`attestationAlgorithm` (e.g. `"ed25519"`, `"sha256"`) and +`attestationSignature` (hex or base64). The `TrustLevel` enum runs from +`Unsigned` through `SelfAttested`, `ThirdPartyAttested`, to `MultiAttested`, +encoding the number and independence of attestors rather than the Rust +variant's subjective `Reviewed`/`Verified` distinction. `Manifest` aggregates +title, author, version, SPDX license, overall `TrustLevel`, and the full +attestation list — making it the canonical entry point for programmatic +provenance inspection. + +**Caveat:** Signature _verification_ (actual crypto) is not implemented in +this library. `attestationSignature` is stored as an opaque `Text` field. +An external verifier (e.g. the `cookie-rebound` Zig FFI layer or a GnuPG +wrapper) must perform the actual ed25519 or SHA-256 check. The +`MultiAttested` level is declared but no quorum logic is implemented yet. + +- Attestation type: `src/Data/A2ML/Types.hs:96–117` +- Trust level enum: `src/Data/A2ML/Types.hs:108–117` (Unsigned → MultiAttested) +- Manifest type: `src/Data/A2ML/Types.hs:119–133` + +== Test Suite: Unit, End-to-End, and Property-Based Tests + +[quote, a2ml-haskell.cabal] +____ +test-suite a2ml-tests + other-modules: UnitSpec E2ESpec PropertySpec + build-depends: hspec, QuickCheck, hspec-quickcheck +____ + +The test suite has three modules. `UnitSpec` tests individual parser functions +in isolation (heading level detection, directive name parsing, bullet list +accumulation). `E2ESpec` tests the full `parseA2ML` → `renderA2ML` round-trip +on representative `.a2ml` documents. `PropertySpec` uses QuickCheck to assert +`parseA2ML (renderA2ML doc) == Right doc` for arbitrary `Document` values — +that the renderer and parser are mutual inverses. The `Spec.hs` entry point +aggregates all three via `hspec`. + +**Caveat:** QuickCheck generators for `Document` do not yet exercise the full +surface syntax — generated documents use only headings and paragraphs, not +directives or attestations. Property coverage will expand as the inline parser +matures. + +- Unit tests: `tests/UnitSpec.hs` +- End-to-end tests: `tests/E2ESpec.hs` +- Property tests: `tests/PropertySpec.hs` +- Test runner: `tests/Spec.hs` +- Benchmark: `bench/Main.hs` (Criterion for parse and render hot paths) +- Run: `cabal test` or `just test` + +== MPL-2.0 Fallback for Hackage + +[quote, a2ml-haskell.cabal] +____ +license: MPL-2.0 +-- (MPL-2.0 preferred; MPL-2.0 required for Hackage OSI-approved policy) +____ + +Hackage requires an OSI-approved license; MPL-2.0 is not yet on the +OSI list. The fallback policy (identical to `a2ml-rs`) applies: every `.hs` +source file carries the dual SPDX comment. The `LICENSE-MPL-2.0` file is +present alongside `LICENSE` (MPL-2.0). + +**Caveat:** Unlike crates.io, Hackage does not enforce the SPDX identifier at +upload time by machine. The comment in each source file is the enforceable +record of the dual-license intent. + +- License files: `LICENSE` (MPL-2.0), `LICENSE-MPL-2.0` +- Learn more: https://github.com/hyperpolymath/palimpsest-license + +== Zig FFI Layer (Scaffold Present, Implementation Pending) + +[quote, src/interface/ffi/README.adoc] +____ +Zig FFI scaffold for exposing Data.A2ML as a C-ABI library. +____ + +The `src/interface/ffi/` directory follows the standard Idris2-ABI / Zig-FFI +architecture required by all RSR projects with cross-language interfaces. The +`build.zig` and `main.zig` scaffold is present; the Idris2 ABI definitions in +`src/interface/abi/` are placeholders. This layer is intended to expose +`parseA2ML` as a C-callable function for embedding the Haskell parser in +non-Haskell hosts via GHC's Foreign Function Interface. + +**Caveat:** The Zig FFI is not yet wired to any real Haskell FFI export. No +`.hs` module currently declares `foreign export ccall` bindings. This is +scaffolding for a future integration milestone. + +- FFI scaffold: `src/interface/ffi/src/main.zig`, `src/interface/ffi/build.zig` +- ABI placeholder: `src/interface/abi/` (Idris2 definitions pending) +- Integration test scaffold: `src/interface/ffi/test/integration_test.zig` + +== Dogfooded Across The Account + +[cols="1,2"] +|=== +| Technology | Also Used In + +| **A2ML format** | https://github.com/hyperpolymath/a2ml-rs[a2ml-rs] (Rust binding), https://github.com/hyperpolymath/pandoc-a2ml[pandoc-a2ml] (Lua Pandoc reader), https://github.com/hyperpolymath/tree-sitter-a2ml[tree-sitter-a2ml] (grammar) + +| **Haskell / GHC + cabal** | https://github.com/hyperpolymath/nextgen-languages[nextgen-languages] (Scaffoldia CLI, AffineScript compiler), https://github.com/hyperpolymath/hypatia[hypatia] (rule modules) + +| **hspec + QuickCheck** | Other Haskell projects in the `nextgen-languages` monorepo + +| **SPDX MPL-2.0 fallback** | https://github.com/hyperpolymath/a2ml-rs[a2ml-rs] (crates.io policy) +|=== + +== File Map + +[cols="1,2"] +|=== +| Path | Proves + +| `src/Data/A2ML.hs` | Top-level re-export module — public API surface for library consumers + +| `src/Data/A2ML/Types.hs` | AST: `Document`, `Block`, `Inline`, `DirectiveName` (sum with known values), `Attestation` (with algorithm + signature fields), `TrustLevel` (Unsigned→MultiAttested), `Manifest`, `Reference` + +| `src/Data/A2ML/Parser.hs` | Line-oriented parser: `parseA2ML`, `parseA2MLFile`, `ParseError` sum type, `parseBlocks`, `parseInlines`, directive body collector (`collectDirectiveBody`), bullet item accumulator (`collectBulletItems`) + +| `src/Data/A2ML/Renderer.hs` | Canonical serialiser: `renderA2ML :: Document -> Text` — intended round-trip inverse of the parser + +| `tests/UnitSpec.hs` | Isolated unit tests for parser primitives + +| `tests/E2ESpec.hs` | End-to-end parse→render→re-parse round-trip tests + +| `tests/PropertySpec.hs` | QuickCheck property: `parse ∘ render = id` for generated documents + +| `tests/Spec.hs` | hspec aggregator entry point + +| `bench/Main.hs` | Criterion benchmarks for parse and render hot paths + +| `a2ml-haskell.cabal` | Package metadata: exposed modules, build deps (base, text, containers, bytestring), GHC warning flags, test suite and benchmark stanza definitions + +| `src/interface/abi/` | Idris2 ABI definitions (placeholder — formal proof artefacts pending) + +| `src/interface/ffi/src/main.zig` | Zig FFI scaffold for C-ABI exposure of the Haskell parser + +| `src/interface/ffi/test/integration_test.zig` | FFI integration test scaffold + +| `0-AI-MANIFEST.a2ml` | AI session gatekeeper — read first before modifying any file + +| `.machine_readable/` | A2ML state files: STATE.a2ml, ECOSYSTEM.a2ml, META.a2ml +|=== diff --git a/haskell/GOVERNANCE.md b/haskell/GOVERNANCE.md new file mode 100644 index 0000000..e27364c --- /dev/null +++ b/haskell/GOVERNANCE.md @@ -0,0 +1,60 @@ +# Governance + +## Overview + +This project is governed by the following principles and structures to ensure transparent, inclusive, and effective decision-making. + +## Roles and Responsibilities + +### Maintainers + +Maintainers are responsible for: +- Reviewing and merging pull requests +- Managing releases and versioning +- Ensuring code quality and standards +- Triaging issues and bug reports +- Community engagement and support + +### Contributors + +Contributors are expected to: +- Follow the code of conduct +- Submit well-documented pull requests +- Write tests for new functionality +- Maintain existing tests +- Update documentation as needed + +## Decision Making + +### Minor Changes +- Can be made by any maintainer +- Include bug fixes, documentation updates, dependency updates + +### Major Changes +- Require discussion in issues or pull requests +- Include new features, architectural changes, API changes +- Need approval from at least 2 maintainers + +### Breaking Changes +- Require RFC (Request for Comments) process +- Need approval from majority of maintainers +- Must include migration guide + +## Code of Conduct + +All participants are expected to follow our Code of Conduct. Violations can be reported to the maintainers. + +## Communication + +- **Issues**: For bug reports and feature requests +- **Discussions**: For questions and general discussion +- **Pull Requests**: For code contributions + +## Licensing + +All contributions are made under the terms of the repository's LICENSE file. +By submitting a pull request, you agree to license your contributions accordingly. + +--- + +*Last updated: 2026-07-18* diff --git a/haskell/Justfile b/haskell/Justfile new file mode 100644 index 0000000..da385a0 --- /dev/null +++ b/haskell/Justfile @@ -0,0 +1,1028 @@ +# SPDX-License-Identifier: MPL-2.0 +# Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) +# +# RSR Standard Justfile Template +# https://just.systems/man/en/ +# +# Copy this file to new projects and customize the placeholder values. +# +# Run `just` to see all available recipes +# Run `just cookbook` to generate docs/just-cookbook.adoc +# Run `just combinations` to see matrix recipe options + +set shell := ["bash", "-uc"] +set dotenv-load := true +set positional-arguments := true + +# Import auto-generated contractile recipes (must-check, trust-verify, etc.) +# Re-generate with: contractile gen-just +import? "contractile.just" + +# Project metadata — customize these +project := "a2ml-haskell" +OWNER := "hyperpolymath" +REPO := "a2ml-haskell" +version := "0.1.0" +tier := "infrastructure" # 1 | 2 | infrastructure + +# ═══════════════════════════════════════════════════════════════════════════════ +# DEFAULT & HELP +# ═══════════════════════════════════════════════════════════════════════════════ + +# Show all available recipes with descriptions +default: + @just --list --unsorted + +# Show detailed help for a specific recipe +help recipe="": + #!/usr/bin/env bash + if [ -z "{{recipe}}" ]; then + just --list --unsorted + echo "" + echo "Usage: just help " + echo " just cookbook # Generate full documentation" + echo " just combinations # Show matrix recipes" + else + just --show "{{recipe}}" 2>/dev/null || echo "Recipe '{{recipe}}' not found" + fi + +# Show this project's info +info: + @echo "Project: {{project}}" + @echo "Version: {{version}}" + @echo "RSR Tier: {{tier}}" + @echo "Recipes: $(just --summary | wc -w)" + @[ -f ".machine_readable/STATE.a2ml" ] && grep -oP 'phase\s*=\s*"\K[^"]+' .machine_readable/STATE.a2ml | head -1 | xargs -I{} echo "Phase: {}" || true + +# ═══════════════════════════════════════════════════════════════════════════════ +# INIT — Bootstrap a new project from this template +# ═══════════════════════════════════════════════════════════════════════════════ + +# Interactive project bootstrap — replaces all REMOVED tokens +init: + #!/usr/bin/env bash + set -euo pipefail + + echo "═══════════════════════════════════════════════════" + echo " RSR Project Bootstrap" + echo "═══════════════════════════════════════════════════" + echo "" + + # --- Load defaults from config (if exists) --- + # Create yours: ~/.config/rsr/defaults + # Format: OWNER=myorg AUTHOR="My Name" AUTHOR_EMAIL=me@example.org ... + DEFAULTS="${XDG_CONFIG_HOME:-$HOME/.config}/rsr/defaults" + if [ -f "$DEFAULTS" ]; then + echo "Loading defaults from $DEFAULTS" + # shellcheck source=/dev/null + source "$DEFAULTS" + echo "" + fi + + # --- Required values (pre-filled from defaults if available) --- + read -rp "Project name (human-readable, e.g. My Project): " PROJECT_NAME + [ -z "$PROJECT_NAME" ] && echo "Error: project name required" && exit 1 + + read -rp "Repository slug (e.g. my-project): " REPO + [ -z "$REPO" ] && echo "Error: repo slug required" && exit 1 + + read -rp "Owner [${OWNER:-}]: " _OWNER + OWNER="${_OWNER:-${OWNER:-}}" + [ -z "$OWNER" ] && echo "Error: owner required" && exit 1 + + read -rp "Author full name [${AUTHOR:-}]: " _AUTHOR + AUTHOR="${_AUTHOR:-${AUTHOR:-}}" + [ -z "$AUTHOR" ] && echo "Error: author name required" && exit 1 + + read -rp "Author email [${AUTHOR_EMAIL:-}]: " _AUTHOR_EMAIL + AUTHOR_EMAIL="${_AUTHOR_EMAIL:-${AUTHOR_EMAIL:-}}" + [ -z "$AUTHOR_EMAIL" ] && echo "Error: email required" && exit 1 + + # --- Optional values (pre-filled from defaults if available) --- + read -rp "Author organization [${AUTHOR_ORG:-none}]: " _AUTHOR_ORG + AUTHOR_ORG="${_AUTHOR_ORG:-${AUTHOR_ORG:-}}" + + read -rp "Previous/alt email [${AUTHOR_EMAIL_ALT:-none}]: " _AUTHOR_EMAIL_ALT + AUTHOR_EMAIL_ALT="${_AUTHOR_EMAIL_ALT:-${AUTHOR_EMAIL_ALT:-}}" + + read -rp "Project description []: " PROJECT_DESCRIPTION + + read -rp "Forge domain [${FORGE:-github.com}]: " _FORGE + FORGE="${_FORGE:-${FORGE:-github.com}}" + + read -rp "Security contact email [${SECURITY_EMAIL:-$AUTHOR_EMAIL}]: " _SECURITY_EMAIL + SECURITY_EMAIL="${_SECURITY_EMAIL:-${SECURITY_EMAIL:-$AUTHOR_EMAIL}}" + + read -rp "Conduct contact email [${CONDUCT_EMAIL:-$AUTHOR_EMAIL}]: " _CONDUCT_EMAIL + CONDUCT_EMAIL="${_CONDUCT_EMAIL:-${CONDUCT_EMAIL:-$AUTHOR_EMAIL}}" + + read -rp "Project type (library|binary|monorepo|service|website) [library]: " PROJECT_TYPE + PROJECT_TYPE="${PROJECT_TYPE:-library}" + + read -rp "Website URL [https://${FORGE}/${OWNER}/${REPO}]: " WEBSITE + WEBSITE="${WEBSITE:-https://${FORGE}/${OWNER}/${REPO}}" + + # --- Container values (optional — only relevant if container/ exists) --- + if [ -d "container" ]; then + echo "" + echo "── Container configuration (optional) ─────────" + read -rp "Service name [${REPO}]: " _SERVICE_NAME + SERVICE_NAME="${_SERVICE_NAME:-${REPO}}" + read -rp "Primary port [8080]: " _PORT + PORT="${_PORT:-8080}" + read -rp "Container registry [ghcr.io/${OWNER}]: " _REGISTRY + REGISTRY="${_REGISTRY:-ghcr.io/${OWNER}}" + else + SERVICE_NAME="${REPO}" + PORT="8080" + REGISTRY="ghcr.io/${OWNER}" + fi + + # --- Derived values --- + PROJECT_UPPER=$(echo "$REPO" | tr '[:lower:]-' '[:upper:]_') + PROJECT_LOWER=$(echo "$REPO" | tr '[:upper:]-' '[:lower:]_') + CURRENT_YEAR=$(date +%Y) + CURRENT_DATE=$(date +%Y-%m-%d) + VERSION="0.1.0" + + # Derive citation name parts (best-effort split on last space) + AUTHOR_LAST="${AUTHOR##* }" + AUTHOR_FIRST="${AUTHOR% *}" + FIRST_INITIAL="${AUTHOR_FIRST:0:1}." + if [ "$AUTHOR_LAST" = "$AUTHOR_FIRST" ]; then + AUTHOR_FIRST="$AUTHOR" + AUTHOR_LAST="" + FIRST_INITIAL="" + fi + + echo "" + echo "── Summary ──────────────────────────────────────" + echo " Project: $PROJECT_NAME" + echo " Repo: $REPO" + echo " Owner: $OWNER" + echo " Author: $AUTHOR <$AUTHOR_EMAIL>" + [ -n "$AUTHOR_ORG" ] && echo " Organization: $AUTHOR_ORG" + echo " Forge: $FORGE" + echo " Year: $CURRENT_YEAR" + echo "────────────────────────────────────────────────" + echo "" + read -rp "Proceed? [Y/n] " CONFIRM + [[ "${CONFIRM:-Y}" =~ ^[Nn] ]] && echo "Aborted." && exit 0 + + echo "" + echo "Replacing placeholders..." + + # Brace tokens as variables (hex avoids just interpolation) + LB=$(printf '\x7b\x7b') + RB=$(printf '\x7d\x7d') + + # Build the sed expression list + # Note: using | as delimiter since URLs contain / + SED_ARGS=( + -e "s|${LB}PROJECT_NAME${RB}|${PROJECT_NAME}|g" + -e "s|${LB}PROJECT_DESCRIPTION${RB}|${PROJECT_DESCRIPTION}|g" + -e "s|${LB}PROJECT${RB}|${PROJECT_UPPER}|g" + -e "s|${LB}project${RB}|${PROJECT_LOWER}|g" + -e "s|${LB}REPO${RB}|${REPO}|g" + -e "s|${LB}OWNER${RB}|${OWNER}|g" + -e "s|${LB}AUTHOR${RB}|${AUTHOR}|g" + -e "s|${LB}AUTHOR_EMAIL${RB}|${AUTHOR_EMAIL}|g" + -e "s|${LB}AUTHOR_ORG${RB}|${AUTHOR_ORG}|g" + -e "s|${LB}AUTHOR_LAST${RB}|${AUTHOR_LAST}|g" + -e "s|${LB}AUTHOR_FIRST${RB}|${AUTHOR_FIRST}|g" + -e "s|${LB}AUTHOR_INITIALS${RB}|${FIRST_INITIAL}|g" + -e "s|${LB}FORGE${RB}|${FORGE}|g" + -e "s|${LB}CURRENT_YEAR${RB}|${CURRENT_YEAR}|g" + -e "s|${LB}CURRENT_DATE${RB}|${CURRENT_DATE}|g" + -e "s|${LB}DATE${RB}|${CURRENT_DATE}|g" + -e "s|${LB}SECURITY_EMAIL${RB}|${SECURITY_EMAIL}|g" + -e "s|${LB}CONDUCT_EMAIL${RB}|${CONDUCT_EMAIL}|g" + -e "s|${LB}LICENSE${RB}|MPL-2.0|g" + -e "s|${LB}CONDUCT_TEAM${RB}|Code of Conduct Committee|g" + -e "s|${LB}RESPONSE_TIME${RB}|48 hours|g" + -e "s|${LB}MAIN_BRANCH${RB}|main|g" + -e "s|${LB}PROJECT_PURPOSE${RB}|${PROJECT_DESCRIPTION}|g" + -e "s|${LB}PROJECT_ROLE${RB}|${PROJECT_TYPE}|g" + -e "s|${LB}PROJECT_TYPE${RB}|${PROJECT_TYPE}|g" + -e "s|${LB}WEBSITE${RB}|${WEBSITE}|g" + -e "s|${LB}SERVICE_NAME${RB}|${SERVICE_NAME}|g" + -e "s|${LB}PORT${RB}|${PORT}|g" + -e "s|${LB}REGISTRY${RB}|${REGISTRY}|g" + -e "s|${LB}IMAGE${RB}|${REGISTRY}/${SERVICE_NAME}|g" + -e "s|${LB}VERSION${RB}|${VERSION}|g" + -e "s|${LB}EMAIL${RB}|${AUTHOR_EMAIL}|g" + ) + [ -n "$AUTHOR_EMAIL_ALT" ] && SED_ARGS+=(-e "s|${LB}AUTHOR_EMAIL_ALT${RB}|${AUTHOR_EMAIL_ALT}|g") + + # Replace in all text files (skip .git, LICENSE text, and binaries) + find . -type f \ + -not -path './.git/*' \ + -not -name 'MPL-2.0.txt' \ + -not -name '*.png' -not -name '*.jpg' -not -name '*.gif' \ + -not -name '*.woff' -not -name '*.woff2' \ + | while read -r file; do + if file --brief "$file" | grep -qi 'text\|ascii\|utf'; then + sed -i "${SED_ARGS[@]}" "$file" + fi + done + + # Also replace [YOUR-REPO-NAME] and [YOUR-NAME/ORG] in AI manifest + sed -i "s|\[YOUR-REPO-NAME\]|${PROJECT_NAME}|g" 0-AI-MANIFEST.a2ml 2>/dev/null || true + sed -i "s|\[YOUR-NAME/ORG\]|${OWNER}|g" 0-AI-MANIFEST.a2ml 2>/dev/null || true + + echo "" + echo "── Validation ───────────────────────────────────" + + # Check for remaining placeholders + PATTERN="${LB}[A-Z_]*${RB}" + REMAINING=$(grep -rl "$PATTERN" . --include='*.md' --include='*.adoc' --include='*.yml' --include='*.yaml' --include='*.a2ml' --include='*.toml' --include='*.scm' --include='*.ncl' --include='*.nix' --include='*.json' --include='*.sh' 2>/dev/null | grep -v '.git/' | grep -v '.machine_readable/ai/PLACEHOLDERS.adoc' || true) + if [ -n "$REMAINING" ]; then + echo "WARNING: Remaining placeholders in:" + echo "$REMAINING" | sed 's/^/ /' + echo "" + echo "Run: grep -rn '$LB' . --include='*.md' to inspect" + else + echo "All placeholders replaced successfully!" + fi + + # K9-SVC validation (if available) + if command -v k9-svc >/dev/null 2>&1; then + echo "" + echo "Running k9-svc validation..." + k9-svc validate . 2>/dev/null || true + fi + + echo "" + echo "Done! Next steps:" + echo " 1. Review changes: git diff" + echo " 2. Remove template cruft: rm .machine_readable/ai/PLACEHOLDERS.adoc" + echo " 3. Customize README.adoc for your project" + echo " 4. Commit: git add -A && git commit -m 'feat: initialize from RSR template'" + echo " 5. Push: git remote add origin git@${FORGE}:${OWNER}/${REPO}.git && git push -u origin main" + +# ═══════════════════════════════════════════════════════════════════════════════ +# BUILD & COMPILE +# ═══════════════════════════════════════════════════════════════════════════════ + +# Build the project (debug mode) +build *args: + @echo "Building {{project}} (debug)..." + # TODO: Replace with your build command + # Examples: + # cargo build {{args}} # Rust + # mix compile {{args}} # Elixir + # zig build {{args}} # Zig + # deno task build {{args}} # Deno/ReScript + @echo "Build complete" + +# Build in release mode with optimizations +build-release *args: + @echo "Building {{project}} (release)..." + # TODO: Replace with your release build command + # Examples: + # cargo build --release {{args}} + # MIX_ENV=prod mix compile {{args}} + # zig build -Doptimize=ReleaseFast {{args}} + @echo "Release build complete" + +# Build and watch for changes (requires entr or similar) +build-watch: + @echo "Watching for changes..." + # TODO: Customize file patterns for your language + # Examples: + # find src -name '*.rs' | entr -c just build + # mix compile --force --warnings-as-errors + # deno task dev + +# Clean build artifacts [reversible: rebuild with `just build`] +clean: + @echo "Cleaning..." + # TODO: Customize for your build system + rm -rf target/ _build/ build/ dist/ out/ obj/ bin/ + +# Deep clean including caches [reversible: rebuild] +clean-all: clean + rm -rf .cache .tmp + +# ═══════════════════════════════════════════════════════════════════════════════ +# TEST & QUALITY +# ═══════════════════════════════════════════════════════════════════════════════ + +# Run all tests +test *args: + @echo "Running tests..." + # TODO: Replace with your test command + # Examples: + # cargo test {{args}} + # mix test {{args}} + # zig build test {{args}} + # deno test {{args}} + @echo "Tests passed!" + +# Run tests with verbose output +test-verbose: + @echo "Running tests (verbose)..." + # TODO: Replace with verbose test command + +# Smoke test +test-smoke: + @echo "Smoke test..." + # TODO: Add basic sanity checks + +# Run all quality checks +quality: fmt-check lint test + @echo "All quality checks passed!" + +# Fix all auto-fixable issues [reversible: git checkout] +fix: fmt + @echo "Fixed all auto-fixable issues" + +# ═══════════════════════════════════════════════════════════════════════════════ +# LINT & FORMAT +# ═══════════════════════════════════════════════════════════════════════════════ + +# Format all source files [reversible: git checkout] +fmt: + @echo "Formatting source files..." + # TODO: Replace with your formatter + # Examples: + # cargo fmt + # mix format + # gleam format + # deno fmt + +# Check formatting without changes +fmt-check: + @echo "Checking formatting..." + # TODO: Replace with your format check + # Examples: + # cargo fmt --check + # mix format --check-formatted + # gleam format --check + +# Run linter +lint: + @echo "Linting source files..." + # TODO: Replace with your linter + # Examples: + # cargo clippy -- -D warnings + # mix credo --strict + # gleam check + +# ═══════════════════════════════════════════════════════════════════════════════ +# RUN & EXECUTE +# ═══════════════════════════════════════════════════════════════════════════════ + +# Run the application +run *args: build + # TODO: Replace with your run command + echo "Run not configured yet" + +# Run with verbose output +run-verbose *args: build + # TODO: Replace with verbose run command + echo "Run not configured yet" + +# Install to user path +install: build-release + @echo "Installing {{project}}..." + # TODO: Replace with your install command + +# ═══════════════════════════════════════════════════════════════════════════════ +# DEPENDENCIES +# ═══════════════════════════════════════════════════════════════════════════════ + +# Install/check all dependencies +deps: + @echo "Checking dependencies..." + # TODO: Replace with your dependency check + # Examples: + # cargo check + # mix deps.get + # gleam deps download + @echo "All dependencies satisfied" + +# Audit dependencies for vulnerabilities +deps-audit: + @echo "Auditing for vulnerabilities..." + # TODO: Replace with your audit command + # Examples: + # cargo audit + # mix audit + @command -v trivy >/dev/null && trivy fs --severity HIGH,CRITICAL --quiet . || true + @command -v gitleaks >/dev/null && gitleaks detect --source . --no-git --quiet || true + @echo "Audit complete" + +# ═══════════════════════════════════════════════════════════════════════════════ +# DOCUMENTATION +# ═══════════════════════════════════════════════════════════════════════════════ + +# Generate all documentation +docs: + @mkdir -p docs/generated docs/man + just cookbook + just man + @echo "Documentation generated in docs/" + +# Generate justfile cookbook documentation +cookbook: + #!/usr/bin/env bash + mkdir -p docs + OUTPUT="docs/just-cookbook.adoc" + echo "= {{project}} Justfile Cookbook" > "$OUTPUT" + echo ":toc: left" >> "$OUTPUT" + echo ":toclevels: 3" >> "$OUTPUT" + echo "" >> "$OUTPUT" + echo "Generated: $(date -Iseconds)" >> "$OUTPUT" + echo "" >> "$OUTPUT" + echo "== Recipes" >> "$OUTPUT" + echo "" >> "$OUTPUT" + just --list --unsorted | while read -r line; do + if [[ "$line" =~ ^[[:space:]]+([a-z_-]+) ]]; then + recipe="${BASH_REMATCH[1]}" + echo "=== $recipe" >> "$OUTPUT" + echo "" >> "$OUTPUT" + echo "[source,bash]" >> "$OUTPUT" + echo "----" >> "$OUTPUT" + echo "just $recipe" >> "$OUTPUT" + echo "----" >> "$OUTPUT" + echo "" >> "$OUTPUT" + fi + done + echo "Generated: $OUTPUT" + +# Generate man page +man: + #!/usr/bin/env bash + mkdir -p docs/man + cat > docs/man/{{project}}.1 << EOF + .TH {{project}} 1 "$(date +%Y-%m-%d)" "{{version}}" "{{project}} Manual" + .SH NAME + {{project}} \- RSR-compliant project + .SH SYNOPSIS + .B just + [recipe] [args...] + .SH DESCRIPTION + RSR (Rhodium Standard Repository) project managed with just. + .SH AUTHOR + $(git config user.name 2>/dev/null || echo "Author") <$(git config user.email 2>/dev/null || echo "email")> + EOF + echo "Generated: docs/man/{{project}}.1" + +# ═══════════════════════════════════════════════════════════════════════════════ +# CONTAINERS (stapeln ecosystem — Podman + Chainguard Wolfi) +# ═══════════════════════════════════════════════════════════════════════════════ + +# Initialise container templates — substitute placeholders with project values +container-init: + #!/usr/bin/env bash + set -euo pipefail + + if [ ! -d "container" ]; then + echo "Error: container/ directory not found." + echo "This repo may not have been created from rsr-template-repo." + exit 1 + fi + + echo "=== Container Template Initialisation ===" + echo "" + + # Load RSR defaults if available + DEFAULTS="${XDG_CONFIG_HOME:-$HOME/.config}/rsr/defaults" + if [ -f "$DEFAULTS" ]; then + echo "Loading defaults from $DEFAULTS" + # shellcheck source=/dev/null + source "$DEFAULTS" + echo "" + fi + + # Prompt for container-specific values + read -rp "Service name (e.g. my-api) [{{project}}]: " _SERVICE_NAME + SERVICE_NAME="${_SERVICE_NAME:-{{project}}}" + + read -rp "Primary port [8080]: " _PORT + PORT="${_PORT:-8080}" + + read -rp "Container registry [ghcr.io/${OWNER:-hyperpolymath}]: " _REGISTRY + REGISTRY="${_REGISTRY:-ghcr.io/${OWNER:-hyperpolymath}}" + + echo "" + echo " Service: $SERVICE_NAME" + echo " Port: $PORT" + echo " Registry: $REGISTRY" + echo "" + read -rp "Proceed? [Y/n] " CONFIRM + [[ "${CONFIRM:-Y}" =~ ^[Nn] ]] && echo "Aborted." && exit 0 + + echo "" + echo "Replacing container placeholders..." + + # Brace tokens as variables (hex escapes avoid just interpolation) + LB=$(printf '\x7b\x7b') + RB=$(printf '\x7d\x7d') + + SED_ARGS=( + -e "s|${LB}SERVICE_NAME${RB}|${SERVICE_NAME}|g" + -e "s|${LB}PORT${RB}|${PORT}|g" + -e "s|${LB}REGISTRY${RB}|${REGISTRY}|g" + ) + + find container/ -type f | while read -r file; do + if file --brief "$file" | grep -qi 'text\|ascii\|utf'; then + sed -i "${SED_ARGS[@]}" "$file" + fi + done + + echo "Container templates initialised." + echo "" + echo "Next steps:" + echo " 1. Edit container/Containerfile — add your build commands" + echo " 2. Edit container/entrypoint.sh — set your application binary" + echo " 3. Review container/compose.toml — adjust services and volumes" + echo " 4. Build: just container-build" + +# Build container image via cerro-torre pipeline +container-build *args: + #!/usr/bin/env bash + if [ -f "container/ct-build.sh" ]; then + cd container && ./ct-build.sh {{args}} + elif [ -f "container/Containerfile" ]; then + podman build -t {{project}}:latest -f container/Containerfile . + elif [ -f "Containerfile" ]; then + podman build -t {{project}}:latest -f Containerfile . + else + echo "No Containerfile found in container/ or project root" + exit 1 + fi + +# Verify compose configuration +container-verify: + #!/usr/bin/env bash + if [ ! -f "container/compose.toml" ]; then + echo "No container/compose.toml found" + exit 1 + fi + cd container + if command -v selur-compose &>/dev/null; then + selur-compose verify + else + echo "selur-compose not found, falling back to podman compose" + podman compose --file compose.toml config + fi + +# Start container stack +container-up *args: + #!/usr/bin/env bash + if [ ! -f "container/compose.toml" ]; then + echo "No container/compose.toml found" + exit 1 + fi + cd container + if command -v selur-compose &>/dev/null; then + selur-compose up {{args}} + else + podman compose --file compose.toml up {{args}} + fi + +# Stop container stack +container-down: + #!/usr/bin/env bash + cd container 2>/dev/null || { echo "No container/ directory"; exit 1; } + if command -v selur-compose &>/dev/null; then + selur-compose down + else + podman compose --file compose.toml down + fi + +# Sign and verify container bundle (build + pack + sign + verify) +container-sign: + #!/usr/bin/env bash + if [ -f "container/ct-build.sh" ]; then + cd container && ./ct-build.sh + else + echo "No container/ct-build.sh found" + exit 1 + fi + +# Push signed bundle to registry +container-push: + #!/usr/bin/env bash + if [ -f "container/ct-build.sh" ]; then + cd container && ./ct-build.sh --push + else + echo "No container/ct-build.sh found — falling back to podman push" + podman push {{project}}:latest + fi + +# Run container interactively (for debugging) +container-run *args: + podman run --rm -it {{project}}:latest {{args}} + +# ═══════════════════════════════════════════════════════════════════════════════ +# CI & AUTOMATION +# ═══════════════════════════════════════════════════════════════════════════════ + +# Run full CI pipeline locally +ci: deps quality + @echo "CI pipeline complete!" + +# Install git hooks +install-hooks: + @mkdir -p .git/hooks + @cat > .git/hooks/pre-commit << 'HOOKEOF' + #!/bin/bash + just fmt-check || exit 1 + just lint || exit 1 + HOOKEOF + @chmod +x .git/hooks/pre-commit + @echo "Git hooks installed" + +# ═══════════════════════════════════════════════════════════════════════════════ +# SECURITY +# ═══════════════════════════════════════════════════════════════════════════════ + +# Run security audit +security: deps-audit + @echo "=== Security Audit ===" + @command -v gitleaks >/dev/null && gitleaks detect --source . --verbose || true + @command -v trivy >/dev/null && trivy fs --severity HIGH,CRITICAL . || true + @echo "Security audit complete" + +# Generate SBOM +sbom: + @mkdir -p docs/security + @command -v syft >/dev/null && syft . -o spdx-json > docs/security/sbom.spdx.json || echo "syft not found" + +# ═══════════════════════════════════════════════════════════════════════════════ +# VALIDATION & COMPLIANCE +# ═══════════════════════════════════════════════════════════════════════════════ + +# Validate RSR compliance +validate-rsr: + #!/usr/bin/env bash + echo "=== RSR Compliance Check ===" + MISSING="" + for f in .editorconfig .gitignore Justfile README.adoc LICENSE 0-AI-MANIFEST.a2ml; do + [ -f "$f" ] || MISSING="$MISSING $f" + done + for f in .machine_readable/STATE.a2ml .machine_readable/META.a2ml .machine_readable/ECOSYSTEM.a2ml .machine_readable/anchors/ANCHOR.a2ml .machine_readable/policies/MAINTENANCE-AXES.a2ml .machine_readable/policies/MAINTENANCE-CHECKLIST.a2ml .machine_readable/policies/SOFTWARE-DEVELOPMENT-APPROACH.a2ml; do + [ -f "$f" ] || MISSING="$MISSING $f" + done + for f in licensing/exhibits/EXHIBIT-A-ETHICAL-USE.txt licensing/exhibits/EXHIBIT-B-QUANTUM-SAFE.txt licensing/texts/MPL-2.0.txt; do + [ -f "$f" ] || MISSING="$MISSING $f" + done + for f in src/interface/abi src/interface/ffi src/interface/generated; do + [ -d "$f" ] || MISSING="$MISSING $f" + done + for f in docs/maintenance/MAINTENANCE-CHECKLIST.adoc docs/practice/SOFTWARE-DEVELOPMENT-APPROACH.adoc; do + [ -f "$f" ] || MISSING="$MISSING $f" + done + if [ -f ".machine_readable/META.a2ml" ]; then + grep -q 'axis-1 = "must > intend > like"' .machine_readable/META.a2ml || MISSING="$MISSING META.a2ml:axis-1" + grep -q 'axis-2 = "corrective > adaptive > perfective"' .machine_readable/META.a2ml || MISSING="$MISSING META.a2ml:axis-2" + grep -q 'axis-3 = "systems > compliance > effects"' .machine_readable/META.a2ml || MISSING="$MISSING META.a2ml:axis-3" + grep -q 'scoping-first = true' .machine_readable/META.a2ml || MISSING="$MISSING META.a2ml:scoping-first" + grep -q 'idris-unsound-scan = "believe_me/assert_total"' .machine_readable/META.a2ml || MISSING="$MISSING META.a2ml:idris-unsound-scan" + grep -q 'audit-focus = "systems in place, documentation explains actual state, safety/security accounted for, observed effects reviewed"' .machine_readable/META.a2ml || MISSING="$MISSING META.a2ml:audit-focus" + grep -q 'compliance-focus = "seams/compromises/exception register, bounded exceptions, anti-drift checks"' .machine_readable/META.a2ml || MISSING="$MISSING META.a2ml:compliance-focus" + grep -q 'effects-evidence = "benchmark execution/results and maintainer status dialogue/review"' .machine_readable/META.a2ml || MISSING="$MISSING META.a2ml:effects-evidence" + grep -q 'compliance-tooling = "panic-attack"' .machine_readable/policies/MAINTENANCE-AXES.a2ml || MISSING="$MISSING MAINTENANCE-AXES.a2ml:compliance-tooling" + grep -q 'effects-tooling = "ecological checking with sustainabot guidance"' .machine_readable/policies/MAINTENANCE-AXES.a2ml || MISSING="$MISSING MAINTENANCE-AXES.a2ml:effects-tooling" + grep -q 'source-human = "docs/maintenance/MAINTENANCE-CHECKLIST.adoc"' .machine_readable/policies/MAINTENANCE-CHECKLIST.a2ml || MISSING="$MISSING MAINTENANCE-CHECKLIST.a2ml:source-human" + grep -q 'source-human = "docs/practice/SOFTWARE-DEVELOPMENT-APPROACH.adoc"' .machine_readable/policies/SOFTWARE-DEVELOPMENT-APPROACH.a2ml || MISSING="$MISSING SOFTWARE-DEVELOPMENT-APPROACH.a2ml:source-human" + fi + if [ -n "$MISSING" ]; then + echo "MISSING:$MISSING" + exit 1 + fi + echo "RSR compliance: PASS" + +# Validate STATE.a2ml syntax +validate-state: + @if [ -f ".machine_readable/STATE.a2ml" ]; then \ + grep -q '^\[metadata\]' .machine_readable/STATE.a2ml && \ + grep -q 'project\s*=' .machine_readable/STATE.a2ml && \ + echo "STATE.a2ml: valid" || echo "STATE.a2ml: INVALID (missing required sections)"; \ + else \ + echo "No .machine_readable/STATE.a2ml found"; \ + fi + +# Validate AI installation guide completeness (finishbot pre-release check) +validate-ai-install: + #!/usr/bin/env bash + echo "=== AI Installation Guide Check ===" + GUIDE="docs/AI_INSTALLATION_GUIDE.adoc" + README="README.adoc" + ERRORS=0 + + # Check guide exists + if [ ! -f "$GUIDE" ]; then + echo "MISSING: $GUIDE (create from template: docs/AI_INSTALLATION_GUIDE.adoc)" + ERRORS=$((ERRORS + 1)) + else + # Check for unfilled TODO markers + TODOS=$(grep -c '\[TODO-AI-INSTALL' "$GUIDE" 2>/dev/null || true) + if [ "$TODOS" -gt 0 ]; then + echo "INCOMPLETE: $GUIDE has $TODOS unfilled [TODO-AI-INSTALL] markers:" + grep -n '\[TODO-AI-INSTALL' "$GUIDE" | head -10 + ERRORS=$((ERRORS + 1)) + else + echo "$GUIDE: complete (no TODO markers)" + fi + + # Check AI implementation section exists + if ! grep -q 'ai-implementation' "$GUIDE" 2>/dev/null; then + echo "MISSING: [[ai-implementation]] anchor in $GUIDE" + ERRORS=$((ERRORS + 1)) + fi + + # Check privacy notice exists + if ! grep -qi 'privacy' "$GUIDE" 2>/dev/null; then + echo "MISSING: Privacy notice in $GUIDE" + ERRORS=$((ERRORS + 1)) + fi + + # Check install commands exist (not just placeholders) + if ! grep -q 'git clone' "$GUIDE" 2>/dev/null; then + echo "WARNING: No git clone command found in $GUIDE -- install commands may be incomplete" + fi + fi + + # Check README has AI install section + if [ -f "$README" ]; then + if ! grep -qi 'AI-Assisted Installation' "$README" 2>/dev/null; then + echo "MISSING: AI-Assisted Installation section in $README" + echo " Copy from docs/AI-INSTALL-README-SECTION.adoc" + ERRORS=$((ERRORS + 1)) + fi + + # Check README for unfilled TODO markers + README_TODOS=$(grep -c '\[TODO-AI-INSTALL' "$README" 2>/dev/null || true) + if [ "$README_TODOS" -gt 0 ]; then + echo "INCOMPLETE: $README has $README_TODOS unfilled [TODO-AI-INSTALL] markers" + ERRORS=$((ERRORS + 1)) + fi + fi + + if [ "$ERRORS" -gt 0 ]; then + echo "" + echo "AI install guide: FAIL ($ERRORS issues)" + exit 1 + fi + echo "AI install guide: PASS" + +# Full validation suite +validate: validate-rsr validate-state validate-ai-install + @echo "All validations passed!" + +# ═══════════════════════════════════════════════════════════════════════════════ +# STATE MANAGEMENT +# ═══════════════════════════════════════════════════════════════════════════════ + +# Update STATE.a2ml timestamp +state-touch: + @if [ -f ".machine_readable/STATE.a2ml" ]; then \ + sed -i 's/last-updated = "[^"]*"/last-updated = "'"$(date +%Y-%m-%d)"'"/' .machine_readable/STATE.a2ml && \ + echo "STATE.a2ml timestamp updated"; \ + fi + +# Show current phase from STATE.a2ml +state-phase: + @grep -oP 'phase\s*=\s*"\K[^"]+' .machine_readable/STATE.a2ml 2>/dev/null | head -1 || echo "unknown" + +# ═══════════════════════════════════════════════════════════════════════════════ +# GUIX & NIX +# ═══════════════════════════════════════════════════════════════════════════════ + +# Enter Guix development shell (primary) +guix-shell: + guix shell -D -f guix.scm + +# Build with Guix +guix-build: + guix build -f guix.scm + +# Enter Nix development shell (fallback) +nix-shell: + @if [ -f "flake.nix" ]; then nix develop; else echo "No flake.nix"; fi + +# ═══════════════════════════════════════════════════════════════════════════════ +# HYBRID AUTOMATION +# ═══════════════════════════════════════════════════════════════════════════════ + +# Run local automation tasks +automate task="all": + #!/usr/bin/env bash + case "{{task}}" in + all) just fmt && just lint && just test && just docs && just state-touch ;; + cleanup) just clean && find . -name "*.orig" -delete && find . -name "*~" -delete ;; + update) just deps && just validate ;; + *) echo "Unknown: {{task}}. Use: all, cleanup, update" && exit 1 ;; + esac + +# ═══════════════════════════════════════════════════════════════════════════════ +# COMBINATORIC MATRIX RECIPES +# ═══════════════════════════════════════════════════════════════════════════════ + +# Build matrix: [debug|release] x [target] x [features] +build-matrix mode="debug" target="" features="": + @echo "Build matrix: mode={{mode}} target={{target}} features={{features}}" + +# Test matrix: [unit|integration|e2e|all] x [verbosity] x [parallel] +test-matrix suite="unit" verbosity="normal" parallel="true": + @echo "Test matrix: suite={{suite}} verbosity={{verbosity}} parallel={{parallel}}" + +# Container matrix: [build|run|push|shell|scan] x [registry] x [tag] +container-matrix action="build" registry="ghcr.io/hyperpolymath" tag="latest": + @echo "Container matrix: action={{action}} registry={{registry}} tag={{tag}}" + +# CI matrix: [lint|test|build|security|all] x [quick|full] +ci-matrix stage="all" depth="quick": + @echo "CI matrix: stage={{stage}} depth={{depth}}" + +# Show all matrix combinations +combinations: + @echo "=== Combinatoric Matrix Recipes ===" + @echo "" + @echo "Build Matrix: just build-matrix [debug|release] [target] [features]" + @echo "Test Matrix: just test-matrix [unit|integration|e2e|all] [verbosity] [parallel]" + @echo "Container: just container-matrix [build|run|push|shell|scan] [registry] [tag]" + @echo "CI Matrix: just ci-matrix [lint|test|build|security|all] [quick|full]" + +# ═══════════════════════════════════════════════════════════════════════════════ +# VERSION CONTROL +# ═══════════════════════════════════════════════════════════════════════════════ + +# Show git status +status: + @git status --short + +# Show recent commits +log count="20": + @git log --oneline -{{count}} + +# Generate CHANGELOG.md with git-cliff +changelog: + @command -v git-cliff >/dev/null || { echo "git-cliff not found — install: cargo install git-cliff"; exit 1; } + git cliff --config .machine_readable/configs/git-cliff/cliff.toml --output CHANGELOG.md + @echo "Generated CHANGELOG.md" + +# Preview changelog for unreleased commits (does not write) +changelog-preview: + @command -v git-cliff >/dev/null || { echo "git-cliff not found — install: cargo install git-cliff"; exit 1; } + git cliff --config .machine_readable/configs/git-cliff/cliff.toml --unreleased --strip header + +# Tag a new release (usage: just release-tag 1.2.3) +release-tag version: + #!/usr/bin/env bash + TAG="v{{version}}" + if git rev-parse "$TAG" >/dev/null 2>&1; then + echo "Tag $TAG already exists" + exit 1 + fi + just changelog + git add CHANGELOG.md + git commit -m "chore(release): prepare $TAG" + git tag -a "$TAG" -m "Release $TAG" + echo "Created tag $TAG — push with: git push origin main --tags" + +# ═══════════════════════════════════════════════════════════════════════════════ +# UTILITIES +# ═══════════════════════════════════════════════════════════════════════════════ + +# Count lines of code +loc: + @find . \( -name "*.rs" -o -name "*.ex" -o -name "*.exs" -o -name "*.res" -o -name "*.gleam" -o -name "*.zig" -o -name "*.idr" -o -name "*.hs" -o -name "*.ncl" -o -name "*.scm" -o -name "*.adb" -o -name "*.ads" \) -not -path './target/*' -not -path './_build/*' 2>/dev/null | xargs wc -l 2>/dev/null | tail -1 || echo "0" + +# Show TODO comments +todos: + @grep -rn "TODO\|FIXME\|HACK\|XXX" --include="*.rs" --include="*.ex" --include="*.res" --include="*.gleam" --include="*.zig" --include="*.idr" --include="*.hs" . 2>/dev/null || echo "No TODOs" + +# Open in editor +edit: + ${EDITOR:-code} . + +# Run high-rigor security assault using panic-attacker +maint-assault: + @./.machine_readable/scripts/maintenance/maint-assault.sh + +# Run panic-attacker pre-commit scan +assail: + @command -v panic-attack >/dev/null 2>&1 && panic-attack assail . || echo "panic-attack not found — install from https://github.com/hyperpolymath/panic-attacker" + +# ═══════════════════════════════════════════════════════════════════════════════ +# ONBOARDING & DIAGNOSTICS +# ═══════════════════════════════════════════════════════════════════════════════ + +# Check all required toolchain dependencies and report health +doctor: + #!/usr/bin/env bash + echo "═══════════════════════════════════════════════════" + echo " A2Ml Haskell Doctor — Toolchain Health Check" + echo "═══════════════════════════════════════════════════" + echo "" + PASS=0; FAIL=0; WARN=0 + check() { + local name="$1" cmd="$2" min="$3" + if command -v "$cmd" >/dev/null 2>&1; then + VER=$("$cmd" --version 2>&1 | head -1) + echo " [OK] $name — $VER" + PASS=$((PASS + 1)) + else + echo " [FAIL] $name — not found (need $min+)" + FAIL=$((FAIL + 1)) + fi + } + check "just" just "1.25" + check "git" git "2.40" +# Optional tools +if command -v panic-attack >/dev/null 2>&1; then + echo " [OK] panic-attack — available" + PASS=$((PASS + 1)) +else + echo " [WARN] panic-attack — not found (pre-commit scanner)" + WARN=$((WARN + 1)) +fi + echo "" + echo " Result: $PASS passed, $FAIL failed, $WARN warnings" + if [ "$FAIL" -gt 0 ]; then + echo " Run 'just heal' to attempt automatic repair." + exit 1 + fi + echo " All required tools present." + +# Attempt to automatically install missing tools +heal: + #!/usr/bin/env bash + echo "═══════════════════════════════════════════════════" + echo " A2Ml Haskell Heal — Automatic Tool Installation" + echo "═══════════════════════════════════════════════════" + echo "" +if ! command -v just >/dev/null 2>&1; then + echo "Installing just..." + cargo install just 2>/dev/null || echo "Install just from https://just.systems" +fi + echo "" + echo "Heal complete. Run 'just doctor' to verify." + +# Guided tour of the project structure and key concepts +tour: + #!/usr/bin/env bash + echo "═══════════════════════════════════════════════════" + echo " A2Ml Haskell — Guided Tour" + echo "═══════════════════════════════════════════════════" + echo "" + echo '**AI-Assisted Install:** Just tell any AI assistant: +' + echo "" + echo "Key directories:" + echo " src/ Source code" + echo " docs/ Documentation" + echo " tests/ Test suite" + echo " .github/workflows/ CI/CD workflows" + echo " .machine_readable/ Machine-readable metadata" + echo " container/ Container configuration" + echo " examples/ Usage examples" + echo "" + echo "Quick commands:" + echo " just doctor Check toolchain health" + echo " just heal Fix missing tools" + echo " just help-me Common workflows" + echo " just default List all recipes" + echo "" + echo "Read more: README.adoc, EXPLAINME.adoc" + +# Show help for common workflows +help-me: + #!/usr/bin/env bash + echo "═══════════════════════════════════════════════════" + echo " A2Ml Haskell — Common Workflows" + echo "═══════════════════════════════════════════════════" + echo "" +echo "FIRST TIME SETUP:" +echo " just doctor Check toolchain" +echo " just heal Fix missing tools" +echo "" +echo "PRE-COMMIT:" +echo " just assail Run panic-attacker scan" +echo "" +echo "LEARN:" +echo " just tour Guided project tour" +echo " just default List all recipes" + + +# Print the current CRG grade (reads from READINESS.md '**Current Grade:** X' line) +crg-grade: + @grade=$$(grep -oP '(?<=\*\*Current Grade:\*\* )[A-FX]' READINESS.md 2>/dev/null | head -1); \ + [ -z "$$grade" ] && grade="X"; \ + echo "$$grade" + +# Generate a shields.io badge markdown for the current CRG grade +# Looks for '**Current Grade:** X' in READINESS.md; falls back to X +crg-badge: + @grade=$$(grep -oP '(?<=\*\*Current Grade:\*\* )[A-FX]' READINESS.md 2>/dev/null | head -1); \ + [ -z "$$grade" ] && grade="X"; \ + case "$$grade" in \ + A) color="brightgreen" ;; B) color="green" ;; C) color="yellow" ;; \ + D) color="orange" ;; E) color="red" ;; F) color="critical" ;; \ + *) color="lightgrey" ;; esac; \ + echo "[![CRG $$grade](https://img.shields.io/badge/CRG-$$grade-$$color?style=flat-square)](https://github.com/hyperpolymath/standards/tree/main/component-readiness-grades)" diff --git a/haskell/LICENSE b/haskell/LICENSE new file mode 100644 index 0000000..14e2f77 --- /dev/null +++ b/haskell/LICENSE @@ -0,0 +1,373 @@ +Mozilla Public License Version 2.0 +================================== + +1. Definitions +-------------- + +1.1. "Contributor" + means each individual or legal entity that creates, contributes to + the creation of, or owns Covered Software. + +1.2. "Contributor Version" + means the combination of the Contributions of others (if any) used + by a Contributor and that particular Contributor's Contribution. + +1.3. "Contribution" + means Covered Software of a particular Contributor. + +1.4. "Covered Software" + means Source Code Form to which the initial Contributor has attached + the notice in Exhibit A, the Executable Form of such Source Code + Form, and Modifications of such Source Code Form, in each case + including portions thereof. + +1.5. "Incompatible With Secondary Licenses" + means + + (a) that the initial Contributor has attached the notice described + in Exhibit B to the Covered Software; or + + (b) that the Covered Software was made available under the terms of + version 1.1 or earlier of the License, but not also under the + terms of a Secondary License. + +1.6. "Executable Form" + means any form of the work other than Source Code Form. + +1.7. "Larger Work" + means a work that combines Covered Software with other material, in + a separate file or files, that is not Covered Software. + +1.8. "License" + means this document. + +1.9. "Licensable" + means having the right to grant, to the maximum extent possible, + whether at the time of the initial grant or subsequently, any and + all of the rights conveyed by this License. + +1.10. "Modifications" + means any of the following: + + (a) any file in Source Code Form that results from an addition to, + deletion from, or modification of the contents of Covered + Software; or + + (b) any new file in Source Code Form that contains any Covered + Software. + +1.11. "Patent Claims" of a Contributor + means any patent claim(s), including without limitation, method, + process, and apparatus claims, in any patent Licensable by such + Contributor that would be infringed, but for the grant of the + License, by the making, using, selling, offering for sale, having + made, import, or transfer of either its Contributions or its + Contributor Version. + +1.12. "Secondary License" + means either the GNU General Public License, Version 2.0, the GNU + Lesser General Public License, Version 2.1, the GNU Affero General + Public License, Version 3.0, or any later versions of those + licenses. + +1.13. "Source Code Form" + means the form of the work preferred for making modifications. + +1.14. "You" (or "Your") + means an individual or a legal entity exercising rights under this + License. For legal entities, "You" includes any entity that + controls, is controlled by, or is under common control with You. For + purposes of this definition, "control" means (a) the power, direct + or indirect, to cause the direction or management of such entity, + whether by contract or otherwise, or (b) ownership of more than + fifty percent (50%) of the outstanding shares or beneficial + ownership of such entity. + +2. License Grants and Conditions +-------------------------------- + +2.1. Grants + +Each Contributor hereby grants You a world-wide, royalty-free, +non-exclusive license: + +(a) under intellectual property rights (other than patent or trademark) + Licensable by such Contributor to use, reproduce, make available, + modify, display, perform, distribute, and otherwise exploit its + Contributions, either on an unmodified basis, with Modifications, or + as part of a Larger Work; and + +(b) under Patent Claims of such Contributor to make, use, sell, offer + for sale, have made, import, and otherwise transfer either its + Contributions or its Contributor Version. + +2.2. Effective Date + +The licenses granted in Section 2.1 with respect to any Contribution +become effective for each Contribution on the date the Contributor first +distributes such Contribution. + +2.3. Limitations on Grant Scope + +The licenses granted in this Section 2 are the only rights granted under +this License. No additional rights or licenses will be implied from the +distribution or licensing of Covered Software under this License. +Notwithstanding Section 2.1(b) above, no patent license is granted by a +Contributor: + +(a) for any code that a Contributor has removed from Covered Software; + or + +(b) for infringements caused by: (i) Your and any other third party's + modifications of Covered Software, or (ii) the combination of its + Contributions with other software (except as part of its Contributor + Version); or + +(c) under Patent Claims infringed by Covered Software in the absence of + its Contributions. + +This License does not grant any rights in the trademarks, service marks, +or logos of any Contributor (except as may be necessary to comply with +the notice requirements in Section 3.4). + +2.4. Subsequent Licenses + +No Contributor makes additional grants as a result of Your choice to +distribute the Covered Software under a subsequent version of this +License (see Section 10.2) or under the terms of a Secondary License (if +permitted under the terms of Section 3.3). + +2.5. Representation + +Each Contributor represents that the Contributor believes its +Contributions are its original creation(s) or it has sufficient rights +to grant the rights to its Contributions conveyed by this License. + +2.6. Fair Use + +This License is not intended to limit any rights You have under +applicable copyright doctrines of fair use, fair dealing, or other +equivalents. + +2.7. Conditions + +Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted +in Section 2.1. + +3. Responsibilities +------------------- + +3.1. Distribution of Source Form + +All distribution of Covered Software in Source Code Form, including any +Modifications that You create or to which You contribute, must be under +the terms of this License. You must inform recipients that the Source +Code Form of the Covered Software is governed by the terms of this +License, and how they can obtain a copy of this License. You may not +attempt to alter or restrict the recipients' rights in the Source Code +Form. + +3.2. Distribution of Executable Form + +If You distribute Covered Software in Executable Form then: + +(a) such Covered Software must also be made available in Source Code + Form, as described in Section 3.1, and You must inform recipients of + the Executable Form how they can obtain a copy of such Source Code + Form by reasonable means in a timely manner, at a charge no more + than the cost of distribution to the recipient; and + +(b) You may distribute such Executable Form under the terms of this + License, or sublicense it under different terms, provided that the + license for the Executable Form does not attempt to limit or alter + the recipients' rights in the Source Code Form under this License. + +3.3. Distribution of a Larger Work + +You may create and distribute a Larger Work under terms of Your choice, +provided that You also comply with the requirements of this License for +the Covered Software. If the Larger Work is a combination of Covered +Software with a work governed by one or more Secondary Licenses, and the +Covered Software is not Incompatible With Secondary Licenses, this +License permits You to additionally distribute such Covered Software +under the terms of such Secondary License(s), so that the recipient of +the Larger Work may, at their option, further distribute the Covered +Software under the terms of either this License or such Secondary +License(s). + +3.4. Notices + +You may not remove or alter the substance of any license notices +(including copyright notices, patent notices, disclaimers of warranty, +or limitations of liability) contained within the Source Code Form of +the Covered Software, except that You may alter any license notices to +the extent required to remedy known factual inaccuracies. + +3.5. Application of Additional Terms + +You may choose to offer, and to charge a fee for, warranty, support, +indemnity or liability obligations to one or more recipients of Covered +Software. However, You may do so only on Your own behalf, and not on +behalf of any Contributor. You must make it absolutely clear that any +such warranty, support, indemnity, or liability obligation is offered by +You alone, and You hereby agree to indemnify every Contributor for any +liability incurred by such Contributor as a result of warranty, support, +indemnity or liability terms You offer. You may include additional +disclaimers of warranty and limitations of liability specific to any +jurisdiction. + +4. Inability to Comply Due to Statute or Regulation +--------------------------------------------------- + +If it is impossible for You to comply with any of the terms of this +License with respect to some or all of the Covered Software due to +statute, judicial order, or regulation then You must: (a) comply with +the terms of this License to the maximum extent possible; and (b) +describe the limitations and the code they affect. Such description must +be placed in a text file included with all distributions of the Covered +Software under this License. Except to the extent prohibited by statute +or regulation, such description must be sufficiently detailed for a +recipient of ordinary skill to be able to understand it. + +5. Termination +-------------- + +5.1. The rights granted under this License will terminate automatically +if You fail to comply with any of its terms. However, if You become +compliant, then the rights granted under this License from a particular +Contributor are reinstated (a) provisionally, unless and until such +Contributor explicitly and finally terminates Your grants, and (b) on an +ongoing basis, if such Contributor fails to notify You of the +non-compliance by some reasonable means prior to 60 days after You have +come back into compliance. Moreover, Your grants from a particular +Contributor are reinstated on an ongoing basis if such Contributor +notifies You of the non-compliance by some reasonable means, this is the +first time You have received notice of non-compliance with this License +from such Contributor, and You become compliant prior to 30 days after +Your receipt of the notice. + +5.2. If You initiate litigation against any entity by asserting a patent +infringement claim (excluding declaratory judgment actions, +counter-claims, and cross-claims) alleging that a Contributor Version +directly or indirectly infringes any patent, then the rights granted to +You by any and all Contributors for the Covered Software under Section +2.1 of this License shall terminate. + +5.3. In the event of termination under Sections 5.1 or 5.2 above, all +end user license agreements (excluding distributors and resellers) which +have been validly granted by You or Your distributors under this License +prior to termination shall survive termination. + +************************************************************************ +* * +* 6. Disclaimer of Warranty * +* ------------------------- * +* * +* Covered Software is provided under this License on an "as is" * +* basis, without warranty of any kind, either expressed, implied, or * +* statutory, including, without limitation, warranties that the * +* Covered Software is free of defects, merchantable, fit for a * +* particular purpose or non-infringing. The entire risk as to the * +* quality and performance of the Covered Software is with You. * +* Should any Covered Software prove defective in any respect, You * +* (not any Contributor) assume the cost of any necessary servicing, * +* repair, or correction. This disclaimer of warranty constitutes an * +* essential part of this License. No use of any Covered Software is * +* authorized under this License except under this disclaimer. * +* * +************************************************************************ + +************************************************************************ +* * +* 7. Limitation of Liability * +* -------------------------- * +* * +* Under no circumstances and under no legal theory, whether tort * +* (including negligence), contract, or otherwise, shall any * +* Contributor, or anyone who distributes Covered Software as * +* permitted above, be liable to You for any direct, indirect, * +* special, incidental, or consequential damages of any character * +* including, without limitation, damages for lost profits, loss of * +* goodwill, work stoppage, computer failure or malfunction, or any * +* and all other commercial damages or losses, even if such party * +* shall have been informed of the possibility of such damages. This * +* limitation of liability shall not apply to liability for death or * +* personal injury resulting from such party's negligence to the * +* extent applicable law prohibits such limitation. Some * +* jurisdictions do not allow the exclusion or limitation of * +* incidental or consequential damages, so this exclusion and * +* limitation may not apply to You. * +* * +************************************************************************ + +8. Litigation +------------- + +Any litigation relating to this License may be brought only in the +courts of a jurisdiction where the defendant maintains its principal +place of business and such litigation shall be governed by laws of that +jurisdiction, without reference to its conflict-of-law provisions. +Nothing in this Section shall prevent a party's ability to bring +cross-claims or counter-claims. + +9. Miscellaneous +---------------- + +This License represents the complete agreement concerning the subject +matter hereof. If any provision of this License is held to be +unenforceable, such provision shall be reformed only to the extent +necessary to make it enforceable. Any law or regulation which provides +that the language of a contract shall be construed against the drafter +shall not be used to construe this License against a Contributor. + +10. Versions of the License +--------------------------- + +10.1. New Versions + +Mozilla Foundation is the license steward. Except as provided in Section +10.3, no one other than the license steward has the right to modify or +publish new versions of this License. Each version will be given a +distinguishing version number. + +10.2. Effect of New Versions + +You may distribute the Covered Software under the terms of the version +of the License under which You originally received the Covered Software, +or under the terms of any subsequent version published by the license +steward. + +10.3. Modified Versions + +If you create software not governed by this License, and you want to +create a new license for such software, you may create and use a +modified version of this License if you rename the license and remove +any references to the name of the license steward (except to note that +such modified license differs from this License). + +10.4. Distributing Source Code Form that is Incompatible With Secondary +Licenses + +If You choose to distribute Source Code Form that is Incompatible With +Secondary Licenses under the terms of this version of the License, the +notice described in Exhibit B of this License must be attached. + +Exhibit A - Source Code Form License Notice +------------------------------------------- + + This Source Code Form is subject to the terms of the Mozilla Public + License, v. 2.0. If a copy of the MPL was not distributed with this + file, You can obtain one at http://mozilla.org/MPL/2.0/. + +If it is not possible or desirable to put the notice in a particular +file, then You may include the notice in a location (such as a LICENSE +file in a relevant directory) where a recipient would be likely to look +for such a notice. + +You may add additional accurate notices of copyright ownership. + +Exhibit B - "Incompatible With Secondary Licenses" Notice +--------------------------------------------------------- + + This Source Code Form is "Incompatible With Secondary Licenses", as + defined by the Mozilla Public License, v. 2.0. diff --git a/haskell/LICENSE-MPL-2.0 b/haskell/LICENSE-MPL-2.0 new file mode 100644 index 0000000..14e2f77 --- /dev/null +++ b/haskell/LICENSE-MPL-2.0 @@ -0,0 +1,373 @@ +Mozilla Public License Version 2.0 +================================== + +1. Definitions +-------------- + +1.1. "Contributor" + means each individual or legal entity that creates, contributes to + the creation of, or owns Covered Software. + +1.2. "Contributor Version" + means the combination of the Contributions of others (if any) used + by a Contributor and that particular Contributor's Contribution. + +1.3. "Contribution" + means Covered Software of a particular Contributor. + +1.4. "Covered Software" + means Source Code Form to which the initial Contributor has attached + the notice in Exhibit A, the Executable Form of such Source Code + Form, and Modifications of such Source Code Form, in each case + including portions thereof. + +1.5. "Incompatible With Secondary Licenses" + means + + (a) that the initial Contributor has attached the notice described + in Exhibit B to the Covered Software; or + + (b) that the Covered Software was made available under the terms of + version 1.1 or earlier of the License, but not also under the + terms of a Secondary License. + +1.6. "Executable Form" + means any form of the work other than Source Code Form. + +1.7. "Larger Work" + means a work that combines Covered Software with other material, in + a separate file or files, that is not Covered Software. + +1.8. "License" + means this document. + +1.9. "Licensable" + means having the right to grant, to the maximum extent possible, + whether at the time of the initial grant or subsequently, any and + all of the rights conveyed by this License. + +1.10. "Modifications" + means any of the following: + + (a) any file in Source Code Form that results from an addition to, + deletion from, or modification of the contents of Covered + Software; or + + (b) any new file in Source Code Form that contains any Covered + Software. + +1.11. "Patent Claims" of a Contributor + means any patent claim(s), including without limitation, method, + process, and apparatus claims, in any patent Licensable by such + Contributor that would be infringed, but for the grant of the + License, by the making, using, selling, offering for sale, having + made, import, or transfer of either its Contributions or its + Contributor Version. + +1.12. "Secondary License" + means either the GNU General Public License, Version 2.0, the GNU + Lesser General Public License, Version 2.1, the GNU Affero General + Public License, Version 3.0, or any later versions of those + licenses. + +1.13. "Source Code Form" + means the form of the work preferred for making modifications. + +1.14. "You" (or "Your") + means an individual or a legal entity exercising rights under this + License. For legal entities, "You" includes any entity that + controls, is controlled by, or is under common control with You. For + purposes of this definition, "control" means (a) the power, direct + or indirect, to cause the direction or management of such entity, + whether by contract or otherwise, or (b) ownership of more than + fifty percent (50%) of the outstanding shares or beneficial + ownership of such entity. + +2. License Grants and Conditions +-------------------------------- + +2.1. Grants + +Each Contributor hereby grants You a world-wide, royalty-free, +non-exclusive license: + +(a) under intellectual property rights (other than patent or trademark) + Licensable by such Contributor to use, reproduce, make available, + modify, display, perform, distribute, and otherwise exploit its + Contributions, either on an unmodified basis, with Modifications, or + as part of a Larger Work; and + +(b) under Patent Claims of such Contributor to make, use, sell, offer + for sale, have made, import, and otherwise transfer either its + Contributions or its Contributor Version. + +2.2. Effective Date + +The licenses granted in Section 2.1 with respect to any Contribution +become effective for each Contribution on the date the Contributor first +distributes such Contribution. + +2.3. Limitations on Grant Scope + +The licenses granted in this Section 2 are the only rights granted under +this License. No additional rights or licenses will be implied from the +distribution or licensing of Covered Software under this License. +Notwithstanding Section 2.1(b) above, no patent license is granted by a +Contributor: + +(a) for any code that a Contributor has removed from Covered Software; + or + +(b) for infringements caused by: (i) Your and any other third party's + modifications of Covered Software, or (ii) the combination of its + Contributions with other software (except as part of its Contributor + Version); or + +(c) under Patent Claims infringed by Covered Software in the absence of + its Contributions. + +This License does not grant any rights in the trademarks, service marks, +or logos of any Contributor (except as may be necessary to comply with +the notice requirements in Section 3.4). + +2.4. Subsequent Licenses + +No Contributor makes additional grants as a result of Your choice to +distribute the Covered Software under a subsequent version of this +License (see Section 10.2) or under the terms of a Secondary License (if +permitted under the terms of Section 3.3). + +2.5. Representation + +Each Contributor represents that the Contributor believes its +Contributions are its original creation(s) or it has sufficient rights +to grant the rights to its Contributions conveyed by this License. + +2.6. Fair Use + +This License is not intended to limit any rights You have under +applicable copyright doctrines of fair use, fair dealing, or other +equivalents. + +2.7. Conditions + +Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted +in Section 2.1. + +3. Responsibilities +------------------- + +3.1. Distribution of Source Form + +All distribution of Covered Software in Source Code Form, including any +Modifications that You create or to which You contribute, must be under +the terms of this License. You must inform recipients that the Source +Code Form of the Covered Software is governed by the terms of this +License, and how they can obtain a copy of this License. You may not +attempt to alter or restrict the recipients' rights in the Source Code +Form. + +3.2. Distribution of Executable Form + +If You distribute Covered Software in Executable Form then: + +(a) such Covered Software must also be made available in Source Code + Form, as described in Section 3.1, and You must inform recipients of + the Executable Form how they can obtain a copy of such Source Code + Form by reasonable means in a timely manner, at a charge no more + than the cost of distribution to the recipient; and + +(b) You may distribute such Executable Form under the terms of this + License, or sublicense it under different terms, provided that the + license for the Executable Form does not attempt to limit or alter + the recipients' rights in the Source Code Form under this License. + +3.3. Distribution of a Larger Work + +You may create and distribute a Larger Work under terms of Your choice, +provided that You also comply with the requirements of this License for +the Covered Software. If the Larger Work is a combination of Covered +Software with a work governed by one or more Secondary Licenses, and the +Covered Software is not Incompatible With Secondary Licenses, this +License permits You to additionally distribute such Covered Software +under the terms of such Secondary License(s), so that the recipient of +the Larger Work may, at their option, further distribute the Covered +Software under the terms of either this License or such Secondary +License(s). + +3.4. Notices + +You may not remove or alter the substance of any license notices +(including copyright notices, patent notices, disclaimers of warranty, +or limitations of liability) contained within the Source Code Form of +the Covered Software, except that You may alter any license notices to +the extent required to remedy known factual inaccuracies. + +3.5. Application of Additional Terms + +You may choose to offer, and to charge a fee for, warranty, support, +indemnity or liability obligations to one or more recipients of Covered +Software. However, You may do so only on Your own behalf, and not on +behalf of any Contributor. You must make it absolutely clear that any +such warranty, support, indemnity, or liability obligation is offered by +You alone, and You hereby agree to indemnify every Contributor for any +liability incurred by such Contributor as a result of warranty, support, +indemnity or liability terms You offer. You may include additional +disclaimers of warranty and limitations of liability specific to any +jurisdiction. + +4. Inability to Comply Due to Statute or Regulation +--------------------------------------------------- + +If it is impossible for You to comply with any of the terms of this +License with respect to some or all of the Covered Software due to +statute, judicial order, or regulation then You must: (a) comply with +the terms of this License to the maximum extent possible; and (b) +describe the limitations and the code they affect. Such description must +be placed in a text file included with all distributions of the Covered +Software under this License. Except to the extent prohibited by statute +or regulation, such description must be sufficiently detailed for a +recipient of ordinary skill to be able to understand it. + +5. Termination +-------------- + +5.1. The rights granted under this License will terminate automatically +if You fail to comply with any of its terms. However, if You become +compliant, then the rights granted under this License from a particular +Contributor are reinstated (a) provisionally, unless and until such +Contributor explicitly and finally terminates Your grants, and (b) on an +ongoing basis, if such Contributor fails to notify You of the +non-compliance by some reasonable means prior to 60 days after You have +come back into compliance. Moreover, Your grants from a particular +Contributor are reinstated on an ongoing basis if such Contributor +notifies You of the non-compliance by some reasonable means, this is the +first time You have received notice of non-compliance with this License +from such Contributor, and You become compliant prior to 30 days after +Your receipt of the notice. + +5.2. If You initiate litigation against any entity by asserting a patent +infringement claim (excluding declaratory judgment actions, +counter-claims, and cross-claims) alleging that a Contributor Version +directly or indirectly infringes any patent, then the rights granted to +You by any and all Contributors for the Covered Software under Section +2.1 of this License shall terminate. + +5.3. In the event of termination under Sections 5.1 or 5.2 above, all +end user license agreements (excluding distributors and resellers) which +have been validly granted by You or Your distributors under this License +prior to termination shall survive termination. + +************************************************************************ +* * +* 6. Disclaimer of Warranty * +* ------------------------- * +* * +* Covered Software is provided under this License on an "as is" * +* basis, without warranty of any kind, either expressed, implied, or * +* statutory, including, without limitation, warranties that the * +* Covered Software is free of defects, merchantable, fit for a * +* particular purpose or non-infringing. The entire risk as to the * +* quality and performance of the Covered Software is with You. * +* Should any Covered Software prove defective in any respect, You * +* (not any Contributor) assume the cost of any necessary servicing, * +* repair, or correction. This disclaimer of warranty constitutes an * +* essential part of this License. No use of any Covered Software is * +* authorized under this License except under this disclaimer. * +* * +************************************************************************ + +************************************************************************ +* * +* 7. Limitation of Liability * +* -------------------------- * +* * +* Under no circumstances and under no legal theory, whether tort * +* (including negligence), contract, or otherwise, shall any * +* Contributor, or anyone who distributes Covered Software as * +* permitted above, be liable to You for any direct, indirect, * +* special, incidental, or consequential damages of any character * +* including, without limitation, damages for lost profits, loss of * +* goodwill, work stoppage, computer failure or malfunction, or any * +* and all other commercial damages or losses, even if such party * +* shall have been informed of the possibility of such damages. This * +* limitation of liability shall not apply to liability for death or * +* personal injury resulting from such party's negligence to the * +* extent applicable law prohibits such limitation. Some * +* jurisdictions do not allow the exclusion or limitation of * +* incidental or consequential damages, so this exclusion and * +* limitation may not apply to You. * +* * +************************************************************************ + +8. Litigation +------------- + +Any litigation relating to this License may be brought only in the +courts of a jurisdiction where the defendant maintains its principal +place of business and such litigation shall be governed by laws of that +jurisdiction, without reference to its conflict-of-law provisions. +Nothing in this Section shall prevent a party's ability to bring +cross-claims or counter-claims. + +9. Miscellaneous +---------------- + +This License represents the complete agreement concerning the subject +matter hereof. If any provision of this License is held to be +unenforceable, such provision shall be reformed only to the extent +necessary to make it enforceable. Any law or regulation which provides +that the language of a contract shall be construed against the drafter +shall not be used to construe this License against a Contributor. + +10. Versions of the License +--------------------------- + +10.1. New Versions + +Mozilla Foundation is the license steward. Except as provided in Section +10.3, no one other than the license steward has the right to modify or +publish new versions of this License. Each version will be given a +distinguishing version number. + +10.2. Effect of New Versions + +You may distribute the Covered Software under the terms of the version +of the License under which You originally received the Covered Software, +or under the terms of any subsequent version published by the license +steward. + +10.3. Modified Versions + +If you create software not governed by this License, and you want to +create a new license for such software, you may create and use a +modified version of this License if you rename the license and remove +any references to the name of the license steward (except to note that +such modified license differs from this License). + +10.4. Distributing Source Code Form that is Incompatible With Secondary +Licenses + +If You choose to distribute Source Code Form that is Incompatible With +Secondary Licenses under the terms of this version of the License, the +notice described in Exhibit B of this License must be attached. + +Exhibit A - Source Code Form License Notice +------------------------------------------- + + This Source Code Form is subject to the terms of the Mozilla Public + License, v. 2.0. If a copy of the MPL was not distributed with this + file, You can obtain one at http://mozilla.org/MPL/2.0/. + +If it is not possible or desirable to put the notice in a particular +file, then You may include the notice in a location (such as a LICENSE +file in a relevant directory) where a recipient would be likely to look +for such a notice. + +You may add additional accurate notices of copyright ownership. + +Exhibit B - "Incompatible With Secondary Licenses" Notice +--------------------------------------------------------- + + This Source Code Form is "Incompatible With Secondary Licenses", as + defined by the Mozilla Public License, v. 2.0. diff --git a/haskell/LICENSES/AGPL-3.0-or-later.txt b/haskell/LICENSES/AGPL-3.0-or-later.txt new file mode 100644 index 0000000..be3f7b2 --- /dev/null +++ b/haskell/LICENSES/AGPL-3.0-or-later.txt @@ -0,0 +1,661 @@ + GNU AFFERO GENERAL PUBLIC LICENSE + Version 3, 19 November 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU Affero General Public License is a free, copyleft license for +software and other kinds of works, specifically designed to ensure +cooperation with the community in the case of network server software. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +our General Public Licenses are intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + Developers that use our General Public Licenses protect your rights +with two steps: (1) assert copyright on the software, and (2) offer +you this License which gives you legal permission to copy, distribute +and/or modify the software. + + A secondary benefit of defending all users' freedom is that +improvements made in alternate versions of the program, if they +receive widespread use, become available for other developers to +incorporate. Many developers of free software are heartened and +encouraged by the resulting cooperation. However, in the case of +software used on network servers, this result may fail to come about. +The GNU General Public License permits making a modified version and +letting the public access it on a server without ever releasing its +source code to the public. + + The GNU Affero General Public License is designed specifically to +ensure that, in such cases, the modified source code becomes available +to the community. It requires the operator of a network server to +provide the source code of the modified version running there to the +users of that server. Therefore, public use of a modified version, on +a publicly accessible server, gives the public access to the source +code of the modified version. + + An older license, called the Affero General Public License and +published by Affero, was designed to accomplish similar goals. This is +a different license, not a version of the Affero GPL, but Affero has +released a new version of the Affero GPL which permits relicensing under +this license. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU Affero General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Remote Network Interaction; Use with the GNU General Public License. + + Notwithstanding any other provision of this License, if you modify the +Program, your modified version must prominently offer all users +interacting with it remotely through a computer network (if your version +supports such interaction) an opportunity to receive the Corresponding +Source of your version by providing access to the Corresponding Source +from a network server at no charge, through some standard or customary +means of facilitating copying of software. This Corresponding Source +shall include the Corresponding Source for any work covered by version 3 +of the GNU General Public License that is incorporated pursuant to the +following paragraph. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the work with which it is combined will remain governed by version +3 of the GNU General Public License. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU Affero General Public License from time to time. Such new versions +will be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU Affero General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU Affero General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU Affero General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If your software can interact with users remotely through a computer +network, you should also make sure that it provides a way for users to +get its source. For example, if your program is a web application, its +interface could display a "Source" link that leads users to an archive +of the code. There are many ways you could offer source, and different +solutions will be better for different programs; see section 13 for the +specific requirements. + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU AGPL, see +. diff --git a/haskell/LICENSES/CC-BY-SA-4.0.txt b/haskell/LICENSES/CC-BY-SA-4.0.txt new file mode 100644 index 0000000..2d58298 --- /dev/null +++ b/haskell/LICENSES/CC-BY-SA-4.0.txt @@ -0,0 +1,428 @@ +Attribution-ShareAlike 4.0 International + +======================================================================= + +Creative Commons Corporation ("Creative Commons") is not a law firm and +does not provide legal services or legal advice. Distribution of +Creative Commons public licenses does not create a lawyer-client or +other relationship. Creative Commons makes its licenses and related +information available on an "as-is" basis. Creative Commons gives no +warranties regarding its licenses, any material licensed under their +terms and conditions, or any related information. Creative Commons +disclaims all liability for damages resulting from their use to the +fullest extent possible. + +Using Creative Commons Public Licenses + +Creative Commons public licenses provide a standard set of terms and +conditions that creators and other rights holders may use to share +original works of authorship and other material subject to copyright +and certain other rights specified in the public license below. The +following considerations are for informational purposes only, are not +exhaustive, and do not form part of our licenses. + + Considerations for licensors: Our public licenses are + intended for use by those authorized to give the public + permission to use material in ways otherwise restricted by + copyright and certain other rights. Our licenses are + irrevocable. Licensors should read and understand the terms + and conditions of the license they choose before applying it. + Licensors should also secure all rights necessary before + applying our licenses so that the public can reuse the + material as expected. Licensors should clearly mark any + material not subject to the license. This includes other CC- + licensed material, or material used under an exception or + limitation to copyright. More considerations for licensors: + wiki.creativecommons.org/Considerations_for_licensors + + Considerations for the public: By using one of our public + licenses, a licensor grants the public permission to use the + licensed material under specified terms and conditions. If + the licensor's permission is not necessary for any reason--for + example, because of any applicable exception or limitation to + copyright--then that use is not regulated by the license. Our + licenses grant only permissions under copyright and certain + other rights that a licensor has authority to grant. Use of + the licensed material may still be restricted for other + reasons, including because others have copyright or other + rights in the material. A licensor may make special requests, + such as asking that all changes be marked or described. + Although not required by our licenses, you are encouraged to + respect those requests where reasonable. More considerations + for the public: + wiki.creativecommons.org/Considerations_for_licensees + +======================================================================= + +Creative Commons Attribution-ShareAlike 4.0 International Public +License + +By exercising the Licensed Rights (defined below), You accept and agree +to be bound by the terms and conditions of this Creative Commons +Attribution-ShareAlike 4.0 International Public License ("Public +License"). To the extent this Public License may be interpreted as a +contract, You are granted the Licensed Rights in consideration of Your +acceptance of these terms and conditions, and the Licensor grants You +such rights in consideration of benefits the Licensor receives from +making the Licensed Material available under these terms and +conditions. + + +Section 1 -- Definitions. + + a. Adapted Material means material subject to Copyright and Similar + Rights that is derived from or based upon the Licensed Material + and in which the Licensed Material is translated, altered, + arranged, transformed, or otherwise modified in a manner requiring + permission under the Copyright and Similar Rights held by the + Licensor. For purposes of this Public License, where the Licensed + Material is a musical work, performance, or sound recording, + Adapted Material is always produced where the Licensed Material is + synched in timed relation with a moving image. + + b. Adapter's License means the license You apply to Your Copyright + and Similar Rights in Your contributions to Adapted Material in + accordance with the terms and conditions of this Public License. + + c. BY-SA Compatible License means a license listed at + creativecommons.org/compatiblelicenses, approved by Creative + Commons as essentially the equivalent of this Public License. + + d. Copyright and Similar Rights means copyright and/or similar rights + closely related to copyright including, without limitation, + performance, broadcast, sound recording, and Sui Generis Database + Rights, without regard to how the rights are labeled or + categorized. For purposes of this Public License, the rights + specified in Section 2(b)(1)-(2) are not Copyright and Similar + Rights. + + e. Effective Technological Measures means those measures that, in the + absence of proper authority, may not be circumvented under laws + fulfilling obligations under Article 11 of the WIPO Copyright + Treaty adopted on December 20, 1996, and/or similar international + agreements. + + f. Exceptions and Limitations means fair use, fair dealing, and/or + any other exception or limitation to Copyright and Similar Rights + that applies to Your use of the Licensed Material. + + g. License Elements means the license attributes listed in the name + of a Creative Commons Public License. The License Elements of this + Public License are Attribution and ShareAlike. + + h. Licensed Material means the artistic or literary work, database, + or other material to which the Licensor applied this Public + License. + + i. Licensed Rights means the rights granted to You subject to the + terms and conditions of this Public License, which are limited to + all Copyright and Similar Rights that apply to Your use of the + Licensed Material and that the Licensor has authority to license. + + j. Licensor means the individual(s) or entity(ies) granting rights + under this Public License. + + k. Share means to provide material to the public by any means or + process that requires permission under the Licensed Rights, such + as reproduction, public display, public performance, distribution, + dissemination, communication, or importation, and to make material + available to the public including in ways that members of the + public may access the material from a place and at a time + individually chosen by them. + + l. Sui Generis Database Rights means rights other than copyright + resulting from Directive 96/9/EC of the European Parliament and of + the Council of 11 March 1996 on the legal protection of databases, + as amended and/or succeeded, as well as other essentially + equivalent rights anywhere in the world. + + m. You means the individual or entity exercising the Licensed Rights + under this Public License. Your has a corresponding meaning. + + +Section 2 -- Scope. + + a. License grant. + + 1. Subject to the terms and conditions of this Public License, + the Licensor hereby grants You a worldwide, royalty-free, + non-sublicensable, non-exclusive, irrevocable license to + exercise the Licensed Rights in the Licensed Material to: + + a. reproduce and Share the Licensed Material, in whole or + in part; and + + b. produce, reproduce, and Share Adapted Material. + + 2. Exceptions and Limitations. For the avoidance of doubt, where + Exceptions and Limitations apply to Your use, this Public + License does not apply, and You do not need to comply with + its terms and conditions. + + 3. Term. The term of this Public License is specified in Section + 6(a). + + 4. Media and formats; technical modifications allowed. The + Licensor authorizes You to exercise the Licensed Rights in + all media and formats whether now known or hereafter created, + and to make technical modifications necessary to do so. The + Licensor waives and/or agrees not to assert any right or + authority to forbid You from making technical modifications + necessary to exercise the Licensed Rights, including + technical modifications necessary to circumvent Effective + Technological Measures. For purposes of this Public License, + simply making modifications authorized by this Section 2(a) + (4) never produces Adapted Material. + + 5. Downstream recipients. + + a. Offer from the Licensor -- Licensed Material. Every + recipient of the Licensed Material automatically + receives an offer from the Licensor to exercise the + Licensed Rights under the terms and conditions of this + Public License. + + b. Additional offer from the Licensor -- Adapted Material. + Every recipient of Adapted Material from You + automatically receives an offer from the Licensor to + exercise the Licensed Rights in the Adapted Material + under the conditions of the Adapter's License You apply. + + c. No downstream restrictions. You may not offer or impose + any additional or different terms or conditions on, or + apply any Effective Technological Measures to, the + Licensed Material if doing so restricts exercise of the + Licensed Rights by any recipient of the Licensed + Material. + + 6. No endorsement. Nothing in this Public License constitutes or + may be construed as permission to assert or imply that You + are, or that Your use of the Licensed Material is, connected + with, or sponsored, endorsed, or granted official status by, + the Licensor or others designated to receive attribution as + provided in Section 3(a)(1)(A)(i). + + b. Other rights. + + 1. Moral rights, such as the right of integrity, are not + licensed under this Public License, nor are publicity, + privacy, and/or other similar personality rights; however, to + the extent possible, the Licensor waives and/or agrees not to + assert any such rights held by the Licensor to the limited + extent necessary to allow You to exercise the Licensed + Rights, but not otherwise. + + 2. Patent and trademark rights are not licensed under this + Public License. + + 3. To the extent possible, the Licensor waives any right to + collect royalties from You for the exercise of the Licensed + Rights, whether directly or through a collecting society + under any voluntary or waivable statutory or compulsory + licensing scheme. In all other cases the Licensor expressly + reserves any right to collect such royalties. + + +Section 3 -- License Conditions. + +Your exercise of the Licensed Rights is expressly made subject to the +following conditions. + + a. Attribution. + + 1. If You Share the Licensed Material (including in modified + form), You must: + + a. retain the following if it is supplied by the Licensor + with the Licensed Material: + + i. identification of the creator(s) of the Licensed + Material and any others designated to receive + attribution, in any reasonable manner requested by + the Licensor (including by pseudonym if + designated); + + ii. a copyright notice; + + iii. a notice that refers to this Public License; + + iv. a notice that refers to the disclaimer of + warranties; + + v. a URI or hyperlink to the Licensed Material to the + extent reasonably practicable; + + b. indicate if You modified the Licensed Material and + retain an indication of any previous modifications; and + + c. indicate the Licensed Material is licensed under this + Public License, and include the text of, or the URI or + hyperlink to, this Public License. + + 2. You may satisfy the conditions in Section 3(a)(1) in any + reasonable manner based on the medium, means, and context in + which You Share the Licensed Material. For example, it may be + reasonable to satisfy the conditions by providing a URI or + hyperlink to a resource that includes the required + information. + + 3. If requested by the Licensor, You must remove any of the + information required by Section 3(a)(1)(A) to the extent + reasonably practicable. + + b. ShareAlike. + + In addition to the conditions in Section 3(a), if You Share + Adapted Material You produce, the following conditions also apply. + + 1. The Adapter's License You apply must be a Creative Commons + license with the same License Elements, this version or + later, or a BY-SA Compatible License. + + 2. You must include the text of, or the URI or hyperlink to, the + Adapter's License You apply. You may satisfy this condition + in any reasonable manner based on the medium, means, and + context in which You Share Adapted Material. + + 3. You may not offer or impose any additional or different terms + or conditions on, or apply any Effective Technological + Measures to, Adapted Material that restrict exercise of the + rights granted under the Adapter's License You apply. + + +Section 4 -- Sui Generis Database Rights. + +Where the Licensed Rights include Sui Generis Database Rights that +apply to Your use of the Licensed Material: + + a. for the avoidance of doubt, Section 2(a)(1) grants You the right + to extract, reuse, reproduce, and Share all or a substantial + portion of the contents of the database; + + b. if You include all or a substantial portion of the database + contents in a database in which You have Sui Generis Database + Rights, then the database in which You have Sui Generis Database + Rights (but not its individual contents) is Adapted Material, + including for purposes of Section 3(b); and + + c. You must comply with the conditions in Section 3(a) if You Share + all or a substantial portion of the contents of the database. + +For the avoidance of doubt, this Section 4 supplements and does not +replace Your obligations under this Public License where the Licensed +Rights include other Copyright and Similar Rights. + + +Section 5 -- Disclaimer of Warranties and Limitation of Liability. + + a. UNLESS OTHERWISE SEPARATELY UNDERTAKEN BY THE LICENSOR, TO THE + EXTENT POSSIBLE, THE LICENSOR OFFERS THE LICENSED MATERIAL AS-IS + AND AS-AVAILABLE, AND MAKES NO REPRESENTATIONS OR WARRANTIES OF + ANY KIND CONCERNING THE LICENSED MATERIAL, WHETHER EXPRESS, + IMPLIED, STATUTORY, OR OTHER. THIS INCLUDES, WITHOUT LIMITATION, + WARRANTIES OF TITLE, MERCHANTABILITY, FITNESS FOR A PARTICULAR + PURPOSE, NON-INFRINGEMENT, ABSENCE OF LATENT OR OTHER DEFECTS, + ACCURACY, OR THE PRESENCE OR ABSENCE OF ERRORS, WHETHER OR NOT + KNOWN OR DISCOVERABLE. WHERE DISCLAIMERS OF WARRANTIES ARE NOT + ALLOWED IN FULL OR IN PART, THIS DISCLAIMER MAY NOT APPLY TO YOU. + + b. TO THE EXTENT POSSIBLE, IN NO EVENT WILL THE LICENSOR BE LIABLE + TO YOU ON ANY LEGAL THEORY (INCLUDING, WITHOUT LIMITATION, + NEGLIGENCE) OR OTHERWISE FOR ANY DIRECT, SPECIAL, INDIRECT, + INCIDENTAL, CONSEQUENTIAL, PUNITIVE, EXEMPLARY, OR OTHER LOSSES, + COSTS, EXPENSES, OR DAMAGES ARISING OUT OF THIS PUBLIC LICENSE OR + USE OF THE LICENSED MATERIAL, EVEN IF THE LICENSOR HAS BEEN + ADVISED OF THE POSSIBILITY OF SUCH LOSSES, COSTS, EXPENSES, OR + DAMAGES. WHERE A LIMITATION OF LIABILITY IS NOT ALLOWED IN FULL OR + IN PART, THIS LIMITATION MAY NOT APPLY TO YOU. + + c. The disclaimer of warranties and limitation of liability provided + above shall be interpreted in a manner that, to the extent + possible, most closely approximates an absolute disclaimer and + waiver of all liability. + + +Section 6 -- Term and Termination. + + a. This Public License applies for the term of the Copyright and + Similar Rights licensed here. However, if You fail to comply with + this Public License, then Your rights under this Public License + terminate automatically. + + b. Where Your right to use the Licensed Material has terminated under + Section 6(a), it reinstates: + + 1. automatically as of the date the violation is cured, provided + it is cured within 30 days of Your discovery of the + violation; or + + 2. upon express reinstatement by the Licensor. + + For the avoidance of doubt, this Section 6(b) does not affect any + right the Licensor may have to seek remedies for Your violations + of this Public License. + + c. For the avoidance of doubt, the Licensor may also offer the + Licensed Material under separate terms or conditions or stop + distributing the Licensed Material at any time; however, doing so + will not terminate this Public License. + + d. Sections 1, 5, 6, 7, and 8 survive termination of this Public + License. + + +Section 7 -- Other Terms and Conditions. + + a. The Licensor shall not be bound by any additional or different + terms or conditions communicated by You unless expressly agreed. + + b. Any arrangements, understandings, or agreements regarding the + Licensed Material not stated herein are separate from and + independent of the terms and conditions of this Public License. + + +Section 8 -- Interpretation. + + a. For the avoidance of doubt, this Public License does not, and + shall not be interpreted to, reduce, limit, restrict, or impose + conditions on any use of the Licensed Material that could lawfully + be made without permission under this Public License. + + b. To the extent possible, if any provision of this Public License is + deemed unenforceable, it shall be automatically reformed to the + minimum extent necessary to make it enforceable. If the provision + cannot be reformed, it shall be severed from this Public License + without affecting the enforceability of the remaining terms and + conditions. + + c. No term or condition of this Public License will be waived and no + failure to comply consented to unless expressly agreed to by the + Licensor. + + d. Nothing in this Public License constitutes or may be interpreted + as a limitation upon, or waiver of, any privileges and immunities + that apply to the Licensor or You, including from the legal + processes of any jurisdiction or authority. + + +======================================================================= + +Creative Commons is not a party to its public +licenses. Notwithstanding, Creative Commons may elect to apply one of +its public licenses to material it publishes and in those instances +will be considered the “Licensor.” The text of the Creative Commons +public licenses is dedicated to the public domain under the CC0 Public +Domain Dedication. Except for the limited purpose of indicating that +material is shared under a Creative Commons public license or as +otherwise permitted by the Creative Commons policies published at +creativecommons.org/policies, Creative Commons does not authorize the +use of the trademark "Creative Commons" or any other trademark or logo +of Creative Commons without its prior written consent including, +without limitation, in connection with any unauthorized modifications +to any of its public licenses or any other arrangements, +understandings, or agreements concerning use of licensed material. For +the avoidance of doubt, this paragraph does not form part of the +public licenses. + +Creative Commons may be contacted at creativecommons.org. + diff --git a/haskell/LICENSES/MPL-2.0.txt b/haskell/LICENSES/MPL-2.0.txt new file mode 100644 index 0000000..d0a1fa1 --- /dev/null +++ b/haskell/LICENSES/MPL-2.0.txt @@ -0,0 +1,373 @@ +Mozilla Public License Version 2.0 +================================== + +1. Definitions +-------------- + +1.1. "Contributor" + means each individual or legal entity that creates, contributes to + the creation of, or owns Covered Software. + +1.2. "Contributor Version" + means the combination of the Contributions of others (if any) used + by a Contributor and that particular Contributor's Contribution. + +1.3. "Contribution" + means Covered Software of a particular Contributor. + +1.4. "Covered Software" + means Source Code Form to which the initial Contributor has attached + the notice in Exhibit A, the Executable Form of such Source Code + Form, and Modifications of such Source Code Form, in each case + including portions thereof. + +1.5. "Incompatible With Secondary Licenses" + means + + (a) that the initial Contributor has attached the notice described + in Exhibit B to the Covered Software; or + + (b) that the Covered Software was made available under the terms of + version 1.1 or earlier of the License, but not also under the + terms of a Secondary License. + +1.6. "Executable Form" + means any form of the work other than Source Code Form. + +1.7. "Larger Work" + means a work that combines Covered Software with other material, in + a separate file or files, that is not Covered Software. + +1.8. "License" + means this document. + +1.9. "Licensable" + means having the right to grant, to the maximum extent possible, + whether at the time of the initial grant or subsequently, any and + all of the rights conveyed by this License. + +1.10. "Modifications" + means any of the following: + + (a) any file in Source Code Form that results from an addition to, + deletion from, or modification of the contents of Covered + Software; or + + (b) any new file in Source Code Form that contains any Covered + Software. + +1.11. "Patent Claims" of a Contributor + means any patent claim(s), including without limitation, method, + process, and apparatus claims, in any patent Licensable by such + Contributor that would be infringed, but for the grant of the + License, by the making, using, selling, offering for sale, having + made, import, or transfer of either its Contributions or its + Contributor Version. + +1.12. "Secondary License" + means either the GNU General Public License, Version 2.0, the GNU + Lesser General Public License, Version 2.1, the GNU Affero General + Public License, Version 3.0, or any later versions of those + licenses. + +1.13. "Source Code Form" + means the form of the work preferred for making modifications. + +1.14. "You" (or "Your") + means an individual or a legal entity exercising rights under this + License. For legal entities, "You" includes any entity that + controls, is controlled by, or is under common control with You. For + purposes of this definition, "control" means (a) the power, direct + or indirect, to cause the direction or management of such entity, + whether by contract or otherwise, or (b) ownership of more than + fifty percent (50%) of the outstanding shares or beneficial + ownership of such entity. + +2. License Grants and Conditions +-------------------------------- + +2.1. Grants + +Each Contributor hereby grants You a world-wide, royalty-free, +non-exclusive license: + +(a) under intellectual property rights (other than patent or trademark) + Licensable by such Contributor to use, reproduce, make available, + modify, display, perform, distribute, and otherwise exploit its + Contributions, either on an unmodified basis, with Modifications, or + as part of a Larger Work; and + +(b) under Patent Claims of such Contributor to make, use, sell, offer + for sale, have made, import, and otherwise transfer either its + Contributions or its Contributor Version. + +2.2. Effective Date + +The licenses granted in Section 2.1 with respect to any Contribution +become effective for each Contribution on the date the Contributor first +distributes such Contribution. + +2.3. Limitations on Grant Scope + +The licenses granted in this Section 2 are the only rights granted under +this License. No additional rights or licenses will be implied from the +distribution or licensing of Covered Software under this License. +Notwithstanding Section 2.1(b) above, no patent license is granted by a +Contributor: + +(a) for any code that a Contributor has removed from Covered Software; + or + +(b) for infringements caused by: (i) Your and any other third party's + modifications of Covered Software, or (ii) the combination of its + Contributions with other software (except as part of its Contributor + Version); or + +(c) under Patent Claims infringed by Covered Software in the absence of + its Contributions. + +This License does not grant any rights in the trademarks, service marks, +or logos of any Contributor (except as may be necessary to comply with +the notice requirements in Section 3.4). + +2.4. Subsequent Licenses + +No Contributor makes additional grants as a result of Your choice to +distribute the Covered Software under a subsequent version of this +License (see Section 10.2) or under the terms of a Secondary License (if +permitted under the terms of Section 3.3). + +2.5. Representation + +Each Contributor represents that the Contributor believes its +Contributions are its original creation(s) or it has sufficient rights +to grant the rights to its Contributions conveyed by this License. + +2.6. Fair Use + +This License is not intended to limit any rights You have under +applicable copyright doctrines of fair use, fair dealing, or other +equivalents. + +2.7. Conditions + +Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted +in Section 2.1. + +3. Responsibilities +------------------- + +3.1. Distribution of Source Form + +All distribution of Covered Software in Source Code Form, including any +Modifications that You create or to which You contribute, must be under +the terms of this License. You must inform recipients that the Source +Code Form of the Covered Software is governed by the terms of this +License, and how they can obtain a copy of this License. You may not +attempt to alter or restrict the recipients' rights in the Source Code +Form. + +3.2. Distribution of Executable Form + +If You distribute Covered Software in Executable Form then: + +(a) such Covered Software must also be made available in Source Code + Form, as described in Section 3.1, and You must inform recipients of + the Executable Form how they can obtain a copy of such Source Code + Form by reasonable means in a timely manner, at a charge no more + than the cost of distribution to the recipient; and + +(b) You may distribute such Executable Form under the terms of this + License, or sublicense it under different terms, provided that the + license for the Executable Form does not attempt to limit or alter + the recipients' rights in the Source Code Form under this License. + +3.3. Distribution of a Larger Work + +You may create and distribute a Larger Work under terms of Your choice, +provided that You also comply with the requirements of this License for +the Covered Software. If the Larger Work is a combination of Covered +Software with a work governed by one or more Secondary Licenses, and the +Covered Software is not Incompatible With Secondary Licenses, this +License permits You to additionally distribute such Covered Software +under the terms of such Secondary License(s), so that the recipient of +the Larger Work may, at their option, further distribute the Covered +Software under the terms of either this License or such Secondary +License(s). + +3.4. Notices + +You may not remove or alter the substance of any license notices +(including copyright notices, patent notices, disclaimers of warranty, +or limitations of liability) contained within the Source Code Form of +the Covered Software, except that You may alter any license notices to +the extent required to remedy known factual inaccuracies. + +3.5. Application of Additional Terms + +You may choose to offer, and to charge a fee for, warranty, support, +indemnity or liability obligations to one or more recipients of Covered +Software. However, You may do so only on Your own behalf, and not on +behalf of any Contributor. You must make it absolutely clear that any +such warranty, support, indemnity, or liability obligation is offered by +You alone, and You hereby agree to indemnify every Contributor for any +liability incurred by such Contributor as a result of warranty, support, +indemnity or liability terms You offer. You may include additional +disclaimers of warranty and limitations of liability specific to any +jurisdiction. + +4. Inability to Comply Due to Statute or Regulation +--------------------------------------------------- + +If it is impossible for You to comply with any of the terms of this +License with respect to some or all of the Covered Software due to +statute, judicial order, or regulation then You must: (a) comply with +the terms of this License to the maximum extent possible; and (b) +describe the limitations and the code they affect. Such description must +be placed in a text file included with all distributions of the Covered +Software under this License. Except to the extent prohibited by statute +or regulation, such description must be sufficiently detailed for a +recipient of ordinary skill to be able to understand it. + +5. Termination +-------------- + +5.1. The rights granted under this License will terminate automatically +if You fail to comply with any of its terms. However, if You become +compliant, then the rights granted under this License from a particular +Contributor are reinstated (a) provisionally, unless and until such +Contributor explicitly and finally terminates Your grants, and (b) on an +ongoing basis, if such Contributor fails to notify You of the +non-compliance by some reasonable means prior to 60 days after You have +come back into compliance. Moreover, Your grants from a particular +Contributor are reinstated on an ongoing basis if such Contributor +notifies You of the non-compliance by some reasonable means, this is the +first time You have received notice of non-compliance with this License +from such Contributor, and You become compliant prior to 30 days after +Your receipt of the notice. + +5.2. If You initiate litigation against any entity by asserting a patent +infringement claim (excluding declaratory judgment actions, +counter-claims, and cross-claims) alleging that a Contributor Version +directly or indirectly infringes any patent, then the rights granted to +You by any and all Contributors for the Covered Software under Section +2.1 of this License shall terminate. + +5.3. In the event of termination under Sections 5.1 or 5.2 above, all +end user license agreements (excluding distributors and resellers) which +have been validly granted by You or Your distributors under this License +prior to termination shall survive termination. + +************************************************************************ +* * +* 6. Disclaimer of Warranty * +* ------------------------- * +* * +* Covered Software is provided under this License on an "as is" * +* basis, without warranty of any kind, either expressed, implied, or * +* statutory, including, without limitation, warranties that the * +* Covered Software is free of defects, merchantable, fit for a * +* particular purpose or non-infringing. The entire risk as to the * +* quality and performance of the Covered Software is with You. * +* Should any Covered Software prove defective in any respect, You * +* (not any Contributor) assume the cost of any necessary servicing, * +* repair, or correction. This disclaimer of warranty constitutes an * +* essential part of this License. No use of any Covered Software is * +* authorized under this License except under this disclaimer. * +* * +************************************************************************ + +************************************************************************ +* * +* 7. Limitation of Liability * +* -------------------------- * +* * +* Under no circumstances and under no legal theory, whether tort * +* (including negligence), contract, or otherwise, shall any * +* Contributor, or anyone who distributes Covered Software as * +* permitted above, be liable to You for any direct, indirect, * +* special, incidental, or consequential damages of any character * +* including, without limitation, damages for lost profits, loss of * +* goodwill, work stoppage, computer failure or malfunction, or any * +* and all other commercial damages or losses, even if such party * +* shall have been informed of the possibility of such damages. This * +* limitation of liability shall not apply to liability for death or * +* personal injury resulting from such party's negligence to the * +* extent applicable law prohibits such limitation. Some * +* jurisdictions do not allow the exclusion or limitation of * +* incidental or consequential damages, so this exclusion and * +* limitation may not apply to You. * +* * +************************************************************************ + +8. Litigation +------------- + +Any litigation relating to this License may be brought only in the +courts of a jurisdiction where the defendant maintains its principal +place of business and such litigation shall be governed by laws of that +jurisdiction, without reference to its conflict-of-law provisions. +Nothing in this Section shall prevent a party's ability to bring +cross-claims or counter-claims. + +9. Miscellaneous +---------------- + +This License represents the complete agreement concerning the subject +matter hereof. If any provision of this License is held to be +unenforceable, such provision shall be reformed only to the extent +necessary to make it enforceable. Any law or regulation which provides +that the language of a contract shall be construed against the drafter +shall not be used to construe this License against a Contributor. + +10. Versions of the License +--------------------------- + +10.1. New Versions + +Mozilla Foundation is the license steward. Except as provided in Section +10.3, no one other than the license steward has the right to modify or +publish new versions of this License. Each version will be given a +distinguishing version number. + +10.2. Effect of New Versions + +You may distribute the Covered Software under the terms of the version +of the License under which You originally received the Covered Software, +or under the terms of any subsequent version published by the license +steward. + +10.3. Modified Versions + +If you create software not governed by this License, and you want to +create a new license for such software, you may create and use a +modified version of this License if you rename the license and remove +any references to the name of the license steward (except to note that +such modified license differs from this License). + +10.4. Distributing Source Code Form that is Incompatible With Secondary +Licenses + +If You choose to distribute Source Code Form that is Incompatible With +Secondary Licenses under the terms of this version of the License, the +notice described in Exhibit B of this License must be attached. + +Exhibit A - Source Code Form License Notice +------------------------------------------- + + This Source Code Form is subject to the terms of the Mozilla Public + License, v. 2.0. If a copy of the MPL was not distributed with this + file, You can obtain one at https://mozilla.org/MPL/2.0/. + +If it is not possible or desirable to put the notice in a particular +file, then You may include the notice in a location (such as a LICENSE +file in a relevant directory) where a recipient would be likely to look +for such a notice. + +You may add additional accurate notices of copyright ownership. + +Exhibit B - "Incompatible With Secondary Licenses" Notice +--------------------------------------------------------- + + This Source Code Form is "Incompatible With Secondary Licenses", as + defined by the Mozilla Public License, v. 2.0. diff --git a/haskell/MAINTAINERS b/haskell/MAINTAINERS new file mode 100644 index 0000000..37f6411 --- /dev/null +++ b/haskell/MAINTAINERS @@ -0,0 +1,43 @@ +# Maintainers + +This file lists the current maintainers of this project. + +## Active Maintainers + +| Name | GitHub | Role | Since | +|------|--------|------|-------| +| Metadatastician | @metadatastician | Primary | Project Start | + +## Emeritus Maintainers + +None at this time. + +## Becoming a Maintainer + +To become a maintainer: + +1. Demonstrate consistent, high-quality contributions +2. Show understanding of the project's goals and architecture +3. Be active in code reviews and community discussions +4. Be nominated by an existing maintainer +5. Be approved by consensus of existing maintainers + +## Maintainer Responsibilities + +- Reviewing and merging pull requests +- Managing releases +- Triaging issues +- Enforcing code standards +- Mentoring new contributors +- Participating in decision-making + +## Maintainer Expectations + +- Respond to issues and PRs in a timely manner +- Follow the code of conduct +- Be transparent in decision-making +- Communicate clearly and respectfully + +--- + +*Last updated: 2026-07-18* diff --git a/haskell/PROOF-NEEDS.md b/haskell/PROOF-NEEDS.md new file mode 100644 index 0000000..b138a08 --- /dev/null +++ b/haskell/PROOF-NEEDS.md @@ -0,0 +1,10 @@ +# PROOF-NEEDS.md + +## Template ABI Cleanup (2026-03-29) + +Template ABI removed -- was creating false impression of formal verification. +The removed files (Types.idr, Layout.idr, Foreign.idr) contained only RSR template +scaffolding with unresolved a2ml-haskell/Jonathan D.A. Jewell placeholders and no domain-specific proofs. + +When this project needs formal ABI verification, create domain-specific Idris2 proofs +following the pattern in repos like `typed-wasm`, `proven`, `echidna`, or `boj-server`. diff --git a/haskell/QUICKSTART-DEV.adoc b/haskell/QUICKSTART-DEV.adoc new file mode 100644 index 0000000..7f3c8e7 --- /dev/null +++ b/haskell/QUICKSTART-DEV.adoc @@ -0,0 +1,39 @@ += A2Ml Haskell — Developer Quickstart +:toc: preamble + +Clone, build, test, contribute. + +== Prerequisites + +* Git 2.40+ +* just (command runner) +* See `just doctor` output for language-specific requirements + +== Setup + +[source,bash] +---- +git clone https://github.com/hyperpolymath/a2ml-haskell +cd a2ml-haskell +just doctor # verify toolchain +just heal # auto-install missing tools +---- + +== Development Workflow + +[source,bash] +---- +just tour # understand the codebase +just help-me # see available commands +---- + +== Before Committing + +[source,bash] +---- +just assail # run panic-attacker security scan +---- + +== Contributing + +See link:CONTRIBUTING.md[CONTRIBUTING.md] for guidelines. diff --git a/haskell/QUICKSTART-MAINTAINER.adoc b/haskell/QUICKSTART-MAINTAINER.adoc new file mode 100644 index 0000000..94f1b4b --- /dev/null +++ b/haskell/QUICKSTART-MAINTAINER.adoc @@ -0,0 +1,40 @@ += A2Ml Haskell — Maintainer Quickstart +:toc: preamble + +Packaging, deployment, and release management. + +== Prerequisites + +* Git 2.40+ +* just (command runner) +* Familiarity with the project (run `just tour` first) + +== CI/CD + +This project uses GitHub Actions. Workflows are in `.github/workflows/`. + +Key workflows: + +* `hypatia-scan.yml` — Neurosymbolic security scanning +* `codeql.yml` — Code analysis +* `scorecard.yml` — OpenSSF Scorecard +* `mirror.yml` — GitLab/Bitbucket mirroring + +== Releasing + +1. Update version in project config +2. Update CHANGELOG.md +3. Tag: `git tag -s v` +4. Push: `git push origin main --tags` + +== Container Build (if applicable) + +[source,bash] +---- +podman build -f Containerfile -t a2ml-haskell:latest . +---- + +== Mirrors + +This repo is mirrored to GitLab and Bitbucket (hyperpolymath accounts) +via the `mirror.yml` workflow. diff --git a/haskell/QUICKSTART-USER.adoc b/haskell/QUICKSTART-USER.adoc new file mode 100644 index 0000000..0669244 --- /dev/null +++ b/haskell/QUICKSTART-USER.adoc @@ -0,0 +1,33 @@ += A2Ml Haskell — User Quickstart +:toc: preamble + +Get up and running in 60 seconds. + +== Prerequisites + +* Git 2.40+ +* just (command runner) — https://just.systems + +== Install + +[source,bash] +---- +git clone https://github.com/hyperpolymath/a2ml-haskell +cd a2ml-haskell +just doctor # check toolchain +just heal # auto-install missing tools +---- + +== First Run + +[source,bash] +---- +just tour # guided project tour +just help-me # see common workflows +---- + +== Get Help + +* `just help-me` — common workflows +* `just doctor` — diagnose toolchain issues +* https://github.com/hyperpolymath/a2ml-haskell/issues — report bugs diff --git a/haskell/README.md b/haskell/README.md new file mode 100644 index 0000000..c870812 --- /dev/null +++ b/haskell/README.md @@ -0,0 +1,70 @@ + + +Haskell library for parsing and rendering A2ML (Attested Markup +Language) — attestation-native markup carrying trust metadata, +cryptographic attestation fields, and provenance information. + +# Overview + +`a2ml-haskell` provides a purely functional parser and renderer over +`Text`: + +- `Data.A2ML.Parser` — \`parseA2ML + Text → Either ParseError Document\`. Line-oriented, no regex, no + mutable state. Recognises headings, multi-line directive blocks + (`@name:` `…` `@end`), bullet lists, and inline formatting. + +- `Data.A2ML.Renderer` — serialises a `Document` back to canonical A2ML. + + + +- `Data.A2ML.Types` — `Document`, `Block`, `Inline`, `DirectiveName` + (typed sum: `DirAbstract`, `DirRefs`, `DirAttestation`, `DirMeta`, + `DirCustom` `Text`), `Attestation`, `TrustLevel`, `Manifest`, + `Reference`. + +The Haskell variant uses richer directive syntax than `a2ml-rs`: +directives are multi-line `@name:` `…` `@end` blocks (not single-line +`@name` `value` pairs). + +# Attestation Model + +The `Attestation` type carries: + +- `attestationSigner` — identity of the signing agent or person + +- `attestationAlgorithm` — e.g. `"ed25519"` or `"sha256"` + +- `attestationSignature` — hex or base64 signature (opaque, not verified + here) + +- `attestationTimestamp` — optional ISO-8601 timestamp + +`TrustLevel` encodes attestor count and independence: `Unsigned` → +`SelfAttested` → `ThirdPartyAttested` → `MultiAttested`. + +`Manifest` aggregates title, author, version, SPDX license, overall +trust level, and the full attestation list — the entry point for +provenance inspection. + +# Building + +```sh +cabal build +cabal test +``` + +# Related + +- [a2ml-rs](https://github.com/hyperpolymath/a2ml-rs) — Rust + implementation + +- [pandoc-a2ml](https://github.com/hyperpolymath/pandoc-a2ml) — Pandoc + Lua reader/writer + +# License + +MPL-2.0. See [LICENSE](LICENSE). diff --git a/haskell/ROADMAP.adoc b/haskell/ROADMAP.adoc new file mode 100644 index 0000000..d2c40bd --- /dev/null +++ b/haskell/ROADMAP.adoc @@ -0,0 +1,22 @@ +// SPDX-License-Identifier: CC-BY-SA-4.0 += A2ml Haskell Roadmap + +== Current Status + +Initial development phase. + +== Milestones + +=== v0.1.0 - Foundation +* [ ] Core functionality +* [ ] Basic documentation +* [ ] CI/CD pipeline + +=== v1.0.0 - Stable Release +* [ ] Full feature set +* [ ] Comprehensive tests +* [ ] Production ready + +== Future Directions + +_To be determined based on community feedback._ diff --git a/haskell/SECURITY.md b/haskell/SECURITY.md new file mode 100644 index 0000000..5c4d5e9 --- /dev/null +++ b/haskell/SECURITY.md @@ -0,0 +1,20 @@ + +# Security Policy + +## Reporting a Vulnerability + +If you discover a security vulnerability, please report it responsibly. + +**Email:** j.d.a.jewell@open.ac.uk + +**Please include:** +- Description of the vulnerability +- Steps to reproduce +- Potential impact + +**Response timeline:** +- Acknowledgement within 48 hours +- Initial assessment within 7 days +- Fix or mitigation within 90 days + +**Safe harbour:** We will not pursue legal action against security researchers who follow responsible disclosure. diff --git a/haskell/Setup.hs b/haskell/Setup.hs new file mode 100644 index 0000000..bce760a --- /dev/null +++ b/haskell/Setup.hs @@ -0,0 +1,3 @@ +-- SPDX-License-Identifier: MPL-2.0 +import Distribution.Simple +main = defaultMain diff --git a/haskell/TEST-NEEDS.md b/haskell/TEST-NEEDS.md new file mode 100644 index 0000000..aa38800 --- /dev/null +++ b/haskell/TEST-NEEDS.md @@ -0,0 +1,51 @@ +# Test & Benchmark Requirements + +## CRG Grade: C — ACHIEVED 2026-04-04 + +## Current State +- Unit tests: NONE (no Haskell test files found, no test-suite in .cabal verified) +- Integration tests: 1 Zig integration test (ABI/FFI template) +- E2E tests: NONE +- Benchmarks: NONE (benchmark dir has only README placeholder) +- panic-attack scan: NEVER RUN + +## What's Missing +### Point-to-Point (P2P) +- Data/A2ML.hs (main module) — no tests +- Data/A2ML/Types.hs — no tests +- Data/A2ML/Parser.hs — no tests (parser is most critical) +- Data/A2ML/Renderer.hs — no tests +- Idris2 ABI definitions — no verification tests +- Zig FFI — only template integration test +- tests/fuzz/ contains only placeholder.txt + +### End-to-End (E2E) +- Parse A2ML document and verify output +- Render A2ML and verify format +- Round-trip fidelity +- QuickCheck / Hedgehog property-based tests for parser correctness +- Error handling for malformed input + +### Aspect Tests +- [ ] Security (untrusted A2ML input) +- [ ] Performance (parsing large documents, lazy evaluation pitfalls) +- [ ] Concurrency (N/A for library) +- [ ] Error handling (partial parse, encoding issues) +- [ ] Accessibility (N/A) + +### Build & Execution +- [ ] cabal build — not verified +- [ ] cabal test — not verified (no test-suite section found) +- [ ] Self-diagnostic — none + +### Benchmarks Needed +- Parse throughput vs Rust and Elixir implementations +- Memory usage (Haskell lazy evaluation can hide space leaks) +- Criterion benchmarks for parser and renderer + +### Self-Tests +- [ ] panic-attack assail on own repo +- [ ] Built-in doctor/check command (if applicable) + +## Priority +- **HIGH** — 4 Haskell source modules with ZERO tests. For a Haskell library, the absence of property-based tests (QuickCheck/Hedgehog) is especially damning. The fuzz directory is empty. No benchmark code despite benchmark dir existing. diff --git a/haskell/TOPOLOGY.md b/haskell/TOPOLOGY.md new file mode 100644 index 0000000..94f9af3 --- /dev/null +++ b/haskell/TOPOLOGY.md @@ -0,0 +1,27 @@ + + +# TOPOLOGY.md — a2ml-haskell + +## Purpose + +Haskell implementation of the A2ML (Attested Markup Language) parser and renderer. Provides strongly-typed parsing via Haskell's algebraic data types with full parse-render round-trip fidelity. Targets use in template validators, Scaffoldia, and type-heavy tooling. + +## Module Map + +``` +a2ml-haskell/ +├── src/ +│ ├── Data/ # A2ML AST data types +│ ├── interface/ # Public-facing API surface +│ └── (core, errors, aspects) +├── bench/ # Benchmarks +├── examples/ # Usage examples +├── a2ml-haskell.cabal # Cabal build config +└── container/ # Containerfile for CI +``` + +## Data Flow + +``` +[A2ML text] ──► [Parser] ──► [Haskell ADT AST] ──► [Renderer] ──► [A2ML text] +``` diff --git a/haskell/a2ml-haskell.cabal b/haskell/a2ml-haskell.cabal new file mode 100644 index 0000000..58a479a --- /dev/null +++ b/haskell/a2ml-haskell.cabal @@ -0,0 +1,84 @@ +-- SPDX-License-Identifier: MPL-2.0 +-- (MPL-2.0 preferred; MPL-2.0 required for Hackage OSI-approved policy) +-- +-- a2ml-haskell.cabal — Cabal package description for the a2ml library. + +cabal-version: 2.4 +name: a2ml +version: 0.1.0.0 +synopsis: Parser and renderer for A2ML (Attested Markup Language) +description: + A Haskell library for parsing and rendering A2ML (Attested Markup Language) + documents. A2ML is an attestation-native markup format designed for documents + that carry trust metadata, cryptographic attestations, and provenance + information. + . + Features: + . + * Parse @.a2ml@ files into a typed Haskell AST + * Render the AST back to A2ML surface syntax + * Data types for manifests, attestations, trust levels, and directives + * Round-trip fidelity: parse then render preserves document structure + +license: MPL-2.0 +license-file: LICENSE-MPL-2.0 +author: Jonathan D.A. Jewell +maintainer: j.d.a.jewell@open.ac.uk +copyright: Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) +category: Text, Data +build-type: Simple +homepage: https://github.com/hyperpolymath/a2ml-haskell +bug-reports: https://github.com/hyperpolymath/a2ml-haskell/issues +extra-doc-files: CHANGELOG.md +extra-source-files: README.adoc + +source-repository head + type: git + location: https://github.com/hyperpolymath/a2ml-haskell.git + +library + exposed-modules: + Data.A2ML + Data.A2ML.Types + Data.A2ML.Parser + Data.A2ML.Renderer + build-depends: + base >= 4.14 && < 5, + text >= 1.2 && < 2.2, + containers >= 0.6 && < 0.8, + bytestring >= 0.10 && < 0.13 + hs-source-dirs: src + default-language: Haskell2010 + ghc-options: -Wall -Wcompat -Widentities -Wincomplete-record-updates + -Wincomplete-uni-patterns -Wredundant-constraints + +test-suite a2ml-tests + type: exitcode-stdio-1.0 + main-is: Spec.hs + other-modules: + UnitSpec + E2ESpec + PropertySpec + build-depends: + base >= 4.14 && < 5, + a2ml, + text >= 1.2 && < 2.2, + containers >= 0.6 && < 0.8, + hspec >= 2.10 && < 2.12, + QuickCheck >= 2.14 && < 2.16, + hspec-quickcheck >= 0.0.1 + hs-source-dirs: tests + default-language: Haskell2010 + ghc-options: -Wall -threaded -rtsopts -with-rtsopts=-N + +benchmark a2ml-bench + type: exitcode-stdio-1.0 + main-is: Main.hs + build-depends: + base >= 4.14 && < 5, + a2ml, + text >= 1.2 && < 2.2, + criterion >= 1.5 && < 1.7 + hs-source-dirs: bench + default-language: Haskell2010 + ghc-options: -Wall -O2 diff --git a/haskell/bench/Main.hs b/haskell/bench/Main.hs new file mode 100644 index 0000000..946f73a --- /dev/null +++ b/haskell/bench/Main.hs @@ -0,0 +1,98 @@ +-- SPDX-License-Identifier: MPL-2.0 +-- (MPL-2.0 preferred; MPL-2.0 required for Hackage OSI-approved policy) +-- +-- bench/Main.hs — Criterion benchmarks for a2ml-haskell. +-- +-- Measures parse and render throughput across a range of document sizes +-- and content types to identify performance regressions. +-- +-- Run with: cabal bench + +module Main (main) where + +import Criterion.Main + +import Data.A2ML.Parser (parseA2ML) +import Data.A2ML.Renderer (renderA2ML) +import Data.A2ML.Types + +import qualified Data.Text as T + +-- --------------------------------------------------------------------------- +-- Fixtures +-- --------------------------------------------------------------------------- + +-- | A small document: one heading and a paragraph. +smallDoc :: T.Text +smallDoc = T.unlines + [ "# Hello World" + , "" + , "A simple introduction paragraph." + ] + +-- | A medium document with multiple sections and inline markup. +mediumDoc :: T.Text +mediumDoc = T.unlines + [ "# Main Title" + , "" + , "Introduction paragraph with **bold** and *italic* text." + , "" + , "## Section One" + , "" + , "First section paragraph with `inline code` and [a link](https://example.com)." + , "" + , "- Bullet item alpha" + , "- Bullet item beta" + , "- Bullet item gamma" + , "" + , "## Section Two" + , "" + , "@abstract:" + , "This is the abstract body spanning" + , "multiple lines of text." + , "@end" + , "" + , "Concluding paragraph." + ] + +-- | A large document with 30 sections. +largeDoc :: T.Text +largeDoc = + let header = "# Large Document\n\n" + section i = T.unlines + [ "## Section " <> T.pack (show (i :: Int)) + , "" + , "Paragraph " <> T.pack (show i) <> " with **bold** and *italic* and `code`." + , "" + , "- Item A in section " <> T.pack (show i) + , "- Item B in section " <> T.pack (show i) + , "" + ] + in header <> mconcat (map section [1..30]) + +-- | Parse mediumDoc once for render benchmarks. +parsedMedium :: Document +parsedMedium = case parseA2ML mediumDoc of + Right d -> d + Left e -> error ("Fixture parse failed: " <> show e) + +-- --------------------------------------------------------------------------- +-- Benchmark suite +-- --------------------------------------------------------------------------- + +main :: IO () +main = defaultMain + [ bgroup "parse" + [ bench "small document" $ nf parseA2ML smallDoc + , bench "medium document" $ nf parseA2ML mediumDoc + , bench "large document" $ nf parseA2ML largeDoc + ] + , bgroup "render" + [ bench "medium document" $ nf renderA2ML parsedMedium + ] + , bgroup "roundtrip" + [ bench "small roundtrip" $ nf (\d -> parseA2ML (renderA2ML d)) + (case parseA2ML smallDoc of Right x -> x; _ -> error "bad") + , bench "medium roundtrip" $ nf (\d -> parseA2ML (renderA2ML d)) parsedMedium + ] + ] diff --git a/haskell/container/.gatekeeper.yaml b/haskell/container/.gatekeeper.yaml new file mode 100644 index 0000000..1f0f8a8 --- /dev/null +++ b/haskell/container/.gatekeeper.yaml @@ -0,0 +1,122 @@ +# SPDX-License-Identifier: MPL-2.0 +# +# Svalinn gatekeeper policy for a2ml-haskell +# +# Controls which operations are permitted through the edge gateway. +# This template provides moderate security defaults — not wide-open test +# mode, but not production-hardened either. Tighten the values below +# before deploying to production. +# +# See: stapeln/container-stack/svalinn/ + +version: "1.0" + +# ============================================================================ +# Authentication +# ============================================================================ +# +# Define which endpoints require authentication and at what level. + +auth: + # Public endpoints — no authentication required. + # Health and readiness probes must always be public so that + # orchestrators (selur, Podman, k8s) can check service status. + public: + - path: "/health" + methods: ["GET"] + - path: "/ready" + methods: ["GET"] + - path: "/metrics" + methods: ["GET"] + + # Endpoints requiring JWT or OAuth2 authentication. + # Svalinn validates the token before forwarding the request. + authenticated: + - path: "/api/v1/*" + methods: ["GET", "POST", "PUT", "DELETE"] + +# ============================================================================ +# Rate Limiting +# ============================================================================ +# +# Protects backend services from overload. Values here are moderate +# defaults — adjust based on your service capacity. + +rate_limits: + # Global limit: applied to all authenticated clients. + global: + requests_per_second: 500 + burst: 1000 + + # Write operations: stricter limit to protect data stores. + writes: + paths: ["/api/v1/*"] + methods: ["POST", "PUT", "DELETE"] + requests_per_second: 100 + burst: 200 + +# ============================================================================ +# Container Trust +# ============================================================================ +# +# Svalinn verifies that all .ctp bundles in the stack are signed by +# trusted keys and carry the required attestations. + +trust: + # Only accept .ctp bundles signed by these keys. + trusted_signers: + - key_id: "{{SERVICE_NAME}}-release" + algorithm: "Ed25519" + public_key_file: "/etc/svalinn/keys/{{SERVICE_NAME}}-release.pub" + + # Require these attestations on all .ctp bundles. + required_attestations: + - "source-signature" + - "sbom-complete" + + # Reject unsigned or untrusted images. + reject_unsigned: true + +# ============================================================================ +# Request Validation +# ============================================================================ +# +# Input validation at the gateway layer — catches malformed requests +# before they reach the application. + +validation: + # Maximum request body size. + max_body_size: "8MB" + + # Reject requests with NaN or Infinity in numeric fields. + reject_nan_inf: true + + # Maximum result limit per list/search query. + max_result_limit: 500 + +# ============================================================================ +# CORS +# ============================================================================ +# +# Cross-Origin Resource Sharing policy. The defaults below allow all +# origins — restrict to your frontend domain(s) in production. + +cors: + allow_origins: ["*"] + allow_methods: ["GET", "POST", "PUT", "DELETE", "OPTIONS"] + allow_headers: ["Content-Type", "Authorization"] + max_age: 3600 + +# ============================================================================ +# Logging +# ============================================================================ +# +# Structured logging for svalinn itself. Audit paths log all requests +# (including body hashes) for post-incident investigation. + +logging: + format: "json" + level: "info" + # Log all write operations for audit trail. + audit_paths: + - "/api/v1/*" diff --git a/haskell/container/0.1-AI-MANIFEST.a2ml b/haskell/container/0.1-AI-MANIFEST.a2ml new file mode 100644 index 0000000..53baef8 --- /dev/null +++ b/haskell/container/0.1-AI-MANIFEST.a2ml @@ -0,0 +1,143 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "container-templates" +version: "1.0.0" +context: + - "https://a2ml.org/ns/v2" + - "https://stapeln.dev/ns/v1" + +--- +### [AI_MANIFEST] +description: | + Container templates for the stapeln container ecosystem. This directory + provides Podman-Chainguard-stapeln templates that are customised via + `just container-init` or `just init` during project bootstrap. + + All files use REMOVED tokens that are substituted with project- + specific values during initialisation. + +purpose: | + Provide a complete, security-first container deployment story for any + RSR-compliant repository. The templates cover the full lifecycle: + build, sign, verify, deploy, monitor, and govern. + +canonical_locations: + compose: "container/compose.toml" + containerfile: "container/Containerfile" + manifest: "container/manifest.toml" + gatekeeper: "container/.gatekeeper.yaml" + build_pipeline: "container/ct-build.sh" + entrypoint: "container/entrypoint.sh" + monitoring: "container/vordr.toml" + deployment: "container/deploy.k9.ncl" + example: "container/compose.example.toml" + +--- +### [FILE_RELATIONSHIPS] +files: + - name: "compose.toml" + role: "Orchestration" + description: | + selur-compose stack definition. Declares services, volumes, networks, + and health checks. References the Containerfile for image builds and + .gatekeeper.yaml for svalinn policy. + depends_on: ["Containerfile", ".gatekeeper.yaml"] + + - name: "Containerfile" + role: "Image Build" + description: | + Multi-stage OCI container build. Stage 1 compiles the application on + wolfi-base; Stage 2 copies the binary into a minimal runtime image. + Copies entrypoint.sh, .gatekeeper.yaml, and manifest.toml into the + final image. + depends_on: ["entrypoint.sh", ".gatekeeper.yaml", "manifest.toml"] + + - name: "manifest.toml" + role: "Bundle Metadata" + description: | + Cerro-torre .ctp bundle manifest. Describes provenance, dependencies, + attestations, and runtime security profile. Used by `ct pack` and + `ct verify`. + depends_on: [] + + - name: ".gatekeeper.yaml" + role: "Gateway Policy" + description: | + Svalinn edge gateway policy. Controls authentication, rate limiting, + container trust, request validation, CORS, and audit logging. + depends_on: [] + + - name: "ct-build.sh" + role: "Build Pipeline" + description: | + Shell script implementing the 5-stage pipeline: build (Podman), + pack (cerro-torre .ctp), sign (Ed25519), verify, push (optional). + Degrades gracefully when cerro-torre tools are not installed. + depends_on: ["Containerfile", "manifest.toml"] + + - name: "entrypoint.sh" + role: "Container Entrypoint" + description: | + Startup script with signal handling (SIGTERM, SIGINT), logging, and + exec into the main application process. + depends_on: [] + + - name: "vordr.toml" + role: "Runtime Monitoring" + description: | + Vordr monitoring configuration. Health endpoint probing, crash + detection, resource thresholds, and structured log output. + depends_on: [] + + - name: "deploy.k9.ncl" + role: "Deployment Component" + description: | + k9-svc deployment specification at Hunt trust level. Full pedigree + (L1-L5), environment configs, container config, and rolling + deployment strategy. + depends_on: ["compose.toml", "ct-build.sh"] + + - name: "compose.example.toml" + role: "Example" + description: | + Fully-commented multi-service example (Rust API + Elixir worker + + svalinn gateway). Copy to compose.toml and customise. + depends_on: [] + +--- +### [STAPELN_ECOSYSTEM] +overview: | + The stapeln container ecosystem comprises six tools: + + selur — Container orchestration with zero-copy IPC. Reads compose.toml. + cerro-torre — Verified container packaging (.ctp bundles), Ed25519 signing. + svalinn — Policy-driven edge gateway (auth, rate limits, CORS, trust). + vordr — Runtime monitoring (health, crashes, resources, logs). + rokur — Secrets management (runtime injection, no baked secrets). + k9-svc — Nickel deployment components (Kennel/Yard/Hunt trust levels). + +invariants: + - "Base images MUST be cgr.dev/chainguard/wolfi-base or cgr.dev/chainguard/static" + - "Container runtime is Podman — never Docker" + - "Containerfile — never Dockerfile" + - "All images run as non-root (appuser or project-specific user)" + - ".ctp bundles are signed with Ed25519 via cerro-torre" + - "Health endpoints (/health, /ready) must always be public (no auth)" + +--- +### [USAGE] +initialisation: | + Run `just container-init` to substitute all REMOVED tokens with + project-specific values. This is also run as part of `just init`. + +development: | + 1. `just container-build` — Build the container image + 2. `just container-verify` — Verify compose configuration + 3. `just container-up` — Start the stack locally + 4. `just container-down` — Stop the stack + +production: | + 1. `just container-sign` — Build, sign, verify .ctp bundle + 2. `just container-push` — Push signed bundle to registry + 3. `selur-compose up` — Deploy on target host diff --git a/haskell/container/Containerfile b/haskell/container/Containerfile new file mode 100644 index 0000000..c7e23cf --- /dev/null +++ b/haskell/container/Containerfile @@ -0,0 +1,136 @@ +# SPDX-License-Identifier: MPL-2.0 +# a2ml-haskell Container Image +# +# Multi-stage build template for Chainguard Wolfi base images. +# Customise the builder stage for your language and copy the +# resulting binary/release into the minimal runtime stage. +# +# Build with Podman: +# podman build -t {{SERVICE_NAME}}:latest -f container/Containerfile . +# +# Run: +# podman run -p {{PORT}}:{{PORT}} {{SERVICE_NAME}}:latest +# +# Run with persistent volume: +# podman run -p {{PORT}}:{{PORT}} -v {{SERVICE_NAME}}-data:/data {{SERVICE_NAME}}:latest + +# ============================================================================ +# Stage 1: Builder +# ============================================================================ +# +# Install build tools and compile the application. +# This stage is discarded after the build — only the compiled output +# is copied into the runtime stage. +# +# Language-specific examples (uncomment the one you need): +# +# --- Rust --- +# RUN apk add --no-cache rust pkgconf build-base +# COPY Cargo.toml Cargo.lock ./ +# COPY src/ ./src/ +# RUN cargo build --release +# # Output: /build/target/release/{{SERVICE_NAME}} +# +# --- Elixir --- +# RUN apk add --no-cache erl27-elixir-1.18 erlang-27 erlang-27-dev git build-base +# COPY mix.exs mix.lock ./ +# COPY lib/ ./lib/ +# COPY config/ ./config/ +# ENV MIX_ENV=prod +# RUN mix local.hex --force && mix local.rebar --force && \ +# mix deps.get --only prod && mix compile && mix release +# # Output: /build/_build/prod/rel/{{SERVICE_NAME}}/ +# +# --- Zig --- +# RUN apk add --no-cache zig build-base +# COPY build.zig build.zig.zon ./ +# COPY src/ ./src/ +# RUN zig build -Doptimize=ReleaseFast +# # Output: /build/zig-out/bin/{{SERVICE_NAME}} +# +FROM cgr.dev/chainguard/wolfi-base:latest AS builder + +# TODO: Install your language toolchain +RUN apk add --no-cache build-base + +WORKDIR /build + +# TODO: Copy source files and build +COPY . . +# RUN + +# ============================================================================ +# Stage 2: Runtime +# ============================================================================ +# +# Minimal production image. Only the compiled binary/release and runtime +# dependencies are included. No compilers, no source code, no build tools. +# +FROM cgr.dev/chainguard/wolfi-base:latest + +# OCI image labels (compatible with cerro-torre .ctp bundle metadata) +LABEL org.opencontainers.image.title="a2ml-haskell" \ + org.opencontainers.image.description="a2ml-haskell" \ + org.opencontainers.image.url="https://github.com/hyperpolymath/a2ml-haskell" \ + org.opencontainers.image.source="https://github.com/hyperpolymath/a2ml-haskell" \ + org.opencontainers.image.vendor="hyperpolymath" \ + org.opencontainers.image.licenses="MPL-2.0" \ + org.opencontainers.image.authors="Jonathan D.A. Jewell " \ + dev.cerrotorre.manifest="container/manifest.toml" \ + dev.cerrotorre.gatekeeper="container/.gatekeeper.yaml" \ + dev.stapeln.compose="container/compose.toml" + +# Install minimal runtime dependencies. +# Adjust this list for your application: +# - ca-certificates: TLS root certificates +# - curl: health check probe +# - libstdc++: C++ standard library (if needed by native deps) +# - ncurses: terminal UI (if needed, e.g. Elixir IEx) +RUN apk add --no-cache ca-certificates curl + +# Create non-root user for the application. +# Running as root inside containers is a security anti-pattern. +RUN addgroup -S appuser && adduser -S appuser -G appuser + +WORKDIR /app + +# TODO: Copy compiled binary/release from builder stage. +# Examples: +# COPY --from=builder /build/target/release/{{SERVICE_NAME}} /app/{{SERVICE_NAME}} +# COPY --from=builder /build/_build/prod/rel/{{SERVICE_NAME}} /app/release/ +# COPY --from=builder /build/zig-out/bin/{{SERVICE_NAME}} /app/{{SERVICE_NAME}} + +# Copy entrypoint script +COPY container/entrypoint.sh /app/entrypoint.sh +RUN chmod +x /app/entrypoint.sh + +# Copy stapeln integration files (svalinn gatekeeper policy, cerro-torre manifest) +COPY container/.gatekeeper.yaml /etc/svalinn/gatekeeper.yaml +COPY container/manifest.toml /app/manifest.toml + +# Create data directory for persistent storage (mountable volume) +RUN mkdir -p /data && chown appuser:appuser /data + +# Set ownership of the application directory +RUN chown -R appuser:appuser /app + +# Environment variables — customise for your application +ENV APP_HOST=[::] +ENV APP_PORT={{PORT}} +ENV APP_LOG_FORMAT=json +ENV APP_DATA_DIR=/data + +# Declare /data as a volume for persistent storage +VOLUME ["/data"] + +# Run as non-root +USER appuser + +# Expose the application port +EXPOSE {{PORT}} + +# Health check — the application must respond 2xx at /health +HEALTHCHECK --interval=30s --timeout=5s --start-period=10s --retries=3 \ + CMD curl -sf http://localhost:${APP_PORT}/health || exit 1 + +ENTRYPOINT ["/app/entrypoint.sh"] diff --git a/haskell/container/README.adoc b/haskell/container/README.adoc new file mode 100644 index 0000000..b0f1582 --- /dev/null +++ b/haskell/container/README.adoc @@ -0,0 +1,179 @@ +// SPDX-License-Identifier: CC-BY-SA-4.0 +// Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) += a2ml-haskell Container Templates +:toc: left +:toclevels: 3 +:sectnums: + +== Overview + +This directory contains container templates for the +https://github.com/hyperpolymath/stapeln[stapeln] container ecosystem. +The stapeln stack provides verified container packaging, edge gateway +policies, runtime monitoring, and supply-chain signing for Podman-based +deployments using https://www.chainguard.dev/[Chainguard] Wolfi base images. + +All files use `REMOVED` tokens that are replaced by `just container-init` +(or by the top-level `just init` during project bootstrap). + +== File Reference + +[cols="1,3"] +|=== +| File | Purpose + +| `compose.toml` +| **selur-compose** stack definition. Declares services, volumes, networks, + and health checks. The primary orchestration file for local and production + deployment. Use `selur-compose up` or fall back to `podman compose`. + +| `compose.example.toml` +| Concrete multi-service example with detailed comments. Copy and customise + for your own stack. Not used directly by any tooling. + +| `Containerfile` +| Multi-stage OCI container build specification. Stage 1 builds the + application; Stage 2 produces a minimal runtime image on + `cgr.dev/chainguard/wolfi-base`. Uses Podman (never Docker). + +| `manifest.toml` +| **cerro-torre** bundle metadata. Describes the `.ctp` verified container + package: provenance, dependencies, attestations, and runtime security + profile. Used by `ct pack` and `ct verify`. + +| `.gatekeeper.yaml` +| **svalinn** edge gateway policy. Controls authentication, rate limiting, + container trust, request validation, CORS, and audit logging at the + network boundary. + +| `ct-build.sh` +| Build, sign, and verify pipeline script. Five stages: build (Podman), + pack (cerro-torre `.ctp`), sign (Ed25519), verify, and push (optional). + Gracefully degrades when cerro-torre tools are not installed. + +| `entrypoint.sh` +| Container entrypoint with signal handling (SIGTERM, SIGINT), startup + logging, and `exec` into the main application process. + +| `vordr.toml` +| **vordr** runtime monitoring configuration. Defines health endpoints, + crash detection, resource thresholds, and log output. + +| `deploy.k9.ncl` +| **k9-svc** deployment component at Hunt trust level. Full pedigree + (L1--L5), environment configs (dev/staging/prod), container + configuration, and rolling deployment strategy. + +| `0-AI-MANIFEST.a2ml` +| AI-readable manifest describing the container directory, file + interconnections, and the stapeln ecosystem. +|=== + +== The stapeln Ecosystem + +The stapeln container ecosystem comprises six interconnected tools: + +**selur** (compose):: + Container orchestration with zero-copy IPC for co-located services. + Reads `compose.toml` files. Falls back to standard Podman Compose + when the selur driver is unavailable. + +**cerro-torre** (bundles and signing):: + Verified container packaging. Produces `.ctp` bundles from OCI images, + signs them with Ed25519, and verifies the full chain. Tools: `ct pack`, + `ct sign`, `ct verify`, `ct push`, `ct explain`. + +**svalinn** (edge gateway):: + Policy-driven reverse proxy. Enforces authentication, rate limiting, + CORS, and container trust policies defined in `.gatekeeper.yaml`. + +**vordr** (monitoring):: + Runtime container monitoring. Watches health endpoints, detects crashes, + tracks resource usage, and emits structured logs. + +**rokur** (secrets):: + Secrets management for container deployments. Injects secrets at runtime + without baking them into images. Currently a stub/placeholder. + +**k9-svc** (deployment components):: + Nickel-based deployment specification. Components declare their pedigree + (identity, target, security, validation, recipes) and execute at one of + three trust levels: Kennel (data only), Yard (evaluation), Hunt (full + execution with cryptographic handshake). + +== How to Initialise + +[source,bash] +---- +# Option 1: During project bootstrap (includes all placeholders) +just init + +# Option 2: Container-specific initialisation +just container-init +---- + +The `container-init` recipe prompts for container-specific values +(service name, port, registry) and substitutes all `REMOVED` +tokens in the `container/` directory. + +== Development Workflow + +[source,bash] +---- +# 1. Build the container image +just container-build + +# 2. Verify the compose configuration +just container-verify + +# 3. Start the stack locally +just container-up --detach + +# 4. Check logs +podman compose --file container/compose.toml logs -f + +# 5. Stop the stack +just container-down +---- + +== Production Deployment + +[source,bash] +---- +# 1. Build, sign, and verify the .ctp bundle +just container-sign + +# 2. Push the signed bundle to the registry +just container-push + +# 3. Deploy on the target host +selur-compose up --detach +---- + +For k9-svc managed deployments: + +[source,bash] +---- +# Validate the deployment component +nickel typecheck container/deploy.k9.ncl + +# Deploy (requires Hunt-level authorisation) +k9-svc deploy container/deploy.k9.ncl --env production +---- + +== Base Images + +All Containerfiles use Chainguard Wolfi base images: + +* **Builder stage:** `cgr.dev/chainguard/wolfi-base:latest` +* **Runtime stage:** `cgr.dev/chainguard/wolfi-base:latest` (or + `cgr.dev/chainguard/static:latest` for statically-linked binaries) + +Chainguard images are minimal, CVE-free, and rebuilt daily. They use the +`apk` package manager (Alpine-compatible). + +== Container Runtime + +This project uses **Podman** (never Docker). All scripts, compose files, +and documentation reference Podman commands. The OCI Containerfile format +is compatible with Podman, Docker, and nerdctl. diff --git a/haskell/container/compose.example.toml b/haskell/container/compose.example.toml new file mode 100644 index 0000000..d8d717c --- /dev/null +++ b/haskell/container/compose.example.toml @@ -0,0 +1,135 @@ +# SPDX-License-Identifier: MPL-2.0 +# +# Example selur-compose configuration — multi-service stack +# +# This is a concrete, fully-commented example showing a Rust API + Elixir +# worker + svalinn gateway deployment. Copy this file to compose.toml and +# customise for your project. +# +# Usage: +# cp compose.example.toml compose.toml +# # Edit service names, ports, images +# selur-compose up --detach + +version = "1.0" + +# ============================================================================ +# Services +# ============================================================================ + +# Rust API service — the primary HTTP/gRPC backend. +# Handles incoming requests, data storage, and core business logic. +[services.rust-api] +image = "ghcr.io/hyperpolymath/myproject-api:latest.ctp" + +# Map host port 8080 to container port 8080. +# Use ["[::]:8080:8080"] for explicit IPv6 binding. +ports = ["8080:8080"] + +# Environment variables passed into the container at startup. +# These override defaults in the Containerfile ENV directives. +environment = { + RUST_LOG = "info", # Rust log level (trace, debug, info, warn, error) + APP_HOST = "[::]", # Listen on all interfaces (IPv4 + IPv6) + APP_PORT = "8080", # Internal container port + APP_LOG_FORMAT = "json", # Structured logging for selur/vordr + APP_DATA_DIR = "/data", # Persistent data directory (matches VOLUME) +} + +# Bind-mount a named volume for persistent data. +# Format: "volume-name:/container/path" +volumes = ["api-data:/data"] + +# Restart policy: "always" ensures the service comes back after crashes. +# Other options: "no", "on-failure", "unless-stopped" +restart = "always" + +# Health check: selur/Podman uses this to determine if the service is ready. +# The service must respond 2xx to this endpoint within the timeout. +healthcheck = { test = "curl -sf http://localhost:8080/health", interval = "30s", timeout = "5s", retries = 3 } + +# --- + +# Elixir worker service — background processing, event handling, coordination. +# Runs as an OTP release with supervision trees for fault tolerance. +[services.elixir-worker] +image = "ghcr.io/hyperpolymath/myproject-worker:latest.ctp" + +# Separate port for the worker's admin/metrics endpoint. +ports = ["4000:4000"] + +# The worker connects to the Rust API over the internal selur network. +# Service names resolve as hostnames within the compose network. +environment = { + API_URL = "http://rust-api:8080/api/v1", # Internal service discovery + MIX_ENV = "prod", # Elixir release mode + APP_LOG_FORMAT = "json", # Match structured logging format + POOL_SIZE = "10", # DB connection pool size +} + +# depends_on ensures the Rust API starts before the worker. +# Note: This only waits for the container to start, not for the health check. +# Use healthcheck + startup probes for true readiness gating. +depends_on = ["rust-api"] + +restart = "always" +healthcheck = { test = "curl -sf http://localhost:4000/health", interval = "30s", timeout = "5s", retries = 3 } + +# --- + +# Svalinn edge gateway — reverse proxy with policy enforcement. +# All external traffic enters through svalinn, which: +# 1. Terminates TLS (auto-provisioned certificates) +# 2. Validates JWT/OAuth2 authentication +# 3. Enforces rate limits from .gatekeeper.yaml +# 4. Routes requests to the appropriate backend service +# 5. Logs all write operations for audit +[services.svalinn] +image = "ghcr.io/hyperpolymath/svalinn:latest.ctp" + +# External-facing ports: HTTPS (443) and HTTP->HTTPS redirect (80). +ports = ["443:443", "80:80"] + +environment = { + # Backend routing: svalinn proxies to internal services. + SVALINN_BACKEND = "http://rust-api:8080", + SVALINN_WORKER_BACKEND = "http://elixir-worker:4000", + + # Policy file: mounted from the svalinn-config volume. + SVALINN_POLICY_FILE = "/etc/svalinn/gatekeeper.yaml", + + # Auto-provision TLS certificates (Let's Encrypt). + SVALINN_TLS_AUTO = "true", +} + +# Mount .gatekeeper.yaml as read-only policy configuration. +volumes = ["svalinn-config:/etc/svalinn:ro"] + +# Svalinn starts last — it needs both backends to be running. +depends_on = ["rust-api", "elixir-worker"] +restart = "always" +healthcheck = { test = "curl -sf http://localhost:80/health", interval = "30s", timeout = "5s", retries = 3 } + +# ============================================================================ +# Volumes +# ============================================================================ + +# Persistent storage for the Rust API (database files, indexes, WAL). +[volumes.api-data] +driver = "local" + +# Read-only policy configuration for svalinn gateway. +# Populate with: cp .gatekeeper.yaml /path/to/svalinn-config/gatekeeper.yaml +[volumes.svalinn-config] +driver = "local" + +# ============================================================================ +# Networks +# ============================================================================ + +# selur network: zero-copy IPC between services on the same host. +# When the selur driver is not installed, falls back to standard bridge +# networking (TCP over localhost). Performance is slightly lower but +# functionality is identical. +[networks.default] +driver = "selur" diff --git a/haskell/container/compose.toml b/haskell/container/compose.toml new file mode 100644 index 0000000..cc9e428 --- /dev/null +++ b/haskell/container/compose.toml @@ -0,0 +1,70 @@ +# SPDX-License-Identifier: MPL-2.0 +# +# a2ml-haskell selur-compose configuration +# +# Orchestrates the container stack as verified container bundles (.ctp). +# Uses selur zero-copy IPC between services on the same host. +# +# Usage: +# selur-compose up # Start all services +# selur-compose up --detach # Start in background +# selur-compose verify # Verify all .ctp signatures +# selur-compose ps # Check status +# selur-compose logs -f {{SERVICE_NAME}} # Stream logs +# selur-compose down # Stop all services +# +# Fallback (when selur is not installed): +# podman compose --file compose.toml up --detach + +version = "1.0" + +# ============================================================================ +# Services +# ============================================================================ + +# Primary application service +[services.{{SERVICE_NAME}}] +image = "{{REGISTRY}}/{{SERVICE_NAME}}:latest.ctp" +ports = ["{{PORT}}:{{PORT}}"] +environment = { + APP_HOST = "[::]", + APP_PORT = "{{PORT}}", + APP_LOG_FORMAT = "json", + APP_DATA_DIR = "/data", +} +volumes = ["{{SERVICE_NAME}}-data:/data"] +restart = "always" +healthcheck = { test = "curl -sf http://localhost:{{PORT}}/health", interval = "30s", timeout = "5s", retries = 3 } + +# Svalinn edge gateway: validates requests, enforces policies, TLS termination +[services.svalinn] +image = "ghcr.io/hyperpolymath/svalinn:latest.ctp" +ports = ["443:443", "80:80"] +environment = { + SVALINN_BACKEND = "http://{{SERVICE_NAME}}:{{PORT}}", + SVALINN_POLICY_FILE = "/etc/svalinn/gatekeeper.yaml", + SVALINN_TLS_AUTO = "true", +} +volumes = ["svalinn-config:/etc/svalinn:ro"] +depends_on = ["{{SERVICE_NAME}}"] +restart = "always" +healthcheck = { test = "curl -sf http://localhost:80/health", interval = "30s", timeout = "5s", retries = 3 } + +# ============================================================================ +# Volumes +# ============================================================================ + +[volumes.{{SERVICE_NAME}}-data] +driver = "local" + +[volumes.svalinn-config] +driver = "local" + +# ============================================================================ +# Networks +# ============================================================================ + +# Use selur zero-copy IPC for inter-service communication on the same host. +# Falls back to standard bridge networking when selur driver is unavailable. +[networks.default] +driver = "selur" diff --git a/haskell/container/ct-build.sh b/haskell/container/ct-build.sh new file mode 100755 index 0000000..5a8b4bc --- /dev/null +++ b/haskell/container/ct-build.sh @@ -0,0 +1,162 @@ +#!/usr/bin/env bash +# SPDX-License-Identifier: MPL-2.0 +# +# a2ml-haskell — Cerro Torre build, sign, and verify pipeline +# +# Builds the container image, packages it as a verified .ctp bundle, +# signs it with Ed25519, and verifies the result. Gracefully degrades +# when cerro-torre tools are not installed. +# +# Prerequisites: +# - podman (container build — required) +# - ct (cerro-torre CLI: pack, sign, verify — optional) +# - cerro-sign (Ed25519 signing — optional, ct sign used as fallback) +# +# Usage: +# ./ct-build.sh # Build + sign (local only) +# ./ct-build.sh --push # Build + sign + push to registry +# CT_KEY_ID=my-key ./ct-build.sh # Use specific signing key +# +# Environment variables: +# CT_KEY_ID — Signing key identifier (default: {{SERVICE_NAME}}-release) +# CT_REGISTRY — OCI registry to push to (default: {{REGISTRY}}) +# CT_TAG — Image tag (default: latest) + +set -euo pipefail + +# --------------------------------------------------------------------------- +# Configuration +# --------------------------------------------------------------------------- + +SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" +REPO_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)" + +PUSH="" +for arg in "$@"; do + if [ "$arg" = "--push" ]; then + PUSH="--push" + fi +done + +CT_KEY_ID="${CT_KEY_ID:-{{SERVICE_NAME}}-release}" +CT_REGISTRY="${CT_REGISTRY:-{{REGISTRY}}}" +CT_TAG="${CT_TAG:-latest}" + +IMAGE_NAME="{{SERVICE_NAME}}" +FULL_IMAGE="${CT_REGISTRY}/${IMAGE_NAME}:${CT_TAG}" +CTP_FILE="${SCRIPT_DIR}/${IMAGE_NAME}-${CT_TAG}.ctp" + +echo "=== a2ml-haskell Cerro Torre Build Pipeline ===" +echo " Image: ${FULL_IMAGE}" +echo " Key: ${CT_KEY_ID}" +echo " Bundle: ${CTP_FILE}" +echo "" + +# --------------------------------------------------------------------------- +# Step 1: Build container image with Podman +# --------------------------------------------------------------------------- + +echo "--- Step 1: Building container image ---" + +podman build \ + -t "${FULL_IMAGE}" \ + -f "${SCRIPT_DIR}/Containerfile" \ + "${REPO_ROOT}" + +echo " Built: ${FULL_IMAGE}" +echo "" + +# --------------------------------------------------------------------------- +# Step 2: Pack into .ctp bundle +# --------------------------------------------------------------------------- + +echo "--- Step 2: Packing into .ctp bundle ---" + +if command -v ct &>/dev/null; then + ct pack "${FULL_IMAGE}" -o "${CTP_FILE}" + echo " Packed: ${CTP_FILE}" +else + echo " SKIP: ct not found (install cerro-torre CLI from stapeln/container-stack/cerro-torre)" + echo " The container image is built and tagged but not packed as a .ctp bundle." + echo " To pack manually: ct pack ${FULL_IMAGE} -o ${CTP_FILE}" + echo "" + if [ "$PUSH" = "--push" ]; then + echo "--- Pushing unsigned OCI image (no .ctp) ---" + podman push "${FULL_IMAGE}" + echo " Pushed: ${FULL_IMAGE} (unsigned OCI — not a .ctp bundle)" + fi + echo "" + echo "=== Build complete (without .ctp signing) ===" + exit 0 +fi + +echo "" + +# --------------------------------------------------------------------------- +# Step 3: Sign the .ctp bundle +# --------------------------------------------------------------------------- + +echo "--- Step 3: Signing .ctp bundle ---" + +if command -v cerro-sign &>/dev/null; then + cerro-sign sign "${CTP_FILE}" --key-id "${CT_KEY_ID}" + echo " Signed: ${CTP_FILE} (key: ${CT_KEY_ID})" +elif command -v ct &>/dev/null; then + ct sign "${CTP_FILE}" --key "${CT_KEY_ID}" + echo " Signed: ${CTP_FILE} (key: ${CT_KEY_ID})" +else + echo " SKIP: cerro-sign not found (install from stapeln/container-stack/cerro-torre)" +fi + +echo "" + +# --------------------------------------------------------------------------- +# Step 4: Verify the .ctp bundle +# --------------------------------------------------------------------------- + +echo "--- Step 4: Verifying .ctp bundle ---" + +if command -v ct &>/dev/null; then + ct verify "${CTP_FILE}" + echo " Verified: ${CTP_FILE}" +else + echo " SKIP: ct not found" +fi + +echo "" + +# --------------------------------------------------------------------------- +# Step 5: Push to registry (optional) +# --------------------------------------------------------------------------- + +if [ "$PUSH" = "--push" ]; then + echo "--- Step 5: Pushing to registry ---" + + if command -v ct &>/dev/null; then + ct push "${CTP_FILE}" "${FULL_IMAGE}" + echo " Pushed: ${FULL_IMAGE}" + else + # Fall back to podman push (unsigned OCI image) + echo " ct not available, falling back to podman push (unsigned)" + podman push "${FULL_IMAGE}" + echo " Pushed: ${FULL_IMAGE} (unsigned OCI — not a .ctp bundle)" + fi + echo "" +fi + +# --------------------------------------------------------------------------- +# Summary +# --------------------------------------------------------------------------- + +echo "=== Build pipeline complete ===" +echo " Image: ${FULL_IMAGE}" +echo " Bundle: ${CTP_FILE}" +echo "" +echo " To deploy with selur-compose:" +echo " cd container && selur-compose up" +echo "" +echo " To verify at any time:" +echo " ct verify ${CTP_FILE}" +echo "" +echo " To explain the verification chain:" +echo " ct explain ${CTP_FILE}" diff --git a/haskell/container/deploy.k9.ncl b/haskell/container/deploy.k9.ncl new file mode 100644 index 0000000..281bc29 --- /dev/null +++ b/haskell/container/deploy.k9.ncl @@ -0,0 +1,166 @@ +# SPDX-License-Identifier: MPL-2.0 +# deploy.k9.ncl — a2ml-haskell deployment component (Hunt level) +# +# k9-svc deployment specification with full pedigree (L1-L5). +# Security Level: 'Hunt (requires cryptographic handshake for execution). +# +# WARNING: This component can execute shell commands! +# It requires explicit authorisation via the Leash system. +# +# Usage: +# nickel typecheck container/deploy.k9.ncl +# k9-svc validate container/deploy.k9.ncl +# k9-svc deploy container/deploy.k9.ncl --env production + +# The component's pedigree (self-description across five layers) +let component_pedigree = { + # ───────────────────────────────────────────────────────────── + # L1: The Snout — Identity + # ───────────────────────────────────────────────────────────── + metadata = { + name = "{{SERVICE_NAME}}-deploy", + version = "{{VERSION}}", + breed = "application/vnd.k9+nickel", + magic_number = "K9!", + description = "a2ml-haskell deployment component (Hunt level)", + }, + + # ───────────────────────────────────────────────────────────── + # L2: The Scent — Target Environment + # ───────────────────────────────────────────────────────────── + target = { + os = 'Linux, + is_edge = false, + requires_podman = true, + min_memory_mb = 256, + }, + + # ───────────────────────────────────────────────────────────── + # L3: The Leash — Security + # ───────────────────────────────────────────────────────────── + security = { + trust_level = 'Hunt, + allow_network = true, + allow_filesystem_write = true, + allow_subprocess = true, + # In production, replace with a real Ed25519 signature. + signature = "PLACEHOLDER-SIGNATURE-REQUIRED-FOR-HUNT", + }, + + # ───────────────────────────────────────────────────────────── + # L4: The Gut — Self-Validation + # ───────────────────────────────────────────────────────────── + validation = { + checksum = "sha256:placeholder", + pedigree_version = "1.0.0", + hunt_authorized = false, # Must be set true after handshake + }, + + # ───────────────────────────────────────────────────────────── + # L5: The Muscle — Deployment Recipes + # ───────────────────────────────────────────────────────────── + recipes = { + install = "just container-build", + validate = "just container-verify", + deploy = "just container-up", + migrate = "just container-build && just container-up", + }, +} in + +# Deployment configuration +let deployment = { + # Target environments (dev / staging / production) + environments = { + dev = { + replicas = 1, + memory = "256Mi", + cpu = "100m", + image_tag = "dev", + }, + staging = { + replicas = 2, + memory = "512Mi", + cpu = "250m", + image_tag = "staging", + }, + production = { + replicas = 3, + memory = "1Gi", + cpu = "500m", + image_tag = "latest", + }, + }, + + # Container configuration + container = { + image = "{{REGISTRY}}/{{SERVICE_NAME}}", + port = {{PORT}}, + health_check = "/health", + readiness_check = "/ready", + }, + + # Deployment strategy + strategy = { + type = "rolling", + max_surge = 1, + max_unavailable = 0, + }, +} in + +# Deployment scripts (executed at Hunt level) +let scripts = { + # Pre-deployment validation + pre_deploy = m%" +#!/bin/sh +set -eu +echo "K9: Pre-deployment validation for {{SERVICE_NAME}}..." +cd container && selur-compose verify || podman compose --file compose.toml config +echo "K9: Validation passed." +"%, + + # Deployment script + deploy = m%" +#!/bin/sh +set -eu +ENV="${1:-dev}" +echo "K9: Deploying {{SERVICE_NAME}} to $ENV environment..." +cd container +./ct-build.sh +selur-compose up --detach || podman compose --file compose.toml up --detach +echo "K9: Deployment to $ENV complete." +"%, + + # Rollback script + rollback = m%" +#!/bin/sh +set -eu +echo "K9: Rolling back {{SERVICE_NAME}} deployment..." +cd container +selur-compose down || podman compose --file compose.toml down +echo "K9: Rollback complete." +"%, +} in + +# Export the component +{ + pedigree = component_pedigree, + deployment = deployment, + scripts = scripts, + + # Security check: this component requires Hunt level + required_level = 'Hunt, + + # Warning for users + warning = m%" +WARNING: This is a Hunt-level component. + +It can execute shell commands and modify your system. +Before running, ensure you have: + +1. Reviewed the deployment scripts above +2. Verified the signature (when implemented) +3. Explicitly authorised Hunt-level execution + +Run with: k9-svc authorize container/deploy.k9.ncl && k9-svc deploy container/deploy.k9.ncl +"%, +} diff --git a/haskell/container/entrypoint.sh b/haskell/container/entrypoint.sh new file mode 100755 index 0000000..d50ee7a --- /dev/null +++ b/haskell/container/entrypoint.sh @@ -0,0 +1,63 @@ +#!/bin/sh +# SPDX-License-Identifier: MPL-2.0 +# a2ml-haskell container entrypoint +# +# Handles signal propagation, startup logging, and health check +# preparation before exec-ing into the main application process. + +set -e + +# --------------------------------------------------------------------------- +# Signal handling +# --------------------------------------------------------------------------- +# +# Trap SIGTERM and SIGINT so that the application can shut down gracefully +# when Podman sends stop signals (e.g. `podman stop`, `selur-compose down`). + +cleanup() { + echo "Received shutdown signal — stopping {{SERVICE_NAME}}..." + # If the main process is backgrounded, kill it here: + # kill "$MAIN_PID" 2>/dev/null || true + # wait "$MAIN_PID" 2>/dev/null || true + exit 0 +} +trap cleanup TERM INT + +# --------------------------------------------------------------------------- +# Startup logging +# --------------------------------------------------------------------------- + +echo "Starting {{SERVICE_NAME}}..." +echo " Host: ${APP_HOST:-[::]}" +echo " Port: ${APP_PORT:-{{PORT}}}" +echo " Data: ${APP_DATA_DIR:-/data}" +echo " Log: ${APP_LOG_FORMAT:-json}" + +# --------------------------------------------------------------------------- +# Health check preparation +# --------------------------------------------------------------------------- +# +# Ensure the data directory exists and is writable. +# The VOLUME directive in the Containerfile creates /data, but a bind-mount +# might replace it with an empty directory owned by root. + +if [ -d "${APP_DATA_DIR:-/data}" ]; then + if [ ! -w "${APP_DATA_DIR:-/data}" ]; then + echo "WARNING: ${APP_DATA_DIR:-/data} is not writable by $(whoami)" + fi +fi + +# --------------------------------------------------------------------------- +# Exec into main process +# --------------------------------------------------------------------------- +# +# Replace the entrypoint shell with the application process so that +# signals are delivered directly and PID 1 is the application. +# +# TODO: Replace the command below with your application binary. +# Examples: +# exec /app/{{SERVICE_NAME}} +# exec /app/release/bin/{{SERVICE_NAME}} start +# exec /app/{{SERVICE_NAME}} serve --host "${APP_HOST}" --port "${APP_PORT}" + +exec "$@" diff --git a/haskell/container/manifest.toml b/haskell/container/manifest.toml new file mode 100644 index 0000000..a8c9e77 --- /dev/null +++ b/haskell/container/manifest.toml @@ -0,0 +1,62 @@ +# SPDX-License-Identifier: MPL-2.0 +# +# Cerro Torre manifest for a2ml-haskell .ctp bundle +# +# This manifest describes the container image for verified +# container packaging. Used by `ct pack` to create .ctp bundles. + +[metadata] +name = "{{SERVICE_NAME}}" +version = "{{VERSION}}" +revision = 1 +summary = "a2ml-haskell" +description = """ +a2ml-haskell — containerised service packaged as a verified +cerro-torre .ctp bundle with Ed25519 signing and full provenance +tracking. +""" +license = "MPL-2.0" +homepage = "https://github.com/hyperpolymath/a2ml-haskell" +maintainer = "Jonathan D.A. Jewell <{{EMAIL}}>" + +[provenance] +upstream = "https://github.com/hyperpolymath/a2ml-haskell" +import_date = 2026-07-08T00:00:00Z + +[dependencies] +runtime = ["ca-certificates", "curl"] +build = [] + +[build] +system = "podman" + +[build.environment] +APP_HOST = "[::]" +APP_PORT = "{{PORT}}" + +[outputs] +primary = "{{SERVICE_NAME}}" +split = [] + +[attestations] +require = ["source-signature", "sbom-complete"] +recommend = ["security-audit", "reproducible-build"] + +# Runtime security profile +[security] +user = "appuser" +group = "appuser" +read_only_root = false +no_new_privileges = true + +[security.capabilities] +drop = ["ALL"] +add = ["NET_BIND_SERVICE"] + +[security.network] +listen_tcp = [{{PORT}}] + +[security.filesystem] +read = ["/app/", "/data/"] +write = ["/data/", "/tmp/"] +execute = ["/app/entrypoint.sh"] diff --git a/haskell/container/vordr.toml b/haskell/container/vordr.toml new file mode 100644 index 0000000..eb24b88 --- /dev/null +++ b/haskell/container/vordr.toml @@ -0,0 +1,100 @@ +# SPDX-License-Identifier: MPL-2.0 +# +# Vordr runtime monitoring configuration for a2ml-haskell +# +# Vordr watches container health, detects crashes, tracks resource usage, +# and emits structured logs. It runs alongside the application stack and +# provides runtime observability without requiring in-process agents. +# +# Usage: +# vordr watch --config container/vordr.toml +# vordr status +# vordr report + +[metadata] +name = "{{SERVICE_NAME}}" +version = "{{VERSION}}" + +# ============================================================================ +# Health Monitoring +# ============================================================================ +# +# Vordr periodically probes these endpoints. If a probe fails beyond the +# failure_threshold, vordr emits an alert and (optionally) restarts the +# container via Podman. + +[health] +# Primary health endpoint — must return 2xx. +endpoint = "http://localhost:{{PORT}}/health" +interval = "30s" +timeout = "5s" +failure_threshold = 3 + +# Readiness endpoint — checked during startup and after restarts. +readiness_endpoint = "http://localhost:{{PORT}}/ready" +readiness_timeout = "10s" + +# Action on failure: "alert" (log + notify) or "restart" (alert + podman restart). +on_failure = "alert" + +# ============================================================================ +# Crash Detection +# ============================================================================ +# +# Monitors container state via Podman. Detects OOM kills, segfaults, +# and unexpected exits. + +[crash_detection] +enabled = true +# Maximum restarts within the window before vordr stops restarting. +max_restarts = 5 +restart_window = "10m" + +# ============================================================================ +# Resource Thresholds +# ============================================================================ +# +# Alert when resource usage exceeds these thresholds. Values are percentages +# of the container's cgroup limits (or host limits if uncapped). + +[resources] +cpu_warn = 80 # Percentage — warn at 80% sustained CPU. +cpu_critical = 95 # Percentage — critical alert at 95%. +memory_warn = 75 # Percentage of memory limit. +memory_critical = 90 +disk_warn = 80 # Percentage of volume usage. +disk_critical = 95 + +# Sample interval for resource metrics. +sample_interval = "15s" + +# ============================================================================ +# Log Output +# ============================================================================ +# +# Vordr emits its own logs (not the application's) in structured format. + +[logging] +format = "json" +level = "info" +# Write vordr logs to stdout (captured by Podman) and optionally to file. +output = "stdout" +# file = "/var/log/vordr/{{SERVICE_NAME}}.log" + +# ============================================================================ +# Notifications (optional) +# ============================================================================ +# +# Uncomment and configure to receive alerts via webhook or email. + +# [notifications.webhook] +# url = "https://example.com/hooks/vordr" +# method = "POST" +# headers = { "Content-Type" = "application/json" } +# on = ["failure", "recovery", "resource_critical"] + +# [notifications.email] +# to = "{{EMAIL}}" +# from = "vordr@{{SERVICE_NAME}}.local" +# smtp = "smtp://localhost:25" +# on = ["failure", "resource_critical"] diff --git a/haskell/contractile.just b/haskell/contractile.just new file mode 100644 index 0000000..9a5827b --- /dev/null +++ b/haskell/contractile.just @@ -0,0 +1,75 @@ +# Auto-generated by: contractile gen-just +# Source directory: contractiles +# Re-generate with: contractile gen-just --dir contractiles +# +# SPDX-License-Identifier: MPL-2.0 + +# === DUST (Recovery & Rollback) === +# Source: Dustfile.a2ml + +# List available dust recovery actions +dust-status: + @echo ' dust-source-rollback: Revert all source changes to last commit [rollback]' + +# Revert all source changes to last commit +dust-source-rollback: + @echo 'Executing rollback for source-rollback' + git checkout HEAD -- . + + +# === INTEND (Declared Future Intent) === +# Source: Intentfile.a2ml + +# Display declared future intents +intend-list: + @echo '=== Declared Intent ===' + @echo '' + @echo 'Features:' + @echo '' + @echo 'Quality:' + + +# === MUST (Physical State Checks) === +# Source: Mustfile.a2ml + +# Run all must checks +must-check: must-license-present must-readme-present must-spdx-headers must-no-banned-files + @echo 'All must checks passed' + +# LICENSE file must exist +must-license-present: + test -f LICENSE + +# README must exist +must-readme-present: + test -f README.adoc || test -f README.md + +# Source files should have SPDX license headers +must-spdx-headers: + find . -name '*.rs' -o -name '*.res' -o -name '*.gleam' | head -20 | xargs -r grep -L 'SPDX-License-Identifier' | wc -l | grep -q '^0$' + +# No Dockerfiles or Makefiles +must-no-banned-files: + test ! -f Dockerfile && test ! -f Makefile + + +# === TRUST (Integrity & Provenance Verification) === +# Source: Trustfile.a2ml + +# Run all trust verifications +trust-verify: trust-license-content trust-no-secrets-committed trust-container-images-pinned + @echo 'All trust verifications passed' + +# LICENSE contains expected SPDX identifier +trust-license-content: + grep -q 'SPDX\|License\|MIT\|Apache\|PMPL\|MPL' LICENSE + +# No .env or credential files in repo +trust-no-secrets-committed: + test ! -f .env && test ! -f credentials.json && test ! -f .env.local + +# Containerfile base images use pinned digests +trust-container-images-pinned: + test ! -f Containerfile || grep -q '@sha256:' Containerfile + + diff --git a/haskell/contractiles/intend/Intentfile.a2ml b/haskell/contractiles/intend/Intentfile.a2ml new file mode 100644 index 0000000..29716dd --- /dev/null +++ b/haskell/contractiles/intend/Intentfile.a2ml @@ -0,0 +1,22 @@ +# SPDX-License-Identifier: MPL-2.0 +# Intentfile (A2ML Canonical) +# Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) + +@abstract: +Declared intent and purpose for A2Ml Haskell. +@end + +## Purpose + +A2Ml Haskell — **AI-Assisted Install:** Just tell any AI assistant: + + +## Anti-Purpose + +This project is NOT: +- A fork or wrapper around another tool +- A monorepo (unless explicitly structured as one) + +## If In Doubt + +If you are unsure whether a change is in scope, ask. +Sensitive areas: ABI definitions, license headers, CI workflows. diff --git a/haskell/contractiles/must/Mustfile.a2ml b/haskell/contractiles/must/Mustfile.a2ml new file mode 100644 index 0000000..2a32467 --- /dev/null +++ b/haskell/contractiles/must/Mustfile.a2ml @@ -0,0 +1,42 @@ +# SPDX-License-Identifier: MPL-2.0 +# Mustfile (A2ML Canonical) +# Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) + +@abstract: +Physical State contract for A2Ml Haskell. Baseline UX Manifesto invariants +that MUST hold at all times. +@end + +@requires: +- section: Core-Files +- section: Banned +@end + +## Core-Files + +### license-present +- description: LICENSE file must exist +- run: test -f LICENSE +- severity: critical + +### readme-present +- description: README must exist +- run: test -f README.adoc || test -f README.md +- severity: critical + +## Banned + +### no-hardcoded-paths +- description: No hardcoded developer paths +- run: "! grep -rn '$HOME\|$ECLIPSE_DIR' --include='*.rs' --include='*.res' --include='*.ex' --include='*.gleam' --include='*.zig' --include='*.sh' . 2>/dev/null | grep -v '.git/' | grep -v 'ux-rollout.jl' | head -1" +- severity: critical + +### no-dockerfiles +- description: No Dockerfiles (use Containerfile) +- run: test ! -f Dockerfile +- severity: warning + +### no-makefiles +- description: No Makefiles (use Justfile) +- run: test ! -f Makefile +- severity: warning diff --git a/haskell/contractiles/trust/Trustfile.a2ml b/haskell/contractiles/trust/Trustfile.a2ml new file mode 100644 index 0000000..4cacef6 --- /dev/null +++ b/haskell/contractiles/trust/Trustfile.a2ml @@ -0,0 +1,25 @@ +# SPDX-License-Identifier: MPL-2.0 +# Trustfile (A2ML Canonical) +# Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) + +@abstract: +Trust and provenance verification for A2Ml Haskell. +Maximal trust by default — LLM may read, build, test, lint, format. +@end + +@trust-level: maximal +@trust-boundary: repo +@trust-actions: [read, build, test, lint, format] +@trust-deny: [delete-branch, force-push, modify-ci-secrets, publish] + +## Integrity + +### license-content +- description: LICENSE contains expected SPDX identifier +- run: grep -q 'SPDX\|License\|MIT\|Apache\|PMPL\|MPL' LICENSE +- severity: critical + +### no-secrets-committed +- description: No .env or credential files in repo +- run: test ! -f .env && test ! -f credentials.json && test ! -f .env.local +- severity: critical diff --git a/haskell/docs/0.1-AI-MANIFEST.a2ml b/haskell/docs/0.1-AI-MANIFEST.a2ml new file mode 100644 index 0000000..7f79301 --- /dev/null +++ b/haskell/docs/0.1-AI-MANIFEST.a2ml @@ -0,0 +1,33 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "docs-pillar" +level: 1 +parent: "../0-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Technical documentation hub. The root contains high-level orientation + (README, Quickstart, State-Visualizer). Specialized tracks live in + subdirectories. + +canonical_locations: + quickstart: "QUICKSTART.adoc" + state_visualizer: "STATE-VISUALIZER.adoc" + governance: "governance/" + architecture: "architecture/" + decisions: "decisions/" + theory: "theory/" + practice: "practice/" + developer: "developer/" + attribution: "attribution/" + reports: "reports/" + whitepapers: "whitepapers/" + standards: "standards/" + legal: "legal/" + wikis: "wikis/" + +invariants: + - "Primary documentation format MUST be AsciiDoc (.adoc)" + - "Root docs/ MUST only contain pillar entry points" diff --git a/haskell/docs/QUICKSTART.adoc b/haskell/docs/QUICKSTART.adoc new file mode 100644 index 0000000..b20b3d0 --- /dev/null +++ b/haskell/docs/QUICKSTART.adoc @@ -0,0 +1,24 @@ += Quickstart +:toc: preamble + +Get up and running in 60 seconds. + +== Prerequisites + +* Git 2.40+ +* just (command runner) +* Your language toolchain (see Justfile for details) + +== From Template (New Project) + +[source,bash] +---- +git clone https://github.com/hyperpolymath/rsr-template-repo my-project +cd my-project +rm -rf .git && git init -b main +just init # interactive placeholder replacement +---- + +== Project Structure + +See README.adoc in the root for the Dual-Track architecture summary. diff --git a/haskell/docs/README.adoc b/haskell/docs/README.adoc new file mode 100644 index 0000000..df45be7 --- /dev/null +++ b/haskell/docs/README.adoc @@ -0,0 +1,14 @@ += Documentation Layout + +Primary tracks: + +* `theory/` for formal and conceptual material +* `practice/` for operational and implementation material +* `maintenance/` for baseline checklists and release hard-pass runbooks +* `whitepapers/academic/` for research-facing whitepapers +* `whitepapers/industry/` for industry/outreach whitepapers + +Core docs: + +* `maintenance/MAINTENANCE-CHECKLIST.md` +* `practice/SOFTWARE-DEVELOPMENT-APPROACH.adoc` diff --git a/haskell/docs/RSR_OUTLINE.adoc b/haskell/docs/RSR_OUTLINE.adoc new file mode 100644 index 0000000..0e46ef6 --- /dev/null +++ b/haskell/docs/RSR_OUTLINE.adoc @@ -0,0 +1,290 @@ += RSR Template Repository + +image:[MPL-2.0,link="https://github.com/hyperpolymath/palimpsest-license"] image:[Palimpsest,link="https://github.com/hyperpolymath/palimpsest-license"] +:toc: +:sectnums: + +// Badges +image:https://img.shields.io/badge/RSR-Infrastructure-cd7f32[RSR Infrastructure] +image:https://img.shields.io/badge/Phase-Maintenance-brightgreen[Phase] +image:https://img.shields.io/badge/Guix-Primary-purple?logo=gnu[Guix] + +== Overview + +**The canonical template for RSR (Rhodium Standard Repository) projects.** + +This repository provides the standardized structure, configuration, and tooling for all RSR-compliant repos. Use it to: + +* Bootstrap new projects with RSR compliance +* Reference the standard directory structure +* Copy configuration templates (Justfile, STATE.a2ml, etc.) + +== Quick Start + +[source,bash] +---- +# Clone the template +git clone https://github.com/hyperpolymath/RSR-template-repo my-project +cd my-project + +# Remove template git history +rm -rf .git +git init + +# Interactive bootstrap — replaces all placeholders +just init + +# Enter development environment +guix shell -D -f guix.scm + +# Validate compliance +just validate-rsr +---- + +== What's Included + +[cols="1,3"] +|=== +|File/Directory |Purpose + +|`.editorconfig` +|Editor configuration (indent, charset) + +|`.gitignore` +|Standard ignore patterns + +|`.gitattributes` +|Line endings, diff drivers, binary detection + +|`.guix-channel` +|Guix channel definition + +|`.well-known/` +|RFC-compliant metadata (security.txt, ai.txt, humans.txt) + +|`.machine_readable/` +|All machine-readable content: state files (6 a2ml), `bot_directives/`, `contractiles/` + +|`docs/` +|Documentation directory + +|`guix.scm` +|Guix package definition + +|`Justfile` +|Task runner with 40+ recipes + +|`Containerfile` +|Container build (Wolfi base, Podman) + +|`LICENSE` +|MPL-2.0 + +|`EXHIBIT-A-ETHICAL-USE.txt` +|Ethical use guidelines (LICENSE Exhibit A) + +|`EXHIBIT-B-QUANTUM-SAFE.txt` +|Quantum-safe provenance spec (LICENSE Exhibit B) + +|`README.adoc` +|Project overview + +|`TOPOLOGY.md` +|Architecture diagram and completion dashboard + +|`PLACEHOLDERS.md` +|Template variable reference and replacement guide + +|`0-AI-MANIFEST.a2ml` +|Universal AI agent entry point + +|`AI.a2ml` +|Claude-specific instructions + +|`src/abi/` +|Idris2 ABI definitions (Types, Layout, Foreign) + +|`ffi/zig/` +|Zig FFI implementation + +|`generated/abi/` +|Auto-generated C headers from Idris2 ABI +|=== + +== Justfile Features + +The template Justfile provides: + +* **Combinatoric matrix recipes** for build, test, container, CI +* **Cookbook generation**: `just cookbook` -> `docs/just-cookbook.adoc` +* **Man page generation**: `just man` -> `docs/man/project.1` +* **RSR validation**: `just validate-rsr` +* **STATE.a2ml management**: `just state-touch`, `just state-phase` +* **Container support**: `just container-build`, `just container-push` +* **CI matrix**: `just ci-matrix [stage] [depth]` + +=== Key Recipes + +[source,bash] +---- +just # Show all recipes +just help # Detailed help +just info # Project info +just combinations # Show matrix options + +just build # Build (debug) +just test # Run tests +just quality # Format + lint + test +just ci # Full CI pipeline + +just validate # RSR + STATE validation +just docs # Generate all docs +just cookbook # Generate Justfile docs + +just guix-shell # Guix dev environment +just container-build # Build container +---- + +== Directory Structure + +[source] +---- +project/ +├── .editorconfig # Editor settings +├── .gitignore # Git ignore +├── .gitattributes # Line endings, diff drivers +├── .guix-channel # Guix channel +├── .well-known/ # RFC metadata +│ ├── ai.txt +│ ├── humans.txt +│ └── security.txt +├── .machine_readable/ # ALL machine-readable content +│ ├── STATE.a2ml # Project state, progress, blockers +│ ├── META.a2ml # Architecture decisions, governance +│ ├── ECOSYSTEM.a2ml # Ecosystem position, relationships +│ ├── AGENTIC.a2ml # AI agent interaction patterns +│ ├── NEUROSYM.a2ml # Neurosymbolic integration config +│ ├── PLAYBOOK.a2ml # Operational runbook +│ ├── bot_directives/ # Per-bot rules and constraints +│ └── contractiles/ # Policy enforcement contracts +│ ├── k9/ # Security levels (Kennel/Yard/Hunt) +│ ├── dust/Dustfile # Recovery and rollback +│ ├── lust/Intentfile # Future intent declarations +│ ├── must/Mustfile # Invariant checks +│ └── trust/Trustfile.hs # Cryptographic verification +├── docs/ # Documentation +│ ├── CITATIONS.adoc +│ ├── TOPOLOGY-GUIDE.adoc +│ ├── generated/ +│ └── man/ +├── src/abi/ # Idris2 ABI definitions +│ ├── Types.idr +│ ├── Layout.idr +│ └── Foreign.idr +├── ffi/zig/ # Zig FFI implementation +│ ├── build.zig +│ ├── src/main.zig +│ └── test/integration_test.zig +├── generated/abi/ # Auto-generated C headers +├── examples/ # Example code +├── guix.scm # Guix package +├── Justfile # Task runner +├── Containerfile # Container build +├── LICENSE # MPL-2.0 +├── EXHIBIT-A-ETHICAL-USE.txt # Ethical use guidelines +├── EXHIBIT-B-QUANTUM-SAFE.txt # Quantum-safe provenance +├── README.adoc # Overview +├── TOPOLOGY.md # Architecture + completion +├── PLACEHOLDERS.md # Template variable guide +├── 0-AI-MANIFEST.a2ml # Universal AI entry point +└── AI.a2ml # Claude-specific instructions +---- + +== RSR Compliance + +=== Language Tiers + +* **Tier 1** (Gold): Rust, Elixir, Zig, Ada, Haskell, ReScript, Gleam +* **Tier 2** (Silver): Nickel, Guile Scheme, Nix, Idris2, OCaml +* **Infrastructure**: Guix channels, derivations, Julia batch scripts + +=== Required Files + +* `.editorconfig` +* `.gitignore` +* `Justfile` +* `README.adoc` +* `LICENSE` (MPL-2.0) +* `.machine_readable/STATE.a2ml` +* `.well-known/security.txt` +* `.well-known/ai.txt` +* `.well-known/humans.txt` +* `guix.scm` OR `flake.nix` + +=== Prohibited + +* Python outside `salt/` directory +* TypeScript/JavaScript (use ReScript) +* CUE (use Guile/Nickel) +* `Dockerfile` (use `Containerfile`) +* npm, Bun, pnpm, yarn (use Deno) +* Go (use Rust) + +== STATE.a2ml + +The STATE.a2ml file tracks project state: + +[source] +---- +# STATE — Project State Checkpoint +# Format: a2ml (AI-readable markup) + +project: v-graphql +version: 0.1.0 +last-updated: 2026-02-14 +status: active + +phase: implementation +maturity: beta + +ecosystem: + part-of: RSR Framework + depends-on: [] + +milestones: + - name: Initial setup + completion: 100 + - name: Core implementation + completion: 0 +---- + +== Badge Schema + +Generate badges from STATE.a2ml: + +[source,bash] +---- +just badges standard +---- + +See `docs/BADGE_SCHEMA.adoc` for the full badge taxonomy. + +== Ecosystem Integration + +This template is part of: + +* **STATE.a2ml Ecosystem**: Conversation checkpoints +* **RSR Framework**: Repository standards +* **Consent-Aware-HTTP**: .well-known compliance +* **Hypatia**: Neurosymbolic security scanning +* **gitbot-fleet**: Bot orchestration + +== License + +SPDX-License-Identifier: CC-BY-SA-4.0 + +== Links + +* https://github.com/hyperpolymath/elegant-STATE[elegant-STATE] - STATE tooling +* https://github.com/hyperpolymath/conative-gating[conative-gating] - Policy enforcement +* https://rhodium.sh[Rhodium Standard] - RSR documentation diff --git a/haskell/docs/STATE-VISUALIZER.adoc b/haskell/docs/STATE-VISUALIZER.adoc new file mode 100644 index 0000000..2af3297 --- /dev/null +++ b/haskell/docs/STATE-VISUALIZER.adoc @@ -0,0 +1,128 @@ += Project State Visualizer +[source] +---- + + + + +# RSR Template Repo — Project Topology + +## System Architecture + +``` + ┌─────────────────────────────────────────┐ + │ NEW REPOSITORY │ + │ (Consumer of this Template) │ + └───────────────────┬─────────────────────┘ + │ Scaffolding + ▼ + ┌─────────────────────────────────────────┐ + │ RSR TEMPLATE HUB │ + │ │ + │ ┌───────────┐ ┌───────────────────┐ │ + │ │ AI Gate- │ │ ABI / FFI │ │ + │ │ keeper │ │ Standard │ │ + │ │ (0-AI-M) │ │ (Idris2/Zig) │ │ + │ └─────┬─────┘ └────────┬──────────┘ │ + │ │ │ │ + │ ┌─────▼─────┐ ┌────────▼──────────┐ │ + │ │ Topology │ │ SCM / 6SCM │ │ + │ │ Guide │ │ Metadata │ │ + │ │ (Visual) │ │ (machine_read) │ │ + │ └─────┬─────┘ └────────┬──────────┘ │ + │ │ │ │ + │ ┌─────▼─────────────────▼──────────┐ │ + │ │ CONTAINER ECOSYSTEM │ │ + │ │ ┌──────────┐ ┌───────────────┐ │ │ + │ │ │ Podman / │ │ selur-compose │ │ │ + │ │ │ OCI │ │ cerro-torre │ │ │ + │ │ │ Build │ │ svalinn/vordr │ │ │ + │ │ └──────────┘ └───────────────┘ │ │ + │ │ ct-build.sh deploy.k9.ncl │ │ + │ └──────────────────────────────────┘ │ + └────────│─────────────────│──────────────┘ + │ │ + ▼ ▼ + ┌─────────────────────────────────────────┐ + │ PLATFORM INTEGRATION │ + │ ┌───────────┐ ┌───────────┐ ┌───────┐│ + │ │ GitHub │ │ GitLab │ │ Nix / ││ + │ │ Workflows │ │ CI/CD │ │ Guix ││ + │ └───────────┘ └───────────┘ └───────┘│ + └─────────────────────────────────────────┘ + + ┌─────────────────────────────────────────┐ + │ REPO INFRASTRUCTURE │ + │ Justfile / Mustfile .machine_readable/ │ + │ Codeowners / Reuse 0-AI-MANIFEST.a2ml │ + └─────────────────────────────────────────┘ +``` + +## Completion Dashboard + +``` +COMPONENT STATUS NOTES +───────────────────────────────── ────────────────── ───────────────────────────────── +CORE STANDARDS + ABI/FFI Standard (Idris2/Zig) ██████████ 100% Universal interface stable + AI Gatekeeper (0-AI-MANIFEST) ██████████ 100% Universal entry point active + TOPOLOGY.md Standard ██████████ 100% Visual summary guide active + 6SCM Metadata Structure ██████████ 100% Machine-readable state stable + +INFRASTRUCTURE + Justfile Automation ██████████ 100% Standard build/verify tasks + CI/CD Workflow Templates ██████████ 100% GH/GL scaffolding verified + Multi-Forge Sync ██████████ 100% Hub-and-spoke mirroring stable + +CONTAINER ECOSYSTEM (Phase 2) + Containerfile (OCI build) ██████████ 100% Multi-stage Chainguard base + selur-compose orchestration ██████████ 100% Template + concrete example + cerro-torre manifest ██████████ 100% Bundle metadata & signing + svalinn gateway policy ██████████ 100% .gatekeeper.yaml active + vordr runtime monitoring ██████████ 100% Runtime config template + k9-svc deployment (Nickel) ██████████ 100% Hunt-level deploy descriptor + ct-build.sh pipeline ██████████ 100% Build/sign/verify script + Justfile container-* recipes ██████████ 100% 8 recipes integrated + Trustfile CONTAINER_SUPPLY_CHAIN ██████████ 100% Supply chain section added + +REPO INFRASTRUCTURE + .machine_readable/ ██████████ 100% STATE/META/ECOSYSTEM active + Governance & License ██████████ 100% PMPL & Ethical use verified + Development Shells (Nix/Guix) ██████████ 100% Reproducible env stable + +───────────────────────────────────────────────────────────────────────────── +OVERALL: ██████████ 100% RSR Template Stable & Certified +``` + +## Key Dependencies + +``` +Philosophy ──────► RSR Standard ──────► Template Scaffolding ──► New Repo + │ │ │ │ + ▼ ▼ ▼ ▼ +CCCP Policy ─────► 0-AI-MANIFEST ────────► Justfile ──────────► Compliance + │ + ▼ + Container Ecosystem + ┌──────────┼──────────┐ + ▼ ▼ ▼ + selur-compose cerro- svalinn/ + (orchestrate) torre vordr + (sign) (monitor) + │ + ▼ + k9-svc deploy +``` + +## Update Protocol + +This file is maintained by both humans and AI agents. When updating: + +1. **After completing a component**: Change its bar and percentage +2. **After adding a component**: Add a new row in the appropriate section +3. **After architectural changes**: Update the ASCII diagram +4. **Date**: Update the `Last updated` comment at the top of this file + +Progress bars use: `█` (filled) and `░` (empty), 10 characters wide. +Percentages: 0%, 10%, 20%, ... 100% (in 10% increments). +---- diff --git a/haskell/docs/accessibility/README.adoc b/haskell/docs/accessibility/README.adoc new file mode 100644 index 0000000..7415d98 --- /dev/null +++ b/haskell/docs/accessibility/README.adoc @@ -0,0 +1,257 @@ +// SPDX-License-Identifier: CC-BY-SA-4.0 += Burble Accessibility +:toc: auto +:icons: font + +== Overview + +Burble is committed to providing an accessible voice-first communication platform that works for everyone, regardless of ability. This document outlines our accessibility features, compliance targets, and roadmap. + +== Current Accessibility Features + +=== Keyboard Accessibility + +[cols="1,3,1", options="header"] +|=== +|Feature |Description |Status + +|Custom Keybindings +|Remappable keyboard shortcuts for all major actions +|✅ Implemented + +|Push-To-Talk +|Space key (configurable) for voice activation +|✅ Implemented + +|Mute/Deafen +|M/D keys for quick audio control +|✅ Implemented + +|Volume Control +|Arrow keys for volume adjustment +|✅ Implemented + +|Room Navigation +|Tab/Shift+Tab for room switching +|✅ Implemented +|=== + +=== Screen Reader Support + +[cols="1,3,1", options="header"] +|=== +|Feature |Description |Status + +|Presence Announcements +|"User joined/left room" audio cues +|✅ Implemented + +|Room Change Announcements +|"Switched to room X" notifications +|✅ Implemented + +|Moderation Announcements +|"User was action by moderator" alerts +|✅ Implemented + +|ARIA Attributes +|Semantic HTML for screen readers +|⚠️ Partial + +|Live Regions +|Dynamic content updates for screen readers +|⚠️ Planned +|=== + +== Planned Accessibility Features + +=== Visual Accessibility (Q2 2026) + +[cols="1,3,1", options="header"] +|=== +|Feature |Description |Target + +|High Contrast Mode +|WCAG 4.5:1 contrast ratios +|Q2 2026 + +|Colorblind Support +|Deuteranopia, Protanopia, Tritanopia palettes +|Q2 2026 + +|Font Size Adjustment +|4 levels (14-20px) with persistence +|Q2 2026 + +|Theme Switching +|Dark/Light/System with OS preference detection +|Q2 2026 + +|Reduced Motion +|Respects `prefers-reduced-motion` +|Q2 2026 +|=== + +=== Auditory Accessibility (Q3 2026) + +[cols="1,3,1", options="header"] +|=== +|Feature |Description |Target + +|Closed Captions +|Real-time voice-to-text (Web Speech API) +|Q3 2026 + +|Visual Notifications +|On-screen indicators for audio events +|Q3 2026 + +|Volume Normalization +|EBU R128 (-23 LUFS) compliance +|Q3 2026 + +|Voice Commands +|Voice-controlled interface +|Q3 2026 +|=== + +=== Cognitive Accessibility (Q4 2026) + +[cols="1,3,1", options="header"] +|=== +|Feature |Description |Target + +|Clear Language Mode +|Simplified terminology with tooltips +|Q4 2026 + +|Predictable Navigation +|Consistent layout across all pages +|Q4 2026 + +|Error Prevention +|Confirmations for all destructive actions +|Q4 2026 + +|Contextual Help +|Persistent help system with guidance +|Q4 2026 +|=== + +== Compliance Targets + +=== WCAG 2.1 Compliance + +[cols="1,2,1", options="header"] +|=== +|Level |Requirements |Target + +|WCAG 2.1 A +|Minimum accessibility +|Q2 2026 + +|WCAG 2.1 AA +|Recommended accessibility +|Q4 2026 + +|WCAG 2.1 AAA +|Enhanced accessibility +|2027 +|=== + +=== Legal Compliance + +[cols="1,3,1", options="header"] +|=== +|Standard |Description |Target + +|Section 508 +|U.S. federal accessibility requirements +|Q4 2026 + +|EN 301 549 +|EU public sector procurement +|Q4 2026 + +|VPAT 2.4 +|Voluntary Product Accessibility Template +|Q4 2026 +|=== + +== Implementation Roadmap + +=== Q2 2026: Foundation + +* Port PanLL's accessibility engine +* Implement theme switching +* Add font size adjustment +* Integrate K9 accessibility validator +* Create basic compliance report + +=== Q3 2026: Enhancement + +* Add closed captions +* Implement visual notifications +* Add colorblind support +* Complete screen reader support +* Add accessibility testing to CI + +=== Q4 2026: Compliance + +* Achieve WCAG 2.1 AA compliance +* Complete legal compliance documentation +* Publish VPAT +* Final accessibility audit + +== Testing & Validation + +=== Automated Testing + +* **pa11y**: Automated WCAG testing +* **axe-core**: Accessibility engine +* **K9-SVC**: Contractile validation +* **CI Integration**: GitHub Actions workflow + +=== Manual Testing + +* Keyboard-only navigation +* Screen reader testing (NVDA, VoiceOver) +* High contrast mode verification +* Colorblind simulation testing + +== Reporting Accessibility Issues + +Found an accessibility issue? Please report it: + +* **GitHub Issues**: https://github.com/hyperpolymath/burble/issues +* **Email**: accessibility@hyperpolymath.dev +* **Matrix**: #hyperpolymath-accessibility:matrix.org + +Include: +- Description of the issue +- Steps to reproduce +- Browser/OS/Assistive technology used +- Suggested fix (if any) + +== Accessibility Statement + +Burble is committed to: + +* Following WCAG 2.1 guidelines +* Providing equivalent alternatives for audio content +* Ensuring keyboard accessibility +* Supporting screen readers and other assistive technologies +* Continuous improvement based on user feedback + +We welcome contributions to improve accessibility. See our link:../CONTRIBUTING.adoc[Contributing Guide] for details. + +== Related Documents + +* link:../ROADMAP.adoc[Project Roadmap] — Accessibility milestones +* link:../../.machine_readable/contractiles/adjust/Adjustfile.a2ml[Adjustfile] — Accessibility contract +* link:https://www.w3.org/WAI/standards-guidelines/wcag/[WCAG Guidelines] — Official standards +* link:https://www.section508.gov/[Section 508] — U.S. federal requirements + +== License + +This document is licensed under MPL-2.0. See link:../../LICENSE[LICENSE] for details. diff --git a/haskell/docs/architecture/0.2-AI-MANIFEST.a2ml b/haskell/docs/architecture/0.2-AI-MANIFEST.a2ml new file mode 100644 index 0000000..028b503 --- /dev/null +++ b/haskell/docs/architecture/0.2-AI-MANIFEST.a2ml @@ -0,0 +1,17 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "architecture-track" +level: 2 +parent: "../0.1-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Documentation track for system architecture and threat models. + +canonical_locations: + threat_model: "THREAT-MODEL.adoc" + +invariants: + - "Visual diagrams MUST include ASCII or Mermaid representations" diff --git a/haskell/docs/architecture/THREAT-MODEL.adoc b/haskell/docs/architecture/THREAT-MODEL.adoc new file mode 100644 index 0000000..31b8347 --- /dev/null +++ b/haskell/docs/architecture/THREAT-MODEL.adoc @@ -0,0 +1,162 @@ += Threat Model + + + +# Threat Model: a2ml-haskell + +## Document Info + +| Field | Value | +|---------------|--------------------------------| +| Project | a2ml-haskell | +| Version | 1.0 | +| Last Reviewed | 2026-07-08 | +| Author | Jonathan D.A. Jewell | +| Methodology | STRIDE | + +## Scope + +### In Scope + +- Application source code and build pipeline +- CI/CD workflows (GitHub Actions) +- Container images and runtime environment +- Secrets and credential management +- Dependencies (direct and transitive) +- Deployment artifacts (binaries, containers, SBOM) + +### Out of Scope + +- Physical security of hosting infrastructure +- GitHub/GitLab platform-level vulnerabilities +- End-user device security +- Social engineering attacks against maintainers (handled by org policy) + +## System Overview + +Brief description of a2ml-haskell and its architecture. + +> See [STATE-VISUALIZER.adoc](../STATE-VISUALIZER.adoc) for the full architecture diagram and completion dashboard. + +## Assets + +| Asset | Classification | Owner | Notes | +|----------------------|----------------|-------------|--------------------------------------------| +| Source code | Internal | Maintainers | Public repos are still internal-integrity | +| Signing keys | Restricted | Release lead | Signing keys (e.g., Ed25519), GPG keys | +| CI/CD secrets | Restricted | Maintainers | GITHUB_TOKEN, deploy tokens, PATs | +| User/contributor data | Confidential | Org | Emails, contributor identity | +| Build artifacts | Internal | CI pipeline | Binaries, WASM bundles | +| Container images | Internal | CI pipeline | Chainguard-based, signed via image signing tool | +| SBOM / provenance | Public | CI pipeline | SLSA attestations | +| Dependencies | Public | Lockfile | Cargo.lock, deno.lock, gleam.toml | +| Infrastructure config | Confidential | Maintainers | Containerfiles, compose files, orchestration config | + +## Trust Boundaries + +| Boundary | From (Lower Trust) | To (Higher Trust) | +|-----------------------------|---------------------------|----------------------------| +| Pull request submission | External contributor | Repository codebase | +| CI/CD workflow execution | Workflow definition | Runner with secrets access | +| Container build boundary | Build stage | Runtime stage | +| External API calls | Third-party service | Application internals | +| User input (CLI/Web) | End user | Application logic | +| Dependency resolution | Package registry | Build environment | +| Forge mirroring | GitHub | GitLab / Bitbucket | + +## Threat Actors + +| Actor | Motivation | Capability | +|--------------------------|-------------------------------|------------| +| Script kiddie | Vandalism, clout | Low | +| Disgruntled contributor | Sabotage, backdoor insertion | Medium | +| Supply chain attacker | Wide-impact compromise | High | +| Nation state | Espionage, disruption | Very High | +| Automated bot | Credential stuffing, spam PRs | Low-Medium | + +## STRIDE Analysis + +### Spoofing + +| Threat | Affected Asset | Likelihood | Impact | Risk | Mitigation | +|---------------------------------|-------------------|------------|--------|--------|------------------------------------------------| +| Unsigned commits impersonate maintainer | Source code | Medium | High | High | Require GPG-signed commits; vigilant code review | +| Forged bot actions (automated agents) | CI/CD pipeline | Low | High | Medium | Bot tokens scoped minimally; audit bot activity | +| Spoofed package registry identity | Dependencies | Low | High | Medium | Pin dependencies by hash; verify provenance | + +### Tampering + +| Threat | Affected Asset | Likelihood | Impact | Risk | Mitigation | +|---------------------------------|-------------------|------------|--------|--------|------------------------------------------------| +| Malicious pull request | Source code | Medium | High | High | Branch protection; required reviews; CodeQL | +| Dependency poisoning (typosquat) | Dependencies | Medium | High | High | Lockfiles; secret-scanner; security scans | +| Tampered container base image | Container images | Low | High | Medium | Chainguard images; image signing verification | +| Workflow file modification | CI/CD pipeline | Low | High | Medium | CODEOWNERS on .github/; workflow-linter | + +### Repudiation + +| Threat | Affected Asset | Likelihood | Impact | Risk | Mitigation | +|---------------------------------|-------------------|------------|--------|--------|------------------------------------------------| +| Unlogged deployment | Build artifacts | Medium | Medium | Medium | SLSA provenance; deployment audit trail | +| Denied merge of vulnerable code | Source code | Low | Medium | Low | Git history is immutable; signed commits | +| Secret rotation without record | CI/CD secrets | Low | Low | Low | Secret rotation logged in STATE.a2ml | + +### Information Disclosure + +| Threat | Affected Asset | Likelihood | Impact | Risk | Mitigation | +|---------------------------------|-------------------|------------|--------|--------|------------------------------------------------| +| Secrets leaked in git history | CI/CD secrets | Medium | High | High | TruffleHog in CI; secret-scanner workflow | +| Verbose error messages in prod | Application logic | Medium | Medium | Medium | Sanitize outputs; structured logging | +| SBOM reveals internal structure | Infrastructure | Low | Low | Low | Accepted risk; SBOM is intentionally public | + +### Denial of Service + +| Threat | Affected Asset | Likelihood | Impact | Risk | Mitigation | +|---------------------------------|-------------------|------------|--------|--------|------------------------------------------------| +| CI resource exhaustion (fork bomb in PR) | CI/CD pipeline | Medium | Medium | Medium | Concurrency limits; timeout on workflows | +| Spam issues/PRs flooding triage | Maintainer time | Medium | Low | Low | GitHub rate limits; bot auto-close stale | +| Large binary commits bloating repo | Source code | Low | Medium | Low | .gitattributes LFS policy; pre-commit hooks | + +### Elevation of Privilege + +| Threat | Affected Asset | Likelihood | Impact | Risk | Mitigation | +|---------------------------------|-------------------|------------|--------|--------|------------------------------------------------| +| Workflow injection via PR title/body | CI/CD pipeline | Medium | High | High | Never interpolate PR fields in `run:`; use env vars | +| GITHUB_TOKEN over-scoped | CI/CD secrets | Medium | High | High | `permissions: read-all` default; per-job scoping | +| Container escape | Runtime environment | Low | High | Medium | Hardened container runtime; read-only rootfs; no-new-privileges | +| Compromised action dependency | CI/CD pipeline | Medium | High | High | SHA-pin all actions; never use `@latest` tags | + +## Mitigations in Place + +- **SLSA Provenance**: Build attestations via slsa-github-generator +- **Secret Scanning**: TruffleHog + secret-scanner workflow on every push +- **Static Analysis**: CodeQL on supported languages +- **Supply Chain**: OpenSSF Scorecard (scorecard.yml + scorecard-enforcer.yml) +- **Container Signing**: Ed25519 signatures on all published images (optional: use your signing tool) +- **Container Runtime**: Hardened container runtime with formal verification (optional) +- **Dependency Pinning**: All GitHub Actions SHA-pinned; lockfiles committed +- **Workflow Validation**: workflow-linter.yml checks all workflow changes +- **Security Scanning**: Neurosymbolic scanning (hypatia-scan.yml, optional) +- **Bot Governance**: Bot orchestration with confidence thresholds (optional) +- **Edge Security**: Gateway with policy enforcement (optional, where applicable) +- **SBOM**: Generated and published with releases + +## Residual Risks + +| Risk | Accepted Because | Review Trigger | +|-----------------------------------------------|---------------------------------------------------|-------------------------| +| Zero-day in GitHub Actions runner | Platform responsibility; no feasible mitigation | GitHub advisory | +| Maintainer account compromise | Mitigated by 2FA requirement; residual remains | Any suspicious activity | +| Transitive dependency vulnerability (0-day) | Lockfiles limit blast radius; scanning catches known CVEs | CVE database update | +| SBOM exposes internal component names | Transparency is a design goal | Policy change | + +## Review Schedule + +This threat model should be reviewed: + +- **Quarterly** as a standing item +- **When architecture changes** (new services, new trust boundaries, new deployment targets) +- **Before major releases** (v1.0, v2.0, etc.) +- **After any security incident** affecting this project or its dependencies + +Reviewer should update the "Last Reviewed" date and version in Document Info above. diff --git a/haskell/docs/attribution/0.2-AI-MANIFEST.a2ml b/haskell/docs/attribution/0.2-AI-MANIFEST.a2ml new file mode 100644 index 0000000..52beaea --- /dev/null +++ b/haskell/docs/attribution/0.2-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "attribution-unit" +level: 2 +parent: "../0.1-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Sub-unit of the docs pillar focusing on attribution. diff --git a/haskell/docs/attribution/CITATION.cff b/haskell/docs/attribution/CITATION.cff new file mode 100644 index 0000000..902b874 --- /dev/null +++ b/haskell/docs/attribution/CITATION.cff @@ -0,0 +1,17 @@ +cff-version: 1.2.0 +message: "If you use this software, please cite it as below." +authors: +- family-names: "Jewell" + given-names: "Jonathan" + orcid: "https://orcid.org/0000-0000-0000-0000" # Placeholder +title: "a2ml-haskell" +version: 0.1.0 +date-released: 2026-07-08 +url: "https://github.com/hyperpolymath/a2ml-haskell" +repository-code: "https://github.com/hyperpolymath/a2ml-haskell" +license: MPL-2.0 +keywords: + - "rsr" + - "formal-verification" + - "neurosymbolic" + - "provenance" diff --git a/haskell/docs/attribution/CITATIONS.adoc b/haskell/docs/attribution/CITATIONS.adoc new file mode 100644 index 0000000..23fb9f7 --- /dev/null +++ b/haskell/docs/attribution/CITATIONS.adoc @@ -0,0 +1,35 @@ += a2ml-haskell - Citation Guide +:toc: + +== BibTeX + +[source,bibtex] +---- +@software{a2ml-haskell_2026, + author = {Jewell, Jonathan}, + title = {a2ml-haskell}, + year = {2026}, + url = {https://github.com/hyperpolymath/a2ml-haskell}, + license = {MPL-2.0} +} +---- + +== Harvard Style + +Jewell, J. (2026) _a2ml-haskell_ [Computer software]. Available at: https://github.com/hyperpolymath/a2ml-haskell + +== OSCOLA + +Jonathan D.A. Jewell, 'a2ml-haskell' (2026) + +== MLA + +Jewell, Jonathan "a2ml-haskell." 2026, github.com/hyperpolymath/a2ml-haskell. + +== APA 7 + +Jewell, J. (2026). _a2ml-haskell_ [Computer software]. GitHub. https://github.com/hyperpolymath/a2ml-haskell + +== See Also + +* link:CITATION.cff[CITATION.cff] diff --git a/haskell/docs/attribution/CODEOWNERS.adoc b/haskell/docs/attribution/CODEOWNERS.adoc new file mode 100644 index 0000000..3714055 --- /dev/null +++ b/haskell/docs/attribution/CODEOWNERS.adoc @@ -0,0 +1,19 @@ += Code Ownership +:icons: font + +This project utilizes a formally defined code ownership structure to ensure that specific components are reviewed by domain experts. + +== Authority Model + +Our ownership model is based on the "Perimeter" architecture: +* **Perimeter 1 (Core):** Strictly controlled by Lead Maintainers. +* **Perimeter 2 (Extensions):** Maintained by component owners. +* **Perimeter 3 (Community):** Open for broader community participation. + +== Automated Enforcement + +The technical rules for automatic review assignments are maintained in the machine-readable link:../../.github/CODEOWNERS[.github/CODEOWNERS] file. GitHub uses this to automatically notify owners when changes are proposed to their sections. + +== Component Owners + +A full list of maintainers and their contact information can be found in link:MAINTAINERS.adoc[MAINTAINERS.adoc]. diff --git a/haskell/docs/attribution/MAINTAINERS.adoc b/haskell/docs/attribution/MAINTAINERS.adoc new file mode 100644 index 0000000..48d9781 --- /dev/null +++ b/haskell/docs/attribution/MAINTAINERS.adoc @@ -0,0 +1,47 @@ +// SPDX-License-Identifier: CC-BY-SA-4.0 += Maintainers +:toc: preamble + +This document lists the maintainers of this project and their responsibilities. + +== Current Maintainers + +[cols="2,3,2",options="header"] +|=== +| Name | Role | Contact + +| Jonathan D.A. Jewell +| Lead Maintainer +| https://github.com/hyperpolymath[@hyperpolymath] +|=== + +== Responsibilities + +Maintainers are responsible for: + +* Reviewing and merging pull requests +* Triaging issues and feature requests +* Ensuring code quality and security standards +* Managing releases and versioning +* Upholding the project's code of conduct + +== Becoming a Maintainer + +Contributors who demonstrate: + +* Consistent, high-quality contributions +* Understanding of the project's goals and standards +* Constructive participation in discussions +* Commitment to the project's long-term health + +May be invited to become maintainers at the discretion of existing maintainers. + +== Decision Making + +* Routine decisions (bug fixes, minor improvements) can be made by any maintainer +* Significant changes require discussion and consensus among maintainers +* Breaking changes or major features should be discussed in issues before implementation + +== Contact + +For questions about project governance, open an issue or contact the maintainers listed above. diff --git a/haskell/docs/attribution/README.adoc b/haskell/docs/attribution/README.adoc new file mode 100644 index 0000000..b095612 --- /dev/null +++ b/haskell/docs/attribution/README.adoc @@ -0,0 +1 @@ += attribution Unit diff --git a/haskell/docs/compliance/ACCESSIBILITY.adoc b/haskell/docs/compliance/ACCESSIBILITY.adoc new file mode 100644 index 0000000..4f94233 --- /dev/null +++ b/haskell/docs/compliance/ACCESSIBILITY.adoc @@ -0,0 +1,3 @@ += Accessibility Compliance +Status: Partial +Target: WCAG 2.1 AA diff --git a/haskell/docs/decisions/0.2-AI-MANIFEST.a2ml b/haskell/docs/decisions/0.2-AI-MANIFEST.a2ml new file mode 100644 index 0000000..ac26298 --- /dev/null +++ b/haskell/docs/decisions/0.2-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "decisions-unit" +level: 2 +parent: "../0.1-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Sub-unit of the docs pillar focusing on decisions. diff --git a/haskell/docs/decisions/0000-template.adoc b/haskell/docs/decisions/0000-template.adoc new file mode 100644 index 0000000..6710304 --- /dev/null +++ b/haskell/docs/decisions/0000-template.adoc @@ -0,0 +1,35 @@ += Architecture Decision Record: 0000-template + + + +# [NUMBER]. [TITLE] + +Date: YYYY-MM-DD + +## Status + +[Proposed | Accepted | Deprecated | Superseded by [ADR-NNNN](NNNN-title.md) | Rejected] + +## Context + +What is the issue that we're seeing that is motivating this decision or change? + +## Decision + +What is the change that we're proposing and/or doing? + +## Consequences + +What becomes easier or more difficult to do because of this change? + +### Positive + +- ... + +### Negative + +- ... + +### Neutral + +- ... diff --git a/haskell/docs/decisions/0001-adopt-rsr-standard.adoc b/haskell/docs/decisions/0001-adopt-rsr-standard.adoc new file mode 100644 index 0000000..b5f8a1e --- /dev/null +++ b/haskell/docs/decisions/0001-adopt-rsr-standard.adoc @@ -0,0 +1,86 @@ += Architecture Decision Record: 0001-adopt-rsr-standard + + + +# 1. Adopt Rhodium Standard Repository (RSR) Template + +Date: 2026-02-14 + +## Status + +Accepted + +## Context + +Managing multiple repositories with an ad-hoc approach led to significant +inconsistencies across the ecosystem. Common problems included: + +- Missing or incomplete configuration files (SECURITY.md, CONTRIBUTING.md, + .editorconfig, etc.) +- State files (STATE.a2ml, META.a2ml, ECOSYSTEM.a2ml) placed in the repository + root instead of the canonical `.machine_readable/` directory +- Duplicate or conflicting workflow definitions across repos +- No standardized entry point for AI agents interacting with repositories +- Inconsistent bot directive configurations leading to unreliable automation +- No contractile enforcement or Justfile automation + +Without a single source of truth for repository structure, each new repo +required manual setup and inevitably drifted from best practices over time. + +## Decision + +Adopt the Rhodium Standard Repository (RSR) template (`rsr-template-repo`) as +the canonical starting point for all new repositories. Existing repositories +will migrate incrementally as they receive active development. + +The RSR template provides: + +- **Machine-readable state files** in `.machine_readable/` (STATE.a2ml, + ECOSYSTEM.a2ml, META.a2ml, AGENTIC.a2ml, NEUROSYM.a2ml, PLAYBOOK.a2ml) +- **AI manifest** (`0-AI-MANIFEST.a2ml`) as a universal entry point for all + AI agents +- **Bot directives** in `.machine_readable/bot_directives/` for bot orchestration integration +- **Contractiles** in `.machine_readable/contractiles/` (k9, dust, lust, must, trust) for + policy enforcement +- **Standardized workflows** (16+ GitHub Actions workflows, all SHA-pinned) +- **Justfile automation** with standard recipes for common tasks +- **Security and governance files**: SECURITY.md, CONTRIBUTING.md, + CODE_OF_CONDUCT.md, LICENSE (MPL-2.0) +- **Architecture Decision Records** in `docs/decisions/` + +New repositories are created by cloning the template: + +```bash +git clone https://github.com/hyperpolymath/rsr-template-repo new-repo-name +cd new-repo-name +rm -rf .git && git init +``` + +## Consequences + +### Positive + +- Consistency across all repositories, enforced from creation +- Automated compliance checking via `rsr-antipattern.yml` workflow +- Bot fleet can operate reliably across all repos with predictable structure +- AI agents (Claude, Gemini, etc.) have a standardized entry point via + `0-AI-MANIFEST.a2ml` +- New contributors can onboard faster with familiar, documented structure +- Reduced maintenance burden: fix once in template, propagate to all repos +- Machine-readable state enables tooling and automation pipelines + +### Negative + +- Migration effort for existing repos requires time and attention +- Learning curve for contributors unfamiliar with RSR conventions +- Template updates need propagation mechanism to existing repos +- Some repos may have unique needs that do not fit the standard template + without customization + +### Neutral + +- Existing CI/CD pipelines continue to work; RSR workflows are additive +- Third-party dependencies retain their original licenses regardless of + repo structure +- ADR process itself is part of the template, enabling future decisions + to be recorded consistently diff --git a/haskell/docs/decisions/README.adoc b/haskell/docs/decisions/README.adoc new file mode 100644 index 0000000..153a5e7 --- /dev/null +++ b/haskell/docs/decisions/README.adoc @@ -0,0 +1 @@ += decisions Unit diff --git a/haskell/docs/developer/0.2-AI-MANIFEST.a2ml b/haskell/docs/developer/0.2-AI-MANIFEST.a2ml new file mode 100644 index 0000000..c16fcc7 --- /dev/null +++ b/haskell/docs/developer/0.2-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "developer-unit" +level: 2 +parent: "../0.1-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Sub-unit of the docs pillar focusing on developer. diff --git a/haskell/docs/developer/ABI-FFI-README.adoc b/haskell/docs/developer/ABI-FFI-README.adoc new file mode 100644 index 0000000..24a07c9 --- /dev/null +++ b/haskell/docs/developer/ABI-FFI-README.adoc @@ -0,0 +1,384 @@ += ABI/FFI Standards +{{~ Aditionally delete this line and fill out the template below ~}} + +# a2ml-haskell ABI/FFI Documentation + +## Overview + +This library follows the **Hyperpolymath RSR Standard** for ABI and FFI design: + +- **ABI (Application Binary Interface)** defined in **Idris2** with formal proofs +- **FFI (Foreign Function Interface)** implemented in **Zig** for C compatibility +- **Generated C headers** bridge Idris2 ABI to Zig FFI +- **Any language** can call through standard C ABI + +## Architecture + +``` +┌─────────────────────────────────────────────┐ +│ ABI Definitions (Idris2) │ +│ src/abi/ │ +│ - Types.idr (Type definitions) │ +│ - Layout.idr (Memory layout proofs) │ +│ - Foreign.idr (FFI declarations) │ +└─────────────────┬───────────────────────────┘ + │ + │ generates (at compile time) + ▼ +┌─────────────────────────────────────────────┐ +│ C Headers (auto-generated) │ +│ generated/abi/{{project}}.h │ +└─────────────────┬───────────────────────────┘ + │ + │ imported by + ▼ +┌─────────────────────────────────────────────┐ +│ FFI Implementation (Zig) │ +│ ffi/zig/src/main.zig │ +│ - Implements C-compatible functions │ +│ - Zero-cost abstractions │ +│ - Memory-safe by default │ +└─────────────────┬───────────────────────────┘ + │ + │ compiled to lib{{project}}.so/.a + ▼ +┌─────────────────────────────────────────────┐ +│ Any Language via C ABI │ +│ - Rust, ReScript, Julia, Python, etc. │ +└─────────────────────────────────────────────┘ +``` + +## Directory Structure + +``` +{{project}}/ +├── src/ +│ ├── abi/ # ABI definitions (Idris2) +│ │ ├── Types.idr # Core type definitions with proofs +│ │ ├── Layout.idr # Memory layout verification +│ │ └── Foreign.idr # FFI function declarations +│ └── lib/ # Core library (any language) +│ +├── ffi/ +│ └── zig/ # FFI implementation (Zig) +│ ├── build.zig # Build configuration +│ ├── build.zig.zon # Dependencies +│ ├── src/ +│ │ └── main.zig # C-compatible FFI implementation +│ ├── test/ +│ │ └── integration_test.zig +│ └── include/ +│ └── {{project}}.h # C header (optional, can be generated) +│ +├── generated/ # Auto-generated files +│ └── abi/ +│ └── {{project}}.h # Generated from Idris2 ABI +│ +└── bindings/ # Language-specific wrappers (optional) + ├── rust/ + ├── rescript/ + └── julia/ +``` + +## Why Idris2 for ABI? + +### 1. **Formal Verification** + +Idris2's dependent types allow proving properties about the ABI at compile-time: + +```idris +-- Prove struct size is correct +public export +exampleStructSize : HasSize ExampleStruct 16 + +-- Prove field alignment is correct +public export +fieldAligned : Divides 8 (offsetOf ExampleStruct.field) + +-- Prove ABI is platform-compatible +public export +abiCompatible : Compatible (ABI 1) (ABI 2) +``` + +### 2. **Type Safety** + +Encode invariants that C/Zig cannot express: + +```idris +-- Non-null pointer guaranteed at type level +data Handle : Type where + MkHandle : (ptr : Bits64) -> {auto 0 nonNull : So (ptr /= 0)} -> Handle + +-- Array with length proof +data Buffer : (n : Nat) -> Type where + MkBuffer : Vect n Byte -> Buffer n +``` + +### 3. **Platform Abstraction** + +Platform-specific types with compile-time selection: + +```idris +CInt : Platform -> Type +CInt Linux = Bits32 +CInt Windows = Bits32 + +CSize : Platform -> Type +CSize Linux = Bits64 +CSize Windows = Bits64 +``` + +### 4. **Safe Evolution** + +Prove that new ABI versions are backward-compatible: + +```idris +-- Compiler enforces compatibility +abiUpgrade : ABI 1 -> ABI 2 +abiUpgrade old = MkABI2 { + -- Must preserve all v1 fields + v1_compat = old, + -- Can add new fields + new_features = defaults +} +``` + +## Why Zig for FFI? + +### 1. **C ABI Compatibility** + +Zig exports C-compatible functions naturally: + +```zig +export fn library_function(param: i32) i32 { + return param * 2; +} +``` + +### 2. **Memory Safety** + +Compile-time safety without runtime overhead: + +```zig +// Null check enforced at compile time +const handle = init() orelse return error.InitFailed; +defer free(handle); +``` + +### 3. **Cross-Compilation** + +Built-in cross-compilation to any platform: + +```bash +zig build -Dtarget=x86_64-linux +zig build -Dtarget=aarch64-macos +zig build -Dtarget=x86_64-windows +``` + +### 4. **Zero Dependencies** + +No runtime, no libc required (unless explicitly needed): + +```zig +// Minimal binary size +pub const lib = @import("std"); +// Only includes what you use +``` + +## Building + +### Build FFI Library + +```bash +cd ffi/zig +zig build # Build debug +zig build -Doptimize=ReleaseFast # Build optimized +zig build test # Run tests +``` + +### Generate C Header from Idris2 ABI + +```bash +cd src/abi +idris2 --cg c-header Types.idr -o ../../generated/abi/{{project}}.h +``` + +### Cross-Compile + +```bash +cd ffi/zig + +# Linux x86_64 +zig build -Dtarget=x86_64-linux + +# macOS ARM64 +zig build -Dtarget=aarch64-macos + +# Windows x86_64 +zig build -Dtarget=x86_64-windows +``` + +## Usage + +### From C + +```c +#include "{{project}}.h" + +int main() { + void* handle = {{project}}_init(); + if (!handle) return 1; + + int result = {{project}}_process(handle, 42); + if (result != 0) { + const char* err = {{project}}_last_error(); + fprintf(stderr, "Error: %s\n", err); + } + + {{project}}_free(handle); + return 0; +} +``` + +Compile with: +```bash +gcc -o example example.c -l{{project}} -L./zig-out/lib +``` + +### From Idris2 + +```idris +import a2ml-haskell.ABI.Foreign + +main : IO () +main = do + Just handle <- init + | Nothing => putStrLn "Failed to initialize" + + Right result <- process handle 42 + | Left err => putStrLn $ "Error: " ++ errorDescription err + + free handle + putStrLn "Success" +``` + +### From Rust + +```rust +#[link(name = "{{project}}")] +extern "C" { + fn {{project}}_init() -> *mut std::ffi::c_void; + fn {{project}}_free(handle: *mut std::ffi::c_void); + fn {{project}}_process(handle: *mut std::ffi::c_void, input: u32) -> i32; +} + +fn main() { + unsafe { + let handle = {{project}}_init(); + assert!(!handle.is_null()); + + let result = {{project}}_process(handle, 42); + assert_eq!(result, 0); + + {{project}}_free(handle); + } +} +``` + +### From Julia + +```julia +const lib{{project}} = "lib{{project}}" + +function init() + handle = ccall((:{{project}}_init, lib{{project}}), Ptr{Cvoid}, ()) + handle == C_NULL && error("Failed to initialize") + handle +end + +function process(handle, input) + result = ccall((:{{project}}_process, lib{{project}}), Cint, (Ptr{Cvoid}, UInt32), handle, input) + result +end + +function cleanup(handle) + ccall((:{{project}}_free, lib{{project}}), Cvoid, (Ptr{Cvoid},), handle) +end + +# Usage +handle = init() +try + result = process(handle, 42) + println("Result: $result") +finally + cleanup(handle) +end +``` + +## Testing + +### Unit Tests (Zig) + +```bash +cd ffi/zig +zig build test +``` + +### Integration Tests + +```bash +cd ffi/zig +zig build test-integration +``` + +### ABI Verification (Idris2) + +```idris +-- Compile-time verification +%runElab verifyABI + +-- Runtime checks +main : IO () +main = do + verifyLayoutsCorrect + verifyAlignmentsCorrect + putStrLn "ABI verification passed" +``` + +## Contributing + +When modifying the ABI/FFI: + +1. **Update ABI first** (`src/abi/*.idr`) + - Modify type definitions + - Update proofs + - Ensure backward compatibility + +2. **Generate C header** + ```bash + idris2 --cg c-header src/abi/Types.idr -o generated/abi/{{project}}.h + ``` + +3. **Update FFI implementation** (`ffi/zig/src/main.zig`) + - Implement new functions + - Match ABI types exactly + +4. **Add tests** + - Unit tests in Zig + - Integration tests + - ABI verification tests + +5. **Update documentation** + - Function signatures + - Usage examples + - Migration guide (if breaking changes) + +## License + +MPL-2.0 + +## See Also + +- [Idris2 Documentation](https://idris2.readthedocs.io) +- [Zig Documentation](https://ziglang.org/documentation/master/) +- [Rhodium Standard Repositories](https://github.com/hyperpolymath/rhodium-standard-repositories) diff --git a/haskell/docs/developer/README.adoc b/haskell/docs/developer/README.adoc new file mode 100644 index 0000000..1d00529 --- /dev/null +++ b/haskell/docs/developer/README.adoc @@ -0,0 +1 @@ += developer Unit diff --git a/haskell/docs/governance/0.1-AI-MANIFEST.a2ml b/haskell/docs/governance/0.1-AI-MANIFEST.a2ml new file mode 100644 index 0000000..6e373bd --- /dev/null +++ b/haskell/docs/governance/0.1-AI-MANIFEST.a2ml @@ -0,0 +1,21 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "governance-pillar" +level: 1 +parent: "../0-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Primary governance pillar implementing the Triaxial Software Development + Methodology (TSDM). Contains planning, maintenance, and audit tracks. + +canonical_locations: + tsdm_spec: "TSDM.adoc" + planning: "planning/" + maintenance: "maintenance/" + audit: "audit/" + crg: "CRG-CRITERIA.adoc" + checklist: "MAINTENANCE-CHECKLIST.adoc" + approach: "SOFTWARE-DEVELOPMENT-APPROACH.adoc" diff --git a/haskell/docs/governance/CRG-CRITERIA.a2ml b/haskell/docs/governance/CRG-CRITERIA.a2ml new file mode 100644 index 0000000..6162585 --- /dev/null +++ b/haskell/docs/governance/CRG-CRITERIA.a2ml @@ -0,0 +1,108 @@ +; SPDX-License-Identifier: MPL-2.0 +; Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) + +; Component Readiness Grades (CRG) — Machine-readable specification +; Format: A2ML (AI-to-Machine Language) +; Standard: CRG v1.0 + +(standard + (name "Component Readiness Grades") + (abbreviation "CRG") + (version "1.0") + (date "2026-02-28") + (author "Jonathan D.A. Jewell ") + (license "MPL-2.0") + (family "RSR")) + +(grades + (grade + (code X) + (name "Untested") + (release-stage #f) + (ordinal 0) + (description "No testing has been performed. Status unknown.") + (evidence-required "none") + (minimum-for #f)) + (grade + (code F) + (name "Harmful / Wasteful") + (release-stage #f) + (ordinal 1) + (description "Actively harmful, wasteful, or better handled externally. Reject, deprecate, or delegate.") + (evidence-required "documented test results showing harm, waste, or redundancy; comparison with alternatives") + (minimum-for #f)) + (grade + (code E) + (name "Minimal / Salvageable") + (release-stage "pre-alpha") + (ordinal 2) + (description "Does something slight. Barely functional. Needs redesign or major work.") + (evidence-required "at least one successful test case; documented failures and limitations") + (minimum-for #f)) + (grade + (code D) + (name "Partial / Inconsistent") + (release-stage "alpha") + (ordinal 3) + (description "Works on some things but not systematically.") + (evidence-required "matrix of tested scenarios; documented scope vs actual capabilities") + (minimum-for "alpha")) + (grade + (code C) + (name "Self-Validated") + (release-stage "beta") + (ordinal 4) + (description "Tested on the tool/project itself (dogfooding). Reliable in home context.") + (evidence-required "active dogfooding; CI integration or equivalent; no known failures in home context") + (minimum-for "beta")) + (grade + (code B) + (name "Broadly Validated") + (release-stage "release-candidate") + (ordinal 5) + (description "Tested on at least 6 disparate, unrelated targets.") + (evidence-required "list of 6+ diverse targets with test results; evidence of feedback incorporation") + (minimum-for "release-candidate")) + (grade + (code A) + (name "Field-Proven") + (release-stage "stable") + (ordinal 6) + (description "Real-world external feedback confirms value. Does no harm in the wild.") + (evidence-required "real-world usage data; feedback incorporation evidence; no unresolved harm reports") + (minimum-for "stable"))) + +(transitions + (promotion + (from X) (to E) (requirement "Run at least one test. Document results.")) + (promotion + (from X) (to F) (requirement "Evaluate and determine harmful or wasteful.")) + (promotion + (from E) (to D) (requirement "Fix critical failures. Document scope.")) + (promotion + (from D) (to C) (requirement "Dogfood on own project. Fix what breaks.")) + (promotion + (from C) (to B) (requirement "Test on 6+ diverse external targets. Fix what breaks.")) + (promotion + (from B) (to A) (requirement "Ship. Collect external feedback. Demonstrate no harm.")) + (demotion + (from A) (to B) (trigger "External feedback dries up or reveals no longer useful.")) + (demotion + (from A) (to F) (trigger "External feedback reveals component causes harm.")) + (demotion + (from B) (to C) (trigger "Broad validation reveals unfixed failures.")) + (demotion + (from C) (to D) (trigger "Home context changes and component no longer reliable.")) + (demotion + (from C) (to F) (trigger "Dogfooding reveals net negative.")) + (demotion + (from D) (to E) (trigger "Scope narrows to barely functional.")) + (demotion + (from any) (to F) (trigger "Better external alternative makes this pure opportunity cost."))) + +(conformance + (rule "Each assessable component MUST have a grade from {X, F, E, D, C, B, A}.") + (rule "Each grade above X MUST be supported by evidence per section 4.") + (rule "Assessments MUST be recorded in a version-controlled location.") + (rule "Assessments MUST be reviewed at least once per release cycle.") + (rule "Release stages MUST respect minimum grade thresholds.")) diff --git a/haskell/docs/governance/CRG-CRITERIA.adoc b/haskell/docs/governance/CRG-CRITERIA.adoc new file mode 100644 index 0000000..f8264e6 --- /dev/null +++ b/haskell/docs/governance/CRG-CRITERIA.adoc @@ -0,0 +1,39 @@ += Component Readiness Grades (CRG) Criteria +:toc: preamble +:icons: font + +This document defines the quality assessment criteria for individual project components. + +== Grade Definitions + +[cols="1,2,3,4",options="header"] +|=== +| Grade | Name | Release Stage | Meaning + +| **A** | Field-Proven | Stable | Real-world feedback amassed; no harm in wild. +| **B** | Broadly Validated | Release Candidate | Tested on 6+ diverse external targets. +| **C** | Self-Validated | Beta | Reliable in home context (dogfooded). +| **D** | Partial | Alpha | Works on some inputs/cases but not systematically. +| **E** | Minimal | Pre-alpha | Barely functional; needs major work. +| **F** | Harmful/Wasteful | Reject/Delegate | Redundant or negative value. +| **X** | Untested | — | Status completely unknown. +|=== + +== Core Principles + +1. **Assess components, not projects:** Each feature gets its own grade. +2. **Evidence over intuition:** Every grade above X requires documented evidence. +3. **Honest assessment:** Grade the component as it is today, not as you hope it will be. +4. **Grades are earned and can be lost:** Regressions lead to demotion. + +== Assessment Checklist + +1. Has it been tested at all? (No → **X**) +2. Does it cause harm or duplicate something better? (Yes → **F**) +3. Does it do something, however slight? (Barely → **E**) +4. Does it work on some things but not others? (Partial → **D**) +5. Does it work reliably on our own project? (Dogfooded → **C**) +6. Has it been tested on 6+ diverse external targets? (Broad → **B**) +7. Do external users confirm it works and is useful? (Field-proven → **A**) + +See link:READINESS.adoc[READINESS.adoc] for the current project assessment. diff --git a/haskell/docs/governance/MAINTENANCE-CHECKLIST.a2ml b/haskell/docs/governance/MAINTENANCE-CHECKLIST.a2ml new file mode 100644 index 0000000..eaee720 --- /dev/null +++ b/haskell/docs/governance/MAINTENANCE-CHECKLIST.a2ml @@ -0,0 +1,159 @@ +# SPDX-License-Identifier: MPL-2.0 +# Cross-repo maintenance baseline (machine-readable canonical) + +[metadata] +version = "1.1.0" +last-updated = "2026-02-24" +scope = "cross-repo" +source-human = "docs/maintenance/MAINTENANCE-CHECKLIST.adoc" +companion-human = "docs/practice/SOFTWARE-DEVELOPMENT-APPROACH.adoc" +companion-machine = ".machine_readable/policies/SOFTWARE-DEVELOPMENT-APPROACH.a2ml" + +[policy] +single-source = true +notes = "Use this file as canonical machine policy and keep markdown synchronized." + +[maintenance-axes] +scoping-first = true +execution-order = ["scoping", "axis-1", "axis-2", "axis-3"] +axis-1 = "must > intend > like" +axis-2 = "corrective > adaptive > perfective" +axis-3 = "systems > compliance > effects" + +[scoping] +inputs_required = [ + "README", + "roadmap", + "status-docs", + "maintenance-checklist", + "ci-and-security-docs", +] + +marker_scan_required = [ + "TODO", + "FIXME", + "XXX", + "HACK", + "STUB", + "PARTIAL", +] + +idris_unsound_scan_required = [ + "believe_me", + "assert_total", +] + +scope_assembly_buckets = ["must", "intend", "like"] + +[axis-2-maintenance-rules] +corrective-first = true +adaptive-second = true +adaptive_examples = [ + "scope-change reconciliation", + "stale-reference removal", + "obsolete-work culling", +] +perfective-third = true +perfective_source = "axis-1 honest state after corrective/adaptive updates" + +[axis-3-audit-rules] +systems-check = true +documentation-honesty-check = true +safety-security-accounted-check = true +effects-review-check = true +benchmark-evidence-required = true +maintainer-dialogue-review-required = true +compliance-seams-check = true +exception-register-required = true +exception-bounded-scope-required = true +policy-drift-contamination-check = true +example-drift-risk = "single TypeScript exception causing broad ReScript->TypeScript migration" +compliance-tooling = "panic-attack" +effects-tooling = "ecological checking with sustainabot guidance" + +[generic-cleanup-finish-off] +root-cleanup-required = true +stale-work-cull-required = true +docs-parity-required = true +machine-human-sync-required = true +compliance-finish-off-required = true +effects-finish-off-required = true +release-prep-summary-required = true +next-actions-required = ["corrective", "adaptive", "perfective"] + +[must] +root_control_files = [ + ".gitignore", + ".gitattributes", + ".editorconfig", + ".tool-versions", + "Containerfile", + "Justfile", +] + +root_hosting_files = [ + "CNAME", + ".nojekyll", +] + +ownership_files = [ + "MAINTAINER", + ".github/CODEOWNERS", +] + +machine_readable_required = [ + ".machine_readable/anchors/ANCHOR.a2ml", + ".machine_readable/contractiles/", + ".machine_readable/ai/", + ".machine_readable/bot_directives/", +] + +contractiles_required = [ + "Mustfile", + "Trustfile", + "Intentfile", +] + +security_required = [ + ".well-known/security.txt", + "ci-security-scan", +] + +quality_gate_required = [ + "format", + "lint", + "unit-tests", + "integration-tests", + "p2p-tests", + "e2e-tests", + "bench-smoke", + "docs-check", + "security-scan", +] + +abi_ffi_policy = [ + "ABI Idris2 in src/interface/abi/*.idr", + "FFI Zig in ffi/**/*.zig", +] + +[should] +docs_primary_format = "adoc" +docs_structure = [ + "docs/theory", + "docs/practice", + "docs/whitepapers/academic", + "docs/whitepapers/industry", + "docs/proofs", + "docs/reports", +] + +root_minimization = true +well_known_metadata = true +roadmap_honesty_with_dates = true +ci_doc_format_policy = true + +[could] +generate_human_from_machine = true +mode_aware_bots = ["corrective", "adaptive", "perfective", "audit"] +topology_dashboard = true +exception_registry = true diff --git a/haskell/docs/governance/MAINTENANCE-CHECKLIST.adoc b/haskell/docs/governance/MAINTENANCE-CHECKLIST.adoc new file mode 100644 index 0000000..0b40654 --- /dev/null +++ b/haskell/docs/governance/MAINTENANCE-CHECKLIST.adoc @@ -0,0 +1,569 @@ += Maintenance Checklist +# Maintenance Checklist (Cross-Repo) + +Use this as a repeatable maintenance runbook for any repo. + +Companion policy: + +- `docs/practice/SOFTWARE-DEVELOPMENT-APPROACH.adoc` (human-readable) +- `.machine_readable/policies/SOFTWARE-DEVELOPMENT-APPROACH.a2ml` (machine-readable) + +## Canonical Repo Baseline (Final) + +Apply this baseline to every repo unless an explicit exception is recorded. + +### Three-Axis Default Model + +- [ ] Axis 1 (scope priority, runs first): `must > intend > like` +- [ ] Axis 2 (maintenance priority): `corrective > adaptive > perfective` +- [ ] Axis 3 (audit priority): `systems > compliance > effects` +- [ ] Perfective items are derived from Axis 1 honest state (not started independently). + +### Axis 1 Scoping Pass (Mandatory) + +Before Axis 2/3 execution, assemble a scoped worklist from evidence: + +- [ ] Read and reconcile: `README`, roadmap, status docs, maintenance checklist, and current CI/security docs. +- [ ] Scan for unfinished markers: `TODO`, `FIXME`, `XXX`, `HACK`, `STUB`, `PARTIAL`. +- [ ] If Idris is present, scan unsoundness markers: `believe_me`, `assert_total`. +- [ ] Identify declared intent vs actual implementation (docs honesty check). +- [ ] Produce a scope assembly artifact with prioritized entries under: + - `must` (release blockers / safety / correctness) + - `intend` (planned near-term) + - `like` (nice-to-have) + +### Axis 2 Maintenance Execution Rules + +- [ ] Corrective first: fix breakage, defects, regressions, safety issues. +- [ ] Adaptive second: reconcile changed scope, remove stale references, cull no-longer-relevant work. +- [ ] Perfective third: only from current honest state established by Axis 1 and updated by corrective/adaptive actions. + +### Axis 3 Audit Rules + +- [ ] Verify systems are in place and actually operating. +- [ ] Verify documentation explains the real/current state (not aspirational-only), including documented exceptions. +- [ ] Verify safety and security controls are present, active, and evidenced. +- [ ] Verify observed effects/impacts are captured and reviewed. +- [ ] Effects audit includes: + - benchmark execution and recorded results (with before/after where relevant) + - explicit maintainer dialogue/status review on what changed, why, and next risks +- [ ] Audit compliance seams/compromises explicitly: + - policy exceptions are recorded with rationale, scope, and expiry/review + - exception does not silently broaden into general policy drift + - language-policy contamination checks run (example: a single TS exception must not trigger broad TypeScript conversion) + - run `panic-attack` as the compliance-audit scanner + - run ecological checking under effects (using sustainabot guidance as current baseline) + +### Generic Cleanup And Finish-Off Pass + +Run this pass at the end of a corrective/adaptive/perfective cycle: + +- [ ] Root cleanup: + - keep only required control/entry files in root + - move non-essential docs/reports/fixtures to canonical folders +- [ ] Remove or archive stale work: + - close out completed TODO/STUB/PARTIAL items + - cull obsolete references, dead files, and superseded plans +- [ ] Documentation finish-off: + - ensure README, roadmap, status, and wiki match actual implementation state + - ensure machine-readable policy/state files match human docs +- [ ] Security/compliance finish-off: + - run compliance scanner (`panic-attack`) and resolve high-priority findings + - verify exception register and seams/compromises are explicitly bounded +- [ ] Effects finish-off: + - run benchmark/effects checks and record evidence + - conduct explicit maintainer review dialogue (what changed, why, remaining risks) +- [ ] Release-prep finish-off: + - produce Must/Should/Could summary + - produce immediate corrective/adaptive/perfective next-actions list + +### Must + +- [ ] Keep required control files at repository root: + - `.gitignore`, `.gitattributes`, `.editorconfig`, `.tool-versions` + - `Containerfile` + - `.containerignore` (or `.dockerignore` only when required for compatibility) + - `CNAME` and `.nojekyll` when using GitHub Pages/custom domain + - `Justfile` (root by convention) +- [ ] Keep ownership/governance files present: + - `MAINTAINER` in root + - `.github/CODEOWNERS` +- [ ] Keep machine-readable canonical structure under `.machine_readable/`: + - state/meta/ecosystem files (`*.a2ml` or repo standard) + - `anchors/ANCHOR.a2ml` + - `contractiles/` (`must`, `trust`, `lust`, and related) + - `ai/` for AI guidance files + - `bot_directives/` for bot control files +- [ ] Keep contractiles/invariants present and wired: + - root `Mustfile` (or equivalent) with enforceable checks + - `Trustfile` and `Intentfile` present +- [ ] Keep security metadata present: + - `.well-known/security.txt` and relevant policy metadata + - CI security scanning configured and runnable +- [ ] Keep docs and navigation coherent: + - single navigation entry point in root (`NAVIGATION.adoc` or equivalent) + - no duplicate conflicting docs for same purpose (for example both `.md` and `.adoc` in root unless intentionally required) +- [ ] Enforce ABI/FFI purity where the policy applies: + - ABI definitions in Idris2 (`src/abi/*.idr`) + - FFI implementations in Zig (`ffi/**/*.zig`) +- [ ] Ensure quality gate includes: formatting, lint, unit/integration tests, p2p/e2e checks, benchmark smoke, docs checks, security scan. + +### Should + +- [ ] Keep human docs primarily in AsciiDoc (`.adoc`) except where ecosystem rules require other formats (GitHub/community health, legal text, tool-specific files). +- [ ] Keep non-essential root files moved into structured folders: + - `docs/` (theory/practice/whitepapers/proofs/reports) + - `tests/` (fixtures/outputs) + - `docs/legal/` (while retaining root `LICENSE` when forge detection needs it) +- [ ] Maintain `.well-known/` for public metadata where applicable (`security.txt`, `humans.txt`, `ads.txt` mirrors if used). +- [ ] Keep CI policy checks for doc-format conventions and canonical file placement. +- [ ] Keep roadmap/status docs honest with dated evidence. + +### Could + +- [ ] Maintain both human and machine views of maintenance policy from a single source (generate one from the other). +- [ ] Add policy bots for corrective/adaptive/perfective/audit modes. +- [ ] Add repo-level architecture map (`TOPOLOGY.md`) and release-readiness dashboards. +- [ ] Add per-repo exception registry for approved policy deviations. + +### Explicit Root-Placement Rule + +Do **not** move the following out of root if you want default tool behavior: + +- `.gitignore`, `.gitattributes`, `.editorconfig`, `.tool-versions` +- `Containerfile` and ignore file (`.containerignore`/`.dockerignore`) +- `CNAME` and `.nojekyll` for GitHub Pages +- `Justfile` + +## Quick Automated Run (Script) + +Use the helper script first, then use the checklist for deeper/manual follow-up. + +Script locations: +- `/var$REPOS_DIR/run-maintenance.sh` +- `~/Desktop/run-maintenance.sh` + +```bash +~/Desktop/run-maintenance.sh --repo /absolute/path/to/repo --output /tmp/maintenance-report.json +jq . /tmp/maintenance-report.json +``` + +Useful flags: + +```bash +# Strict mode: fail process on failed checks +~/Desktop/run-maintenance.sh --repo /absolute/path/to/repo --strict + +# Skip expensive checks when needed +~/Desktop/run-maintenance.sh --repo /absolute/path/to/repo --skip-panic + +# Explicit language selection +~/Desktop/run-maintenance.sh --repo /absolute/path/to/repo --rust --python + +# Release hard-pass mode (fails on warnings or failures) +~/Desktop/run-maintenance.sh --repo /absolute/path/to/repo --fail-on-warn +``` + +Permission policy in script: +- Flags `g+w/o+w` files/dirs +- Flags suspicious executable files +- Flags shebang scripts missing executable bit +- Supports repo-local exceptions via `.maintenance-perms-ignore` (regex per line) +- **Audit-first by default** (non-mutating) +- `--fix-perms` is explicit opt-in only (never implicit) +- For reversible local hardening, pair snapshot/restore scripts where available: + - `scripts/maintenance/perms-state.sh snapshot` + - `scripts/maintenance/perms-state.sh lock` + - `scripts/maintenance/perms-state.sh restore` + +Important git behavior: +- Git generally tracks execute bit, not full UNIX mode matrix. +- Permission hardening audits do not force collaborators to re-unlock every file on pull. +- Keep lock mode opt-in, with restore path documented. + +```bash +# Audit-only (recommended default) +~/Desktop/run-maintenance.sh --repo /absolute/path/to/repo + +# Opt-in permission fixes (review output before commit) +~/Desktop/run-maintenance.sh --repo /absolute/path/to/repo --fix-perms +``` + +## 0) Setup + +```bash +REPO="/absolute/path/to/repo" +cd "$REPO" +``` + +```bash +date -u +git rev-parse --abbrev-ref HEAD +git rev-parse HEAD +git status --porcelain +``` + +## 1) Preflight + +- [ ] Confirm clean intent: note existing unrelated dirty files before edits. +- [ ] Confirm runtime/toolchain versions. +- [ ] Confirm container mode expectation (`podman`/`podman-compose`) if required. + +```bash +command -v rg git jq || true +command -v podman podman-compose || true +``` + +## 2) Dependency/Env Prereqs + +- [ ] Python deps in active interpreter (for Python paths). +- [ ] Language-specific tooling installed. + +```bash +python -c "import sys; print(sys.executable)" +python -c "import pydantic; print(pydantic.__version__)" || echo "pydantic missing" +``` + +## 3) Corrective Maintenance First + +- [ ] Fix regressions, runtime errors, panics, broken commands, failing tests. +- [ ] Re-run failing checks immediately after each fix. + +## 4) Code Health Scans + +- [ ] `TODO/FIXME/XXX/HACK/STUB/PARTIAL` scan. +- [ ] Permission policy scan (`g+w/o+w`, executable hygiene). +- [ ] ABI/FFI policy scan (if applicable: Idris2 ABI, Zig FFI). + +```bash +rg -n "TODO|FIXME|XXX|HACK|STUB|PARTIAL" -g '!**/.git/**' -g '!**/target/**' . +``` + +```bash +# Optional per-repo exceptions (regex per line): +# .maintenance-perms-ignore +# ^vendor/ +# ^third_party/ +``` + +```bash +# Adjust paths for your repo layout +find . -type f \( -name '*.idr' -o -name '*.idris2' -o -name '*.zig' \) +``` + +## 5) Panic/Safety/Security Pass + +- [ ] Run `panic-attacker` assail/assault. +- [ ] Triage findings by severity. +- [ ] Fix high first, then medium. +- [ ] Re-run until acceptable. + +```bash +PANIC_BIN="/var$REPOS_DIR/panic-attacker/target/release/panic-attack" +"$PANIC_BIN" assail "$REPO" --output /tmp/assail.json --output-format json --quiet +jq -r '.weak_points | length' /tmp/assail.json +jq -r '.weak_points[] | "\(.severity)|\(.location)|\(.description)"' /tmp/assail.json +``` + +```bash +# If repo has production-only source builder, prefer this for baseline checks: +./scripts/ci/build-panic-assail-source.sh /tmp/panic-src +"$PANIC_BIN" assail /tmp/panic-src --output /tmp/assail-prod.json --output-format json --quiet +``` + +## 6) Language-Specific Validation + +### Rust + +- [ ] Format +- [ ] Lint +- [ ] Tests +- [ ] Doc tests +- [ ] Benches (where relevant) + +```bash +cargo fmt --all --check +cargo clippy --workspace --all-targets -- -D warnings +cargo test --workspace +cargo test --workspace --doc +# Optional targeted benchmarks: +cargo bench +``` + +### Python + +- [ ] Format/lint +- [ ] Type check +- [ ] Tests + +```bash +ruff check . +ruff format --check . +mypy . +pytest -q +``` + +### Elixir + +- [ ] Format check +- [ ] Lint/static checks +- [ ] Tests + +```bash +mix format --check-formatted +mix credo --strict +mix test +``` + +## 7) Container/Runtime Checks (Podman) + +- [ ] Build container path. +- [ ] Run smoke tests inside containerized flow. +- [ ] Compare host vs container behavior for parity. + +```bash +podman --version +podman compose version || podman-compose --version +``` + +## 8) Benchmark + Regression Check + +- [ ] Capture before/after metrics for touched hot paths. +- [ ] Record command + sample size + output. +- [ ] Fail change if critical path regresses beyond threshold. + +## 9) Adaptive and Perfective Maintenance + +- [ ] Adaptive: compatibility updates (tooling/API/deprecations/config flags). +- [ ] Perfective: clarity, docs parity, developer workflow improvements. +- [ ] Update roadmap/checklist/docs to match actual implementation state. + +## 10) Final QA and Release Hygiene + +- [ ] Re-run full relevant checks one final time. +- [ ] Confirm no unintended file changes. +- [ ] Commit scoped changes with clear message. +- [ ] Push and capture commit SHA. + +```bash +git status --short +git diff --stat +git add +git commit -m "maint: " +git push +``` + +## 11) Maintenance Report Template + +Copy this block per repo run: + +```text +Repo: +Branch: +Start UTC: +End UTC: + +Scope: +- Corrective: +- Adaptive: +- Perfective: + +Checks Run: +- TODO/FIXME scan: +- Panic-attacker: +- Rust/Python/Elixir checks: +- Container checks: +- Benchmark checks: + +Findings: +- High: +- Medium: +- Low: + +Fixes Applied: +1. +2. +3. + +Validation Results: +- Tests: +- Benchmarks: +- Panic-attacker rerun: + +Artifacts: +- assail report: +- benchmark output: +- logs: + +Commit(s): +- SHA: + +Remaining Risks / Follow-ups: +1. +2. +``` + +## 12) Language-Repo Additions (Eclexia-Specific) + +Add these checks for language/compiler repositories with formal ABI/FFI constraints: + +- [x] README structure restored (index/TOC, audience paths, quickstart sanity). +- [x] Wiki split by audience (laypeople/users/developers) and linked from docs index. +- [x] Root-level clutter reduced (archive, analysis, reports relegated to `docs/` subtrees). +- [x] Machine-readable docs synchronized (`STATE.a2ml`, `META.a2ml`, `ECOSYSTEM.a2ml`, contractiles). +- [x] Human-readable docs synchronized (`README`, `QUICK_STATUS`, roadmap, wiki home). +- [x] `Mustfile` invariants present and enforceable in CI. +- [x] `Trustfile` and `Intentfile` present and complete. +- [x] FFI/ABI purity policy enforced (`*.zig` for FFI, `*.idr`/Idris2 for ABI). +- [x] `panic-attack` findings triaged with explicit severity budget for release. +- [x] Point-to-point, end-to-end, and benchmark checks wired in one quality gate. +- [x] CI workflows include quality + security + docs checks with explicit policy. +- [x] Release audit includes corrective/adaptive/perfective + Must/Should/Could. +- [x] Roadmap/status honesty pass completed (dates and current evidence updated). + +## 13) Latest Execution Record (Eclexia, 2026-02-24) + +Repo: `/tmp/eclexia-releaseprep` (branch `release-prep`, base `533ec9e9447f374135cc9e2e81021624ddb3c0ad`) + +### 13.1 Setup/Preflight + +- [x] Captured UTC timestamp and git state. +- [x] Tooling presence verified (`rg`, `git`, `jq`, `cargo`, `rustc`, `just`). +- [x] Runtime/toolchain versions captured. +- [x] Container tooling checked (`podman`, `podman-compose`). + +### 13.2 Corrective Maintenance + +- [x] Fixed `panic-attack` script path handling (`mktemp` output + local fallback binary detection). +- [x] Removed Idris `believe_me` usage from ABI wrappers. +- [x] Fixed conformance crash-noise path by skipping known intentional stack-overflow case in default runner. +- [x] Re-ran affected checks after each fix. + +### 13.3 Code-Health Scans + +- [x] TODO/FIXME/STUB/PARTIAL scan run on active code paths. +- [x] ABI/FFI file inventory run (`*.idr`, `*.zig`). +- [x] Active-code marker count reduced/triaged; remaining items tracked in release audit. + +### 13.4 Security/Panic Pass + +- [x] `panic-attack` run and triaged. +- [x] Critical findings cleared (Idris unsoundness markers removed). +- [x] Current baseline: 0 weak points (Critical 0, High 0, Medium 0, Low 0). +- [x] High/Medium backlog fully eliminated. + +### 13.5 Language Validation + +- [x] Final `just quality-gate` pass completed (docs, fmt, lint, unit, conformance, integration, p2p, e2e, bench). +- [x] Additional targeted reruns completed (`just test-conformance`, `just panic-attack`, `just docs-check`). + +### 13.6 Adaptive/Perfective/Docs + +- [x] README/wiki/docs structure and indexing restored. +- [x] Root tidy/relegation pass executed. +- [x] Roadmap/status honesty update performed with current date and evidence links. +- [x] Release audit created with corrective/adaptive/perfective + Must/Should/Could. +- [x] Full quality-gate rerun passed after hardening updates. +- [x] ABI/FFI extension lane added without breaking stable symbols (`ecl_abi_get_info`, `ecl_tracker_create_ex`, `ecl_tracker_snapshot`). +- [x] CI quality workflow now validates sibling `proven` repo presence and critical binding files. +- [x] Proven roadmap now includes explicit "critical core, not full rewrite" adoption guidance and flowchart. + +### 13.7 Outstanding Items (Explicit) + +- [x] Stable `v1.0.0` technical gate readiness met (quality + panic scan clean). +- [x] Parser/codegen/runtime panic-path hardening completed for scanner-flagged paths. +- [x] Non-eclexia `proven` library checked: already Idris2-first with Zig ABI bridge; no additional integration changes required in this run. +- [ ] Remote push blocked by token scope: GitHub rejected branch updates (`release-prep`, `release-prep-pushable`) due missing `workflow` OAuth scope. + +### 13.8 Artifacts + +- Release audit: `docs/reports/V1-READINESS-AUDIT-2026-02-24.md` +- Panic report: `/tmp/eclexia-panic-attack.KZ1jpC.json` (0 weak points) +- Final quality gate log: `/tmp/eclexia-quality-gate-final2.log` (plus post-change reruns via terminal sessions) +- Local commits: `88fa2af` (`release-prep`), `baa3d1c` (`release-prep-pushable`) + pending new commit from this pass + +## 12) LLM Operator Instructions + +Use this prompt with an LLM agent when you want the process run end-to-end: + +```text +Run the maintenance workflow for this repo using MAINTENANCE-CHECKLIST.md. + +Required behavior: +1. Run ~/Desktop/run-maintenance.sh first and collect the JSON report. +2. Triage report results by severity: fail > warn > pass. +3. Execute corrective maintenance first (fix regressions, panics, broken tests/commands). +4. Run TODO/FIXME/stub scan and address relevant items. +5. Run panic-attacker and fix findings in priority order; rerun to confirm. +6. Run language-specific checks (Rust/Python/Elixir) relevant to this repo. +7. Run benchmark/regression checks for touched hot paths. +8. Enforce permission policy: + - no group/world writable source files unless justified + - executable bit only where intended + - use .maintenance-perms-ignore for justified exceptions +9. Update docs/roadmap/checklist entries to reflect actual state. +10. Produce a final report using the template in MAINTENANCE-CHECKLIST.md. + +Constraints: +- Do not revert unrelated existing dirty changes. +- Stage and commit only scoped intended files. +- If blocked, state exactly what is blocked and why. +``` + +## 13) AI Execution Integrity Contract (Mandatory) + +Use this when delegating maintenance to any AI (Gemini/Claude/ChatGPT/etc.). + +```text +You must execute this maintenance run with strict integrity. + +Non-negotiable rules: +1. Do not claim any step is complete unless you actually ran it. +2. Do not silently skip checklist items. If skipped, state SKIPPED + exact reason. +3. For every check, provide evidence: + - command executed + - pass/fail/warn + - key output summary + - artifact/log path +4. If a command fails, stop claiming success and report the failure clearly. +5. After each fix, re-run the relevant failing check and report the rerun result. +6. Do not hide uncertainty. If unsure, say so and run additional verification. +7. Never mark “all done” while any fail/warn remains unexplained. +8. Do not make destructive or broad permission changes by default. + - permission changes must be audit-first + - use --fix-perms only with explicit intent +9. Final output must include: + - checklist coverage matrix (each item: PASS/FAIL/WARN/SKIPPED) + - unresolved risks + - exact next actions +10. Prioritize user safety and reputation: no “looks fine” claims without evidence. +``` + +Recommended enforcement line for AI prompts: + +```text +Fail closed: if evidence is missing for any checklist item, treat that item as NOT DONE. +``` + +## 14) Fleet Enrollment Automation (Gitbot + Hypatia) + +For centralized coverage across existing and new repos: + +```bash +cd /var$REPOS_DIR/gitbot-fleet +just enroll-repos +``` + +Optional directive write-back to repos that already have `.machine_readable/`: + +```bash +cd /var$REPOS_DIR/gitbot-fleet +just enroll-repos /var$REPOS_DIR true +``` + +Release hard gate from fleet: + +```bash +cd /var$REPOS_DIR/gitbot-fleet +just maintenance-hard-pass /absolute/path/to/repo +``` diff --git a/haskell/docs/governance/README.adoc b/haskell/docs/governance/README.adoc new file mode 100644 index 0000000..114ee94 --- /dev/null +++ b/haskell/docs/governance/README.adoc @@ -0,0 +1 @@ += Governance Pillar (TSDM) diff --git a/haskell/docs/governance/SOFTWARE-DEVELOPMENT-APPROACH.a2ml b/haskell/docs/governance/SOFTWARE-DEVELOPMENT-APPROACH.a2ml new file mode 100644 index 0000000..093573a --- /dev/null +++ b/haskell/docs/governance/SOFTWARE-DEVELOPMENT-APPROACH.a2ml @@ -0,0 +1,53 @@ +# SPDX-License-Identifier: MPL-2.0 +# General software development approach (machine-readable) + +[metadata] +version = "1.0.0" +last-updated = "2026-02-24" +scope = "cross-repo" +source-human = "docs/practice/SOFTWARE-DEVELOPMENT-APPROACH.adoc" + +[execution] +order = ["axis-1", "axis-2", "axis-3"] + +[axis-1] +name = "scope" +priority = "must > intend > like" +inputs = [ + "README", + "roadmap", + "status-docs", + "ci-and-security-docs", +] +marker-scan = ["TODO", "FIXME", "XXX", "HACK", "STUB", "PARTIAL"] +idris-unsound-scan = ["believe_me", "assert_total"] +output = "scoped-work-assembly" + +[axis-2] +name = "maintenance" +priority = "corrective > adaptive > perfective" +corrective = "defect/regression/safety/security fixes" +adaptive = "scope reconciliation, stale-reference removal, obsolete-work culling" +perfective = "quality improvements derived from axis-1 honest state" + +[axis-3] +name = "audit" +priority = "systems > compliance > effects" +systems = "required systems present and operating" +compliance = "exceptions explicit, bounded, and drift-resistant" +effects = "benchmark/operational impact evidence captured and reviewed" +compliance-tooling = "panic-attack" +effects-tooling = "ecological checking with sustainabot guidance" + +[cleanup-finish-off] +root-cleanup = true +stale-work-cull = true +docs-sync-human-machine = true +compliance-audit = true +effects-audit = true +release-summary = ["must", "should", "could"] +next-actions = ["corrective", "adaptive", "perfective"] + +[collaboration] +maintainer-dialogue-required = true +dialogue-topics = ["what changed", "why", "remaining risks"] diff --git a/haskell/docs/governance/SOFTWARE-DEVELOPMENT-APPROACH.adoc b/haskell/docs/governance/SOFTWARE-DEVELOPMENT-APPROACH.adoc new file mode 100644 index 0000000..e8805c6 --- /dev/null +++ b/haskell/docs/governance/SOFTWARE-DEVELOPMENT-APPROACH.adoc @@ -0,0 +1,63 @@ += Software Development Approach (General) +:toc: left +:toclevels: 2 + +This is the general operating policy for software development across repositories. + +== Core Sequence + +Always run work in this order: + +1. Scope first (Axis 1) +2. Maintenance second (Axis 2) +3. Audit third (Axis 3) + +== Axis Definitions + +=== Axis 1: Scope + +Priority order: `must > intend > like` + +Axis 1 output is a scoped assembly of work based on: + +* README, roadmap, status, CI/security docs +* marker scans (`TODO`, `FIXME`, `XXX`, `HACK`, `STUB`, `PARTIAL`) +* Idris unsoundness scan when Idris exists (`believe_me`, `assert_total`) +* docs honesty check (intent vs actual implementation) + +=== Axis 2: Maintenance + +Priority order: `corrective > adaptive > perfective` + +* Corrective: fix defects, regressions, breakage, security/safety failures +* Adaptive: reconcile scope changes, remove stale references, cull obsolete work +* Perfective: improve quality/clarity/performance only from the honest Axis 1 state + +=== Axis 3: Audit + +Priority order: `systems > compliance > effects` + +* Systems: required mechanisms exist and are operating +* Compliance: seams/compromises/exceptions are explicit, bounded, and do not drift +* Effects: benchmark and operational impact evidence is captured and reviewed + +Compliance scanner baseline: `panic-attack` + +Effects/ecological baseline: sustainabot-guided ecological checking + +== Generic Cleanup And Finish-Off + +At cycle end: + +* reduce root clutter to required control/entry files +* archive/remove stale or superseded work +* synchronize human and machine docs +* run compliance and effects audits with evidence capture +* produce Must/Should/Could summary and immediate next-actions list + +== Collaboration Rule + +Effects review must include explicit maintainer dialogue: + +* what changed +* why it changed +* what risks remain diff --git a/haskell/docs/governance/TSDM.a2ml b/haskell/docs/governance/TSDM.a2ml new file mode 100644 index 0000000..f27036c --- /dev/null +++ b/haskell/docs/governance/TSDM.a2ml @@ -0,0 +1,22 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [TSDM_SPEC] +id: "tsdm-standard" +version: "1.0.0" + +axes: + axis_1: + name: "Planning" + levels: ["must", "should", "could"] + axis_2: + name: "Maintenance" + levels: ["corrective", "adaptive", "perfective"] + axis_3: + name: "Audit" + levels: ["systems", "compliance", "effects"] + +invariants: + - "Every task MUST map to at least one TSDM coordinate" + - "Axis 1 priority governs resource allocation" + - "Axis 2 type governs commit categorisation" + - "Axis 3 focus governs audit depth" diff --git a/haskell/docs/governance/TSDM.adoc b/haskell/docs/governance/TSDM.adoc new file mode 100644 index 0000000..cbd582c --- /dev/null +++ b/haskell/docs/governance/TSDM.adoc @@ -0,0 +1,26 @@ += Triaxial Software Development Methodology (TSDM) +:toc: preamble +:icons: font + +TSDM is a three-dimensional governance framework designed for high-assurance, long-lived software systems. It ensures that every project decision is mapped across three critical axes: Planning, Maintenance, and Audit. + +== The Three Axes + +=== Axis 1: Planning (Scope Priority) +* **Must:** Non-negotiable core invariants and safety requirements. +* **Should:** Essential features and planned improvements. +* **Could:** Desired enhancements and future-proofing. + +=== Axis 2: Maintenance (Execution Type) +* **Corrective:** Fixing bugs, vulnerabilities, and failures. +* **Adaptive:** Responding to environment or dependency changes. +* **Perfective:** Improving performance, refactoring, and documentation. + +=== Axis 3: Audit (Verification Focus) +* **Systems:** Integrity of tools, infrastructure, and automation. +* **Compliance:** Adherence to standards, licenses, and verified seams. +* **Effects:** Real-world impact, ecological footprint, and user feedback. + +== Integration + +TSDM is the operational core of the Rhodium Standard. Every task in the `Justfile` and every state change in `STATE.a2ml` should be justifiable within this framework. diff --git a/haskell/docs/governance/audit/0.2-AI-MANIFEST.a2ml b/haskell/docs/governance/audit/0.2-AI-MANIFEST.a2ml new file mode 100644 index 0000000..4722486 --- /dev/null +++ b/haskell/docs/governance/audit/0.2-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "governance-axis-audit" +level: 2 +parent: "../0.1-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + TSDM Audit track. diff --git a/haskell/docs/governance/audit/README.adoc b/haskell/docs/governance/audit/README.adoc new file mode 100644 index 0000000..fac3740 --- /dev/null +++ b/haskell/docs/governance/audit/README.adoc @@ -0,0 +1 @@ += Audit Axis diff --git a/haskell/docs/governance/audit/compliance/0.3-AI-MANIFEST.a2ml b/haskell/docs/governance/audit/compliance/0.3-AI-MANIFEST.a2ml new file mode 100644 index 0000000..b13ec69 --- /dev/null +++ b/haskell/docs/governance/audit/compliance/0.3-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "governance-unit-compliance" +level: 3 +parent: "../0.2-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + TSDM compliance unit within the Audit axis. diff --git a/haskell/docs/governance/audit/compliance/README.adoc b/haskell/docs/governance/audit/compliance/README.adoc new file mode 100644 index 0000000..876954f --- /dev/null +++ b/haskell/docs/governance/audit/compliance/README.adoc @@ -0,0 +1 @@ += Compliance Unit diff --git a/haskell/docs/governance/audit/effects/0.3-AI-MANIFEST.a2ml b/haskell/docs/governance/audit/effects/0.3-AI-MANIFEST.a2ml new file mode 100644 index 0000000..0bccae0 --- /dev/null +++ b/haskell/docs/governance/audit/effects/0.3-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "governance-unit-effects" +level: 3 +parent: "../0.2-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + TSDM effects unit within the Audit axis. diff --git a/haskell/docs/governance/audit/effects/README.adoc b/haskell/docs/governance/audit/effects/README.adoc new file mode 100644 index 0000000..3634799 --- /dev/null +++ b/haskell/docs/governance/audit/effects/README.adoc @@ -0,0 +1 @@ += Effects Unit diff --git a/haskell/docs/governance/audit/systems/0.3-AI-MANIFEST.a2ml b/haskell/docs/governance/audit/systems/0.3-AI-MANIFEST.a2ml new file mode 100644 index 0000000..f97bc9c --- /dev/null +++ b/haskell/docs/governance/audit/systems/0.3-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "governance-unit-systems" +level: 3 +parent: "../0.2-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + TSDM systems unit within the Audit axis. diff --git a/haskell/docs/governance/audit/systems/README.adoc b/haskell/docs/governance/audit/systems/README.adoc new file mode 100644 index 0000000..8d179b4 --- /dev/null +++ b/haskell/docs/governance/audit/systems/README.adoc @@ -0,0 +1 @@ += Systems Unit diff --git a/haskell/docs/governance/maintenance/0.2-AI-MANIFEST.a2ml b/haskell/docs/governance/maintenance/0.2-AI-MANIFEST.a2ml new file mode 100644 index 0000000..8e0dff5 --- /dev/null +++ b/haskell/docs/governance/maintenance/0.2-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "governance-axis-maintenance" +level: 2 +parent: "../0.1-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + TSDM Maintenance track. diff --git a/haskell/docs/governance/maintenance/README.adoc b/haskell/docs/governance/maintenance/README.adoc new file mode 100644 index 0000000..0ed2f1b --- /dev/null +++ b/haskell/docs/governance/maintenance/README.adoc @@ -0,0 +1 @@ += Maintenance Axis diff --git a/haskell/docs/governance/maintenance/adaptive/0.3-AI-MANIFEST.a2ml b/haskell/docs/governance/maintenance/adaptive/0.3-AI-MANIFEST.a2ml new file mode 100644 index 0000000..63d1a99 --- /dev/null +++ b/haskell/docs/governance/maintenance/adaptive/0.3-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "governance-unit-adaptive" +level: 3 +parent: "../0.2-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + TSDM adaptive unit within the Maintenance axis. diff --git a/haskell/docs/governance/maintenance/adaptive/README.adoc b/haskell/docs/governance/maintenance/adaptive/README.adoc new file mode 100644 index 0000000..7b60992 --- /dev/null +++ b/haskell/docs/governance/maintenance/adaptive/README.adoc @@ -0,0 +1 @@ += Adaptive Unit diff --git a/haskell/docs/governance/maintenance/corrective/0.3-AI-MANIFEST.a2ml b/haskell/docs/governance/maintenance/corrective/0.3-AI-MANIFEST.a2ml new file mode 100644 index 0000000..05cb89d --- /dev/null +++ b/haskell/docs/governance/maintenance/corrective/0.3-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "governance-unit-corrective" +level: 3 +parent: "../0.2-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + TSDM corrective unit within the Maintenance axis. diff --git a/haskell/docs/governance/maintenance/corrective/README.adoc b/haskell/docs/governance/maintenance/corrective/README.adoc new file mode 100644 index 0000000..ed904a8 --- /dev/null +++ b/haskell/docs/governance/maintenance/corrective/README.adoc @@ -0,0 +1 @@ += Corrective Unit diff --git a/haskell/docs/governance/maintenance/perfective/0.3-AI-MANIFEST.a2ml b/haskell/docs/governance/maintenance/perfective/0.3-AI-MANIFEST.a2ml new file mode 100644 index 0000000..832762f --- /dev/null +++ b/haskell/docs/governance/maintenance/perfective/0.3-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "governance-unit-perfective" +level: 3 +parent: "../0.2-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + TSDM perfective unit within the Maintenance axis. diff --git a/haskell/docs/governance/maintenance/perfective/README.adoc b/haskell/docs/governance/maintenance/perfective/README.adoc new file mode 100644 index 0000000..8759d74 --- /dev/null +++ b/haskell/docs/governance/maintenance/perfective/README.adoc @@ -0,0 +1 @@ += Perfective Unit diff --git a/haskell/docs/governance/planning/0.2-AI-MANIFEST.a2ml b/haskell/docs/governance/planning/0.2-AI-MANIFEST.a2ml new file mode 100644 index 0000000..80339e7 --- /dev/null +++ b/haskell/docs/governance/planning/0.2-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "governance-axis-planning" +level: 2 +parent: "../0.1-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + TSDM Planning track. diff --git a/haskell/docs/governance/planning/README.adoc b/haskell/docs/governance/planning/README.adoc new file mode 100644 index 0000000..62aa375 --- /dev/null +++ b/haskell/docs/governance/planning/README.adoc @@ -0,0 +1 @@ += Planning Axis diff --git a/haskell/docs/governance/planning/could/0.3-AI-MANIFEST.a2ml b/haskell/docs/governance/planning/could/0.3-AI-MANIFEST.a2ml new file mode 100644 index 0000000..fc17a27 --- /dev/null +++ b/haskell/docs/governance/planning/could/0.3-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "governance-unit-could" +level: 3 +parent: "../0.2-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + TSDM could unit within the Planning axis. diff --git a/haskell/docs/governance/planning/could/README.adoc b/haskell/docs/governance/planning/could/README.adoc new file mode 100644 index 0000000..ad5a6b8 --- /dev/null +++ b/haskell/docs/governance/planning/could/README.adoc @@ -0,0 +1 @@ += Could Unit diff --git a/haskell/docs/governance/planning/must/0.3-AI-MANIFEST.a2ml b/haskell/docs/governance/planning/must/0.3-AI-MANIFEST.a2ml new file mode 100644 index 0000000..0987dae --- /dev/null +++ b/haskell/docs/governance/planning/must/0.3-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "governance-unit-must" +level: 3 +parent: "../0.2-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + TSDM must unit within the Planning axis. diff --git a/haskell/docs/governance/planning/must/README.adoc b/haskell/docs/governance/planning/must/README.adoc new file mode 100644 index 0000000..47eb46d --- /dev/null +++ b/haskell/docs/governance/planning/must/README.adoc @@ -0,0 +1 @@ += Must Unit diff --git a/haskell/docs/governance/planning/should/0.3-AI-MANIFEST.a2ml b/haskell/docs/governance/planning/should/0.3-AI-MANIFEST.a2ml new file mode 100644 index 0000000..f492289 --- /dev/null +++ b/haskell/docs/governance/planning/should/0.3-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "governance-unit-should" +level: 3 +parent: "../0.2-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + TSDM should unit within the Planning axis. diff --git a/haskell/docs/governance/planning/should/README.adoc b/haskell/docs/governance/planning/should/README.adoc new file mode 100644 index 0000000..605489c --- /dev/null +++ b/haskell/docs/governance/planning/should/README.adoc @@ -0,0 +1 @@ += Should Unit diff --git a/haskell/docs/legal/0.2-AI-MANIFEST.a2ml b/haskell/docs/legal/0.2-AI-MANIFEST.a2ml new file mode 100644 index 0000000..e547798 --- /dev/null +++ b/haskell/docs/legal/0.2-AI-MANIFEST.a2ml @@ -0,0 +1,16 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "legal-track" +level: 2 +parent: "../0.1-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Sub-unit for legal and licensing documentation. Contains framework + exhibits and archival license texts. + +canonical_locations: + exhibits: "exhibits/" + texts: "texts/" diff --git a/haskell/docs/legal/EXHIBIT-A-ETHICAL-USE.txt b/haskell/docs/legal/EXHIBIT-A-ETHICAL-USE.txt new file mode 100644 index 0000000..0b20fca --- /dev/null +++ b/haskell/docs/legal/EXHIBIT-A-ETHICAL-USE.txt @@ -0,0 +1,68 @@ +SPDX-License-Identifier: MPL-2.0 + +================================================================================ +EXHIBIT A — ETHICAL USE GUIDELINES +Palimpsest-MPL License Version 1.0 +================================================================================ + +1. PURPOSE + + These guidelines define ethical use expectations for software distributed + under the Palimpsest-MPL License. They are not legally binding restrictions + but represent the community's shared values and expectations. + +2. PRINCIPLES + + 2.1. Respect for Emotional Lineage + Users and distributors should acknowledge and preserve the cultural, + narrative, and symbolic meaning embedded in Covered Software. This + includes protest traditions, cultural heritage, trauma narratives, + and community stories where documented. + + 2.2. Transparency in Automated Processing + When Covered Software is processed by Non-Interpretive Systems + (AI training, content aggregation, automated summarization), such + use should be documented publicly and not misrepresent the + provenance of outputs. + + 2.3. Good Faith Attribution + Contributors should be credited accurately. Derivative works should + maintain the attribution chain and not obscure the origins of + contributions. + + 2.4. Community Benefit + Commercial use of Covered Software should contribute to the broader + community through bug fixes, documentation, or other improvements + where feasible. + +3. SPECIFIC GUIDANCE + + 3.1. AI and Machine Learning + - Training on Covered Software requires disclosure + - Generated outputs must not claim Emotional Lineage of the original + - Model cards should reference source materials + + 3.2. Content Aggregation + - Aggregators must link back to original sources + - Context must not be stripped in ways that distort meaning + - Cultural and narrative context should be preserved + + 3.3. Commercial Products + - Products built on Covered Software should acknowledge it + - Pricing should not exploit communities that created the work + - Support and improvements should flow back to the community + +4. ENFORCEMENT + + These guidelines are enforced through community norms, not legal action. + Disputes should be raised with the Palimpsest Stewardship Council for + non-binding guidance. + +5. AMENDMENTS + + These guidelines may be updated by the Palimpsest Stewardship Council. + Updates apply to new distributions, not retroactively. + +================================================================================ +END OF EXHIBIT A +================================================================================ diff --git a/haskell/docs/legal/EXHIBIT-B-QUANTUM-SAFE.txt b/haskell/docs/legal/EXHIBIT-B-QUANTUM-SAFE.txt new file mode 100644 index 0000000..7fba8c9 --- /dev/null +++ b/haskell/docs/legal/EXHIBIT-B-QUANTUM-SAFE.txt @@ -0,0 +1,102 @@ +SPDX-License-Identifier: MPL-2.0 + +================================================================================ +EXHIBIT B — QUANTUM-SAFE PROVENANCE SPECIFICATION +Palimpsest-MPL License Version 1.0 +================================================================================ + +1. PURPOSE + + This exhibit specifies the cryptographic algorithms and procedures for + quantum-safe provenance in software distributed under the Palimpsest-MPL + License. + +2. APPROVED ALGORITHMS + + The following post-quantum cryptographic algorithms are approved for + signing Provenance Metadata: + + 2.1. Digital Signatures + - ML-DSA (FIPS 204, formerly CRYSTALS-Dilithium) + Recommended: ML-DSA-65 (security level 3) or ML-DSA-87 (level 5) + - SLH-DSA (FIPS 205, formerly SPHINCS+) + Recommended: SLH-DSA-SHA2-256f or SLH-DSA-SHAKE-256f + - FALCON (NIST Round 3 finalist) + Recommended: FALCON-1024 + + 2.2. Key Encapsulation (for encrypted provenance) + - ML-KEM (FIPS 203, formerly CRYSTALS-Kyber) + Recommended: ML-KEM-1024 + + 2.3. Hash Functions + - SHA-3 (FIPS 202) + Recommended: SHA3-256 or SHA3-512 + - SHAKE (FIPS 202 extendable output) + Recommended: SHAKE-256 + + 2.4. Key Derivation + - Argon2id (RFC 9106) + Parameters: t=3, m=65536, p=4 (minimum) + +3. PROVENANCE METADATA FORMAT + + Provenance Metadata should include: + + 3.1. Required Fields + - author-identity: Contributor name and contact + - timestamp: ISO 8601 with timezone + - content-hash: SHA3-256 hash of the contribution + - signature: Quantum-safe signature over all fields + + 3.2. Optional Fields + - parent-hash: Hash of the previous contribution in the chain + - emotional-lineage: Narrative context markers + - platform: Build/development environment + - witnesses: Third-party attestation signatures + +4. SIGNATURE PROCEDURE + + 4.1. Signing + a. Compute SHA3-256 hash of the contribution content + b. Construct metadata record with all required fields + c. Serialize metadata in canonical JSON form + d. Sign with ML-DSA-65 (or approved alternative) + e. Attach signature to distribution + + 4.2. Verification + a. Extract metadata and signature from distribution + b. Verify signature against contributor's public key + c. Verify content hash matches actual content + d. Verify timestamp is within acceptable range + e. Verify parent-hash chain if present + +5. KEY MANAGEMENT + + 5.1. Contributors should publish quantum-safe public keys via: + - OpenPGP keyservers (with PQ algorithm support) + - Repository .well-known/keys/ directory + - Contributor's personal website + + 5.2. Key rotation should occur: + - At least annually + - When algorithm recommendations change + - When key compromise is suspected + +6. TRANSITION PERIOD + + During the transition to quantum-safe cryptography: + + 6.1. Classical signatures (Ed25519, RSA) remain valid + 6.2. Hybrid signatures (classical + PQ) are encouraged + 6.3. Pure PQ signatures are preferred for new contributions + 6.4. Classical-only signatures will be deprecated in a future version + +7. COMPLIANCE + + Quantum-safe provenance is OPTIONAL under PMPL-1.0. When present, + it must follow this specification. Stripping quantum-safe signatures + from distributions is prohibited per Section 4.1 of the License. + +================================================================================ +END OF EXHIBIT B +================================================================================ diff --git a/haskell/docs/practice/.gitkeep b/haskell/docs/practice/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/haskell/docs/practice/0.2-AI-MANIFEST.a2ml b/haskell/docs/practice/0.2-AI-MANIFEST.a2ml new file mode 100644 index 0000000..257f3a4 --- /dev/null +++ b/haskell/docs/practice/0.2-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "practice-unit" +level: 2 +parent: "../0.1-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Sub-unit of the docs pillar focusing on practice. diff --git a/haskell/docs/practice/AI-CONVENTIONS.adoc b/haskell/docs/practice/AI-CONVENTIONS.adoc new file mode 100644 index 0000000..58e132b --- /dev/null +++ b/haskell/docs/practice/AI-CONVENTIONS.adoc @@ -0,0 +1,85 @@ += AI Conventions + + + +# AI Conventions (Authoritative Source) + +All AI coding agents working in this repository MUST follow these rules. +Per-tool config files (.cursorrules, .clinerules, etc.) reference this document. + +## Session Startup + +1. Read `0-AI-MANIFEST.a2ml` FIRST (mandatory gatekeeper). +2. Read `.machine_readable/STATE.a2ml` for current status and blockers. +3. Read `.machine_readable/anchors/ANCHOR.a2ml` for canonical authority boundaries. +4. Read `.machine_readable/policies/MAINTENANCE-AXES.a2ml` for maintenance/audit sequencing. +5. Read `.machine_readable/policies/MAINTENANCE-CHECKLIST.a2ml` for baseline controls. +6. Read `.machine_readable/policies/SOFTWARE-DEVELOPMENT-APPROACH.a2ml` for execution order. +7. Read `.machine_readable/AGENTIC.a2ml` for agent constraints. + +## License + +- All original code: **MPL-2.0** +- Fallback (platform-required only): MPL-2.0 with comment explaining why. +- NEVER use AGPL-3.0. +- Preserve third-party licenses verbatim. +- Every source file needs `# SPDX-License-Identifier: CC-BY-SA-4.0`. + +## Author Attribution + +- Name: **Jonathan D.A. Jewell** +- Email: **j.d.a.jewell@open.ac.uk** +- Copyright: `Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) ` + +## State Files + +State/metadata files, anchors, and policies (.a2ml) belong in `.machine_readable/` ONLY. +NEVER create STATE.a2ml, META.a2ml, ECOSYSTEM.a2ml, AGENTIC.a2ml, +NEUROSYM.a2ml, PLAYBOOK.a2ml, ANCHOR.a2ml, MAINTENANCE-AXES.a2ml, +MAINTENANCE-CHECKLIST.a2ml, or SOFTWARE-DEVELOPMENT-APPROACH.a2ml in the repository root. + +## Banned Patterns + +| Language | Banned | Reason | +|----------|-------------------------------------|---------------------------| +| Idris2 | `believe_me`, `assert_total` | Unsound escape hatches | +| Haskell | `unsafeCoerce`, `unsafePerformIO` | Breaks type safety | +| OCaml | `Obj.magic`, `Obj.repr`, `Obj.obj` | Unsafe casting | +| Coq | `Admitted` | Unproven assumption | +| Lean | `sorry` | Unproven assumption | +| Rust | `transmute` (unless FFI + SAFETY:) | Unsound reinterpret | + +## Banned Languages + +| Banned | Use Instead | +|---------------------|--------------------| +| TypeScript | ReScript | +| Node.js / npm / bun | Deno | +| Go | Rust | +| Python | Julia / Rust | + +## Container Standard + +- Runtime: **Podman** (never Docker). +- File: **Containerfile** (never Dockerfile). +- Base images: `cgr.dev/chainguard/wolfi-base:latest` or `cgr.dev/chainguard/static:latest`. + +## ABI/FFI Standard + +- ABI definitions: **Idris2** with dependent types (`src/abi/`). +- FFI implementation: **Zig** with C ABI compatibility (`ffi/zig/`). +- Generated C headers: `generated/abi/`. + +## Build System + +Use `just` (justfile) for all build, test, lint, and format tasks. + +## References + +- `0-AI-MANIFEST.a2ml` -- universal AI entry point +- `.machine_readable/AGENTIC.a2ml` -- agent permissions and constraints +- `.machine_readable/STATE.a2ml` -- current project state +- `.machine_readable/anchors/ANCHOR.a2ml` -- canonical authority and policy boundary +- `.machine_readable/policies/MAINTENANCE-AXES.a2ml` -- canonical axis sequencing and audit requirements +- `.machine_readable/policies/MAINTENANCE-CHECKLIST.a2ml` -- baseline maintenance checklist policy +- `.machine_readable/policies/SOFTWARE-DEVELOPMENT-APPROACH.a2ml` -- axis execution approach policy diff --git a/haskell/docs/practice/README.adoc b/haskell/docs/practice/README.adoc new file mode 100644 index 0000000..ae3326b --- /dev/null +++ b/haskell/docs/practice/README.adoc @@ -0,0 +1 @@ += practice Unit diff --git a/haskell/docs/practice/STATE-VISUALIZER-GUIDE.adoc b/haskell/docs/practice/STATE-VISUALIZER-GUIDE.adoc new file mode 100644 index 0000000..835db9c --- /dev/null +++ b/haskell/docs/practice/STATE-VISUALIZER-GUIDE.adoc @@ -0,0 +1,155 @@ +// SPDX-License-Identifier: CC-BY-SA-4.0 += TOPOLOGY.md — Generation Guide +Jonathan D.A. Jewell (hyperpolymath) +:toc: +:sectnums: + +== What Is TOPOLOGY.md? + +A single-file visual map of any project's architecture and completion status. +It lives in the repo root and contains: + +1. **ASCII architecture diagram** — the full system as it will look when complete +2. **Completion dashboard** — every component with a progress bar and status note +3. **Dependency graph** — what blocks what (the critical path) +4. **Update protocol** — how to keep it current + +It is designed to be readable by humans, AI agents, and rendered cleanly on any +forge (GitHub, GitLab, Codeberg, Bitbucket). + +== Why + +- Gives any contributor (human or AI) an instant picture of the whole project +- Replaces "read 20 files to understand the architecture" with one glance +- The completion dashboard makes project health visible without running anything +- Works offline, no tooling required, just a text file + +== How To Generate One + +=== Option 1: Ask an AI agent + +Use this prompt (works with Claude, Gemini, ChatGPT, or any LLM with repo access): + +[source,text] +---- +Read the entire repository and produce a TOPOLOGY.md file for the repo root. + +The file must contain exactly three sections: + +1. **System Architecture** — An ASCII box diagram showing the complete system + as it will look when finished. Use Unicode box-drawing characters + (┌ ┐ └ ┘ │ ─ ├ ┤ ┬ ┴ ┼), arrows (▲ ▼ ◄ ► → ←), and double lines + (═ ║) for boundaries. Show: + - All external services (DNS, CDN, gateways) at the top + - Application components in the middle + - Data layer (databases, caches, queues) below + - Repo infrastructure (CI, contractiles, SCM files) at the bottom + - Every box labelled, every connection labelled or obvious from context + - The diagram should be BESPOKE to this project, not generic + +2. **Completion Dashboard** — A table in a code block listing every component + from the diagram. For each component show: + - Name (left-aligned, padded to 35 chars) + - Progress bar: 10 characters using █ (done) and ░ (remaining) + - Percentage (0% to 100% in 10% increments) + - A short note explaining the status + Group components by layer/concern. End with an OVERALL summary line. + +3. **Key Dependencies** — An ASCII arrow diagram showing the critical path. + What must finish before what else can start. + +Add a header comment with SPDX-License-Identifier and Last updated date. +End with an "Update Protocol" section explaining how to maintain the file. + +Use the template at TOPOLOGY.md in rsr-template-repo as a structural reference, +but make the content completely specific to THIS project. +---- + +=== Option 2: Copy the template and fill it in + +[source,bash] +---- +cp /path/to/rsr-template-repo/TOPOLOGY.md ./TOPOLOGY.md +# Then edit: replace placeholders, draw the real architecture, fill the dashboard +---- + +=== Option 3: Batch generation across all repos + +[source,bash] +---- +# From the repos root, generate for every repo that lacks one +for repo in /path/to/your/repos/*/; do + if [ ! -f "$repo/TOPOLOGY.md" ]; then + echo "NEEDS TOPOLOGY: $(basename $repo)" + fi +done +---- + +Then feed each repo to an AI agent with the prompt above. Claude Code can do +this with a session per repo, or you can batch it. + +== Conventions + +=== Box-drawing characters + +Use Unicode, not ASCII art. This renders correctly everywhere. + +[cols="1,1", options="header"] +|=== +| Character | Use +| `┌ ┐ └ ┘` | Box corners +| `│ ─` | Vertical / horizontal lines +| `├ ┤ ┬ ┴ ┼` | T-junctions and crosses +| `═ ║` | Double lines for major boundaries +| `▲ ▼ ◄ ►` | Directional arrows +| `→ ← ↑ ↓` | Thin arrows (alternative) +|=== + +=== Progress bars + +Always 10 characters wide. Use full blocks only (no half-blocks). + +[source,text] +---- +░░░░░░░░░░ 0% Not started +█░░░░░░░░░ 10% Stub/skeleton exists +██░░░░░░░░ 20% Early work +███░░░░░░░ 30% Foundation laid +████░░░░░░ 40% Core logic started +█████░░░░░ 50% Half done +██████░░░░ 60% Most logic complete +███████░░░ 70% Working but rough +████████░░ 80% Needs polish/docs +█████████░ 90% Nearly done +██████████ 100% Complete and tested +---- + +=== Component naming + +- Use the actual names from the codebase (file names, service names, tool names) +- Group by architectural layer, not alphabetically +- Include repo infrastructure (CI, contractiles, SCM files) as a layer + +=== When to update + +- After completing a component → change bar + percentage +- After adding a component → add row +- After architectural change → redraw diagram +- After major milestone → update overall percentage +- Always update the `Last updated` date + +== Integration With Other RSR Files + +TOPOLOGY.md complements but does not replace: + +- **STATE.a2ml** — machine-readable state (tasks, blockers, next actions) +- **ECOSYSTEM.a2ml** — position in the wider project ecosystem +- **META.a2ml** — architecture decisions and design rationale +- **0-AI-MANIFEST.a2ml** — AI agent entry point and invariants + +TOPOLOGY.md is the _visual summary_ for humans; the a2ml files are the +_structured data_ for tooling. Both should agree. + +== Copyright + +Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) diff --git a/haskell/docs/reports/0.2-AI-MANIFEST.a2ml b/haskell/docs/reports/0.2-AI-MANIFEST.a2ml new file mode 100644 index 0000000..5eb265d --- /dev/null +++ b/haskell/docs/reports/0.2-AI-MANIFEST.a2ml @@ -0,0 +1,19 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "reports-unit" +level: 2 +parent: "../0.1-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Documentation unit for all automated and manual audit reports. Classified + by domain. + +canonical_locations: + maintenance: "maintenance/" + security: "security/" + performance: "performance/" + compliance: "compliance/" + quality: "quality/" diff --git a/haskell/docs/reports/README.adoc b/haskell/docs/reports/README.adoc new file mode 100644 index 0000000..0c06c31 --- /dev/null +++ b/haskell/docs/reports/README.adoc @@ -0,0 +1 @@ += reports Unit diff --git a/haskell/docs/reports/compliance/0.3-AI-MANIFEST.a2ml b/haskell/docs/reports/compliance/0.3-AI-MANIFEST.a2ml new file mode 100644 index 0000000..6b39752 --- /dev/null +++ b/haskell/docs/reports/compliance/0.3-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "report-unit-compliance" +level: 3 +parent: "../0.2-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Specialised repository for compliance findings and evidence. diff --git a/haskell/docs/reports/compliance/README.adoc b/haskell/docs/reports/compliance/README.adoc new file mode 100644 index 0000000..c38c66a --- /dev/null +++ b/haskell/docs/reports/compliance/README.adoc @@ -0,0 +1 @@ += Compliance Reports diff --git a/haskell/docs/reports/maintenance/0.3-AI-MANIFEST.a2ml b/haskell/docs/reports/maintenance/0.3-AI-MANIFEST.a2ml new file mode 100644 index 0000000..43eefe2 --- /dev/null +++ b/haskell/docs/reports/maintenance/0.3-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "report-unit-maintenance" +level: 3 +parent: "../0.2-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Maintenance reports. diff --git a/haskell/docs/reports/maintenance/README.adoc b/haskell/docs/reports/maintenance/README.adoc new file mode 100644 index 0000000..f13abf7 --- /dev/null +++ b/haskell/docs/reports/maintenance/README.adoc @@ -0,0 +1 @@ += Maintenance Reports diff --git a/haskell/docs/reports/performance/0.3-AI-MANIFEST.a2ml b/haskell/docs/reports/performance/0.3-AI-MANIFEST.a2ml new file mode 100644 index 0000000..40c0954 --- /dev/null +++ b/haskell/docs/reports/performance/0.3-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "report-unit-performance" +level: 3 +parent: "../0.2-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Specialised repository for performance findings and evidence. diff --git a/haskell/docs/reports/performance/README.adoc b/haskell/docs/reports/performance/README.adoc new file mode 100644 index 0000000..037767d --- /dev/null +++ b/haskell/docs/reports/performance/README.adoc @@ -0,0 +1 @@ += Performance Reports diff --git a/haskell/docs/reports/quality/0.3-AI-MANIFEST.a2ml b/haskell/docs/reports/quality/0.3-AI-MANIFEST.a2ml new file mode 100644 index 0000000..d460edc --- /dev/null +++ b/haskell/docs/reports/quality/0.3-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "report-unit-quality" +level: 3 +parent: "../0.2-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Specialised repository for quality findings and evidence. diff --git a/haskell/docs/reports/quality/README.adoc b/haskell/docs/reports/quality/README.adoc new file mode 100644 index 0000000..d1be848 --- /dev/null +++ b/haskell/docs/reports/quality/README.adoc @@ -0,0 +1 @@ += Quality Reports diff --git a/haskell/docs/reports/security/0.3-AI-MANIFEST.a2ml b/haskell/docs/reports/security/0.3-AI-MANIFEST.a2ml new file mode 100644 index 0000000..696ab59 --- /dev/null +++ b/haskell/docs/reports/security/0.3-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "report-unit-security" +level: 3 +parent: "../0.2-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Specialised repository for security findings and evidence. diff --git a/haskell/docs/reports/security/README.adoc b/haskell/docs/reports/security/README.adoc new file mode 100644 index 0000000..9a78a8b --- /dev/null +++ b/haskell/docs/reports/security/README.adoc @@ -0,0 +1 @@ += Security Reports diff --git a/haskell/docs/standards/0.2-AI-MANIFEST.a2ml b/haskell/docs/standards/0.2-AI-MANIFEST.a2ml new file mode 100644 index 0000000..c147c6f --- /dev/null +++ b/haskell/docs/standards/0.2-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "standards-unit" +level: 2 +parent: "../0.1-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Standards unit for high-rigor verification. diff --git a/haskell/docs/standards/README.adoc b/haskell/docs/standards/README.adoc new file mode 100644 index 0000000..34a94c4 --- /dev/null +++ b/haskell/docs/standards/README.adoc @@ -0,0 +1 @@ += Standards Unit diff --git a/haskell/docs/templates/contractiles/README.adoc b/haskell/docs/templates/contractiles/README.adoc new file mode 100644 index 0000000..4eeac6b --- /dev/null +++ b/haskell/docs/templates/contractiles/README.adoc @@ -0,0 +1,11 @@ +// SPDX-License-Identifier: CC-BY-SA-4.0 += Contractile Templates + +Blank templates for projects that want to replace the hyperpolymath +defaults with their own contractile definitions. + +Copy the relevant file to `.machine_readable/contractiles//` +and fill in your project-specific checks. + +The working examples in `.machine_readable/contractiles/` show the +full hyperpolymath setup — use those as reference. diff --git a/haskell/docs/templates/contractiles/dust/Dustfile.a2ml b/haskell/docs/templates/contractiles/dust/Dustfile.a2ml new file mode 100644 index 0000000..903af2c --- /dev/null +++ b/haskell/docs/templates/contractiles/dust/Dustfile.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +# Dustfile.a2ml — BLANK TEMPLATE +# Replace this with your project's contractile. +# See .machine_readable/contractiles/ for a working example. +# +# Copy this file to .machine_readable/contractiles/dust/Dustfile.a2ml +# and fill in your project-specific checks. + +@abstract: +[Your project's DUST contract goes here] +@end diff --git a/haskell/docs/templates/contractiles/lust/Intentfile.a2ml b/haskell/docs/templates/contractiles/lust/Intentfile.a2ml new file mode 100644 index 0000000..e313a7d --- /dev/null +++ b/haskell/docs/templates/contractiles/lust/Intentfile.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +# Intentfile.a2ml — BLANK TEMPLATE +# Replace this with your project's contractile. +# See .machine_readable/contractiles/ for a working example. +# +# Copy this file to .machine_readable/contractiles/lust/Intentfile.a2ml +# and fill in your project-specific checks. + +@abstract: +[Your project's LUST contract goes here] +@end diff --git a/haskell/docs/templates/contractiles/must/Mustfile.a2ml b/haskell/docs/templates/contractiles/must/Mustfile.a2ml new file mode 100644 index 0000000..d08796f --- /dev/null +++ b/haskell/docs/templates/contractiles/must/Mustfile.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +# Mustfile.a2ml — BLANK TEMPLATE +# Replace this with your project's contractile. +# See .machine_readable/contractiles/ for a working example. +# +# Copy this file to .machine_readable/contractiles/must/Mustfile.a2ml +# and fill in your project-specific checks. + +@abstract: +[Your project's MUST contract goes here] +@end diff --git a/haskell/docs/templates/contractiles/trust/Trustfile.a2ml b/haskell/docs/templates/contractiles/trust/Trustfile.a2ml new file mode 100644 index 0000000..842c6b0 --- /dev/null +++ b/haskell/docs/templates/contractiles/trust/Trustfile.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +# Trustfile.a2ml — BLANK TEMPLATE +# Replace this with your project's contractile. +# See .machine_readable/contractiles/ for a working example. +# +# Copy this file to .machine_readable/contractiles/trust/Trustfile.a2ml +# and fill in your project-specific checks. + +@abstract: +[Your project's TRUST contract goes here] +@end diff --git a/haskell/docs/theory/.gitkeep b/haskell/docs/theory/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/haskell/docs/theory/0.2-AI-MANIFEST.a2ml b/haskell/docs/theory/0.2-AI-MANIFEST.a2ml new file mode 100644 index 0000000..93df187 --- /dev/null +++ b/haskell/docs/theory/0.2-AI-MANIFEST.a2ml @@ -0,0 +1,23 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "theory-track" +level: 2 +parent: "../0.1-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Documentation track for domain-specific theory and research foundations. + Categorised by discipline. + +canonical_locations: + ontologies: "ontologies/" + mathematics: "mathematics/" + computing: "computing/" + socio_technical: "socio-technical/" + formalisms: "formalisms/" + other: "other/" + +invariants: + - "Theoretical claims MUST reference established academic or technical formalisms" diff --git a/haskell/docs/theory/README.adoc b/haskell/docs/theory/README.adoc new file mode 100644 index 0000000..c0ddf28 --- /dev/null +++ b/haskell/docs/theory/README.adoc @@ -0,0 +1 @@ += theory Unit diff --git a/haskell/docs/theory/computing/0.3-AI-MANIFEST.a2ml b/haskell/docs/theory/computing/0.3-AI-MANIFEST.a2ml new file mode 100644 index 0000000..f387d08 --- /dev/null +++ b/haskell/docs/theory/computing/0.3-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "theory-unit-computing" +level: 3 +parent: "../0.2-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Theoretical foundation for computing. diff --git a/haskell/docs/theory/computing/README.adoc b/haskell/docs/theory/computing/README.adoc new file mode 100644 index 0000000..4d0db25 --- /dev/null +++ b/haskell/docs/theory/computing/README.adoc @@ -0,0 +1 @@ += Computing Theory diff --git a/haskell/docs/theory/formalisms/0.3-AI-MANIFEST.a2ml b/haskell/docs/theory/formalisms/0.3-AI-MANIFEST.a2ml new file mode 100644 index 0000000..cdc2baa --- /dev/null +++ b/haskell/docs/theory/formalisms/0.3-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "theory-unit-formalisms" +level: 3 +parent: "../0.2-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Theoretical foundation for formalisms. diff --git a/haskell/docs/theory/formalisms/README.adoc b/haskell/docs/theory/formalisms/README.adoc new file mode 100644 index 0000000..5d064c3 --- /dev/null +++ b/haskell/docs/theory/formalisms/README.adoc @@ -0,0 +1 @@ += Formalisms Theory diff --git a/haskell/docs/theory/mathematics/0.3-AI-MANIFEST.a2ml b/haskell/docs/theory/mathematics/0.3-AI-MANIFEST.a2ml new file mode 100644 index 0000000..677a4da --- /dev/null +++ b/haskell/docs/theory/mathematics/0.3-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "theory-unit-mathematics" +level: 3 +parent: "../0.2-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Theoretical foundation for mathematics. diff --git a/haskell/docs/theory/mathematics/README.adoc b/haskell/docs/theory/mathematics/README.adoc new file mode 100644 index 0000000..356236f --- /dev/null +++ b/haskell/docs/theory/mathematics/README.adoc @@ -0,0 +1 @@ += Mathematics Theory diff --git a/haskell/docs/theory/ontologies/0.3-AI-MANIFEST.a2ml b/haskell/docs/theory/ontologies/0.3-AI-MANIFEST.a2ml new file mode 100644 index 0000000..d888cee --- /dev/null +++ b/haskell/docs/theory/ontologies/0.3-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "theory-unit-ontologies" +level: 3 +parent: "../0.2-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Theoretical foundation for ontologies. diff --git a/haskell/docs/theory/ontologies/README.adoc b/haskell/docs/theory/ontologies/README.adoc new file mode 100644 index 0000000..6d16ecf --- /dev/null +++ b/haskell/docs/theory/ontologies/README.adoc @@ -0,0 +1 @@ += Ontologies Theory diff --git a/haskell/docs/theory/other/0.3-AI-MANIFEST.a2ml b/haskell/docs/theory/other/0.3-AI-MANIFEST.a2ml new file mode 100644 index 0000000..166ed9e --- /dev/null +++ b/haskell/docs/theory/other/0.3-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "theory-unit-other" +level: 3 +parent: "../0.2-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Theoretical foundation for other. diff --git a/haskell/docs/theory/other/README.adoc b/haskell/docs/theory/other/README.adoc new file mode 100644 index 0000000..1861d6d --- /dev/null +++ b/haskell/docs/theory/other/README.adoc @@ -0,0 +1 @@ += Other Theory diff --git a/haskell/docs/theory/socio-technical/0.3-AI-MANIFEST.a2ml b/haskell/docs/theory/socio-technical/0.3-AI-MANIFEST.a2ml new file mode 100644 index 0000000..8919522 --- /dev/null +++ b/haskell/docs/theory/socio-technical/0.3-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "theory-unit-socio-technical" +level: 3 +parent: "../0.2-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Theoretical foundation for socio technical. diff --git a/haskell/docs/theory/socio-technical/README.adoc b/haskell/docs/theory/socio-technical/README.adoc new file mode 100644 index 0000000..9ab4ee0 --- /dev/null +++ b/haskell/docs/theory/socio-technical/README.adoc @@ -0,0 +1 @@ += Socio technical Theory diff --git a/haskell/docs/whitepapers/0.2-AI-MANIFEST.a2ml b/haskell/docs/whitepapers/0.2-AI-MANIFEST.a2ml new file mode 100644 index 0000000..c936101 --- /dev/null +++ b/haskell/docs/whitepapers/0.2-AI-MANIFEST.a2ml @@ -0,0 +1,20 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "whitepapers-track" +level: 2 +parent: "../0.1-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Unit for strategic publications and whitepapers. Categorised by target + audience: Academic, Industry, and Outreach. + +canonical_locations: + academic: "academic/" + industry: "industry/" + outreach: "outreach/" + +invariants: + - "Each sub-track MUST have a clear audience definition in its README" diff --git a/haskell/docs/whitepapers/README.adoc b/haskell/docs/whitepapers/README.adoc new file mode 100644 index 0000000..88e83c5 --- /dev/null +++ b/haskell/docs/whitepapers/README.adoc @@ -0,0 +1 @@ += whitepapers Unit diff --git a/haskell/docs/whitepapers/academic/.gitkeep b/haskell/docs/whitepapers/academic/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/haskell/docs/whitepapers/academic/0.3-AI-MANIFEST.a2ml b/haskell/docs/whitepapers/academic/0.3-AI-MANIFEST.a2ml new file mode 100644 index 0000000..ceb8a1e --- /dev/null +++ b/haskell/docs/whitepapers/academic/0.3-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "academic-unit" +level: 3 +parent: "../0.2-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Academic logic at level 3. diff --git a/haskell/docs/whitepapers/academic/README.adoc b/haskell/docs/whitepapers/academic/README.adoc new file mode 100644 index 0000000..16c3f45 --- /dev/null +++ b/haskell/docs/whitepapers/academic/README.adoc @@ -0,0 +1 @@ += Academic Logic diff --git a/haskell/docs/whitepapers/industry/.gitkeep b/haskell/docs/whitepapers/industry/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/haskell/docs/whitepapers/industry/0.3-AI-MANIFEST.a2ml b/haskell/docs/whitepapers/industry/0.3-AI-MANIFEST.a2ml new file mode 100644 index 0000000..20156dd --- /dev/null +++ b/haskell/docs/whitepapers/industry/0.3-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "industry-unit" +level: 3 +parent: "../0.2-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Industry logic at level 3. diff --git a/haskell/docs/whitepapers/industry/README.adoc b/haskell/docs/whitepapers/industry/README.adoc new file mode 100644 index 0000000..7bc7fcd --- /dev/null +++ b/haskell/docs/whitepapers/industry/README.adoc @@ -0,0 +1 @@ += Industry Logic diff --git a/haskell/docs/whitepapers/outreach/0.3-AI-MANIFEST.a2ml b/haskell/docs/whitepapers/outreach/0.3-AI-MANIFEST.a2ml new file mode 100644 index 0000000..ed7e152 --- /dev/null +++ b/haskell/docs/whitepapers/outreach/0.3-AI-MANIFEST.a2ml @@ -0,0 +1,16 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "whitepapers-track-outreach" +level: 3 +parent: "../0.2-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Documentation track for outreach, education, and general-audience + engagement. Focuses on accessibility and high-level conceptual clarity. + +invariants: + - "Language MUST be accessible to non-technical audiences" + - "Avoid deep technical jargon without providing clear definitions" diff --git a/haskell/docs/whitepapers/outreach/README.adoc b/haskell/docs/whitepapers/outreach/README.adoc new file mode 100644 index 0000000..8141463 --- /dev/null +++ b/haskell/docs/whitepapers/outreach/README.adoc @@ -0,0 +1,17 @@ += Outreach & Education +:toc: preamble +:icons: font + +This directory contains whitepapers, guides, and presentations tailored for a general audience, including schools, corporate partners, and special interest groups. + +== Target Audiences + +* **Schools & Education:** Introductory material on formal verification and sovereign systems. +* **Corporate:** High-level business value and compliance summaries. +* **Special Interest Groups:** Community-specific impact and ethical use cases. + +== Goals + +* De-mystify high-rigor engineering. +* Promote the adoption of the Rhodium Standard. +* Provide accessible entry points for non-technical stakeholders. diff --git a/haskell/docs/wikis/0.2-AI-MANIFEST.a2ml b/haskell/docs/wikis/0.2-AI-MANIFEST.a2ml new file mode 100644 index 0000000..f071ca8 --- /dev/null +++ b/haskell/docs/wikis/0.2-AI-MANIFEST.a2ml @@ -0,0 +1,15 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "wikis-track" +level: 2 +parent: "../0.1-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Long-form collaborative documentation and project knowledge base. + This directory mirrors the content structure of the project wiki. + +invariants: + - "Primary wiki format MUST be AsciiDoc (.adoc)" diff --git a/haskell/docs/wikis/README.adoc b/haskell/docs/wikis/README.adoc new file mode 100644 index 0000000..71b60d1 --- /dev/null +++ b/haskell/docs/wikis/README.adoc @@ -0,0 +1,15 @@ += Project Wikis +:toc: preamble +:icons: font + +This directory contains the source files for the project wiki. It is intended for long-form documentation, deep-dives, and community-maintained knowledge. + +== Structure + +* **Core Concepts:** Fundamental architectural ideas. +* **Workflows:** Step-by-step guides for contributors. +* **Glossary:** Definitions of project-specific terminology. + +== Wiki Synchronization + +Changes made here should be synchronised with the forge-hosted wiki (GitHub/GitLab) using the project's sync scripts. diff --git a/haskell/eclexiaiser.toml b/haskell/eclexiaiser.toml new file mode 100644 index 0000000..c753914 --- /dev/null +++ b/haskell/eclexiaiser.toml @@ -0,0 +1,19 @@ +# SPDX-License-Identifier: MPL-2.0 +# eclexiaiser manifest for a2ml-haskell + +[project] +name = "a2ml-haskell" + +[[functions]] +name = "main" +source = "src/main.rs" +energy-budget-mj = 10.0 + +[carbon] +provider = "static" +region = "GB" +static-intensity = 200.0 + +[report] +format = "text" +include-recommendations = true diff --git a/haskell/examples/0.1-AI-MANIFEST.a2ml b/haskell/examples/0.1-AI-MANIFEST.a2ml new file mode 100644 index 0000000..0d69c90 --- /dev/null +++ b/haskell/examples/0.1-AI-MANIFEST.a2ml @@ -0,0 +1 @@ +# AI Manifest - Level 1: examples diff --git a/haskell/examples/README.adoc b/haskell/examples/README.adoc new file mode 100644 index 0000000..b9cdb48 --- /dev/null +++ b/haskell/examples/README.adoc @@ -0,0 +1 @@ += examples Pillar diff --git a/haskell/examples/SafeDOMExample.res b/haskell/examples/SafeDOMExample.res new file mode 100644 index 0000000..e5c9046 --- /dev/null +++ b/haskell/examples/SafeDOMExample.res @@ -0,0 +1,109 @@ +// SPDX-License-Identifier: MPL-2.0 +// Example: Using SafeDOM for formally verified DOM mounting + +open SafeDOM + +// Example 1: Basic mounting with error handling +let mountApp = () => { + mountSafe( + "#app", + "

Hello, World!

Mounted safely with proofs.

", + ~onSuccess=el => { + Console.log("✓ App mounted successfully!") + Console.log("Element:", el) + }, + ~onError=err => { + Console.error("✗ Mount failed:", err) + } + ) +} + +// Example 2: Wait for DOM ready before mounting +let mountWhenDOMReady = () => { + mountWhenReady( + "#app", + "

App Title

", + ~onSuccess=_ => Console.log("✓ Mounted after DOM ready"), + ~onError=err => Console.error("✗ Failed:", err) + ) +} + +// Example 3: Batch mounting (atomic - all or nothing) +let mountMultiple = () => { + let specs = [ + {selector: "#header", html: "

Site Title

"}, + {selector: "#nav", html: ""}, + {selector: "#main", html: "

Content here

"}, + {selector: "#footer", html: "
© 2026
"} + ] + + switch mountBatch(specs) { + | Ok(elements) => { + Console.log(`✓ Successfully mounted ${Array.length(elements)} elements`) + elements->Array.forEach(el => Console.log(" -", el)) + } + | Error(err) => { + Console.error("✗ Batch mount failed:", err) + Console.error(" (None were mounted - atomic operation)") + } + } +} + +// Example 4: Explicit validation before mounting +let mountWithValidation = () => { + // Validate selector first + switch ProvenSelector.validate("#my-app") { + | Error(e) => Console.error(`Invalid selector: ${e}`) + | Ok(validSelector) => { + // Validate HTML + switch ProvenHTML.validate("
Content
") { + | Error(e) => Console.error(`Invalid HTML: ${e}`) + | Ok(validHtml) => { + // Now mount with proven safety + switch mount(validSelector, validHtml) { + | Mounted(el) => Console.log("✓ Mounted with validated inputs:", el) + | MountPointNotFound(s) => Console.error(`✗ Element not found: ${s}`) + | InvalidSelector(_) => Console.error("Impossible - already validated") + | InvalidHTML(_) => Console.error("Impossible - already validated") + } + } + } + } +} + +// Example 5: Integration with TEA +module MyApp = { + type model = {message: string} + type msg = NoOp + + let init = () => {message: "Hello from TEA"} + let update = (model, _msg) => model + let view = model => `

${model.message}

` +} + +let mountTEAApp = () => { + let model = MyApp.init() + let html = MyApp.view(model) + + mountWhenReady( + "#tea-app", + html, + ~onSuccess=el => { + Console.log("✓ TEA app mounted") + // Set up event handlers, subscriptions here + }, + ~onError=err => Console.error(`✗ TEA mount failed: ${err}`) + ) +} + +// Entry point +let main = () => { + Console.log("SafeDOM Examples") + Console.log("================\n") + + // Choose which example to run + mountWhenDOMReady() // Run on DOM ready +} + +// Auto-execute when module loads +main() diff --git a/haskell/examples/web-project-deno.json b/haskell/examples/web-project-deno.json new file mode 100644 index 0000000..5ddd3bd --- /dev/null +++ b/haskell/examples/web-project-deno.json @@ -0,0 +1,20 @@ +{ + "// NOTE": "Example deno.json for ReScript web projects", + "tasks": { + "build": "deno run -A npm:rescript", + "clean": "deno run -A npm:rescript clean", + "watch": "deno run -A npm:rescript -w", + "serve": "deno run -A jsr:@std/http/file-server .", + "test": "deno test --allow-all" + }, + "imports": { + "rescript": "^12.0.0", + "@rescript/core": "npm:@rescript/core@^1.6.0", + "safe-dom/": "https://raw.githubusercontent.com/hyperpolymath/rescript-dom-mounter/main/src/", + "proven/": "../proven/bindings/rescript/src/" + }, + "compilerOptions": { + "allowJs": true, + "checkJs": false + } +} diff --git a/haskell/features/0.1-AI-MANIFEST.a2ml b/haskell/features/0.1-AI-MANIFEST.a2ml new file mode 100644 index 0000000..dc3e4ee --- /dev/null +++ b/haskell/features/0.1-AI-MANIFEST.a2ml @@ -0,0 +1,17 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "features-pillar" +level: 1 +parent: "../0-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Optional project features and ecosystem integrations. Provides bootstrap + guides for high-rigor tools (Panic-Attacker, BoJ-Server, SSGs). + +canonical_locations: + panic_attacker: "panic-attacker/" + boj_server: "boj-server/" + ssg: "ssg/" diff --git a/haskell/features/README.adoc b/haskell/features/README.adoc new file mode 100644 index 0000000..3899280 --- /dev/null +++ b/haskell/features/README.adoc @@ -0,0 +1 @@ += Project Features diff --git a/haskell/features/boj-server/0.2-AI-MANIFEST.a2ml b/haskell/features/boj-server/0.2-AI-MANIFEST.a2ml new file mode 100644 index 0000000..c77798c --- /dev/null +++ b/haskell/features/boj-server/0.2-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "feature-unit-boj-server" +level: 2 +parent: "../0.1-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Bootstrap and integration logic for the boj-server ecosystem component. diff --git a/haskell/features/boj-server/README.adoc b/haskell/features/boj-server/README.adoc new file mode 100644 index 0000000..0039c37 --- /dev/null +++ b/haskell/features/boj-server/README.adoc @@ -0,0 +1,14 @@ += BoJ Server Integration +:icons: font + +This unit provides a "starting hand" for integrating with the **BoJ-Server** (Box of Justice) ecosystem — a high-rigor, verified server infrastructure. + +== Integration Options + +* **Core:** Use BoJ-Server as the primary verified backend for this project. +* **Bridge:** Utilize the BoJ-Server IPC bridge for cross-boundary communication. + +== Related Repository + +For the full specification and source, visit: +https://github.com/hyperpolymath/boj-server diff --git a/haskell/features/panic-attacker/0.2-AI-MANIFEST.a2ml b/haskell/features/panic-attacker/0.2-AI-MANIFEST.a2ml new file mode 100644 index 0000000..e61ad24 --- /dev/null +++ b/haskell/features/panic-attacker/0.2-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "feature-unit-panic-attacker" +level: 2 +parent: "../0.1-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Bootstrap and integration logic for the panic-attacker ecosystem component. diff --git a/haskell/features/panic-attacker/README.adoc b/haskell/features/panic-attacker/README.adoc new file mode 100644 index 0000000..72d56a4 --- /dev/null +++ b/haskell/features/panic-attacker/README.adoc @@ -0,0 +1,25 @@ += Panic Attacker Feature +:icons: font + +This unit integrates the **Panic-Attacker** high-rigor stress testing tool into the project lifecycle. + +== Value Proposition + +Panic-Attacker goes beyond unit testing by applying: +* **Static Analysis (Assail):** Detecting logic-based bug signatures. +* **Multi-Axis Dynamic Attacks (Assault):** Stressing CPU, Memory, Disk, and Network boundaries. + +== Usage in this Template + +This template includes a pre-configured maintenance trigger: + +[source,bash] +---- +just maint-assault +---- + +This runs a medium-intensity assault on the project binary and emits a report to `docs/reports/security/`. + +== Related Repository + +https://github.com/hyperpolymath/panic-attacker diff --git a/haskell/features/ssg/0.2-AI-MANIFEST.a2ml b/haskell/features/ssg/0.2-AI-MANIFEST.a2ml new file mode 100644 index 0000000..121c5ae --- /dev/null +++ b/haskell/features/ssg/0.2-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "feature-unit-ssg" +level: 2 +parent: "../0.1-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Bootstrap and integration logic for the ssg ecosystem component. diff --git a/haskell/features/ssg/README.adoc b/haskell/features/ssg/README.adoc new file mode 100644 index 0000000..e15687b --- /dev/null +++ b/haskell/features/ssg/README.adoc @@ -0,0 +1 @@ += Ssg Feature diff --git a/haskell/features/ssg/ssg-bootstrap.sh b/haskell/features/ssg/ssg-bootstrap.sh new file mode 100755 index 0000000..89c6fa5 --- /dev/null +++ b/haskell/features/ssg/ssg-bootstrap.sh @@ -0,0 +1,48 @@ +#!/usr/bin/env bash +# SPDX-License-Identifier: MPL-2.0 +# +# ssg-bootstrap.sh — Universal SSG Initialisation Helper +# +# Provides a starting hand for creating a documentation site or blog +# using hyperpolymath-approved formal or pretty-formal SSGs. + +set -euo pipefail + +echo "═══════════════════════════════════════════════════" +echo " SSG BOOTSTRAP HELPER" +echo "═══════════════════════════════════════════════════" +echo "" +echo "Select an SSG to initialize in this project:" +echo " [1] Casket-SSG (Haskell) — Pretty-formal, high-rigor default" +echo " [2] Ddraig-SSG (Idris2) — Super-formal, dependent-type proofed" +echo " [3] Serum-SSG (Elixir) — Concurrent, robust, BEAM-based" +echo " [4] Zola (Rust) — Fast, standalone, standard" +echo "" + +read -rp "Enter choice [1-4]: " choice + +case "$choice" in + 1) + echo "Selected: Casket-SSG" + echo "Integration: git clone https://github.com/hyperpolymath/casket-ssg docs/site" + ;; + 2) + echo "Selected: Ddraig-SSG" + echo "Integration: git clone https://github.com/hyperpolymath/ddraig-ssg docs/site" + ;; + 3) + echo "Selected: Serum-SSG" + echo "Integration: mix serum.new docs/site" + ;; + 4) + echo "Selected: Zola" + echo "Integration: zola init docs/site" + ;; + *) + echo "Invalid selection. Aborting." + exit 1 + ;; +esac + +echo "" +echo "Note: For more advanced polystack options, visit: https://github.com/hyperpolymath/polystack" diff --git a/haskell/guix.scm b/haskell/guix.scm new file mode 100644 index 0000000..dc52ee7 --- /dev/null +++ b/haskell/guix.scm @@ -0,0 +1,71 @@ +;; SPDX-License-Identifier: MPL-2.0 +;; Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) +;; +;; Guix package definition for a2ml-haskell +;; +;; Usage: +;; guix shell -D -f guix.scm # Enter development shell +;; guix build -f guix.scm # Build package +;; +;; TODO: Replace a2ml-haskell and customize inputs for your language/stack. +;; See: https://guix.gnu.org/manual/en/html_node/Defining-Packages.html + +(use-modules (guix packages) + (guix gexp) + (guix git-download) + (guix build-system gnu) + (guix licenses) + (gnu packages base)) + +(package + (name "a2ml-haskell") + (version "0.1.0") + (source (local-file "." "source" + #:recursive? #t + #:select? (lambda (file stat) + (not (string-contains file ".git"))))) + (build-system gnu-build-system) + (arguments + '(#:phases + (modify-phases %standard-phases + ;; TODO: Customize build phases for your project + ;; Examples for common stacks: + ;; + ;; Rust: + ;; (replace 'build (lambda _ (invoke "cargo" "build" "--release"))) + ;; (replace 'check (lambda _ (invoke "cargo" "test"))) + ;; + ;; Elixir: + ;; (replace 'build (lambda _ (invoke "mix" "compile"))) + ;; (replace 'check (lambda _ (invoke "mix" "test"))) + ;; + ;; Zig: + ;; (replace 'build (lambda _ (invoke "zig" "build"))) + ;; (replace 'check (lambda _ (invoke "zig" "build" "test"))) + (delete 'configure) + (delete 'build) + (delete 'check) + (replace 'install + (lambda* (#:key outputs #:allow-other-keys) + (let ((out (assoc-ref outputs "out"))) + (mkdir-p (string-append out "/share/doc")) + (copy-file "README.adoc" + (string-append out "/share/doc/README.adoc")))))))) + (native-inputs + (list + ;; TODO: Add build-time dependencies + ;; Examples: + ;; rust (gnu packages rust) + ;; elixir (gnu packages elixir) + ;; zig (gnu packages zig) + )) + (inputs + (list + ;; TODO: Add runtime dependencies + )) + (home-page "https://github.com/hyperpolymath/a2ml-haskell") + (synopsis "A hyperpolymath project") + (description "RSR-compliant project. See README.adoc for details.") + (license (list + ;; MPL-2.0 extends MPL-2.0 + mpl2.0))) diff --git a/haskell/k9iser.toml b/haskell/k9iser.toml new file mode 100644 index 0000000..f53cf7b --- /dev/null +++ b/haskell/k9iser.toml @@ -0,0 +1,37 @@ +# SPDX-License-Identifier: MPL-2.0 +# Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) +# +# k9iser manifest for a2ml-haskell +# A2ML Haskell implementation — Cabal-based parser and validator for the A2ML format + +[project] +name = "a2ml-haskell" +safety_tier = "hunt" + +[[source]] +path = "a2ml-haskell.cabal" +type = "cabal" +output = "generated/k9iser/cabal-project.k9" + +[[source]] +path = "Justfile" +type = "justfile" +output = "generated/k9iser/justfile-recipes.k9" + +[[source]] +path = "Containerfile" +type = "containerfile" +output = "generated/k9iser/container-build.k9" + +[[source]] +path = ".github/workflows/hypatia-scan.yml" +type = "workflow" +output = "generated/k9iser/ci-security.k9" + +[[constraint]] +rule = "build.dependencies has no banned_packages" +severity = "error" + +[[constraint]] +rule = "container.base_image uses chainguard or distroless" +severity = "warn" diff --git a/haskell/llm-warmup-dev.md b/haskell/llm-warmup-dev.md new file mode 100644 index 0000000..06ac0a9 --- /dev/null +++ b/haskell/llm-warmup-dev.md @@ -0,0 +1,16 @@ +# LLM Warmup — a2ml-haskell (Developer) + +## What is a2ml-haskell? +See README.adoc for overview. + +## Key Commands +- `just setup` — set up development environment +- `just build` — build the project +- `just test` — run tests +- `just doctor` — diagnose issues +- `just heal` — attempt auto-repair + +## Quick Context +- License: MPL-2.0 +- Part of hyperpolymath ecosystem +- See EXPLAINME.adoc for architecture diff --git a/haskell/llm-warmup-user.md b/haskell/llm-warmup-user.md new file mode 100644 index 0000000..fe59971 --- /dev/null +++ b/haskell/llm-warmup-user.md @@ -0,0 +1,16 @@ +# LLM Warmup — a2ml-haskell (User) + +## What is a2ml-haskell? +See README.adoc for overview. + +## Key Commands +- `just setup` — set up development environment +- `just build` — build the project +- `just test` — run tests +- `just doctor` — diagnose issues +- `just heal` — attempt auto-repair + +## Quick Context +- License: MPL-2.0 +- Part of hyperpolymath ecosystem +- See EXPLAINME.adoc for architecture diff --git a/haskell/mise.toml b/haskell/mise.toml new file mode 100644 index 0000000..6dd983f --- /dev/null +++ b/haskell/mise.toml @@ -0,0 +1,57 @@ +[tools] +# Language runtimes +node = "latest" +python = "latest" +rust = "latest" +go = "latest" +zig = "latest" +java = "latest" +bun = "latest" +denojs = "latest" + +# Package managers +npm = "latest" +yarn = "latest" +pnpm = "latest" +pip = "latest" +cargo = "latest" +go-task = "latest" + +# Formatting & Linting +gofmt = "latest" +black = "latest" +isort = "latest" +ruff = "latest" +prettier = "latest" +shfmt = "latest" +stylua = "latest" + +# Build tools +cmake = "latest" +make = "latest" +ninja = "latest" + +# Shell tools +git = "latest" +gnu-sed = "latest" +gnu-tar = "latest" +gnu-grep = "latest" + +# Testing +vitest = "latest" +pytest = "latest" +jest = "latest" + +[env] +# Common environment variables +NODE_ENV = "development" +PYTHONDONTWRITEBYTECODE = "1" +PYTHONUNBUFFERED = "1" + +# Task runner alias +[alias] +task = "go-task" +build = "cargo build --release || npm run build || go build" +test = "cargo test || npm test || go test ./..." +lint = "ruff check . || prettier --check . || black --check ." +fmt = "ruff format . || prettier --write . || black ." diff --git a/haskell/selur-compose.toml b/haskell/selur-compose.toml new file mode 100644 index 0000000..9a8cc46 --- /dev/null +++ b/haskell/selur-compose.toml @@ -0,0 +1,17 @@ +# SPDX-License-Identifier: MPL-2.0 +# Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) +# +# Stapeln service definition for a2ml-haskell +# +# Usage: +# podman-compose -f selur-compose.toml up -d +# just stack-up + +[project] +name = "a2ml-haskell" + +[services.app] +build = { context = ".", dockerfile = "Containerfile" } +restart = "unless-stopped" +networks = ["default"] +healthcheck = { test = "exit 0", interval = "30s", timeout = "5s", retries = 3 } diff --git a/haskell/setup.sh b/haskell/setup.sh new file mode 100755 index 0000000..80ef9a6 --- /dev/null +++ b/haskell/setup.sh @@ -0,0 +1,64 @@ +#!/usr/bin/env bash +# SPDX-License-Identifier: MPL-2.0 +# Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) +# +# A2Ml Haskell — Universal Setup Script +# Detects platform and shell, installs just, then hands off to Justfile. + +set -euo pipefail + +echo "═══════════════════════════════════════════════════" +echo " A2Ml Haskell — Setup" +echo "═══════════════════════════════════════════════════" +echo "" + +# Platform detection +OS="$(uname -s)" +ARCH="$(uname -m)" +echo "Platform: $OS $ARCH" + +# Shell detection +CURRENT_SHELL="$(basename "$SHELL" 2>/dev/null || echo "unknown")" +echo "Shell: $CURRENT_SHELL" +echo "" + +# Check for just +if ! command -v just >/dev/null 2>&1; then + echo "just (command runner) is required but not installed." + echo "" + case "$OS" in + Linux) + if command -v cargo >/dev/null 2>&1; then + echo "Installing just via cargo..." + cargo install just + elif command -v brew >/dev/null 2>&1; then + echo "Installing just via Homebrew..." + brew install just + else + echo "Install just from: https://just.systems/man/en/installation.html" + exit 1 + fi + ;; + Darwin) + if command -v brew >/dev/null 2>&1; then + echo "Installing just via Homebrew..." + brew install just + else + echo "Install Homebrew first: https://brew.sh" + echo "Then: brew install just" + exit 1 + fi + ;; + *) + echo "Install just from: https://just.systems/man/en/installation.html" + exit 1 + ;; + esac + echo "" +fi + +echo "Running diagnostics..." +just doctor + +echo "" +echo "Setup complete. Run 'just help-me' for common workflows." diff --git a/haskell/src/0.1-AI-MANIFEST.a2ml b/haskell/src/0.1-AI-MANIFEST.a2ml new file mode 100644 index 0000000..c92e124 --- /dev/null +++ b/haskell/src/0.1-AI-MANIFEST.a2ml @@ -0,0 +1,27 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "source-pillar" +level: 1 +parent: "../0-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Primary source code directory. Organized by role and architectural + aspect. + +canonical_locations: + core: "core/" + interface: "interface/" + bridges: "bridges/" + contracts: "contracts/" + errors: "errors/" + definitions: "definitions/" + aspects: "aspects/" + +invariants: + - "Core logic MUST reside in core/" + - "Verified seams MUST reside in interface/" + - "Safety constraints MUST reside in contracts/" + - "Failure dictionaries MUST reside in errors/" diff --git a/haskell/src/Data/A2ML.hs b/haskell/src/Data/A2ML.hs new file mode 100644 index 0000000..e16eb38 --- /dev/null +++ b/haskell/src/Data/A2ML.hs @@ -0,0 +1,32 @@ +-- SPDX-License-Identifier: MPL-2.0 +-- (MPL-2.0 preferred; MPL-2.0 required for Hackage OSI-approved policy) +-- +-- Data.A2ML — Top-level re-export module for the A2ML library. +-- +-- Provides a convenient single import for working with A2ML documents: +-- +-- @ +-- import Data.A2ML +-- +-- main :: IO () +-- main = do +-- result <- parseA2MLFile "document.a2ml" +-- case result of +-- Left err -> print err +-- Right doc -> putStrLn (renderA2ML doc) +-- @ + +module Data.A2ML + ( -- * Document types + module Data.A2ML.Types + + -- * Parsing + , module Data.A2ML.Parser + + -- * Rendering + , module Data.A2ML.Renderer + ) where + +import Data.A2ML.Parser +import Data.A2ML.Renderer +import Data.A2ML.Types diff --git a/haskell/src/Data/A2ML/Parser.hs b/haskell/src/Data/A2ML/Parser.hs new file mode 100644 index 0000000..dfcfbae --- /dev/null +++ b/haskell/src/Data/A2ML/Parser.hs @@ -0,0 +1,195 @@ +-- SPDX-License-Identifier: MPL-2.0 +-- (MPL-2.0 preferred; MPL-2.0 required for Hackage OSI-approved policy) +-- +-- Data.A2ML.Parser — Parser for A2ML (Attested Markup Language) documents. +-- +-- Parses the A2ML surface syntax into the typed AST defined in Data.A2ML.Types. +-- The parser is line-oriented and processes: +-- - Headings (# through #####) +-- - Directive blocks (@name(attrs): ... @end) +-- - Inline formatting (**bold**, *italic*, [link](url), @ref(id)) +-- - Bullet lists (- or *) + +module Data.A2ML.Parser + ( -- * Parsing + parseA2ML + , parseA2MLFile + + -- * Errors + , ParseError (..) + ) where + +import Data.A2ML.Types + +import qualified Data.Map.Strict as Map +import Data.Text (Text) +import qualified Data.Text as T +import qualified Data.Text.IO as TIO + +-- | Errors that can occur during A2ML parsing. +data ParseError + = UnterminatedDirective Int DirectiveName + -- ^ A directive block opened at the given line was never closed with @end. + | InvalidHeadingLevel Int Int + -- ^ A heading at the given line has an invalid level (must be 1-5). + | UnexpectedToken Int Text + -- ^ An unexpected token was encountered at the given line. + | EmptyDocument + -- ^ The input was empty or contained only whitespace. + deriving (Show, Eq) + +-- | Parse an A2ML document from a 'Text' value. +-- +-- Returns either a 'ParseError' or the parsed 'Document'. +-- +-- ==== Examples +-- +-- >>> parseA2ML "# Hello\n\nSome text.\n" +-- Right (Document {documentManifest = Nothing, documentBlocks = [Heading 1 [...], ...]}) +parseA2ML :: Text -> Either ParseError Document +parseA2ML input + | T.null (T.strip input) = Left EmptyDocument + | otherwise = Right (parseLines (T.lines input)) + +-- | Parse an A2ML document from a file path. +-- +-- Reads the file and delegates to 'parseA2ML'. +parseA2MLFile :: FilePath -> IO (Either ParseError Document) +parseA2MLFile path = parseA2ML <$> TIO.readFile path + +-- --------------------------------------------------------------------------- +-- Internal parsing implementation +-- --------------------------------------------------------------------------- + +-- | Parse a list of lines into a Document. +parseLines :: [Text] -> Document +parseLines ls = + let blocks = parseBlocks 1 ls + in Document { documentManifest = Nothing, documentBlocks = blocks } + +-- | Parse lines into a list of blocks, tracking line numbers. +parseBlocks :: Int -> [Text] -> [Block] +parseBlocks _ [] = [] +parseBlocks lineNum (l:ls) + -- Blank line + | T.null (T.strip l) = + BlankLine : parseBlocks (lineNum + 1) ls + + -- Heading + | Just (level, content) <- parseHeadingLine l = + Heading level (parseInlines content) : parseBlocks (lineNum + 1) ls + + -- Directive start (@name: or @name(attrs):) + | Just dirName <- parseDirectiveStart l = + let (body, rest, consumed) = collectDirectiveBody ls + dir = Directive + { directiveName = dirName + , directiveAttributes = Map.empty + , directiveBody = T.intercalate "\n" body + } + in DirectiveBlock dir : parseBlocks (lineNum + 1 + consumed) rest + + -- Bullet item + | Just itemText <- parseBulletLine l = + let (items, rest, consumed) = collectBulletItems itemText ls + in BulletList (map (parseInlines . T.strip) items) : parseBlocks (lineNum + consumed) rest + + -- Paragraph line + | otherwise = + Paragraph (parseInlines (T.strip l)) : parseBlocks (lineNum + 1) ls + +-- | Try to parse a heading line. Returns the level and remaining text. +parseHeadingLine :: Text -> Maybe (Int, Text) +parseHeadingLine line = + let stripped = T.stripStart line + hashes = T.takeWhile (== '#') stripped + level = T.length hashes + rest = T.stripStart (T.drop level stripped) + in if level >= 1 && level <= 5 && not (T.null rest) + then Just (level, rest) + else Nothing + +-- | Try to parse a directive start line (@name:). +parseDirectiveStart :: Text -> Maybe DirectiveName +parseDirectiveStart line = + let stripped = T.strip line + in if T.isPrefixOf "@" stripped && T.isSuffixOf ":" stripped + then let name = T.dropEnd 1 (T.drop 1 stripped) + in Just (toDirectiveName name) + else Nothing + +-- | Convert a text name to a DirectiveName. +toDirectiveName :: Text -> DirectiveName +toDirectiveName "abstract" = DirAbstract +toDirectiveName "refs" = DirRefs +toDirectiveName "attestation" = DirAttestation +toDirectiveName "meta" = DirMeta +toDirectiveName other = DirCustom other + +-- | Collect lines until @end, returning body lines, remaining lines, and count. +collectDirectiveBody :: [Text] -> ([Text], [Text], Int) +collectDirectiveBody = go [] 0 + where + go acc n [] = (reverse acc, [], n) + go acc n (l:ls) + | T.strip l == "@end" = (reverse acc, ls, n + 1) + | otherwise = go (l : acc) (n + 1) ls + +-- | Try to parse a bullet line (- or * prefix). +parseBulletLine :: Text -> Maybe Text +parseBulletLine line = + let stripped = T.stripStart line + in case T.uncons stripped of + Just ('-', rest) | not (T.null rest) && T.head rest == ' ' -> Just (T.drop 1 rest) + Just ('*', rest) | not (T.null rest) && T.head rest == ' ' -> Just (T.drop 1 rest) + _ -> Nothing + +-- | Collect consecutive bullet items. +collectBulletItems :: Text -> [Text] -> ([Text], [Text], Int) +collectBulletItems first = go [first] 1 + where + go acc n [] = (reverse acc, [], n) + go acc n (l:ls) = + case parseBulletLine l of + Just item -> go (item : acc) (n + 1) ls + Nothing -> (reverse acc, l : ls, n) + +-- | Parse inline elements from a text fragment. +-- +-- Handles: **bold**, *italic*, [text](url), @ref(id), `code`, and plain text. +parseInlines :: Text -> [Inline] +parseInlines t + | T.null t = [] + | otherwise = case T.breakOn "**" t of + (before, rest) + | not (T.null rest) -> + let afterOpen = T.drop 2 rest + in case T.breakOn "**" afterOpen of + (boldContent, closeRest) + | not (T.null closeRest) -> + plainChunk before + ++ [Bold (parseInlines boldContent)] + ++ parseInlines (T.drop 2 closeRest) + _ -> plainChunk before ++ parseInlines afterOpen + | otherwise -> parseInlinesItalic t + +-- | Parse inline elements looking for *italic* markers. +parseInlinesItalic :: Text -> [Inline] +parseInlinesItalic t = case T.breakOn "*" t of + (before, rest) + | not (T.null rest) -> + let afterOpen = T.drop 1 rest + in case T.breakOn "*" afterOpen of + (italicContent, closeRest) + | not (T.null closeRest) -> + plainChunk before + ++ [Italic (parseInlines italicContent)] + ++ parseInlines (T.drop 1 closeRest) + _ -> plainChunk before ++ [PlainText afterOpen] + | otherwise -> plainChunk t + +-- | Convert a non-empty text to a singleton PlainText list. +plainChunk :: Text -> [Inline] +plainChunk t + | T.null t = [] + | otherwise = [PlainText t] diff --git a/haskell/src/Data/A2ML/Renderer.hs b/haskell/src/Data/A2ML/Renderer.hs new file mode 100644 index 0000000..8f1c23c --- /dev/null +++ b/haskell/src/Data/A2ML/Renderer.hs @@ -0,0 +1,69 @@ +-- SPDX-License-Identifier: MPL-2.0 +-- (MPL-2.0 preferred; MPL-2.0 required for Hackage OSI-approved policy) +-- +-- Data.A2ML.Renderer — Render A2ML AST back to A2ML surface syntax. +-- +-- Converts the typed AST from Data.A2ML.Types into A2ML text format, +-- preserving structure and formatting conventions. + +module Data.A2ML.Renderer + ( -- * Rendering + renderA2ML + , renderBlock + , renderInline + ) where + +import Data.A2ML.Types + +import Data.Text (Text) +import qualified Data.Text as T + +-- | Render a complete A2ML 'Document' to text. +-- +-- ==== Examples +-- +-- >>> renderA2ML (Document Nothing [Heading 1 [PlainText "Hello"]]) +-- "# Hello\n" +renderA2ML :: Document -> Text +renderA2ML doc = T.intercalate "\n" (map renderBlock (documentBlocks doc)) <> "\n" + +-- | Render a single block to A2ML text. +renderBlock :: Block -> Text +renderBlock (Heading level inlines) = + T.replicate level "#" <> " " <> renderInlines inlines +renderBlock (Paragraph inlines) = + renderInlines inlines +renderBlock (BulletList items) = + T.intercalate "\n" (map (\is -> "- " <> renderInlines is) items) +renderBlock (DirectiveBlock dir) = + renderDirective dir +renderBlock BlankLine = + "" + +-- | Render a directive block. +renderDirective :: Directive -> Text +renderDirective dir = + "@" <> renderDirectiveName (directiveName dir) <> ":\n" + <> directiveBody dir <> "\n" + <> "@end" + +-- | Render a directive name to its text representation. +renderDirectiveName :: DirectiveName -> Text +renderDirectiveName DirAbstract = "abstract" +renderDirectiveName DirRefs = "refs" +renderDirectiveName DirAttestation = "attestation" +renderDirectiveName DirMeta = "meta" +renderDirectiveName (DirCustom n) = n + +-- | Render a list of inline elements to text. +renderInlines :: [Inline] -> Text +renderInlines = T.concat . map renderInline + +-- | Render a single inline element to text. +renderInline :: Inline -> Text +renderInline (PlainText t) = t +renderInline (Bold is) = "**" <> renderInlines is <> "**" +renderInline (Italic is) = "*" <> renderInlines is <> "*" +renderInline (Link text url) = "[" <> text <> "](" <> url <> ")" +renderInline (InlineRef ref) = "@ref(" <> ref <> ")" +renderInline (InlineCode c) = "`" <> c <> "`" diff --git a/haskell/src/Data/A2ML/Types.hs b/haskell/src/Data/A2ML/Types.hs new file mode 100644 index 0000000..bd967b2 --- /dev/null +++ b/haskell/src/Data/A2ML/Types.hs @@ -0,0 +1,141 @@ +-- SPDX-License-Identifier: MPL-2.0 +-- (MPL-2.0 preferred; MPL-2.0 required for Hackage OSI-approved policy) +-- +-- Data.A2ML.Types — Core data types for A2ML (Attested Markup Language) documents. +-- +-- Defines the abstract syntax tree (AST) for A2ML, including documents, +-- blocks, inline elements, directives, and attestation metadata. + +module Data.A2ML.Types + ( -- * Document + Document (..) + + -- * Block-level elements + , Block (..) + + -- * Inline elements + , Inline (..) + + -- * Directives + , Directive (..) + , DirectiveName (..) + + -- * Attestation metadata + , Attestation (..) + , TrustLevel (..) + , Manifest (..) + , Reference (..) + ) where + +import Data.Map.Strict (Map) +import Data.Text (Text) + +-- | An A2ML document consists of an optional manifest and a sequence of blocks. +data Document = Document + { documentManifest :: Maybe Manifest + -- ^ Optional manifest with attestation metadata. + , documentBlocks :: [Block] + -- ^ Top-level blocks in the document. + } deriving (Show, Eq) + +-- | Block-level elements in an A2ML document. +data Block + = Heading Int [Inline] + -- ^ Heading with level (1-5) and inline content. + | Paragraph [Inline] + -- ^ A paragraph of inline content. + | BulletList [[Inline]] + -- ^ A bullet list where each item is a sequence of inline elements. + | DirectiveBlock Directive + -- ^ A directive block (@name(attrs): ... @end). + | BlankLine + -- ^ An explicit blank line separator. + deriving (Show, Eq) + +-- | Inline elements within paragraphs and headings. +data Inline + = PlainText Text + -- ^ Literal text with no formatting. + | Bold [Inline] + -- ^ Bold text (**content**). + | Italic [Inline] + -- ^ Italic text (*content*). + | Link Text Text + -- ^ Hyperlink with display text and URL. + | InlineRef Text + -- ^ An inline reference (@ref(id)). + | InlineCode Text + -- ^ Inline code (`code`). + deriving (Show, Eq) + +-- | A directive block delimited by @name(attrs): ... @end. +data Directive = Directive + { directiveName :: DirectiveName + -- ^ The directive type (abstract, refs, attestation, etc.). + , directiveAttributes :: Map Text Text + -- ^ Key-value attributes from the directive header. + , directiveBody :: Text + -- ^ Raw body text of the directive. + } deriving (Show, Eq) + +-- | Known directive names in A2ML. +data DirectiveName + = DirAbstract + -- ^ @abstract: — Document abstract / summary. + | DirRefs + -- ^ @refs: — Reference list. + | DirAttestation + -- ^ @attestation: — Cryptographic attestation block. + | DirMeta + -- ^ @meta: — Metadata block. + | DirCustom Text + -- ^ Any other directive name not in the known set. + deriving (Show, Eq, Ord) + +-- | A cryptographic attestation attached to content. +data Attestation = Attestation + { attestationSigner :: Text + -- ^ Identity of the signer. + , attestationAlgorithm :: Text + -- ^ Signing algorithm (e.g., "ed25519", "sha256"). + , attestationSignature :: Text + -- ^ The signature value (hex or base64 encoded). + , attestationTimestamp :: Maybe Text + -- ^ Optional ISO-8601 timestamp of the attestation. + } deriving (Show, Eq) + +-- | Trust level for attested content. +data TrustLevel + = Unsigned + -- ^ No attestation present. + | SelfAttested + -- ^ Signed by the document author. + | ThirdPartyAttested + -- ^ Signed by a third-party verifier. + | MultiAttested + -- ^ Signed by multiple parties. + deriving (Show, Eq, Ord, Enum, Bounded) + +-- | Document-level manifest with provenance and attestation metadata. +data Manifest = Manifest + { manifestTitle :: Maybe Text + -- ^ Optional document title. + , manifestAuthor :: Maybe Text + -- ^ Optional document author. + , manifestVersion :: Maybe Text + -- ^ Optional document version string. + , manifestLicense :: Maybe Text + -- ^ SPDX license identifier. + , manifestTrustLevel :: TrustLevel + -- ^ Overall trust level of the document. + , manifestAttestations :: [Attestation] + -- ^ Attestations attached to the manifest. + } deriving (Show, Eq) + +-- | A bibliographic reference in an @refs: block. +data Reference = Reference + { referenceId :: Text + -- ^ Reference identifier (e.g., "1", "rfc9110"). + , referenceText :: Text + -- ^ Display text / citation. + } deriving (Show, Eq) diff --git a/haskell/src/README.adoc b/haskell/src/README.adoc new file mode 100644 index 0000000..5529f66 --- /dev/null +++ b/haskell/src/README.adoc @@ -0,0 +1 @@ += src Pillar diff --git a/haskell/src/aspects/0.2-AI-MANIFEST.a2ml b/haskell/src/aspects/0.2-AI-MANIFEST.a2ml new file mode 100644 index 0000000..3d5b209 --- /dev/null +++ b/haskell/src/aspects/0.2-AI-MANIFEST.a2ml @@ -0,0 +1,17 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "source-unit-aspects" +level: 2 +parent: "../0.1-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Cross-cutting concerns and domain-specific aspects (Security, + Observability, Integrity). + +canonical_locations: + security: "security/" + observability: "observability/" + integrity: "integrity/" diff --git a/haskell/src/aspects/README.adoc b/haskell/src/aspects/README.adoc new file mode 100644 index 0000000..6456f96 --- /dev/null +++ b/haskell/src/aspects/README.adoc @@ -0,0 +1 @@ += Aspects Pillar diff --git a/haskell/src/aspects/integrity/0.3-AI-MANIFEST.a2ml b/haskell/src/aspects/integrity/0.3-AI-MANIFEST.a2ml new file mode 100644 index 0000000..f114cbd --- /dev/null +++ b/haskell/src/aspects/integrity/0.3-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "aspect-unit-integrity" +level: 3 +parent: "../0.2-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Implementation logic for the integrity aspect. diff --git a/haskell/src/aspects/integrity/README.adoc b/haskell/src/aspects/integrity/README.adoc new file mode 100644 index 0000000..f15d829 --- /dev/null +++ b/haskell/src/aspects/integrity/README.adoc @@ -0,0 +1 @@ += Integrity Aspect diff --git a/haskell/src/aspects/observability/0.3-AI-MANIFEST.a2ml b/haskell/src/aspects/observability/0.3-AI-MANIFEST.a2ml new file mode 100644 index 0000000..e16cbdf --- /dev/null +++ b/haskell/src/aspects/observability/0.3-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "aspect-unit-observability" +level: 3 +parent: "../0.2-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Implementation logic for the observability aspect. diff --git a/haskell/src/aspects/observability/README.adoc b/haskell/src/aspects/observability/README.adoc new file mode 100644 index 0000000..7852ee6 --- /dev/null +++ b/haskell/src/aspects/observability/README.adoc @@ -0,0 +1 @@ += Observability Aspect diff --git a/haskell/src/aspects/security/0.3-AI-MANIFEST.a2ml b/haskell/src/aspects/security/0.3-AI-MANIFEST.a2ml new file mode 100644 index 0000000..0996536 --- /dev/null +++ b/haskell/src/aspects/security/0.3-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "aspect-unit-security" +level: 3 +parent: "../0.2-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Implementation logic for the security aspect. diff --git a/haskell/src/aspects/security/README.adoc b/haskell/src/aspects/security/README.adoc new file mode 100644 index 0000000..3c3536e --- /dev/null +++ b/haskell/src/aspects/security/README.adoc @@ -0,0 +1 @@ += Security Aspect diff --git a/haskell/src/bridges/0.2-AI-MANIFEST.a2ml b/haskell/src/bridges/0.2-AI-MANIFEST.a2ml new file mode 100644 index 0000000..3d3e27a --- /dev/null +++ b/haskell/src/bridges/0.2-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "source-unit-bridges" +level: 2 +parent: "../0.1-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Integration logic for external systems (API, Database, RPC, etc.). diff --git a/haskell/src/contracts/0.2-AI-MANIFEST.a2ml b/haskell/src/contracts/0.2-AI-MANIFEST.a2ml new file mode 100644 index 0000000..0bd9198 --- /dev/null +++ b/haskell/src/contracts/0.2-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "source-unit-contracts" +level: 2 +parent: "../0.1-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Contracts unit for high-rigor source code. diff --git a/haskell/src/contracts/README.adoc b/haskell/src/contracts/README.adoc new file mode 100644 index 0000000..9cfa209 --- /dev/null +++ b/haskell/src/contracts/README.adoc @@ -0,0 +1 @@ += Contracts Unit diff --git a/haskell/src/core/0.2-AI-MANIFEST.a2ml b/haskell/src/core/0.2-AI-MANIFEST.a2ml new file mode 100644 index 0000000..22846c7 --- /dev/null +++ b/haskell/src/core/0.2-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "source-unit-core" +level: 2 +parent: "../0.1-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Primary application logic and core domain models. diff --git a/haskell/src/definitions/0.2-AI-MANIFEST.a2ml b/haskell/src/definitions/0.2-AI-MANIFEST.a2ml new file mode 100644 index 0000000..e54f4da --- /dev/null +++ b/haskell/src/definitions/0.2-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "source-unit-definitions" +level: 2 +parent: "../0.1-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Definitions unit for high-rigor source code. diff --git a/haskell/src/definitions/README.adoc b/haskell/src/definitions/README.adoc new file mode 100644 index 0000000..9548349 --- /dev/null +++ b/haskell/src/definitions/README.adoc @@ -0,0 +1 @@ += Definitions Unit diff --git a/haskell/src/errors/0.2-AI-MANIFEST.a2ml b/haskell/src/errors/0.2-AI-MANIFEST.a2ml new file mode 100644 index 0000000..dddcc6c --- /dev/null +++ b/haskell/src/errors/0.2-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "source-unit-errors" +level: 2 +parent: "../0.1-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Errors unit for high-rigor source code. diff --git a/haskell/src/errors/README.adoc b/haskell/src/errors/README.adoc new file mode 100644 index 0000000..460fc1e --- /dev/null +++ b/haskell/src/errors/README.adoc @@ -0,0 +1 @@ += Errors Unit diff --git a/haskell/src/interface/0.2-AI-MANIFEST.a2ml b/haskell/src/interface/0.2-AI-MANIFEST.a2ml new file mode 100644 index 0000000..7f0f471 --- /dev/null +++ b/haskell/src/interface/0.2-AI-MANIFEST.a2ml @@ -0,0 +1,24 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "interface-seams-unit" +level: 2 +parent: "../0.1-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Consolidated "Verified Interface Seams" unit. This directory unifies the + formal specification (ABI), the bridge implementation (FFI), and the + resulting artifacts (Generated). + +canonical_locations: + abi: "abi/" + ffi: "ffi/" + generated: "generated/" + +invariants: + - "ABI MUST be Idris2 (.idr)" + - "FFI MUST be Zig (.zig)" + - "Generated artifacts MUST be C-compatible" + - "The 'Truth' lives in abi/; the 'Implementation' lives in ffi/" diff --git a/haskell/src/interface/README.adoc b/haskell/src/interface/README.adoc new file mode 100644 index 0000000..8faf0aa --- /dev/null +++ b/haskell/src/interface/README.adoc @@ -0,0 +1 @@ += interface Unit diff --git a/haskell/src/interface/abi/0.3-AI-MANIFEST.a2ml b/haskell/src/interface/abi/0.3-AI-MANIFEST.a2ml new file mode 100644 index 0000000..91cafa0 --- /dev/null +++ b/haskell/src/interface/abi/0.3-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "abi-logic" +level: 3 +parent: "../0.2-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Specialised Level 3 logic for abi. diff --git a/haskell/src/interface/abi/README.adoc b/haskell/src/interface/abi/README.adoc new file mode 100644 index 0000000..2330304 --- /dev/null +++ b/haskell/src/interface/abi/README.adoc @@ -0,0 +1 @@ += abi Logic diff --git a/haskell/src/interface/ffi/0.3-AI-MANIFEST.a2ml b/haskell/src/interface/ffi/0.3-AI-MANIFEST.a2ml new file mode 100644 index 0000000..bf456ae --- /dev/null +++ b/haskell/src/interface/ffi/0.3-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "ffi-logic" +level: 3 +parent: "../0.2-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Specialised Level 3 logic for ffi. diff --git a/haskell/src/interface/ffi/README.adoc b/haskell/src/interface/ffi/README.adoc new file mode 100644 index 0000000..8fe57d3 --- /dev/null +++ b/haskell/src/interface/ffi/README.adoc @@ -0,0 +1 @@ += ffi Logic diff --git a/haskell/src/interface/ffi/build.zig b/haskell/src/interface/ffi/build.zig new file mode 100644 index 0000000..6d41e7d --- /dev/null +++ b/haskell/src/interface/ffi/build.zig @@ -0,0 +1,94 @@ +// a2ml-haskell FFI Build Configuration +// SPDX-License-Identifier: MPL-2.0 + +const std = @import("std"); + +pub fn build(b: *std.Build) void { + const target = b.standardTargetOptions(.{}); + const optimize = b.standardOptimizeOption(.{}); + + // Shared library (.so, .dylib, .dll) + const lib = b.addSharedLibrary(.{ + .name = "{{project}}", + .root_source_file = b.path("src/main.zig"), + .target = target, + .optimize = optimize, + }); + + // Set version + lib.version = .{ .major = 0, .minor = 1, .patch = 0 }; + + // Static library (.a) + const lib_static = b.addStaticLibrary(.{ + .name = "{{project}}", + .root_source_file = b.path("src/main.zig"), + .target = target, + .optimize = optimize, + }); + + // Install artifacts + b.installArtifact(lib); + b.installArtifact(lib_static); + + // Generate header file for C compatibility + const header = b.addInstallHeader( + b.path("include/{{project}}.h"), + "{{project}}.h", + ); + b.getInstallStep().dependOn(&header.step); + + // Unit tests + const lib_tests = b.addTest(.{ + .root_source_file = b.path("src/main.zig"), + .target = target, + .optimize = optimize, + }); + + const run_lib_tests = b.addRunArtifact(lib_tests); + + const test_step = b.step("test", "Run library tests"); + test_step.dependOn(&run_lib_tests.step); + + // Integration tests + const integration_tests = b.addTest(.{ + .root_source_file = b.path("test/integration_test.zig"), + .target = target, + .optimize = optimize, + }); + + integration_tests.linkLibrary(lib); + + const run_integration_tests = b.addRunArtifact(integration_tests); + + const integration_test_step = b.step("test-integration", "Run integration tests"); + integration_test_step.dependOn(&run_integration_tests.step); + + // Documentation + const docs = b.addTest(.{ + .root_source_file = b.path("src/main.zig"), + .target = target, + .optimize = .Debug, + }); + + const docs_step = b.step("docs", "Generate documentation"); + docs_step.dependOn(&b.addInstallDirectory(.{ + .source_dir = docs.getEmittedDocs(), + .install_dir = .prefix, + .install_subdir = "docs", + }).step); + + // Benchmark (if needed) + const bench = b.addExecutable(.{ + .name = "{{project}}-bench", + .root_source_file = b.path("bench/bench.zig"), + .target = target, + .optimize = .ReleaseFast, + }); + + bench.linkLibrary(lib); + + const run_bench = b.addRunArtifact(bench); + + const bench_step = b.step("bench", "Run benchmarks"); + bench_step.dependOn(&run_bench.step); +} diff --git a/haskell/src/interface/ffi/src/0.4-AI-MANIFEST.a2ml b/haskell/src/interface/ffi/src/0.4-AI-MANIFEST.a2ml new file mode 100644 index 0000000..5b5f1b1 --- /dev/null +++ b/haskell/src/interface/ffi/src/0.4-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "src-unit" +level: 4 +parent: "../0.3-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Src logic at level 4. diff --git a/haskell/src/interface/ffi/src/README.adoc b/haskell/src/interface/ffi/src/README.adoc new file mode 100644 index 0000000..a5c0c6d --- /dev/null +++ b/haskell/src/interface/ffi/src/README.adoc @@ -0,0 +1 @@ += Src Logic diff --git a/haskell/src/interface/ffi/src/main.zig b/haskell/src/interface/ffi/src/main.zig new file mode 100644 index 0000000..d8b2dc2 --- /dev/null +++ b/haskell/src/interface/ffi/src/main.zig @@ -0,0 +1,274 @@ +// a2ml-haskell FFI Implementation +// +// This module implements the C-compatible FFI declared in src/abi/Foreign.idr +// All types and layouts must match the Idris2 ABI definitions. +// +// SPDX-License-Identifier: MPL-2.0 + +const std = @import("std"); + +// Version information (keep in sync with project) +const VERSION = "0.1.0"; +const BUILD_INFO = "a2ml-haskell built with Zig " ++ @import("builtin").zig_version_string; + +/// Thread-local error storage +threadlocal var last_error: ?[]const u8 = null; + +/// Set the last error message +fn setError(msg: []const u8) void { + last_error = msg; +} + +/// Clear the last error +fn clearError() void { + last_error = null; +} + +//============================================================================== +// Core Types (must match src/abi/Types.idr) +//============================================================================== + +/// Result codes (must match Idris2 Result type) +pub const Result = enum(c_int) { + ok = 0, + @"error" = 1, + invalid_param = 2, + out_of_memory = 3, + null_pointer = 4, +}; + +/// Library handle (opaque to prevent direct access) +pub const Handle = opaque { + // Internal state hidden from C + allocator: std.mem.Allocator, + initialized: bool, + // Add your fields here +}; + +//============================================================================== +// Library Lifecycle +//============================================================================== + +/// Initialize the library +/// Returns a handle, or null on failure +export fn {{project}}_init() ?*Handle { + const allocator = std.heap.c_allocator; + + const handle = allocator.create(Handle) catch { + setError("Failed to allocate handle"); + return null; + }; + + // Initialize handle + handle.* = .{ + .allocator = allocator, + .initialized = true, + }; + + clearError(); + return handle; +} + +/// Free the library handle +export fn {{project}}_free(handle: ?*Handle) void { + const h = handle orelse return; + const allocator = h.allocator; + + // Clean up resources + h.initialized = false; + + allocator.destroy(h); + clearError(); +} + +//============================================================================== +// Core Operations +//============================================================================== + +/// Process data (example operation) +export fn {{project}}_process(handle: ?*Handle, input: u32) Result { + const h = handle orelse { + setError("Null handle"); + return .null_pointer; + }; + + if (!h.initialized) { + setError("Handle not initialized"); + return .@"error"; + } + + // Example processing logic + _ = input; + + clearError(); + return .ok; +} + +//============================================================================== +// String Operations +//============================================================================== + +/// Get a string result (example) +/// Caller must free the returned string +export fn {{project}}_get_string(handle: ?*Handle) ?[*:0]const u8 { + const h = handle orelse { + setError("Null handle"); + return null; + }; + + if (!h.initialized) { + setError("Handle not initialized"); + return null; + } + + // Example: allocate and return a string + const result = h.allocator.dupeZ(u8, "Example result") catch { + setError("Failed to allocate string"); + return null; + }; + + clearError(); + return result.ptr; +} + +/// Free a string allocated by the library +export fn {{project}}_free_string(str: ?[*:0]const u8) void { + const s = str orelse return; + const allocator = std.heap.c_allocator; + + const slice = std.mem.span(s); + allocator.free(slice); +} + +//============================================================================== +// Array/Buffer Operations +//============================================================================== + +/// Process an array of data +export fn {{project}}_process_array( + handle: ?*Handle, + buffer: ?[*]const u8, + len: u32, +) Result { + const h = handle orelse { + setError("Null handle"); + return .null_pointer; + }; + + const buf = buffer orelse { + setError("Null buffer"); + return .null_pointer; + }; + + if (!h.initialized) { + setError("Handle not initialized"); + return .@"error"; + } + + // Access the buffer + const data = buf[0..len]; + _ = data; + + // Process data here + + clearError(); + return .ok; +} + +//============================================================================== +// Error Handling +//============================================================================== + +/// Get the last error message +/// Returns null if no error +export fn {{project}}_last_error() ?[*:0]const u8 { + const err = last_error orelse return null; + + // Return C string (static storage, no need to free) + const allocator = std.heap.c_allocator; + const c_str = allocator.dupeZ(u8, err) catch return null; + return c_str.ptr; +} + +//============================================================================== +// Version Information +//============================================================================== + +/// Get the library version +export fn {{project}}_version() [*:0]const u8 { + return VERSION.ptr; +} + +/// Get build information +export fn {{project}}_build_info() [*:0]const u8 { + return BUILD_INFO.ptr; +} + +//============================================================================== +// Callback Support +//============================================================================== + +/// Callback function type (C ABI) +pub const Callback = *const fn (u64, u32) callconv(.C) u32; + +/// Register a callback +export fn {{project}}_register_callback( + handle: ?*Handle, + callback: ?Callback, +) Result { + const h = handle orelse { + setError("Null handle"); + return .null_pointer; + }; + + const cb = callback orelse { + setError("Null callback"); + return .null_pointer; + }; + + if (!h.initialized) { + setError("Handle not initialized"); + return .@"error"; + } + + // Store callback for later use + _ = cb; + + clearError(); + return .ok; +} + +//============================================================================== +// Utility Functions +//============================================================================== + +/// Check if handle is initialized +export fn {{project}}_is_initialized(handle: ?*Handle) u32 { + const h = handle orelse return 0; + return if (h.initialized) 1 else 0; +} + +//============================================================================== +// Tests +//============================================================================== + +test "lifecycle" { + const handle = {{project}}_init() orelse return error.InitFailed; + defer {{project}}_free(handle); + + try std.testing.expect({{project}}_is_initialized(handle) == 1); +} + +test "error handling" { + const result = {{project}}_process(null, 0); + try std.testing.expectEqual(Result.null_pointer, result); + + const err = {{project}}_last_error(); + try std.testing.expect(err != null); +} + +test "version" { + const ver = {{project}}_version(); + const ver_str = std.mem.span(ver); + try std.testing.expectEqualStrings(VERSION, ver_str); +} diff --git a/haskell/src/interface/ffi/test/0.4-AI-MANIFEST.a2ml b/haskell/src/interface/ffi/test/0.4-AI-MANIFEST.a2ml new file mode 100644 index 0000000..e02427f --- /dev/null +++ b/haskell/src/interface/ffi/test/0.4-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "test-unit" +level: 4 +parent: "../0.3-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Test logic at level 4. diff --git a/haskell/src/interface/ffi/test/README.adoc b/haskell/src/interface/ffi/test/README.adoc new file mode 100644 index 0000000..f6f38bf --- /dev/null +++ b/haskell/src/interface/ffi/test/README.adoc @@ -0,0 +1 @@ += Test Logic diff --git a/haskell/src/interface/ffi/test/integration_test.zig b/haskell/src/interface/ffi/test/integration_test.zig new file mode 100644 index 0000000..d0301fb --- /dev/null +++ b/haskell/src/interface/ffi/test/integration_test.zig @@ -0,0 +1,182 @@ +// a2ml-haskell Integration Tests +// SPDX-License-Identifier: MPL-2.0 +// +// These tests verify that the Zig FFI correctly implements the Idris2 ABI + +const std = @import("std"); +const testing = std.testing; + +// Import FFI functions +extern fn {{project}}_init() ?*opaque {}; +extern fn {{project}}_free(?*opaque {}) void; +extern fn {{project}}_process(?*opaque {}, u32) c_int; +extern fn {{project}}_get_string(?*opaque {}) ?[*:0]const u8; +extern fn {{project}}_free_string(?[*:0]const u8) void; +extern fn {{project}}_last_error() ?[*:0]const u8; +extern fn {{project}}_version() [*:0]const u8; +extern fn {{project}}_is_initialized(?*opaque {}) u32; + +//============================================================================== +// Lifecycle Tests +//============================================================================== + +test "create and destroy handle" { + const handle = {{project}}_init() orelse return error.InitFailed; + defer {{project}}_free(handle); + + try testing.expect(handle != null); +} + +test "handle is initialized" { + const handle = {{project}}_init() orelse return error.InitFailed; + defer {{project}}_free(handle); + + const initialized = {{project}}_is_initialized(handle); + try testing.expectEqual(@as(u32, 1), initialized); +} + +test "null handle is not initialized" { + const initialized = {{project}}_is_initialized(null); + try testing.expectEqual(@as(u32, 0), initialized); +} + +//============================================================================== +// Operation Tests +//============================================================================== + +test "process with valid handle" { + const handle = {{project}}_init() orelse return error.InitFailed; + defer {{project}}_free(handle); + + const result = {{project}}_process(handle, 42); + try testing.expectEqual(@as(c_int, 0), result); // 0 = ok +} + +test "process with null handle returns error" { + const result = {{project}}_process(null, 42); + try testing.expectEqual(@as(c_int, 4), result); // 4 = null_pointer +} + +//============================================================================== +// String Tests +//============================================================================== + +test "get string result" { + const handle = {{project}}_init() orelse return error.InitFailed; + defer {{project}}_free(handle); + + const str = {{project}}_get_string(handle); + defer if (str) |s| {{project}}_free_string(s); + + try testing.expect(str != null); +} + +test "get string with null handle" { + const str = {{project}}_get_string(null); + try testing.expect(str == null); +} + +//============================================================================== +// Error Handling Tests +//============================================================================== + +test "last error after null handle operation" { + _ = {{project}}_process(null, 0); + + const err = {{project}}_last_error(); + try testing.expect(err != null); + + if (err) |e| { + const err_str = std.mem.span(e); + try testing.expect(err_str.len > 0); + } +} + +test "no error after successful operation" { + const handle = {{project}}_init() orelse return error.InitFailed; + defer {{project}}_free(handle); + + _ = {{project}}_process(handle, 0); + + // Error should be cleared after successful operation + // (This depends on implementation) +} + +//============================================================================== +// Version Tests +//============================================================================== + +test "version string is not empty" { + const ver = {{project}}_version(); + const ver_str = std.mem.span(ver); + + try testing.expect(ver_str.len > 0); +} + +test "version string is semantic version format" { + const ver = {{project}}_version(); + const ver_str = std.mem.span(ver); + + // Should be in format X.Y.Z + try testing.expect(std.mem.count(u8, ver_str, ".") >= 1); +} + +//============================================================================== +// Memory Safety Tests +//============================================================================== + +test "multiple handles are independent" { + const h1 = {{project}}_init() orelse return error.InitFailed; + defer {{project}}_free(h1); + + const h2 = {{project}}_init() orelse return error.InitFailed; + defer {{project}}_free(h2); + + try testing.expect(h1 != h2); + + // Operations on h1 should not affect h2 + _ = {{project}}_process(h1, 1); + _ = {{project}}_process(h2, 2); +} + +test "double free is safe" { + const handle = {{project}}_init() orelse return error.InitFailed; + + {{project}}_free(handle); + {{project}}_free(handle); // Should not crash +} + +test "free null is safe" { + {{project}}_free(null); // Should not crash +} + +//============================================================================== +// Thread Safety Tests (if applicable) +//============================================================================== + +test "concurrent operations" { + const handle = {{project}}_init() orelse return error.InitFailed; + defer {{project}}_free(handle); + + const ThreadContext = struct { + h: *opaque {}, + id: u32, + }; + + const thread_fn = struct { + fn run(ctx: ThreadContext) void { + _ = {{project}}_process(ctx.h, ctx.id); + } + }.run; + + var threads: [4]std.Thread = undefined; + for (&threads, 0..) |*thread, i| { + thread.* = try std.Thread.spawn(.{}, thread_fn, .{ + ThreadContext{ .h = handle, .id = @intCast(i) }, + }); + } + + for (threads) |thread| { + thread.join(); + } +} diff --git a/haskell/src/interface/generated/0.3-AI-MANIFEST.a2ml b/haskell/src/interface/generated/0.3-AI-MANIFEST.a2ml new file mode 100644 index 0000000..0088b80 --- /dev/null +++ b/haskell/src/interface/generated/0.3-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "generated-logic" +level: 3 +parent: "../0.2-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Specialised Level 3 logic for generated. diff --git a/haskell/src/interface/generated/README.adoc b/haskell/src/interface/generated/README.adoc new file mode 100644 index 0000000..3691b06 --- /dev/null +++ b/haskell/src/interface/generated/README.adoc @@ -0,0 +1 @@ += generated Logic diff --git a/haskell/src/interface/generated/abi/.gitkeep b/haskell/src/interface/generated/abi/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/haskell/src/interface/generated/abi/0.4-AI-MANIFEST.a2ml b/haskell/src/interface/generated/abi/0.4-AI-MANIFEST.a2ml new file mode 100644 index 0000000..4eeb580 --- /dev/null +++ b/haskell/src/interface/generated/abi/0.4-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "abi-unit" +level: 4 +parent: "../0.3-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Abi logic at level 4. diff --git a/haskell/src/interface/generated/abi/README.adoc b/haskell/src/interface/generated/abi/README.adoc new file mode 100644 index 0000000..aff61a9 --- /dev/null +++ b/haskell/src/interface/generated/abi/README.adoc @@ -0,0 +1 @@ += Abi Logic diff --git a/haskell/stapeln.toml b/haskell/stapeln.toml new file mode 100644 index 0000000..c1845d8 --- /dev/null +++ b/haskell/stapeln.toml @@ -0,0 +1,87 @@ +# SPDX-License-Identifier: MPL-2.0 +# stapeln.toml — Layer-based container build for a2ml-haskell +# +# stapeln builds containers as composable layers (German: "to stack"). +# Each layer is independently cacheable, verifiable, and signable. + +[metadata] +name = "a2ml-haskell" +version = "0.1.0" +description = "a2ml-haskell container service" +author = "Jonathan D.A. Jewell " +license = "MPL-2.0" +registry = "ghcr.io/hyperpolymath" + +[build] +containerfile = "Containerfile" +context = "." +runtime = "podman" + +# ── Layer Definitions ────────────────────────────────────────── + +[layers.base] +description = "Chainguard Wolfi minimal base" +from = "cgr.dev/chainguard/wolfi-base:latest" +cache = true +verify = true + +[layers.toolchain] +description = "Build tools" +extends = "base" +packages = [] +cache = true + +[layers.build] +description = "a2ml-haskell build" +extends = "toolchain" +commands = [] + +[layers.runtime] +description = "Minimal runtime" +from = "cgr.dev/chainguard/wolfi-base:latest" +packages = ["ca-certificates", "curl"] +copy-from = [ + { layer = "build", src = "/app/", dst = "/app/" }, +] +entrypoint = ["/app/a2ml-haskell"] +user = "nonroot" + +# ── Security ─────────────────────────────────────────────────── + +[security] +non-root = true +read-only-root = false +no-new-privileges = true +cap-drop = ["ALL"] +seccomp-profile = "default" + +[security.signing] +algorithm = "ML-DSA-87" +provider = "cerro-torre" + +[security.sbom] +format = "spdx-json" +output = "sbom.spdx.json" +include-deps = true + +# ── Verification ─────────────────────────────────────────────── + +[verify] +vordr = true +svalinn = true +scan-on-build = true +fail-on = ["critical", "high"] + +# ── Targets ──────────────────────────────────────────────────── + +[targets.development] +layers = ["base", "chainguard-toolchain", "build"] +env = { LOG_LEVEL = "debug" } + +[targets.production] +layers = ["runtime"] +env = { LOG_LEVEL = "info" } + +[targets.test] +layers = ["base", "chainguard-toolchain", "build"] +env = { LOG_LEVEL = "debug" } diff --git a/haskell/tests/E2ESpec.hs b/haskell/tests/E2ESpec.hs new file mode 100644 index 0000000..5522c46 --- /dev/null +++ b/haskell/tests/E2ESpec.hs @@ -0,0 +1,108 @@ +-- SPDX-License-Identifier: MPL-2.0 +-- (MPL-2.0 preferred; MPL-2.0 required for Hackage OSI-approved policy) +-- +-- tests/E2ESpec.hs — End-to-end roundtrip tests for a2ml-haskell. +-- +-- Tests the full parse → render → re-parse pipeline to verify that +-- the parser and renderer are inverse operations and that document +-- structure is preserved across a complete roundtrip. + +module E2ESpec (spec) where + +import Data.A2ML +import Data.A2ML.Parser +import Data.A2ML.Renderer +import Data.A2ML.Types + +import qualified Data.Text as T + +import Test.Hspec + +-- --------------------------------------------------------------------------- +-- Helper: roundtrip assertion +-- --------------------------------------------------------------------------- + +-- | Assert that parsing, rendering, and re-parsing a document produces +-- a result with the same number of blocks as the initial parse. +assertRoundtrip :: T.Text -> IO () +assertRoundtrip input = do + let first = parseA2ML input + case first of + Left err -> expectationFailure ("Initial parse failed: " <> show err) + Right doc -> do + let rendered = renderA2ML doc + reparsed = parseA2ML rendered + case reparsed of + Left err2 -> expectationFailure + ("Re-parse of rendered output failed: " <> show err2 + <> "\nRendered was: " <> T.unpack rendered) + Right doc2 -> + length (documentBlocks doc2) + `shouldBe` length (documentBlocks doc) + +-- --------------------------------------------------------------------------- +-- Spec +-- --------------------------------------------------------------------------- + +spec :: Spec +spec = do + describe "parse → render roundtrip" $ do + it "roundtrip: simple H1 heading" $ + assertRoundtrip "# Hello World\n" + + it "roundtrip: plain paragraph" $ + assertRoundtrip "Simple paragraph text.\n" + + it "roundtrip: H1 + blank line + paragraph" $ + assertRoundtrip "# Title\n\nBody paragraph.\n" + + it "roundtrip: bullet list" $ + assertRoundtrip "- Alpha\n- Beta\n- Gamma\n" + + it "roundtrip: multi-level headings H1 through H3" $ + assertRoundtrip "# Level 1\n## Level 2\n### Level 3\n" + + it "roundtrip: directive block with body" $ + assertRoundtrip "@abstract:\nSome abstract text.\n@end\n" + + it "roundtrip: document with blank lines between blocks" $ + assertRoundtrip "# Title\n\n- item one\n- item two\n\nParagraph.\n" + + it "roundtrip: bold inline markup preserved" $ do + let input = "# Title\n\nSome **bold** text.\n" + first <- case parseA2ML input of + Left e -> fail ("Parse failed: " <> show e) + Right d -> pure d + let rendered = renderA2ML first + T.isInfixOf "bold" rendered `shouldBe` True + + it "roundtrip: italic inline markup preserved" $ do + let input = "Paragraph with *italic* text.\n" + first <- case parseA2ML input of + Left e -> fail ("Parse failed: " <> show e) + Right d -> pure d + let rendered = renderA2ML first + T.isInfixOf "italic" rendered `shouldBe` True + + it "roundtrip: complex mixed document" $ + assertRoundtrip $ T.unlines + [ "# Complex Document" + , "" + , "Introduction paragraph with **bold** content." + , "" + , "## Section" + , "" + , "- Bullet one" + , "- Bullet two with *italic*" + , "" + , "@abstract:" + , "Abstract body text." + , "@end" + ] + + describe "parse error conditions" $ do + it "empty string returns EmptyDocument error" $ + parseA2ML "" `shouldBe` Left EmptyDocument + + it "whitespace-only input returns EmptyDocument error" $ + parseA2ML "\n\n\n " `shouldBe` Left EmptyDocument diff --git a/haskell/tests/PropertySpec.hs b/haskell/tests/PropertySpec.hs new file mode 100644 index 0000000..e367380 --- /dev/null +++ b/haskell/tests/PropertySpec.hs @@ -0,0 +1,141 @@ +-- SPDX-License-Identifier: MPL-2.0 +-- (MPL-2.0 preferred; MPL-2.0 required for Hackage OSI-approved policy) +-- +-- tests/PropertySpec.hs — QuickCheck property tests for a2ml-haskell. +-- +-- Tests invariants that must hold for all inputs in a given class, +-- using QuickCheck generators to explore the input space systematically. + +module PropertySpec (spec) where + +import Data.A2ML +import Data.A2ML.Parser +import Data.A2ML.Renderer +import Data.A2ML.Types + +import qualified Data.Text as T +import Data.Maybe (isNothing, isJust) + +import Test.Hspec +import Test.Hspec.QuickCheck +import Test.QuickCheck + +-- --------------------------------------------------------------------------- +-- Generators +-- --------------------------------------------------------------------------- + +-- | Generate a valid non-empty heading line (H1 through H5). +genHeadingLine :: Gen T.Text +genHeadingLine = do + level <- choose (1, 5) + text <- elements ["Title", "Section", "Overview", "Details", "Conclusion"] + pure $ T.replicate level "#" <> " " <> T.pack text <> "\n" + +-- | Generate a plain paragraph line. +genParagraphLine :: Gen T.Text +genParagraphLine = do + word <- elements ["Alpha", "Beta", "Gamma", "Delta", "Epsilon"] + word2 <- elements ["content", "text", "data", "body", "info"] + pure $ T.pack (word <> " " <> word2 <> ".\n") + +-- | Generate a bullet list with 2–4 items. +genBulletList :: Gen T.Text +genBulletList = do + n <- choose (2, 4) :: Gen Int + items <- vectorOf n (elements ["Item A", "Item B", "Item C", "Item D"]) + pure $ T.unlines (map (("- " <>) . T.pack) items) + +-- | Generate a simple valid A2ML document. +genSimpleDoc :: Gen T.Text +genSimpleDoc = do + heading <- genHeadingLine + paragraph <- genParagraphLine + pure $ heading <> "\n" <> paragraph + +-- --------------------------------------------------------------------------- +-- Properties +-- --------------------------------------------------------------------------- + +spec :: Spec +spec = do + describe "parser properties" $ do + prop "parseA2ML never returns Left for a generated heading line" $ + forAll genHeadingLine $ \line -> + parseA2ML line `shouldSatisfy` \case + Right _ -> True + Left _ -> False + + prop "parseA2ML never returns Left for a generated paragraph line" $ + forAll genParagraphLine $ \line -> + parseA2ML line `shouldSatisfy` \case + Right _ -> True + Left _ -> False + + prop "parseA2ML never returns Left for a generated bullet list" $ + forAll genBulletList $ \list -> + parseA2ML list `shouldSatisfy` \case + Right _ -> True + Left _ -> False + + prop "parseA2ML returns Right for any generated simple document" $ + forAll genSimpleDoc $ \doc -> + parseA2ML doc `shouldSatisfy` \case + Right _ -> True + Left _ -> False + + prop "blocks list is non-empty for any successful parse" $ + forAll genSimpleDoc $ \doc -> + case parseA2ML doc of + Left _ -> True -- acceptable + Right doc' -> not (null (documentBlocks doc')) + + describe "renderer properties" $ do + prop "renderA2ML output is non-empty for any non-empty document" $ + forAll genSimpleDoc $ \doc -> + case parseA2ML doc of + Left _ -> True -- acceptable — generator may hit edge case + Right d -> + let rendered = renderA2ML d + in T.length rendered > 0 + + prop "renderA2ML output always ends with a newline" $ + forAll genSimpleDoc $ \doc -> + case parseA2ML doc of + Left _ -> True + Right d -> + let rendered = renderA2ML d + in T.isSuffixOf "\n" rendered + + describe "roundtrip properties" $ do + prop "block count is stable across parse → render → re-parse" $ + forAll genSimpleDoc $ \doc -> + case parseA2ML doc of + Left _ -> True -- skip unparseable + Right first -> + let rendered = renderA2ML first + in case parseA2ML rendered of + Left _ -> False -- must re-parse successfully + Right second -> + length (documentBlocks second) == length (documentBlocks first) + + prop "H1 heading in generated doc makes documentManifest or title discoverable" $ + forAll genHeadingLine $ \line -> + -- The line is guaranteed H1-H5; just verify parse succeeds + case parseA2ML line of + Left _ -> True -- level > 5 shouldn't happen from generator, but guard it + Right _ -> True + + describe "inline renderer properties" $ do + prop "renderInline PlainText returns original text unchanged" $ + forAll (T.pack <$> listOf1 (elements ['a'..'z'])) $ \t -> + renderInline (PlainText t) === t + + prop "renderInline Bold wraps in ** on both sides" $ + forAll (T.pack <$> listOf1 (elements ['a'..'z'])) $ \t -> + let rendered = renderInline (Bold [PlainText t]) + in T.isPrefixOf "**" rendered && T.isSuffixOf "**" rendered + + prop "renderInline Italic wraps in * on both sides" $ + forAll (T.pack <$> listOf1 (elements ['a'..'z'])) $ \t -> + let rendered = renderInline (Italic [PlainText t]) + in T.isPrefixOf "*" rendered && T.isSuffixOf "*" rendered diff --git a/haskell/tests/Spec.hs b/haskell/tests/Spec.hs new file mode 100644 index 0000000..5aae049 --- /dev/null +++ b/haskell/tests/Spec.hs @@ -0,0 +1,18 @@ +-- SPDX-License-Identifier: MPL-2.0 +-- (MPL-2.0 preferred; MPL-2.0 required for Hackage OSI-approved policy) +-- +-- tests/Spec.hs — HSpec test suite entry point for a2ml-haskell. +-- +-- Discovers and runs all *Spec modules. + +import Test.Hspec + +import qualified UnitSpec +import qualified E2ESpec +import qualified PropertySpec + +main :: IO () +main = hspec $ do + describe "Unit" UnitSpec.spec + describe "E2E" E2ESpec.spec + describe "Property" PropertySpec.spec diff --git a/haskell/tests/UnitSpec.hs b/haskell/tests/UnitSpec.hs new file mode 100644 index 0000000..5c269d6 --- /dev/null +++ b/haskell/tests/UnitSpec.hs @@ -0,0 +1,110 @@ +-- SPDX-License-Identifier: MPL-2.0 +-- (MPL-2.0 preferred; MPL-2.0 required for Hackage OSI-approved policy) +-- +-- tests/UnitSpec.hs — HSpec unit tests for a2ml-haskell parser and renderer. +-- +-- Tests individual functions in isolation to verify correct behaviour on +-- well-formed inputs, edge cases, and error conditions. + +module UnitSpec (spec) where + +import Data.A2ML +import Data.A2ML.Parser +import Data.A2ML.Renderer +import Data.A2ML.Types + +import qualified Data.Map.Strict as Map +import qualified Data.Text as T + +import Test.Hspec + +-- --------------------------------------------------------------------------- +-- Spec entry point +-- --------------------------------------------------------------------------- + +spec :: Spec +spec = do + describe "parseA2ML" $ do + it "returns Left EmptyDocument for empty input" $ + parseA2ML "" `shouldBe` Left EmptyDocument + + it "returns Left EmptyDocument for whitespace-only input" $ + parseA2ML " \n\n " `shouldBe` Left EmptyDocument + + it "returns Right for a minimal single-heading document" $ do + let result = parseA2ML "# Hello\n" + result `shouldSatisfy` \case + Right _ -> True + Left _ -> False + + it "parses H1 heading into Heading 1 block" $ do + let Right doc = parseA2ML "# Title\n" + documentBlocks doc `shouldContain` [Heading 1 [PlainText "Title"]] + + it "parses H2 heading into Heading 2 block" $ do + let Right doc = parseA2ML "## Subtitle\n" + case documentBlocks doc of + (Heading 2 _:_) -> pure () + other -> expectationFailure ("Expected H2, got: " <> show other) + + it "parses plain paragraph into Paragraph block" $ do + let Right doc = parseA2ML "Simple text.\n" + case documentBlocks doc of + (Paragraph _:_) -> pure () + other -> expectationFailure ("Expected Paragraph, got: " <> show other) + + it "parses bullet list items as BulletList block" $ do + let Right doc = parseA2ML "- Alpha\n- Beta\n" + case documentBlocks doc of + (BulletList items:_) -> length items `shouldBe` 2 + other -> expectationFailure ("Expected BulletList, got: " <> show other) + + it "parses blank line as BlankLine block" $ do + let Right doc = parseA2ML "# H\n\nParagraph.\n" + documentBlocks doc `shouldContain` [BlankLine] + + it "parses a directive block by name" $ do + let Right doc = parseA2ML "@abstract:\nSome abstract text.\n@end\n" + case documentBlocks doc of + (DirectiveBlock dir:_) -> directiveName dir `shouldBe` DirAbstract + other -> expectationFailure ("Expected DirectiveBlock, got: " <> show other) + + describe "renderA2ML" $ do + it "renders an empty document (no blocks) as a single newline" $ + renderA2ML (Document Nothing []) `shouldBe` "\n" + + it "renders H1 heading with # prefix and trailing newline" $ + renderA2ML (Document Nothing [Heading 1 [PlainText "Hello"]]) + `shouldBe` "# Hello\n" + + it "renders H3 heading with ### prefix" $ + renderA2ML (Document Nothing [Heading 3 [PlainText "Sub"]]) + `shouldBe` "### Sub\n" + + it "renders paragraph inline content as plain line" $ + renderA2ML (Document Nothing [Paragraph [PlainText "Text here"]]) + `shouldBe` "Text here\n" + + it "renders bullet list items with - prefix" $ do + let doc = Document Nothing [BulletList [[PlainText "Item A"], [PlainText "Item B"]]] + renderA2ML doc `shouldBe` "- Item A\n- Item B\n" + + describe "renderInline" $ do + it "renders PlainText as-is" $ + renderInline (PlainText "Hello") `shouldBe` "Hello" + + it "renders Bold with ** delimiters" $ + renderInline (Bold [PlainText "bold"]) `shouldBe` "**bold**" + + it "renders Italic with * delimiters" $ + renderInline (Italic [PlainText "italic"]) `shouldBe` "*italic*" + + it "renders Link as [text](url)" $ + renderInline (Link "click" "https://example.com") + `shouldBe` "[click](https://example.com)" + + it "renders InlineRef as @ref(id)" $ + renderInline (InlineRef "section-1") `shouldBe` "@ref(section-1)" + + it "renders InlineCode with backtick delimiters" $ + renderInline (InlineCode "code") `shouldBe` "`code`" diff --git a/haskell/tests/fuzz/placeholder.txt b/haskell/tests/fuzz/placeholder.txt new file mode 100644 index 0000000..8621280 --- /dev/null +++ b/haskell/tests/fuzz/placeholder.txt @@ -0,0 +1 @@ +Scorecard requirement placeholder diff --git a/haskell/verification/0.1-AI-MANIFEST.a2ml b/haskell/verification/0.1-AI-MANIFEST.a2ml new file mode 100644 index 0000000..3435bdb --- /dev/null +++ b/haskell/verification/0.1-AI-MANIFEST.a2ml @@ -0,0 +1,27 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "verification-pillar" +level: 1 +parent: "../0-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Primary verification pillar. Contains evidence for correctness, + performance, formal proofs, randomized testing, and aerospace-grade + high-assurance metrics (MC/DC coverage, traceability, safety cases). + +canonical_locations: + tests: "tests/" + benchmarks: "benchmarks/" + proofs: "proofs/" + fuzzing: "fuzzing/" + simulations: "simulations/" + coverage: "coverage/" + traceability: "traceability/" + safety_case: "safety_case/" + +invariants: + - "Evidence MUST be reproducible and documented" + - "High-assurance deployments MUST satisfy traceability and safety_case requirements" diff --git a/haskell/verification/README.adoc b/haskell/verification/README.adoc new file mode 100644 index 0000000..f07e7f3 --- /dev/null +++ b/haskell/verification/README.adoc @@ -0,0 +1 @@ += Verification Pillar diff --git a/haskell/verification/benchmarks/0.2-AI-MANIFEST.a2ml b/haskell/verification/benchmarks/0.2-AI-MANIFEST.a2ml new file mode 100644 index 0000000..d922a4c --- /dev/null +++ b/haskell/verification/benchmarks/0.2-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "benches-pillar" +level: 2 +parent: "../0.1-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Benches pillar. diff --git a/haskell/verification/benchmarks/README.adoc b/haskell/verification/benchmarks/README.adoc new file mode 100644 index 0000000..5db7648 --- /dev/null +++ b/haskell/verification/benchmarks/README.adoc @@ -0,0 +1 @@ += Benchmarks Unit diff --git a/haskell/verification/coverage/0.2-AI-MANIFEST.a2ml b/haskell/verification/coverage/0.2-AI-MANIFEST.a2ml new file mode 100644 index 0000000..32b819e --- /dev/null +++ b/haskell/verification/coverage/0.2-AI-MANIFEST.a2ml @@ -0,0 +1,12 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "verification-unit-coverage" +level: 2 +parent: "../0.1-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + High-assurance verification unit for coverage. + Critical for safety-of-life and aerospace-grade deployment standards. diff --git a/haskell/verification/coverage/README.adoc b/haskell/verification/coverage/README.adoc new file mode 100644 index 0000000..2566956 --- /dev/null +++ b/haskell/verification/coverage/README.adoc @@ -0,0 +1 @@ += Coverage Unit diff --git a/haskell/verification/fuzzing/0.2-AI-MANIFEST.a2ml b/haskell/verification/fuzzing/0.2-AI-MANIFEST.a2ml new file mode 100644 index 0000000..5178d40 --- /dev/null +++ b/haskell/verification/fuzzing/0.2-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "fuzzing-unit" +level: 2 +parent: "../0.1-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Fuzzing unit for high-rigor verification. diff --git a/haskell/verification/fuzzing/README.adoc b/haskell/verification/fuzzing/README.adoc new file mode 100644 index 0000000..edeb179 --- /dev/null +++ b/haskell/verification/fuzzing/README.adoc @@ -0,0 +1 @@ += Fuzzing Unit diff --git a/haskell/verification/proofs/0.2-AI-MANIFEST.a2ml b/haskell/verification/proofs/0.2-AI-MANIFEST.a2ml new file mode 100644 index 0000000..135e181 --- /dev/null +++ b/haskell/verification/proofs/0.2-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "verification-unit-proofs" +level: 2 +parent: "../0.1-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Sub-unit focusing on proofs. diff --git a/haskell/verification/proofs/README.adoc b/haskell/verification/proofs/README.adoc new file mode 100644 index 0000000..1ae324d --- /dev/null +++ b/haskell/verification/proofs/README.adoc @@ -0,0 +1 @@ += Proofs Unit diff --git a/haskell/verification/safety_case/0.2-AI-MANIFEST.a2ml b/haskell/verification/safety_case/0.2-AI-MANIFEST.a2ml new file mode 100644 index 0000000..d461915 --- /dev/null +++ b/haskell/verification/safety_case/0.2-AI-MANIFEST.a2ml @@ -0,0 +1,12 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "verification-unit-safety_case" +level: 2 +parent: "../0.1-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + High-assurance verification unit for safety case. + Critical for safety-of-life and aerospace-grade deployment standards. diff --git a/haskell/verification/safety_case/README.adoc b/haskell/verification/safety_case/README.adoc new file mode 100644 index 0000000..47c8e36 --- /dev/null +++ b/haskell/verification/safety_case/README.adoc @@ -0,0 +1 @@ += Safety case Unit diff --git a/haskell/verification/simulations/0.2-AI-MANIFEST.a2ml b/haskell/verification/simulations/0.2-AI-MANIFEST.a2ml new file mode 100644 index 0000000..f890eca --- /dev/null +++ b/haskell/verification/simulations/0.2-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "simulations-unit" +level: 2 +parent: "../0.1-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Simulations unit for high-rigor verification. diff --git a/haskell/verification/simulations/README.adoc b/haskell/verification/simulations/README.adoc new file mode 100644 index 0000000..8e1b13a --- /dev/null +++ b/haskell/verification/simulations/README.adoc @@ -0,0 +1 @@ += Simulations Unit diff --git a/haskell/verification/tests/0.2-AI-MANIFEST.a2ml b/haskell/verification/tests/0.2-AI-MANIFEST.a2ml new file mode 100644 index 0000000..0008fcf --- /dev/null +++ b/haskell/verification/tests/0.2-AI-MANIFEST.a2ml @@ -0,0 +1 @@ +# AI Manifest - Level 1: tests diff --git a/haskell/verification/tests/README.adoc b/haskell/verification/tests/README.adoc new file mode 100644 index 0000000..344bf86 --- /dev/null +++ b/haskell/verification/tests/README.adoc @@ -0,0 +1 @@ += Tests Unit diff --git a/haskell/verification/traceability/0.2-AI-MANIFEST.a2ml b/haskell/verification/traceability/0.2-AI-MANIFEST.a2ml new file mode 100644 index 0000000..9667766 --- /dev/null +++ b/haskell/verification/traceability/0.2-AI-MANIFEST.a2ml @@ -0,0 +1,12 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "verification-unit-traceability" +level: 2 +parent: "../0.1-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + High-assurance verification unit for traceability. + Critical for safety-of-life and aerospace-grade deployment standards. diff --git a/haskell/verification/traceability/README.adoc b/haskell/verification/traceability/README.adoc new file mode 100644 index 0000000..ff23dd7 --- /dev/null +++ b/haskell/verification/traceability/README.adoc @@ -0,0 +1 @@ += Traceability Unit diff --git a/rs/.devcontainer/Containerfile b/rs/.devcontainer/Containerfile new file mode 100644 index 0000000..b0a6fd1 --- /dev/null +++ b/rs/.devcontainer/Containerfile @@ -0,0 +1,32 @@ +# SPDX-License-Identifier: MPL-2.0 +# Copyright (c) {{CURRENT_YEAR}} {{AUTHOR}} ({{OWNER}}) <{{AUTHOR_EMAIL}}> +# +# Dev Container image for {{PROJECT_NAME}} +# Base: Chainguard Wolfi (minimal, supply-chain-secure) +# Build: podman build -t {{PROJECT_NAME}}-dev -f .devcontainer/Containerfile . + +FROM cgr.dev/chainguard/wolfi-base:latest + +# Install common development tools +RUN apk update && apk add --no-cache \ + bash \ + curl \ + git \ + openssh-client \ + ca-certificates \ + build-base \ + posix-libc-utils \ + shadow \ + && rm -rf /var/cache/apk/* + +# Create non-root dev user (matches devcontainer.json remoteUser) +RUN groupadd -g 1000 nonroot || true \ + && useradd -m -u 1000 -g 1000 -s /bin/bash nonroot || true + +# Set workspace directory +WORKDIR /workspaces/{{PROJECT_NAME}} + +# Default shell +ENV SHELL=/bin/bash + +USER nonroot diff --git a/rs/.devcontainer/README.adoc b/rs/.devcontainer/README.adoc new file mode 100644 index 0000000..3bfb50e --- /dev/null +++ b/rs/.devcontainer/README.adoc @@ -0,0 +1,27 @@ +// SPDX-License-Identifier: CC-BY-SA-4.0 += Dev Container Usage +:author: {{AUTHOR}} <{{AUTHOR_EMAIL}}> + +== Overview + +This dev container uses `cgr.dev/chainguard/wolfi-base` with git, curl, bash, and just pre-installed. Dev container features add git, just, and nickel automatically. + +== VS Code (Local) + +. Install the *Dev Containers* extension (`ms-vscode-remote.remote-containers`). +. Set `dev.containers.dockerPath` to `podman` in VS Code settings. +. Open the repo folder, then choose **Reopen in Container** from the command palette. + +== GitHub Codespaces + +. From the repository on GitHub, click **Code > Codespaces > New codespace**. +. The container builds automatically from this configuration. + +== Gitpod + +. Prefix the repo URL with `https://gitpod.io/#` to launch a workspace. +. Gitpod reads `devcontainer.json` and builds the environment. + +== Customization + +Replace `{{PROJECT_NAME}}` placeholders in both `devcontainer.json` and `Containerfile` with your actual project name. Run `just deps` to verify the environment after first launch. diff --git a/rs/.devcontainer/devcontainer.json b/rs/.devcontainer/devcontainer.json new file mode 100644 index 0000000..a4b33e0 --- /dev/null +++ b/rs/.devcontainer/devcontainer.json @@ -0,0 +1,69 @@ +// SPDX-License-Identifier: MPL-2.0 +// Copyright (c) {{CURRENT_YEAR}} {{AUTHOR}} ({{OWNER}}) <{{AUTHOR_EMAIL}}> +// +// Dev Container configuration for {{PROJECT_NAME}} +// Works with: VS Code Dev Containers, GitHub Codespaces, Gitpod +// Container runtime: Podman (recommended) or any OCI-compliant runtime +{ + "name": "{{PROJECT_NAME}}", + + "build": { + "dockerfile": "Containerfile", + "context": ".." + }, + + "features": { + "ghcr.io/devcontainers/features/git:1": { + "ppa": false, + "version": "latest" + }, + "ghcr.io/jdx/devcontainer-features/just:1": {}, + "ghcr.io/nickel-lang/devcontainer-feature:0": {} + }, + + "postCreateCommand": "just deps", + + "remoteUser": "nonroot", + + "containerEnv": { + "EDITOR": "code --wait", + "LANG": "C.UTF-8" + }, + + "customizations": { + "vscode": { + "extensions": [ + "EditorConfig.EditorConfig", + "eamodio.gitlens", + "streetsidesoftware.code-spell-checker", + "timonwong.shellcheck", + "tamasfe.even-better-toml", + "skellock.just", + "redhat.vscode-yaml", + "DavidAnson.vscode-markdownlint", + "asciidoctor.asciidoctor-vscode", + "usernamehw.errorlens" + ], + "settings": { + "editor.formatOnSave": true, + "editor.insertSpaces": true, + "editor.tabSize": 2, + "files.trimTrailingWhitespace": true, + "files.insertFinalNewline": true, + "files.trimFinalNewlines": true, + "[makefile]": { + "editor.insertSpaces": false + } + } + }, + "codespaces": { + "openFiles": [ + "README.adoc" + ] + } + }, + + "forwardPorts": [], + + "shutdownAction": "stopContainer" +} diff --git a/rs/.editorconfig b/rs/.editorconfig new file mode 100644 index 0000000..bcdbb4d --- /dev/null +++ b/rs/.editorconfig @@ -0,0 +1,65 @@ +# RSR-template-repo - Editor Configuration +# https://editorconfig.org + +root = true + +[*] +charset = utf-8 +end_of_line = lf +indent_size = 2 +indent_style = space +insert_final_newline = true +trim_trailing_whitespace = true + +[*.md] +trim_trailing_whitespace = false + +[*.adoc] +trim_trailing_whitespace = false + +[*.rs] +indent_size = 4 + +[*.ex] +indent_size = 2 + +[*.exs] +indent_size = 2 + +[*.zig] +indent_size = 4 + +[*.ada] +indent_size = 3 + +[*.adb] +indent_size = 3 + +[*.ads] +indent_size = 3 + +[*.hs] +indent_size = 2 + +[*.res] +indent_size = 2 + +[*.resi] +indent_size = 2 + +[*.ncl] +indent_size = 2 + +[*.rkt] +indent_size = 2 + +[*.scm] +indent_size = 2 + +[*.nix] +indent_size = 2 + +[Justfile] +indent_style = space +indent_size = 4 + diff --git a/rs/.envrc b/rs/.envrc new file mode 100644 index 0000000..0b5b702 --- /dev/null +++ b/rs/.envrc @@ -0,0 +1,27 @@ +# SPDX-License-Identifier: MPL-2.0 +# Activate development environment +# Install direnv: https://direnv.net/ + +# Load .tool-versions if asdf is available +if has asdf; then + use asdf +fi + +# Load Guix shell if guix.scm exists +if has guix && [ -f guix.scm ]; then + use guix +fi + +# Load Nix flake if flake.nix exists +if has nix && [ -f flake.nix ]; then + use flake +fi + +# Project environment variables +export PROJECT_NAME="{{PROJECT_NAME}}" +export RSR_TIER="infrastructure" +# export DATABASE_URL="..." +# export API_KEY="..." + +# Source .env if it exists (gitignored) +dotenv_if_exists diff --git a/rs/.guix-channel b/rs/.guix-channel new file mode 100644 index 0000000..f9bdf68 --- /dev/null +++ b/rs/.guix-channel @@ -0,0 +1,22 @@ +;; SPDX-License-Identifier: MPL-2.0 +;; Copyright (c) {{CURRENT_YEAR}} {{AUTHOR}} ({{OWNER}}) <{{AUTHOR_EMAIL}}> +;; +;; Guix channel definition for {{PROJECT_NAME}} +;; +;; To use this channel, add to ~/.config/guix/channels.scm: +;; +;; (channel +;; (name '{{PROJECT_NAME}}) +;; (url "https://github.com/{{OWNER}}/{{PROJECT_NAME}}") +;; (branch "main")) +;; +;; Then: guix pull + +(channel + (version 0) + (url "https://github.com/{{OWNER}}/{{PROJECT_NAME}}") + (dependencies + (channel + (name 'guix) + (url "https://git.savannah.gnu.org/git/guix.git") + (branch "master")))) diff --git a/rs/.machine_readable/0.1-AI-MANIFEST.a2ml b/rs/.machine_readable/0.1-AI-MANIFEST.a2ml new file mode 100644 index 0000000..9d2bc7a --- /dev/null +++ b/rs/.machine_readable/0.1-AI-MANIFEST.a2ml @@ -0,0 +1,29 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "machine-readable-pillar" +level: 1 +parent: "../0-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Registry for all machine-readable metadata, policies, and internal + automation scripts. + +canonical_locations: + state: "STATE.a2ml" + meta: "META.a2ml" + ecosystem: "ECOSYSTEM.a2ml" + agentic: "AGENTIC.a2ml" + neurosym: "NEUROSYM.a2ml" + playbook: "PLAYBOOK.a2ml" + anchors: "anchors/" + policies: "policies/" + ai_configs: "ai/" + compliance: "compliance/" + scripts: "scripts/" + +invariants: + - "Metadata files MUST follow a2ml format" + - "Internal automation MUST live in scripts/ subfolder" diff --git a/rs/.machine_readable/6a2/AGENTIC.a2ml b/rs/.machine_readable/6a2/AGENTIC.a2ml new file mode 100644 index 0000000..a8f6b17 --- /dev/null +++ b/rs/.machine_readable/6a2/AGENTIC.a2ml @@ -0,0 +1,36 @@ +# SPDX-License-Identifier: MPL-2.0 +# Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) +# +# AGENTIC.a2ml — AI agent constraints and capabilities +# Defines what AI agents can and cannot do in this repository. + +[metadata] +version = "0.1.0" +last-updated = "2026-04-11" + +[agent-permissions] +can-edit-source = true +can-edit-tests = true +can-edit-docs = true +can-edit-config = true +can-create-files = true + +[agent-constraints] +# What AI agents must NOT do: +# - Never use banned language patterns (believe_me, unsafeCoerce, etc.) +# - Never commit secrets or credentials +# - Never use banned languages (TypeScript, Python, Go, etc.) +# - Never place state files in repository root (must be in .machine_readable/) +# - Never use AGPL license (use MPL-2.0) + +[maintenance-integrity] +fail-closed = true +require-evidence-per-step = true +allow-silent-skip = false +require-rerun-after-fix = true +release-claim-requires-hard-pass = true + +[automation-hooks] +# on-enter: Read 0-AI-MANIFEST.a2ml, then STATE.a2ml +# on-exit: Update STATE.a2ml with session outcomes +# on-commit: Run just validate-rsr diff --git a/rs/.machine_readable/6a2/ECOSYSTEM.a2ml b/rs/.machine_readable/6a2/ECOSYSTEM.a2ml new file mode 100644 index 0000000..fb8055e --- /dev/null +++ b/rs/.machine_readable/6a2/ECOSYSTEM.a2ml @@ -0,0 +1,26 @@ +# SPDX-License-Identifier: MPL-2.0 +# Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) +# +# ECOSYSTEM.a2ml — Project ecosystem position +# Relationships, dependencies, integration points. + +[metadata] +version = "0.1.0" +last-updated = "2026-04-11" + +[project] +name = "a2ml-rs" +purpose = "" # TODO: describe project purpose +role = "" # TODO: describe project role # e.g. ffi-infrastructure, cli-tool, library, service + +[position-in-ecosystem] +tier = "infrastructure" # 1 | 2 | infrastructure + +[related-projects] +# relationship types: sibling-standard, dependency, dependent, inspiration, potential-consumer +# - { name = "language-bridges", relationship = "sibling-standard" } +# - { name = "hypatia", relationship = "potential-consumer" } + +[integration-points] +# External systems this project connects to +# - { system = "gitbot-fleet", direction = "outbound", protocol = "repository_dispatch" } diff --git a/rs/.machine_readable/6a2/META.a2ml b/rs/.machine_readable/6a2/META.a2ml new file mode 100644 index 0000000..d9b09e6 --- /dev/null +++ b/rs/.machine_readable/6a2/META.a2ml @@ -0,0 +1,53 @@ +# SPDX-License-Identifier: MPL-2.0 +# Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) +# +# META.a2ml — Project meta-level information +# Architecture decisions, design rationale, governance. + +[metadata] +version = "0.1.0" +last-updated = "2026-04-11" + +[project-info] +type = "library" # TODO: update type (library|binary|service|website|monorepo) # library | binary | monorepo | service | website +languages = [] # e.g. ["rust", "zig", "idris2"] +license = "MPL-2.0" +author = "Jonathan D.A. Jewell (hyperpolymath)" + +[architecture-decisions] +# ADR format: status = proposed | accepted | deprecated | superseded | rejected +# - { id = "ADR-001", title = "Use Zig for FFI", status = "accepted", date = "2026-02-14" } + +[development-practices] +build-tool = "just" +container-runtime = "podman" +ci-platform = "github-actions" +package-manager = "guix" # guix | nix | cargo | mix + +[maintenance-axes] +scoping-first = true +execution-order = "axis-1 > axis-2 > axis-3" +axis-1 = "must > intend > like" +axis-2 = "corrective > adaptive > perfective" +axis-3 = "systems > compliance > effects" + +[scoping] +sources = "README, roadmap, status docs, maintenance checklist, CI/security docs" +marker-scan = "TODO/FIXME/XXX/HACK/STUB/PARTIAL" +idris-unsound-scan = "believe_me/assert_total" + +[axis-2-maintenance-rules] +corrective-first = true +adaptive-second = true +adaptive-focus = "scope-change reconciliation, stale-reference removal, obsolete-work culling" +perfective-third = true +perfective-source = "axis-1 honest state after corrective/adaptive updates" + +[axis-3-audit-rules] +audit-focus = "systems in place, documentation explains actual state, safety/security accounted for, observed effects reviewed" +compliance-focus = "seams/compromises/exception register, bounded exceptions, anti-drift checks" +drift-risk-example = "single exception broadening into policy violation (e.g. ReScript->TypeScript spread)" +effects-evidence = "benchmark execution/results and maintainer status dialogue/review" + +[design-rationale] +# Key design decisions and their reasoning diff --git a/rs/.machine_readable/6a2/NEUROSYM.a2ml b/rs/.machine_readable/6a2/NEUROSYM.a2ml new file mode 100644 index 0000000..1acf7a3 --- /dev/null +++ b/rs/.machine_readable/6a2/NEUROSYM.a2ml @@ -0,0 +1,23 @@ +# SPDX-License-Identifier: MPL-2.0 +# Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) +# +# NEUROSYM.a2ml — Neurosymbolic integration metadata +# Configuration for Hypatia scanning and symbolic reasoning. + +[metadata] +version = "0.1.0" +last-updated = "2026-04-11" + +[hypatia-config] +scan-enabled = true +scan-depth = "standard" # quick | standard | deep +report-format = "logtalk" + +[symbolic-rules] +# Custom symbolic rules for this project +# - { name = "no-unsafe-ffi", pattern = "believe_me|unsafeCoerce", severity = "critical" } + +[neural-config] +# Neural pattern detection settings +# confidence-threshold = 0.85 +# model = "hypatia-v2" diff --git a/rs/.machine_readable/6a2/PLAYBOOK.a2ml b/rs/.machine_readable/6a2/PLAYBOOK.a2ml new file mode 100644 index 0000000..6408e1c --- /dev/null +++ b/rs/.machine_readable/6a2/PLAYBOOK.a2ml @@ -0,0 +1,35 @@ +# SPDX-License-Identifier: MPL-2.0 +# Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) +# +# PLAYBOOK.a2ml — Operational playbook +# Runbooks, incident response, deployment procedures. + +[metadata] +version = "0.1.0" +last-updated = "2026-04-11" + +[deployment] +# method = "gitops" # gitops | manual | ci-triggered +# target = "container" # container | binary | library | wasm + +[incident-response] +# 1. Check .machine_readable/STATE.a2ml for current status +# 2. Review recent commits and CI results +# 3. Run `just validate` to check compliance +# 4. Run `just security` to audit for vulnerabilities + +[release-process] +# 1. Update version in STATE.a2ml, META.a2ml, Justfile +# 2. Run `just release-preflight` (validate + quality + security + maint-hard-pass) +# 3. Optional local permission hardening: `just perms-snapshot && just perms-lock` +# 4. Tag and push +# 5. Restore local permissions if needed: `just perms-restore` +# 6. Run `just container-push` if applicable + +[maintenance-operations] +# Baseline audit: +# just maint-audit +# Hard release gate: +# just maint-hard-pass +# Permission audit: +# just perms-audit diff --git a/rs/.machine_readable/6a2/STATE.a2ml b/rs/.machine_readable/6a2/STATE.a2ml new file mode 100644 index 0000000..7937b3f --- /dev/null +++ b/rs/.machine_readable/6a2/STATE.a2ml @@ -0,0 +1,64 @@ +# SPDX-License-Identifier: MPL-2.0 +# Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) +# +# STATE.a2ml — Project state checkpoint (META-TEMPLATE) +# +# This is the STATE file for a2ml-rs. +# When consumed by a new project, replace {{PLACEHOLDER}} tokens +# and customize sections below for the target project. + +[metadata] +project = "a2ml-rs" +version = "0.2.0" +last-updated = "2026-02-28" +status = "active" # active | paused | archived + +[project-context] +name = "a2ml-rs" +purpose = "Canonical RSR-compliant repository template providing scaffolding for all hyperpolymath projects — including CI/CD, AI manifests, ABI/FFI standards, container ecosystem, and governance infrastructure." +completion-percentage = 95 + +[position] +phase = "maintenance" # design | implementation | testing | maintenance | archived +maturity = "production" # experimental | alpha | beta | production | lts + +[route-to-mvp] +milestones = [ + { name = "Phase 0: Core scaffolding (justfile, CI/CD, .machine_readable)", completion = 100 }, + { name = "Phase 1: ABI/FFI standard (Idris2/Zig templates)", completion = 100 }, + { name = "Phase 1b: AI Gatekeeper Protocol (0-AI-MANIFEST.a2ml)", completion = 100 }, + { name = "Phase 1c: TOPOLOGY.md standard and guide", completion = 100 }, + { name = "Phase 1d: Maintenance gate (axes, checklist, approach)", completion = 100 }, + { name = "Phase 1e: Trustfile / contractiles", completion = 100 }, + { name = "Phase 2: Container ecosystem templates (stapeln)", completion = 100 }, + { name = "Phase 3: Multi-forge sync hardening", completion = 0 }, + { name = "Phase 4: Nix/Guix reproducible shells", completion = 50 }, +] + +[blockers-and-issues] +# No active blockers + +[critical-next-actions] +actions = [ + "Container templates complete — test with `just container-init`", + "Validate container templates across wolfi-base and static Chainguard images", + "Harden multi-forge sync for GitLab/Bitbucket mirroring edge cases", + "Expand Nix/Guix development shell templates", +] + +[maintenance-status] +last-run-utc = "never" +last-report = "docs/reports/maintenance/latest.json" +last-result = "unknown" # unknown | pass | warn | fail +open-warnings = 0 +open-failures = 0 + +[ecosystem] +part-of = ["RSR Framework", "stapeln ecosystem"] +depends-on = ["stapeln", "selur-compose", "cerro-torre", "svalinn", "vordr", "k9-svc"] + +# --------------------------------------------------------------------------- +# NOTE FOR CONSUMERS: When using this template to create a new repo, reset +# the fields above to your project's values and replace all {{PLACEHOLDER}} +# tokens. The milestones above describe the TEMPLATE's evolution, not yours. +# --------------------------------------------------------------------------- diff --git a/rs/.machine_readable/ADJUST.contractile b/rs/.machine_readable/ADJUST.contractile new file mode 100644 index 0000000..a49f440 --- /dev/null +++ b/rs/.machine_readable/ADJUST.contractile @@ -0,0 +1,126 @@ +; SPDX-License-Identifier: MPL-2.0 +; ADJUST.contractile — Accessibility invariants for a2ml-rs +; "ADJUST" = Accessibility & Digital Justice for Universal Software & Technology +; +; Part of the contractile family: MUST, TRUST, DUST, INTENT, ADJUST +; This file is machine-readable. LLM/SLM agents MUST NOT violate these invariants. + +; ── Definitions ────────────────────────────────────────────────── +; +; ADJUST (noun/verb) +; The accessibility contractile. Defines how software must adapt to serve +; all users regardless of ability, device, or context. Named for the verb +; "adjust" — to make suitable, to adapt, to accommodate — which is the +; core action of accessible design. +; +; Scope: +; ADJUST governs all user-facing interfaces: GUI, TUI, CLI, web, mobile, +; documentation, error messages, and installation flows. It applies to +; both human users and assistive technologies (screen readers, switch +; devices, braille displays, voice control). +; +; Relationship to other contractiles: +; - MUST: ADJUST invariants are a subset of MUST — violating ADJUST +; is a MUST violation. ADJUST exists separately because accessibility +; rules are numerous enough to warrant their own file, and because +; LLMs frequently forget accessibility unless explicitly reminded. +; - TRUST: ADJUST does not affect trust levels. All trust tiers must +; respect ADJUST invariants equally. +; - DUST: Deprecating a feature does not exempt it from ADJUST until +; it is fully removed. Deprecated UI must remain accessible. +; - INTENT: ADJUST supports the anti-purpose "this software is NOT +; only for able-bodied users with modern hardware." +; +; Standard: WCAG 2.2 Level AA (minimum) +; https://www.w3.org/WAI/WCAG22/quickref/?levels=aaa +; +; Why a separate file: +; Experience shows LLMs and developers alike treat accessibility as an +; afterthought. By placing invariants in a contractile that is loaded +; at session start, we make it structurally impossible to forget. +; +; ── End Definitions ────────────────────────────────────────────── + +(adjust-contractile + (version "1.0.0") + (full-name "Accessibility & Digital Justice for Universal Software & Technology") + (standard "WCAG-2.2-AA") + (repo "a2ml-rs") + + (invariants + ; ── Visual ── + (adjust "colour-contrast-ratio >= 4.5:1 for normal text") + (adjust "colour-contrast-ratio >= 3:1 for large text (18pt+ or 14pt+ bold)") + (adjust "no information conveyed by colour alone") + (adjust "no flashing or strobing content (3 flashes/second max)") + (adjust "text resizable to 200% without loss of content or function") + (adjust "focus indicators visible on all interactive elements") + + ; ── Keyboard ── + (adjust "all interactive elements reachable via keyboard (Tab/Shift+Tab)") + (adjust "no keyboard traps — user can always Tab away") + (adjust "skip navigation link present on pages with repeated blocks") + (adjust "logical focus order follows visual reading order") + + ; ── Screen reader ── + (adjust "all images have meaningful alt text (or alt='' if decorative)") + (adjust "all form inputs have associated labels") + (adjust "ARIA landmarks used for page regions (main, nav, banner, etc.)") + (adjust "dynamic content updates announced via aria-live regions") + (adjust "semantic HTML used (headings, lists, tables) — not div soup") + + ; ── Interactive ── + (adjust "touch targets minimum 44x44px on mobile/touch interfaces") + (adjust "error messages identify the field and describe the error") + (adjust "error messages not conveyed by colour or position alone") + (adjust "form validation provides suggestions for correction") + + ; ── Media ── + (adjust "video has captions (closed or open)") + (adjust "audio-only content has text transcript") + (adjust "no autoplay of media with sound") + + ; ── Motion ── + (adjust "animations respect prefers-reduced-motion media query") + (adjust "no content depends on motion to convey meaning") + + ; ── CLI/TUI ── + (adjust "CLI output must not rely solely on colour (use symbols: [OK] [FAIL])") + (adjust "TUI must support high-contrast mode") + (adjust "all CLI commands support --help with plain-text output") + (adjust "error messages written in plain language, not jargon or codes alone") + + ; ── Documentation ── + (adjust "docs use clear language, short sentences, logical structure") + (adjust "code examples include comments explaining non-obvious steps") + (adjust "diagrams have text descriptions or alt text") + + ; ── Internationalisation (i18n) ── + (adjust "all user-facing strings externalisable for translation") + (adjust "no hardcoded English in error messages — use message keys") + (adjust "date/time/number formats locale-aware") + (adjust "RTL (right-to-left) layout support where applicable") + (adjust "Unicode handled correctly throughout (UTF-8 everywhere)") + ) + + (related-resources + ; LOL — super-parallel corpus crawler for 1500+ languages + ; Use for linguistic data, translation coverage, and i18n validation + (lol "standards/lol — multilingual NLP corpus, see README.adoc") + (polyglot-i18n "polyglot-i18n — i18n framework and WASM translation engine") + ) + + (enforcement + (ci "accessibility linting in quality.yml workflow") + (pr-block "PR blocked if accessibility regression detected") + (tool "axe-core or pa11y for automated checks on web UI") + (tool "CLI output inspected for colour-only signalling") + (manual "manual screen reader test before major releases") + ) + + (notes + "These are MINIMUM requirements. Exceeding them (AAA) is encouraged." + "When in doubt about an accessibility decision, ask — don't guess." + "Accessibility is not optional polish — it is a structural requirement." + ) +) diff --git a/rs/.machine_readable/CLADE.a2ml b/rs/.machine_readable/CLADE.a2ml new file mode 100644 index 0000000..3cda983 --- /dev/null +++ b/rs/.machine_readable/CLADE.a2ml @@ -0,0 +1,47 @@ +# SPDX-License-Identifier: MPL-2.0 +# Clade declaration — part of the gv-clade-index registry +# See: https://github.com/hyperpolymath/gv-clade-index + +[identity] +uuid = "f00c6716-eeaa-5f62-9c9d-80e87ea3901c" +primary-forge = "github" +primary-owner = "hyperpolymath" +canonical-name = "a2ml-rs" +prefixed-name = "rm-a2ml-rs" + +[clade] +primary = "rm" +secondary = ["gv"] +assigned = "2026-03-16" +rationale = "" + +[forges] +github = "hyperpolymath/a2ml-rs" +gitlab = "hyperpolymath/a2ml-rs" +bitbucket = "hyperpolymath/a2ml-rs" + +[lineage] +type = "standalone" +parent = "RSR template — scaffold for new repos" +born = "2026-03-16" + +# Lifecycle status (added by clade-status-backfill; see gv-clade-index ADR 0006). +# Identity (uuid) and status are SEPARATE layers: uuid is immortal; phase is a +# mutable pointer. No phase is terminal (extinct -> active is a legal "Gitassic +# Park" transition on the same uuid). A rename is NOT a phase change — the old +# prefixed-name goes to aliases[], uuid and phase are untouched. +[status] +# One of: reserved incubating active dormant | merged superseded archived extinct +phase = "active" +since = "2026-03-16" +present = true +aliases = [] +merged-into = "" +superseded-by = "" +successors = [] +ended = "" + +[[status.history]] +phase = "active" +since = "2026-03-16" +note = "backfilled default — correct if the true phase differs" diff --git a/rs/.machine_readable/ENSAID_CONFIG.a2ml b/rs/.machine_readable/ENSAID_CONFIG.a2ml new file mode 100644 index 0000000..1384822 --- /dev/null +++ b/rs/.machine_readable/ENSAID_CONFIG.a2ml @@ -0,0 +1,96 @@ +# SPDX-License-Identifier: MPL-2.0 +# Copyright (c) {{CURRENT_YEAR}} {{AUTHOR}} ({{OWNER}}) <{{AUTHOR_EMAIL}}> +# +# ENSAID_CONFIG.a2ml — eNSAID Environment Configuration +# Per-repo configuration for PanLL and eNSAID-compatible tools. +# +# Canonical location: .machine_readable/ENSAID_CONFIG.a2ml +# Spec: https://github.com/hyperpolymath/standards/tree/main/ensaid-config +# +# Naming convention: +# - UPPERCASE + underscore = non-executable machine-readable file +# - Lives in .machine_readable/ alongside STATE.a2ml, META.a2ml, etc. + +# ───────────────────────────────────────────────────────────────── +# [ensaid] — Core eNSAID identity and version +# ───────────────────────────────────────────────────────────────── +[ensaid] +version = "1.0.0" +tool = "panll" + +# ───────────────────────────────────────────────────────────────── +# [workspace] — Workspace mode, protection, and execution policy +# ───────────────────────────────────────────────────────────────── +[workspace] +mode = "rhodium" # rhodium | gold | silver | bronze +protection = "open" # open | guarded | locked +execution = "live" # live | dry-run | approval-required + +# ───────────────────────────────────────────────────────────────── +# [preferences] — User/repo-level display and behaviour preferences +# ───────────────────────────────────────────────────────────────── +[preferences] +humidity = "medium" # high | medium | low (drift aura intensity) +default-arrangement = "default-3-panel" # workspace arrangement ID +auto-connect = true # auto-connect panels to backends on load + +# ───────────────────────────────────────────────────────────────── +# [panels] — Panel visibility, enablement, and isolation overrides +# ───────────────────────────────────────────────────────────────── +[panels] +version = "1.0.0" + +# By default, all panels are available. Uncomment to restrict: +# [[panels.enabled]] +# id = "valence-shell" +# isolation = "native" +# auto-connect = true +# +# [[panels.enabled]] +# id = "editor-bridge" +# isolation = "native" +# auto-connect = true + +# Panels to hide for this repo context: +# [panels.disabled] +# ids = [] + +# ───────────────────────────────────────────────────────────────── +# [workflows] — Automation Router event-driven cross-panel rules +# ───────────────────────────────────────────────────────────────── +[workflows] +version = "1.0.0" + +# Example: rebuild on file save +# [[workflows.rule]] +# name = "build-on-save" +# trigger = { event = "file-changed", pattern = "src/**/*.res" } +# condition = { panel = "build-dashboard", field = "watchMode", equals = true } +# action = { panel = "build-dashboard", message = "TriggerBuild", args = { target = "game" } } +# approval = "auto-fire" # auto-fire | require-approval | approve-once | dry-run-first + +# ───────────────────────────────────────────────────────────────── +# [clades] — Panel clade trait and capability overrides +# ───────────────────────────────────────────────────────────────── +[clades] +version = "1.0.0" + +# Example: add a custom capability to a panel clade +# [[clades.override]] +# id = "build-dashboard" +# traits = { has-work-items = true } +# capabilities-add = ["CustomCheck"] + +# ───────────────────────────────────────────────────────────────── +# [portfolios] — Custom panel bundles for this repo's workflow +# ───────────────────────────────────────────────────────────────── +[portfolios] +version = "1.0.0" + +# Example: a custom portfolio for this project +# [[portfolios.custom]] +# id = "{{project}}-dev" +# name = "{{PROJECT_NAME}} Development" +# description = "Panels for {{PROJECT_NAME}} development" +# panels = ["valence-shell", "editor-bridge", "build-dashboard"] +# default-isolation = "native" diff --git a/rs/.machine_readable/INTENT.contractile b/rs/.machine_readable/INTENT.contractile new file mode 100644 index 0000000..a03a3e4 --- /dev/null +++ b/rs/.machine_readable/INTENT.contractile @@ -0,0 +1,72 @@ +; SPDX-License-Identifier: MPL-2.0 +; INTENT.contractile — Purpose and scope for a2ml-rs +; Helps LLM/SLM agents understand what this repo IS and IS NOT. +; +; Part of the contractile family: MUST, TRUST, DUST, INTENT, ADJUST + +; ── Definitions ────────────────────────────────────────────────── +; +; INTENT (noun) +; The purpose contractile. Defines what this repository IS, what it is +; NOT (anti-purpose), and which architectural decisions are load-bearing. +; Without INTENT, LLMs drift into scope creep, reverse key decisions, +; or add features that belong in a different repo. +; +; Scope: +; INTENT governs the conceptual boundaries of the project — its reason +; for existing, its domain, and its relationship to the ecosystem. +; It does NOT specify implementation details (that's MUST and code). +; +; Relationship to other contractiles: +; - MUST: INTENT explains WHY certain MUSTs exist. If you don't +; understand a MUST, read INTENT first. +; - TRUST: The "ask-before-touching" section in INTENT maps directly +; to TRUST.trust-deny for the most sensitive areas. +; - ADJUST: INTENT's anti-purpose should include "this software is +; NOT only for users with perfect vision/hearing/mobility." +; - DUST: When INTENT changes (repo pivots), related DUST entries +; should be created for the abandoned direction. +; +; ── End Definitions ────────────────────────────────────────────── + +(intent-contractile + (version "1.0.0") + (repo "a2ml-rs") + + ; === Purpose (what this repo IS) === + (purpose + "{{ONE_PARAGRAPH_PURPOSE}}" + ) + + ; === Anti-Purpose (what this repo is NOT — prevents scope creep) === + (anti-purpose + "{{ONE_PARAGRAPH_ANTI_PURPOSE}}" + ; Examples: + ; "This is NOT a general-purpose database — it solves one specific problem." + ; "This is NOT a framework — it is a library with a focused API." + ; "This does NOT handle authentication — that is delegated to [other repo]." + ) + + ; === Key Architectural Decisions That Must Not Be Reversed === + (architectural-invariants + ; *REMINDER: List the foundational decisions* + ; ("Idris2 for ABI definitions — dependent types prove interface correctness") + ; ("Zig for FFI — zero-cost C ABI compatibility") + ; ("Elixir for supervision — OTP fault tolerance") + ) + + ; === Sensitive Areas (if in doubt, ask) === + (ask-before-touching + ; *REMINDER: List areas where LLMs should check before modifying* + ; "src/abi/ — formal proofs, changes require re-verification" + ; "ffi/zig/ — C ABI boundary, changes affect all language bindings" + ; ".machine_readable/ — checkpoint files, format is specified" + ) + + ; === Ecosystem Position === + (ecosystem + (belongs-to "{{MONOREPO_OR_STANDALONE}}") + (depends-on ("{{DEP1}}" "{{DEP2}}")) + (depended-on-by ("{{CONSUMER1}}" "{{CONSUMER2}}")) + ) +) diff --git a/rs/.machine_readable/MUST.contractile b/rs/.machine_readable/MUST.contractile new file mode 100644 index 0000000..6910cae --- /dev/null +++ b/rs/.machine_readable/MUST.contractile @@ -0,0 +1,91 @@ +; SPDX-License-Identifier: MPL-2.0 +; MUST.contractile — Baseline invariants for a2ml-rs +; These constraints MUST NOT be violated. K9 validators enforce them. +; +; Part of the contractile family: MUST, TRUST, DUST, INTENT, ADJUST + +; ── Definitions ────────────────────────────────────────────────── +; +; MUST (noun/verb) +; The hard-constraint contractile. Defines invariants that are structurally +; required for the repository to function correctly and safely. Violating +; a MUST is always a bug — there are no "soft" MUSTs. +; +; Scope: +; MUST governs code, configuration, CI, and structure. It does NOT govern +; style, preference, or approach — those belong in CLAUDE.md or coding +; standards. MUST is for things that break the project if violated. +; +; Relationship to other contractiles: +; - TRUST: MUST is enforced regardless of trust level. Even maximal-trust +; agents cannot violate MUST constraints. +; - ADJUST: All ADJUST invariants are implicitly MUST invariants too. +; ADJUST exists separately for visibility. +; - INTENT: MUST protects the architectural decisions described in INTENT. +; - DUST: When a feature enters DUST (deprecation), its MUST constraints +; remain active until the feature is fully removed. +; +; Enforcement: +; K9 validators in contractiles/k9/ machine-check MUST constraints. +; CI runs these on every PR. Violations block merge. +; +; ── End Definitions ────────────────────────────────────────────── + +(must-contractile + (version "1.0.0") + (repo "a2ml-rs") + + ; === Universal Invariants (apply to ALL repos) === + + (invariants + ; Paths + (must "no hardcoded absolute paths (/home/*, /mnt/*, /var/mnt/*)") + (must "all paths use env vars, XDG dirs, or relative references") + + ; Language policy + (must "no new TypeScript files") + (must "no new Python files") + (must "no new Go files") + (must "no npm/bun/yarn/pnpm dependencies — Deno only") + + ; Dangerous patterns + (must "no believe_me (Idris2)") + (must "no assert_total (Idris2)") + (must "no Admitted (Coq)") + (must "no sorry (Lean)") + (must "no unsafeCoerce (Haskell)") + (must "no Obj.magic (OCaml)") + (must "no unsafe {} blocks without safety comment (Rust)") + + ; License + (must "SPDX-License-Identifier header on every source file") + (must "no removal or modification of LICENSE file") + + ; Structure + (must ".machine_readable/ directory preserved") + (must "0-AI-MANIFEST.a2ml preserved") + (must "no SCM files in repo root — only in .machine_readable/") + + ; CI + (must "no removal of CI workflows without explicit approval") + (must "all GitHub Actions SHA-pinned") + + ; Code quality + (must "tests must not be deleted or weakened") + (must "generated code in generated/ directory only") + (must "no introduction of OWASP top 10 vulnerabilities") + + ; ABI/FFI (if applicable) + (must "no modification of ABI contracts without proof update") + (must "no removal of formal verification proofs") + ) + + ; === Project-Specific Invariants === + ; *REMINDER: Add invariants specific to this repo* + ; (must "# Add project-specific invariants here") + + (enforcement + (k9-validator "contractiles/k9/must-check.k9.ncl") + (ci "quality.yml runs must-check on every PR") + ) +) diff --git a/rs/.machine_readable/README.adoc b/rs/.machine_readable/README.adoc new file mode 100644 index 0000000..471d6c7 --- /dev/null +++ b/rs/.machine_readable/README.adoc @@ -0,0 +1 @@ += .machine_readable Pillar diff --git a/rs/.machine_readable/TRUST.contractile b/rs/.machine_readable/TRUST.contractile new file mode 100644 index 0000000..930d112 --- /dev/null +++ b/rs/.machine_readable/TRUST.contractile @@ -0,0 +1,80 @@ +; SPDX-License-Identifier: MPL-2.0 +; TRUST.contractile — Trust boundaries for a2ml-rs +; Defines what LLM/SLM agents are trusted to do without asking. +; +; Part of the contractile family: MUST, TRUST, DUST, INTENT, ADJUST + +; ── Definitions ────────────────────────────────────────────────── +; +; TRUST (noun/verb) +; The permission contractile. Defines the boundary between what an AI +; agent may do autonomously and what requires human approval. Trust is +; graduated — not binary — with four levels from minimal to maximal. +; +; Trust levels: +; - maximal: Agent may read, build, test, lint, format, heal freely. +; Only destructive/external actions require approval. +; - standard: Agent may read and build. Test/lint need approval. +; - restricted: Agent may read only. All modifications need approval. +; - minimal: Agent may read specific files only. Everything else blocked. +; +; Scope: +; TRUST governs AI agent behaviour only. It does not affect human +; contributors — humans follow CONTRIBUTING.md and GOVERNANCE.adoc. +; +; Relationship to other contractiles: +; - MUST: Trust never overrides MUST. Even at maximal trust, MUST +; violations are blocked. +; - ADJUST: Trust does not exempt from ADJUST. All trust tiers must +; produce accessible output. +; - INTENT: TRUST.trust-deny protects the sensitive areas listed in +; INTENT.ask-before-touching. +; - DUST: Deprecated features have the same trust rules as active ones. +; +; ── End Definitions ────────────────────────────────────────────── + +(trust-contractile + (version "1.0.0") + (repo "a2ml-rs") + + (trust-level "maximal") ; maximal | standard | restricted | minimal + + ; === Maximal Trust (default) === + ; LLM may freely do these without asking: + (trust-actions + "read" ; Read any file in the repo + "build" ; Run build commands + "test" ; Run test suites + "lint" ; Run linters and formatters + "format" ; Auto-format code + "doctor" ; Run self-diagnostics + "heal" ; Attempt automatic repair + "git-status" ; Check git status + "git-diff" ; View diffs + "git-log" ; View history + ) + + ; === Denied Actions (always require human approval) === + (trust-deny + "delete-branch" ; Could lose work + "force-push" ; Overwrites history + "modify-ci-secrets" ; Security sensitive + "publish" ; External visibility + "push-to-main" ; Protected branch + "delete-files-bulk" ; More than 5 files at once + "modify-license" ; Legal implications + "modify-security-policy" ; Security implications + "remove-proofs" ; Formal verification regression + "disable-ci-checks" ; Safety regression + ) + + ; === Trust Boundary === + (trust-boundary "repo") ; LLM confined to this repo unless explicitly told otherwise + + ; === Override === + ; Repos requiring tighter trust override these settings with justification: + ; (override + ; (trust-level "restricted") + ; (reason "Contains production secrets / handles PII / etc.") + ; ) +) diff --git a/rs/.machine_readable/agent_instructions/README.adoc b/rs/.machine_readable/agent_instructions/README.adoc new file mode 100644 index 0000000..1cc7487 --- /dev/null +++ b/rs/.machine_readable/agent_instructions/README.adoc @@ -0,0 +1,41 @@ +// SPDX-License-Identifier: CC-BY-SA-4.0 +// Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) += Agent Instructions +:toc: preamble + +Methodology-aware configuration for AI agents. Read by any AI agent +(Claude, Gemini, Copilot, etc.) at session start. + +== Files + +[cols="1,3"] +|=== +| File | Purpose + +| `methodology.a2ml` +| Default mode, invariants, ring ceiling, priority weights, convergent budget + +| `coverage.a2ml` +| Session coverage tracking — what was visited, what was skipped, what has MUSTs + +| `debt.a2ml` +| Meander debt — things found but not fixed, carried between sessions +|=== + +== How Agents Use These + +1. Read `methodology.a2ml` at session start — know mode, invariants, ceiling +2. Read `coverage.a2ml` — know what was visited last time, what was skipped +3. Read `debt.a2ml` — know what's outstanding from previous sessions +4. At session end, update `coverage.a2ml` and `debt.a2ml` + +== Relationship to Other Files + +* `AGENTIC.a2ml` says WHAT agents can do (permissions, gating) +* `agent_instructions/` says HOW agents should work (methodology) +* `bot_directives/` says what the gitbot-fleet does (fleet-specific) +* `CLAUDE.md` says how Claude specifically should work (Claude-specific) + +== Reference + +ADR-002 in `standards/agentic-a2ml/docs/ADR-002-methodology-layer.adoc` diff --git a/rs/.machine_readable/agent_instructions/coverage.a2ml b/rs/.machine_readable/agent_instructions/coverage.a2ml new file mode 100644 index 0000000..6979664 --- /dev/null +++ b/rs/.machine_readable/agent_instructions/coverage.a2ml @@ -0,0 +1,61 @@ +# SPDX-License-Identifier: MPL-2.0 +# Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) +# +# coverage.a2ml — Session coverage tracking +# Updated at the end of each AI agent session. +# Persists what was visited, what was skipped, and what has MUSTs. +# +# Reference: ADR-002 in standards/agentic-a2ml/docs/ + +[metadata] +version = "1.0.0" +last-updated = "2026-03-24" + +# ============================================================================ +# COVERAGE STATE +# ============================================================================ +# Updated by agents at session end. Tracks which components have been +# visited and which have known MUSTs that were skipped. + +[coverage] +total-components = 0 +visited-components = 0 +coverage-percent = 0 + +# ============================================================================ +# VISITED COMPONENTS +# ============================================================================ +# Component → session date + ring reached +# Agents add entries as they work through components. +# +# Example: +# [coverage.visited.emergency-room] +# date = "2026-03-23" +# ring = 2 +# fixes = 3 +# notes = "boot-guardian built, shutdown-marshal built" + +# ============================================================================ +# SKIPPED COMPONENTS WITH MUSTS +# ============================================================================ +# Components with known MUSTs that were not visited in the most recent session. +# These become P1 inputs for the next session's Phase 0. +# +# Example: +# [coverage.skipped-musts.session-sentinel] +# priority = "P0" +# issue = "56 SIGABRTs in 4 days, D-Bus race condition" +# discovered = "2026-03-23" + +# ============================================================================ +# CHERRY-PICKING AUDIT +# ============================================================================ +# At session end, agents report whether they chose easy work over hard work. +# This is the accountability mechanism for the weighted priority system. +# +# [coverage.cherry-picking] +# easy-high-completed = 3 +# hard-high-completed = 1 +# easy-low-completed = 2 +# hard-low-deferred = 4 +# assessment = "Correctly prioritised — all MUST items addressed before COULDs" diff --git a/rs/.machine_readable/agent_instructions/debt.a2ml b/rs/.machine_readable/agent_instructions/debt.a2ml new file mode 100644 index 0000000..c0238c5 --- /dev/null +++ b/rs/.machine_readable/agent_instructions/debt.a2ml @@ -0,0 +1,49 @@ +# SPDX-License-Identifier: MPL-2.0 +# Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) +# +# debt.a2ml — Meander debt list +# Things found but not fixed. Carried between sessions. +# Becomes the next session's Phase 0 input. +# +# Reference: ADR-002 in standards/agentic-a2ml/docs/ + +[metadata] +version = "1.0.0" +last-updated = "2026-03-24" + +# ============================================================================ +# DEBT ITEMS +# ============================================================================ +# Each item has: component, issue, effort (easy|medium|hard), impact (high|medium|low), +# priority (should|could), and discovered date. +# +# Items are consumed (removed) when fixed. New items are added at session end. +# The debt list prevents the "one more wave" loop — found things are persisted, +# not forgotten, and not used as justification for infinite meandering. + +# ============================================================================ +# SHOULD — would fix next wave +# ============================================================================ +# These are inputs for the next session if the user says "keep going". +# +# Example: +# [[debt.should]] +# component = "system-tools/monitoring/observatory" +# issue = "Stale duplicate of root observatory/" +# effort = "easy" +# impact = "medium" +# discovered = "2026-03-23" + +# ============================================================================ +# COULD — would fix eventually +# ============================================================================ +# These are low-priority items that don't justify a session on their own. +# They get picked up when an agent is in the area for other reasons. +# +# Example: +# [[debt.could]] +# component = "cicada" +# issue = "RSR_OUTLINE.adoc references banned AGPL-3.0" +# effort = "easy" +# impact = "low" +# discovered = "2026-03-23" diff --git a/rs/.machine_readable/agent_instructions/methodology.a2ml b/rs/.machine_readable/agent_instructions/methodology.a2ml new file mode 100644 index 0000000..754f357 --- /dev/null +++ b/rs/.machine_readable/agent_instructions/methodology.a2ml @@ -0,0 +1,107 @@ +# SPDX-License-Identifier: MPL-2.0 +# Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) +# +# methodology.a2ml — AI agent methodology configuration +# Declares how agents should approach work in this repository. +# Read at session start by any AI agent (Claude, Gemini, Copilot, etc.) +# +# Reference: ADR-002 in standards/agentic-a2ml/docs/ + +[metadata] +version = "1.0.0" +last-updated = "2026-03-24" +spec = "https://github.com/hyperpolymath/standards/blob/main/agentic-a2ml/docs/ADR-002-methodology-layer.adoc" + +# ============================================================================ +# MODE SELECTION +# ============================================================================ +# convergent: find gaps, fill them, build infrastructure (default for ops/infra) +# divergent: find what's strongest, push it further (for research/creative) +# hybrid: audit 20% of budget, then focus 80% on top MUSTs (default for most) + +[methodology] +default-mode = "hybrid" +ring-ceiling = 2 # Hard ceiling for ring expansion (0-3) +wave-cap = 2 # Max waves before requiring user "keep going" +spike-required = true # Every session must ship code, not just designs + +# ============================================================================ +# PRIORITY WEIGHTS +# ============================================================================ +# MUST (3x): Blocking the current work → fix immediately +# SHOULD (2x): Degrading quality of current work → fix if in zone +# COULD (1x): Improving quality of adjacent work → add to debt list + +[methodology.priority-weights] +must = 3 +should = 2 +could = 1 + +# ============================================================================ +# CONVERGENT BUDGET (when mode = convergent or hybrid) +# ============================================================================ +# How to allocate effort across work types. +# Prevents over-polishing docs while structural work waits. + +[methodology.convergent-budget] +structural = 70 # % for new modules, compilation fixes, wiring, integration +corrective = 20 # % for bugs found, broken imports, stale references +perfective = 10 # % for SPDX headers, doc updates, formatting, style + +# ============================================================================ +# UNIQUE STRENGTH (when mode = divergent) +# ============================================================================ +# What makes this project special. Agents should DEEPEN this, not broaden it. +# Customise this per project — the template default is generic. + +[methodology.unique-strength] +description = "{{PROJECT_UNIQUE_STRENGTH}}" +deepen-not-broaden = true + +# ============================================================================ +# DIVERGENT INVARIANTS +# ============================================================================ +# Constraints that divergent mode must NOT violate. +# These are the riverbanks — diverge within them, not across. +# "Amplify uniqueness" means deepen, not broaden. +# +# Test before any divergent action: +# "Does this deepen the existing strength, or add a parallel strength?" +# If parallel → stop. Note as cross-project insight. + +[methodology.divergent-invariants] +rules = [ + # Customise per project. Examples: + # "Idris2 only for formal verification — no Lean4, Coq, Agda", + # "believe_me count must remain zero", + # "FFI architecture: Idris2 → RefC → Zig → C ABI (no shortcuts)", +] + +# Optional: language invariant for the core strength +# If set, divergent mode will not introduce other languages for this purpose +# language-invariant = "idris2" + +# ============================================================================ +# CONSTRAINT HINTS +# ============================================================================ +# Help Phase 0 find the critical chain faster. +# Updated at session end with newly discovered constraints. + +[methodology.known-constraints] +constraints = [ + # Customise per project. Examples: + # "End-to-end build has never been verified", + # "libproject.so does not exist yet — all bindings call stubs", +] + +# ============================================================================ +# STATE FILE VALIDATION +# ============================================================================ +# Phase 0 reads STATE.a2ml first but it may be broken. +# These rules detect corrupt/template/stale state files. + +[methodology.state-validation] +reject-if-contains = ["{{PLACEHOLDER}}", "{{PROJECT}}", "rsr-template-repo"] +reject-if-project-name-mismatch = true +staleness-threshold-days = 90 +fallback-files = ["TODO.md", "TODO.adoc", "ROADMAP.adoc", "README.adoc"] diff --git a/rs/.machine_readable/ai/.clinerules b/rs/.machine_readable/ai/.clinerules new file mode 100644 index 0000000..a29ed5f --- /dev/null +++ b/rs/.machine_readable/ai/.clinerules @@ -0,0 +1,43 @@ +# SPDX-License-Identifier: MPL-2.0 +# Copyright (c) {{CURRENT_YEAR}} {{AUTHOR}} ({{OWNER}}) <{{AUTHOR_EMAIL}}> +# Authoritative source: docs/AI-CONVENTIONS.md + +# STARTUP: Read 0-AI-MANIFEST.a2ml first, then .machine_readable/STATE.a2ml. + +# LICENSE +# All original code: MPL-2.0. +# Never AGPL-3.0. MPL-2.0 only as platform-required fallback. +# SPDX header required on every source file. +# Copyright: {{AUTHOR}} ({{OWNER}}) <{{AUTHOR_EMAIL}}> + +# STATE FILES (.machine_readable/ ONLY) +# Never create in repo root: STATE.a2ml, META.a2ml, ECOSYSTEM.a2ml, +# AGENTIC.a2ml, NEUROSYM.a2ml, PLAYBOOK.a2ml. +# The .machine_readable/ directory is the single source of truth. + +# BANNED PATTERNS +# Idris2: believe_me, assert_total, assert_smaller, unsafePerformIO +# Haskell: unsafeCoerce, unsafePerformIO, undefined, error +# OCaml: Obj.magic, Obj.repr, Obj.obj +# Coq: Admitted +# Lean: sorry +# Rust: transmute (unless FFI with // SAFETY: comment) + +# BANNED LANGUAGES +# TypeScript -> ReScript +# Node.js / npm / bun -> Deno +# Go -> Rust +# Python -> Julia or Rust + +# CONTAINERS +# Runtime: Podman (never Docker). +# File: Containerfile (never Dockerfile). +# Base: cgr.dev/chainguard/wolfi-base:latest or cgr.dev/chainguard/static:latest. + +# ABI/FFI +# ABI: Idris2 with dependent types (src/interface/abi/). +# FFI: Zig with C ABI (src/interface/ffi/). +# Headers: src/interface/generated/. + +# BUILD: Use just (justfile) for all tasks. +# STYLE: Descriptive names. Document all files. SPDX headers everywhere. diff --git a/rs/.machine_readable/ai/.cursorrules b/rs/.machine_readable/ai/.cursorrules new file mode 100644 index 0000000..c13b393 --- /dev/null +++ b/rs/.machine_readable/ai/.cursorrules @@ -0,0 +1,47 @@ +# SPDX-License-Identifier: MPL-2.0 +# Copyright (c) {{CURRENT_YEAR}} {{AUTHOR}} ({{OWNER}}) <{{AUTHOR_EMAIL}}> +# Authoritative source: docs/AI-CONVENTIONS.md + +# Read 0-AI-MANIFEST.a2ml in the repo root FIRST for canonical file locations. + +# LICENSE +# All original code: MPL-2.0 (SPDX header required on every file). +# Never use AGPL-3.0. Fallback to MPL-2.0 only when platform requires it. +# Copyright: {{AUTHOR}} ({{OWNER}}) <{{AUTHOR_EMAIL}}> + +# STATE FILES +# .a2ml metadata files go in .machine_readable/ ONLY. +# Never create STATE.a2ml, META.a2ml, ECOSYSTEM.a2ml, AGENTIC.a2ml, +# NEUROSYM.a2ml, or PLAYBOOK.a2ml in the repository root. + +# BANNED PATTERNS +# Idris2: believe_me, assert_total, assert_smaller, unsafePerformIO +# Haskell: unsafeCoerce, unsafePerformIO, undefined, error +# OCaml: Obj.magic, Obj.repr, Obj.obj +# Coq: Admitted +# Lean: sorry +# Rust: transmute (unless FFI with // SAFETY: comment) + +# BANNED LANGUAGES +# TypeScript -> use ReScript +# Node.js / npm / bun -> use Deno +# Go -> use Rust +# Python -> use Julia or Rust + +# CONTAINERS +# Runtime: Podman (never Docker) +# File: Containerfile (never Dockerfile) +# Base: cgr.dev/chainguard/wolfi-base:latest + +# ABI/FFI STANDARD +# ABI definitions: Idris2 with dependent types (src/interface/abi/) +# FFI implementation: Zig with C ABI (src/interface/ffi/) +# Generated C headers: src/interface/generated/ + +# BUILD SYSTEM +# Use just (justfile) for all build, test, lint, and format tasks. + +# CODE STYLE +# Use descriptive variable names. +# Annotate and document all files. +# Add SPDX-License-Identifier header to every source file. diff --git a/rs/.machine_readable/ai/.windsurfrules b/rs/.machine_readable/ai/.windsurfrules new file mode 100644 index 0000000..a29ed5f --- /dev/null +++ b/rs/.machine_readable/ai/.windsurfrules @@ -0,0 +1,43 @@ +# SPDX-License-Identifier: MPL-2.0 +# Copyright (c) {{CURRENT_YEAR}} {{AUTHOR}} ({{OWNER}}) <{{AUTHOR_EMAIL}}> +# Authoritative source: docs/AI-CONVENTIONS.md + +# STARTUP: Read 0-AI-MANIFEST.a2ml first, then .machine_readable/STATE.a2ml. + +# LICENSE +# All original code: MPL-2.0. +# Never AGPL-3.0. MPL-2.0 only as platform-required fallback. +# SPDX header required on every source file. +# Copyright: {{AUTHOR}} ({{OWNER}}) <{{AUTHOR_EMAIL}}> + +# STATE FILES (.machine_readable/ ONLY) +# Never create in repo root: STATE.a2ml, META.a2ml, ECOSYSTEM.a2ml, +# AGENTIC.a2ml, NEUROSYM.a2ml, PLAYBOOK.a2ml. +# The .machine_readable/ directory is the single source of truth. + +# BANNED PATTERNS +# Idris2: believe_me, assert_total, assert_smaller, unsafePerformIO +# Haskell: unsafeCoerce, unsafePerformIO, undefined, error +# OCaml: Obj.magic, Obj.repr, Obj.obj +# Coq: Admitted +# Lean: sorry +# Rust: transmute (unless FFI with // SAFETY: comment) + +# BANNED LANGUAGES +# TypeScript -> ReScript +# Node.js / npm / bun -> Deno +# Go -> Rust +# Python -> Julia or Rust + +# CONTAINERS +# Runtime: Podman (never Docker). +# File: Containerfile (never Dockerfile). +# Base: cgr.dev/chainguard/wolfi-base:latest or cgr.dev/chainguard/static:latest. + +# ABI/FFI +# ABI: Idris2 with dependent types (src/interface/abi/). +# FFI: Zig with C ABI (src/interface/ffi/). +# Headers: src/interface/generated/. + +# BUILD: Use just (justfile) for all tasks. +# STYLE: Descriptive names. Document all files. SPDX headers everywhere. diff --git a/rs/.machine_readable/ai/0.2-AI-MANIFEST.a2ml b/rs/.machine_readable/ai/0.2-AI-MANIFEST.a2ml new file mode 100644 index 0000000..869cbee --- /dev/null +++ b/rs/.machine_readable/ai/0.2-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "ai-registry" +level: 2 +parent: "../0.1-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Sub-registry for ai metadata. diff --git a/rs/.machine_readable/ai/AI.a2ml b/rs/.machine_readable/ai/AI.a2ml new file mode 100644 index 0000000..c683d30 --- /dev/null +++ b/rs/.machine_readable/ai/AI.a2ml @@ -0,0 +1,16 @@ + +# AI Assistant Instructions + +## Repository Focus +- `rsr-template-repo` is treated as a Rhodium Standard Repository; obey the Rhodium policies and keep `.machine_readable/` authoritative. +- All machine-readable content lives under `.machine_readable/` — state files (a2ml), bot directives, and contractiles. +- Prefer to keep generated files out of source control, and regenerate them with the documented commands before committing. + +## Workflow +1. Inspect `.machine_readable/STATE.a2ml` for blockers and next actions. +2. Respect any constraints listed inside `.machine_readable/AGENTIC.a2ml` when tooling changes are requested. +3. After finishing edits, update STATE with your outcomes and commit with a concise, imperative message. + +## Delivery Promises +- Mention in summaries whether STATE, `.machine_readable/contractiles/`, or `.machine_readable/bot_directives/` changed. +- Keep this file in sync with the repository's status; update it if the governance changes. diff --git a/rs/.machine_readable/ai/PLACEHOLDERS.adoc b/rs/.machine_readable/ai/PLACEHOLDERS.adoc new file mode 100644 index 0000000..02bc8b4 --- /dev/null +++ b/rs/.machine_readable/ai/PLACEHOLDERS.adoc @@ -0,0 +1,142 @@ += Template Placeholders +# Template Placeholders + +All placeholders in this template follow the `{{PLACEHOLDER}}` pattern. +After cloning, replace them with your project-specific values. + +## Recommended: Interactive Bootstrap + +```bash +just init +``` + +This interactively prompts for all values, replaces every placeholder, +validates the result, and runs k9-svc checks if available. + +## Manual Replace + +```bash +# If you prefer manual replacement (run from repo root) + +sed -i 's/{{AUTHOR}}/Jane Doe/g' $(grep -rl '{{AUTHOR}}' .) +sed -i 's/{{AUTHOR_EMAIL}}/jane@example.org/g' $(grep -rl '{{AUTHOR_EMAIL}}' .) +sed -i 's/{{OWNER}}/my-org/g' $(grep -rl '{{OWNER}}' .) +sed -i 's/{{PROJECT_NAME}}/my-project/g' $(grep -rl '{{PROJECT_NAME}}' .) +sed -i 's/{{PROJECT}}/MY_PROJECT/g' $(grep -rl '{{PROJECT}}' .) +sed -i 's/{{project}}/my_project/g' $(grep -rl '{{project}}' .) +sed -i 's/{{REPO}}/my-project/g' $(grep -rl '{{REPO}}' .) +sed -i 's/{{FORGE}}/github.com/g' $(grep -rl '{{FORGE}}' .) +sed -i "s/{{CURRENT_YEAR}}/$(date +%Y)/g" $(grep -rl '{{CURRENT_YEAR}}' .) +sed -i "s/{{CURRENT_DATE}}/$(date +%Y-%m-%d)/g" $(grep -rl '{{CURRENT_DATE}}' .) +``` + +## Placeholder Reference + +### Author & Copyright + +| Placeholder | Description | Example | Files | +|---|---|---|---| +| `{{AUTHOR}}` | Full legal name | `Jane Doe` | SPDX headers (all files), MAINTAINERS.md, .mailmap, .reuse/dep5, docs/AI-CONVENTIONS.md | +| `{{AUTHOR_EMAIL}}` | Primary contact email | `jane@example.org` | SPDX headers (all files), .mailmap, .reuse/dep5, .well-known/humans.txt | +| `{{AUTHOR_EMAIL_ALT}}` | Previous/secondary email (for .mailmap) | `old@example.com` | .mailmap | +| `{{AUTHOR_ORG}}` | Author's organization/affiliation | `Acme University` | project-metadata.k9.ncl | +| `{{AUTHOR_LAST}}` | Author surname (for citations) | `Doe` | docs/CITATIONS.adoc | +| `{{AUTHOR_FIRST}}` | Author first name (for citations) | `Jane` | docs/CITATIONS.adoc | +| `{{AUTHOR_INITIALS}}` | Author initials (for citations) | `J.` | docs/CITATIONS.adoc | + +### Project Identity + +| Placeholder | Description | Example | Files | +|---|---|---|---| +| `{{PROJECT_NAME}}` | Human-readable project name | `My Project` | SECURITY.md, CODE_OF_CONDUCT.md, TOPOLOGY.md, STATE.a2ml, Justfile, GOVERNANCE.md, MAINTAINERS.md, flake.nix, devcontainer.json | +| `{{PROJECT_DESCRIPTION}}` | One-line description | `A tool for X` | flake.nix | +| `{{PROJECT}}` | Uppercase identifier (for Idris2 modules, C macros) | `MY_PROJECT` | ABI-FFI-README.md, src/interface/abi/*.idr, src/interface/ffi/*.zig | +| `{{project}}` | Lowercase identifier (for C symbols, filenames) | `my_project` | ABI-FFI-README.md, src/interface/ffi/*.zig | +| `{{REPO}}` | Repository name (slug) | `my-project` | CONTRIBUTING.md, SECURITY.md, CODE_OF_CONDUCT.md, cliff.toml | +| `{{OWNER}}` | GitHub/GitLab org or username | `my-org` | SPDX headers, CONTRIBUTING.md, SECURITY.md, GOVERNANCE.md, MAINTAINERS.md, CODEOWNERS, mirror.yml, cliff.toml | +| `{{FORGE}}` | Git forge domain | `github.com` | CONTRIBUTING.md | + +### Dates + +| Placeholder | Description | Example | Files | +|---|---|---|---| +| `{{CURRENT_YEAR}}` | Current year | `2026` | SPDX headers (all files), GOVERNANCE.md, MAINTAINERS.md | +| `{{CURRENT_DATE}}` | Current date (ISO) | `2026-02-14` | STATE.a2ml, MAINTAINERS.md | +| `{{DATE}}` | Last updated date | `2026-02-14` | TOPOLOGY.md, THREAT-MODEL.md | + +### Contact & Security + +| Placeholder | Description | Example | Files | +|---|---|---|---| +| `{{SECURITY_EMAIL}}` | Security contact email | `security@example.org` | SECURITY.md | +| `{{PGP_FINGERPRINT}}` | 40-char PGP fingerprint | `ABCD 1234 ...` | SECURITY.md | +| `{{PGP_KEY_URL}}` | URL to public PGP key | `https://keys.openpgp.org/...` | SECURITY.md | +| `{{WEBSITE}}` | Project website | `https://example.org` | SECURITY.md | +| `{{CONDUCT_EMAIL}}` | Conduct reports email | `conduct@example.org` | CODE_OF_CONDUCT.md | +| `{{CONDUCT_TEAM}}` | Conduct committee name | `Code of Conduct Committee` | CODE_OF_CONDUCT.md | +| `{{RESPONSE_TIME}}` | SLA for initial response | `48 hours` | CODE_OF_CONDUCT.md | + +### Git + +| Placeholder | Description | Example | Files | +|---|---|---|---| +| `{{MAIN_BRANCH}}` | Main branch name | `main` | CONTRIBUTING.md | + +### Build + +| Placeholder | Description | Example | Files | +|---|---|---|---| +| `{{LICENSE}}` | License name | `MPL-2.0` | ABI-FFI-README.md | +| `{{PROJECT_PURPOSE}}` | One-line project description | `FFI bridges between languages` | STATE.a2ml | + +### AI Manifest + +| Placeholder | Description | Example | Files | +|---|---|---|---| +| `[YOUR-REPO-NAME]` | Repository name | `my-project` | 0-AI-MANIFEST.a2ml | +| `[DATE]` | Creation date | `2026-02-14` | 0-AI-MANIFEST.a2ml | +| `[YOUR-NAME/ORG]` | Maintainer name | `hyperpolymath` | 0-AI-MANIFEST.a2ml | + +### AI Installation Guide + +| Marker | Description | Files | +|---|---|---| +| `[TODO-AI-INSTALL]` | Unfilled section in AI installation guide | `docs/AI_INSTALLATION_GUIDE.adoc`, `docs/AI-INSTALL-README-SECTION.adoc`, `README.adoc` | + +These are **not** standard `{{PLACEHOLDER}}` markers -- they are TODO markers +that must be replaced with project-specific content before release. They mark +sections where the developer (or AI) must fill in: + +- What questions the AI should ask the user +- Exact prerequisite check and install commands +- Privacy notice specific to this project +- Complete installation command block +- Credential setup instructions (URLs, scopes, env vars) +- Verification commands and expected output +- Error handling table +- Example conversation + +**finishbot checks:** `just validate-ai-install` verifies no `[TODO-AI-INSTALL]` markers remain. + +## Deletion Markers + +Some files contain deletion instructions: + +| Marker | Meaning | File | +|---|---|---| +| `{{~ ... ~}}` | Delete this entire line after reading | ABI-FFI-README.md (line 1) | + +## Verification + +After replacing all placeholders, verify none remain: + +```bash +grep -rn '{{' . --include='*.md' --include='*.adoc' --include='*.a2ml' \ + --include='*.scm' --include='*.idr' --include='*.zig' --include='*.res' \ + --include='Justfile' --include='*.nix' --include='*.toml' --include='*.yml' \ + --include='*.yaml' --include='*.hs' --include='*.ncl' --include='*.txt' \ + --include='*.json' --include='Containerfile' --include='dep5' \ + | grep -v 'PLACEHOLDERS.md' | grep -v 'node_modules' +``` + +If the above command produces no output, all placeholders have been replaced. diff --git a/rs/.machine_readable/ai/README.adoc b/rs/.machine_readable/ai/README.adoc new file mode 100644 index 0000000..121bbc8 --- /dev/null +++ b/rs/.machine_readable/ai/README.adoc @@ -0,0 +1,22 @@ += AI Guidance Directory + +Put AI-facing instructions in this folder. + +Examples: + +* `CLAUDE.md` +* `COPILOT.md` +* `GEMINI.md` +* `AI.a2ml` +* `AI.djot` + +Avoid scattering agent instruction files around the repo root. + +Recommended machine read order: + +* `.machine_readable/anchors/ANCHOR.a2ml` +* `.machine_readable/policies/MAINTENANCE-AXES.a2ml` +* `.machine_readable/policies/MAINTENANCE-CHECKLIST.a2ml` +* `.machine_readable/policies/SOFTWARE-DEVELOPMENT-APPROACH.a2ml` +* `.machine_readable/STATE.a2ml` +* `.machine_readable/META.a2ml` diff --git a/rs/.machine_readable/anchors/0.2-AI-MANIFEST.a2ml b/rs/.machine_readable/anchors/0.2-AI-MANIFEST.a2ml new file mode 100644 index 0000000..45038e1 --- /dev/null +++ b/rs/.machine_readable/anchors/0.2-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "anchors-registry" +level: 2 +parent: "../0.1-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Sub-registry for anchors metadata. diff --git a/rs/.machine_readable/anchors/ANCHOR.a2ml b/rs/.machine_readable/anchors/ANCHOR.a2ml new file mode 100644 index 0000000..8723899 --- /dev/null +++ b/rs/.machine_readable/anchors/ANCHOR.a2ml @@ -0,0 +1,62 @@ +# SPDX-License-Identifier: MPL-2.0 +# Copyright (c) {{CURRENT_YEAR}} {{AUTHOR}} ({{OWNER}}) <{{AUTHOR_EMAIL}}> +# +# ANCHOR.a2ml - authoritative anchor for this repository + +[metadata] +version = "1.0.0" +last-updated = "{{CURRENT_DATE}}" + +[anchor] +schema = "hyperpolymath.anchor/1" +repo = "{{OWNER}}/{{REPO}}" +authority = "upstream-canonical" + +purpose = [ + "Define canonical semantics and policy boundaries for this repository.", + "Declare what downstream/satellite repos can extend but not redefine.", + "Provide a stable golden path and invariant contract for release readiness.", +] + +[identity] +project = "{{PROJECT_NAME}}" +kind = "{{PROJECT_KIND}}" # language | library | service | tool +one-sentence = "{{PROJECT_PURPOSE}}" +domain = "{{PROJECT_DOMAIN}}" + +[semantic-authority] +policy = "canonical" + +owns = [ + "Project semantics and specification", + "Invariant definitions and contractiles", + "Reference implementation behavior", +] + +[implementation-policy] +allowed = ["Rust", "Idris2", "Zig", "Scheme", "Shell", "Just", "AsciiDoc", "Markdown"] +forbidden = ["Node.js", "npm"] + +[golden-path] +smoke-test-command = [ + "just test", + "just quality", +] + +success-criteria = [ + "Core tests pass", + "Quality gates pass", + "No unresolved critical security findings", +] + +[satellite-policy] +must-pin-upstream = true +must-declare-authority = true +must-have-anchor = true +must-have-golden-path = true + +[semantic-authority-files] +language-spec = "SPECIFICATION.md" +formal-proofs = "docs/proofs/PROOFS.adoc" +type-theory = "docs/theory/THEORY.adoc" +algorithms = "docs/theory/ALGORITHMS.adoc" diff --git a/rs/.machine_readable/anchors/README.adoc b/rs/.machine_readable/anchors/README.adoc new file mode 100644 index 0000000..1b27c02 --- /dev/null +++ b/rs/.machine_readable/anchors/README.adoc @@ -0,0 +1 @@ += anchors Registry diff --git a/rs/.machine_readable/compliance/reuse/dep5 b/rs/.machine_readable/compliance/reuse/dep5 new file mode 100644 index 0000000..49aaed6 --- /dev/null +++ b/rs/.machine_readable/compliance/reuse/dep5 @@ -0,0 +1,54 @@ +Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ +Upstream-Name: {{PROJECT_NAME}} +Upstream-Contact: {{AUTHOR}} <{{AUTHOR_EMAIL}}> +Source: https://github.com/{{OWNER}}/{{REPO}} + +# Default: all files are MPL-2.0 +Files: * +Copyright: {{CURRENT_YEAR}} {{AUTHOR}} ({{OWNER}}) <{{AUTHOR_EMAIL}}> +License: MPL-2.0 + +# Configuration files that cannot carry headers +Files: .editorconfig .gitignore .gitattributes .tool-versions .mailmap +Copyright: {{CURRENT_YEAR}} {{AUTHOR}} ({{OWNER}}) <{{AUTHOR_EMAIL}}> +License: MPL-2.0 + +# Machine-readable state files +Files: .machine_readable/*.a2ml +Copyright: {{CURRENT_YEAR}} {{AUTHOR}} ({{OWNER}}) <{{AUTHOR_EMAIL}}> +License: MPL-2.0 + +# Bot directives +Files: .machine_readable/bot_directives/* +Copyright: {{CURRENT_YEAR}} {{AUTHOR}} ({{OWNER}}) <{{AUTHOR_EMAIL}}> +License: MPL-2.0 + +# Contractiles +Files: .machine_readable/contractiles/* +Copyright: {{CURRENT_YEAR}} {{AUTHOR}} ({{OWNER}}) <{{AUTHOR_EMAIL}}> +License: MPL-2.0 + +# GitHub/CI configuration +Files: .github/* .github/**/* +Copyright: {{CURRENT_YEAR}} {{AUTHOR}} ({{OWNER}}) <{{AUTHOR_EMAIL}}> +License: MPL-2.0 + +# Generated files +Files: generated/* +Copyright: {{CURRENT_YEAR}} {{AUTHOR}} ({{OWNER}}) <{{AUTHOR_EMAIL}}> +License: MPL-2.0 + +# Lockfiles and auto-generated +Files: *.lock Cargo.lock flake.lock +Copyright: {{CURRENT_YEAR}} {{AUTHOR}} ({{OWNER}}) <{{AUTHOR_EMAIL}}> +License: MPL-2.0 + +# Devcontainer config (JSON, no comments) +Files: .devcontainer/*.json +Copyright: {{CURRENT_YEAR}} {{AUTHOR}} ({{OWNER}}) <{{AUTHOR_EMAIL}}> +License: MPL-2.0 + +# Git-cliff config +Files: cliff.toml +Copyright: {{CURRENT_YEAR}} {{AUTHOR}} ({{OWNER}}) <{{AUTHOR_EMAIL}}> +License: MPL-2.0 diff --git a/rs/.machine_readable/compliance/rust/deny.toml b/rs/.machine_readable/compliance/rust/deny.toml new file mode 100644 index 0000000..0534a85 --- /dev/null +++ b/rs/.machine_readable/compliance/rust/deny.toml @@ -0,0 +1,65 @@ +# SPDX-License-Identifier: MPL-2.0 +# cargo-deny configuration for RSR-compliant repositories +# Run: cargo deny check +# Docs: https://embarkstudios.github.io/cargo-deny/ + +[graph] +targets = [] +all-features = true + +# --- Advisory database --------------------------------------------------- +[advisories] +db-path = "~/.cargo/advisory-db" +db-urls = ["https://github.com/rustsec/advisory-db"] +# Fail on any known vulnerability +vulnerability = "deny" +unmaintained = "warn" +yanked = "warn" +notice = "warn" + +# --- License policy ------------------------------------------------------- +[licenses] +unlicensed = "deny" +confidence-threshold = 0.8 + +allow = [ + "MPL-2.0", + "MPL-2.0", + "MIT", + "Apache-2.0", + "BSD-2-Clause", + "BSD-3-Clause", + "ISC", + "Zlib", + "Unicode-3.0", + "Unicode-DFS-2016", +] + +deny = [ + "AGPL-3.0-only", + "AGPL-3.0-or-later", +] + +copyleft = "warn" + +[[licenses.exceptions]] +allow = ["OpenSSL"] +name = "ring" + +# --- Crate bans ------------------------------------------------------------ +[bans] +multiple-versions = "warn" +wildcards = "allow" +highlight = "all" + +deny = [ + # Known-bad crates + { name = "openssl", wrappers = ["openssl-sys"] }, +] + +# --- Source restrictions ---------------------------------------------------- +[sources] +unknown-registry = "deny" +unknown-git = "warn" +allow-registry = ["https://github.com/rust-lang/crates.io-index"] +allow-git = [] diff --git a/rs/.machine_readable/configs/0.2-AI-MANIFEST.a2ml b/rs/.machine_readable/configs/0.2-AI-MANIFEST.a2ml new file mode 100644 index 0000000..6e41e6c --- /dev/null +++ b/rs/.machine_readable/configs/0.2-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "configs-registry" +level: 2 +parent: "../0.1-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Sub-registry for configs metadata. diff --git a/rs/.machine_readable/configs/README.adoc b/rs/.machine_readable/configs/README.adoc new file mode 100644 index 0000000..616b9e7 --- /dev/null +++ b/rs/.machine_readable/configs/README.adoc @@ -0,0 +1 @@ += configs Registry diff --git a/rs/.machine_readable/configs/git-cliff/cliff.toml b/rs/.machine_readable/configs/git-cliff/cliff.toml new file mode 100644 index 0000000..5c39b48 --- /dev/null +++ b/rs/.machine_readable/configs/git-cliff/cliff.toml @@ -0,0 +1,119 @@ +# SPDX-License-Identifier: MPL-2.0 +# Copyright (c) {{CURRENT_YEAR}} {{AUTHOR}} ({{OWNER}}) <{{AUTHOR_EMAIL}}> +# +# git-cliff configuration for conventional commit changelog generation. +# https://git-cliff.org/docs/configuration +# +# Placeholders — replace before first use: +# {{OWNER}} — GitHub organization or username +# {{REPO}} — GitHub repository name + +[changelog] +# Changelog header +header = """ +# Changelog\n +All notable changes to this project will be documented in this file.\n +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).\n +\n +""" +# Template for the changelog body +# https://keats.github.io/tera/docs/#introduction +body = """ +{%- macro remote_url() -%} + https://github.com/{{OWNER}}/{{REPO}} +{%- endmacro -%} + +{% if version -%} + ## [{{ version | trim_start_matches(pat="v") }}] - {{ timestamp | date(format="%Y-%m-%d") }} +{% else -%} + ## [Unreleased] +{% endif -%} + +{% for group, commits in commits | group_by(attribute="group") %} + ### {{ group | striptags | trim }} + {% for commit in commits %} + - {% if commit.scope %}**{{ commit.scope }}:** {% endif %}\ + {% if commit.breaking %}[**BREAKING**] {% endif %}\ + {{ commit.message | upper_first }}\ + {%- if commit.links %} \ + ({% for link in commit.links %}[{{ link.text }}]({{ link.href }}){% endfor %}){% endif -%} + {% endfor %} +{% endfor %} + +{%- if github -%} +{% if github.contributors | filter(attribute="is_first_time", value=true) | length != 0 %} + ### New Contributors +{%- for contributor in github.contributors | filter(attribute="is_first_time", value=true) %} + * @{{ contributor.username }} made their first contribution + {%- if contributor.pr_number %} in \ + [#{{ contributor.pr_number }}]({{ self::remote_url() }}/pull/{{ contributor.pr_number }}) + {%- endif %} +{%- endfor %} +{% endif -%} +{% endif -%} + +""" +# Template for the changelog footer +footer = """ +{%- macro remote_url() -%} + https://github.com/{{OWNER}}/{{REPO}} +{%- endmacro -%} + +{% for release in releases -%} + {% if release.version -%} + {% if release.previous.version -%} + [{{ release.version | trim_start_matches(pat="v") }}]: \ + {{ self::remote_url() }}/compare/{{ release.previous.version }}...{{ release.version }} + {% endif -%} + {% else -%} + {% if release.previous.version -%} + [Unreleased]: {{ self::remote_url() }}/compare/{{ release.previous.version }}...HEAD + {% endif -%} + {% endif -%} +{% endfor %} + +""" +# Remove leading and trailing whitespace from templates +trim = true + +[git] +# Parse conventional commits +# https://www.conventionalcommits.org +conventional_commits = true +# Filter out unconventional commits +filter_unconventional = true +# Process each line of a commit as an individual commit +split_commits = false +# Regex for commit preprocessing +commit_preprocessors = [ + # Remove issue numbers from commit messages + { pattern = '\((\w+\s)?#([0-9]+)\)', replace = "" }, +] +# Regex for parsing and grouping commits +commit_parsers = [ + { message = "^feat", group = "Features" }, + { message = "^fix", group = "Bug Fixes" }, + { message = "^security", group = "Security" }, + { message = "^perf", group = "Performance" }, + { message = "^refactor", group = "Refactoring" }, + { message = "^docs", group = "Documentation" }, + { message = "^style", group = "Styling" }, + { message = "^test", group = "Testing" }, + { message = "^ci", group = "CI/CD" }, + { message = "^chore\\(release\\)", skip = true }, + { message = "^chore\\(deps.*\\)", skip = true }, + { message = "^chore\\(pr\\)", skip = true }, + { message = "^chore", group = "Miscellaneous" }, + { body = ".*security", group = "Security" }, +] +# Protect breaking changes from being skipped by a commit parser +protect_breaking_commits = false +# Filter out merge commits +filter_merge_commits = true +# Filter out commits by tag pattern (skip pre-releases) +# tag_pattern = "v[0-9].*" +# Regex for skipping tags +# skip_tags = "beta|alpha" +# Sort commits within each group by oldest first +sort_commits = "oldest" diff --git a/rs/.machine_readable/contractiles/README.adoc b/rs/.machine_readable/contractiles/README.adoc new file mode 100644 index 0000000..d40fcd1 --- /dev/null +++ b/rs/.machine_readable/contractiles/README.adoc @@ -0,0 +1,19 @@ += Contractiles Template Set +:toc: +:sectnums: + +This directory contains the generalized contractiles templates. Copy the `.machine_readable/contractiles/` directory into a new repo to establish a consistent operational, validation, trust, recovery, and intent framework. + +== Fill-In Instructions + +1. Update the Mustfile to reflect your real invariants (paths, schema versions, ports). +2. Replace Trustfile.hs placeholders with your actual key paths and verification commands. +3. Adjust Dustfile handlers to match your rollback and recovery tooling. +4. Update Intentfile to mirror the roadmap you want the system to evolve toward. + +== Contents + +* `must/Mustfile` - required invariants and validations. +* `trust/Trustfile.hs` - cryptographic verification steps. +* `dust/Dustfile` - rollback and recovery semantics. +* `lust/Intentfile` - future intent and roadmap direction. diff --git a/rs/.machine_readable/contractiles/bust/Bustfile.a2ml b/rs/.machine_readable/contractiles/bust/Bustfile.a2ml new file mode 100644 index 0000000..73865e2 --- /dev/null +++ b/rs/.machine_readable/contractiles/bust/Bustfile.a2ml @@ -0,0 +1,28 @@ +// Bustfile.a2ml — meta-repo bust contractile (breakage / rollback) +// SPDX-License-Identifier: MPL-2.0 + +Bust { + name: "a2ml-rs" + version: "1.0.0" + description: "Rollback procedures when something breaks in the meta-repo" + + scenarios: { + "bad-pointer-bump": "git revert in meta-repo; child repo itself untouched" + "submodule-pointer-points-at-missing-sha": "git submodule update --init --checkout resets child to parent-recorded SHA; OR revert the stale bump commit" + "submodule-orphan-after-local-only-commit": "roll back locally with git reset to before the stranded commit; fix remote situation before re-attempting" + "accidental-private-repo-content-leaked-to-public-submodule": "hard-rotate the leaked secret immediately; git-filter-repo or BFG on the submodule's own history; public re-publication only after rotation complete" + } + + escalation-ladder: [ + "1. revert the meta-repo commit (reversible, low blast radius)", + "2. reset the local submodule clone (affects only local workspace)", + "3. force-push to main — PROHIBITED without explicit user confirmation (violates branch protection)", + "4. registry-level (delete/archive the GitHub repo) — human-only action, never by AI" + ] + + backup-points: [ + "GitHub serves as the durable backup for every submodule's own history", + "Meta-repo history on origin/main is the durable backup for pointer state", + "Local backup tags (backup/pre--) retained on risky rewrites" + ] +} diff --git a/rs/.machine_readable/contractiles/bust/bust.ncl b/rs/.machine_readable/contractiles/bust/bust.ncl new file mode 100644 index 0000000..fc8cb8c --- /dev/null +++ b/rs/.machine_readable/contractiles/bust/bust.ncl @@ -0,0 +1,66 @@ +# SPDX-License-Identifier: MPL-2.0 +# Bust — error-handling / failure-recovery runner +# +# Pairs with: Bustfile.a2ml (same directory) +# Verb: bust +# Semantics: every declared failure mode must have a recovery path that has +# been exercised. Runner injects failures (via declared probes) +# and verifies the recovery path works. Hard gate on any +# failure-mode with missing or broken recovery. +# CLI: `contractile bust check` → list failure modes + recovery status +# `contractile bust drill` → inject declared failures, verify recovery +# +# Anything else in this directory is human-only notes/archive; machines ignore. +# +# Base: ../_base.ncl provides pedigree_schema, run_defaults, probe_schema. +# See: docs/CONTRACTILE-SPEC.adoc + +let base = import "../_base.ncl" in + +{ + pedigree = base.pedigree_schema & { + contractile_verb = "bust", + semantics = "error handling + failure recovery", + security = { + leash = 'Kennel, + trust_level = "controlled failure injection; scoped to system-under-test", + allow_network = false, + allow_filesystem_write = true, # drills may write transient state (tmp dirs, test DBs) + allow_subprocess = true, + injection_scope = "system-under-test-only", + }, + metadata = { + name = "bust-runner", + version = "1.0.0", + description = "Exercises declared failure modes and verifies recovery paths. Hard-gates on any failure mode without working recovery.", + paired_xfile = "Bustfile.a2ml", + author = "Jonathan D.A. Jewell ", + }, + }, + + schema = { + failure_modes + | Array { + id | String, + description | String, + class | [| 'network, 'disk_full, 'oom, 'timeout, 'partial_write, 'panic, 'crash, 'rollback, 'concurrency |], + # TODO: migrate to base.probe_schema (structured probe) when CLI supports it + injection_probe | String, # command that deterministically causes this failure + # TODO: migrate to base.probe_schema (structured probe) when CLI supports it + recovery_probe | String, # command that verifies recovery (exit 0 = recovered) + expected_recovery_time_seconds | Number | default = 30, + # status_core values: 'declared, 'verified, 'failing; bust adds 'drilled + status | [| 'declared, 'drilled, 'verified, 'failing |] | default = 'declared, + notes | String | optional, + }, + }, + + # Runner behaviour — inherits from base.run_defaults. + # bust adds record_recovery_times for performance tier feeding. + run = base.run_defaults & { + on_any_fail = "exit-nonzero", # missing or broken recovery blocks merge + report_format = "a2ml", + emit_summary = true, + record_recovery_times = true, # feeds the performance tier + }, +} diff --git a/rs/.machine_readable/contractiles/dust/Dustfile.a2ml b/rs/.machine_readable/contractiles/dust/Dustfile.a2ml new file mode 100644 index 0000000..be38a8c --- /dev/null +++ b/rs/.machine_readable/contractiles/dust/Dustfile.a2ml @@ -0,0 +1,44 @@ +# SPDX-License-Identifier: MPL-2.0 +# Dustfile — Cleanup and hygiene contract +# Author: Jonathan D.A. Jewell + +@abstract: +What should be cleaned up or removed from this repository. +These are housekeeping items, not blockers. +@end + +## Stale Files + +### no-stale-snapshots +- description: No dated status/completion files in root +- run: "! ls *-STATUS-*.md *-COMPLETION-*.md *-COMPLETE.md *-VERIFIED-*.md 2>/dev/null | head -1 | grep -q ." +- severity: info + +### no-ai-djot +- description: AI.djot is superseded by 0-AI-MANIFEST.a2ml +- run: test ! -f AI.djot +- severity: warning + +### no-next-steps +- description: NEXT_STEPS.md superseded by ROADMAP +- run: test ! -f NEXT_STEPS.md +- severity: info + +## Build Artifacts + +### no-tracked-artifacts +- description: No build artifacts tracked in git +- run: "! git ls-files lib/bs/ lib/ocaml/ target/release/ _build/ 2>/dev/null | head -1 | grep -q ." +- severity: warning + +## Format Duplicates + +### no-duplicate-contributing +- description: Only one CONTRIBUTING format (keep .md) +- run: "! (test -f CONTRIBUTING.md && test -f CONTRIBUTING.adoc)" +- severity: warning + +### no-duplicate-readme +- description: Only one README format +- run: "! (test -f README.md && test -f README.adoc && [ $(wc -l < README.md) -gt 5 ])" +- severity: warning diff --git a/rs/.machine_readable/contractiles/must/Mustfile.a2ml b/rs/.machine_readable/contractiles/must/Mustfile.a2ml new file mode 100644 index 0000000..215c510 --- /dev/null +++ b/rs/.machine_readable/contractiles/must/Mustfile.a2ml @@ -0,0 +1,69 @@ +# SPDX-License-Identifier: MPL-2.0 +# Mustfile — Physical state contract +# Author: Jonathan D.A. Jewell + +@abstract: +What MUST be true about this repository's files and configuration. +These are hard requirements — CI fails if any check fails. +@end + +## File Presence + +### license-present +- description: LICENSE file must exist +- run: test -f LICENSE +- severity: critical + +### readme-present +- description: README.adoc or README.md must exist +- run: test -f README.adoc || test -f README.md +- severity: critical + +### security-policy +- description: SECURITY.md must exist +- run: test -f SECURITY.md +- severity: critical + +### ai-manifest +- description: 0-AI-MANIFEST.a2ml must exist +- run: test -f 0-AI-MANIFEST.a2ml +- severity: critical + +### contributing +- description: CONTRIBUTING.md must exist (GitHub community health) +- run: test -f CONTRIBUTING.md +- severity: warning + +### editorconfig +- description: .editorconfig must exist +- run: test -f .editorconfig +- severity: warning + +## SPDX Compliance + +### spdx-headers +- description: All source files must have SPDX-License-Identifier +- run: "! find src/ -name '*.rs' -o -name '*.res' -o -name '*.idr' -o -name '*.zig' 2>/dev/null | head -20 | xargs grep -L 'SPDX-License-Identifier' 2>/dev/null | head -1 | grep -q ." +- severity: warning + +### no-agpl +- description: No AGPL-3.0 references in dotfiles +- run: "! grep -r 'AGPL-3.0' .gitignore .gitattributes .editorconfig 2>/dev/null | head -1 | grep -q ." +- severity: critical + +## Dangerous Patterns + +### no-believe-me +- description: No believe_me in Idris2 code +- run: "! grep -r 'believe_me' --include='*.idr' . 2>/dev/null | grep -v node_modules | head -1 | grep -q ." +- severity: critical + +### no-sorry +- description: No sorry in Lean code +- run: "! grep -r 'sorry' --include='*.lean' . 2>/dev/null | grep -v node_modules | head -1 | grep -q ." +- severity: critical + +### no-admitted +- description: No Admitted in Coq code +- run: "! grep -r 'Admitted' --include='*.v' . 2>/dev/null | grep -v node_modules | head -1 | grep -q ." +- severity: critical diff --git a/rs/.machine_readable/contractiles/trust/Trustfile.a2ml b/rs/.machine_readable/contractiles/trust/Trustfile.a2ml new file mode 100644 index 0000000..f2a4f95 --- /dev/null +++ b/rs/.machine_readable/contractiles/trust/Trustfile.a2ml @@ -0,0 +1,50 @@ +# SPDX-License-Identifier: MPL-2.0 +# Trustfile — Integrity and provenance verification +# Author: Jonathan D.A. Jewell + +@abstract: +Integrity invariants for this repository. These verify that the repo +has not been tampered with, secrets are not leaked, and provenance +is traceable. +@end + +## Secrets + +### no-secrets-committed +- description: No credential files in repo +- run: test ! -f .env && test ! -f credentials.json && test ! -f .env.local && test ! -f .env.production +- severity: critical + +### no-private-keys +- description: No private key files committed +- run: "! find . -name '*.pem' -o -name '*.key' -o -name 'id_rsa' -o -name 'id_ed25519' 2>/dev/null | grep -v node_modules | head -1 | grep -q ." +- severity: critical + +### no-tokens-in-source +- description: No hardcoded API tokens in source +- run: "! grep -rE '(api[_-]?key|secret|token|password)\s*[:=]\s*[\"'\\''][A-Za-z0-9]{16,}' --include='*.js' --include='*.ts' --include='*.res' --include='*.py' . 2>/dev/null | grep -v node_modules | head -1 | grep -q ." +- severity: critical + +## Provenance + +### author-correct +- description: Git author matches expected identity +- run: "git log -1 --format='%ae' | grep -qE '(hyperpolymath|j\\.d\\.a\\.jewell)'" +- severity: warning + +### license-content +- description: LICENSE contains expected identifier +- run: grep -q 'PMPL\|MPL\|MIT\|Apache\|LGPL' LICENSE +- severity: warning + +## Container Security + +### container-images-pinned +- description: Containerfile uses pinned base images +- run: test ! -f Containerfile || grep -q 'cgr.dev\|@sha256:' Containerfile +- severity: warning + +### no-dockerfile +- description: No Dockerfile (use Containerfile) +- run: test ! -f Dockerfile +- severity: warning diff --git a/rs/.machine_readable/integrations/feedback-o-tron.a2ml b/rs/.machine_readable/integrations/feedback-o-tron.a2ml new file mode 100644 index 0000000..5381604 --- /dev/null +++ b/rs/.machine_readable/integrations/feedback-o-tron.a2ml @@ -0,0 +1,13 @@ +# SPDX-License-Identifier: MPL-2.0 +# Feedback-o-Tron Integration — Autonomous Bug Reporting + +[integration] +name = "feedback-o-tron" +type = "bug-reporter" +repository = "https://github.com/hyperpolymath/feedback-o-tron" + +[reporting-config] +platforms = ["github", "gitlab", "bugzilla"] +deduplication = true +audit-logging = true +auto-file-upstream = "on-external-dependency-failure" diff --git a/rs/.machine_readable/integrations/proven.a2ml b/rs/.machine_readable/integrations/proven.a2ml new file mode 100644 index 0000000..9af33ff --- /dev/null +++ b/rs/.machine_readable/integrations/proven.a2ml @@ -0,0 +1,18 @@ +# SPDX-License-Identifier: MPL-2.0 +# Proven Integration — Formally Verified Safety Library + +[integration] +name = "proven" +type = "safety-library" +repository = "https://github.com/hyperpolymath/proven" +version = "1.2.0" + +[binding-policy] +approach = "thin-ffi-wrapper" +unsafe-patterns = "replace-with-proven-equivalent" +modules-available = ["SafeMath", "SafeString", "SafeJSON", "SafeURL", "SafeRegex", "SafeSQL", "SafeFile", "SafeTemplate", "SafeCrypto"] + +[adoption-guidance] +priority = "high" +scope = "all-string-json-url-crypto-operations" +migration = "incremental — replace unsafe patterns as encountered" diff --git a/rs/.machine_readable/integrations/verisimdb.a2ml b/rs/.machine_readable/integrations/verisimdb.a2ml new file mode 100644 index 0000000..164c522 --- /dev/null +++ b/rs/.machine_readable/integrations/verisimdb.a2ml @@ -0,0 +1,15 @@ +# SPDX-License-Identifier: MPL-2.0 +# VeriSimDB Feed — Cross-Repo Analytics Data Store + +[integration] +name = "verisimdb" +type = "data-feed" +repository = "https://github.com/hyperpolymath/nextgen-databases" +data-store = "verisimdb-data" + +[feed-config] +emit-scan-results = true +emit-build-metrics = true +emit-dependency-graph = true +format = "hexad" +destination = "verisimdb-data/feeds/" diff --git a/rs/.machine_readable/integrations/vexometer.a2ml b/rs/.machine_readable/integrations/vexometer.a2ml new file mode 100644 index 0000000..238b3d2 --- /dev/null +++ b/rs/.machine_readable/integrations/vexometer.a2ml @@ -0,0 +1,18 @@ +# SPDX-License-Identifier: MPL-2.0 +# Vexometer Integration — Irritation Surface Analysis + +[integration] +name = "vexometer" +type = "friction-measurement" +repository = "https://github.com/hyperpolymath/vexometer" + +[measurement-config] +dimensions = 10 +emit-isa-reports = true +lazy-eliminator = true +satellite-interventions = true + +[hooks] +cli-tools = "measure-on-error" +ui-panels = "measure-on-interaction" +build-failures = "measure-on-failure" diff --git a/rs/.machine_readable/policies/.maintenance-perms-ignore b/rs/.machine_readable/policies/.maintenance-perms-ignore new file mode 100644 index 0000000..2c8c409 --- /dev/null +++ b/rs/.machine_readable/policies/.maintenance-perms-ignore @@ -0,0 +1,5 @@ +# Regex patterns for justified permission-policy exceptions. +# One pattern per line. +# Example: +# ^vendor/ +# ^third_party/ diff --git a/rs/.machine_readable/policies/0.2-AI-MANIFEST.a2ml b/rs/.machine_readable/policies/0.2-AI-MANIFEST.a2ml new file mode 100644 index 0000000..01a1914 --- /dev/null +++ b/rs/.machine_readable/policies/0.2-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "policies-registry" +level: 2 +parent: "../0.1-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Sub-registry for policies metadata. diff --git a/rs/.machine_readable/policies/MAINTENANCE-AXES.a2ml b/rs/.machine_readable/policies/MAINTENANCE-AXES.a2ml new file mode 100644 index 0000000..eeffd27 --- /dev/null +++ b/rs/.machine_readable/policies/MAINTENANCE-AXES.a2ml @@ -0,0 +1,54 @@ +# SPDX-License-Identifier: MPL-2.0 +# Copyright (c) {{CURRENT_YEAR}} {{AUTHOR}} ({{OWNER}}) <{{AUTHOR_EMAIL}}> +# +# Canonical maintenance governance model + +[metadata] +version = "1.0.0" +last-updated = "{{CURRENT_DATE}}" +scope = "repo" + +[discovery] +human-entrypoints = [ + "README.adoc", + "docs/maintenance/MAINTENANCE-CHECKLIST.md", + "docs/practice/SOFTWARE-DEVELOPMENT-APPROACH.adoc", +] +machine-entrypoints = [ + ".machine_readable/policies/MAINTENANCE-AXES.a2ml", + ".machine_readable/policies/MAINTENANCE-CHECKLIST.a2ml", + ".machine_readable/policies/SOFTWARE-DEVELOPMENT-APPROACH.a2ml", + ".machine_readable/META.a2ml", + ".machine_readable/ai/README.adoc", + ".machine_readable/bot_directives/README.scm", +] +bots = ["hypatia", "gitbot-fleet", "repo visitors"] + +[axes] +axis-1 = "must > intend > like" +axis-2 = "corrective > adaptive > perfective" +axis-3 = "systems > compliance > effects" +execution-order = "axis-1 > axis-2 > axis-3" + +[axis-1-scoping] +required = true +sources = "README, roadmap, status docs, maintenance checklist, CI/security docs" +markers = "TODO/FIXME/XXX/HACK/STUB/PARTIAL" +idris-unsound-markers = "believe_me/assert_total" +output = "scoped work assembly in must/intend/like buckets" + +[axis-2-maintenance] +corrective-first = true +adaptive-second = true +adaptive-focus = "scope changes, stale references, obsolete work culling" +perfective-third = true +perfective-source = "honest state from axis-1 after corrective/adaptive updates" + +[axis-3-audit] +systems-check = true +compliance-check = true +effects-check = true +compliance-focus = "seams/compromises/exception register and anti-drift" +compliance-tooling = "panic-attack" +effects-tooling = "ecological checking with sustainabot guidance" +effects-evidence = "benchmark evidence and maintainer dialogue/status review" diff --git a/rs/.machine_readable/policies/MAINTENANCE-CHECKLIST.a2ml b/rs/.machine_readable/policies/MAINTENANCE-CHECKLIST.a2ml new file mode 100644 index 0000000..eaee720 --- /dev/null +++ b/rs/.machine_readable/policies/MAINTENANCE-CHECKLIST.a2ml @@ -0,0 +1,159 @@ +# SPDX-License-Identifier: MPL-2.0 +# Cross-repo maintenance baseline (machine-readable canonical) + +[metadata] +version = "1.1.0" +last-updated = "2026-02-24" +scope = "cross-repo" +source-human = "docs/maintenance/MAINTENANCE-CHECKLIST.adoc" +companion-human = "docs/practice/SOFTWARE-DEVELOPMENT-APPROACH.adoc" +companion-machine = ".machine_readable/policies/SOFTWARE-DEVELOPMENT-APPROACH.a2ml" + +[policy] +single-source = true +notes = "Use this file as canonical machine policy and keep markdown synchronized." + +[maintenance-axes] +scoping-first = true +execution-order = ["scoping", "axis-1", "axis-2", "axis-3"] +axis-1 = "must > intend > like" +axis-2 = "corrective > adaptive > perfective" +axis-3 = "systems > compliance > effects" + +[scoping] +inputs_required = [ + "README", + "roadmap", + "status-docs", + "maintenance-checklist", + "ci-and-security-docs", +] + +marker_scan_required = [ + "TODO", + "FIXME", + "XXX", + "HACK", + "STUB", + "PARTIAL", +] + +idris_unsound_scan_required = [ + "believe_me", + "assert_total", +] + +scope_assembly_buckets = ["must", "intend", "like"] + +[axis-2-maintenance-rules] +corrective-first = true +adaptive-second = true +adaptive_examples = [ + "scope-change reconciliation", + "stale-reference removal", + "obsolete-work culling", +] +perfective-third = true +perfective_source = "axis-1 honest state after corrective/adaptive updates" + +[axis-3-audit-rules] +systems-check = true +documentation-honesty-check = true +safety-security-accounted-check = true +effects-review-check = true +benchmark-evidence-required = true +maintainer-dialogue-review-required = true +compliance-seams-check = true +exception-register-required = true +exception-bounded-scope-required = true +policy-drift-contamination-check = true +example-drift-risk = "single TypeScript exception causing broad ReScript->TypeScript migration" +compliance-tooling = "panic-attack" +effects-tooling = "ecological checking with sustainabot guidance" + +[generic-cleanup-finish-off] +root-cleanup-required = true +stale-work-cull-required = true +docs-parity-required = true +machine-human-sync-required = true +compliance-finish-off-required = true +effects-finish-off-required = true +release-prep-summary-required = true +next-actions-required = ["corrective", "adaptive", "perfective"] + +[must] +root_control_files = [ + ".gitignore", + ".gitattributes", + ".editorconfig", + ".tool-versions", + "Containerfile", + "Justfile", +] + +root_hosting_files = [ + "CNAME", + ".nojekyll", +] + +ownership_files = [ + "MAINTAINER", + ".github/CODEOWNERS", +] + +machine_readable_required = [ + ".machine_readable/anchors/ANCHOR.a2ml", + ".machine_readable/contractiles/", + ".machine_readable/ai/", + ".machine_readable/bot_directives/", +] + +contractiles_required = [ + "Mustfile", + "Trustfile", + "Intentfile", +] + +security_required = [ + ".well-known/security.txt", + "ci-security-scan", +] + +quality_gate_required = [ + "format", + "lint", + "unit-tests", + "integration-tests", + "p2p-tests", + "e2e-tests", + "bench-smoke", + "docs-check", + "security-scan", +] + +abi_ffi_policy = [ + "ABI Idris2 in src/interface/abi/*.idr", + "FFI Zig in ffi/**/*.zig", +] + +[should] +docs_primary_format = "adoc" +docs_structure = [ + "docs/theory", + "docs/practice", + "docs/whitepapers/academic", + "docs/whitepapers/industry", + "docs/proofs", + "docs/reports", +] + +root_minimization = true +well_known_metadata = true +roadmap_honesty_with_dates = true +ci_doc_format_policy = true + +[could] +generate_human_from_machine = true +mode_aware_bots = ["corrective", "adaptive", "perfective", "audit"] +topology_dashboard = true +exception_registry = true diff --git a/rs/.machine_readable/policies/README.adoc b/rs/.machine_readable/policies/README.adoc new file mode 100644 index 0000000..b7e25f5 --- /dev/null +++ b/rs/.machine_readable/policies/README.adoc @@ -0,0 +1 @@ += policies Registry diff --git a/rs/.machine_readable/policies/SOFTWARE-DEVELOPMENT-APPROACH.a2ml b/rs/.machine_readable/policies/SOFTWARE-DEVELOPMENT-APPROACH.a2ml new file mode 100644 index 0000000..093573a --- /dev/null +++ b/rs/.machine_readable/policies/SOFTWARE-DEVELOPMENT-APPROACH.a2ml @@ -0,0 +1,53 @@ +# SPDX-License-Identifier: MPL-2.0 +# General software development approach (machine-readable) + +[metadata] +version = "1.0.0" +last-updated = "2026-02-24" +scope = "cross-repo" +source-human = "docs/practice/SOFTWARE-DEVELOPMENT-APPROACH.adoc" + +[execution] +order = ["axis-1", "axis-2", "axis-3"] + +[axis-1] +name = "scope" +priority = "must > intend > like" +inputs = [ + "README", + "roadmap", + "status-docs", + "ci-and-security-docs", +] +marker-scan = ["TODO", "FIXME", "XXX", "HACK", "STUB", "PARTIAL"] +idris-unsound-scan = ["believe_me", "assert_total"] +output = "scoped-work-assembly" + +[axis-2] +name = "maintenance" +priority = "corrective > adaptive > perfective" +corrective = "defect/regression/safety/security fixes" +adaptive = "scope reconciliation, stale-reference removal, obsolete-work culling" +perfective = "quality improvements derived from axis-1 honest state" + +[axis-3] +name = "audit" +priority = "systems > compliance > effects" +systems = "required systems present and operating" +compliance = "exceptions explicit, bounded, and drift-resistant" +effects = "benchmark/operational impact evidence captured and reviewed" +compliance-tooling = "panic-attack" +effects-tooling = "ecological checking with sustainabot guidance" + +[cleanup-finish-off] +root-cleanup = true +stale-work-cull = true +docs-sync-human-machine = true +compliance-audit = true +effects-audit = true +release-summary = ["must", "should", "could"] +next-actions = ["corrective", "adaptive", "perfective"] + +[collaboration] +maintainer-dialogue-required = true +dialogue-topics = ["what changed", "why", "remaining risks"] diff --git a/rs/.machine_readable/scripts/0.2-AI-MANIFEST.a2ml b/rs/.machine_readable/scripts/0.2-AI-MANIFEST.a2ml new file mode 100644 index 0000000..615df84 --- /dev/null +++ b/rs/.machine_readable/scripts/0.2-AI-MANIFEST.a2ml @@ -0,0 +1,18 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "automation-scripts-unit" +level: 2 +parent: "../0.1-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Internal automation logic for the project lifecycle, forge sync, + verification triggers, and maintenance. + +canonical_locations: + maintenance: "maintenance/" + lifecycle: "lifecycle/" + forge: "forge/" + verification: "verification/" diff --git a/rs/.machine_readable/scripts/forge/0.3-AI-MANIFEST.a2ml b/rs/.machine_readable/scripts/forge/0.3-AI-MANIFEST.a2ml new file mode 100644 index 0000000..4bbd6cf --- /dev/null +++ b/rs/.machine_readable/scripts/forge/0.3-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "automation-unit-forge" +level: 3 +parent: "../0.2-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Internal automation logic for project forge. diff --git a/rs/.machine_readable/scripts/forge/README.adoc b/rs/.machine_readable/scripts/forge/README.adoc new file mode 100644 index 0000000..31adef6 --- /dev/null +++ b/rs/.machine_readable/scripts/forge/README.adoc @@ -0,0 +1 @@ += Forge Scripts diff --git a/rs/.machine_readable/scripts/forge/forge-sync.sh b/rs/.machine_readable/scripts/forge/forge-sync.sh new file mode 100755 index 0000000..330e54b --- /dev/null +++ b/rs/.machine_readable/scripts/forge/forge-sync.sh @@ -0,0 +1,25 @@ +#!/usr/bin/env bash +# SPDX-License-Identifier: MPL-2.0 +# +# forge-sync.sh — Multi-forge mirroring script +# +# Synchronises the local repository with GitHub, GitLab, and Codeberg. +# Usage: ./forge-sync.sh + +set -euo pipefail + +REMOTES=("origin" "gitlab" "codeberg") + +echo "=== RSR Forge Synchronisation ===" + +for remote in "${REMOTES[@]}"; do + if git remote | grep -q "^$remote$"; then + echo "Pushing to $remote..." + git push "$remote" --all + git push "$remote" --tags + else + echo "Skip: Remote '$remote' not configured." + fi +done + +echo "Sync complete." diff --git a/rs/.machine_readable/scripts/forge/git-cleanup.sh b/rs/.machine_readable/scripts/forge/git-cleanup.sh new file mode 100755 index 0000000..4fec1a2 --- /dev/null +++ b/rs/.machine_readable/scripts/forge/git-cleanup.sh @@ -0,0 +1,8 @@ +#!/usr/bin/env bash +# git-cleanup.sh — Repository hygiene script +set -euo pipefail +echo "Cleaning up merged branches..." +git fetch -p +git branch --merged | grep -v "\*" | grep -v "main" | xargs -n 1 git branch -d || echo "No branches to clean." +echo "Pruning remote tracking branches..." +git remote prune origin diff --git a/rs/.machine_readable/scripts/lifecycle/0.3-AI-MANIFEST.a2ml b/rs/.machine_readable/scripts/lifecycle/0.3-AI-MANIFEST.a2ml new file mode 100644 index 0000000..3182d17 --- /dev/null +++ b/rs/.machine_readable/scripts/lifecycle/0.3-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "automation-unit-lifecycle" +level: 3 +parent: "../0.2-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Internal automation logic for project lifecycle. diff --git a/rs/.machine_readable/scripts/lifecycle/README.adoc b/rs/.machine_readable/scripts/lifecycle/README.adoc new file mode 100644 index 0000000..8d262b1 --- /dev/null +++ b/rs/.machine_readable/scripts/lifecycle/README.adoc @@ -0,0 +1 @@ += Lifecycle Scripts diff --git a/rs/.machine_readable/scripts/lifecycle/install-tools.sh b/rs/.machine_readable/scripts/lifecycle/install-tools.sh new file mode 100755 index 0000000..408df64 --- /dev/null +++ b/rs/.machine_readable/scripts/lifecycle/install-tools.sh @@ -0,0 +1,27 @@ +#!/usr/bin/env bash +# SPDX-License-Identifier: MPL-2.0 +# +# install-tools.sh — Developer toolchain installer +# +# Detects and installs the required project toolchain (asdf, nix, or guix). + +set -euo pipefail + +echo "=== RSR Toolchain Installer ===" + +if [ -f "flake.nix" ] && command -v nix &>/dev/null; then + echo "Nix detected. Setting up development shell..." + nix develop --command echo "Nix shell verified." +elif [ -f ".tool-versions" ] && command -v asdf &>/dev/null; then + echo "asdf detected. Installing plugins and tools..." + while read -r line; do + plugin=$(echo "$line" | awk '{print $1}') + asdf plugin add "$plugin" || true + done < .tool-versions + asdf install +else + echo "No standard toolchain (Nix/asdf) detected or installed." + echo "Please refer to README.adoc for manual setup instructions." +fi + +echo "Installer complete." diff --git a/rs/.machine_readable/scripts/maintenance/maint-assault.sh b/rs/.machine_readable/scripts/maintenance/maint-assault.sh new file mode 100644 index 0000000..f170cab --- /dev/null +++ b/rs/.machine_readable/scripts/maintenance/maint-assault.sh @@ -0,0 +1,44 @@ +#!/usr/bin/env bash +# SPDX-License-Identifier: MPL-2.0 +# +# maint-assault.sh — High-rigor stress testing using panic-attacker +# +# This script runs a full assault (static + dynamic) on the project binary +# to detect logic-based bug signatures and environmental vulnerabilities. + +set -euo pipefail + +BINARY_NAME="{{project}}" +REPORT_PATH="docs/reports/security/assault-latest.json" +PA_BIN="${PANIC_ATTACK_BIN:-panic-attack}" + +echo "=== High-Rigor Security Assault ===" + +# 1. Verify environment +if ! command -v "$PA_BIN" &>/dev/null; then + echo "Error: panic-attack tool not found." + echo "Please install it or set PANIC_ATTACK_BIN environment variable." + exit 1 +fi + +if [ ! -f "target/release/$BINARY_NAME" ]; then + echo "Warning: Release binary not found at target/release/$BINARY_NAME" + echo "Running build first..." + just build --release +fi + +# 2. Run Assault +echo "Initiating full assault on $BINARY_NAME..." +mkdir -p "$(dirname "$REPORT_PATH")" + +"$PA_BIN" assault "target/release/$BINARY_NAME" + --source . + --intensity medium + --duration 10 + --output "$REPORT_PATH" + +echo "" +echo "=== Assault Complete ===" +echo "Report generated: $REPORT_PATH" +echo "To review interactively, run:" +echo " $PA_BIN tui $REPORT_PATH" diff --git a/rs/.machine_readable/scripts/verification/0.3-AI-MANIFEST.a2ml b/rs/.machine_readable/scripts/verification/0.3-AI-MANIFEST.a2ml new file mode 100644 index 0000000..460e069 --- /dev/null +++ b/rs/.machine_readable/scripts/verification/0.3-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "automation-unit-verification" +level: 3 +parent: "../0.2-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Internal automation logic for project verification. diff --git a/rs/.machine_readable/scripts/verification/README.adoc b/rs/.machine_readable/scripts/verification/README.adoc new file mode 100644 index 0000000..277b4aa --- /dev/null +++ b/rs/.machine_readable/scripts/verification/README.adoc @@ -0,0 +1 @@ += Verification Scripts diff --git a/rs/.machine_readable/svc/k9/README.adoc b/rs/.machine_readable/svc/k9/README.adoc new file mode 100644 index 0000000..f54b220 --- /dev/null +++ b/rs/.machine_readable/svc/k9/README.adoc @@ -0,0 +1,177 @@ +// SPDX-License-Identifier: CC-BY-SA-4.0 += K9 Contractiles +:toc: left +:icons: font + +== What Are K9 Contractiles? + +K9 contractiles are self-validating components that combine configuration, validation, and deployment logic in a single file format. They implement the RSR principle of "self-describing artifacts" by embedding contracts and orchestration directly in the component. + +== The Three Security Levels + +K9 components declare their trust requirements using "The Leash" security model: + +[horizontal] +`'Kennel`:: Pure data, no execution (safest) +`'Yard`:: Nickel evaluation with contracts (medium trust) +`'Hunt`:: Full execution with Just recipes (requires signature) + +== Example Components + +This directory contains example K9 contractiles for common repository tasks: + +=== Kennel Level (Pure Data) + +**File:** `examples/project-metadata.k9.ncl` + +Pure configuration data with no execution. Safe to include in any repository. + +**Use cases:** +- Project metadata (name, version, description) +- Build configuration +- Tool settings +- Data schemas + +**Security:** No signature required, data-only. + +=== Yard Level (Validated Config) + +**File:** `examples/ci-config.k9.ncl` + +Configuration with Nickel contracts for runtime validation. Evaluated safely without I/O. + +**Use cases:** +- CI/CD configuration with validation +- Deployment parameters +- Database schemas with constraints +- API specifications + +**Security:** Signature recommended, Nickel evaluation only. + +=== Hunt Level (Full Execution) + +**File:** `examples/setup-repo.k9.ncl` + +Full execution with Just recipes. Can run shell commands and modify filesystem. + +**Use cases:** +- Repository setup scripts +- Deployment automation +- System configuration +- Package installation + +**Security:** **Signature required**, full system access. + +== Usage in Your Repository + +=== 1. Create K9 Components + +Choose the appropriate security level for your use case: + +[source,bash] +---- +# Kennel: Pure configuration +cp .machine_readable/contractiles/k9/examples/project-metadata.k9.ncl config/metadata.k9.ncl + +# Yard: Validated configuration +cp .machine_readable/contractiles/k9/examples/ci-config.k9.ncl .github/ci.k9.ncl + +# Hunt: Full automation +cp .machine_readable/contractiles/k9/examples/setup-repo.k9.ncl scripts/setup.k9.ncl +---- + +=== 2. Validate Components + +[source,bash] +---- +# Validate Nickel syntax and contracts +nickel typecheck config/metadata.k9.ncl + +# Verify Hunt-level signature (if signed) +./must verify scripts/setup.k9.ncl +---- + +=== 3. Execute Components + +[source,bash] +---- +# Kennel: Export as JSON +nickel export config/metadata.k9.ncl > metadata.json + +# Yard: Evaluate with validation +nickel eval .github/ci.k9.ncl + +# Hunt: Run with Just (dry-run first!) +./must --dry-run run scripts/setup.k9.ncl +./must run scripts/setup.k9.ncl +---- + +== Integration with RSR + +K9 contractiles integrate with other RSR standards: + +**STATE.a2ml**:: K9 components can generate or validate STATE.a2ml +**ECOSYSTEM.a2ml**:: K9 can automate cross-repo operations +**META.a2ml**:: K9 can enforce architectural decisions + +== Security Best Practices + +=== For Kennel/Yard Components + +✅ **Safe to use without signatures** + +✅ **Review Nickel code before use** + +✅ **Validate contracts match expectations** + +=== For Hunt Components + +⚠️ **ALWAYS verify signatures** + +⚠️ **Review Just recipes carefully** + +⚠️ **Run dry-run mode first** + +⚠️ **Never run as root unless required** + +⚠️ **Sandbox external components** + +**See:** https://github.com/{{OWNER}}/k9-svc/blob/main/docs/SECURITY-BEST-PRACTICES.adoc + +== Template Files + +Use these as starting points for your own K9 components: + +- `template-kennel.k9.ncl` - Pure data template +- `template-yard.k9.ncl` - Validated config template +- `template-hunt.k9.ncl` - Full execution template + +== Dependencies + +To use K9 contractiles in your repository: + +[source,bash] +---- +# Install Nickel (configuration language) +curl -L https://github.com/tweag/nickel/releases/latest/download/nickel-linux-x86_64 -o nickel +chmod +x nickel && sudo mv nickel /usr/local/bin/ + +# Install Just (task runner, for Hunt level) +cargo install just + +# Clone K9-SVC (for must shim and tooling) +git clone https://github.com/{{OWNER}}/k9-svc.git +---- + +== Learn More + +- **K9-SVC Specification:** https://github.com/{{OWNER}}/k9-svc/blob/main/SPEC.adoc +- **K9 User Guide:** https://github.com/{{OWNER}}/k9-svc/blob/main/GUIDE.adoc +- **Security Documentation:** https://github.com/{{OWNER}}/k9-svc/blob/main/docs/SECURITY-FAQ.adoc +- **IANA Media Type:** `application/vnd.k9+nickel` + +== Contributing + +When adding K9 contractiles to your repository: + +1. Use appropriate security level (Kennel > Yard > Hunt) +2. Document what each component does +3. Include validation contracts in Yard/Hunt components +4. Sign Hunt-level components before committing +5. Add K9 validation to CI/CD pipeline + +**Questions?** Open an issue on https://github.com/{{OWNER}}/k9-svc diff --git a/rs/.machine_readable/svc/k9/examples/ci-config.k9.ncl b/rs/.machine_readable/svc/k9/examples/ci-config.k9.ncl new file mode 100644 index 0000000..1f38e2d --- /dev/null +++ b/rs/.machine_readable/svc/k9/examples/ci-config.k9.ncl @@ -0,0 +1,126 @@ +K9! +# SPDX-License-Identifier: MPL-2.0 +# Example Yard-level K9 component: CI/CD configuration with validation +# Security Level: Yard (Nickel evaluation, contract validation) +# Signature recommended but not required + +{ + pedigree = { + schema_version = "1.0.0", + component_type = "ci-configuration", + security = { + leash = 'Yard, + trust_level = "validated-config", + allow_network = false, + allow_filesystem_write = false, + allow_subprocess = false, + }, + metadata = { + name = "ci-config", + version = "1.0.0", + description = "CI/CD configuration with runtime validation", + author = "{{AUTHOR}} <{{AUTHOR_EMAIL}}>", + }, + }, + + # CI/CD configuration with Nickel contracts + ci = { + # Platform must be a known CI provider + platform + | [| 'GitHubActions, 'GitLabCI, 'CircleCI, 'TravisCI |] + = 'GitHubActions, + + # Build matrix with validation + matrix = { + # Operating systems to test on + os + | Array String + | std.array.NonEmpty + = ["ubuntu-latest", "macos-latest"], + + # Language versions to test + versions + | Array String + | std.array.NonEmpty + = ["stable", "beta"], + }, + + # Workflow steps with validation + steps = [ + { + name = "Checkout", + action = "actions/checkout@v4", + # Version must be SHA-pinned for security + sha | String | std.string.NonEmpty = "b4ffde65f46336ab88eb53be808477a3936bae11", + }, + { + name = "Build", + run = "just build", + }, + { + name = "Test", + run = "just test", + }, + { + name = "Lint", + run = "just lint", + }, + ], + + # Deployment configuration + deploy = { + enabled | Bool = false, + + # Only deploy from main branch + branch + | String + | std.contract.from_predicate (fun b => b == "main" || b == "master") + = "main", + + # Deployment requires manual approval + requires_approval | Bool = true, + }, + + # Security scanning + security = { + enabled | Bool = true, + + scanners = [ + { + name = "CodeQL", + languages = ["rust", "javascript"], + }, + { + name = "OSSF Scorecard", + enabled = true, + }, + { + name = "TruffleHog", + scan_for = "secrets", + }, + ], + }, + + # Notification settings + notifications = { + on_success = "never", + on_failure = "always", + channels = ["email"], + }, + }, + + # Validation rules (enforced by Nickel) + validation = { + # At least one OS must be specified + check_os = std.array.length ci.matrix.os > 0, + + # At least one version must be tested + check_versions = std.array.length ci.matrix.versions > 0, + + # Must have at least build and test steps + check_steps = std.array.length ci.steps >= 2, + + # Security scanning must be enabled + check_security = ci.security.enabled == true, + }, +} diff --git a/rs/.machine_readable/svc/k9/examples/project-metadata.k9.ncl b/rs/.machine_readable/svc/k9/examples/project-metadata.k9.ncl new file mode 100644 index 0000000..c8e6ebf --- /dev/null +++ b/rs/.machine_readable/svc/k9/examples/project-metadata.k9.ncl @@ -0,0 +1,57 @@ +K9! +# SPDX-License-Identifier: MPL-2.0 +# Example Kennel-level K9 component: Project metadata +# Security Level: Kennel (pure data, no execution) +# No signature required + +{ + pedigree = { + schema_version = "1.0.0", + component_type = "project-metadata", + security = { + leash = 'Kennel, + trust_level = "data-only", + allow_network = false, + allow_filesystem_write = false, + allow_subprocess = false, + }, + metadata = { + name = "project-metadata", + version = "1.0.0", + description = "Pure data configuration for project metadata", + author = "{{AUTHOR}} <{{AUTHOR_EMAIL}}>", + }, + }, + + # Project configuration + project = { + name = "my-project", + version = "0.1.0", + description = "A project following Rhodium Standard Repositories", + + repository = { + url = "https://github.com/{{OWNER}}/my-project", + type = "git", + }, + + author = { + name = "{{AUTHOR}}", + email = "{{AUTHOR_EMAIL}}", + organization = "{{AUTHOR_ORG}}", + }, + + license = "MPL-2.0", + + keywords = [ + "rhodium-standard", + "rsr", + "{{OWNER}}", + ], + }, + + # Export as JSON for other tools + export = { + format = "json", + destination = "project-metadata.json", + }, +} diff --git a/rs/.machine_readable/svc/k9/examples/setup-repo.k9.ncl b/rs/.machine_readable/svc/k9/examples/setup-repo.k9.ncl new file mode 100644 index 0000000..df79a55 --- /dev/null +++ b/rs/.machine_readable/svc/k9/examples/setup-repo.k9.ncl @@ -0,0 +1,167 @@ +K9! +# SPDX-License-Identifier: MPL-2.0 +# Example Hunt-level K9 component: Repository setup automation +# Security Level: Hunt (full execution with Just recipes) +# ⚠️ SIGNATURE REQUIRED - DO NOT RUN WITHOUT VERIFICATION + +{ + pedigree = { + schema_version = "1.0.0", + component_type = "repository-setup", + security = { + leash = 'Hunt, + trust_level = "full-system-access", + allow_network = true, + allow_filesystem_write = true, + allow_subprocess = true, + signature_required = true, + }, + metadata = { + name = "setup-repo", + version = "1.0.0", + description = "Automated repository setup with RSR standards", + author = "{{AUTHOR}} <{{AUTHOR_EMAIL}}>", + }, + warnings = [ + "This component has full system access", + "Only run from trusted sources with verified signatures", + "Review Just recipes before execution", + "Use dry-run mode first: ./must --dry-run run setup-repo.k9.ncl", + ], + }, + + # Configuration with contracts + config = { + repo_name + | String + | std.string.NonEmpty + = "my-new-repo", + + repo_type + | [| 'Library, 'Application, 'Tool, 'Specification |] + = 'Application, + + primary_language + | String + | std.string.NonEmpty + = "rust", + + # RSR compliance features to enable + features = { + checkpoint_files | Bool = true, # STATE.a2ml, ECOSYSTEM.a2ml, META.a2ml + security_workflows | Bool = true, # CodeQL, Scorecard, etc. + quality_checks | Bool = true, # Linting, formatting + mirroring | Bool = false, # GitLab/Bitbucket mirrors + }, + + # Git configuration + git = { + default_branch = "main", + initial_commit | Bool = true, + remote_url | String = "", + }, + }, + + # Just recipes for execution + # These run when: ./must run setup-repo.k9.ncl + recipes = { + # Main entry point + default = { + recipe = "setup", + description = "Set up RSR-compliant repository", + }, + + # Individual setup tasks + setup = { + dependencies = ["check-env", "create-structure", "init-git", "setup-workflows"], + commands = [ + "echo '✅ Repository setup complete!'", + "echo 'Run: git status to see changes'", + ], + }, + + "check-env" = { + description = "Verify required tools are installed", + commands = [ + "command -v git || (echo 'ERROR: git not found' && exit 1)", + "command -v just || (echo 'ERROR: just not found' && exit 1)", + "command -v nickel || (echo 'ERROR: nickel not found' && exit 1)", + "echo '✓ All required tools present'", + ], + }, + + "create-structure" = { + description = "Create RSR directory structure", + commands = [ + "mkdir -p src/ docs/ tests/ scripts/", + "mkdir -p .github/workflows/", + "mkdir -p .machine_readable/contractiles/k9/", + "echo '✓ Directory structure created'", + ], + }, + + "init-git" = { + description = "Initialize Git repository", + commands = [ + "git init -b %{config.git.default_branch}", + "git config user.name '{{AUTHOR}}'", + "git config user.email '{{AUTHOR_EMAIL}}'", + "echo '✓ Git initialized'", + ], + }, + + "setup-workflows" = { + description = "Add RSR-compliant workflows", + commands = [ + # This would copy workflow templates + # In a real implementation, would fetch from rsr-template-repo + "echo '✓ Workflows configured'", + ], + }, + + "create-checkpoint-files" = { + description = "Create STATE.a2ml, ECOSYSTEM.a2ml, META.a2ml", + commands = [ + "echo '(state (version \"1.0.0\") (project \"%{config.repo_name}\"))' > STATE.a2ml", + "echo '(ecosystem (version \"1.0.0\") (name \"%{config.repo_name}\"))' > ECOSYSTEM.a2ml", + "echo '(meta (version \"1.0.0\") (project \"%{config.repo_name}\"))' > META.a2ml", + "echo '✓ Checkpoint files created'", + ], + }, + + "add-license" = { + description = "Add PMPL-1.0 license", + commands = [ + "curl -sL https://raw.githubusercontent.com/{{OWNER}}/pmpl/main/LICENSE -o LICENSE", + "echo '✓ License added'", + ], + }, + + "add-readme" = { + description = "Create README.adoc from template", + commands = [ + "echo '= %{config.repo_name}' > README.adoc", + "echo '' >> README.adoc", + "echo 'Part of the Hyperpolymath ecosystem.' >> README.adoc", + "echo '✓ README created'", + ], + }, + + clean = { + description = "Remove generated files (careful!)", + commands = [ + "echo '⚠️ This will delete all generated files'", + "echo 'Press Ctrl+C to cancel, or wait 5 seconds...'", + "sleep 5", + "rm -f STATE.a2ml ECOSYSTEM.a2ml META.a2ml", + "echo '✓ Cleaned'", + ], + }, + }, + + # Validation (Yard-level checks before Hunt execution) + validation = { + check_repo_name = std.string.length config.repo_name > 0, + check_language = std.string.length config.primary_language > 0, + }, +} diff --git a/rs/.machine_readable/svc/k9/template-hunt.k9.ncl b/rs/.machine_readable/svc/k9/template-hunt.k9.ncl new file mode 100644 index 0000000..a9cc350 --- /dev/null +++ b/rs/.machine_readable/svc/k9/template-hunt.k9.ncl @@ -0,0 +1,136 @@ +K9! +# SPDX-License-Identifier: MPL-2.0 +# K9 Hunt-level template: Full execution with Just recipes +# Security Level: Hunt (full system access) +# ⚠️ SIGNATURE REQUIRED - Review carefully before use + +{ + pedigree = { + schema_version = "1.0.0", + component_type = "TODO: describe component type (e.g., 'deployment', 'setup-script')", + security = { + leash = 'Hunt, + trust_level = "full-system-access", + allow_network = true, + allow_filesystem_write = true, + allow_subprocess = true, + signature_required = true, + }, + metadata = { + name = "TODO: component-name", + version = "1.0.0", + description = "TODO: Detailed description of what this component does", + author = "{{AUTHOR}} <{{AUTHOR_EMAIL}}>", + }, + warnings = [ + "This component has full system access", + "Only run from trusted sources with verified signatures", + "Review all Just recipes before execution", + "Use dry-run mode first: ./must --dry-run run your-file.k9.ncl", + ], + side_effects = [ + "TODO: List what files/directories this creates or modifies", + "TODO: List what commands this executes", + "TODO: List what network access this requires", + ], + }, + + # Configuration with contracts (Yard-level validation) + config = { + # Add your configuration here with appropriate contracts + target_dir + | String + | std.string.NonEmpty + = "/tmp/k9-output", + + dry_run | Bool = false, + + # Add more config as needed + }, + + # Just recipes for execution + # These run when: ./must run your-file.k9.ncl + recipes = { + # Main entry point (runs by default) + default = { + recipe = "TODO: main-task", + description = "TODO: What the default recipe does", + }, + + # Define your recipes here + "main-task" = { + dependencies = ["check-prerequisites"], + commands = [ + "echo 'TODO: Add your commands here'", + # Example: Create directory + # "mkdir -p %{config.target_dir}", + # Example: Run a command + # "just build", + # Example: Conditional execution + # "@if [ \"%{config.dry_run}\" = \"true\" ]; then echo '[DRY-RUN] Would execute'; else actual-command; fi", + ], + }, + + "check-prerequisites" = { + description = "Verify required tools and permissions", + commands = [ + # Example: Check for required tools + # "command -v git || (echo 'ERROR: git not found' && exit 1)", + # Example: Check permissions + # "[ -w %{config.target_dir} ] || (echo 'ERROR: Cannot write to target directory' && exit 1)", + "echo '✓ Prerequisites checked'", + ], + }, + + # Add more recipes as needed + "build" = { + description = "Build the project", + commands = [ + "echo 'TODO: Add build commands'", + ], + }, + + "deploy" = { + description = "Deploy the application", + dependencies = ["build"], + commands = [ + "echo 'TODO: Add deployment commands'", + ], + }, + + "clean" = { + description = "Clean up generated files", + commands = [ + "echo '⚠️ This will delete files - waiting 3 seconds...'", + "sleep 3", + "echo 'TODO: Add cleanup commands'", + # "rm -rf %{config.target_dir}", + ], + }, + }, + + # Validation (Yard-level checks before Hunt execution) + validation = { + check_target_dir = std.string.length config.target_dir > 0, + # Add more validation as needed + }, +} + +# Usage: +# 1. Fill in TODO items above +# 2. Define configuration with contracts +# 3. Implement Just recipes with your commands +# 4. Test with dry-run: ./must --dry-run run your-file.k9.ncl +# 5. Review dry-run output carefully +# 6. Sign the component: ./must sign your-file.k9.ncl +# 7. Distribute with signature: your-file.k9.ncl.sig +# 8. Users verify and run: ./must verify && ./must run your-file.k9.ncl +# +# Security checklist: +# ✓ All TODO items filled in +# ✓ side_effects documented accurately +# ✓ Commands reviewed for safety +# ✓ No hardcoded secrets or credentials +# ✓ Proper error handling in recipes +# ✓ Tested in dry-run mode +# ✓ Component signed with trusted key diff --git a/rs/.machine_readable/svc/k9/template-kennel.k9.ncl b/rs/.machine_readable/svc/k9/template-kennel.k9.ncl new file mode 100644 index 0000000..fa7e3f3 --- /dev/null +++ b/rs/.machine_readable/svc/k9/template-kennel.k9.ncl @@ -0,0 +1,54 @@ +K9! +# SPDX-License-Identifier: MPL-2.0 +# K9 Kennel-level template: Pure data configuration +# Security Level: Kennel (data-only, no execution) +# No signature required - safe for any use + +{ + pedigree = { + schema_version = "1.0.0", + component_type = "TODO: describe component type (e.g., 'build-config', 'metadata')", + security = { + leash = 'Kennel, + trust_level = "data-only", + allow_network = false, + allow_filesystem_write = false, + allow_subprocess = false, + }, + metadata = { + name = "TODO: component-name", + version = "1.0.0", + description = "TODO: Brief description of what this component contains", + author = "{{AUTHOR}} <{{AUTHOR_EMAIL}}>", + }, + }, + + # Your configuration data here + config = { + # Example: Pure data values + setting_1 = "value", + setting_2 = 42, + setting_3 = true, + + nested = { + key = "value", + }, + + list = [ + "item1", + "item2", + ], + }, + + # Optional: Export format specification + export = { + format = "json", # or "yaml", "toml" + destination = "output.json", + }, +} + +# Usage: +# 1. Fill in TODO items above +# 2. Add your configuration data to config = { ... } +# 3. Validate: nickel typecheck your-file.k9.ncl +# 4. Export: nickel export your-file.k9.ncl > output.json diff --git a/rs/.machine_readable/svc/k9/template-yard.k9.ncl b/rs/.machine_readable/svc/k9/template-yard.k9.ncl new file mode 100644 index 0000000..358671c --- /dev/null +++ b/rs/.machine_readable/svc/k9/template-yard.k9.ncl @@ -0,0 +1,84 @@ +K9! +# SPDX-License-Identifier: MPL-2.0 +# K9 Yard-level template: Configuration with validation +# Security Level: Yard (Nickel evaluation with contracts) +# Signature recommended but not required + +{ + pedigree = { + schema_version = "1.0.0", + component_type = "TODO: describe component type (e.g., 'validated-config', 'schema')", + security = { + leash = 'Yard, + trust_level = "validated-config", + allow_network = false, + allow_filesystem_write = false, + allow_subprocess = false, + }, + metadata = { + name = "TODO: component-name", + version = "1.0.0", + description = "TODO: Brief description with validation details", + author = "{{AUTHOR}} <{{AUTHOR_EMAIL}}>", + }, + }, + + # Configuration with Nickel contracts for validation + config = { + # Example: String that cannot be empty + name + | String + | std.string.NonEmpty + = "TODO: default value", + + # Example: Number with range constraint + port + | Number + | std.contract.from_predicate (fun p => p > 0 && p < 65536) + = 8080, + + # Example: Boolean flag + enabled | Bool = true, + + # Example: Enum (one of several values) + environment + | [| 'Development, 'Staging, 'Production |] + = 'Development, + + # Example: List with non-empty constraint + items + | Array String + | std.array.NonEmpty + = ["item1", "item2"], + + # Example: Nested object with contracts + database = { + host | String | std.string.NonEmpty = "localhost", + port | Number | std.contract.from_predicate (fun p => p > 0 && p < 65536) = 5432, + name | String | std.string.NonEmpty = "mydb", + }, + }, + + # Validation rules (additional cross-field checks) + validation = { + # Example: Check that at least one item exists + check_items = std.array.length config.items > 0, + + # Example: Check that production has secure settings + check_production = + if config.environment == 'Production then + config.enabled == true + else + true, + + # Add your custom validation rules here + }, +} + +# Usage: +# 1. Fill in TODO items above +# 2. Define your config with appropriate contracts +# 3. Add validation rules in validation = { ... } +# 4. Validate: nickel typecheck your-file.k9.ncl +# 5. Evaluate: nickel eval your-file.k9.ncl +# 6. If validation passes, use in your application diff --git a/rs/.tool-versions b/rs/.tool-versions new file mode 100644 index 0000000..59b7430 --- /dev/null +++ b/rs/.tool-versions @@ -0,0 +1,2 @@ +rust stable +just 1.36.0 diff --git a/rs/.well-known/ai.txt b/rs/.well-known/ai.txt new file mode 100644 index 0000000..334b406 --- /dev/null +++ b/rs/.well-known/ai.txt @@ -0,0 +1,18 @@ +# SPDX-License-Identifier: MPL-2.0 +# ai.txt - AI interaction policy +# See: https://site.spawning.ai/spawning-ai-txt + +User-Agent: * +Disallow-Training: yes +Disallow-Summarization: no +Disallow-Generation: yes + +# This project's code is licensed under MPL-2.0. +# AI agents may read and analyze this code for assisting contributors. +# AI agents must NOT use this code for model training without explicit consent. +# AI agents must preserve Emotional Lineage per PMPL Section 3. +# +# For AI agent integration instructions, see: +# 0-AI-MANIFEST.a2ml (universal AI entry point) +# AI.a2ml (Claude-specific instructions) +# .machine_readable/ (structured project state) diff --git a/rs/.well-known/humans.txt b/rs/.well-known/humans.txt new file mode 100644 index 0000000..e062f4b --- /dev/null +++ b/rs/.well-known/humans.txt @@ -0,0 +1,14 @@ +# SPDX-License-Identifier: MPL-2.0 +# humanstxt.org + +/* TEAM */ +Maintainer: {{AUTHOR}} ({{OWNER}}) +Contact: {{AUTHOR_EMAIL}} +From: United Kingdom + +/* SITE */ +Last update: {{CURRENT_DATE}} +Standards: RSR (Rhodium Standard Repository) +License: MPL-2.0 (Palimpsest MPL) +Components: Idris2 ABI, Zig FFI +Tools: just, Podman, Guix diff --git a/rs/.well-known/security.txt b/rs/.well-known/security.txt new file mode 100644 index 0000000..5414d50 --- /dev/null +++ b/rs/.well-known/security.txt @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +# RFC 9116 - security.txt +# https://securitytxt.org/ + +Contact: mailto:{{SECURITY_EMAIL}} +Expires: {{CURRENT_YEAR}}-12-31T23:59:59.000Z +Encryption: {{PGP_KEY_URL}} +Preferred-Languages: en +Canonical: https://{{FORGE}}/{{OWNER}}/{{REPO}}/.well-known/security.txt +Policy: https://{{FORGE}}/{{OWNER}}/{{REPO}}/blob/main/SECURITY.md +Hiring: https://{{WEBSITE}}/careers diff --git a/rs/0-AI-MANIFEST.a2ml b/rs/0-AI-MANIFEST.a2ml new file mode 100644 index 0000000..e1d3aa0 --- /dev/null +++ b/rs/0-AI-MANIFEST.a2ml @@ -0,0 +1,121 @@ +# ⚠️ STOP - CRITICAL READING REQUIRED + +**THIS FILE MUST BE READ FIRST BY ALL AI AGENTS** + +## WHAT IS THIS? + +This is the AI manifest for **[YOUR-REPO-NAME]**. It declares: +- Canonical file locations (where things MUST be, and nowhere else) +- Critical invariants (rules that must NEVER be violated) +- Repository structure and organization + +## CANONICAL LOCATIONS (UNIVERSAL RULE) + +### Machine-Readable Metadata: `.machine_readable/` ONLY + +These 6 a2ml files MUST exist in `.machine_readable/` directory ONLY: +1. **STATE.a2ml** - Project state, progress, blockers +2. **META.a2ml** - Architecture decisions, governance +3. **ECOSYSTEM.a2ml** - Position in ecosystem, relationships +4. **AGENTIC.a2ml** - AI agent interaction patterns +5. **NEUROSYM.a2ml** - Neurosymbolic integration config +6. **PLAYBOOK.a2ml** - Operational runbook + +**CRITICAL:** If ANY of these files exist in the root directory, this is an ERROR. + +### Anchor File: `.machine_readable/anchors/ANCHOR.a2ml` ONLY + +Canonical authority and semantic-boundary declaration MUST exist at: + +` .machine_readable/anchors/ANCHOR.a2ml ` + +Do not place `ANCHOR.a2ml` at repository root. + +### Maintenance Policies: `.machine_readable/policies/` ONLY + +Canonical maintenance/governance files MUST exist under: + +` .machine_readable/policies/ ` + +Minimum required files: +- `MAINTENANCE-AXES.a2ml` +- `MAINTENANCE-CHECKLIST.a2ml` +- `SOFTWARE-DEVELOPMENT-APPROACH.a2ml` + +Do not place maintenance policy files in repository root. + +### Bot Directives: `.machine_readable/bot_directives/` ONLY + +Bot-specific instructions for your automated agents. + +### Contractiles: `.machine_readable/contractiles/` ONLY + +Policy enforcement contracts (k9, dust, lust, must, trust). + +### AI Configuration & Guides: `.machine_readable/ai/` ONLY + +- `AI.a2ml` - Language-specific or LLM-specific patterns +- `PLACEHOLDERS.md` - Bootstrap guide + +### Community & Forge Metadata: `.github/` ONLY + +- `CODEOWNERS` - Review assignments +- `MAINTAINERS` - Machine-readable contact list +- `SUPPORT` - Support channels +- `SECURITY.md` - Technical security policy +- `CONTRIBUTING.md` - Technical contribution manual +- `CODE_OF_CONDUCT.md` - Conduct rules + +### Agent Instructions + +- `0-AI-MANIFEST.a2ml` - THIS FILE (universal entry point) + +## CORE INVARIANTS + +1. **No state file duplication** - Root must NOT contain STATE.a2ml, META.a2ml, etc. +2. **Single source of truth** - `.machine_readable/` is authoritative +3. **No stale metadata** - If root state files exist, they are OUT OF DATE +4. **License consistency** - All code MPL-2.0 unless platform requires MPL-2.0 +5. **Author attribution** - Always "{{AUTHOR}} <{{AUTHOR_EMAIL}}>" +6. **Container images** - MUST use Chainguard base (`cgr.dev/chainguard/wolfi-base:latest` or `cgr.dev/chainguard/static:latest`) +7. **Container runtime** - Podman, never Docker. Files are `Containerfile`, never `Dockerfile` +8. **Container orchestration** - `selur-compose`, never `docker-compose` + +## REPOSITORY STRUCTURE + +This repo follows the **Dual-Track** architecture: + +``` +[YOUR-REPO-NAME]/ +├── 0-AI-MANIFEST.a2ml # THIS FILE (start here) +├── README.adoc # High-level orientation (Rich Human) +├── ROADMAP.adoc # Future direction +├── CONTRIBUTING.adoc # Human contribution guide +├── GOVERNANCE.adoc # Decision-making model +├── Justfile # Task runner +├── Containerfile # OCI build +├── LICENSE # Primary license +├── src/ # Source code +│ └── interface/ # Verified Interface Seams +│ ├── abi/ # Idris2 ABI (The Spec) +│ ├── ffi/ # Zig FFI (The Bridge) +│ └── generated/ # C Headers (The Result) +├── container/ # Stapeln container ecosystem +├── docs/ # Technical depths +│ ├── attribution/ # Citations, owners, maintainers (adoc) +│ ├── architecture/ # Topology, diagrams +│ ├── theory/ # Domain theory +│ └── practice/ # Manuals +├── docs/legal/ # Legal exhibits and full texts +└── .machine_readable/ # ALL machine-readable metadata +``` + +## SESSION STARTUP CHECKLIST + +✅ Read THIS file (0-AI-MANIFEST.a2ml) first +✅ Understand canonical location: `.machine_readable/` +✅ State understanding of canonical locations + +## ATTESTATION PROOF + +**"I have read the AI manifest. All machine-readable content (state files, anchors, policies, bot directives, contractiles, AI guides) is located in `.machine_readable/` ONLY, and community metadata is in `.github/`. I will not create duplicate files in the root directory."** diff --git a/rs/ARCHITECTURE.md b/rs/ARCHITECTURE.md new file mode 100644 index 0000000..607e3d8 --- /dev/null +++ b/rs/ARCHITECTURE.md @@ -0,0 +1,47 @@ +# Architecture + +## Overview + +This repository follows a modular, maintainable architecture designed for clarity, scalability, and long-term sustainability. + +## Directory Structure + +``` +. +├── src/ # Source code +├── tests/ # Test suites +├── docs/ # Documentation +├── scripts/ # Utility scripts +├── config/ # Configuration files +├── LICENSE # License file +├── LICENSES/ # Full license texts +└── README.adoc # Project documentation +``` + +## Design Principles + +- **Separation of Concerns**: Each module has a single responsibility +- **Testability**: Code is written to be easily testable +- **Documentation**: All public APIs are documented +- **Configuration**: Environment-specific settings are externalized + +## Dependencies + +- External dependencies are minimized and clearly declared +- Version pinning is used for reproducibility + +## Security Considerations + +- Sensitive data is never committed to the repository +- Secrets are managed through environment variables or secure vaults +- Regular dependency audits are performed + +## Maintainability + +- Code follows consistent style guidelines +- Pull requests require review and CI checks +- Issues and discussions are tracked transparently + +--- + +*Last updated: 2026-07-18* diff --git a/rs/CHANGELOG.md b/rs/CHANGELOG.md new file mode 100644 index 0000000..3f312c4 --- /dev/null +++ b/rs/CHANGELOG.md @@ -0,0 +1,14 @@ +# 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 (2026-04-04) +- Enhanced A2ML validation tests from session 9 dogfooding integration diff --git a/rs/CODE_OF_CONDUCT.md b/rs/CODE_OF_CONDUCT.md new file mode 100644 index 0000000..caeda1c --- /dev/null +++ b/rs/CODE_OF_CONDUCT.md @@ -0,0 +1,27 @@ + +# Contributor Covenant Code of Conduct + +## Our Pledge + +We pledge to make participation a harassment-free experience for everyone. + +## Our Standards + +**Positive behavior:** +* Using welcoming language +* Being respectful of differing viewpoints +* Accepting constructive criticism +* Focusing on what is best for the community + +**Unacceptable behavior:** +* Harassment, trolling, or personal attacks +* Publishing private information without permission + +## Enforcement + +Report issues to the maintainers. All complaints will be reviewed. + +## Attribution + +Adapted from [Contributor Covenant](https://www.contributor-covenant.org/) v2.1. + diff --git a/rs/CONTRIBUTING.md b/rs/CONTRIBUTING.md new file mode 100644 index 0000000..80ecdac --- /dev/null +++ b/rs/CONTRIBUTING.md @@ -0,0 +1,66 @@ + +# Contributing + +Thank you for your interest in contributing! We follow a "Dual-Track" architecture where human-readable documentation lives in the root and machine-readable policies live in `.machine_readable/`. + +## How to Contribute + +We welcome contributions in many forms: + +- **Code:** Improving the core stack or extensions +- **Documentation:** Enhancing docs or AI manifests +- **Testing:** Adding property-based tests or formal proofs +- **Bug reports:** Filing clear, reproducible issues + +## Getting Started + +1. **Read the AI Manifest:** Start with `0-AI-MANIFEST.a2ml` (if present) to understand the repository structure. +2. **Environment:** Use `nix develop` or `direnv allow` to set up your tools. +3. **Task Runner:** Use `just` to see available commands (`just --list`). + +## Development Workflow + +### Branch Naming + +``` +docs/short-description # Documentation +test/what-added # Test additions +feat/short-description # New features +fix/issue-number-description # Bug fixes +refactor/what-changed # Code improvements +security/what-fixed # Security fixes +``` + +### Commit Messages + +We follow [Conventional Commits](https://www.conventionalcommits.org/): + +``` +(): + +[optional body] + +[optional footer] +``` + +Types: `feat`, `fix`, `docs`, `test`, `refactor`, `ci`, `chore`, `security` + +## Reporting Bugs + +Before reporting: +1. Search existing issues +2. Check if it's already fixed in `main` + +When reporting, include: +- Clear, descriptive title +- Environment details (OS, versions, toolchain) +- Steps to reproduce +- Expected vs actual behaviour + +## Code of Conduct + +All contributors are expected to adhere to our [Code of Conduct](CODE_OF_CONDUCT.md). + +## License + +By contributing, you agree that your contributions will be licensed under the same license as the project (see [LICENSE](LICENSE)). diff --git a/rs/Cargo.lock b/rs/Cargo.lock new file mode 100644 index 0000000..ad6b510 --- /dev/null +++ b/rs/Cargo.lock @@ -0,0 +1,584 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "a2ml" +version = "0.1.0" +dependencies = [ + "criterion", + "serde", + "serde_derive", + "thiserror", +] + +[[package]] +name = "aho-corasick" +version = "1.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301" +dependencies = [ + "memchr", +] + +[[package]] +name = "anes" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b46cbb362ab8752921c97e041f5e366ee6297bd428a31275b9fcf1e380f7299" + +[[package]] +name = "anstyle" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "940b3a0ca603d1eade50a4846a2afffd5ef57a9feac2c0e2ec2e14f9ead76000" + +[[package]] +name = "autocfg" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" + +[[package]] +name = "bumpalo" +version = "3.20.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d20789868f4b01b2f2caec9f5c4e0213b41e3e5702a50157d699ae31ced2fcb" + +[[package]] +name = "cast" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5" + +[[package]] +name = "cfg-if" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" + +[[package]] +name = "ciborium" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42e69ffd6f0917f5c029256a24d0161db17cea3997d185db0d35926308770f0e" +dependencies = [ + "ciborium-io", + "ciborium-ll", + "serde", +] + +[[package]] +name = "ciborium-io" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05afea1e0a06c9be33d539b876f1ce3692f4afea2cb41f740e7743225ed1c757" + +[[package]] +name = "ciborium-ll" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57663b653d948a338bfb3eeba9bb2fd5fcfaecb9e199e87e1eda4d9e8b240fd9" +dependencies = [ + "ciborium-io", + "half", +] + +[[package]] +name = "clap" +version = "4.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b193af5b67834b676abd72466a96c1024e6a6ad978a1f484bd90b85c94041351" +dependencies = [ + "clap_builder", +] + +[[package]] +name = "clap_builder" +version = "4.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "714a53001bf66416adb0e2ef5ac857140e7dc3a0c48fb28b2f10762fc4b5069f" +dependencies = [ + "anstyle", + "clap_lex", +] + +[[package]] +name = "clap_lex" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8d4a3bb8b1e0c1050499d1815f5ab16d04f0959b233085fb31653fbfc9d98f9" + +[[package]] +name = "criterion" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2b12d017a929603d80db1831cd3a24082f8137ce19c69e6447f54f5fc8d692f" +dependencies = [ + "anes", + "cast", + "ciborium", + "clap", + "criterion-plot", + "is-terminal", + "itertools", + "num-traits", + "once_cell", + "oorandom", + "plotters", + "rayon", + "regex", + "serde", + "serde_derive", + "serde_json", + "tinytemplate", + "walkdir", +] + +[[package]] +name = "criterion-plot" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b50826342786a51a89e2da3a28f1c32b06e387201bc2d19791f622c673706b1" +dependencies = [ + "cast", + "itertools", +] + +[[package]] +name = "crossbeam-deque" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9dd111b7b7f7d55b72c0a6ae361660ee5853c9af73f70c3c2ef6858b950e2e51" +dependencies = [ + "crossbeam-epoch", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-epoch" +version = "0.9.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" + +[[package]] +name = "crunchy" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5" + +[[package]] +name = "either" +version = "1.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" + +[[package]] +name = "half" +version = "2.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ea2d84b969582b4b1864a92dc5d27cd2b77b622a8d79306834f1be5ba20d84b" +dependencies = [ + "cfg-if", + "crunchy", + "zerocopy", +] + +[[package]] +name = "hermit-abi" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36b1da849c" + +[[package]] +name = "is-terminal" +version = "0.4.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3640c1c38b8e4e43584d8df18be5fc6b0aa314ce6ebf51b53313d4306cca8e46" +dependencies = [ + "hermit-abi", + "libc", + "windows-sys", +] + +[[package]] +name = "itertools" +version = "0.10.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" +dependencies = [ + "either", +] + +[[package]] +name = "itoa" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" + +[[package]] +name = "js-sys" +version = "0.3.94" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e04e2ef80ce82e13552136fabeef8a5ed1f985a96805761cbb9a2c34e7664d9" +dependencies = [ + "once_cell", + "wasm-bindgen", +] + +[[package]] +name = "libc" +version = "0.2.184" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48f5d2a454e16a5ea0f4ced81bd44e4cfc7bd3a507b61887c99fd3538b28e4af" + +[[package]] +name = "memchr" +version = "2.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8ca58f447f06ed17d5fc4043ce1b10dd205e060fb3ce5b979b8ed8e59ff3f79" + +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", +] + +[[package]] +name = "once_cell" +version = "1.21.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50" + +[[package]] +name = "oorandom" +version = "11.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6790f58c7ff633d8771f42965289203411a5e5c68388703c06e14f24770b41e" + +[[package]] +name = "plotters" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5aeb6f403d7a4911efb1e33402027fc44f29b5bf6def3effcc22d7bb75f2b747" +dependencies = [ + "num-traits", + "plotters-backend", + "plotters-svg", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "plotters-backend" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df42e13c12958a16b3f7f4386b9ab1f3e7933914ecea48da7139435263a4172a" + +[[package]] +name = "plotters-svg" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51bae2ac328883f7acdfea3d66a7c35751187f870bc81f94563733a154d7a670" +dependencies = [ + "plotters-backend", +] + +[[package]] +name = "proc-macro2" +version = "1.0.106" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41f2619966050689382d2b44f664f4bc593e129785a36d6ee376ddf37259b924" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "rayon" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "368f01d005bf8fd9b1206fb6fa653e6c4a81ceb1466406b81792d87c5677a58f" +dependencies = [ + "either", + "rayon-core", +] + +[[package]] +name = "rayon-core" +version = "1.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22e18b0f0062d30d4230b2e85ff77fdfe4326feb054b9783a3460d8435c8ab91" +dependencies = [ + "crossbeam-deque", + "crossbeam-utils", +] + +[[package]] +name = "regex" +version = "1.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e10754a14b9137dd7b1e3e5b0493cc9171fdd105e0ab477f51b72e7f3ac0e276" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e1dd4122fc1595e8162618945476892eefca7b88c52820e74af6262213cae8f" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.8.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc897dd8d9e8bd1ed8cdad82b5966c3e0ecae09fb1907d58efaa013543185d0a" + +[[package]] +name = "rustversion" +version = "1.0.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" + +[[package]] +name = "same-file" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "serde" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" +dependencies = [ + "serde_core", + "serde_derive", +] + +[[package]] +name = "serde_core" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_json" +version = "1.0.149" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83fc039473c5595ace860d8c4fafa220ff474b3fc6bfdb4293327f1a37e94d86" +dependencies = [ + "itoa", + "memchr", + "serde", + "serde_core", + "zmij", +] + +[[package]] +name = "syn" +version = "2.0.117" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e665b8803e7b1d2a727f4023456bbbbe74da67099c585258af0ad9c5013b9b99" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "thiserror" +version = "2.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4288b5bcbc7920c07a1149a35cf9590a2aa808e0bc1eafaade0b80947865fbc4" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "2.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebc4ee7f67670e9b64d05fa4253e753e016c6c95ff35b89b7941d6b856dec1d5" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "tinytemplate" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be4d6b5f19ff7664e8c98d03e2139cb510db9b0a60b55f8e8709b689d939b6bc" +dependencies = [ + "serde", + "serde_json", +] + +[[package]] +name = "unicode-ident" +version = "1.0.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" + +[[package]] +name = "walkdir" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" +dependencies = [ + "same-file", + "winapi-util", +] + +[[package]] +name = "wasm-bindgen" +version = "0.2.117" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0551fc1bb415591e3372d0bc4780db7e587d84e2a7e79da121051c5c4b89d0b0" +dependencies = [ + "cfg-if", + "once_cell", + "rustversion", + "wasm-bindgen-macro", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.117" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fbdf9a35adf44786aecd5ff89b4563a90325f9da0923236f6104e603c7e86be" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.117" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dca9693ef2bab6d4e6707234500350d8dad079eb508dca05530c85dc3a529ff2" +dependencies = [ + "bumpalo", + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.117" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39129a682a6d2d841b6c429d0c51e5cb0ed1a03829d8b3d1e69a011e62cb3d3b" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "web-sys" +version = "0.3.94" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd70027e39b12f0849461e08ffc50b9cd7688d942c1c8e3c7b22273236b4dd0a" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "winapi-util" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" +dependencies = [ + "windows-sys", +] + +[[package]] +name = "windows-link" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" + +[[package]] +name = "windows-sys" +version = "0.61.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" +dependencies = [ + "windows-link", +] + +[[package]] +name = "zerocopy" +version = "0.8.48" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eed437bf9d6692032087e337407a86f04cd8d6a16a37199ed57949d415bd68e9" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.8.48" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70e3cd084b1788766f53af483dd21f93881ff30d7320490ec3ef7526d203bad4" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "zmij" +version = "1.0.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8848ee67ecc8aedbaf3e4122217aff892639231befc6a1b58d29fff4c2cabaa" diff --git a/rs/Cargo.toml b/rs/Cargo.toml new file mode 100644 index 0000000..4e7418c --- /dev/null +++ b/rs/Cargo.toml @@ -0,0 +1,32 @@ +# SPDX-License-Identifier: MPL-2.0 +# (MPL-2.0 preferred; MPL-2.0 required for crates.io) + +[package] +name = "a2ml" +version = "0.1.0" +edition = "2021" +authors = ["Jonathan D.A. Jewell "] +license = "MPL-2.0" +description = "Parser and renderer for A2ML (Attested Markup Language)" +repository = "https://github.com/hyperpolymath/a2ml-rs" +homepage = "https://github.com/hyperpolymath/a2ml-rs" +documentation = "https://docs.rs/a2ml" +keywords = ["a2ml", "attestation", "markup", "parser", "ai-agent"] +categories = ["parser-implementations", "data-structures"] +readme = "README.adoc" + +[dependencies] +serde = { version = "1", features = ["derive"] } +serde_derive = { version = "1", optional = true } +thiserror = "2" + +[dev-dependencies] +criterion = { version = "0.5", features = ["html_reports"] } + +[[bench]] +name = "a2ml_bench" +harness = false + +[features] +default = [] +serde_derive = ["dep:serde_derive"] diff --git a/rs/Containerfile b/rs/Containerfile new file mode 100644 index 0000000..d7266bc --- /dev/null +++ b/rs/Containerfile @@ -0,0 +1,41 @@ +# SPDX-License-Identifier: MPL-2.0 +# Copyright (c) {{CURRENT_YEAR}} {{AUTHOR}} ({{OWNER}}) <{{AUTHOR_EMAIL}}> +# +# Containerfile for {{PROJECT_NAME}} +# Build: podman build -t {{project}}:latest -f Containerfile . +# Run: podman run --rm -it {{project}}:latest +# Seal: selur seal {{project}}:latest + +# --- Build stage --- +FROM cgr.dev/chainguard/wolfi-base:latest AS build + +# TODO: Install build dependencies for your stack +# Examples: +# RUN apk add --no-cache rust cargo # Rust +# RUN apk add --no-cache elixir erlang # Elixir +# RUN apk add --no-cache zig # Zig + +WORKDIR /build +COPY . . + +# TODO: Replace with your build command +# Examples: +# RUN cargo build --release +# RUN mix deps.get && MIX_ENV=prod mix release +# RUN zig build -Doptimize=ReleaseSafe + +# --- Runtime stage --- +FROM cgr.dev/chainguard/static:latest + +# Copy built artifact from build stage +# TODO: Replace with your binary/artifact path +# Examples: +# COPY --from=build /build/target/release/{{project}} /usr/local/bin/ +# COPY --from=build /build/_build/prod/rel/{{project}} /app/ +# COPY --from=build /build/zig-out/bin/{{project}} /usr/local/bin/ + +# Non-root user (chainguard images default to nonroot) +USER nonroot + +# TODO: Replace with your entrypoint +# ENTRYPOINT ["/usr/local/bin/{{project}}"] diff --git a/rs/EXPLAINME.adoc b/rs/EXPLAINME.adoc new file mode 100644 index 0000000..99e8c1e --- /dev/null +++ b/rs/EXPLAINME.adoc @@ -0,0 +1,160 @@ +// SPDX-License-Identifier: CC-BY-SA-4.0 += a2ml-rs — Show Me The Receipts +Jonathan D.A. Jewell +:toc: +:icons: font + +The README makes claims. This file backs them up. + +== A2ML Is a Parser and Renderer for Attested Markup Language + +[quote, README] +____ +Parser and renderer for A2ML (Attested Markup Language). A2ML is a lightweight +markup format designed for AI-agent communication that carries built-in +attestation metadata, enabling provenance tracking and trust-level annotations +on document content. +____ + +A2ML (Attested Markup Language) extends a Markdown-like surface syntax with +two first-class constructs: `@directives` (machine-readable metadata prefixed +with `@`) and `!attest` blocks that record identity, role, and trust-level on +any piece of content. The parser in `src/parser.rs` is a line-by-line state +machine: it accumulates paragraph text in a buffer, recognises headings, +directives, attestation lines, fenced code blocks, block quotes, thematic +breaks, and ordered/unordered lists, then flushes each recognised structure +into a `Vec`. The renderer in `src/renderer.rs` serialises the same +`Document` AST back to canonical A2ML text, making round-trips deterministic. + +**Caveat:** The MVP parser is single-pass and line-oriented — it does not +handle nested block structures beyond one level of block-quote recursion. +Multi-line directives (as used in the Haskell variant with `@name: ... @end` +blocks) are not yet supported; directives here are single-line `@name value` +pairs only. No HTML or PDF output is built in — use `pandoc-a2ml` (the Lua +reader in `hyperpolymath/pandoc-a2ml`) for format conversion. + +- Implementation: `src/parser.rs` (parse, parse_file), `src/renderer.rs` (render) +- Core types: `src/types.rs` (Document, Block, Inline, Directive, Attestation, TrustLevel, Manifest) +- Error surface: `src/error.rs` (A2mlError::ParseError, A2mlError::Io, A2mlError::RenderError) +- Learn more: https://docs.rs/a2ml (forthcoming), https://github.com/hyperpolymath/a2ml + +== Attestation Chain Is a First-Class Type + +[quote, src/types.rs] +____ +An A2ML document consists of a sequence of Block elements, each of which may +contain Inline content. Directive blocks provide machine-readable metadata, +and Attestation records capture the provenance chain for AI-generated or +human-reviewed content. +____ + +The `TrustLevel` enum defines four ordered levels: `Unverified` → `Automated` +→ `Reviewed` → `Verified`. Attestations carry `identity` (person or agent +name), `role` (e.g. `"author"` or `"agent"`), `trust_level`, an optional +ISO-8601 timestamp, and a free-form note. The `Manifest` struct is a +convenience aggregate that extracts the `@version` directive and all +attestations from a `Document` into a single value for programmatic inspection. +The `parser.rs` attestation parser (`parse_attestation`) requires `identity`, +`role`, and `trust` fields; unknown keys are silently skipped for +forward-compatibility. + +**Caveat:** Attestations are syntactic declarations, not cryptographic +signatures. There is no signature verification or public-key infrastructure +here — that layer belongs in `cookie-rebound` and the broader Groove protocol +stack. `TrustLevel::Verified` means _claimed_ verified, not proven. + +- Implementation: `src/types.rs:167–293` (Attestation, TrustLevel, Manifest) +- Parser path: `src/parser.rs:398–445` (parse_attestation) +- Learn more: https://www.rfc-editor.org/rfc/rfc9068 (JWT for comparison) + +== Safe Rust Without unsafe_code + +[quote, src/lib.rs] +____ +#![forbid(unsafe_code)] +____ + +The crate gate is `#![forbid(unsafe_code)]` — the compiler rejects any +`unsafe` block at the crate root. Dependencies are minimal: `serde`/`serde_derive` +for JSON serialisation, `thiserror` for ergonomic error types, and `criterion` +for benchmarks only. There are no proc-macro or build-script dependencies that +could introduce hidden unsafe paths. + +**Caveat:** Transitive dependencies (serde internals, thiserror) are not under +the same `forbid` gate. Use `cargo-geiger` or `panic-attacker` to audit the +full dependency tree if deploying in a security-sensitive context. + +- Crate root: `src/lib.rs:1` (#![forbid(unsafe_code)]) +- Learn more: https://doc.rust-lang.org/reference/unsafe-blocks.html + +== MPL-2.0 Fallback for crates.io + +[quote, Cargo.toml] +____ +license = "MPL-2.0" +# (MPL-2.0 preferred; MPL-2.0 required for crates.io) +____ + +crates.io requires an OSI-approved SPDX identifier; MPL-2.0 is not +yet recognised by OSI. Every source file carries the dual comment: +`// SPDX-License-Identifier: CC-BY-SA-4.0 // (MPL-2.0 preferred; ...)`. +This follows the project-wide fallback policy documented in CLAUDE.md. + +**Caveat:** The published crate on crates.io is effectively MPL-2.0. Any +fork or redistribution outside the crates.io ecosystem should honour +MPL-2.0 where the platform permits it. + +- License file: `LICENSE` (MPL-2.0 text), `LICENSE-MPL-2.0` +- Learn more: https://github.com/hyperpolymath/palimpsest-license + +== Dogfooded Across The Account + +[cols="1,2"] +|=== +| Technology | Also Used In + +| **A2ML format** | https://github.com/hyperpolymath/a2ml-haskell[a2ml-haskell] (Haskell binding), https://github.com/hyperpolymath/pandoc-a2ml[pandoc-a2ml] (Lua reader), https://github.com/hyperpolymath/tree-sitter-a2ml[tree-sitter-a2ml] (grammar) + +| **Rust + thiserror** | https://github.com/hyperpolymath/panic-attacker[panic-attacker], https://github.com/hyperpolymath/patch-bridge[patch-bridge], https://github.com/hyperpolymath/protocol-squisher[protocol-squisher] + +| **Criterion benchmarks** | https://github.com/hyperpolymath/patch-bridge[patch-bridge] (bridge_bench.rs), https://github.com/hyperpolymath/a2ml-haskell[a2ml-haskell] (a2ml-bench) + +| **SPDX MPL-2.0 fallback** | https://github.com/hyperpolymath/a2ml-haskell[a2ml-haskell] (Hackage policy) + +| **0-AI-MANIFEST.a2ml gatekeeper** | All RSR repositories — this crate is itself an implementation of the format it parses +|=== + +== File Map + +[cols="1,2"] +|=== +| Path | Proves + +| `src/lib.rs` | Crate root: module declarations, re-exports, `#![forbid(unsafe_code)]` gate + +| `src/types.rs` | Core AST: `Document`, `Block`, `Inline`, `Directive`, `Attestation`, `TrustLevel`, `Manifest` — the canonical data model + +| `src/parser.rs` | Line-by-line parser: `parse(&str) -> Result`, `parse_file(Path) -> Result`, internal `ParserState`, all block and inline parsers + +| `src/renderer.rs` | Canonical serialiser: `render(&Document) -> Result`, block/inline/directive/attestation rendering + +| `src/error.rs` | `A2mlError` enum: `ParseError { line, col, message }`, `Io(std::io::Error)`, `RenderError` + +| `Cargo.toml` | Crate metadata: name=`a2ml`, version=`0.1.0`, keywords, categories, dependency pinning + +| `tests/e2e_test.rs` | End-to-end parse→render→re-parse round-trip tests + +| `tests/property_test.rs` | Property-based tests (QuickCheck-style via proptest) + +| `tests/aspect_test.rs` | Cross-cutting concern tests (error paths, edge cases) + +| `benches/a2ml_bench.rs` | Criterion benchmarks for parse and render hot paths + +| `tests/fuzz/` | Fuzz corpus placeholder (AFL/cargo-fuzz integration target) + +| `0-AI-MANIFEST.a2ml` | AI session gatekeeper — read first before modifying any file + +| `.machine_readable/` | A2ML state files: STATE.a2ml, ECOSYSTEM.a2ml, META.a2ml, AGENTIC.a2ml + +| `verification/` | Formal verification artefacts (Idris2 proofs, pending) +|=== diff --git a/rs/GOVERNANCE.md b/rs/GOVERNANCE.md new file mode 100644 index 0000000..e27364c --- /dev/null +++ b/rs/GOVERNANCE.md @@ -0,0 +1,60 @@ +# Governance + +## Overview + +This project is governed by the following principles and structures to ensure transparent, inclusive, and effective decision-making. + +## Roles and Responsibilities + +### Maintainers + +Maintainers are responsible for: +- Reviewing and merging pull requests +- Managing releases and versioning +- Ensuring code quality and standards +- Triaging issues and bug reports +- Community engagement and support + +### Contributors + +Contributors are expected to: +- Follow the code of conduct +- Submit well-documented pull requests +- Write tests for new functionality +- Maintain existing tests +- Update documentation as needed + +## Decision Making + +### Minor Changes +- Can be made by any maintainer +- Include bug fixes, documentation updates, dependency updates + +### Major Changes +- Require discussion in issues or pull requests +- Include new features, architectural changes, API changes +- Need approval from at least 2 maintainers + +### Breaking Changes +- Require RFC (Request for Comments) process +- Need approval from majority of maintainers +- Must include migration guide + +## Code of Conduct + +All participants are expected to follow our Code of Conduct. Violations can be reported to the maintainers. + +## Communication + +- **Issues**: For bug reports and feature requests +- **Discussions**: For questions and general discussion +- **Pull Requests**: For code contributions + +## Licensing + +All contributions are made under the terms of the repository's LICENSE file. +By submitting a pull request, you agree to license your contributions accordingly. + +--- + +*Last updated: 2026-07-18* diff --git a/rs/Justfile b/rs/Justfile new file mode 100644 index 0000000..31e5724 --- /dev/null +++ b/rs/Justfile @@ -0,0 +1,1043 @@ +# SPDX-License-Identifier: MPL-2.0 +# Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) +# +# RSR Standard Justfile Template +# https://just.systems/man/en/ +# +# Copy this file to new projects and customize the placeholder values. +# +# Run `just` to see all available recipes +# Run `just cookbook` to generate docs/just-cookbook.adoc +# Run `just combinations` to see matrix recipe options + +set shell := ["bash", "-uc"] +set dotenv-load := true +set positional-arguments := true + +# Import auto-generated contractile recipes (must-check, trust-verify, etc.) +# Re-generate with: contractile gen-just +import? "contractile.just" + +# Project metadata — customize these +project := "a2ml-rs" +OWNER := "hyperpolymath" +REPO := "a2ml-rs" +version := "0.1.0" +tier := "infrastructure" # 1 | 2 | infrastructure + +# ═══════════════════════════════════════════════════════════════════════════════ +# DEFAULT & HELP +# ═══════════════════════════════════════════════════════════════════════════════ + +# Show all available recipes with descriptions +default: + @just --list --unsorted + +# Show detailed help for a specific recipe +help recipe="": + #!/usr/bin/env bash + if [ -z "{{recipe}}" ]; then + just --list --unsorted + echo "" + echo "Usage: just help " + echo " just cookbook # Generate full documentation" + echo " just combinations # Show matrix recipes" + else + just --show "{{recipe}}" 2>/dev/null || echo "Recipe '{{recipe}}' not found" + fi + +# Show this project's info +info: + @echo "Project: {{project}}" + @echo "Version: {{version}}" + @echo "RSR Tier: {{tier}}" + @echo "Recipes: $(just --summary | wc -w)" + @[ -f ".machine_readable/STATE.a2ml" ] && grep -oP 'phase\s*=\s*"\K[^"]+' .machine_readable/STATE.a2ml | head -1 | xargs -I{} echo "Phase: {}" || true + +# ═══════════════════════════════════════════════════════════════════════════════ +# INIT — Bootstrap a new project from this template +# ═══════════════════════════════════════════════════════════════════════════════ + +# Interactive project bootstrap — replaces all {{PLACEHOLDER}} tokens +init: + #!/usr/bin/env bash + set -euo pipefail + + echo "═══════════════════════════════════════════════════" + echo " RSR Project Bootstrap" + echo "═══════════════════════════════════════════════════" + echo "" + + # --- Load defaults from config (if exists) --- + # Create yours: ~/.config/rsr/defaults + # Format: OWNER=myorg AUTHOR="My Name" AUTHOR_EMAIL=me@example.org ... + DEFAULTS="${XDG_CONFIG_HOME:-$HOME/.config}/rsr/defaults" + if [ -f "$DEFAULTS" ]; then + echo "Loading defaults from $DEFAULTS" + # shellcheck source=/dev/null + source "$DEFAULTS" + echo "" + fi + + # --- Required values (pre-filled from defaults if available) --- + read -rp "Project name (human-readable, e.g. My Project): " PROJECT_NAME + [ -z "$PROJECT_NAME" ] && echo "Error: project name required" && exit 1 + + read -rp "Repository slug (e.g. my-project): " REPO + [ -z "$REPO" ] && echo "Error: repo slug required" && exit 1 + + read -rp "Owner [${OWNER:-}]: " _OWNER + OWNER="${_OWNER:-${OWNER:-}}" + [ -z "$OWNER" ] && echo "Error: owner required" && exit 1 + + read -rp "Author full name [${AUTHOR:-}]: " _AUTHOR + AUTHOR="${_AUTHOR:-${AUTHOR:-}}" + [ -z "$AUTHOR" ] && echo "Error: author name required" && exit 1 + + read -rp "Author email [${AUTHOR_EMAIL:-}]: " _AUTHOR_EMAIL + AUTHOR_EMAIL="${_AUTHOR_EMAIL:-${AUTHOR_EMAIL:-}}" + [ -z "$AUTHOR_EMAIL" ] && echo "Error: email required" && exit 1 + + # --- Optional values (pre-filled from defaults if available) --- + read -rp "Author organization [${AUTHOR_ORG:-none}]: " _AUTHOR_ORG + AUTHOR_ORG="${_AUTHOR_ORG:-${AUTHOR_ORG:-}}" + + read -rp "Previous/alt email [${AUTHOR_EMAIL_ALT:-none}]: " _AUTHOR_EMAIL_ALT + AUTHOR_EMAIL_ALT="${_AUTHOR_EMAIL_ALT:-${AUTHOR_EMAIL_ALT:-}}" + + read -rp "Project description []: " PROJECT_DESCRIPTION + + read -rp "Forge domain [${FORGE:-github.com}]: " _FORGE + FORGE="${_FORGE:-${FORGE:-github.com}}" + + read -rp "Security contact email [${SECURITY_EMAIL:-$AUTHOR_EMAIL}]: " _SECURITY_EMAIL + SECURITY_EMAIL="${_SECURITY_EMAIL:-${SECURITY_EMAIL:-$AUTHOR_EMAIL}}" + + read -rp "Conduct contact email [${CONDUCT_EMAIL:-$AUTHOR_EMAIL}]: " _CONDUCT_EMAIL + CONDUCT_EMAIL="${_CONDUCT_EMAIL:-${CONDUCT_EMAIL:-$AUTHOR_EMAIL}}" + + read -rp "Project type (library|binary|monorepo|service|website) [library]: " PROJECT_TYPE + PROJECT_TYPE="${PROJECT_TYPE:-library}" + + read -rp "Website URL [https://${FORGE}/${OWNER}/${REPO}]: " WEBSITE + WEBSITE="${WEBSITE:-https://${FORGE}/${OWNER}/${REPO}}" + + # --- Container values (optional — only relevant if container/ exists) --- + if [ -d "container" ]; then + echo "" + echo "── Container configuration (optional) ─────────" + read -rp "Service name [${REPO}]: " _SERVICE_NAME + SERVICE_NAME="${_SERVICE_NAME:-${REPO}}" + read -rp "Primary port [8080]: " _PORT + PORT="${_PORT:-8080}" + read -rp "Container registry [ghcr.io/${OWNER}]: " _REGISTRY + REGISTRY="${_REGISTRY:-ghcr.io/${OWNER}}" + else + SERVICE_NAME="${REPO}" + PORT="8080" + REGISTRY="ghcr.io/${OWNER}" + fi + + # --- Derived values --- + PROJECT_UPPER=$(echo "$REPO" | tr '[:lower:]-' '[:upper:]_') + PROJECT_LOWER=$(echo "$REPO" | tr '[:upper:]-' '[:lower:]_') + CURRENT_YEAR=$(date +%Y) + CURRENT_DATE=$(date +%Y-%m-%d) + VERSION="0.1.0" + + # Derive citation name parts (best-effort split on last space) + AUTHOR_LAST="${AUTHOR##* }" + AUTHOR_FIRST="${AUTHOR% *}" + FIRST_INITIAL="${AUTHOR_FIRST:0:1}." + if [ "$AUTHOR_LAST" = "$AUTHOR_FIRST" ]; then + AUTHOR_FIRST="$AUTHOR" + AUTHOR_LAST="" + FIRST_INITIAL="" + fi + + echo "" + echo "── Summary ──────────────────────────────────────" + echo " Project: $PROJECT_NAME" + echo " Repo: $REPO" + echo " Owner: $OWNER" + echo " Author: $AUTHOR <$AUTHOR_EMAIL>" + [ -n "$AUTHOR_ORG" ] && echo " Organization: $AUTHOR_ORG" + echo " Forge: $FORGE" + echo " Year: $CURRENT_YEAR" + echo "────────────────────────────────────────────────" + echo "" + read -rp "Proceed? [Y/n] " CONFIRM + [[ "${CONFIRM:-Y}" =~ ^[Nn] ]] && echo "Aborted." && exit 0 + + echo "" + echo "Replacing placeholders..." + + # Brace tokens as variables (hex avoids just interpolation) + LB=$(printf '\x7b\x7b') + RB=$(printf '\x7d\x7d') + + # Build the sed expression list + # Note: using | as delimiter since URLs contain / + SED_ARGS=( + -e "s|${LB}PROJECT_NAME${RB}|${PROJECT_NAME}|g" + -e "s|${LB}PROJECT_DESCRIPTION${RB}|${PROJECT_DESCRIPTION}|g" + -e "s|${LB}PROJECT${RB}|${PROJECT_UPPER}|g" + -e "s|${LB}project${RB}|${PROJECT_LOWER}|g" + -e "s|${LB}REPO${RB}|${REPO}|g" + -e "s|${LB}OWNER${RB}|${OWNER}|g" + -e "s|${LB}AUTHOR${RB}|${AUTHOR}|g" + -e "s|${LB}AUTHOR_EMAIL${RB}|${AUTHOR_EMAIL}|g" + -e "s|${LB}AUTHOR_ORG${RB}|${AUTHOR_ORG}|g" + -e "s|${LB}AUTHOR_LAST${RB}|${AUTHOR_LAST}|g" + -e "s|${LB}AUTHOR_FIRST${RB}|${AUTHOR_FIRST}|g" + -e "s|${LB}AUTHOR_INITIALS${RB}|${FIRST_INITIAL}|g" + -e "s|${LB}FORGE${RB}|${FORGE}|g" + -e "s|${LB}CURRENT_YEAR${RB}|${CURRENT_YEAR}|g" + -e "s|${LB}CURRENT_DATE${RB}|${CURRENT_DATE}|g" + -e "s|${LB}DATE${RB}|${CURRENT_DATE}|g" + -e "s|${LB}SECURITY_EMAIL${RB}|${SECURITY_EMAIL}|g" + -e "s|${LB}CONDUCT_EMAIL${RB}|${CONDUCT_EMAIL}|g" + -e "s|${LB}LICENSE${RB}|MPL-2.0|g" + -e "s|${LB}CONDUCT_TEAM${RB}|Code of Conduct Committee|g" + -e "s|${LB}RESPONSE_TIME${RB}|48 hours|g" + -e "s|${LB}MAIN_BRANCH${RB}|main|g" + -e "s|${LB}PROJECT_PURPOSE${RB}|${PROJECT_DESCRIPTION}|g" + -e "s|${LB}PROJECT_ROLE${RB}|${PROJECT_TYPE}|g" + -e "s|${LB}PROJECT_TYPE${RB}|${PROJECT_TYPE}|g" + -e "s|${LB}WEBSITE${RB}|${WEBSITE}|g" + -e "s|${LB}SERVICE_NAME${RB}|${SERVICE_NAME}|g" + -e "s|${LB}PORT${RB}|${PORT}|g" + -e "s|${LB}REGISTRY${RB}|${REGISTRY}|g" + -e "s|${LB}IMAGE${RB}|${REGISTRY}/${SERVICE_NAME}|g" + -e "s|${LB}VERSION${RB}|${VERSION}|g" + -e "s|${LB}EMAIL${RB}|${AUTHOR_EMAIL}|g" + ) + [ -n "$AUTHOR_EMAIL_ALT" ] && SED_ARGS+=(-e "s|${LB}AUTHOR_EMAIL_ALT${RB}|${AUTHOR_EMAIL_ALT}|g") + + # Replace in all text files (skip .git, LICENSE text, and binaries) + find . -type f \ + -not -path './.git/*' \ + -not -name 'MPL-2.0.txt' \ + -not -name '*.png' -not -name '*.jpg' -not -name '*.gif' \ + -not -name '*.woff' -not -name '*.woff2' \ + | while read -r file; do + if file --brief "$file" | grep -qi 'text\|ascii\|utf'; then + sed -i "${SED_ARGS[@]}" "$file" + fi + done + + # Also replace [YOUR-REPO-NAME] and [YOUR-NAME/ORG] in AI manifest + sed -i "s|\[YOUR-REPO-NAME\]|${PROJECT_NAME}|g" 0-AI-MANIFEST.a2ml 2>/dev/null || true + sed -i "s|\[YOUR-NAME/ORG\]|${OWNER}|g" 0-AI-MANIFEST.a2ml 2>/dev/null || true + + echo "" + echo "── Validation ───────────────────────────────────" + + # Check for remaining placeholders + PATTERN="${LB}[A-Z_]*${RB}" + REMAINING=$(grep -rl "$PATTERN" . --include='*.md' --include='*.adoc' --include='*.yml' --include='*.yaml' --include='*.a2ml' --include='*.toml' --include='*.scm' --include='*.ncl' --include='*.nix' --include='*.json' --include='*.sh' 2>/dev/null | grep -v '.git/' | grep -v '.machine_readable/ai/PLACEHOLDERS.adoc' || true) + if [ -n "$REMAINING" ]; then + echo "WARNING: Remaining placeholders in:" + echo "$REMAINING" | sed 's/^/ /' + echo "" + echo "Run: grep -rn '$LB' . --include='*.md' to inspect" + else + echo "All placeholders replaced successfully!" + fi + + # K9-SVC validation (if available) + if command -v k9-svc >/dev/null 2>&1; then + echo "" + echo "Running k9-svc validation..." + k9-svc validate . 2>/dev/null || true + fi + + echo "" + echo "Done! Next steps:" + echo " 1. Review changes: git diff" + echo " 2. Remove template cruft: rm .machine_readable/ai/PLACEHOLDERS.adoc" + echo " 3. Customize README.adoc for your project" + echo " 4. Commit: git add -A && git commit -m 'feat: initialize from RSR template'" + echo " 5. Push: git remote add origin git@${FORGE}:${OWNER}/${REPO}.git && git push -u origin main" + +# ═══════════════════════════════════════════════════════════════════════════════ +# BUILD & COMPILE +# ═══════════════════════════════════════════════════════════════════════════════ + +# Build the project (debug mode) +build *args: + @echo "Building {{project}} (debug)..." + # TODO: Replace with your build command + # Examples: + # cargo build {{args}} # Rust + # mix compile {{args}} # Elixir + # zig build {{args}} # Zig + # deno task build {{args}} # Deno/ReScript + @echo "Build complete" + +# Build in release mode with optimizations +build-release *args: + @echo "Building {{project}} (release)..." + # TODO: Replace with your release build command + # Examples: + # cargo build --release {{args}} + # MIX_ENV=prod mix compile {{args}} + # zig build -Doptimize=ReleaseFast {{args}} + @echo "Release build complete" + +# Build and watch for changes (requires entr or similar) +build-watch: + @echo "Watching for changes..." + # TODO: Customize file patterns for your language + # Examples: + # find src -name '*.rs' | entr -c just build + # mix compile --force --warnings-as-errors + # deno task dev + +# Clean build artifacts [reversible: rebuild with `just build`] +clean: + @echo "Cleaning..." + # TODO: Customize for your build system + rm -rf target/ _build/ build/ dist/ out/ obj/ bin/ + +# Deep clean including caches [reversible: rebuild] +clean-all: clean + rm -rf .cache .tmp + +# ═══════════════════════════════════════════════════════════════════════════════ +# TEST & QUALITY +# ═══════════════════════════════════════════════════════════════════════════════ + +# Run all tests +test *args: + @echo "Running tests..." + # TODO: Replace with your test command + # Examples: + # cargo test {{args}} + # mix test {{args}} + # zig build test {{args}} + # deno test {{args}} + @echo "Tests passed!" + +# Run tests with verbose output +test-verbose: + @echo "Running tests (verbose)..." + # TODO: Replace with verbose test command + +# Smoke test +test-smoke: + @echo "Smoke test..." + # TODO: Add basic sanity checks + +# Run all quality checks +quality: fmt-check lint test + @echo "All quality checks passed!" + +# Fix all auto-fixable issues [reversible: git checkout] +fix: fmt + @echo "Fixed all auto-fixable issues" + +# ═══════════════════════════════════════════════════════════════════════════════ +# LINT & FORMAT +# ═══════════════════════════════════════════════════════════════════════════════ + +# Format all source files [reversible: git checkout] +fmt: + @echo "Formatting source files..." + # TODO: Replace with your formatter + # Examples: + # cargo fmt + # mix format + # gleam format + # deno fmt + +# Check formatting without changes +fmt-check: + @echo "Checking formatting..." + # TODO: Replace with your format check + # Examples: + # cargo fmt --check + # mix format --check-formatted + # gleam format --check + +# Run linter +lint: + @echo "Linting source files..." + # TODO: Replace with your linter + # Examples: + # cargo clippy -- -D warnings + # mix credo --strict + # gleam check + +# ═══════════════════════════════════════════════════════════════════════════════ +# RUN & EXECUTE +# ═══════════════════════════════════════════════════════════════════════════════ + +# Run the application +run *args: build + # TODO: Replace with your run command + echo "Run not configured yet" + +# Run with verbose output +run-verbose *args: build + # TODO: Replace with verbose run command + echo "Run not configured yet" + +# Install to user path +install: build-release + @echo "Installing {{project}}..." + # TODO: Replace with your install command + +# ═══════════════════════════════════════════════════════════════════════════════ +# DEPENDENCIES +# ═══════════════════════════════════════════════════════════════════════════════ + +# Install/check all dependencies +deps: + @echo "Checking dependencies..." + # TODO: Replace with your dependency check + # Examples: + # cargo check + # mix deps.get + # gleam deps download + @echo "All dependencies satisfied" + +# Audit dependencies for vulnerabilities +deps-audit: + @echo "Auditing for vulnerabilities..." + # TODO: Replace with your audit command + # Examples: + # cargo audit + # mix audit + @command -v trivy >/dev/null && trivy fs --severity HIGH,CRITICAL --quiet . || true + @command -v gitleaks >/dev/null && gitleaks detect --source . --no-git --quiet || true + @echo "Audit complete" + +# ═══════════════════════════════════════════════════════════════════════════════ +# DOCUMENTATION +# ═══════════════════════════════════════════════════════════════════════════════ + +# Generate all documentation +docs: + @mkdir -p docs/generated docs/man + just cookbook + just man + @echo "Documentation generated in docs/" + +# Generate justfile cookbook documentation +cookbook: + #!/usr/bin/env bash + mkdir -p docs + OUTPUT="docs/just-cookbook.adoc" + echo "= {{project}} Justfile Cookbook" > "$OUTPUT" + echo ":toc: left" >> "$OUTPUT" + echo ":toclevels: 3" >> "$OUTPUT" + echo "" >> "$OUTPUT" + echo "Generated: $(date -Iseconds)" >> "$OUTPUT" + echo "" >> "$OUTPUT" + echo "== Recipes" >> "$OUTPUT" + echo "" >> "$OUTPUT" + just --list --unsorted | while read -r line; do + if [[ "$line" =~ ^[[:space:]]+([a-z_-]+) ]]; then + recipe="${BASH_REMATCH[1]}" + echo "=== $recipe" >> "$OUTPUT" + echo "" >> "$OUTPUT" + echo "[source,bash]" >> "$OUTPUT" + echo "----" >> "$OUTPUT" + echo "just $recipe" >> "$OUTPUT" + echo "----" >> "$OUTPUT" + echo "" >> "$OUTPUT" + fi + done + echo "Generated: $OUTPUT" + +# Generate man page +man: + #!/usr/bin/env bash + mkdir -p docs/man + cat > docs/man/{{project}}.1 << EOF + .TH {{project}} 1 "$(date +%Y-%m-%d)" "{{version}}" "{{project}} Manual" + .SH NAME + {{project}} \- RSR-compliant project + .SH SYNOPSIS + .B just + [recipe] [args...] + .SH DESCRIPTION + RSR (Rhodium Standard Repository) project managed with just. + .SH AUTHOR + $(git config user.name 2>/dev/null || echo "Author") <$(git config user.email 2>/dev/null || echo "email")> + EOF + echo "Generated: docs/man/{{project}}.1" + +# ═══════════════════════════════════════════════════════════════════════════════ +# CONTAINERS (stapeln ecosystem — Podman + Chainguard Wolfi) +# ═══════════════════════════════════════════════════════════════════════════════ + +# Initialise container templates — substitute placeholders with project values +container-init: + #!/usr/bin/env bash + set -euo pipefail + + if [ ! -d "container" ]; then + echo "Error: container/ directory not found." + echo "This repo may not have been created from rsr-template-repo." + exit 1 + fi + + echo "=== Container Template Initialisation ===" + echo "" + + # Load RSR defaults if available + DEFAULTS="${XDG_CONFIG_HOME:-$HOME/.config}/rsr/defaults" + if [ -f "$DEFAULTS" ]; then + echo "Loading defaults from $DEFAULTS" + # shellcheck source=/dev/null + source "$DEFAULTS" + echo "" + fi + + # Prompt for container-specific values + read -rp "Service name (e.g. my-api) [{{project}}]: " _SERVICE_NAME + SERVICE_NAME="${_SERVICE_NAME:-{{project}}}" + + read -rp "Primary port [8080]: " _PORT + PORT="${_PORT:-8080}" + + read -rp "Container registry [ghcr.io/${OWNER:-{{OWNER}}}]: " _REGISTRY + REGISTRY="${_REGISTRY:-ghcr.io/${OWNER:-{{OWNER}}}}" + + echo "" + echo " Service: $SERVICE_NAME" + echo " Port: $PORT" + echo " Registry: $REGISTRY" + echo "" + read -rp "Proceed? [Y/n] " CONFIRM + [[ "${CONFIRM:-Y}" =~ ^[Nn] ]] && echo "Aborted." && exit 0 + + echo "" + echo "Replacing container placeholders..." + + # Brace tokens as variables (hex escapes avoid just interpolation) + LB=$(printf '\x7b\x7b') + RB=$(printf '\x7d\x7d') + + SED_ARGS=( + -e "s|${LB}SERVICE_NAME${RB}|${SERVICE_NAME}|g" + -e "s|${LB}PORT${RB}|${PORT}|g" + -e "s|${LB}REGISTRY${RB}|${REGISTRY}|g" + ) + + find container/ -type f | while read -r file; do + if file --brief "$file" | grep -qi 'text\|ascii\|utf'; then + sed -i "${SED_ARGS[@]}" "$file" + fi + done + + echo "Container templates initialised." + echo "" + echo "Next steps:" + echo " 1. Edit container/Containerfile — add your build commands" + echo " 2. Edit container/entrypoint.sh — set your application binary" + echo " 3. Review container/compose.toml — adjust services and volumes" + echo " 4. Build: just container-build" + +# Build container image via cerro-torre pipeline +container-build *args: + #!/usr/bin/env bash + if [ -f "container/ct-build.sh" ]; then + cd container && ./ct-build.sh {{args}} + elif [ -f "container/Containerfile" ]; then + podman build -t {{project}}:latest -f container/Containerfile . + elif [ -f "Containerfile" ]; then + podman build -t {{project}}:latest -f Containerfile . + else + echo "No Containerfile found in container/ or project root" + exit 1 + fi + +# Verify compose configuration +container-verify: + #!/usr/bin/env bash + if [ ! -f "container/compose.toml" ]; then + echo "No container/compose.toml found" + exit 1 + fi + cd container + if command -v selur-compose &>/dev/null; then + selur-compose verify + else + echo "selur-compose not found, falling back to podman compose" + podman compose --file compose.toml config + fi + +# Start container stack +container-up *args: + #!/usr/bin/env bash + if [ ! -f "container/compose.toml" ]; then + echo "No container/compose.toml found" + exit 1 + fi + cd container + if command -v selur-compose &>/dev/null; then + selur-compose up {{args}} + else + podman compose --file compose.toml up {{args}} + fi + +# Stop container stack +container-down: + #!/usr/bin/env bash + cd container 2>/dev/null || { echo "No container/ directory"; exit 1; } + if command -v selur-compose &>/dev/null; then + selur-compose down + else + podman compose --file compose.toml down + fi + +# Sign and verify container bundle (build + pack + sign + verify) +container-sign: + #!/usr/bin/env bash + if [ -f "container/ct-build.sh" ]; then + cd container && ./ct-build.sh + else + echo "No container/ct-build.sh found" + exit 1 + fi + +# Push signed bundle to registry +container-push: + #!/usr/bin/env bash + if [ -f "container/ct-build.sh" ]; then + cd container && ./ct-build.sh --push + else + echo "No container/ct-build.sh found — falling back to podman push" + podman push {{project}}:latest + fi + +# Run container interactively (for debugging) +container-run *args: + podman run --rm -it {{project}}:latest {{args}} + +# ═══════════════════════════════════════════════════════════════════════════════ +# CI & AUTOMATION +# ═══════════════════════════════════════════════════════════════════════════════ + +# Run full CI pipeline locally +ci: deps quality + @echo "CI pipeline complete!" + +# Install git hooks +install-hooks: + @mkdir -p .git/hooks + @cat > .git/hooks/pre-commit << 'HOOKEOF' + #!/bin/bash + just fmt-check || exit 1 + just lint || exit 1 + HOOKEOF + @chmod +x .git/hooks/pre-commit + @echo "Git hooks installed" + +# ═══════════════════════════════════════════════════════════════════════════════ +# SECURITY +# ═══════════════════════════════════════════════════════════════════════════════ + +# Run security audit +security: deps-audit + @echo "=== Security Audit ===" + @command -v gitleaks >/dev/null && gitleaks detect --source . --verbose || true + @command -v trivy >/dev/null && trivy fs --severity HIGH,CRITICAL . || true + @echo "Security audit complete" + +# Generate SBOM +sbom: + @mkdir -p docs/security + @command -v syft >/dev/null && syft . -o spdx-json > docs/security/sbom.spdx.json || echo "syft not found" + +# ═══════════════════════════════════════════════════════════════════════════════ +# VALIDATION & COMPLIANCE +# ═══════════════════════════════════════════════════════════════════════════════ + +# Validate RSR compliance +validate-rsr: + #!/usr/bin/env bash + echo "=== RSR Compliance Check ===" + MISSING="" + for f in .editorconfig .gitignore Justfile README.adoc LICENSE 0-AI-MANIFEST.a2ml; do + [ -f "$f" ] || MISSING="$MISSING $f" + done + for f in .machine_readable/STATE.a2ml .machine_readable/META.a2ml .machine_readable/ECOSYSTEM.a2ml .machine_readable/anchors/ANCHOR.a2ml .machine_readable/policies/MAINTENANCE-AXES.a2ml .machine_readable/policies/MAINTENANCE-CHECKLIST.a2ml .machine_readable/policies/SOFTWARE-DEVELOPMENT-APPROACH.a2ml; do + [ -f "$f" ] || MISSING="$MISSING $f" + done + for f in licensing/exhibits/EXHIBIT-A-ETHICAL-USE.txt licensing/exhibits/EXHIBIT-B-QUANTUM-SAFE.txt licensing/texts/MPL-2.0.txt; do + [ -f "$f" ] || MISSING="$MISSING $f" + done + for f in src/interface/abi src/interface/ffi src/interface/generated; do + [ -d "$f" ] || MISSING="$MISSING $f" + done + for f in docs/maintenance/MAINTENANCE-CHECKLIST.adoc docs/practice/SOFTWARE-DEVELOPMENT-APPROACH.adoc; do + [ -f "$f" ] || MISSING="$MISSING $f" + done + if [ -f ".machine_readable/META.a2ml" ]; then + grep -q 'axis-1 = "must > intend > like"' .machine_readable/META.a2ml || MISSING="$MISSING META.a2ml:axis-1" + grep -q 'axis-2 = "corrective > adaptive > perfective"' .machine_readable/META.a2ml || MISSING="$MISSING META.a2ml:axis-2" + grep -q 'axis-3 = "systems > compliance > effects"' .machine_readable/META.a2ml || MISSING="$MISSING META.a2ml:axis-3" + grep -q 'scoping-first = true' .machine_readable/META.a2ml || MISSING="$MISSING META.a2ml:scoping-first" + grep -q 'idris-unsound-scan = "believe_me/assert_total"' .machine_readable/META.a2ml || MISSING="$MISSING META.a2ml:idris-unsound-scan" + grep -q 'audit-focus = "systems in place, documentation explains actual state, safety/security accounted for, observed effects reviewed"' .machine_readable/META.a2ml || MISSING="$MISSING META.a2ml:audit-focus" + grep -q 'compliance-focus = "seams/compromises/exception register, bounded exceptions, anti-drift checks"' .machine_readable/META.a2ml || MISSING="$MISSING META.a2ml:compliance-focus" + grep -q 'effects-evidence = "benchmark execution/results and maintainer status dialogue/review"' .machine_readable/META.a2ml || MISSING="$MISSING META.a2ml:effects-evidence" + grep -q 'compliance-tooling = "panic-attack"' .machine_readable/policies/MAINTENANCE-AXES.a2ml || MISSING="$MISSING MAINTENANCE-AXES.a2ml:compliance-tooling" + grep -q 'effects-tooling = "ecological checking with sustainabot guidance"' .machine_readable/policies/MAINTENANCE-AXES.a2ml || MISSING="$MISSING MAINTENANCE-AXES.a2ml:effects-tooling" + grep -q 'source-human = "docs/maintenance/MAINTENANCE-CHECKLIST.adoc"' .machine_readable/policies/MAINTENANCE-CHECKLIST.a2ml || MISSING="$MISSING MAINTENANCE-CHECKLIST.a2ml:source-human" + grep -q 'source-human = "docs/practice/SOFTWARE-DEVELOPMENT-APPROACH.adoc"' .machine_readable/policies/SOFTWARE-DEVELOPMENT-APPROACH.a2ml || MISSING="$MISSING SOFTWARE-DEVELOPMENT-APPROACH.a2ml:source-human" + fi + if [ -n "$MISSING" ]; then + echo "MISSING:$MISSING" + exit 1 + fi + echo "RSR compliance: PASS" + +# Validate STATE.a2ml syntax +validate-state: + @if [ -f ".machine_readable/STATE.a2ml" ]; then \ + grep -q '^\[metadata\]' .machine_readable/STATE.a2ml && \ + grep -q 'project\s*=' .machine_readable/STATE.a2ml && \ + echo "STATE.a2ml: valid" || echo "STATE.a2ml: INVALID (missing required sections)"; \ + else \ + echo "No .machine_readable/STATE.a2ml found"; \ + fi + +# Validate AI installation guide completeness (finishbot pre-release check) +validate-ai-install: + #!/usr/bin/env bash + echo "=== AI Installation Guide Check ===" + GUIDE="docs/AI_INSTALLATION_GUIDE.adoc" + README="README.adoc" + ERRORS=0 + + # Check guide exists + if [ ! -f "$GUIDE" ]; then + echo "MISSING: $GUIDE (create from template: docs/AI_INSTALLATION_GUIDE.adoc)" + ERRORS=$((ERRORS + 1)) + else + # Check for unfilled TODO markers + TODOS=$(grep -c '\[TODO-AI-INSTALL' "$GUIDE" 2>/dev/null || true) + if [ "$TODOS" -gt 0 ]; then + echo "INCOMPLETE: $GUIDE has $TODOS unfilled [TODO-AI-INSTALL] markers:" + grep -n '\[TODO-AI-INSTALL' "$GUIDE" | head -10 + ERRORS=$((ERRORS + 1)) + else + echo "$GUIDE: complete (no TODO markers)" + fi + + # Check AI implementation section exists + if ! grep -q 'ai-implementation' "$GUIDE" 2>/dev/null; then + echo "MISSING: [[ai-implementation]] anchor in $GUIDE" + ERRORS=$((ERRORS + 1)) + fi + + # Check privacy notice exists + if ! grep -qi 'privacy' "$GUIDE" 2>/dev/null; then + echo "MISSING: Privacy notice in $GUIDE" + ERRORS=$((ERRORS + 1)) + fi + + # Check install commands exist (not just placeholders) + if ! grep -q 'git clone' "$GUIDE" 2>/dev/null; then + echo "WARNING: No git clone command found in $GUIDE -- install commands may be incomplete" + fi + fi + + # Check README has AI install section + if [ -f "$README" ]; then + if ! grep -qi 'AI-Assisted Installation' "$README" 2>/dev/null; then + echo "MISSING: AI-Assisted Installation section in $README" + echo " Copy from docs/AI-INSTALL-README-SECTION.adoc" + ERRORS=$((ERRORS + 1)) + fi + + # Check README for unfilled TODO markers + README_TODOS=$(grep -c '\[TODO-AI-INSTALL' "$README" 2>/dev/null || true) + if [ "$README_TODOS" -gt 0 ]; then + echo "INCOMPLETE: $README has $README_TODOS unfilled [TODO-AI-INSTALL] markers" + ERRORS=$((ERRORS + 1)) + fi + fi + + if [ "$ERRORS" -gt 0 ]; then + echo "" + echo "AI install guide: FAIL ($ERRORS issues)" + exit 1 + fi + echo "AI install guide: PASS" + +# Full validation suite +validate: validate-rsr validate-state validate-ai-install + @echo "All validations passed!" + +# ═══════════════════════════════════════════════════════════════════════════════ +# STATE MANAGEMENT +# ═══════════════════════════════════════════════════════════════════════════════ + +# Update STATE.a2ml timestamp +state-touch: + @if [ -f ".machine_readable/STATE.a2ml" ]; then \ + sed -i 's/last-updated = "[^"]*"/last-updated = "'"$(date +%Y-%m-%d)"'"/' .machine_readable/STATE.a2ml && \ + echo "STATE.a2ml timestamp updated"; \ + fi + +# Show current phase from STATE.a2ml +state-phase: + @grep -oP 'phase\s*=\s*"\K[^"]+' .machine_readable/STATE.a2ml 2>/dev/null | head -1 || echo "unknown" + +# ═══════════════════════════════════════════════════════════════════════════════ +# GUIX & NIX +# ═══════════════════════════════════════════════════════════════════════════════ + +# Enter Guix development shell (primary) +guix-shell: + guix shell -D -f guix.scm + +# Build with Guix +guix-build: + guix build -f guix.scm + +# Enter Nix development shell (fallback) +nix-shell: + @if [ -f "flake.nix" ]; then nix develop; else echo "No flake.nix"; fi + +# ═══════════════════════════════════════════════════════════════════════════════ +# HYBRID AUTOMATION +# ═══════════════════════════════════════════════════════════════════════════════ + +# Run local automation tasks +automate task="all": + #!/usr/bin/env bash + case "{{task}}" in + all) just fmt && just lint && just test && just docs && just state-touch ;; + cleanup) just clean && find . -name "*.orig" -delete && find . -name "*~" -delete ;; + update) just deps && just validate ;; + *) echo "Unknown: {{task}}. Use: all, cleanup, update" && exit 1 ;; + esac + +# ═══════════════════════════════════════════════════════════════════════════════ +# COMBINATORIC MATRIX RECIPES +# ═══════════════════════════════════════════════════════════════════════════════ + +# Build matrix: [debug|release] x [target] x [features] +build-matrix mode="debug" target="" features="": + @echo "Build matrix: mode={{mode}} target={{target}} features={{features}}" + +# Test matrix: [unit|integration|e2e|all] x [verbosity] x [parallel] +test-matrix suite="unit" verbosity="normal" parallel="true": + @echo "Test matrix: suite={{suite}} verbosity={{verbosity}} parallel={{parallel}}" + +# Container matrix: [build|run|push|shell|scan] x [registry] x [tag] +container-matrix action="build" registry="ghcr.io/{{OWNER}}" tag="latest": + @echo "Container matrix: action={{action}} registry={{registry}} tag={{tag}}" + +# CI matrix: [lint|test|build|security|all] x [quick|full] +ci-matrix stage="all" depth="quick": + @echo "CI matrix: stage={{stage}} depth={{depth}}" + +# Show all matrix combinations +combinations: + @echo "=== Combinatoric Matrix Recipes ===" + @echo "" + @echo "Build Matrix: just build-matrix [debug|release] [target] [features]" + @echo "Test Matrix: just test-matrix [unit|integration|e2e|all] [verbosity] [parallel]" + @echo "Container: just container-matrix [build|run|push|shell|scan] [registry] [tag]" + @echo "CI Matrix: just ci-matrix [lint|test|build|security|all] [quick|full]" + +# ═══════════════════════════════════════════════════════════════════════════════ +# VERSION CONTROL +# ═══════════════════════════════════════════════════════════════════════════════ + +# Show git status +status: + @git status --short + +# Show recent commits +log count="20": + @git log --oneline -{{count}} + +# Generate CHANGELOG.md with git-cliff +changelog: + @command -v git-cliff >/dev/null || { echo "git-cliff not found — install: cargo install git-cliff"; exit 1; } + git cliff --config .machine_readable/configs/git-cliff/cliff.toml --output CHANGELOG.md + @echo "Generated CHANGELOG.md" + +# Preview changelog for unreleased commits (does not write) +changelog-preview: + @command -v git-cliff >/dev/null || { echo "git-cliff not found — install: cargo install git-cliff"; exit 1; } + git cliff --config .machine_readable/configs/git-cliff/cliff.toml --unreleased --strip header + +# Tag a new release (usage: just release-tag 1.2.3) +release-tag version: + #!/usr/bin/env bash + TAG="v{{version}}" + if git rev-parse "$TAG" >/dev/null 2>&1; then + echo "Tag $TAG already exists" + exit 1 + fi + just changelog + git add CHANGELOG.md + git commit -m "chore(release): prepare $TAG" + git tag -a "$TAG" -m "Release $TAG" + echo "Created tag $TAG — push with: git push origin main --tags" + +# ═══════════════════════════════════════════════════════════════════════════════ +# UTILITIES +# ═══════════════════════════════════════════════════════════════════════════════ + +# Count lines of code +loc: + @find . \( -name "*.rs" -o -name "*.ex" -o -name "*.exs" -o -name "*.res" -o -name "*.gleam" -o -name "*.zig" -o -name "*.idr" -o -name "*.hs" -o -name "*.ncl" -o -name "*.scm" -o -name "*.adb" -o -name "*.ads" \) -not -path './target/*' -not -path './_build/*' 2>/dev/null | xargs wc -l 2>/dev/null | tail -1 || echo "0" + +# Show TODO comments +todos: + @grep -rn "TODO\|FIXME\|HACK\|XXX" --include="*.rs" --include="*.ex" --include="*.res" --include="*.gleam" --include="*.zig" --include="*.idr" --include="*.hs" . 2>/dev/null || echo "No TODOs" + +# Open in editor +edit: + ${EDITOR:-code} . + +# Run high-rigor security assault using panic-attacker +maint-assault: + @./.machine_readable/scripts/maintenance/maint-assault.sh + +# [AUTO-GENERATED] Multi-arch / RISC-V target +build-riscv: + @echo "Building for RISC-V..." + cross build --target riscv64gc-unknown-linux-gnu + +# Run panic-attacker pre-commit scan +assail: + @command -v panic-attack >/dev/null 2>&1 && panic-attack assail . || echo "panic-attack not found — install from https://github.com/hyperpolymath/panic-attacker" + +# ═══════════════════════════════════════════════════════════════════════════════ +# ONBOARDING & DIAGNOSTICS +# ═══════════════════════════════════════════════════════════════════════════════ + +# Check all required toolchain dependencies and report health +doctor: + #!/usr/bin/env bash + echo "═══════════════════════════════════════════════════" + echo " A2Ml Rs Doctor — Toolchain Health Check" + echo "═══════════════════════════════════════════════════" + echo "" + PASS=0; FAIL=0; WARN=0 + check() { + local name="$1" cmd="$2" min="$3" + if command -v "$cmd" >/dev/null 2>&1; then + VER=$("$cmd" --version 2>&1 | head -1) + echo " [OK] $name — $VER" + PASS=$((PASS + 1)) + else + echo " [FAIL] $name — not found (need $min+)" + FAIL=$((FAIL + 1)) + fi + } + check "just" just "1.25" + check "git" git "2.40" + check "Rust (cargo)" cargo "1.80" +# Optional tools +if command -v panic-attack >/dev/null 2>&1; then + echo " [OK] panic-attack — available" + PASS=$((PASS + 1)) +else + echo " [WARN] panic-attack — not found (pre-commit scanner)" + WARN=$((WARN + 1)) +fi + echo "" + echo " Result: $PASS passed, $FAIL failed, $WARN warnings" + if [ "$FAIL" -gt 0 ]; then + echo " Run 'just heal' to attempt automatic repair." + exit 1 + fi + echo " All required tools present." + +# Attempt to automatically install missing tools +heal: + #!/usr/bin/env bash + echo "═══════════════════════════════════════════════════" + echo " A2Ml Rs Heal — Automatic Tool Installation" + echo "═══════════════════════════════════════════════════" + echo "" +if ! command -v cargo >/dev/null 2>&1; then + echo "Installing Rust via rustup..." + curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y + source "$HOME/.cargo/env" +fi +if ! command -v just >/dev/null 2>&1; then + echo "Installing just..." + cargo install just 2>/dev/null || echo "Install just from https://just.systems" +fi + echo "" + echo "Heal complete. Run 'just doctor' to verify." + +# Guided tour of the project structure and key concepts +tour: + #!/usr/bin/env bash + echo "═══════════════════════════════════════════════════" + echo " A2Ml Rs — Guided Tour" + echo "═══════════════════════════════════════════════════" + echo "" + echo '**AI-Assisted Install:** Just tell any AI assistant: +' + echo "" + echo "Key directories:" + echo " src/ Source code" + echo " docs/ Documentation" + echo " tests/ Test suite" + echo " .github/workflows/ CI/CD workflows" + echo " .machine_readable/ Machine-readable metadata" + echo " container/ Container configuration" + echo " examples/ Usage examples" + echo "" + echo "Quick commands:" + echo " just doctor Check toolchain health" + echo " just heal Fix missing tools" + echo " just help-me Common workflows" + echo " just default List all recipes" + echo "" + echo "Read more: README.adoc, EXPLAINME.adoc" + +# Show help for common workflows +help-me: + #!/usr/bin/env bash + echo "═══════════════════════════════════════════════════" + echo " A2Ml Rs — Common Workflows" + echo "═══════════════════════════════════════════════════" + echo "" +echo "FIRST TIME SETUP:" +echo " just doctor Check toolchain" +echo " just heal Fix missing tools" +echo "" + echo "DEVELOPMENT:" + echo " cargo build Build the project" + echo " cargo test Run tests" + echo "" +echo "PRE-COMMIT:" +echo " just assail Run panic-attacker scan" +echo "" +echo "LEARN:" +echo " just tour Guided project tour" +echo " just default List all recipes" + + +# Print the current CRG grade (reads from READINESS.md '**Current Grade:** X' line) +crg-grade: + @grade=$$(grep -oP '(?<=\*\*Current Grade:\*\* )[A-FX]' READINESS.md 2>/dev/null | head -1); \ + [ -z "$$grade" ] && grade="X"; \ + echo "$$grade" + +# Generate a shields.io badge markdown for the current CRG grade +# Looks for '**Current Grade:** X' in READINESS.md; falls back to X +crg-badge: + @grade=$$(grep -oP '(?<=\*\*Current Grade:\*\* )[A-FX]' READINESS.md 2>/dev/null | head -1); \ + [ -z "$$grade" ] && grade="X"; \ + case "$$grade" in \ + A) color="brightgreen" ;; B) color="green" ;; C) color="yellow" ;; \ + D) color="orange" ;; E) color="red" ;; F) color="critical" ;; \ + *) color="lightgrey" ;; esac; \ + echo "[![CRG $$grade](https://img.shields.io/badge/CRG-$$grade-$$color?style=flat-square)](https://github.com/hyperpolymath/standards/tree/main/component-readiness-grades)" diff --git a/rs/LICENSE b/rs/LICENSE new file mode 100644 index 0000000..14e2f77 --- /dev/null +++ b/rs/LICENSE @@ -0,0 +1,373 @@ +Mozilla Public License Version 2.0 +================================== + +1. Definitions +-------------- + +1.1. "Contributor" + means each individual or legal entity that creates, contributes to + the creation of, or owns Covered Software. + +1.2. "Contributor Version" + means the combination of the Contributions of others (if any) used + by a Contributor and that particular Contributor's Contribution. + +1.3. "Contribution" + means Covered Software of a particular Contributor. + +1.4. "Covered Software" + means Source Code Form to which the initial Contributor has attached + the notice in Exhibit A, the Executable Form of such Source Code + Form, and Modifications of such Source Code Form, in each case + including portions thereof. + +1.5. "Incompatible With Secondary Licenses" + means + + (a) that the initial Contributor has attached the notice described + in Exhibit B to the Covered Software; or + + (b) that the Covered Software was made available under the terms of + version 1.1 or earlier of the License, but not also under the + terms of a Secondary License. + +1.6. "Executable Form" + means any form of the work other than Source Code Form. + +1.7. "Larger Work" + means a work that combines Covered Software with other material, in + a separate file or files, that is not Covered Software. + +1.8. "License" + means this document. + +1.9. "Licensable" + means having the right to grant, to the maximum extent possible, + whether at the time of the initial grant or subsequently, any and + all of the rights conveyed by this License. + +1.10. "Modifications" + means any of the following: + + (a) any file in Source Code Form that results from an addition to, + deletion from, or modification of the contents of Covered + Software; or + + (b) any new file in Source Code Form that contains any Covered + Software. + +1.11. "Patent Claims" of a Contributor + means any patent claim(s), including without limitation, method, + process, and apparatus claims, in any patent Licensable by such + Contributor that would be infringed, but for the grant of the + License, by the making, using, selling, offering for sale, having + made, import, or transfer of either its Contributions or its + Contributor Version. + +1.12. "Secondary License" + means either the GNU General Public License, Version 2.0, the GNU + Lesser General Public License, Version 2.1, the GNU Affero General + Public License, Version 3.0, or any later versions of those + licenses. + +1.13. "Source Code Form" + means the form of the work preferred for making modifications. + +1.14. "You" (or "Your") + means an individual or a legal entity exercising rights under this + License. For legal entities, "You" includes any entity that + controls, is controlled by, or is under common control with You. For + purposes of this definition, "control" means (a) the power, direct + or indirect, to cause the direction or management of such entity, + whether by contract or otherwise, or (b) ownership of more than + fifty percent (50%) of the outstanding shares or beneficial + ownership of such entity. + +2. License Grants and Conditions +-------------------------------- + +2.1. Grants + +Each Contributor hereby grants You a world-wide, royalty-free, +non-exclusive license: + +(a) under intellectual property rights (other than patent or trademark) + Licensable by such Contributor to use, reproduce, make available, + modify, display, perform, distribute, and otherwise exploit its + Contributions, either on an unmodified basis, with Modifications, or + as part of a Larger Work; and + +(b) under Patent Claims of such Contributor to make, use, sell, offer + for sale, have made, import, and otherwise transfer either its + Contributions or its Contributor Version. + +2.2. Effective Date + +The licenses granted in Section 2.1 with respect to any Contribution +become effective for each Contribution on the date the Contributor first +distributes such Contribution. + +2.3. Limitations on Grant Scope + +The licenses granted in this Section 2 are the only rights granted under +this License. No additional rights or licenses will be implied from the +distribution or licensing of Covered Software under this License. +Notwithstanding Section 2.1(b) above, no patent license is granted by a +Contributor: + +(a) for any code that a Contributor has removed from Covered Software; + or + +(b) for infringements caused by: (i) Your and any other third party's + modifications of Covered Software, or (ii) the combination of its + Contributions with other software (except as part of its Contributor + Version); or + +(c) under Patent Claims infringed by Covered Software in the absence of + its Contributions. + +This License does not grant any rights in the trademarks, service marks, +or logos of any Contributor (except as may be necessary to comply with +the notice requirements in Section 3.4). + +2.4. Subsequent Licenses + +No Contributor makes additional grants as a result of Your choice to +distribute the Covered Software under a subsequent version of this +License (see Section 10.2) or under the terms of a Secondary License (if +permitted under the terms of Section 3.3). + +2.5. Representation + +Each Contributor represents that the Contributor believes its +Contributions are its original creation(s) or it has sufficient rights +to grant the rights to its Contributions conveyed by this License. + +2.6. Fair Use + +This License is not intended to limit any rights You have under +applicable copyright doctrines of fair use, fair dealing, or other +equivalents. + +2.7. Conditions + +Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted +in Section 2.1. + +3. Responsibilities +------------------- + +3.1. Distribution of Source Form + +All distribution of Covered Software in Source Code Form, including any +Modifications that You create or to which You contribute, must be under +the terms of this License. You must inform recipients that the Source +Code Form of the Covered Software is governed by the terms of this +License, and how they can obtain a copy of this License. You may not +attempt to alter or restrict the recipients' rights in the Source Code +Form. + +3.2. Distribution of Executable Form + +If You distribute Covered Software in Executable Form then: + +(a) such Covered Software must also be made available in Source Code + Form, as described in Section 3.1, and You must inform recipients of + the Executable Form how they can obtain a copy of such Source Code + Form by reasonable means in a timely manner, at a charge no more + than the cost of distribution to the recipient; and + +(b) You may distribute such Executable Form under the terms of this + License, or sublicense it under different terms, provided that the + license for the Executable Form does not attempt to limit or alter + the recipients' rights in the Source Code Form under this License. + +3.3. Distribution of a Larger Work + +You may create and distribute a Larger Work under terms of Your choice, +provided that You also comply with the requirements of this License for +the Covered Software. If the Larger Work is a combination of Covered +Software with a work governed by one or more Secondary Licenses, and the +Covered Software is not Incompatible With Secondary Licenses, this +License permits You to additionally distribute such Covered Software +under the terms of such Secondary License(s), so that the recipient of +the Larger Work may, at their option, further distribute the Covered +Software under the terms of either this License or such Secondary +License(s). + +3.4. Notices + +You may not remove or alter the substance of any license notices +(including copyright notices, patent notices, disclaimers of warranty, +or limitations of liability) contained within the Source Code Form of +the Covered Software, except that You may alter any license notices to +the extent required to remedy known factual inaccuracies. + +3.5. Application of Additional Terms + +You may choose to offer, and to charge a fee for, warranty, support, +indemnity or liability obligations to one or more recipients of Covered +Software. However, You may do so only on Your own behalf, and not on +behalf of any Contributor. You must make it absolutely clear that any +such warranty, support, indemnity, or liability obligation is offered by +You alone, and You hereby agree to indemnify every Contributor for any +liability incurred by such Contributor as a result of warranty, support, +indemnity or liability terms You offer. You may include additional +disclaimers of warranty and limitations of liability specific to any +jurisdiction. + +4. Inability to Comply Due to Statute or Regulation +--------------------------------------------------- + +If it is impossible for You to comply with any of the terms of this +License with respect to some or all of the Covered Software due to +statute, judicial order, or regulation then You must: (a) comply with +the terms of this License to the maximum extent possible; and (b) +describe the limitations and the code they affect. Such description must +be placed in a text file included with all distributions of the Covered +Software under this License. Except to the extent prohibited by statute +or regulation, such description must be sufficiently detailed for a +recipient of ordinary skill to be able to understand it. + +5. Termination +-------------- + +5.1. The rights granted under this License will terminate automatically +if You fail to comply with any of its terms. However, if You become +compliant, then the rights granted under this License from a particular +Contributor are reinstated (a) provisionally, unless and until such +Contributor explicitly and finally terminates Your grants, and (b) on an +ongoing basis, if such Contributor fails to notify You of the +non-compliance by some reasonable means prior to 60 days after You have +come back into compliance. Moreover, Your grants from a particular +Contributor are reinstated on an ongoing basis if such Contributor +notifies You of the non-compliance by some reasonable means, this is the +first time You have received notice of non-compliance with this License +from such Contributor, and You become compliant prior to 30 days after +Your receipt of the notice. + +5.2. If You initiate litigation against any entity by asserting a patent +infringement claim (excluding declaratory judgment actions, +counter-claims, and cross-claims) alleging that a Contributor Version +directly or indirectly infringes any patent, then the rights granted to +You by any and all Contributors for the Covered Software under Section +2.1 of this License shall terminate. + +5.3. In the event of termination under Sections 5.1 or 5.2 above, all +end user license agreements (excluding distributors and resellers) which +have been validly granted by You or Your distributors under this License +prior to termination shall survive termination. + +************************************************************************ +* * +* 6. Disclaimer of Warranty * +* ------------------------- * +* * +* Covered Software is provided under this License on an "as is" * +* basis, without warranty of any kind, either expressed, implied, or * +* statutory, including, without limitation, warranties that the * +* Covered Software is free of defects, merchantable, fit for a * +* particular purpose or non-infringing. The entire risk as to the * +* quality and performance of the Covered Software is with You. * +* Should any Covered Software prove defective in any respect, You * +* (not any Contributor) assume the cost of any necessary servicing, * +* repair, or correction. This disclaimer of warranty constitutes an * +* essential part of this License. No use of any Covered Software is * +* authorized under this License except under this disclaimer. * +* * +************************************************************************ + +************************************************************************ +* * +* 7. Limitation of Liability * +* -------------------------- * +* * +* Under no circumstances and under no legal theory, whether tort * +* (including negligence), contract, or otherwise, shall any * +* Contributor, or anyone who distributes Covered Software as * +* permitted above, be liable to You for any direct, indirect, * +* special, incidental, or consequential damages of any character * +* including, without limitation, damages for lost profits, loss of * +* goodwill, work stoppage, computer failure or malfunction, or any * +* and all other commercial damages or losses, even if such party * +* shall have been informed of the possibility of such damages. This * +* limitation of liability shall not apply to liability for death or * +* personal injury resulting from such party's negligence to the * +* extent applicable law prohibits such limitation. Some * +* jurisdictions do not allow the exclusion or limitation of * +* incidental or consequential damages, so this exclusion and * +* limitation may not apply to You. * +* * +************************************************************************ + +8. Litigation +------------- + +Any litigation relating to this License may be brought only in the +courts of a jurisdiction where the defendant maintains its principal +place of business and such litigation shall be governed by laws of that +jurisdiction, without reference to its conflict-of-law provisions. +Nothing in this Section shall prevent a party's ability to bring +cross-claims or counter-claims. + +9. Miscellaneous +---------------- + +This License represents the complete agreement concerning the subject +matter hereof. If any provision of this License is held to be +unenforceable, such provision shall be reformed only to the extent +necessary to make it enforceable. Any law or regulation which provides +that the language of a contract shall be construed against the drafter +shall not be used to construe this License against a Contributor. + +10. Versions of the License +--------------------------- + +10.1. New Versions + +Mozilla Foundation is the license steward. Except as provided in Section +10.3, no one other than the license steward has the right to modify or +publish new versions of this License. Each version will be given a +distinguishing version number. + +10.2. Effect of New Versions + +You may distribute the Covered Software under the terms of the version +of the License under which You originally received the Covered Software, +or under the terms of any subsequent version published by the license +steward. + +10.3. Modified Versions + +If you create software not governed by this License, and you want to +create a new license for such software, you may create and use a +modified version of this License if you rename the license and remove +any references to the name of the license steward (except to note that +such modified license differs from this License). + +10.4. Distributing Source Code Form that is Incompatible With Secondary +Licenses + +If You choose to distribute Source Code Form that is Incompatible With +Secondary Licenses under the terms of this version of the License, the +notice described in Exhibit B of this License must be attached. + +Exhibit A - Source Code Form License Notice +------------------------------------------- + + This Source Code Form is subject to the terms of the Mozilla Public + License, v. 2.0. If a copy of the MPL was not distributed with this + file, You can obtain one at http://mozilla.org/MPL/2.0/. + +If it is not possible or desirable to put the notice in a particular +file, then You may include the notice in a location (such as a LICENSE +file in a relevant directory) where a recipient would be likely to look +for such a notice. + +You may add additional accurate notices of copyright ownership. + +Exhibit B - "Incompatible With Secondary Licenses" Notice +--------------------------------------------------------- + + This Source Code Form is "Incompatible With Secondary Licenses", as + defined by the Mozilla Public License, v. 2.0. diff --git a/rs/LICENSES/AGPL-3.0-or-later.txt b/rs/LICENSES/AGPL-3.0-or-later.txt new file mode 100644 index 0000000..be3f7b2 --- /dev/null +++ b/rs/LICENSES/AGPL-3.0-or-later.txt @@ -0,0 +1,661 @@ + GNU AFFERO GENERAL PUBLIC LICENSE + Version 3, 19 November 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU Affero General Public License is a free, copyleft license for +software and other kinds of works, specifically designed to ensure +cooperation with the community in the case of network server software. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +our General Public Licenses are intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + Developers that use our General Public Licenses protect your rights +with two steps: (1) assert copyright on the software, and (2) offer +you this License which gives you legal permission to copy, distribute +and/or modify the software. + + A secondary benefit of defending all users' freedom is that +improvements made in alternate versions of the program, if they +receive widespread use, become available for other developers to +incorporate. Many developers of free software are heartened and +encouraged by the resulting cooperation. However, in the case of +software used on network servers, this result may fail to come about. +The GNU General Public License permits making a modified version and +letting the public access it on a server without ever releasing its +source code to the public. + + The GNU Affero General Public License is designed specifically to +ensure that, in such cases, the modified source code becomes available +to the community. It requires the operator of a network server to +provide the source code of the modified version running there to the +users of that server. Therefore, public use of a modified version, on +a publicly accessible server, gives the public access to the source +code of the modified version. + + An older license, called the Affero General Public License and +published by Affero, was designed to accomplish similar goals. This is +a different license, not a version of the Affero GPL, but Affero has +released a new version of the Affero GPL which permits relicensing under +this license. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU Affero General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Remote Network Interaction; Use with the GNU General Public License. + + Notwithstanding any other provision of this License, if you modify the +Program, your modified version must prominently offer all users +interacting with it remotely through a computer network (if your version +supports such interaction) an opportunity to receive the Corresponding +Source of your version by providing access to the Corresponding Source +from a network server at no charge, through some standard or customary +means of facilitating copying of software. This Corresponding Source +shall include the Corresponding Source for any work covered by version 3 +of the GNU General Public License that is incorporated pursuant to the +following paragraph. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the work with which it is combined will remain governed by version +3 of the GNU General Public License. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU Affero General Public License from time to time. Such new versions +will be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU Affero General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU Affero General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU Affero General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If your software can interact with users remotely through a computer +network, you should also make sure that it provides a way for users to +get its source. For example, if your program is a web application, its +interface could display a "Source" link that leads users to an archive +of the code. There are many ways you could offer source, and different +solutions will be better for different programs; see section 13 for the +specific requirements. + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU AGPL, see +. diff --git a/rs/LICENSES/CC-BY-SA-4.0.txt b/rs/LICENSES/CC-BY-SA-4.0.txt new file mode 100644 index 0000000..2d58298 --- /dev/null +++ b/rs/LICENSES/CC-BY-SA-4.0.txt @@ -0,0 +1,428 @@ +Attribution-ShareAlike 4.0 International + +======================================================================= + +Creative Commons Corporation ("Creative Commons") is not a law firm and +does not provide legal services or legal advice. Distribution of +Creative Commons public licenses does not create a lawyer-client or +other relationship. Creative Commons makes its licenses and related +information available on an "as-is" basis. Creative Commons gives no +warranties regarding its licenses, any material licensed under their +terms and conditions, or any related information. Creative Commons +disclaims all liability for damages resulting from their use to the +fullest extent possible. + +Using Creative Commons Public Licenses + +Creative Commons public licenses provide a standard set of terms and +conditions that creators and other rights holders may use to share +original works of authorship and other material subject to copyright +and certain other rights specified in the public license below. The +following considerations are for informational purposes only, are not +exhaustive, and do not form part of our licenses. + + Considerations for licensors: Our public licenses are + intended for use by those authorized to give the public + permission to use material in ways otherwise restricted by + copyright and certain other rights. Our licenses are + irrevocable. Licensors should read and understand the terms + and conditions of the license they choose before applying it. + Licensors should also secure all rights necessary before + applying our licenses so that the public can reuse the + material as expected. Licensors should clearly mark any + material not subject to the license. This includes other CC- + licensed material, or material used under an exception or + limitation to copyright. More considerations for licensors: + wiki.creativecommons.org/Considerations_for_licensors + + Considerations for the public: By using one of our public + licenses, a licensor grants the public permission to use the + licensed material under specified terms and conditions. If + the licensor's permission is not necessary for any reason--for + example, because of any applicable exception or limitation to + copyright--then that use is not regulated by the license. Our + licenses grant only permissions under copyright and certain + other rights that a licensor has authority to grant. Use of + the licensed material may still be restricted for other + reasons, including because others have copyright or other + rights in the material. A licensor may make special requests, + such as asking that all changes be marked or described. + Although not required by our licenses, you are encouraged to + respect those requests where reasonable. More considerations + for the public: + wiki.creativecommons.org/Considerations_for_licensees + +======================================================================= + +Creative Commons Attribution-ShareAlike 4.0 International Public +License + +By exercising the Licensed Rights (defined below), You accept and agree +to be bound by the terms and conditions of this Creative Commons +Attribution-ShareAlike 4.0 International Public License ("Public +License"). To the extent this Public License may be interpreted as a +contract, You are granted the Licensed Rights in consideration of Your +acceptance of these terms and conditions, and the Licensor grants You +such rights in consideration of benefits the Licensor receives from +making the Licensed Material available under these terms and +conditions. + + +Section 1 -- Definitions. + + a. Adapted Material means material subject to Copyright and Similar + Rights that is derived from or based upon the Licensed Material + and in which the Licensed Material is translated, altered, + arranged, transformed, or otherwise modified in a manner requiring + permission under the Copyright and Similar Rights held by the + Licensor. For purposes of this Public License, where the Licensed + Material is a musical work, performance, or sound recording, + Adapted Material is always produced where the Licensed Material is + synched in timed relation with a moving image. + + b. Adapter's License means the license You apply to Your Copyright + and Similar Rights in Your contributions to Adapted Material in + accordance with the terms and conditions of this Public License. + + c. BY-SA Compatible License means a license listed at + creativecommons.org/compatiblelicenses, approved by Creative + Commons as essentially the equivalent of this Public License. + + d. Copyright and Similar Rights means copyright and/or similar rights + closely related to copyright including, without limitation, + performance, broadcast, sound recording, and Sui Generis Database + Rights, without regard to how the rights are labeled or + categorized. For purposes of this Public License, the rights + specified in Section 2(b)(1)-(2) are not Copyright and Similar + Rights. + + e. Effective Technological Measures means those measures that, in the + absence of proper authority, may not be circumvented under laws + fulfilling obligations under Article 11 of the WIPO Copyright + Treaty adopted on December 20, 1996, and/or similar international + agreements. + + f. Exceptions and Limitations means fair use, fair dealing, and/or + any other exception or limitation to Copyright and Similar Rights + that applies to Your use of the Licensed Material. + + g. License Elements means the license attributes listed in the name + of a Creative Commons Public License. The License Elements of this + Public License are Attribution and ShareAlike. + + h. Licensed Material means the artistic or literary work, database, + or other material to which the Licensor applied this Public + License. + + i. Licensed Rights means the rights granted to You subject to the + terms and conditions of this Public License, which are limited to + all Copyright and Similar Rights that apply to Your use of the + Licensed Material and that the Licensor has authority to license. + + j. Licensor means the individual(s) or entity(ies) granting rights + under this Public License. + + k. Share means to provide material to the public by any means or + process that requires permission under the Licensed Rights, such + as reproduction, public display, public performance, distribution, + dissemination, communication, or importation, and to make material + available to the public including in ways that members of the + public may access the material from a place and at a time + individually chosen by them. + + l. Sui Generis Database Rights means rights other than copyright + resulting from Directive 96/9/EC of the European Parliament and of + the Council of 11 March 1996 on the legal protection of databases, + as amended and/or succeeded, as well as other essentially + equivalent rights anywhere in the world. + + m. You means the individual or entity exercising the Licensed Rights + under this Public License. Your has a corresponding meaning. + + +Section 2 -- Scope. + + a. License grant. + + 1. Subject to the terms and conditions of this Public License, + the Licensor hereby grants You a worldwide, royalty-free, + non-sublicensable, non-exclusive, irrevocable license to + exercise the Licensed Rights in the Licensed Material to: + + a. reproduce and Share the Licensed Material, in whole or + in part; and + + b. produce, reproduce, and Share Adapted Material. + + 2. Exceptions and Limitations. For the avoidance of doubt, where + Exceptions and Limitations apply to Your use, this Public + License does not apply, and You do not need to comply with + its terms and conditions. + + 3. Term. The term of this Public License is specified in Section + 6(a). + + 4. Media and formats; technical modifications allowed. The + Licensor authorizes You to exercise the Licensed Rights in + all media and formats whether now known or hereafter created, + and to make technical modifications necessary to do so. The + Licensor waives and/or agrees not to assert any right or + authority to forbid You from making technical modifications + necessary to exercise the Licensed Rights, including + technical modifications necessary to circumvent Effective + Technological Measures. For purposes of this Public License, + simply making modifications authorized by this Section 2(a) + (4) never produces Adapted Material. + + 5. Downstream recipients. + + a. Offer from the Licensor -- Licensed Material. Every + recipient of the Licensed Material automatically + receives an offer from the Licensor to exercise the + Licensed Rights under the terms and conditions of this + Public License. + + b. Additional offer from the Licensor -- Adapted Material. + Every recipient of Adapted Material from You + automatically receives an offer from the Licensor to + exercise the Licensed Rights in the Adapted Material + under the conditions of the Adapter's License You apply. + + c. No downstream restrictions. You may not offer or impose + any additional or different terms or conditions on, or + apply any Effective Technological Measures to, the + Licensed Material if doing so restricts exercise of the + Licensed Rights by any recipient of the Licensed + Material. + + 6. No endorsement. Nothing in this Public License constitutes or + may be construed as permission to assert or imply that You + are, or that Your use of the Licensed Material is, connected + with, or sponsored, endorsed, or granted official status by, + the Licensor or others designated to receive attribution as + provided in Section 3(a)(1)(A)(i). + + b. Other rights. + + 1. Moral rights, such as the right of integrity, are not + licensed under this Public License, nor are publicity, + privacy, and/or other similar personality rights; however, to + the extent possible, the Licensor waives and/or agrees not to + assert any such rights held by the Licensor to the limited + extent necessary to allow You to exercise the Licensed + Rights, but not otherwise. + + 2. Patent and trademark rights are not licensed under this + Public License. + + 3. To the extent possible, the Licensor waives any right to + collect royalties from You for the exercise of the Licensed + Rights, whether directly or through a collecting society + under any voluntary or waivable statutory or compulsory + licensing scheme. In all other cases the Licensor expressly + reserves any right to collect such royalties. + + +Section 3 -- License Conditions. + +Your exercise of the Licensed Rights is expressly made subject to the +following conditions. + + a. Attribution. + + 1. If You Share the Licensed Material (including in modified + form), You must: + + a. retain the following if it is supplied by the Licensor + with the Licensed Material: + + i. identification of the creator(s) of the Licensed + Material and any others designated to receive + attribution, in any reasonable manner requested by + the Licensor (including by pseudonym if + designated); + + ii. a copyright notice; + + iii. a notice that refers to this Public License; + + iv. a notice that refers to the disclaimer of + warranties; + + v. a URI or hyperlink to the Licensed Material to the + extent reasonably practicable; + + b. indicate if You modified the Licensed Material and + retain an indication of any previous modifications; and + + c. indicate the Licensed Material is licensed under this + Public License, and include the text of, or the URI or + hyperlink to, this Public License. + + 2. You may satisfy the conditions in Section 3(a)(1) in any + reasonable manner based on the medium, means, and context in + which You Share the Licensed Material. For example, it may be + reasonable to satisfy the conditions by providing a URI or + hyperlink to a resource that includes the required + information. + + 3. If requested by the Licensor, You must remove any of the + information required by Section 3(a)(1)(A) to the extent + reasonably practicable. + + b. ShareAlike. + + In addition to the conditions in Section 3(a), if You Share + Adapted Material You produce, the following conditions also apply. + + 1. The Adapter's License You apply must be a Creative Commons + license with the same License Elements, this version or + later, or a BY-SA Compatible License. + + 2. You must include the text of, or the URI or hyperlink to, the + Adapter's License You apply. You may satisfy this condition + in any reasonable manner based on the medium, means, and + context in which You Share Adapted Material. + + 3. You may not offer or impose any additional or different terms + or conditions on, or apply any Effective Technological + Measures to, Adapted Material that restrict exercise of the + rights granted under the Adapter's License You apply. + + +Section 4 -- Sui Generis Database Rights. + +Where the Licensed Rights include Sui Generis Database Rights that +apply to Your use of the Licensed Material: + + a. for the avoidance of doubt, Section 2(a)(1) grants You the right + to extract, reuse, reproduce, and Share all or a substantial + portion of the contents of the database; + + b. if You include all or a substantial portion of the database + contents in a database in which You have Sui Generis Database + Rights, then the database in which You have Sui Generis Database + Rights (but not its individual contents) is Adapted Material, + including for purposes of Section 3(b); and + + c. You must comply with the conditions in Section 3(a) if You Share + all or a substantial portion of the contents of the database. + +For the avoidance of doubt, this Section 4 supplements and does not +replace Your obligations under this Public License where the Licensed +Rights include other Copyright and Similar Rights. + + +Section 5 -- Disclaimer of Warranties and Limitation of Liability. + + a. UNLESS OTHERWISE SEPARATELY UNDERTAKEN BY THE LICENSOR, TO THE + EXTENT POSSIBLE, THE LICENSOR OFFERS THE LICENSED MATERIAL AS-IS + AND AS-AVAILABLE, AND MAKES NO REPRESENTATIONS OR WARRANTIES OF + ANY KIND CONCERNING THE LICENSED MATERIAL, WHETHER EXPRESS, + IMPLIED, STATUTORY, OR OTHER. THIS INCLUDES, WITHOUT LIMITATION, + WARRANTIES OF TITLE, MERCHANTABILITY, FITNESS FOR A PARTICULAR + PURPOSE, NON-INFRINGEMENT, ABSENCE OF LATENT OR OTHER DEFECTS, + ACCURACY, OR THE PRESENCE OR ABSENCE OF ERRORS, WHETHER OR NOT + KNOWN OR DISCOVERABLE. WHERE DISCLAIMERS OF WARRANTIES ARE NOT + ALLOWED IN FULL OR IN PART, THIS DISCLAIMER MAY NOT APPLY TO YOU. + + b. TO THE EXTENT POSSIBLE, IN NO EVENT WILL THE LICENSOR BE LIABLE + TO YOU ON ANY LEGAL THEORY (INCLUDING, WITHOUT LIMITATION, + NEGLIGENCE) OR OTHERWISE FOR ANY DIRECT, SPECIAL, INDIRECT, + INCIDENTAL, CONSEQUENTIAL, PUNITIVE, EXEMPLARY, OR OTHER LOSSES, + COSTS, EXPENSES, OR DAMAGES ARISING OUT OF THIS PUBLIC LICENSE OR + USE OF THE LICENSED MATERIAL, EVEN IF THE LICENSOR HAS BEEN + ADVISED OF THE POSSIBILITY OF SUCH LOSSES, COSTS, EXPENSES, OR + DAMAGES. WHERE A LIMITATION OF LIABILITY IS NOT ALLOWED IN FULL OR + IN PART, THIS LIMITATION MAY NOT APPLY TO YOU. + + c. The disclaimer of warranties and limitation of liability provided + above shall be interpreted in a manner that, to the extent + possible, most closely approximates an absolute disclaimer and + waiver of all liability. + + +Section 6 -- Term and Termination. + + a. This Public License applies for the term of the Copyright and + Similar Rights licensed here. However, if You fail to comply with + this Public License, then Your rights under this Public License + terminate automatically. + + b. Where Your right to use the Licensed Material has terminated under + Section 6(a), it reinstates: + + 1. automatically as of the date the violation is cured, provided + it is cured within 30 days of Your discovery of the + violation; or + + 2. upon express reinstatement by the Licensor. + + For the avoidance of doubt, this Section 6(b) does not affect any + right the Licensor may have to seek remedies for Your violations + of this Public License. + + c. For the avoidance of doubt, the Licensor may also offer the + Licensed Material under separate terms or conditions or stop + distributing the Licensed Material at any time; however, doing so + will not terminate this Public License. + + d. Sections 1, 5, 6, 7, and 8 survive termination of this Public + License. + + +Section 7 -- Other Terms and Conditions. + + a. The Licensor shall not be bound by any additional or different + terms or conditions communicated by You unless expressly agreed. + + b. Any arrangements, understandings, or agreements regarding the + Licensed Material not stated herein are separate from and + independent of the terms and conditions of this Public License. + + +Section 8 -- Interpretation. + + a. For the avoidance of doubt, this Public License does not, and + shall not be interpreted to, reduce, limit, restrict, or impose + conditions on any use of the Licensed Material that could lawfully + be made without permission under this Public License. + + b. To the extent possible, if any provision of this Public License is + deemed unenforceable, it shall be automatically reformed to the + minimum extent necessary to make it enforceable. If the provision + cannot be reformed, it shall be severed from this Public License + without affecting the enforceability of the remaining terms and + conditions. + + c. No term or condition of this Public License will be waived and no + failure to comply consented to unless expressly agreed to by the + Licensor. + + d. Nothing in this Public License constitutes or may be interpreted + as a limitation upon, or waiver of, any privileges and immunities + that apply to the Licensor or You, including from the legal + processes of any jurisdiction or authority. + + +======================================================================= + +Creative Commons is not a party to its public +licenses. Notwithstanding, Creative Commons may elect to apply one of +its public licenses to material it publishes and in those instances +will be considered the “Licensor.” The text of the Creative Commons +public licenses is dedicated to the public domain under the CC0 Public +Domain Dedication. Except for the limited purpose of indicating that +material is shared under a Creative Commons public license or as +otherwise permitted by the Creative Commons policies published at +creativecommons.org/policies, Creative Commons does not authorize the +use of the trademark "Creative Commons" or any other trademark or logo +of Creative Commons without its prior written consent including, +without limitation, in connection with any unauthorized modifications +to any of its public licenses or any other arrangements, +understandings, or agreements concerning use of licensed material. For +the avoidance of doubt, this paragraph does not form part of the +public licenses. + +Creative Commons may be contacted at creativecommons.org. + diff --git a/rs/LICENSES/MPL-2.0.txt b/rs/LICENSES/MPL-2.0.txt new file mode 100644 index 0000000..d0a1fa1 --- /dev/null +++ b/rs/LICENSES/MPL-2.0.txt @@ -0,0 +1,373 @@ +Mozilla Public License Version 2.0 +================================== + +1. Definitions +-------------- + +1.1. "Contributor" + means each individual or legal entity that creates, contributes to + the creation of, or owns Covered Software. + +1.2. "Contributor Version" + means the combination of the Contributions of others (if any) used + by a Contributor and that particular Contributor's Contribution. + +1.3. "Contribution" + means Covered Software of a particular Contributor. + +1.4. "Covered Software" + means Source Code Form to which the initial Contributor has attached + the notice in Exhibit A, the Executable Form of such Source Code + Form, and Modifications of such Source Code Form, in each case + including portions thereof. + +1.5. "Incompatible With Secondary Licenses" + means + + (a) that the initial Contributor has attached the notice described + in Exhibit B to the Covered Software; or + + (b) that the Covered Software was made available under the terms of + version 1.1 or earlier of the License, but not also under the + terms of a Secondary License. + +1.6. "Executable Form" + means any form of the work other than Source Code Form. + +1.7. "Larger Work" + means a work that combines Covered Software with other material, in + a separate file or files, that is not Covered Software. + +1.8. "License" + means this document. + +1.9. "Licensable" + means having the right to grant, to the maximum extent possible, + whether at the time of the initial grant or subsequently, any and + all of the rights conveyed by this License. + +1.10. "Modifications" + means any of the following: + + (a) any file in Source Code Form that results from an addition to, + deletion from, or modification of the contents of Covered + Software; or + + (b) any new file in Source Code Form that contains any Covered + Software. + +1.11. "Patent Claims" of a Contributor + means any patent claim(s), including without limitation, method, + process, and apparatus claims, in any patent Licensable by such + Contributor that would be infringed, but for the grant of the + License, by the making, using, selling, offering for sale, having + made, import, or transfer of either its Contributions or its + Contributor Version. + +1.12. "Secondary License" + means either the GNU General Public License, Version 2.0, the GNU + Lesser General Public License, Version 2.1, the GNU Affero General + Public License, Version 3.0, or any later versions of those + licenses. + +1.13. "Source Code Form" + means the form of the work preferred for making modifications. + +1.14. "You" (or "Your") + means an individual or a legal entity exercising rights under this + License. For legal entities, "You" includes any entity that + controls, is controlled by, or is under common control with You. For + purposes of this definition, "control" means (a) the power, direct + or indirect, to cause the direction or management of such entity, + whether by contract or otherwise, or (b) ownership of more than + fifty percent (50%) of the outstanding shares or beneficial + ownership of such entity. + +2. License Grants and Conditions +-------------------------------- + +2.1. Grants + +Each Contributor hereby grants You a world-wide, royalty-free, +non-exclusive license: + +(a) under intellectual property rights (other than patent or trademark) + Licensable by such Contributor to use, reproduce, make available, + modify, display, perform, distribute, and otherwise exploit its + Contributions, either on an unmodified basis, with Modifications, or + as part of a Larger Work; and + +(b) under Patent Claims of such Contributor to make, use, sell, offer + for sale, have made, import, and otherwise transfer either its + Contributions or its Contributor Version. + +2.2. Effective Date + +The licenses granted in Section 2.1 with respect to any Contribution +become effective for each Contribution on the date the Contributor first +distributes such Contribution. + +2.3. Limitations on Grant Scope + +The licenses granted in this Section 2 are the only rights granted under +this License. No additional rights or licenses will be implied from the +distribution or licensing of Covered Software under this License. +Notwithstanding Section 2.1(b) above, no patent license is granted by a +Contributor: + +(a) for any code that a Contributor has removed from Covered Software; + or + +(b) for infringements caused by: (i) Your and any other third party's + modifications of Covered Software, or (ii) the combination of its + Contributions with other software (except as part of its Contributor + Version); or + +(c) under Patent Claims infringed by Covered Software in the absence of + its Contributions. + +This License does not grant any rights in the trademarks, service marks, +or logos of any Contributor (except as may be necessary to comply with +the notice requirements in Section 3.4). + +2.4. Subsequent Licenses + +No Contributor makes additional grants as a result of Your choice to +distribute the Covered Software under a subsequent version of this +License (see Section 10.2) or under the terms of a Secondary License (if +permitted under the terms of Section 3.3). + +2.5. Representation + +Each Contributor represents that the Contributor believes its +Contributions are its original creation(s) or it has sufficient rights +to grant the rights to its Contributions conveyed by this License. + +2.6. Fair Use + +This License is not intended to limit any rights You have under +applicable copyright doctrines of fair use, fair dealing, or other +equivalents. + +2.7. Conditions + +Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted +in Section 2.1. + +3. Responsibilities +------------------- + +3.1. Distribution of Source Form + +All distribution of Covered Software in Source Code Form, including any +Modifications that You create or to which You contribute, must be under +the terms of this License. You must inform recipients that the Source +Code Form of the Covered Software is governed by the terms of this +License, and how they can obtain a copy of this License. You may not +attempt to alter or restrict the recipients' rights in the Source Code +Form. + +3.2. Distribution of Executable Form + +If You distribute Covered Software in Executable Form then: + +(a) such Covered Software must also be made available in Source Code + Form, as described in Section 3.1, and You must inform recipients of + the Executable Form how they can obtain a copy of such Source Code + Form by reasonable means in a timely manner, at a charge no more + than the cost of distribution to the recipient; and + +(b) You may distribute such Executable Form under the terms of this + License, or sublicense it under different terms, provided that the + license for the Executable Form does not attempt to limit or alter + the recipients' rights in the Source Code Form under this License. + +3.3. Distribution of a Larger Work + +You may create and distribute a Larger Work under terms of Your choice, +provided that You also comply with the requirements of this License for +the Covered Software. If the Larger Work is a combination of Covered +Software with a work governed by one or more Secondary Licenses, and the +Covered Software is not Incompatible With Secondary Licenses, this +License permits You to additionally distribute such Covered Software +under the terms of such Secondary License(s), so that the recipient of +the Larger Work may, at their option, further distribute the Covered +Software under the terms of either this License or such Secondary +License(s). + +3.4. Notices + +You may not remove or alter the substance of any license notices +(including copyright notices, patent notices, disclaimers of warranty, +or limitations of liability) contained within the Source Code Form of +the Covered Software, except that You may alter any license notices to +the extent required to remedy known factual inaccuracies. + +3.5. Application of Additional Terms + +You may choose to offer, and to charge a fee for, warranty, support, +indemnity or liability obligations to one or more recipients of Covered +Software. However, You may do so only on Your own behalf, and not on +behalf of any Contributor. You must make it absolutely clear that any +such warranty, support, indemnity, or liability obligation is offered by +You alone, and You hereby agree to indemnify every Contributor for any +liability incurred by such Contributor as a result of warranty, support, +indemnity or liability terms You offer. You may include additional +disclaimers of warranty and limitations of liability specific to any +jurisdiction. + +4. Inability to Comply Due to Statute or Regulation +--------------------------------------------------- + +If it is impossible for You to comply with any of the terms of this +License with respect to some or all of the Covered Software due to +statute, judicial order, or regulation then You must: (a) comply with +the terms of this License to the maximum extent possible; and (b) +describe the limitations and the code they affect. Such description must +be placed in a text file included with all distributions of the Covered +Software under this License. Except to the extent prohibited by statute +or regulation, such description must be sufficiently detailed for a +recipient of ordinary skill to be able to understand it. + +5. Termination +-------------- + +5.1. The rights granted under this License will terminate automatically +if You fail to comply with any of its terms. However, if You become +compliant, then the rights granted under this License from a particular +Contributor are reinstated (a) provisionally, unless and until such +Contributor explicitly and finally terminates Your grants, and (b) on an +ongoing basis, if such Contributor fails to notify You of the +non-compliance by some reasonable means prior to 60 days after You have +come back into compliance. Moreover, Your grants from a particular +Contributor are reinstated on an ongoing basis if such Contributor +notifies You of the non-compliance by some reasonable means, this is the +first time You have received notice of non-compliance with this License +from such Contributor, and You become compliant prior to 30 days after +Your receipt of the notice. + +5.2. If You initiate litigation against any entity by asserting a patent +infringement claim (excluding declaratory judgment actions, +counter-claims, and cross-claims) alleging that a Contributor Version +directly or indirectly infringes any patent, then the rights granted to +You by any and all Contributors for the Covered Software under Section +2.1 of this License shall terminate. + +5.3. In the event of termination under Sections 5.1 or 5.2 above, all +end user license agreements (excluding distributors and resellers) which +have been validly granted by You or Your distributors under this License +prior to termination shall survive termination. + +************************************************************************ +* * +* 6. Disclaimer of Warranty * +* ------------------------- * +* * +* Covered Software is provided under this License on an "as is" * +* basis, without warranty of any kind, either expressed, implied, or * +* statutory, including, without limitation, warranties that the * +* Covered Software is free of defects, merchantable, fit for a * +* particular purpose or non-infringing. The entire risk as to the * +* quality and performance of the Covered Software is with You. * +* Should any Covered Software prove defective in any respect, You * +* (not any Contributor) assume the cost of any necessary servicing, * +* repair, or correction. This disclaimer of warranty constitutes an * +* essential part of this License. No use of any Covered Software is * +* authorized under this License except under this disclaimer. * +* * +************************************************************************ + +************************************************************************ +* * +* 7. Limitation of Liability * +* -------------------------- * +* * +* Under no circumstances and under no legal theory, whether tort * +* (including negligence), contract, or otherwise, shall any * +* Contributor, or anyone who distributes Covered Software as * +* permitted above, be liable to You for any direct, indirect, * +* special, incidental, or consequential damages of any character * +* including, without limitation, damages for lost profits, loss of * +* goodwill, work stoppage, computer failure or malfunction, or any * +* and all other commercial damages or losses, even if such party * +* shall have been informed of the possibility of such damages. This * +* limitation of liability shall not apply to liability for death or * +* personal injury resulting from such party's negligence to the * +* extent applicable law prohibits such limitation. Some * +* jurisdictions do not allow the exclusion or limitation of * +* incidental or consequential damages, so this exclusion and * +* limitation may not apply to You. * +* * +************************************************************************ + +8. Litigation +------------- + +Any litigation relating to this License may be brought only in the +courts of a jurisdiction where the defendant maintains its principal +place of business and such litigation shall be governed by laws of that +jurisdiction, without reference to its conflict-of-law provisions. +Nothing in this Section shall prevent a party's ability to bring +cross-claims or counter-claims. + +9. Miscellaneous +---------------- + +This License represents the complete agreement concerning the subject +matter hereof. If any provision of this License is held to be +unenforceable, such provision shall be reformed only to the extent +necessary to make it enforceable. Any law or regulation which provides +that the language of a contract shall be construed against the drafter +shall not be used to construe this License against a Contributor. + +10. Versions of the License +--------------------------- + +10.1. New Versions + +Mozilla Foundation is the license steward. Except as provided in Section +10.3, no one other than the license steward has the right to modify or +publish new versions of this License. Each version will be given a +distinguishing version number. + +10.2. Effect of New Versions + +You may distribute the Covered Software under the terms of the version +of the License under which You originally received the Covered Software, +or under the terms of any subsequent version published by the license +steward. + +10.3. Modified Versions + +If you create software not governed by this License, and you want to +create a new license for such software, you may create and use a +modified version of this License if you rename the license and remove +any references to the name of the license steward (except to note that +such modified license differs from this License). + +10.4. Distributing Source Code Form that is Incompatible With Secondary +Licenses + +If You choose to distribute Source Code Form that is Incompatible With +Secondary Licenses under the terms of this version of the License, the +notice described in Exhibit B of this License must be attached. + +Exhibit A - Source Code Form License Notice +------------------------------------------- + + This Source Code Form is subject to the terms of the Mozilla Public + License, v. 2.0. If a copy of the MPL was not distributed with this + file, You can obtain one at https://mozilla.org/MPL/2.0/. + +If it is not possible or desirable to put the notice in a particular +file, then You may include the notice in a location (such as a LICENSE +file in a relevant directory) where a recipient would be likely to look +for such a notice. + +You may add additional accurate notices of copyright ownership. + +Exhibit B - "Incompatible With Secondary Licenses" Notice +--------------------------------------------------------- + + This Source Code Form is "Incompatible With Secondary Licenses", as + defined by the Mozilla Public License, v. 2.0. diff --git a/rs/MAINTAINERS b/rs/MAINTAINERS new file mode 100644 index 0000000..37f6411 --- /dev/null +++ b/rs/MAINTAINERS @@ -0,0 +1,43 @@ +# Maintainers + +This file lists the current maintainers of this project. + +## Active Maintainers + +| Name | GitHub | Role | Since | +|------|--------|------|-------| +| Metadatastician | @metadatastician | Primary | Project Start | + +## Emeritus Maintainers + +None at this time. + +## Becoming a Maintainer + +To become a maintainer: + +1. Demonstrate consistent, high-quality contributions +2. Show understanding of the project's goals and architecture +3. Be active in code reviews and community discussions +4. Be nominated by an existing maintainer +5. Be approved by consensus of existing maintainers + +## Maintainer Responsibilities + +- Reviewing and merging pull requests +- Managing releases +- Triaging issues +- Enforcing code standards +- Mentoring new contributors +- Participating in decision-making + +## Maintainer Expectations + +- Respond to issues and PRs in a timely manner +- Follow the code of conduct +- Be transparent in decision-making +- Communicate clearly and respectfully + +--- + +*Last updated: 2026-07-18* diff --git a/rs/QUICKSTART-DEV.adoc b/rs/QUICKSTART-DEV.adoc new file mode 100644 index 0000000..0688c7d --- /dev/null +++ b/rs/QUICKSTART-DEV.adoc @@ -0,0 +1,39 @@ += A2Ml Rs — Developer Quickstart +:toc: preamble + +Clone, build, test, contribute. + +== Prerequisites + +* Git 2.40+ +* just (command runner) +* See `just doctor` output for language-specific requirements + +== Setup + +[source,bash] +---- +git clone https://github.com/hyperpolymath/a2ml-rs +cd a2ml-rs +just doctor # verify toolchain +just heal # auto-install missing tools +---- + +== Development Workflow + +[source,bash] +---- +just tour # understand the codebase +just help-me # see available commands +---- + +== Before Committing + +[source,bash] +---- +just assail # run panic-attacker security scan +---- + +== Contributing + +See link:CONTRIBUTING.md[CONTRIBUTING.md] for guidelines. diff --git a/rs/QUICKSTART-MAINTAINER.adoc b/rs/QUICKSTART-MAINTAINER.adoc new file mode 100644 index 0000000..29bcb2c --- /dev/null +++ b/rs/QUICKSTART-MAINTAINER.adoc @@ -0,0 +1,40 @@ += A2Ml Rs — Maintainer Quickstart +:toc: preamble + +Packaging, deployment, and release management. + +== Prerequisites + +* Git 2.40+ +* just (command runner) +* Familiarity with the project (run `just tour` first) + +== CI/CD + +This project uses GitHub Actions. Workflows are in `.github/workflows/`. + +Key workflows: + +* `hypatia-scan.yml` — Neurosymbolic security scanning +* `codeql.yml` — Code analysis +* `scorecard.yml` — OpenSSF Scorecard +* `mirror.yml` — GitLab/Bitbucket mirroring + +== Releasing + +1. Update version in project config +2. Update CHANGELOG.md +3. Tag: `git tag -s v` +4. Push: `git push origin main --tags` + +== Container Build (if applicable) + +[source,bash] +---- +podman build -f Containerfile -t a2ml-rs:latest . +---- + +== Mirrors + +This repo is mirrored to GitLab and Bitbucket (hyperpolymath accounts) +via the `mirror.yml` workflow. diff --git a/rs/QUICKSTART-USER.adoc b/rs/QUICKSTART-USER.adoc new file mode 100644 index 0000000..4fc965d --- /dev/null +++ b/rs/QUICKSTART-USER.adoc @@ -0,0 +1,33 @@ += A2Ml Rs — User Quickstart +:toc: preamble + +Get up and running in 60 seconds. + +== Prerequisites + +* Git 2.40+ +* just (command runner) — https://just.systems + +== Install + +[source,bash] +---- +git clone https://github.com/hyperpolymath/a2ml-rs +cd a2ml-rs +just doctor # check toolchain +just heal # auto-install missing tools +---- + +== First Run + +[source,bash] +---- +just tour # guided project tour +just help-me # see common workflows +---- + +== Get Help + +* `just help-me` — common workflows +* `just doctor` — diagnose toolchain issues +* https://github.com/hyperpolymath/a2ml-rs/issues — report bugs diff --git a/rs/README.md b/rs/README.md new file mode 100644 index 0000000..9ad08e1 --- /dev/null +++ b/rs/README.md @@ -0,0 +1,73 @@ + + +Rust parser and renderer for A2ML (Attested Markup Language) — the +structured markup format used across the hyperpolymath estate for +AI-agent communication, machine state files, and provenance-tracked +documentation. + +# Overview + +A2ML extends a Markdown-like surface syntax with two first-class +constructs: + +- `@directives` — single-line machine-readable metadata prefixed with + `@` + +- `!attest` blocks — record identity, role, and trust-level on any piece + of content, enabling provenance tracking across AI-agent and human + review chains + +`a2ml-rs` implements: + +- `src/parser.rs` — line-oriented state machine: headings, directives, + attestation blocks, fenced code, block quotes, ordered/unordered + lists. Entry points: `parse()` and `parse_file()`. + +- `src/renderer.rs` — serialises a `Document` AST back to canonical + A2ML, making round-trips deterministic. + +- `src/types.rs` — core types: `Document`, `Block`, `Inline`, + `Directive`, `Attestation`, `TrustLevel` (Unverified → Automated → + Reviewed → Verified), `Manifest`. + +- `src/error.rs` — `A2mlError`: `ParseError`, `Io`, `RenderError`. + +The crate root is `#![forbid(unsafe_code)]`. Dependencies: +`serde`/`serde_derive` for serialisation, `thiserror` for error types, +`criterion` for benchmarks only. + +# Usage + +```rust +use a2ml::{parse, render}; + +let doc = parse(input_str)?; +let output = render(&doc)?; +``` + +# Attestation Trust Levels + +| Level | Meaning | +|--------------|--------------------------------------------------------| +| `Unverified` | No review — raw agent or tool output | +| `Automated` | Processed by a pipeline without human review | +| `Reviewed` | Human-reviewed (claimed, not cryptographically proved) | +| `Verified` | Formally verified or cryptographically attested | + +Attestations are syntactic declarations, not cryptographic signatures. +Signature verification belongs in the Groove protocol stack. + +# Related + +- [pandoc-a2ml](https://github.com/hyperpolymath/pandoc-a2ml) — Pandoc + reader/writer for A2ML + +- [a2ml-haskell](https://github.com/hyperpolymath/a2ml-haskell) — + Haskell implementation + +# License + +MPL-2.0. See [LICENSE](LICENSE). diff --git a/rs/ROADMAP.adoc b/rs/ROADMAP.adoc new file mode 100644 index 0000000..2c11f26 --- /dev/null +++ b/rs/ROADMAP.adoc @@ -0,0 +1,22 @@ +// SPDX-License-Identifier: CC-BY-SA-4.0 += A2ml Rs Roadmap + +== Current Status + +Initial development phase. + +== Milestones + +=== v0.1.0 - Foundation +* [ ] Core functionality +* [ ] Basic documentation +* [ ] CI/CD pipeline + +=== v1.0.0 - Stable Release +* [ ] Full feature set +* [ ] Comprehensive tests +* [ ] Production ready + +== Future Directions + +_To be determined based on community feedback._ diff --git a/rs/SECURITY.md b/rs/SECURITY.md new file mode 100644 index 0000000..5c4d5e9 --- /dev/null +++ b/rs/SECURITY.md @@ -0,0 +1,20 @@ + +# Security Policy + +## Reporting a Vulnerability + +If you discover a security vulnerability, please report it responsibly. + +**Email:** j.d.a.jewell@open.ac.uk + +**Please include:** +- Description of the vulnerability +- Steps to reproduce +- Potential impact + +**Response timeline:** +- Acknowledgement within 48 hours +- Initial assessment within 7 days +- Fix or mitigation within 90 days + +**Safe harbour:** We will not pursue legal action against security researchers who follow responsible disclosure. diff --git a/rs/TEST-NEEDS.md b/rs/TEST-NEEDS.md new file mode 100644 index 0000000..637bb7f --- /dev/null +++ b/rs/TEST-NEEDS.md @@ -0,0 +1,63 @@ +# Test & Benchmark Requirements + +## CRG Grade: C — ACHIEVED 2026-04-04 + +## Current State +- Unit tests: 14 pass / 0 fail (11 unit + 3 doc-tests) +- Integration tests: NONE +- E2E tests: NONE +- Benchmarks: NONE (benchmark dir has only README placeholder) +- panic-attack scan: NEVER RUN (feature dir exists but no report) + +## What's Missing +### Point-to-Point (P2P) +- lib.rs — 11 inline tests exist, reasonable for module size +- parser.rs — tests exist but edge cases likely missing (malformed input, unicode, deeply nested structures) +- renderer.rs — likely untested or minimally tested +- types.rs — likely untested +- error.rs — error paths and formatting not tested +- tests/fuzz/ contains only placeholder.txt — no fuzzing + +### End-to-End (E2E) +- Parse real-world A2ML files from other hyperpolymath repos +- Round-trip (parse -> render -> parse) equality check +- Cross-implementation compatibility with a2ml_ex, a2ml_gleam, a2ml-haskell +- CLI integration if binary exists + +### Aspect Tests +- [ ] Security (untrusted A2ML input, DoS via deeply nested structures) +- [ ] Performance (large document parsing) +- [ ] Concurrency (N/A for library) +- [ ] Error handling (all error.rs variants reachable and tested) +- [ ] Accessibility (N/A) + +### Build & Execution +- [x] cargo build — clean +- [x] cargo test — 14 pass, 0 fail +- [ ] Self-diagnostic — none + +### Benchmarks Needed +- Parse throughput (Criterion benchmarks) +- Memory allocation profile +- Comparison vs a2ml_ex (BEAM) and a2ml-deno (V8) + +### Self-Tests +- [ ] panic-attack assail on own repo +- [ ] Built-in doctor/check command (if applicable) + +## Priority +- **MEDIUM** — 5 source files with 14 tests is decent ratio but renderer and types likely lack coverage. Fuzz directory is empty. No benchmarks despite benchmark dir existing. As the Rust reference implementation, this should have the most comprehensive tests of all A2ML libraries. + +## Session 9 additions (2026-04-04) + +### What Was Added + +| Area | Tests Added | Location | +|------|-------------|----------| +| Benchmarks | Extended `benches/a2ml_bench.rs` with `attestation_benches` group: 4 functions: `bench_parse_attestation_heavy`, `bench_parse_directive_heavy`, `bench_attestation_access`, `bench_render_attestation_heavy` | `benches/a2ml_bench.rs` | + +### Updated Test Counts + +| Suite | Count | Status | +|-------|-------|--------| +| Benchmarks (attestation) | 4 new | Added to attestation_benches group | diff --git a/rs/TOPOLOGY.md b/rs/TOPOLOGY.md new file mode 100644 index 0000000..5240a53 --- /dev/null +++ b/rs/TOPOLOGY.md @@ -0,0 +1,31 @@ + + +# TOPOLOGY.md — a2ml-rs + +## Purpose + +Rust parser and renderer for A2ML (Attested Markup Language), a structured markup format with built-in attestation provenance, directive metadata, and trust-level tracking. Provides a complete parse-render round-trip with typed AST. Intended for use in CI tooling, validators, and server-side pipelines. + +## Module Map + +``` +a2ml-rs/ +├── src/ +│ ├── lib.rs # Public crate API +│ ├── types.rs # AST types (blocks, inlines, directives, attestations) +│ ├── parser.rs # A2ML document parser +│ ├── renderer.rs # AST-to-A2ML surface syntax renderer +│ └── error.rs # Error types +├── benches/ # Criterion benchmarks +├── examples/ # Usage examples +├── Cargo.toml +└── container/ # Containerfile for CI +``` + +## Data Flow + +``` +[A2ML text] ──► [parser.rs] ──► [Typed AST] ──► [renderer.rs] ──► [A2ML text] + │ + [types.rs / error.rs] +``` diff --git a/rs/benches/a2ml_bench.rs b/rs/benches/a2ml_bench.rs new file mode 100644 index 0000000..b2cbf3f --- /dev/null +++ b/rs/benches/a2ml_bench.rs @@ -0,0 +1,349 @@ +// SPDX-License-Identifier: MPL-2.0 +// (MPL-2.0 preferred; MPL-2.0 required for crates.io) + +//! Criterion benchmarks for the a2ml crate. +//! +//! Measures parse throughput, render throughput, and roundtrip latency +//! across small, medium, and large A2ML documents. + +use criterion::{black_box, criterion_group, criterion_main, BenchmarkId, Criterion}; + +use a2ml::parser::parse; +use a2ml::renderer::render; +use a2ml::types::TrustLevel; + +// --------------------------------------------------------------------------- +// Document fixtures +// --------------------------------------------------------------------------- + +/// A small A2ML document (~10 lines). +fn small_document() -> String { + r#"# Small Document + +@version 1.0 + +A short introductory paragraph describing the purpose of this document. + +!attest identity=Alice role=author trust=reviewed +"# + .to_string() +} + +/// A medium A2ML document (~100 lines). +fn medium_document() -> String { + let mut doc = String::with_capacity(4_096); + doc.push_str("# Medium Document\n\n"); + doc.push_str("@version 1.0\n"); + doc.push_str("@require trust-level:reviewed\n\n"); + + for section in 1..=5 { + doc.push_str(&format!("## Section {}\n\n", section)); + doc.push_str( + "This is a paragraph with **bold text**, *italic text*, and `inline code`.\n\n", + ); + doc.push_str("- First item in the list\n"); + doc.push_str("- Second item in the list\n"); + doc.push_str("- Third item in the list\n\n"); + doc.push_str("```rust\nfn example() -> &'static str {\n \"value\"\n}\n```\n\n"); + doc.push_str("---\n\n"); + } + + doc.push_str("!attest identity=Bob role=reviewer trust=verified ts=2026-01-01\n"); + doc +} + +/// A large A2ML document (~1 000 lines). +fn large_document() -> String { + let mut doc = String::with_capacity(80_000); + doc.push_str("# Large Benchmark Document\n\n"); + doc.push_str("@version 1.0\n\n"); + + for i in 0..100 { + doc.push_str(&format!("## Chapter {}\n\n", i + 1)); + for para in 0..5 { + doc.push_str(&format!( + "Paragraph {} of chapter {}. Contains **bold**, *italic*, and `code`.\n\n", + para + 1, + i + 1 + )); + } + doc.push_str("```\ncode block content line 1\ncode block content line 2\n```\n\n"); + } + + doc.push_str("!attest identity=CI-agent role=agent trust=automated\n"); + doc +} + +// --------------------------------------------------------------------------- +// Parse benchmarks +// --------------------------------------------------------------------------- + +/// Benchmark parsing a small A2ML document. +fn bench_parse_small(c: &mut Criterion) { + let input = small_document(); + c.bench_with_input( + BenchmarkId::new("parse", "small"), + &input, + |b, input| { + b.iter(|| { + let doc = parse(black_box(input)).expect("small document must parse"); + black_box(doc); + }); + }, + ); +} + +/// Benchmark parsing a medium A2ML document. +fn bench_parse_medium(c: &mut Criterion) { + let input = medium_document(); + c.bench_with_input( + BenchmarkId::new("parse", "medium"), + &input, + |b, input| { + b.iter(|| { + let doc = parse(black_box(input)).expect("medium document must parse"); + black_box(doc); + }); + }, + ); +} + +/// Benchmark parsing a large A2ML document. +fn bench_parse_large(c: &mut Criterion) { + let input = large_document(); + c.bench_with_input( + BenchmarkId::new("parse", "large"), + &input, + |b, input| { + b.iter(|| { + let doc = parse(black_box(input)).expect("large document must parse"); + black_box(doc); + }); + }, + ); +} + +// --------------------------------------------------------------------------- +// Render benchmarks +// --------------------------------------------------------------------------- + +/// Benchmark rendering a small pre-parsed document. +fn bench_render_small(c: &mut Criterion) { + let doc = parse(&small_document()).expect("parse"); + c.bench_function("render/small", |b| { + b.iter(|| { + let output = render(black_box(&doc)).expect("render must succeed"); + black_box(output); + }); + }); +} + +/// Benchmark rendering a medium pre-parsed document. +fn bench_render_medium(c: &mut Criterion) { + let doc = parse(&medium_document()).expect("parse"); + c.bench_function("render/medium", |b| { + b.iter(|| { + let output = render(black_box(&doc)).expect("render must succeed"); + black_box(output); + }); + }); +} + +/// Benchmark rendering a large pre-parsed document. +fn bench_render_large(c: &mut Criterion) { + let doc = parse(&large_document()).expect("parse"); + c.bench_function("render/large", |b| { + b.iter(|| { + let output = render(black_box(&doc)).expect("render must succeed"); + black_box(output); + }); + }); +} + +// --------------------------------------------------------------------------- +// Roundtrip benchmarks +// --------------------------------------------------------------------------- + +/// Benchmark the full parse → render → parse roundtrip on a small document. +fn bench_roundtrip_small(c: &mut Criterion) { + let input = small_document(); + c.bench_function("roundtrip/small", |b| { + b.iter(|| { + let doc1 = parse(black_box(&input)).expect("first parse"); + let rendered = render(&doc1).expect("render"); + let doc2 = parse(&rendered).expect("second parse"); + black_box(doc2); + }); + }); +} + +/// Benchmark the full parse → render → parse roundtrip on a medium document. +fn bench_roundtrip_medium(c: &mut Criterion) { + let input = medium_document(); + c.bench_function("roundtrip/medium", |b| { + b.iter(|| { + let doc1 = parse(black_box(&input)).expect("first parse"); + let rendered = render(&doc1).expect("render"); + let doc2 = parse(&rendered).expect("second parse"); + black_box(doc2); + }); + }); +} + +/// Benchmark the full parse → render → parse roundtrip on a large document. +fn bench_roundtrip_large(c: &mut Criterion) { + let input = large_document(); + c.bench_function("roundtrip/large", |b| { + b.iter(|| { + let doc1 = parse(black_box(&input)).expect("first parse"); + let rendered = render(&doc1).expect("render"); + let doc2 = parse(&rendered).expect("second parse"); + black_box(doc2); + }); + }); +} + +// --------------------------------------------------------------------------- +// Attestation-heavy document benchmarks +// +// Attestation blocks (`!attest`) are parsed separately from the main document +// tree. These benchmarks measure the cost of parsing documents that contain +// many attestation records — the typical pattern in multi-reviewer workflows. +// --------------------------------------------------------------------------- + +/// A document containing 20 attestation records. +fn attestation_heavy_document() -> String { + let mut doc = String::with_capacity(4_096); + doc.push_str("# Attested Document\n\n@version 1.0\n\n"); + doc.push_str("This document has been reviewed by many parties.\n\n"); + + let roles = ["author", "reviewer", "auditor", "approver", "witness"]; + let trusts = ["reviewed", "verified", "automated", "manual", "attested"]; + for i in 0..20 { + doc.push_str(&format!( + "!attest identity=Agent{} role={} trust={} ts=2026-01-{:02}\n", + i, + roles[i % roles.len()], + trusts[i % trusts.len()], + (i % 28) + 1, + )); + } + doc +} + +/// A document containing 30 directives (`@`-prefixed metadata lines). +fn directive_heavy_document() -> String { + let mut doc = String::with_capacity(4_096); + doc.push_str("# Directive Document\n\n"); + + let keys = [ + "version", + "require", + "schema", + "lang", + "encoding", + "created", + "modified", + "author", + "project", + "stability", + ]; + for i in 0..30 { + doc.push_str(&format!( + "@{} value-{}\n", + keys[i % keys.len()], + i + )); + } + doc.push_str("\nBody paragraph after directives.\n"); + doc +} + +/// Benchmark parsing a document with many attestation records. +fn bench_parse_attestation_heavy(c: &mut Criterion) { + let input = attestation_heavy_document(); + c.bench_function("parse/attestation_heavy_20", |b| { + b.iter(|| { + let doc = parse(black_box(&input)).expect("attestation document must parse"); + black_box(doc); + }); + }); +} + +/// Benchmark parsing a document with many directives. +fn bench_parse_directive_heavy(c: &mut Criterion) { + let input = directive_heavy_document(); + c.bench_function("parse/directive_heavy_30", |b| { + b.iter(|| { + let doc = parse(black_box(&input)).expect("directive document must parse"); + black_box(doc); + }); + }); +} + +/// Benchmark extracting attestation records from a parsed document. +/// +/// Isolates the attestation-access pattern used when verifying provenance +/// chains — separate from the overall parse cost. +fn bench_attestation_access(c: &mut Criterion) { + let input = attestation_heavy_document(); + let doc = parse(&input).expect("parse attestation document"); + + c.bench_function("attestation/access_20_records", |b| { + b.iter(|| { + // Simulate a verifier walking the full attestation chain. + let count = black_box(&doc) + .attestations + .iter() + .filter(|a| a.trust_level == TrustLevel::Verified) + .count(); + black_box(count); + }); + }); +} + +/// Benchmark render of an attestation-heavy document (provenance serialisation). +fn bench_render_attestation_heavy(c: &mut Criterion) { + let doc = parse(&attestation_heavy_document()).expect("parse"); + c.bench_function("render/attestation_heavy_20", |b| { + b.iter(|| { + let output = render(black_box(&doc)).expect("render must succeed"); + black_box(output); + }); + }); +} + +// --------------------------------------------------------------------------- +// Criterion registration +// --------------------------------------------------------------------------- + +criterion_group!( + parse_benches, + bench_parse_small, + bench_parse_medium, + bench_parse_large +); + +criterion_group!( + render_benches, + bench_render_small, + bench_render_medium, + bench_render_large +); + +criterion_group!( + roundtrip_benches, + bench_roundtrip_small, + bench_roundtrip_medium, + bench_roundtrip_large +); + +criterion_group!( + attestation_benches, + bench_parse_attestation_heavy, + bench_parse_directive_heavy, + bench_attestation_access, + bench_render_attestation_heavy, +); + +criterion_main!(parse_benches, render_benches, roundtrip_benches, attestation_benches); diff --git a/rs/container/.gatekeeper.yaml b/rs/container/.gatekeeper.yaml new file mode 100644 index 0000000..4aac671 --- /dev/null +++ b/rs/container/.gatekeeper.yaml @@ -0,0 +1,122 @@ +# SPDX-License-Identifier: MPL-2.0 +# +# Svalinn gatekeeper policy for {{PROJECT_NAME}} +# +# Controls which operations are permitted through the edge gateway. +# This template provides moderate security defaults — not wide-open test +# mode, but not production-hardened either. Tighten the values below +# before deploying to production. +# +# See: stapeln/container-stack/svalinn/ + +version: "1.0" + +# ============================================================================ +# Authentication +# ============================================================================ +# +# Define which endpoints require authentication and at what level. + +auth: + # Public endpoints — no authentication required. + # Health and readiness probes must always be public so that + # orchestrators (selur, Podman, k8s) can check service status. + public: + - path: "/health" + methods: ["GET"] + - path: "/ready" + methods: ["GET"] + - path: "/metrics" + methods: ["GET"] + + # Endpoints requiring JWT or OAuth2 authentication. + # Svalinn validates the token before forwarding the request. + authenticated: + - path: "/api/v1/*" + methods: ["GET", "POST", "PUT", "DELETE"] + +# ============================================================================ +# Rate Limiting +# ============================================================================ +# +# Protects backend services from overload. Values here are moderate +# defaults — adjust based on your service capacity. + +rate_limits: + # Global limit: applied to all authenticated clients. + global: + requests_per_second: 500 + burst: 1000 + + # Write operations: stricter limit to protect data stores. + writes: + paths: ["/api/v1/*"] + methods: ["POST", "PUT", "DELETE"] + requests_per_second: 100 + burst: 200 + +# ============================================================================ +# Container Trust +# ============================================================================ +# +# Svalinn verifies that all .ctp bundles in the stack are signed by +# trusted keys and carry the required attestations. + +trust: + # Only accept .ctp bundles signed by these keys. + trusted_signers: + - key_id: "{{SERVICE_NAME}}-release" + algorithm: "Ed25519" + public_key_file: "/etc/svalinn/keys/{{SERVICE_NAME}}-release.pub" + + # Require these attestations on all .ctp bundles. + required_attestations: + - "source-signature" + - "sbom-complete" + + # Reject unsigned or untrusted images. + reject_unsigned: true + +# ============================================================================ +# Request Validation +# ============================================================================ +# +# Input validation at the gateway layer — catches malformed requests +# before they reach the application. + +validation: + # Maximum request body size. + max_body_size: "8MB" + + # Reject requests with NaN or Infinity in numeric fields. + reject_nan_inf: true + + # Maximum result limit per list/search query. + max_result_limit: 500 + +# ============================================================================ +# CORS +# ============================================================================ +# +# Cross-Origin Resource Sharing policy. The defaults below allow all +# origins — restrict to your frontend domain(s) in production. + +cors: + allow_origins: ["*"] + allow_methods: ["GET", "POST", "PUT", "DELETE", "OPTIONS"] + allow_headers: ["Content-Type", "Authorization"] + max_age: 3600 + +# ============================================================================ +# Logging +# ============================================================================ +# +# Structured logging for svalinn itself. Audit paths log all requests +# (including body hashes) for post-incident investigation. + +logging: + format: "json" + level: "info" + # Log all write operations for audit trail. + audit_paths: + - "/api/v1/*" diff --git a/rs/container/0.1-AI-MANIFEST.a2ml b/rs/container/0.1-AI-MANIFEST.a2ml new file mode 100644 index 0000000..ccb5bc5 --- /dev/null +++ b/rs/container/0.1-AI-MANIFEST.a2ml @@ -0,0 +1,143 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "container-templates" +version: "1.0.0" +context: + - "https://a2ml.org/ns/v2" + - "https://stapeln.dev/ns/v1" + +--- +### [AI_MANIFEST] +description: | + Container templates for the stapeln container ecosystem. This directory + provides Podman-Chainguard-stapeln templates that are customised via + `just container-init` or `just init` during project bootstrap. + + All files use {{PLACEHOLDER}} tokens that are substituted with project- + specific values during initialisation. + +purpose: | + Provide a complete, security-first container deployment story for any + RSR-compliant repository. The templates cover the full lifecycle: + build, sign, verify, deploy, monitor, and govern. + +canonical_locations: + compose: "container/compose.toml" + containerfile: "container/Containerfile" + manifest: "container/manifest.toml" + gatekeeper: "container/.gatekeeper.yaml" + build_pipeline: "container/ct-build.sh" + entrypoint: "container/entrypoint.sh" + monitoring: "container/vordr.toml" + deployment: "container/deploy.k9.ncl" + example: "container/compose.example.toml" + +--- +### [FILE_RELATIONSHIPS] +files: + - name: "compose.toml" + role: "Orchestration" + description: | + selur-compose stack definition. Declares services, volumes, networks, + and health checks. References the Containerfile for image builds and + .gatekeeper.yaml for svalinn policy. + depends_on: ["Containerfile", ".gatekeeper.yaml"] + + - name: "Containerfile" + role: "Image Build" + description: | + Multi-stage OCI container build. Stage 1 compiles the application on + wolfi-base; Stage 2 copies the binary into a minimal runtime image. + Copies entrypoint.sh, .gatekeeper.yaml, and manifest.toml into the + final image. + depends_on: ["entrypoint.sh", ".gatekeeper.yaml", "manifest.toml"] + + - name: "manifest.toml" + role: "Bundle Metadata" + description: | + Cerro-torre .ctp bundle manifest. Describes provenance, dependencies, + attestations, and runtime security profile. Used by `ct pack` and + `ct verify`. + depends_on: [] + + - name: ".gatekeeper.yaml" + role: "Gateway Policy" + description: | + Svalinn edge gateway policy. Controls authentication, rate limiting, + container trust, request validation, CORS, and audit logging. + depends_on: [] + + - name: "ct-build.sh" + role: "Build Pipeline" + description: | + Shell script implementing the 5-stage pipeline: build (Podman), + pack (cerro-torre .ctp), sign (Ed25519), verify, push (optional). + Degrades gracefully when cerro-torre tools are not installed. + depends_on: ["Containerfile", "manifest.toml"] + + - name: "entrypoint.sh" + role: "Container Entrypoint" + description: | + Startup script with signal handling (SIGTERM, SIGINT), logging, and + exec into the main application process. + depends_on: [] + + - name: "vordr.toml" + role: "Runtime Monitoring" + description: | + Vordr monitoring configuration. Health endpoint probing, crash + detection, resource thresholds, and structured log output. + depends_on: [] + + - name: "deploy.k9.ncl" + role: "Deployment Component" + description: | + k9-svc deployment specification at Hunt trust level. Full pedigree + (L1-L5), environment configs, container config, and rolling + deployment strategy. + depends_on: ["compose.toml", "ct-build.sh"] + + - name: "compose.example.toml" + role: "Example" + description: | + Fully-commented multi-service example (Rust API + Elixir worker + + svalinn gateway). Copy to compose.toml and customise. + depends_on: [] + +--- +### [STAPELN_ECOSYSTEM] +overview: | + The stapeln container ecosystem comprises six tools: + + selur — Container orchestration with zero-copy IPC. Reads compose.toml. + cerro-torre — Verified container packaging (.ctp bundles), Ed25519 signing. + svalinn — Policy-driven edge gateway (auth, rate limits, CORS, trust). + vordr — Runtime monitoring (health, crashes, resources, logs). + rokur — Secrets management (runtime injection, no baked secrets). + k9-svc — Nickel deployment components (Kennel/Yard/Hunt trust levels). + +invariants: + - "Base images MUST be cgr.dev/chainguard/wolfi-base or cgr.dev/chainguard/static" + - "Container runtime is Podman — never Docker" + - "Containerfile — never Dockerfile" + - "All images run as non-root (appuser or project-specific user)" + - ".ctp bundles are signed with Ed25519 via cerro-torre" + - "Health endpoints (/health, /ready) must always be public (no auth)" + +--- +### [USAGE] +initialisation: | + Run `just container-init` to substitute all {{PLACEHOLDER}} tokens with + project-specific values. This is also run as part of `just init`. + +development: | + 1. `just container-build` — Build the container image + 2. `just container-verify` — Verify compose configuration + 3. `just container-up` — Start the stack locally + 4. `just container-down` — Stop the stack + +production: | + 1. `just container-sign` — Build, sign, verify .ctp bundle + 2. `just container-push` — Push signed bundle to registry + 3. `selur-compose up` — Deploy on target host diff --git a/rs/container/Containerfile b/rs/container/Containerfile new file mode 100644 index 0000000..ba85260 --- /dev/null +++ b/rs/container/Containerfile @@ -0,0 +1,136 @@ +# SPDX-License-Identifier: MPL-2.0 +# {{PROJECT_NAME}} Container Image +# +# Multi-stage build template for Chainguard Wolfi base images. +# Customise the builder stage for your language and copy the +# resulting binary/release into the minimal runtime stage. +# +# Build with Podman: +# podman build -t {{SERVICE_NAME}}:latest -f container/Containerfile . +# +# Run: +# podman run -p {{PORT}}:{{PORT}} {{SERVICE_NAME}}:latest +# +# Run with persistent volume: +# podman run -p {{PORT}}:{{PORT}} -v {{SERVICE_NAME}}-data:/data {{SERVICE_NAME}}:latest + +# ============================================================================ +# Stage 1: Builder +# ============================================================================ +# +# Install build tools and compile the application. +# This stage is discarded after the build — only the compiled output +# is copied into the runtime stage. +# +# Language-specific examples (uncomment the one you need): +# +# --- Rust --- +# RUN apk add --no-cache rust pkgconf build-base +# COPY Cargo.toml Cargo.lock ./ +# COPY src/ ./src/ +# RUN cargo build --release +# # Output: /build/target/release/{{SERVICE_NAME}} +# +# --- Elixir --- +# RUN apk add --no-cache erl27-elixir-1.18 erlang-27 erlang-27-dev git build-base +# COPY mix.exs mix.lock ./ +# COPY lib/ ./lib/ +# COPY config/ ./config/ +# ENV MIX_ENV=prod +# RUN mix local.hex --force && mix local.rebar --force && \ +# mix deps.get --only prod && mix compile && mix release +# # Output: /build/_build/prod/rel/{{SERVICE_NAME}}/ +# +# --- Zig --- +# RUN apk add --no-cache zig build-base +# COPY build.zig build.zig.zon ./ +# COPY src/ ./src/ +# RUN zig build -Doptimize=ReleaseFast +# # Output: /build/zig-out/bin/{{SERVICE_NAME}} +# +FROM cgr.dev/chainguard/wolfi-base:latest AS builder + +# TODO: Install your language toolchain +RUN apk add --no-cache build-base + +WORKDIR /build + +# TODO: Copy source files and build +COPY . . +# RUN + +# ============================================================================ +# Stage 2: Runtime +# ============================================================================ +# +# Minimal production image. Only the compiled binary/release and runtime +# dependencies are included. No compilers, no source code, no build tools. +# +FROM cgr.dev/chainguard/wolfi-base:latest + +# OCI image labels (compatible with cerro-torre .ctp bundle metadata) +LABEL org.opencontainers.image.title="{{PROJECT_NAME}}" \ + org.opencontainers.image.description="{{PROJECT_DESCRIPTION}}" \ + org.opencontainers.image.url="https://{{FORGE}}/{{OWNER}}/{{REPO}}" \ + org.opencontainers.image.source="https://{{FORGE}}/{{OWNER}}/{{REPO}}" \ + org.opencontainers.image.vendor="{{OWNER}}" \ + org.opencontainers.image.licenses="{{LICENSE}}" \ + org.opencontainers.image.authors="{{AUTHOR}} <{{AUTHOR_EMAIL}}>" \ + dev.cerrotorre.manifest="container/manifest.toml" \ + dev.cerrotorre.gatekeeper="container/.gatekeeper.yaml" \ + dev.stapeln.compose="container/compose.toml" + +# Install minimal runtime dependencies. +# Adjust this list for your application: +# - ca-certificates: TLS root certificates +# - curl: health check probe +# - libstdc++: C++ standard library (if needed by native deps) +# - ncurses: terminal UI (if needed, e.g. Elixir IEx) +RUN apk add --no-cache ca-certificates curl + +# Create non-root user for the application. +# Running as root inside containers is a security anti-pattern. +RUN addgroup -S appuser && adduser -S appuser -G appuser + +WORKDIR /app + +# TODO: Copy compiled binary/release from builder stage. +# Examples: +# COPY --from=builder /build/target/release/{{SERVICE_NAME}} /app/{{SERVICE_NAME}} +# COPY --from=builder /build/_build/prod/rel/{{SERVICE_NAME}} /app/release/ +# COPY --from=builder /build/zig-out/bin/{{SERVICE_NAME}} /app/{{SERVICE_NAME}} + +# Copy entrypoint script +COPY container/entrypoint.sh /app/entrypoint.sh +RUN chmod +x /app/entrypoint.sh + +# Copy stapeln integration files (svalinn gatekeeper policy, cerro-torre manifest) +COPY container/.gatekeeper.yaml /etc/svalinn/gatekeeper.yaml +COPY container/manifest.toml /app/manifest.toml + +# Create data directory for persistent storage (mountable volume) +RUN mkdir -p /data && chown appuser:appuser /data + +# Set ownership of the application directory +RUN chown -R appuser:appuser /app + +# Environment variables — customise for your application +ENV APP_HOST=[::] +ENV APP_PORT={{PORT}} +ENV APP_LOG_FORMAT=json +ENV APP_DATA_DIR=/data + +# Declare /data as a volume for persistent storage +VOLUME ["/data"] + +# Run as non-root +USER appuser + +# Expose the application port +EXPOSE {{PORT}} + +# Health check — the application must respond 2xx at /health +HEALTHCHECK --interval=30s --timeout=5s --start-period=10s --retries=3 \ + CMD curl -sf http://localhost:${APP_PORT}/health || exit 1 + +ENTRYPOINT ["/app/entrypoint.sh"] diff --git a/rs/container/README.adoc b/rs/container/README.adoc new file mode 100644 index 0000000..9f7f7f0 --- /dev/null +++ b/rs/container/README.adoc @@ -0,0 +1,179 @@ +// SPDX-License-Identifier: CC-BY-SA-4.0 +// Copyright (c) {{CURRENT_YEAR}} {{AUTHOR}} ({{OWNER}}) <{{AUTHOR_EMAIL}}> += {{PROJECT_NAME}} Container Templates +:toc: left +:toclevels: 3 +:sectnums: + +== Overview + +This directory contains container templates for the +https://github.com/hyperpolymath/stapeln[stapeln] container ecosystem. +The stapeln stack provides verified container packaging, edge gateway +policies, runtime monitoring, and supply-chain signing for Podman-based +deployments using https://www.chainguard.dev/[Chainguard] Wolfi base images. + +All files use `{{PLACEHOLDER}}` tokens that are replaced by `just container-init` +(or by the top-level `just init` during project bootstrap). + +== File Reference + +[cols="1,3"] +|=== +| File | Purpose + +| `compose.toml` +| **selur-compose** stack definition. Declares services, volumes, networks, + and health checks. The primary orchestration file for local and production + deployment. Use `selur-compose up` or fall back to `podman compose`. + +| `compose.example.toml` +| Concrete multi-service example with detailed comments. Copy and customise + for your own stack. Not used directly by any tooling. + +| `Containerfile` +| Multi-stage OCI container build specification. Stage 1 builds the + application; Stage 2 produces a minimal runtime image on + `cgr.dev/chainguard/wolfi-base`. Uses Podman (never Docker). + +| `manifest.toml` +| **cerro-torre** bundle metadata. Describes the `.ctp` verified container + package: provenance, dependencies, attestations, and runtime security + profile. Used by `ct pack` and `ct verify`. + +| `.gatekeeper.yaml` +| **svalinn** edge gateway policy. Controls authentication, rate limiting, + container trust, request validation, CORS, and audit logging at the + network boundary. + +| `ct-build.sh` +| Build, sign, and verify pipeline script. Five stages: build (Podman), + pack (cerro-torre `.ctp`), sign (Ed25519), verify, and push (optional). + Gracefully degrades when cerro-torre tools are not installed. + +| `entrypoint.sh` +| Container entrypoint with signal handling (SIGTERM, SIGINT), startup + logging, and `exec` into the main application process. + +| `vordr.toml` +| **vordr** runtime monitoring configuration. Defines health endpoints, + crash detection, resource thresholds, and log output. + +| `deploy.k9.ncl` +| **k9-svc** deployment component at Hunt trust level. Full pedigree + (L1--L5), environment configs (dev/staging/prod), container + configuration, and rolling deployment strategy. + +| `0-AI-MANIFEST.a2ml` +| AI-readable manifest describing the container directory, file + interconnections, and the stapeln ecosystem. +|=== + +== The stapeln Ecosystem + +The stapeln container ecosystem comprises six interconnected tools: + +**selur** (compose):: + Container orchestration with zero-copy IPC for co-located services. + Reads `compose.toml` files. Falls back to standard Podman Compose + when the selur driver is unavailable. + +**cerro-torre** (bundles and signing):: + Verified container packaging. Produces `.ctp` bundles from OCI images, + signs them with Ed25519, and verifies the full chain. Tools: `ct pack`, + `ct sign`, `ct verify`, `ct push`, `ct explain`. + +**svalinn** (edge gateway):: + Policy-driven reverse proxy. Enforces authentication, rate limiting, + CORS, and container trust policies defined in `.gatekeeper.yaml`. + +**vordr** (monitoring):: + Runtime container monitoring. Watches health endpoints, detects crashes, + tracks resource usage, and emits structured logs. + +**rokur** (secrets):: + Secrets management for container deployments. Injects secrets at runtime + without baking them into images. Currently a stub/placeholder. + +**k9-svc** (deployment components):: + Nickel-based deployment specification. Components declare their pedigree + (identity, target, security, validation, recipes) and execute at one of + three trust levels: Kennel (data only), Yard (evaluation), Hunt (full + execution with cryptographic handshake). + +== How to Initialise + +[source,bash] +---- +# Option 1: During project bootstrap (includes all placeholders) +just init + +# Option 2: Container-specific initialisation +just container-init +---- + +The `container-init` recipe prompts for container-specific values +(service name, port, registry) and substitutes all `{{PLACEHOLDER}}` +tokens in the `container/` directory. + +== Development Workflow + +[source,bash] +---- +# 1. Build the container image +just container-build + +# 2. Verify the compose configuration +just container-verify + +# 3. Start the stack locally +just container-up --detach + +# 4. Check logs +podman compose --file container/compose.toml logs -f + +# 5. Stop the stack +just container-down +---- + +== Production Deployment + +[source,bash] +---- +# 1. Build, sign, and verify the .ctp bundle +just container-sign + +# 2. Push the signed bundle to the registry +just container-push + +# 3. Deploy on the target host +selur-compose up --detach +---- + +For k9-svc managed deployments: + +[source,bash] +---- +# Validate the deployment component +nickel typecheck container/deploy.k9.ncl + +# Deploy (requires Hunt-level authorisation) +k9-svc deploy container/deploy.k9.ncl --env production +---- + +== Base Images + +All Containerfiles use Chainguard Wolfi base images: + +* **Builder stage:** `cgr.dev/chainguard/wolfi-base:latest` +* **Runtime stage:** `cgr.dev/chainguard/wolfi-base:latest` (or + `cgr.dev/chainguard/static:latest` for statically-linked binaries) + +Chainguard images are minimal, CVE-free, and rebuilt daily. They use the +`apk` package manager (Alpine-compatible). + +== Container Runtime + +This project uses **Podman** (never Docker). All scripts, compose files, +and documentation reference Podman commands. The OCI Containerfile format +is compatible with Podman, Docker, and nerdctl. diff --git a/rs/container/compose.example.toml b/rs/container/compose.example.toml new file mode 100644 index 0000000..d8d717c --- /dev/null +++ b/rs/container/compose.example.toml @@ -0,0 +1,135 @@ +# SPDX-License-Identifier: MPL-2.0 +# +# Example selur-compose configuration — multi-service stack +# +# This is a concrete, fully-commented example showing a Rust API + Elixir +# worker + svalinn gateway deployment. Copy this file to compose.toml and +# customise for your project. +# +# Usage: +# cp compose.example.toml compose.toml +# # Edit service names, ports, images +# selur-compose up --detach + +version = "1.0" + +# ============================================================================ +# Services +# ============================================================================ + +# Rust API service — the primary HTTP/gRPC backend. +# Handles incoming requests, data storage, and core business logic. +[services.rust-api] +image = "ghcr.io/hyperpolymath/myproject-api:latest.ctp" + +# Map host port 8080 to container port 8080. +# Use ["[::]:8080:8080"] for explicit IPv6 binding. +ports = ["8080:8080"] + +# Environment variables passed into the container at startup. +# These override defaults in the Containerfile ENV directives. +environment = { + RUST_LOG = "info", # Rust log level (trace, debug, info, warn, error) + APP_HOST = "[::]", # Listen on all interfaces (IPv4 + IPv6) + APP_PORT = "8080", # Internal container port + APP_LOG_FORMAT = "json", # Structured logging for selur/vordr + APP_DATA_DIR = "/data", # Persistent data directory (matches VOLUME) +} + +# Bind-mount a named volume for persistent data. +# Format: "volume-name:/container/path" +volumes = ["api-data:/data"] + +# Restart policy: "always" ensures the service comes back after crashes. +# Other options: "no", "on-failure", "unless-stopped" +restart = "always" + +# Health check: selur/Podman uses this to determine if the service is ready. +# The service must respond 2xx to this endpoint within the timeout. +healthcheck = { test = "curl -sf http://localhost:8080/health", interval = "30s", timeout = "5s", retries = 3 } + +# --- + +# Elixir worker service — background processing, event handling, coordination. +# Runs as an OTP release with supervision trees for fault tolerance. +[services.elixir-worker] +image = "ghcr.io/hyperpolymath/myproject-worker:latest.ctp" + +# Separate port for the worker's admin/metrics endpoint. +ports = ["4000:4000"] + +# The worker connects to the Rust API over the internal selur network. +# Service names resolve as hostnames within the compose network. +environment = { + API_URL = "http://rust-api:8080/api/v1", # Internal service discovery + MIX_ENV = "prod", # Elixir release mode + APP_LOG_FORMAT = "json", # Match structured logging format + POOL_SIZE = "10", # DB connection pool size +} + +# depends_on ensures the Rust API starts before the worker. +# Note: This only waits for the container to start, not for the health check. +# Use healthcheck + startup probes for true readiness gating. +depends_on = ["rust-api"] + +restart = "always" +healthcheck = { test = "curl -sf http://localhost:4000/health", interval = "30s", timeout = "5s", retries = 3 } + +# --- + +# Svalinn edge gateway — reverse proxy with policy enforcement. +# All external traffic enters through svalinn, which: +# 1. Terminates TLS (auto-provisioned certificates) +# 2. Validates JWT/OAuth2 authentication +# 3. Enforces rate limits from .gatekeeper.yaml +# 4. Routes requests to the appropriate backend service +# 5. Logs all write operations for audit +[services.svalinn] +image = "ghcr.io/hyperpolymath/svalinn:latest.ctp" + +# External-facing ports: HTTPS (443) and HTTP->HTTPS redirect (80). +ports = ["443:443", "80:80"] + +environment = { + # Backend routing: svalinn proxies to internal services. + SVALINN_BACKEND = "http://rust-api:8080", + SVALINN_WORKER_BACKEND = "http://elixir-worker:4000", + + # Policy file: mounted from the svalinn-config volume. + SVALINN_POLICY_FILE = "/etc/svalinn/gatekeeper.yaml", + + # Auto-provision TLS certificates (Let's Encrypt). + SVALINN_TLS_AUTO = "true", +} + +# Mount .gatekeeper.yaml as read-only policy configuration. +volumes = ["svalinn-config:/etc/svalinn:ro"] + +# Svalinn starts last — it needs both backends to be running. +depends_on = ["rust-api", "elixir-worker"] +restart = "always" +healthcheck = { test = "curl -sf http://localhost:80/health", interval = "30s", timeout = "5s", retries = 3 } + +# ============================================================================ +# Volumes +# ============================================================================ + +# Persistent storage for the Rust API (database files, indexes, WAL). +[volumes.api-data] +driver = "local" + +# Read-only policy configuration for svalinn gateway. +# Populate with: cp .gatekeeper.yaml /path/to/svalinn-config/gatekeeper.yaml +[volumes.svalinn-config] +driver = "local" + +# ============================================================================ +# Networks +# ============================================================================ + +# selur network: zero-copy IPC between services on the same host. +# When the selur driver is not installed, falls back to standard bridge +# networking (TCP over localhost). Performance is slightly lower but +# functionality is identical. +[networks.default] +driver = "selur" diff --git a/rs/container/compose.toml b/rs/container/compose.toml new file mode 100644 index 0000000..a14f8a0 --- /dev/null +++ b/rs/container/compose.toml @@ -0,0 +1,70 @@ +# SPDX-License-Identifier: MPL-2.0 +# +# {{PROJECT_NAME}} selur-compose configuration +# +# Orchestrates the container stack as verified container bundles (.ctp). +# Uses selur zero-copy IPC between services on the same host. +# +# Usage: +# selur-compose up # Start all services +# selur-compose up --detach # Start in background +# selur-compose verify # Verify all .ctp signatures +# selur-compose ps # Check status +# selur-compose logs -f {{SERVICE_NAME}} # Stream logs +# selur-compose down # Stop all services +# +# Fallback (when selur is not installed): +# podman compose --file compose.toml up --detach + +version = "1.0" + +# ============================================================================ +# Services +# ============================================================================ + +# Primary application service +[services.{{SERVICE_NAME}}] +image = "{{REGISTRY}}/{{SERVICE_NAME}}:latest.ctp" +ports = ["{{PORT}}:{{PORT}}"] +environment = { + APP_HOST = "[::]", + APP_PORT = "{{PORT}}", + APP_LOG_FORMAT = "json", + APP_DATA_DIR = "/data", +} +volumes = ["{{SERVICE_NAME}}-data:/data"] +restart = "always" +healthcheck = { test = "curl -sf http://localhost:{{PORT}}/health", interval = "30s", timeout = "5s", retries = 3 } + +# Svalinn edge gateway: validates requests, enforces policies, TLS termination +[services.svalinn] +image = "ghcr.io/hyperpolymath/svalinn:latest.ctp" +ports = ["443:443", "80:80"] +environment = { + SVALINN_BACKEND = "http://{{SERVICE_NAME}}:{{PORT}}", + SVALINN_POLICY_FILE = "/etc/svalinn/gatekeeper.yaml", + SVALINN_TLS_AUTO = "true", +} +volumes = ["svalinn-config:/etc/svalinn:ro"] +depends_on = ["{{SERVICE_NAME}}"] +restart = "always" +healthcheck = { test = "curl -sf http://localhost:80/health", interval = "30s", timeout = "5s", retries = 3 } + +# ============================================================================ +# Volumes +# ============================================================================ + +[volumes.{{SERVICE_NAME}}-data] +driver = "local" + +[volumes.svalinn-config] +driver = "local" + +# ============================================================================ +# Networks +# ============================================================================ + +# Use selur zero-copy IPC for inter-service communication on the same host. +# Falls back to standard bridge networking when selur driver is unavailable. +[networks.default] +driver = "selur" diff --git a/rs/container/ct-build.sh b/rs/container/ct-build.sh new file mode 100755 index 0000000..a54a541 --- /dev/null +++ b/rs/container/ct-build.sh @@ -0,0 +1,162 @@ +#!/usr/bin/env bash +# SPDX-License-Identifier: MPL-2.0 +# +# {{PROJECT_NAME}} — Cerro Torre build, sign, and verify pipeline +# +# Builds the container image, packages it as a verified .ctp bundle, +# signs it with Ed25519, and verifies the result. Gracefully degrades +# when cerro-torre tools are not installed. +# +# Prerequisites: +# - podman (container build — required) +# - ct (cerro-torre CLI: pack, sign, verify — optional) +# - cerro-sign (Ed25519 signing — optional, ct sign used as fallback) +# +# Usage: +# ./ct-build.sh # Build + sign (local only) +# ./ct-build.sh --push # Build + sign + push to registry +# CT_KEY_ID=my-key ./ct-build.sh # Use specific signing key +# +# Environment variables: +# CT_KEY_ID — Signing key identifier (default: {{SERVICE_NAME}}-release) +# CT_REGISTRY — OCI registry to push to (default: {{REGISTRY}}) +# CT_TAG — Image tag (default: latest) + +set -euo pipefail + +# --------------------------------------------------------------------------- +# Configuration +# --------------------------------------------------------------------------- + +SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" +REPO_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)" + +PUSH="" +for arg in "$@"; do + if [ "$arg" = "--push" ]; then + PUSH="--push" + fi +done + +CT_KEY_ID="${CT_KEY_ID:-{{SERVICE_NAME}}-release}" +CT_REGISTRY="${CT_REGISTRY:-{{REGISTRY}}}" +CT_TAG="${CT_TAG:-latest}" + +IMAGE_NAME="{{SERVICE_NAME}}" +FULL_IMAGE="${CT_REGISTRY}/${IMAGE_NAME}:${CT_TAG}" +CTP_FILE="${SCRIPT_DIR}/${IMAGE_NAME}-${CT_TAG}.ctp" + +echo "=== {{PROJECT_NAME}} Cerro Torre Build Pipeline ===" +echo " Image: ${FULL_IMAGE}" +echo " Key: ${CT_KEY_ID}" +echo " Bundle: ${CTP_FILE}" +echo "" + +# --------------------------------------------------------------------------- +# Step 1: Build container image with Podman +# --------------------------------------------------------------------------- + +echo "--- Step 1: Building container image ---" + +podman build \ + -t "${FULL_IMAGE}" \ + -f "${SCRIPT_DIR}/Containerfile" \ + "${REPO_ROOT}" + +echo " Built: ${FULL_IMAGE}" +echo "" + +# --------------------------------------------------------------------------- +# Step 2: Pack into .ctp bundle +# --------------------------------------------------------------------------- + +echo "--- Step 2: Packing into .ctp bundle ---" + +if command -v ct &>/dev/null; then + ct pack "${FULL_IMAGE}" -o "${CTP_FILE}" + echo " Packed: ${CTP_FILE}" +else + echo " SKIP: ct not found (install cerro-torre CLI from stapeln/container-stack/cerro-torre)" + echo " The container image is built and tagged but not packed as a .ctp bundle." + echo " To pack manually: ct pack ${FULL_IMAGE} -o ${CTP_FILE}" + echo "" + if [ "$PUSH" = "--push" ]; then + echo "--- Pushing unsigned OCI image (no .ctp) ---" + podman push "${FULL_IMAGE}" + echo " Pushed: ${FULL_IMAGE} (unsigned OCI — not a .ctp bundle)" + fi + echo "" + echo "=== Build complete (without .ctp signing) ===" + exit 0 +fi + +echo "" + +# --------------------------------------------------------------------------- +# Step 3: Sign the .ctp bundle +# --------------------------------------------------------------------------- + +echo "--- Step 3: Signing .ctp bundle ---" + +if command -v cerro-sign &>/dev/null; then + cerro-sign sign "${CTP_FILE}" --key-id "${CT_KEY_ID}" + echo " Signed: ${CTP_FILE} (key: ${CT_KEY_ID})" +elif command -v ct &>/dev/null; then + ct sign "${CTP_FILE}" --key "${CT_KEY_ID}" + echo " Signed: ${CTP_FILE} (key: ${CT_KEY_ID})" +else + echo " SKIP: cerro-sign not found (install from stapeln/container-stack/cerro-torre)" +fi + +echo "" + +# --------------------------------------------------------------------------- +# Step 4: Verify the .ctp bundle +# --------------------------------------------------------------------------- + +echo "--- Step 4: Verifying .ctp bundle ---" + +if command -v ct &>/dev/null; then + ct verify "${CTP_FILE}" + echo " Verified: ${CTP_FILE}" +else + echo " SKIP: ct not found" +fi + +echo "" + +# --------------------------------------------------------------------------- +# Step 5: Push to registry (optional) +# --------------------------------------------------------------------------- + +if [ "$PUSH" = "--push" ]; then + echo "--- Step 5: Pushing to registry ---" + + if command -v ct &>/dev/null; then + ct push "${CTP_FILE}" "${FULL_IMAGE}" + echo " Pushed: ${FULL_IMAGE}" + else + # Fall back to podman push (unsigned OCI image) + echo " ct not available, falling back to podman push (unsigned)" + podman push "${FULL_IMAGE}" + echo " Pushed: ${FULL_IMAGE} (unsigned OCI — not a .ctp bundle)" + fi + echo "" +fi + +# --------------------------------------------------------------------------- +# Summary +# --------------------------------------------------------------------------- + +echo "=== Build pipeline complete ===" +echo " Image: ${FULL_IMAGE}" +echo " Bundle: ${CTP_FILE}" +echo "" +echo " To deploy with selur-compose:" +echo " cd container && selur-compose up" +echo "" +echo " To verify at any time:" +echo " ct verify ${CTP_FILE}" +echo "" +echo " To explain the verification chain:" +echo " ct explain ${CTP_FILE}" diff --git a/rs/container/deploy.k9.ncl b/rs/container/deploy.k9.ncl new file mode 100644 index 0000000..0ad0d04 --- /dev/null +++ b/rs/container/deploy.k9.ncl @@ -0,0 +1,166 @@ +# SPDX-License-Identifier: MPL-2.0 +# deploy.k9.ncl — {{PROJECT_NAME}} deployment component (Hunt level) +# +# k9-svc deployment specification with full pedigree (L1-L5). +# Security Level: 'Hunt (requires cryptographic handshake for execution). +# +# WARNING: This component can execute shell commands! +# It requires explicit authorisation via the Leash system. +# +# Usage: +# nickel typecheck container/deploy.k9.ncl +# k9-svc validate container/deploy.k9.ncl +# k9-svc deploy container/deploy.k9.ncl --env production + +# The component's pedigree (self-description across five layers) +let component_pedigree = { + # ───────────────────────────────────────────────────────────── + # L1: The Snout — Identity + # ───────────────────────────────────────────────────────────── + metadata = { + name = "{{SERVICE_NAME}}-deploy", + version = "{{VERSION}}", + breed = "application/vnd.k9+nickel", + magic_number = "K9!", + description = "{{PROJECT_NAME}} deployment component (Hunt level)", + }, + + # ───────────────────────────────────────────────────────────── + # L2: The Scent — Target Environment + # ───────────────────────────────────────────────────────────── + target = { + os = 'Linux, + is_edge = false, + requires_podman = true, + min_memory_mb = 256, + }, + + # ───────────────────────────────────────────────────────────── + # L3: The Leash — Security + # ───────────────────────────────────────────────────────────── + security = { + trust_level = 'Hunt, + allow_network = true, + allow_filesystem_write = true, + allow_subprocess = true, + # In production, replace with a real Ed25519 signature. + signature = "PLACEHOLDER-SIGNATURE-REQUIRED-FOR-HUNT", + }, + + # ───────────────────────────────────────────────────────────── + # L4: The Gut — Self-Validation + # ───────────────────────────────────────────────────────────── + validation = { + checksum = "sha256:placeholder", + pedigree_version = "1.0.0", + hunt_authorized = false, # Must be set true after handshake + }, + + # ───────────────────────────────────────────────────────────── + # L5: The Muscle — Deployment Recipes + # ───────────────────────────────────────────────────────────── + recipes = { + install = "just container-build", + validate = "just container-verify", + deploy = "just container-up", + migrate = "just container-build && just container-up", + }, +} in + +# Deployment configuration +let deployment = { + # Target environments (dev / staging / production) + environments = { + dev = { + replicas = 1, + memory = "256Mi", + cpu = "100m", + image_tag = "dev", + }, + staging = { + replicas = 2, + memory = "512Mi", + cpu = "250m", + image_tag = "staging", + }, + production = { + replicas = 3, + memory = "1Gi", + cpu = "500m", + image_tag = "latest", + }, + }, + + # Container configuration + container = { + image = "{{REGISTRY}}/{{SERVICE_NAME}}", + port = {{PORT}}, + health_check = "/health", + readiness_check = "/ready", + }, + + # Deployment strategy + strategy = { + type = "rolling", + max_surge = 1, + max_unavailable = 0, + }, +} in + +# Deployment scripts (executed at Hunt level) +let scripts = { + # Pre-deployment validation + pre_deploy = m%" +#!/bin/sh +set -eu +echo "K9: Pre-deployment validation for {{SERVICE_NAME}}..." +cd container && selur-compose verify || podman compose --file compose.toml config +echo "K9: Validation passed." +"%, + + # Deployment script + deploy = m%" +#!/bin/sh +set -eu +ENV="${1:-dev}" +echo "K9: Deploying {{SERVICE_NAME}} to $ENV environment..." +cd container +./ct-build.sh +selur-compose up --detach || podman compose --file compose.toml up --detach +echo "K9: Deployment to $ENV complete." +"%, + + # Rollback script + rollback = m%" +#!/bin/sh +set -eu +echo "K9: Rolling back {{SERVICE_NAME}} deployment..." +cd container +selur-compose down || podman compose --file compose.toml down +echo "K9: Rollback complete." +"%, +} in + +# Export the component +{ + pedigree = component_pedigree, + deployment = deployment, + scripts = scripts, + + # Security check: this component requires Hunt level + required_level = 'Hunt, + + # Warning for users + warning = m%" +WARNING: This is a Hunt-level component. + +It can execute shell commands and modify your system. +Before running, ensure you have: + +1. Reviewed the deployment scripts above +2. Verified the signature (when implemented) +3. Explicitly authorised Hunt-level execution + +Run with: k9-svc authorize container/deploy.k9.ncl && k9-svc deploy container/deploy.k9.ncl +"%, +} diff --git a/rs/container/entrypoint.sh b/rs/container/entrypoint.sh new file mode 100755 index 0000000..a7a0369 --- /dev/null +++ b/rs/container/entrypoint.sh @@ -0,0 +1,63 @@ +#!/bin/sh +# SPDX-License-Identifier: MPL-2.0 +# {{PROJECT_NAME}} container entrypoint +# +# Handles signal propagation, startup logging, and health check +# preparation before exec-ing into the main application process. + +set -e + +# --------------------------------------------------------------------------- +# Signal handling +# --------------------------------------------------------------------------- +# +# Trap SIGTERM and SIGINT so that the application can shut down gracefully +# when Podman sends stop signals (e.g. `podman stop`, `selur-compose down`). + +cleanup() { + echo "Received shutdown signal — stopping {{SERVICE_NAME}}..." + # If the main process is backgrounded, kill it here: + # kill "$MAIN_PID" 2>/dev/null || true + # wait "$MAIN_PID" 2>/dev/null || true + exit 0 +} +trap cleanup TERM INT + +# --------------------------------------------------------------------------- +# Startup logging +# --------------------------------------------------------------------------- + +echo "Starting {{SERVICE_NAME}}..." +echo " Host: ${APP_HOST:-[::]}" +echo " Port: ${APP_PORT:-{{PORT}}}" +echo " Data: ${APP_DATA_DIR:-/data}" +echo " Log: ${APP_LOG_FORMAT:-json}" + +# --------------------------------------------------------------------------- +# Health check preparation +# --------------------------------------------------------------------------- +# +# Ensure the data directory exists and is writable. +# The VOLUME directive in the Containerfile creates /data, but a bind-mount +# might replace it with an empty directory owned by root. + +if [ -d "${APP_DATA_DIR:-/data}" ]; then + if [ ! -w "${APP_DATA_DIR:-/data}" ]; then + echo "WARNING: ${APP_DATA_DIR:-/data} is not writable by $(whoami)" + fi +fi + +# --------------------------------------------------------------------------- +# Exec into main process +# --------------------------------------------------------------------------- +# +# Replace the entrypoint shell with the application process so that +# signals are delivered directly and PID 1 is the application. +# +# TODO: Replace the command below with your application binary. +# Examples: +# exec /app/{{SERVICE_NAME}} +# exec /app/release/bin/{{SERVICE_NAME}} start +# exec /app/{{SERVICE_NAME}} serve --host "${APP_HOST}" --port "${APP_PORT}" + +exec "$@" diff --git a/rs/container/manifest.toml b/rs/container/manifest.toml new file mode 100644 index 0000000..f55fcb3 --- /dev/null +++ b/rs/container/manifest.toml @@ -0,0 +1,62 @@ +# SPDX-License-Identifier: MPL-2.0 +# +# Cerro Torre manifest for {{PROJECT_NAME}} .ctp bundle +# +# This manifest describes the container image for verified +# container packaging. Used by `ct pack` to create .ctp bundles. + +[metadata] +name = "{{SERVICE_NAME}}" +version = "{{VERSION}}" +revision = 1 +summary = "{{PROJECT_DESCRIPTION}}" +description = """ +{{PROJECT_NAME}} — containerised service packaged as a verified +cerro-torre .ctp bundle with Ed25519 signing and full provenance +tracking. +""" +license = "{{LICENSE}}" +homepage = "https://{{FORGE}}/{{OWNER}}/{{REPO}}" +maintainer = "{{AUTHOR}} <{{EMAIL}}>" + +[provenance] +upstream = "https://{{FORGE}}/{{OWNER}}/{{REPO}}" +import_date = {{CURRENT_DATE}}T00:00:00Z + +[dependencies] +runtime = ["ca-certificates", "curl"] +build = [] + +[build] +system = "podman" + +[build.environment] +APP_HOST = "[::]" +APP_PORT = "{{PORT}}" + +[outputs] +primary = "{{SERVICE_NAME}}" +split = [] + +[attestations] +require = ["source-signature", "sbom-complete"] +recommend = ["security-audit", "reproducible-build"] + +# Runtime security profile +[security] +user = "appuser" +group = "appuser" +read_only_root = false +no_new_privileges = true + +[security.capabilities] +drop = ["ALL"] +add = ["NET_BIND_SERVICE"] + +[security.network] +listen_tcp = [{{PORT}}] + +[security.filesystem] +read = ["/app/", "/data/"] +write = ["/data/", "/tmp/"] +execute = ["/app/entrypoint.sh"] diff --git a/rs/container/vordr.toml b/rs/container/vordr.toml new file mode 100644 index 0000000..af38fc5 --- /dev/null +++ b/rs/container/vordr.toml @@ -0,0 +1,100 @@ +# SPDX-License-Identifier: MPL-2.0 +# +# Vordr runtime monitoring configuration for {{PROJECT_NAME}} +# +# Vordr watches container health, detects crashes, tracks resource usage, +# and emits structured logs. It runs alongside the application stack and +# provides runtime observability without requiring in-process agents. +# +# Usage: +# vordr watch --config container/vordr.toml +# vordr status +# vordr report + +[metadata] +name = "{{SERVICE_NAME}}" +version = "{{VERSION}}" + +# ============================================================================ +# Health Monitoring +# ============================================================================ +# +# Vordr periodically probes these endpoints. If a probe fails beyond the +# failure_threshold, vordr emits an alert and (optionally) restarts the +# container via Podman. + +[health] +# Primary health endpoint — must return 2xx. +endpoint = "http://localhost:{{PORT}}/health" +interval = "30s" +timeout = "5s" +failure_threshold = 3 + +# Readiness endpoint — checked during startup and after restarts. +readiness_endpoint = "http://localhost:{{PORT}}/ready" +readiness_timeout = "10s" + +# Action on failure: "alert" (log + notify) or "restart" (alert + podman restart). +on_failure = "alert" + +# ============================================================================ +# Crash Detection +# ============================================================================ +# +# Monitors container state via Podman. Detects OOM kills, segfaults, +# and unexpected exits. + +[crash_detection] +enabled = true +# Maximum restarts within the window before vordr stops restarting. +max_restarts = 5 +restart_window = "10m" + +# ============================================================================ +# Resource Thresholds +# ============================================================================ +# +# Alert when resource usage exceeds these thresholds. Values are percentages +# of the container's cgroup limits (or host limits if uncapped). + +[resources] +cpu_warn = 80 # Percentage — warn at 80% sustained CPU. +cpu_critical = 95 # Percentage — critical alert at 95%. +memory_warn = 75 # Percentage of memory limit. +memory_critical = 90 +disk_warn = 80 # Percentage of volume usage. +disk_critical = 95 + +# Sample interval for resource metrics. +sample_interval = "15s" + +# ============================================================================ +# Log Output +# ============================================================================ +# +# Vordr emits its own logs (not the application's) in structured format. + +[logging] +format = "json" +level = "info" +# Write vordr logs to stdout (captured by Podman) and optionally to file. +output = "stdout" +# file = "/var/log/vordr/{{SERVICE_NAME}}.log" + +# ============================================================================ +# Notifications (optional) +# ============================================================================ +# +# Uncomment and configure to receive alerts via webhook or email. + +# [notifications.webhook] +# url = "https://example.com/hooks/vordr" +# method = "POST" +# headers = { "Content-Type" = "application/json" } +# on = ["failure", "recovery", "resource_critical"] + +# [notifications.email] +# to = "{{EMAIL}}" +# from = "vordr@{{SERVICE_NAME}}.local" +# smtp = "smtp://localhost:25" +# on = ["failure", "resource_critical"] diff --git a/rs/contractile.just b/rs/contractile.just new file mode 100644 index 0000000..9a5827b --- /dev/null +++ b/rs/contractile.just @@ -0,0 +1,75 @@ +# Auto-generated by: contractile gen-just +# Source directory: contractiles +# Re-generate with: contractile gen-just --dir contractiles +# +# SPDX-License-Identifier: MPL-2.0 + +# === DUST (Recovery & Rollback) === +# Source: Dustfile.a2ml + +# List available dust recovery actions +dust-status: + @echo ' dust-source-rollback: Revert all source changes to last commit [rollback]' + +# Revert all source changes to last commit +dust-source-rollback: + @echo 'Executing rollback for source-rollback' + git checkout HEAD -- . + + +# === INTEND (Declared Future Intent) === +# Source: Intentfile.a2ml + +# Display declared future intents +intend-list: + @echo '=== Declared Intent ===' + @echo '' + @echo 'Features:' + @echo '' + @echo 'Quality:' + + +# === MUST (Physical State Checks) === +# Source: Mustfile.a2ml + +# Run all must checks +must-check: must-license-present must-readme-present must-spdx-headers must-no-banned-files + @echo 'All must checks passed' + +# LICENSE file must exist +must-license-present: + test -f LICENSE + +# README must exist +must-readme-present: + test -f README.adoc || test -f README.md + +# Source files should have SPDX license headers +must-spdx-headers: + find . -name '*.rs' -o -name '*.res' -o -name '*.gleam' | head -20 | xargs -r grep -L 'SPDX-License-Identifier' | wc -l | grep -q '^0$' + +# No Dockerfiles or Makefiles +must-no-banned-files: + test ! -f Dockerfile && test ! -f Makefile + + +# === TRUST (Integrity & Provenance Verification) === +# Source: Trustfile.a2ml + +# Run all trust verifications +trust-verify: trust-license-content trust-no-secrets-committed trust-container-images-pinned + @echo 'All trust verifications passed' + +# LICENSE contains expected SPDX identifier +trust-license-content: + grep -q 'SPDX\|License\|MIT\|Apache\|PMPL\|MPL' LICENSE + +# No .env or credential files in repo +trust-no-secrets-committed: + test ! -f .env && test ! -f credentials.json && test ! -f .env.local + +# Containerfile base images use pinned digests +trust-container-images-pinned: + test ! -f Containerfile || grep -q '@sha256:' Containerfile + + diff --git a/rs/contractiles/intend/Intentfile.a2ml b/rs/contractiles/intend/Intentfile.a2ml new file mode 100644 index 0000000..d37c47d --- /dev/null +++ b/rs/contractiles/intend/Intentfile.a2ml @@ -0,0 +1,22 @@ +# SPDX-License-Identifier: MPL-2.0 +# Intentfile (A2ML Canonical) +# Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) + +@abstract: +Declared intent and purpose for A2Ml Rs. +@end + +## Purpose + +A2Ml Rs — **AI-Assisted Install:** Just tell any AI assistant: + + +## Anti-Purpose + +This project is NOT: +- A fork or wrapper around another tool +- A monorepo (unless explicitly structured as one) + +## If In Doubt + +If you are unsure whether a change is in scope, ask. +Sensitive areas: ABI definitions, license headers, CI workflows. diff --git a/rs/contractiles/must/Mustfile.a2ml b/rs/contractiles/must/Mustfile.a2ml new file mode 100644 index 0000000..dfd5fd1 --- /dev/null +++ b/rs/contractiles/must/Mustfile.a2ml @@ -0,0 +1,42 @@ +# SPDX-License-Identifier: MPL-2.0 +# Mustfile (A2ML Canonical) +# Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) + +@abstract: +Physical State contract for A2Ml Rs. Baseline UX Manifesto invariants +that MUST hold at all times. +@end + +@requires: +- section: Core-Files +- section: Banned +@end + +## Core-Files + +### license-present +- description: LICENSE file must exist +- run: test -f LICENSE +- severity: critical + +### readme-present +- description: README must exist +- run: test -f README.adoc || test -f README.md +- severity: critical + +## Banned + +### no-hardcoded-paths +- description: No hardcoded developer paths +- run: "! grep -rn '$HOME\|$ECLIPSE_DIR' --include='*.rs' --include='*.res' --include='*.ex' --include='*.gleam' --include='*.zig' --include='*.sh' . 2>/dev/null | grep -v '.git/' | grep -v 'ux-rollout.jl' | head -1" +- severity: critical + +### no-dockerfiles +- description: No Dockerfiles (use Containerfile) +- run: test ! -f Dockerfile +- severity: warning + +### no-makefiles +- description: No Makefiles (use Justfile) +- run: test ! -f Makefile +- severity: warning diff --git a/rs/contractiles/trust/Trustfile.a2ml b/rs/contractiles/trust/Trustfile.a2ml new file mode 100644 index 0000000..e026bde --- /dev/null +++ b/rs/contractiles/trust/Trustfile.a2ml @@ -0,0 +1,25 @@ +# SPDX-License-Identifier: MPL-2.0 +# Trustfile (A2ML Canonical) +# Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) + +@abstract: +Trust and provenance verification for A2Ml Rs. +Maximal trust by default — LLM may read, build, test, lint, format. +@end + +@trust-level: maximal +@trust-boundary: repo +@trust-actions: [read, build, test, lint, format] +@trust-deny: [delete-branch, force-push, modify-ci-secrets, publish] + +## Integrity + +### license-content +- description: LICENSE contains expected SPDX identifier +- run: grep -q 'SPDX\|License\|MIT\|Apache\|PMPL\|MPL' LICENSE +- severity: critical + +### no-secrets-committed +- description: No .env or credential files in repo +- run: test ! -f .env && test ! -f credentials.json && test ! -f .env.local +- severity: critical diff --git a/rs/docs/0.1-AI-MANIFEST.a2ml b/rs/docs/0.1-AI-MANIFEST.a2ml new file mode 100644 index 0000000..7f79301 --- /dev/null +++ b/rs/docs/0.1-AI-MANIFEST.a2ml @@ -0,0 +1,33 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "docs-pillar" +level: 1 +parent: "../0-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Technical documentation hub. The root contains high-level orientation + (README, Quickstart, State-Visualizer). Specialized tracks live in + subdirectories. + +canonical_locations: + quickstart: "QUICKSTART.adoc" + state_visualizer: "STATE-VISUALIZER.adoc" + governance: "governance/" + architecture: "architecture/" + decisions: "decisions/" + theory: "theory/" + practice: "practice/" + developer: "developer/" + attribution: "attribution/" + reports: "reports/" + whitepapers: "whitepapers/" + standards: "standards/" + legal: "legal/" + wikis: "wikis/" + +invariants: + - "Primary documentation format MUST be AsciiDoc (.adoc)" + - "Root docs/ MUST only contain pillar entry points" diff --git a/rs/docs/QUICKSTART.adoc b/rs/docs/QUICKSTART.adoc new file mode 100644 index 0000000..d97c31e --- /dev/null +++ b/rs/docs/QUICKSTART.adoc @@ -0,0 +1,24 @@ += Quickstart +:toc: preamble + +Get up and running in 60 seconds. + +== Prerequisites + +* Git 2.40+ +* just (command runner) +* Your language toolchain (see Justfile for details) + +== From Template (New Project) + +[source,bash] +---- +git clone https://github.com/{{OWNER}}/rsr-template-repo my-project +cd my-project +rm -rf .git && git init -b main +just init # interactive placeholder replacement +---- + +== Project Structure + +See README.adoc in the root for the Dual-Track architecture summary. diff --git a/rs/docs/README.adoc b/rs/docs/README.adoc new file mode 100644 index 0000000..df45be7 --- /dev/null +++ b/rs/docs/README.adoc @@ -0,0 +1,14 @@ += Documentation Layout + +Primary tracks: + +* `theory/` for formal and conceptual material +* `practice/` for operational and implementation material +* `maintenance/` for baseline checklists and release hard-pass runbooks +* `whitepapers/academic/` for research-facing whitepapers +* `whitepapers/industry/` for industry/outreach whitepapers + +Core docs: + +* `maintenance/MAINTENANCE-CHECKLIST.md` +* `practice/SOFTWARE-DEVELOPMENT-APPROACH.adoc` diff --git a/rs/docs/RSR_OUTLINE.adoc b/rs/docs/RSR_OUTLINE.adoc new file mode 100644 index 0000000..014b21c --- /dev/null +++ b/rs/docs/RSR_OUTLINE.adoc @@ -0,0 +1,290 @@ += RSR Template Repository + +image:[Palimpsest-MPL-1.0,link="https://github.com/hyperpolymath/palimpsest-license"] image:[Palimpsest,link="https://github.com/hyperpolymath/palimpsest-license"] +:toc: +:sectnums: + +// Badges +image:https://img.shields.io/badge/RSR-Infrastructure-cd7f32[RSR Infrastructure] +image:https://img.shields.io/badge/Phase-Maintenance-brightgreen[Phase] +image:https://img.shields.io/badge/Guix-Primary-purple?logo=gnu[Guix] + +== Overview + +**The canonical template for RSR (Rhodium Standard Repository) projects.** + +This repository provides the standardized structure, configuration, and tooling for all RSR-compliant repos. Use it to: + +* Bootstrap new projects with RSR compliance +* Reference the standard directory structure +* Copy configuration templates (Justfile, STATE.a2ml, etc.) + +== Quick Start + +[source,bash] +---- +# Clone the template +git clone https://github.com/hyperpolymath/RSR-template-repo my-project +cd my-project + +# Remove template git history +rm -rf .git +git init + +# Interactive bootstrap — replaces all placeholders +just init + +# Enter development environment +guix shell -D -f guix.scm + +# Validate compliance +just validate-rsr +---- + +== What's Included + +[cols="1,3"] +|=== +|File/Directory |Purpose + +|`.editorconfig` +|Editor configuration (indent, charset) + +|`.gitignore` +|Standard ignore patterns + +|`.gitattributes` +|Line endings, diff drivers, binary detection + +|`.guix-channel` +|Guix channel definition + +|`.well-known/` +|RFC-compliant metadata (security.txt, ai.txt, humans.txt) + +|`.machine_readable/` +|All machine-readable content: state files (6 a2ml), `bot_directives/`, `contractiles/` + +|`docs/` +|Documentation directory + +|`guix.scm` +|Guix package definition + +|`Justfile` +|Task runner with 40+ recipes + +|`Containerfile` +|Container build (Wolfi base, Podman) + +|`LICENSE` +|MPL-2.0 (Palimpsest MPL) + +|`EXHIBIT-A-ETHICAL-USE.txt` +|Ethical use guidelines (LICENSE Exhibit A) + +|`EXHIBIT-B-QUANTUM-SAFE.txt` +|Quantum-safe provenance spec (LICENSE Exhibit B) + +|`README.adoc` +|Project overview + +|`TOPOLOGY.md` +|Architecture diagram and completion dashboard + +|`PLACEHOLDERS.md` +|Template variable reference and replacement guide + +|`0-AI-MANIFEST.a2ml` +|Universal AI agent entry point + +|`AI.a2ml` +|Claude-specific instructions + +|`src/abi/` +|Idris2 ABI definitions (Types, Layout, Foreign) + +|`ffi/zig/` +|Zig FFI implementation + +|`generated/abi/` +|Auto-generated C headers from Idris2 ABI +|=== + +== Justfile Features + +The template Justfile provides: + +* **Combinatoric matrix recipes** for build, test, container, CI +* **Cookbook generation**: `just cookbook` -> `docs/just-cookbook.adoc` +* **Man page generation**: `just man` -> `docs/man/project.1` +* **RSR validation**: `just validate-rsr` +* **STATE.a2ml management**: `just state-touch`, `just state-phase` +* **Container support**: `just container-build`, `just container-push` +* **CI matrix**: `just ci-matrix [stage] [depth]` + +=== Key Recipes + +[source,bash] +---- +just # Show all recipes +just help # Detailed help +just info # Project info +just combinations # Show matrix options + +just build # Build (debug) +just test # Run tests +just quality # Format + lint + test +just ci # Full CI pipeline + +just validate # RSR + STATE validation +just docs # Generate all docs +just cookbook # Generate Justfile docs + +just guix-shell # Guix dev environment +just container-build # Build container +---- + +== Directory Structure + +[source] +---- +project/ +├── .editorconfig # Editor settings +├── .gitignore # Git ignore +├── .gitattributes # Line endings, diff drivers +├── .guix-channel # Guix channel +├── .well-known/ # RFC metadata +│ ├── ai.txt +│ ├── humans.txt +│ └── security.txt +├── .machine_readable/ # ALL machine-readable content +│ ├── STATE.a2ml # Project state, progress, blockers +│ ├── META.a2ml # Architecture decisions, governance +│ ├── ECOSYSTEM.a2ml # Ecosystem position, relationships +│ ├── AGENTIC.a2ml # AI agent interaction patterns +│ ├── NEUROSYM.a2ml # Neurosymbolic integration config +│ ├── PLAYBOOK.a2ml # Operational runbook +│ ├── bot_directives/ # Per-bot rules and constraints +│ └── contractiles/ # Policy enforcement contracts +│ ├── k9/ # Security levels (Kennel/Yard/Hunt) +│ ├── dust/Dustfile # Recovery and rollback +│ ├── lust/Intentfile # Future intent declarations +│ ├── must/Mustfile # Invariant checks +│ └── trust/Trustfile.hs # Cryptographic verification +├── docs/ # Documentation +│ ├── CITATIONS.adoc +│ ├── TOPOLOGY-GUIDE.adoc +│ ├── generated/ +│ └── man/ +├── src/abi/ # Idris2 ABI definitions +│ ├── Types.idr +│ ├── Layout.idr +│ └── Foreign.idr +├── ffi/zig/ # Zig FFI implementation +│ ├── build.zig +│ ├── src/main.zig +│ └── test/integration_test.zig +├── generated/abi/ # Auto-generated C headers +├── examples/ # Example code +├── guix.scm # Guix package +├── Justfile # Task runner +├── Containerfile # Container build +├── LICENSE # MPL-2.0 +├── EXHIBIT-A-ETHICAL-USE.txt # Ethical use guidelines +├── EXHIBIT-B-QUANTUM-SAFE.txt # Quantum-safe provenance +├── README.adoc # Overview +├── TOPOLOGY.md # Architecture + completion +├── PLACEHOLDERS.md # Template variable guide +├── 0-AI-MANIFEST.a2ml # Universal AI entry point +└── AI.a2ml # Claude-specific instructions +---- + +== RSR Compliance + +=== Language Tiers + +* **Tier 1** (Gold): Rust, Elixir, Zig, Ada, Haskell, ReScript, Gleam +* **Tier 2** (Silver): Nickel, Guile Scheme, Nix, Idris2, OCaml +* **Infrastructure**: Guix channels, derivations, Julia batch scripts + +=== Required Files + +* `.editorconfig` +* `.gitignore` +* `Justfile` +* `README.adoc` +* `LICENSE` (MPL-2.0) +* `.machine_readable/STATE.a2ml` +* `.well-known/security.txt` +* `.well-known/ai.txt` +* `.well-known/humans.txt` +* `guix.scm` OR `flake.nix` + +=== Prohibited + +* Python outside `salt/` directory +* TypeScript/JavaScript (use ReScript) +* CUE (use Guile/Nickel) +* `Dockerfile` (use `Containerfile`) +* npm, Bun, pnpm, yarn (use Deno) +* Go (use Rust) + +== STATE.a2ml + +The STATE.a2ml file tracks project state: + +[source] +---- +# STATE — Project State Checkpoint +# Format: a2ml (AI-readable markup) + +project: v-graphql +version: 0.1.0 +last-updated: 2026-02-14 +status: active + +phase: implementation +maturity: beta + +ecosystem: + part-of: RSR Framework + depends-on: [] + +milestones: + - name: Initial setup + completion: 100 + - name: Core implementation + completion: 0 +---- + +== Badge Schema + +Generate badges from STATE.a2ml: + +[source,bash] +---- +just badges standard +---- + +See `docs/BADGE_SCHEMA.adoc` for the full badge taxonomy. + +== Ecosystem Integration + +This template is part of: + +* **STATE.a2ml Ecosystem**: Conversation checkpoints +* **RSR Framework**: Repository standards +* **Consent-Aware-HTTP**: .well-known compliance +* **Hypatia**: Neurosymbolic security scanning +* **gitbot-fleet**: Bot orchestration + +== License + +SPDX-License-Identifier: CC-BY-SA-4.0 + +== Links + +* https://github.com/hyperpolymath/elegant-STATE[elegant-STATE] - STATE tooling +* https://github.com/hyperpolymath/conative-gating[conative-gating] - Policy enforcement +* https://rhodium.sh[Rhodium Standard] - RSR documentation diff --git a/rs/docs/STATE-VISUALIZER.adoc b/rs/docs/STATE-VISUALIZER.adoc new file mode 100644 index 0000000..2af3297 --- /dev/null +++ b/rs/docs/STATE-VISUALIZER.adoc @@ -0,0 +1,128 @@ += Project State Visualizer +[source] +---- + + + + +# RSR Template Repo — Project Topology + +## System Architecture + +``` + ┌─────────────────────────────────────────┐ + │ NEW REPOSITORY │ + │ (Consumer of this Template) │ + └───────────────────┬─────────────────────┘ + │ Scaffolding + ▼ + ┌─────────────────────────────────────────┐ + │ RSR TEMPLATE HUB │ + │ │ + │ ┌───────────┐ ┌───────────────────┐ │ + │ │ AI Gate- │ │ ABI / FFI │ │ + │ │ keeper │ │ Standard │ │ + │ │ (0-AI-M) │ │ (Idris2/Zig) │ │ + │ └─────┬─────┘ └────────┬──────────┘ │ + │ │ │ │ + │ ┌─────▼─────┐ ┌────────▼──────────┐ │ + │ │ Topology │ │ SCM / 6SCM │ │ + │ │ Guide │ │ Metadata │ │ + │ │ (Visual) │ │ (machine_read) │ │ + │ └─────┬─────┘ └────────┬──────────┘ │ + │ │ │ │ + │ ┌─────▼─────────────────▼──────────┐ │ + │ │ CONTAINER ECOSYSTEM │ │ + │ │ ┌──────────┐ ┌───────────────┐ │ │ + │ │ │ Podman / │ │ selur-compose │ │ │ + │ │ │ OCI │ │ cerro-torre │ │ │ + │ │ │ Build │ │ svalinn/vordr │ │ │ + │ │ └──────────┘ └───────────────┘ │ │ + │ │ ct-build.sh deploy.k9.ncl │ │ + │ └──────────────────────────────────┘ │ + └────────│─────────────────│──────────────┘ + │ │ + ▼ ▼ + ┌─────────────────────────────────────────┐ + │ PLATFORM INTEGRATION │ + │ ┌───────────┐ ┌───────────┐ ┌───────┐│ + │ │ GitHub │ │ GitLab │ │ Nix / ││ + │ │ Workflows │ │ CI/CD │ │ Guix ││ + │ └───────────┘ └───────────┘ └───────┘│ + └─────────────────────────────────────────┘ + + ┌─────────────────────────────────────────┐ + │ REPO INFRASTRUCTURE │ + │ Justfile / Mustfile .machine_readable/ │ + │ Codeowners / Reuse 0-AI-MANIFEST.a2ml │ + └─────────────────────────────────────────┘ +``` + +## Completion Dashboard + +``` +COMPONENT STATUS NOTES +───────────────────────────────── ────────────────── ───────────────────────────────── +CORE STANDARDS + ABI/FFI Standard (Idris2/Zig) ██████████ 100% Universal interface stable + AI Gatekeeper (0-AI-MANIFEST) ██████████ 100% Universal entry point active + TOPOLOGY.md Standard ██████████ 100% Visual summary guide active + 6SCM Metadata Structure ██████████ 100% Machine-readable state stable + +INFRASTRUCTURE + Justfile Automation ██████████ 100% Standard build/verify tasks + CI/CD Workflow Templates ██████████ 100% GH/GL scaffolding verified + Multi-Forge Sync ██████████ 100% Hub-and-spoke mirroring stable + +CONTAINER ECOSYSTEM (Phase 2) + Containerfile (OCI build) ██████████ 100% Multi-stage Chainguard base + selur-compose orchestration ██████████ 100% Template + concrete example + cerro-torre manifest ██████████ 100% Bundle metadata & signing + svalinn gateway policy ██████████ 100% .gatekeeper.yaml active + vordr runtime monitoring ██████████ 100% Runtime config template + k9-svc deployment (Nickel) ██████████ 100% Hunt-level deploy descriptor + ct-build.sh pipeline ██████████ 100% Build/sign/verify script + Justfile container-* recipes ██████████ 100% 8 recipes integrated + Trustfile CONTAINER_SUPPLY_CHAIN ██████████ 100% Supply chain section added + +REPO INFRASTRUCTURE + .machine_readable/ ██████████ 100% STATE/META/ECOSYSTEM active + Governance & License ██████████ 100% PMPL & Ethical use verified + Development Shells (Nix/Guix) ██████████ 100% Reproducible env stable + +───────────────────────────────────────────────────────────────────────────── +OVERALL: ██████████ 100% RSR Template Stable & Certified +``` + +## Key Dependencies + +``` +Philosophy ──────► RSR Standard ──────► Template Scaffolding ──► New Repo + │ │ │ │ + ▼ ▼ ▼ ▼ +CCCP Policy ─────► 0-AI-MANIFEST ────────► Justfile ──────────► Compliance + │ + ▼ + Container Ecosystem + ┌──────────┼──────────┐ + ▼ ▼ ▼ + selur-compose cerro- svalinn/ + (orchestrate) torre vordr + (sign) (monitor) + │ + ▼ + k9-svc deploy +``` + +## Update Protocol + +This file is maintained by both humans and AI agents. When updating: + +1. **After completing a component**: Change its bar and percentage +2. **After adding a component**: Add a new row in the appropriate section +3. **After architectural changes**: Update the ASCII diagram +4. **Date**: Update the `Last updated` comment at the top of this file + +Progress bars use: `█` (filled) and `░` (empty), 10 characters wide. +Percentages: 0%, 10%, 20%, ... 100% (in 10% increments). +---- diff --git a/rs/docs/architecture/0.2-AI-MANIFEST.a2ml b/rs/docs/architecture/0.2-AI-MANIFEST.a2ml new file mode 100644 index 0000000..028b503 --- /dev/null +++ b/rs/docs/architecture/0.2-AI-MANIFEST.a2ml @@ -0,0 +1,17 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "architecture-track" +level: 2 +parent: "../0.1-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Documentation track for system architecture and threat models. + +canonical_locations: + threat_model: "THREAT-MODEL.adoc" + +invariants: + - "Visual diagrams MUST include ASCII or Mermaid representations" diff --git a/rs/docs/architecture/THREAT-MODEL.adoc b/rs/docs/architecture/THREAT-MODEL.adoc new file mode 100644 index 0000000..df5e038 --- /dev/null +++ b/rs/docs/architecture/THREAT-MODEL.adoc @@ -0,0 +1,162 @@ += Threat Model + + + +# Threat Model: {{PROJECT_NAME}} + +## Document Info + +| Field | Value | +|---------------|--------------------------------| +| Project | {{PROJECT_NAME}} | +| Version | 1.0 | +| Last Reviewed | {{DATE}} | +| Author | {{AUTHOR}} | +| Methodology | STRIDE | + +## Scope + +### In Scope + +- Application source code and build pipeline +- CI/CD workflows (GitHub Actions) +- Container images and runtime environment +- Secrets and credential management +- Dependencies (direct and transitive) +- Deployment artifacts (binaries, containers, SBOM) + +### Out of Scope + +- Physical security of hosting infrastructure +- GitHub/GitLab platform-level vulnerabilities +- End-user device security +- Social engineering attacks against maintainers (handled by org policy) + +## System Overview + +Brief description of {{PROJECT_NAME}} and its architecture. + +> See [STATE-VISUALIZER.adoc](../STATE-VISUALIZER.adoc) for the full architecture diagram and completion dashboard. + +## Assets + +| Asset | Classification | Owner | Notes | +|----------------------|----------------|-------------|--------------------------------------------| +| Source code | Internal | Maintainers | Public repos are still internal-integrity | +| Signing keys | Restricted | Release lead | Signing keys (e.g., Ed25519), GPG keys | +| CI/CD secrets | Restricted | Maintainers | GITHUB_TOKEN, deploy tokens, PATs | +| User/contributor data | Confidential | Org | Emails, contributor identity | +| Build artifacts | Internal | CI pipeline | Binaries, WASM bundles | +| Container images | Internal | CI pipeline | Chainguard-based, signed via image signing tool | +| SBOM / provenance | Public | CI pipeline | SLSA attestations | +| Dependencies | Public | Lockfile | Cargo.lock, deno.lock, gleam.toml | +| Infrastructure config | Confidential | Maintainers | Containerfiles, compose files, orchestration config | + +## Trust Boundaries + +| Boundary | From (Lower Trust) | To (Higher Trust) | +|-----------------------------|---------------------------|----------------------------| +| Pull request submission | External contributor | Repository codebase | +| CI/CD workflow execution | Workflow definition | Runner with secrets access | +| Container build boundary | Build stage | Runtime stage | +| External API calls | Third-party service | Application internals | +| User input (CLI/Web) | End user | Application logic | +| Dependency resolution | Package registry | Build environment | +| Forge mirroring | GitHub | GitLab / Bitbucket | + +## Threat Actors + +| Actor | Motivation | Capability | +|--------------------------|-------------------------------|------------| +| Script kiddie | Vandalism, clout | Low | +| Disgruntled contributor | Sabotage, backdoor insertion | Medium | +| Supply chain attacker | Wide-impact compromise | High | +| Nation state | Espionage, disruption | Very High | +| Automated bot | Credential stuffing, spam PRs | Low-Medium | + +## STRIDE Analysis + +### Spoofing + +| Threat | Affected Asset | Likelihood | Impact | Risk | Mitigation | +|---------------------------------|-------------------|------------|--------|--------|------------------------------------------------| +| Unsigned commits impersonate maintainer | Source code | Medium | High | High | Require GPG-signed commits; vigilant code review | +| Forged bot actions (automated agents) | CI/CD pipeline | Low | High | Medium | Bot tokens scoped minimally; audit bot activity | +| Spoofed package registry identity | Dependencies | Low | High | Medium | Pin dependencies by hash; verify provenance | + +### Tampering + +| Threat | Affected Asset | Likelihood | Impact | Risk | Mitigation | +|---------------------------------|-------------------|------------|--------|--------|------------------------------------------------| +| Malicious pull request | Source code | Medium | High | High | Branch protection; required reviews; CodeQL | +| Dependency poisoning (typosquat) | Dependencies | Medium | High | High | Lockfiles; secret-scanner; security scans | +| Tampered container base image | Container images | Low | High | Medium | Chainguard images; image signing verification | +| Workflow file modification | CI/CD pipeline | Low | High | Medium | CODEOWNERS on .github/; workflow-linter | + +### Repudiation + +| Threat | Affected Asset | Likelihood | Impact | Risk | Mitigation | +|---------------------------------|-------------------|------------|--------|--------|------------------------------------------------| +| Unlogged deployment | Build artifacts | Medium | Medium | Medium | SLSA provenance; deployment audit trail | +| Denied merge of vulnerable code | Source code | Low | Medium | Low | Git history is immutable; signed commits | +| Secret rotation without record | CI/CD secrets | Low | Low | Low | Secret rotation logged in STATE.a2ml | + +### Information Disclosure + +| Threat | Affected Asset | Likelihood | Impact | Risk | Mitigation | +|---------------------------------|-------------------|------------|--------|--------|------------------------------------------------| +| Secrets leaked in git history | CI/CD secrets | Medium | High | High | TruffleHog in CI; secret-scanner workflow | +| Verbose error messages in prod | Application logic | Medium | Medium | Medium | Sanitize outputs; structured logging | +| SBOM reveals internal structure | Infrastructure | Low | Low | Low | Accepted risk; SBOM is intentionally public | + +### Denial of Service + +| Threat | Affected Asset | Likelihood | Impact | Risk | Mitigation | +|---------------------------------|-------------------|------------|--------|--------|------------------------------------------------| +| CI resource exhaustion (fork bomb in PR) | CI/CD pipeline | Medium | Medium | Medium | Concurrency limits; timeout on workflows | +| Spam issues/PRs flooding triage | Maintainer time | Medium | Low | Low | GitHub rate limits; bot auto-close stale | +| Large binary commits bloating repo | Source code | Low | Medium | Low | .gitattributes LFS policy; pre-commit hooks | + +### Elevation of Privilege + +| Threat | Affected Asset | Likelihood | Impact | Risk | Mitigation | +|---------------------------------|-------------------|------------|--------|--------|------------------------------------------------| +| Workflow injection via PR title/body | CI/CD pipeline | Medium | High | High | Never interpolate PR fields in `run:`; use env vars | +| GITHUB_TOKEN over-scoped | CI/CD secrets | Medium | High | High | `permissions: read-all` default; per-job scoping | +| Container escape | Runtime environment | Low | High | Medium | Hardened container runtime; read-only rootfs; no-new-privileges | +| Compromised action dependency | CI/CD pipeline | Medium | High | High | SHA-pin all actions; never use `@latest` tags | + +## Mitigations in Place + +- **SLSA Provenance**: Build attestations via slsa-github-generator +- **Secret Scanning**: TruffleHog + secret-scanner workflow on every push +- **Static Analysis**: CodeQL on supported languages +- **Supply Chain**: OpenSSF Scorecard (scorecard.yml + scorecard-enforcer.yml) +- **Container Signing**: Ed25519 signatures on all published images (optional: use your signing tool) +- **Container Runtime**: Hardened container runtime with formal verification (optional) +- **Dependency Pinning**: All GitHub Actions SHA-pinned; lockfiles committed +- **Workflow Validation**: workflow-linter.yml checks all workflow changes +- **Security Scanning**: Neurosymbolic scanning (hypatia-scan.yml, optional) +- **Bot Governance**: Bot orchestration with confidence thresholds (optional) +- **Edge Security**: Gateway with policy enforcement (optional, where applicable) +- **SBOM**: Generated and published with releases + +## Residual Risks + +| Risk | Accepted Because | Review Trigger | +|-----------------------------------------------|---------------------------------------------------|-------------------------| +| Zero-day in GitHub Actions runner | Platform responsibility; no feasible mitigation | GitHub advisory | +| Maintainer account compromise | Mitigated by 2FA requirement; residual remains | Any suspicious activity | +| Transitive dependency vulnerability (0-day) | Lockfiles limit blast radius; scanning catches known CVEs | CVE database update | +| SBOM exposes internal component names | Transparency is a design goal | Policy change | + +## Review Schedule + +This threat model should be reviewed: + +- **Quarterly** as a standing item +- **When architecture changes** (new services, new trust boundaries, new deployment targets) +- **Before major releases** (v1.0, v2.0, etc.) +- **After any security incident** affecting this project or its dependencies + +Reviewer should update the "Last Reviewed" date and version in Document Info above. diff --git a/rs/docs/attribution/0.2-AI-MANIFEST.a2ml b/rs/docs/attribution/0.2-AI-MANIFEST.a2ml new file mode 100644 index 0000000..52beaea --- /dev/null +++ b/rs/docs/attribution/0.2-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "attribution-unit" +level: 2 +parent: "../0.1-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Sub-unit of the docs pillar focusing on attribution. diff --git a/rs/docs/attribution/CITATION.cff b/rs/docs/attribution/CITATION.cff new file mode 100644 index 0000000..05d36d9 --- /dev/null +++ b/rs/docs/attribution/CITATION.cff @@ -0,0 +1,17 @@ +cff-version: 1.2.0 +message: "If you use this software, please cite it as below." +authors: +- family-names: "{{AUTHOR_LAST}}" + given-names: "{{AUTHOR_FIRST}}" + orcid: "https://orcid.org/0000-0000-0000-0000" # Placeholder +title: "{{PROJECT_NAME}}" +version: 0.1.0 +date-released: {{CURRENT_DATE}} +url: "https://{{FORGE}}/{{OWNER}}/{{REPO}}" +repository-code: "https://{{FORGE}}/{{OWNER}}/{{REPO}}" +license: MPL-2.0 +keywords: + - "rsr" + - "formal-verification" + - "neurosymbolic" + - "provenance" diff --git a/rs/docs/attribution/CITATIONS.adoc b/rs/docs/attribution/CITATIONS.adoc new file mode 100644 index 0000000..2ca532e --- /dev/null +++ b/rs/docs/attribution/CITATIONS.adoc @@ -0,0 +1,35 @@ += {{PROJECT_NAME}} - Citation Guide +:toc: + +== BibTeX + +[source,bibtex] +---- +@software{{{PROJECT_NAME}}_{{CURRENT_YEAR}}, + author = {{{AUTHOR_LAST}}, {{AUTHOR_FIRST}}}, + title = {{{PROJECT_NAME}}}, + year = {{{CURRENT_YEAR}}}, + url = {https://github.com/{{OWNER}}/{{PROJECT_NAME}}}, + license = {MPL-2.0} +} +---- + +== Harvard Style + +{{AUTHOR_LAST}}, {{AUTHOR_INITIALS}} ({{CURRENT_YEAR}}) _{{PROJECT_NAME}}_ [Computer software]. Available at: https://github.com/{{OWNER}}/{{PROJECT_NAME}} + +== OSCOLA + +{{AUTHOR}}, '{{PROJECT_NAME}}' ({{CURRENT_YEAR}}) + +== MLA + +{{AUTHOR_LAST}}, {{AUTHOR_FIRST}} "{{PROJECT_NAME}}." {{CURRENT_YEAR}}, github.com/{{OWNER}}/{{PROJECT_NAME}}. + +== APA 7 + +{{AUTHOR_LAST}}, {{AUTHOR_INITIALS}} ({{CURRENT_YEAR}}). _{{PROJECT_NAME}}_ [Computer software]. GitHub. https://github.com/{{OWNER}}/{{PROJECT_NAME}} + +== See Also + +* link:CITATION.cff[CITATION.cff] diff --git a/rs/docs/attribution/CODEOWNERS.adoc b/rs/docs/attribution/CODEOWNERS.adoc new file mode 100644 index 0000000..3714055 --- /dev/null +++ b/rs/docs/attribution/CODEOWNERS.adoc @@ -0,0 +1,19 @@ += Code Ownership +:icons: font + +This project utilizes a formally defined code ownership structure to ensure that specific components are reviewed by domain experts. + +== Authority Model + +Our ownership model is based on the "Perimeter" architecture: +* **Perimeter 1 (Core):** Strictly controlled by Lead Maintainers. +* **Perimeter 2 (Extensions):** Maintained by component owners. +* **Perimeter 3 (Community):** Open for broader community participation. + +== Automated Enforcement + +The technical rules for automatic review assignments are maintained in the machine-readable link:../../.github/CODEOWNERS[.github/CODEOWNERS] file. GitHub uses this to automatically notify owners when changes are proposed to their sections. + +== Component Owners + +A full list of maintainers and their contact information can be found in link:MAINTAINERS.adoc[MAINTAINERS.adoc]. diff --git a/rs/docs/attribution/MAINTAINERS.adoc b/rs/docs/attribution/MAINTAINERS.adoc new file mode 100644 index 0000000..d829dd9 --- /dev/null +++ b/rs/docs/attribution/MAINTAINERS.adoc @@ -0,0 +1,47 @@ +// SPDX-License-Identifier: CC-BY-SA-4.0 += Maintainers +:toc: preamble + +This document lists the maintainers of this project and their responsibilities. + +== Current Maintainers + +[cols="2,3,2",options="header"] +|=== +| Name | Role | Contact + +| {{AUTHOR}} +| Lead Maintainer +| https://github.com/{{OWNER}}[@{{OWNER}}] +|=== + +== Responsibilities + +Maintainers are responsible for: + +* Reviewing and merging pull requests +* Triaging issues and feature requests +* Ensuring code quality and security standards +* Managing releases and versioning +* Upholding the project's code of conduct + +== Becoming a Maintainer + +Contributors who demonstrate: + +* Consistent, high-quality contributions +* Understanding of the project's goals and standards +* Constructive participation in discussions +* Commitment to the project's long-term health + +May be invited to become maintainers at the discretion of existing maintainers. + +== Decision Making + +* Routine decisions (bug fixes, minor improvements) can be made by any maintainer +* Significant changes require discussion and consensus among maintainers +* Breaking changes or major features should be discussed in issues before implementation + +== Contact + +For questions about project governance, open an issue or contact the maintainers listed above. diff --git a/rs/docs/attribution/README.adoc b/rs/docs/attribution/README.adoc new file mode 100644 index 0000000..b095612 --- /dev/null +++ b/rs/docs/attribution/README.adoc @@ -0,0 +1 @@ += attribution Unit diff --git a/rs/docs/decisions/0.2-AI-MANIFEST.a2ml b/rs/docs/decisions/0.2-AI-MANIFEST.a2ml new file mode 100644 index 0000000..ac26298 --- /dev/null +++ b/rs/docs/decisions/0.2-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "decisions-unit" +level: 2 +parent: "../0.1-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Sub-unit of the docs pillar focusing on decisions. diff --git a/rs/docs/decisions/0000-template.adoc b/rs/docs/decisions/0000-template.adoc new file mode 100644 index 0000000..763eab1 --- /dev/null +++ b/rs/docs/decisions/0000-template.adoc @@ -0,0 +1,35 @@ += Architecture Decision Record: 0000-template + + + +# [NUMBER]. [TITLE] + +Date: YYYY-MM-DD + +## Status + +[Proposed | Accepted | Deprecated | Superseded by [ADR-NNNN](NNNN-title.md) | Rejected] + +## Context + +What is the issue that we're seeing that is motivating this decision or change? + +## Decision + +What is the change that we're proposing and/or doing? + +## Consequences + +What becomes easier or more difficult to do because of this change? + +### Positive + +- ... + +### Negative + +- ... + +### Neutral + +- ... diff --git a/rs/docs/decisions/0001-adopt-rsr-standard.adoc b/rs/docs/decisions/0001-adopt-rsr-standard.adoc new file mode 100644 index 0000000..59e845f --- /dev/null +++ b/rs/docs/decisions/0001-adopt-rsr-standard.adoc @@ -0,0 +1,86 @@ += Architecture Decision Record: 0001-adopt-rsr-standard + + + +# 1. Adopt Rhodium Standard Repository (RSR) Template + +Date: 2026-02-14 + +## Status + +Accepted + +## Context + +Managing multiple repositories with an ad-hoc approach led to significant +inconsistencies across the ecosystem. Common problems included: + +- Missing or incomplete configuration files (SECURITY.md, CONTRIBUTING.md, + .editorconfig, etc.) +- State files (STATE.a2ml, META.a2ml, ECOSYSTEM.a2ml) placed in the repository + root instead of the canonical `.machine_readable/` directory +- Duplicate or conflicting workflow definitions across repos +- No standardized entry point for AI agents interacting with repositories +- Inconsistent bot directive configurations leading to unreliable automation +- No contractile enforcement or Justfile automation + +Without a single source of truth for repository structure, each new repo +required manual setup and inevitably drifted from best practices over time. + +## Decision + +Adopt the Rhodium Standard Repository (RSR) template (`rsr-template-repo`) as +the canonical starting point for all new repositories. Existing repositories +will migrate incrementally as they receive active development. + +The RSR template provides: + +- **Machine-readable state files** in `.machine_readable/` (STATE.a2ml, + ECOSYSTEM.a2ml, META.a2ml, AGENTIC.a2ml, NEUROSYM.a2ml, PLAYBOOK.a2ml) +- **AI manifest** (`0-AI-MANIFEST.a2ml`) as a universal entry point for all + AI agents +- **Bot directives** in `.machine_readable/bot_directives/` for bot orchestration integration +- **Contractiles** in `.machine_readable/contractiles/` (k9, dust, lust, must, trust) for + policy enforcement +- **Standardized workflows** (16+ GitHub Actions workflows, all SHA-pinned) +- **Justfile automation** with standard recipes for common tasks +- **Security and governance files**: SECURITY.md, CONTRIBUTING.md, + CODE_OF_CONDUCT.md, LICENSE (MPL-2.0) +- **Architecture Decision Records** in `docs/decisions/` + +New repositories are created by cloning the template: + +```bash +git clone https://github.com/{{OWNER}}/rsr-template-repo new-repo-name +cd new-repo-name +rm -rf .git && git init +``` + +## Consequences + +### Positive + +- Consistency across all repositories, enforced from creation +- Automated compliance checking via `rsr-antipattern.yml` workflow +- Bot fleet can operate reliably across all repos with predictable structure +- AI agents (Claude, Gemini, etc.) have a standardized entry point via + `0-AI-MANIFEST.a2ml` +- New contributors can onboard faster with familiar, documented structure +- Reduced maintenance burden: fix once in template, propagate to all repos +- Machine-readable state enables tooling and automation pipelines + +### Negative + +- Migration effort for existing repos requires time and attention +- Learning curve for contributors unfamiliar with RSR conventions +- Template updates need propagation mechanism to existing repos +- Some repos may have unique needs that do not fit the standard template + without customization + +### Neutral + +- Existing CI/CD pipelines continue to work; RSR workflows are additive +- Third-party dependencies retain their original licenses regardless of + repo structure +- ADR process itself is part of the template, enabling future decisions + to be recorded consistently diff --git a/rs/docs/decisions/README.adoc b/rs/docs/decisions/README.adoc new file mode 100644 index 0000000..153a5e7 --- /dev/null +++ b/rs/docs/decisions/README.adoc @@ -0,0 +1 @@ += decisions Unit diff --git a/rs/docs/developer/0.2-AI-MANIFEST.a2ml b/rs/docs/developer/0.2-AI-MANIFEST.a2ml new file mode 100644 index 0000000..c16fcc7 --- /dev/null +++ b/rs/docs/developer/0.2-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "developer-unit" +level: 2 +parent: "../0.1-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Sub-unit of the docs pillar focusing on developer. diff --git a/rs/docs/developer/ABI-FFI-README.adoc b/rs/docs/developer/ABI-FFI-README.adoc new file mode 100644 index 0000000..65d2afe --- /dev/null +++ b/rs/docs/developer/ABI-FFI-README.adoc @@ -0,0 +1,384 @@ += ABI/FFI Standards +{{~ Aditionally delete this line and fill out the template below ~}} + +# {{PROJECT}} ABI/FFI Documentation + +## Overview + +This library follows the **Hyperpolymath RSR Standard** for ABI and FFI design: + +- **ABI (Application Binary Interface)** defined in **Idris2** with formal proofs +- **FFI (Foreign Function Interface)** implemented in **Zig** for C compatibility +- **Generated C headers** bridge Idris2 ABI to Zig FFI +- **Any language** can call through standard C ABI + +## Architecture + +``` +┌─────────────────────────────────────────────┐ +│ ABI Definitions (Idris2) │ +│ src/abi/ │ +│ - Types.idr (Type definitions) │ +│ - Layout.idr (Memory layout proofs) │ +│ - Foreign.idr (FFI declarations) │ +└─────────────────┬───────────────────────────┘ + │ + │ generates (at compile time) + ▼ +┌─────────────────────────────────────────────┐ +│ C Headers (auto-generated) │ +│ generated/abi/{{project}}.h │ +└─────────────────┬───────────────────────────┘ + │ + │ imported by + ▼ +┌─────────────────────────────────────────────┐ +│ FFI Implementation (Zig) │ +│ ffi/zig/src/main.zig │ +│ - Implements C-compatible functions │ +│ - Zero-cost abstractions │ +│ - Memory-safe by default │ +└─────────────────┬───────────────────────────┘ + │ + │ compiled to lib{{project}}.so/.a + ▼ +┌─────────────────────────────────────────────┐ +│ Any Language via C ABI │ +│ - Rust, ReScript, Julia, Python, etc. │ +└─────────────────────────────────────────────┘ +``` + +## Directory Structure + +``` +{{project}}/ +├── src/ +│ ├── abi/ # ABI definitions (Idris2) +│ │ ├── Types.idr # Core type definitions with proofs +│ │ ├── Layout.idr # Memory layout verification +│ │ └── Foreign.idr # FFI function declarations +│ └── lib/ # Core library (any language) +│ +├── ffi/ +│ └── zig/ # FFI implementation (Zig) +│ ├── build.zig # Build configuration +│ ├── build.zig.zon # Dependencies +│ ├── src/ +│ │ └── main.zig # C-compatible FFI implementation +│ ├── test/ +│ │ └── integration_test.zig +│ └── include/ +│ └── {{project}}.h # C header (optional, can be generated) +│ +├── generated/ # Auto-generated files +│ └── abi/ +│ └── {{project}}.h # Generated from Idris2 ABI +│ +└── bindings/ # Language-specific wrappers (optional) + ├── rust/ + ├── rescript/ + └── julia/ +``` + +## Why Idris2 for ABI? + +### 1. **Formal Verification** + +Idris2's dependent types allow proving properties about the ABI at compile-time: + +```idris +-- Prove struct size is correct +public export +exampleStructSize : HasSize ExampleStruct 16 + +-- Prove field alignment is correct +public export +fieldAligned : Divides 8 (offsetOf ExampleStruct.field) + +-- Prove ABI is platform-compatible +public export +abiCompatible : Compatible (ABI 1) (ABI 2) +``` + +### 2. **Type Safety** + +Encode invariants that C/Zig cannot express: + +```idris +-- Non-null pointer guaranteed at type level +data Handle : Type where + MkHandle : (ptr : Bits64) -> {auto 0 nonNull : So (ptr /= 0)} -> Handle + +-- Array with length proof +data Buffer : (n : Nat) -> Type where + MkBuffer : Vect n Byte -> Buffer n +``` + +### 3. **Platform Abstraction** + +Platform-specific types with compile-time selection: + +```idris +CInt : Platform -> Type +CInt Linux = Bits32 +CInt Windows = Bits32 + +CSize : Platform -> Type +CSize Linux = Bits64 +CSize Windows = Bits64 +``` + +### 4. **Safe Evolution** + +Prove that new ABI versions are backward-compatible: + +```idris +-- Compiler enforces compatibility +abiUpgrade : ABI 1 -> ABI 2 +abiUpgrade old = MkABI2 { + -- Must preserve all v1 fields + v1_compat = old, + -- Can add new fields + new_features = defaults +} +``` + +## Why Zig for FFI? + +### 1. **C ABI Compatibility** + +Zig exports C-compatible functions naturally: + +```zig +export fn library_function(param: i32) i32 { + return param * 2; +} +``` + +### 2. **Memory Safety** + +Compile-time safety without runtime overhead: + +```zig +// Null check enforced at compile time +const handle = init() orelse return error.InitFailed; +defer free(handle); +``` + +### 3. **Cross-Compilation** + +Built-in cross-compilation to any platform: + +```bash +zig build -Dtarget=x86_64-linux +zig build -Dtarget=aarch64-macos +zig build -Dtarget=x86_64-windows +``` + +### 4. **Zero Dependencies** + +No runtime, no libc required (unless explicitly needed): + +```zig +// Minimal binary size +pub const lib = @import("std"); +// Only includes what you use +``` + +## Building + +### Build FFI Library + +```bash +cd ffi/zig +zig build # Build debug +zig build -Doptimize=ReleaseFast # Build optimized +zig build test # Run tests +``` + +### Generate C Header from Idris2 ABI + +```bash +cd src/abi +idris2 --cg c-header Types.idr -o ../../generated/abi/{{project}}.h +``` + +### Cross-Compile + +```bash +cd ffi/zig + +# Linux x86_64 +zig build -Dtarget=x86_64-linux + +# macOS ARM64 +zig build -Dtarget=aarch64-macos + +# Windows x86_64 +zig build -Dtarget=x86_64-windows +``` + +## Usage + +### From C + +```c +#include "{{project}}.h" + +int main() { + void* handle = {{project}}_init(); + if (!handle) return 1; + + int result = {{project}}_process(handle, 42); + if (result != 0) { + const char* err = {{project}}_last_error(); + fprintf(stderr, "Error: %s\n", err); + } + + {{project}}_free(handle); + return 0; +} +``` + +Compile with: +```bash +gcc -o example example.c -l{{project}} -L./zig-out/lib +``` + +### From Idris2 + +```idris +import {{PROJECT}}.ABI.Foreign + +main : IO () +main = do + Just handle <- init + | Nothing => putStrLn "Failed to initialize" + + Right result <- process handle 42 + | Left err => putStrLn $ "Error: " ++ errorDescription err + + free handle + putStrLn "Success" +``` + +### From Rust + +```rust +#[link(name = "{{project}}")] +extern "C" { + fn {{project}}_init() -> *mut std::ffi::c_void; + fn {{project}}_free(handle: *mut std::ffi::c_void); + fn {{project}}_process(handle: *mut std::ffi::c_void, input: u32) -> i32; +} + +fn main() { + unsafe { + let handle = {{project}}_init(); + assert!(!handle.is_null()); + + let result = {{project}}_process(handle, 42); + assert_eq!(result, 0); + + {{project}}_free(handle); + } +} +``` + +### From Julia + +```julia +const lib{{project}} = "lib{{project}}" + +function init() + handle = ccall((:{{project}}_init, lib{{project}}), Ptr{Cvoid}, ()) + handle == C_NULL && error("Failed to initialize") + handle +end + +function process(handle, input) + result = ccall((:{{project}}_process, lib{{project}}), Cint, (Ptr{Cvoid}, UInt32), handle, input) + result +end + +function cleanup(handle) + ccall((:{{project}}_free, lib{{project}}), Cvoid, (Ptr{Cvoid},), handle) +end + +# Usage +handle = init() +try + result = process(handle, 42) + println("Result: $result") +finally + cleanup(handle) +end +``` + +## Testing + +### Unit Tests (Zig) + +```bash +cd ffi/zig +zig build test +``` + +### Integration Tests + +```bash +cd ffi/zig +zig build test-integration +``` + +### ABI Verification (Idris2) + +```idris +-- Compile-time verification +%runElab verifyABI + +-- Runtime checks +main : IO () +main = do + verifyLayoutsCorrect + verifyAlignmentsCorrect + putStrLn "ABI verification passed" +``` + +## Contributing + +When modifying the ABI/FFI: + +1. **Update ABI first** (`src/abi/*.idr`) + - Modify type definitions + - Update proofs + - Ensure backward compatibility + +2. **Generate C header** + ```bash + idris2 --cg c-header src/abi/Types.idr -o generated/abi/{{project}}.h + ``` + +3. **Update FFI implementation** (`ffi/zig/src/main.zig`) + - Implement new functions + - Match ABI types exactly + +4. **Add tests** + - Unit tests in Zig + - Integration tests + - ABI verification tests + +5. **Update documentation** + - Function signatures + - Usage examples + - Migration guide (if breaking changes) + +## License + +{{LICENSE}} + +## See Also + +- [Idris2 Documentation](https://idris2.readthedocs.io) +- [Zig Documentation](https://ziglang.org/documentation/master/) +- [Rhodium Standard Repositories](https://github.com/{{OWNER}}/rhodium-standard-repositories) diff --git a/rs/docs/developer/README.adoc b/rs/docs/developer/README.adoc new file mode 100644 index 0000000..1d00529 --- /dev/null +++ b/rs/docs/developer/README.adoc @@ -0,0 +1 @@ += developer Unit diff --git a/rs/docs/governance/0.1-AI-MANIFEST.a2ml b/rs/docs/governance/0.1-AI-MANIFEST.a2ml new file mode 100644 index 0000000..6e373bd --- /dev/null +++ b/rs/docs/governance/0.1-AI-MANIFEST.a2ml @@ -0,0 +1,21 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "governance-pillar" +level: 1 +parent: "../0-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Primary governance pillar implementing the Triaxial Software Development + Methodology (TSDM). Contains planning, maintenance, and audit tracks. + +canonical_locations: + tsdm_spec: "TSDM.adoc" + planning: "planning/" + maintenance: "maintenance/" + audit: "audit/" + crg: "CRG-CRITERIA.adoc" + checklist: "MAINTENANCE-CHECKLIST.adoc" + approach: "SOFTWARE-DEVELOPMENT-APPROACH.adoc" diff --git a/rs/docs/governance/CRG-CRITERIA.a2ml b/rs/docs/governance/CRG-CRITERIA.a2ml new file mode 100644 index 0000000..6162585 --- /dev/null +++ b/rs/docs/governance/CRG-CRITERIA.a2ml @@ -0,0 +1,108 @@ +; SPDX-License-Identifier: MPL-2.0 +; Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) + +; Component Readiness Grades (CRG) — Machine-readable specification +; Format: A2ML (AI-to-Machine Language) +; Standard: CRG v1.0 + +(standard + (name "Component Readiness Grades") + (abbreviation "CRG") + (version "1.0") + (date "2026-02-28") + (author "Jonathan D.A. Jewell ") + (license "MPL-2.0") + (family "RSR")) + +(grades + (grade + (code X) + (name "Untested") + (release-stage #f) + (ordinal 0) + (description "No testing has been performed. Status unknown.") + (evidence-required "none") + (minimum-for #f)) + (grade + (code F) + (name "Harmful / Wasteful") + (release-stage #f) + (ordinal 1) + (description "Actively harmful, wasteful, or better handled externally. Reject, deprecate, or delegate.") + (evidence-required "documented test results showing harm, waste, or redundancy; comparison with alternatives") + (minimum-for #f)) + (grade + (code E) + (name "Minimal / Salvageable") + (release-stage "pre-alpha") + (ordinal 2) + (description "Does something slight. Barely functional. Needs redesign or major work.") + (evidence-required "at least one successful test case; documented failures and limitations") + (minimum-for #f)) + (grade + (code D) + (name "Partial / Inconsistent") + (release-stage "alpha") + (ordinal 3) + (description "Works on some things but not systematically.") + (evidence-required "matrix of tested scenarios; documented scope vs actual capabilities") + (minimum-for "alpha")) + (grade + (code C) + (name "Self-Validated") + (release-stage "beta") + (ordinal 4) + (description "Tested on the tool/project itself (dogfooding). Reliable in home context.") + (evidence-required "active dogfooding; CI integration or equivalent; no known failures in home context") + (minimum-for "beta")) + (grade + (code B) + (name "Broadly Validated") + (release-stage "release-candidate") + (ordinal 5) + (description "Tested on at least 6 disparate, unrelated targets.") + (evidence-required "list of 6+ diverse targets with test results; evidence of feedback incorporation") + (minimum-for "release-candidate")) + (grade + (code A) + (name "Field-Proven") + (release-stage "stable") + (ordinal 6) + (description "Real-world external feedback confirms value. Does no harm in the wild.") + (evidence-required "real-world usage data; feedback incorporation evidence; no unresolved harm reports") + (minimum-for "stable"))) + +(transitions + (promotion + (from X) (to E) (requirement "Run at least one test. Document results.")) + (promotion + (from X) (to F) (requirement "Evaluate and determine harmful or wasteful.")) + (promotion + (from E) (to D) (requirement "Fix critical failures. Document scope.")) + (promotion + (from D) (to C) (requirement "Dogfood on own project. Fix what breaks.")) + (promotion + (from C) (to B) (requirement "Test on 6+ diverse external targets. Fix what breaks.")) + (promotion + (from B) (to A) (requirement "Ship. Collect external feedback. Demonstrate no harm.")) + (demotion + (from A) (to B) (trigger "External feedback dries up or reveals no longer useful.")) + (demotion + (from A) (to F) (trigger "External feedback reveals component causes harm.")) + (demotion + (from B) (to C) (trigger "Broad validation reveals unfixed failures.")) + (demotion + (from C) (to D) (trigger "Home context changes and component no longer reliable.")) + (demotion + (from C) (to F) (trigger "Dogfooding reveals net negative.")) + (demotion + (from D) (to E) (trigger "Scope narrows to barely functional.")) + (demotion + (from any) (to F) (trigger "Better external alternative makes this pure opportunity cost."))) + +(conformance + (rule "Each assessable component MUST have a grade from {X, F, E, D, C, B, A}.") + (rule "Each grade above X MUST be supported by evidence per section 4.") + (rule "Assessments MUST be recorded in a version-controlled location.") + (rule "Assessments MUST be reviewed at least once per release cycle.") + (rule "Release stages MUST respect minimum grade thresholds.")) diff --git a/rs/docs/governance/CRG-CRITERIA.adoc b/rs/docs/governance/CRG-CRITERIA.adoc new file mode 100644 index 0000000..f8264e6 --- /dev/null +++ b/rs/docs/governance/CRG-CRITERIA.adoc @@ -0,0 +1,39 @@ += Component Readiness Grades (CRG) Criteria +:toc: preamble +:icons: font + +This document defines the quality assessment criteria for individual project components. + +== Grade Definitions + +[cols="1,2,3,4",options="header"] +|=== +| Grade | Name | Release Stage | Meaning + +| **A** | Field-Proven | Stable | Real-world feedback amassed; no harm in wild. +| **B** | Broadly Validated | Release Candidate | Tested on 6+ diverse external targets. +| **C** | Self-Validated | Beta | Reliable in home context (dogfooded). +| **D** | Partial | Alpha | Works on some inputs/cases but not systematically. +| **E** | Minimal | Pre-alpha | Barely functional; needs major work. +| **F** | Harmful/Wasteful | Reject/Delegate | Redundant or negative value. +| **X** | Untested | — | Status completely unknown. +|=== + +== Core Principles + +1. **Assess components, not projects:** Each feature gets its own grade. +2. **Evidence over intuition:** Every grade above X requires documented evidence. +3. **Honest assessment:** Grade the component as it is today, not as you hope it will be. +4. **Grades are earned and can be lost:** Regressions lead to demotion. + +== Assessment Checklist + +1. Has it been tested at all? (No → **X**) +2. Does it cause harm or duplicate something better? (Yes → **F**) +3. Does it do something, however slight? (Barely → **E**) +4. Does it work on some things but not others? (Partial → **D**) +5. Does it work reliably on our own project? (Dogfooded → **C**) +6. Has it been tested on 6+ diverse external targets? (Broad → **B**) +7. Do external users confirm it works and is useful? (Field-proven → **A**) + +See link:READINESS.adoc[READINESS.adoc] for the current project assessment. diff --git a/rs/docs/governance/MAINTENANCE-CHECKLIST.a2ml b/rs/docs/governance/MAINTENANCE-CHECKLIST.a2ml new file mode 100644 index 0000000..eaee720 --- /dev/null +++ b/rs/docs/governance/MAINTENANCE-CHECKLIST.a2ml @@ -0,0 +1,159 @@ +# SPDX-License-Identifier: MPL-2.0 +# Cross-repo maintenance baseline (machine-readable canonical) + +[metadata] +version = "1.1.0" +last-updated = "2026-02-24" +scope = "cross-repo" +source-human = "docs/maintenance/MAINTENANCE-CHECKLIST.adoc" +companion-human = "docs/practice/SOFTWARE-DEVELOPMENT-APPROACH.adoc" +companion-machine = ".machine_readable/policies/SOFTWARE-DEVELOPMENT-APPROACH.a2ml" + +[policy] +single-source = true +notes = "Use this file as canonical machine policy and keep markdown synchronized." + +[maintenance-axes] +scoping-first = true +execution-order = ["scoping", "axis-1", "axis-2", "axis-3"] +axis-1 = "must > intend > like" +axis-2 = "corrective > adaptive > perfective" +axis-3 = "systems > compliance > effects" + +[scoping] +inputs_required = [ + "README", + "roadmap", + "status-docs", + "maintenance-checklist", + "ci-and-security-docs", +] + +marker_scan_required = [ + "TODO", + "FIXME", + "XXX", + "HACK", + "STUB", + "PARTIAL", +] + +idris_unsound_scan_required = [ + "believe_me", + "assert_total", +] + +scope_assembly_buckets = ["must", "intend", "like"] + +[axis-2-maintenance-rules] +corrective-first = true +adaptive-second = true +adaptive_examples = [ + "scope-change reconciliation", + "stale-reference removal", + "obsolete-work culling", +] +perfective-third = true +perfective_source = "axis-1 honest state after corrective/adaptive updates" + +[axis-3-audit-rules] +systems-check = true +documentation-honesty-check = true +safety-security-accounted-check = true +effects-review-check = true +benchmark-evidence-required = true +maintainer-dialogue-review-required = true +compliance-seams-check = true +exception-register-required = true +exception-bounded-scope-required = true +policy-drift-contamination-check = true +example-drift-risk = "single TypeScript exception causing broad ReScript->TypeScript migration" +compliance-tooling = "panic-attack" +effects-tooling = "ecological checking with sustainabot guidance" + +[generic-cleanup-finish-off] +root-cleanup-required = true +stale-work-cull-required = true +docs-parity-required = true +machine-human-sync-required = true +compliance-finish-off-required = true +effects-finish-off-required = true +release-prep-summary-required = true +next-actions-required = ["corrective", "adaptive", "perfective"] + +[must] +root_control_files = [ + ".gitignore", + ".gitattributes", + ".editorconfig", + ".tool-versions", + "Containerfile", + "Justfile", +] + +root_hosting_files = [ + "CNAME", + ".nojekyll", +] + +ownership_files = [ + "MAINTAINER", + ".github/CODEOWNERS", +] + +machine_readable_required = [ + ".machine_readable/anchors/ANCHOR.a2ml", + ".machine_readable/contractiles/", + ".machine_readable/ai/", + ".machine_readable/bot_directives/", +] + +contractiles_required = [ + "Mustfile", + "Trustfile", + "Intentfile", +] + +security_required = [ + ".well-known/security.txt", + "ci-security-scan", +] + +quality_gate_required = [ + "format", + "lint", + "unit-tests", + "integration-tests", + "p2p-tests", + "e2e-tests", + "bench-smoke", + "docs-check", + "security-scan", +] + +abi_ffi_policy = [ + "ABI Idris2 in src/interface/abi/*.idr", + "FFI Zig in ffi/**/*.zig", +] + +[should] +docs_primary_format = "adoc" +docs_structure = [ + "docs/theory", + "docs/practice", + "docs/whitepapers/academic", + "docs/whitepapers/industry", + "docs/proofs", + "docs/reports", +] + +root_minimization = true +well_known_metadata = true +roadmap_honesty_with_dates = true +ci_doc_format_policy = true + +[could] +generate_human_from_machine = true +mode_aware_bots = ["corrective", "adaptive", "perfective", "audit"] +topology_dashboard = true +exception_registry = true diff --git a/rs/docs/governance/MAINTENANCE-CHECKLIST.adoc b/rs/docs/governance/MAINTENANCE-CHECKLIST.adoc new file mode 100644 index 0000000..0b40654 --- /dev/null +++ b/rs/docs/governance/MAINTENANCE-CHECKLIST.adoc @@ -0,0 +1,569 @@ += Maintenance Checklist +# Maintenance Checklist (Cross-Repo) + +Use this as a repeatable maintenance runbook for any repo. + +Companion policy: + +- `docs/practice/SOFTWARE-DEVELOPMENT-APPROACH.adoc` (human-readable) +- `.machine_readable/policies/SOFTWARE-DEVELOPMENT-APPROACH.a2ml` (machine-readable) + +## Canonical Repo Baseline (Final) + +Apply this baseline to every repo unless an explicit exception is recorded. + +### Three-Axis Default Model + +- [ ] Axis 1 (scope priority, runs first): `must > intend > like` +- [ ] Axis 2 (maintenance priority): `corrective > adaptive > perfective` +- [ ] Axis 3 (audit priority): `systems > compliance > effects` +- [ ] Perfective items are derived from Axis 1 honest state (not started independently). + +### Axis 1 Scoping Pass (Mandatory) + +Before Axis 2/3 execution, assemble a scoped worklist from evidence: + +- [ ] Read and reconcile: `README`, roadmap, status docs, maintenance checklist, and current CI/security docs. +- [ ] Scan for unfinished markers: `TODO`, `FIXME`, `XXX`, `HACK`, `STUB`, `PARTIAL`. +- [ ] If Idris is present, scan unsoundness markers: `believe_me`, `assert_total`. +- [ ] Identify declared intent vs actual implementation (docs honesty check). +- [ ] Produce a scope assembly artifact with prioritized entries under: + - `must` (release blockers / safety / correctness) + - `intend` (planned near-term) + - `like` (nice-to-have) + +### Axis 2 Maintenance Execution Rules + +- [ ] Corrective first: fix breakage, defects, regressions, safety issues. +- [ ] Adaptive second: reconcile changed scope, remove stale references, cull no-longer-relevant work. +- [ ] Perfective third: only from current honest state established by Axis 1 and updated by corrective/adaptive actions. + +### Axis 3 Audit Rules + +- [ ] Verify systems are in place and actually operating. +- [ ] Verify documentation explains the real/current state (not aspirational-only), including documented exceptions. +- [ ] Verify safety and security controls are present, active, and evidenced. +- [ ] Verify observed effects/impacts are captured and reviewed. +- [ ] Effects audit includes: + - benchmark execution and recorded results (with before/after where relevant) + - explicit maintainer dialogue/status review on what changed, why, and next risks +- [ ] Audit compliance seams/compromises explicitly: + - policy exceptions are recorded with rationale, scope, and expiry/review + - exception does not silently broaden into general policy drift + - language-policy contamination checks run (example: a single TS exception must not trigger broad TypeScript conversion) + - run `panic-attack` as the compliance-audit scanner + - run ecological checking under effects (using sustainabot guidance as current baseline) + +### Generic Cleanup And Finish-Off Pass + +Run this pass at the end of a corrective/adaptive/perfective cycle: + +- [ ] Root cleanup: + - keep only required control/entry files in root + - move non-essential docs/reports/fixtures to canonical folders +- [ ] Remove or archive stale work: + - close out completed TODO/STUB/PARTIAL items + - cull obsolete references, dead files, and superseded plans +- [ ] Documentation finish-off: + - ensure README, roadmap, status, and wiki match actual implementation state + - ensure machine-readable policy/state files match human docs +- [ ] Security/compliance finish-off: + - run compliance scanner (`panic-attack`) and resolve high-priority findings + - verify exception register and seams/compromises are explicitly bounded +- [ ] Effects finish-off: + - run benchmark/effects checks and record evidence + - conduct explicit maintainer review dialogue (what changed, why, remaining risks) +- [ ] Release-prep finish-off: + - produce Must/Should/Could summary + - produce immediate corrective/adaptive/perfective next-actions list + +### Must + +- [ ] Keep required control files at repository root: + - `.gitignore`, `.gitattributes`, `.editorconfig`, `.tool-versions` + - `Containerfile` + - `.containerignore` (or `.dockerignore` only when required for compatibility) + - `CNAME` and `.nojekyll` when using GitHub Pages/custom domain + - `Justfile` (root by convention) +- [ ] Keep ownership/governance files present: + - `MAINTAINER` in root + - `.github/CODEOWNERS` +- [ ] Keep machine-readable canonical structure under `.machine_readable/`: + - state/meta/ecosystem files (`*.a2ml` or repo standard) + - `anchors/ANCHOR.a2ml` + - `contractiles/` (`must`, `trust`, `lust`, and related) + - `ai/` for AI guidance files + - `bot_directives/` for bot control files +- [ ] Keep contractiles/invariants present and wired: + - root `Mustfile` (or equivalent) with enforceable checks + - `Trustfile` and `Intentfile` present +- [ ] Keep security metadata present: + - `.well-known/security.txt` and relevant policy metadata + - CI security scanning configured and runnable +- [ ] Keep docs and navigation coherent: + - single navigation entry point in root (`NAVIGATION.adoc` or equivalent) + - no duplicate conflicting docs for same purpose (for example both `.md` and `.adoc` in root unless intentionally required) +- [ ] Enforce ABI/FFI purity where the policy applies: + - ABI definitions in Idris2 (`src/abi/*.idr`) + - FFI implementations in Zig (`ffi/**/*.zig`) +- [ ] Ensure quality gate includes: formatting, lint, unit/integration tests, p2p/e2e checks, benchmark smoke, docs checks, security scan. + +### Should + +- [ ] Keep human docs primarily in AsciiDoc (`.adoc`) except where ecosystem rules require other formats (GitHub/community health, legal text, tool-specific files). +- [ ] Keep non-essential root files moved into structured folders: + - `docs/` (theory/practice/whitepapers/proofs/reports) + - `tests/` (fixtures/outputs) + - `docs/legal/` (while retaining root `LICENSE` when forge detection needs it) +- [ ] Maintain `.well-known/` for public metadata where applicable (`security.txt`, `humans.txt`, `ads.txt` mirrors if used). +- [ ] Keep CI policy checks for doc-format conventions and canonical file placement. +- [ ] Keep roadmap/status docs honest with dated evidence. + +### Could + +- [ ] Maintain both human and machine views of maintenance policy from a single source (generate one from the other). +- [ ] Add policy bots for corrective/adaptive/perfective/audit modes. +- [ ] Add repo-level architecture map (`TOPOLOGY.md`) and release-readiness dashboards. +- [ ] Add per-repo exception registry for approved policy deviations. + +### Explicit Root-Placement Rule + +Do **not** move the following out of root if you want default tool behavior: + +- `.gitignore`, `.gitattributes`, `.editorconfig`, `.tool-versions` +- `Containerfile` and ignore file (`.containerignore`/`.dockerignore`) +- `CNAME` and `.nojekyll` for GitHub Pages +- `Justfile` + +## Quick Automated Run (Script) + +Use the helper script first, then use the checklist for deeper/manual follow-up. + +Script locations: +- `/var$REPOS_DIR/run-maintenance.sh` +- `~/Desktop/run-maintenance.sh` + +```bash +~/Desktop/run-maintenance.sh --repo /absolute/path/to/repo --output /tmp/maintenance-report.json +jq . /tmp/maintenance-report.json +``` + +Useful flags: + +```bash +# Strict mode: fail process on failed checks +~/Desktop/run-maintenance.sh --repo /absolute/path/to/repo --strict + +# Skip expensive checks when needed +~/Desktop/run-maintenance.sh --repo /absolute/path/to/repo --skip-panic + +# Explicit language selection +~/Desktop/run-maintenance.sh --repo /absolute/path/to/repo --rust --python + +# Release hard-pass mode (fails on warnings or failures) +~/Desktop/run-maintenance.sh --repo /absolute/path/to/repo --fail-on-warn +``` + +Permission policy in script: +- Flags `g+w/o+w` files/dirs +- Flags suspicious executable files +- Flags shebang scripts missing executable bit +- Supports repo-local exceptions via `.maintenance-perms-ignore` (regex per line) +- **Audit-first by default** (non-mutating) +- `--fix-perms` is explicit opt-in only (never implicit) +- For reversible local hardening, pair snapshot/restore scripts where available: + - `scripts/maintenance/perms-state.sh snapshot` + - `scripts/maintenance/perms-state.sh lock` + - `scripts/maintenance/perms-state.sh restore` + +Important git behavior: +- Git generally tracks execute bit, not full UNIX mode matrix. +- Permission hardening audits do not force collaborators to re-unlock every file on pull. +- Keep lock mode opt-in, with restore path documented. + +```bash +# Audit-only (recommended default) +~/Desktop/run-maintenance.sh --repo /absolute/path/to/repo + +# Opt-in permission fixes (review output before commit) +~/Desktop/run-maintenance.sh --repo /absolute/path/to/repo --fix-perms +``` + +## 0) Setup + +```bash +REPO="/absolute/path/to/repo" +cd "$REPO" +``` + +```bash +date -u +git rev-parse --abbrev-ref HEAD +git rev-parse HEAD +git status --porcelain +``` + +## 1) Preflight + +- [ ] Confirm clean intent: note existing unrelated dirty files before edits. +- [ ] Confirm runtime/toolchain versions. +- [ ] Confirm container mode expectation (`podman`/`podman-compose`) if required. + +```bash +command -v rg git jq || true +command -v podman podman-compose || true +``` + +## 2) Dependency/Env Prereqs + +- [ ] Python deps in active interpreter (for Python paths). +- [ ] Language-specific tooling installed. + +```bash +python -c "import sys; print(sys.executable)" +python -c "import pydantic; print(pydantic.__version__)" || echo "pydantic missing" +``` + +## 3) Corrective Maintenance First + +- [ ] Fix regressions, runtime errors, panics, broken commands, failing tests. +- [ ] Re-run failing checks immediately after each fix. + +## 4) Code Health Scans + +- [ ] `TODO/FIXME/XXX/HACK/STUB/PARTIAL` scan. +- [ ] Permission policy scan (`g+w/o+w`, executable hygiene). +- [ ] ABI/FFI policy scan (if applicable: Idris2 ABI, Zig FFI). + +```bash +rg -n "TODO|FIXME|XXX|HACK|STUB|PARTIAL" -g '!**/.git/**' -g '!**/target/**' . +``` + +```bash +# Optional per-repo exceptions (regex per line): +# .maintenance-perms-ignore +# ^vendor/ +# ^third_party/ +``` + +```bash +# Adjust paths for your repo layout +find . -type f \( -name '*.idr' -o -name '*.idris2' -o -name '*.zig' \) +``` + +## 5) Panic/Safety/Security Pass + +- [ ] Run `panic-attacker` assail/assault. +- [ ] Triage findings by severity. +- [ ] Fix high first, then medium. +- [ ] Re-run until acceptable. + +```bash +PANIC_BIN="/var$REPOS_DIR/panic-attacker/target/release/panic-attack" +"$PANIC_BIN" assail "$REPO" --output /tmp/assail.json --output-format json --quiet +jq -r '.weak_points | length' /tmp/assail.json +jq -r '.weak_points[] | "\(.severity)|\(.location)|\(.description)"' /tmp/assail.json +``` + +```bash +# If repo has production-only source builder, prefer this for baseline checks: +./scripts/ci/build-panic-assail-source.sh /tmp/panic-src +"$PANIC_BIN" assail /tmp/panic-src --output /tmp/assail-prod.json --output-format json --quiet +``` + +## 6) Language-Specific Validation + +### Rust + +- [ ] Format +- [ ] Lint +- [ ] Tests +- [ ] Doc tests +- [ ] Benches (where relevant) + +```bash +cargo fmt --all --check +cargo clippy --workspace --all-targets -- -D warnings +cargo test --workspace +cargo test --workspace --doc +# Optional targeted benchmarks: +cargo bench +``` + +### Python + +- [ ] Format/lint +- [ ] Type check +- [ ] Tests + +```bash +ruff check . +ruff format --check . +mypy . +pytest -q +``` + +### Elixir + +- [ ] Format check +- [ ] Lint/static checks +- [ ] Tests + +```bash +mix format --check-formatted +mix credo --strict +mix test +``` + +## 7) Container/Runtime Checks (Podman) + +- [ ] Build container path. +- [ ] Run smoke tests inside containerized flow. +- [ ] Compare host vs container behavior for parity. + +```bash +podman --version +podman compose version || podman-compose --version +``` + +## 8) Benchmark + Regression Check + +- [ ] Capture before/after metrics for touched hot paths. +- [ ] Record command + sample size + output. +- [ ] Fail change if critical path regresses beyond threshold. + +## 9) Adaptive and Perfective Maintenance + +- [ ] Adaptive: compatibility updates (tooling/API/deprecations/config flags). +- [ ] Perfective: clarity, docs parity, developer workflow improvements. +- [ ] Update roadmap/checklist/docs to match actual implementation state. + +## 10) Final QA and Release Hygiene + +- [ ] Re-run full relevant checks one final time. +- [ ] Confirm no unintended file changes. +- [ ] Commit scoped changes with clear message. +- [ ] Push and capture commit SHA. + +```bash +git status --short +git diff --stat +git add +git commit -m "maint: " +git push +``` + +## 11) Maintenance Report Template + +Copy this block per repo run: + +```text +Repo: +Branch: +Start UTC: +End UTC: + +Scope: +- Corrective: +- Adaptive: +- Perfective: + +Checks Run: +- TODO/FIXME scan: +- Panic-attacker: +- Rust/Python/Elixir checks: +- Container checks: +- Benchmark checks: + +Findings: +- High: +- Medium: +- Low: + +Fixes Applied: +1. +2. +3. + +Validation Results: +- Tests: +- Benchmarks: +- Panic-attacker rerun: + +Artifacts: +- assail report: +- benchmark output: +- logs: + +Commit(s): +- SHA: + +Remaining Risks / Follow-ups: +1. +2. +``` + +## 12) Language-Repo Additions (Eclexia-Specific) + +Add these checks for language/compiler repositories with formal ABI/FFI constraints: + +- [x] README structure restored (index/TOC, audience paths, quickstart sanity). +- [x] Wiki split by audience (laypeople/users/developers) and linked from docs index. +- [x] Root-level clutter reduced (archive, analysis, reports relegated to `docs/` subtrees). +- [x] Machine-readable docs synchronized (`STATE.a2ml`, `META.a2ml`, `ECOSYSTEM.a2ml`, contractiles). +- [x] Human-readable docs synchronized (`README`, `QUICK_STATUS`, roadmap, wiki home). +- [x] `Mustfile` invariants present and enforceable in CI. +- [x] `Trustfile` and `Intentfile` present and complete. +- [x] FFI/ABI purity policy enforced (`*.zig` for FFI, `*.idr`/Idris2 for ABI). +- [x] `panic-attack` findings triaged with explicit severity budget for release. +- [x] Point-to-point, end-to-end, and benchmark checks wired in one quality gate. +- [x] CI workflows include quality + security + docs checks with explicit policy. +- [x] Release audit includes corrective/adaptive/perfective + Must/Should/Could. +- [x] Roadmap/status honesty pass completed (dates and current evidence updated). + +## 13) Latest Execution Record (Eclexia, 2026-02-24) + +Repo: `/tmp/eclexia-releaseprep` (branch `release-prep`, base `533ec9e9447f374135cc9e2e81021624ddb3c0ad`) + +### 13.1 Setup/Preflight + +- [x] Captured UTC timestamp and git state. +- [x] Tooling presence verified (`rg`, `git`, `jq`, `cargo`, `rustc`, `just`). +- [x] Runtime/toolchain versions captured. +- [x] Container tooling checked (`podman`, `podman-compose`). + +### 13.2 Corrective Maintenance + +- [x] Fixed `panic-attack` script path handling (`mktemp` output + local fallback binary detection). +- [x] Removed Idris `believe_me` usage from ABI wrappers. +- [x] Fixed conformance crash-noise path by skipping known intentional stack-overflow case in default runner. +- [x] Re-ran affected checks after each fix. + +### 13.3 Code-Health Scans + +- [x] TODO/FIXME/STUB/PARTIAL scan run on active code paths. +- [x] ABI/FFI file inventory run (`*.idr`, `*.zig`). +- [x] Active-code marker count reduced/triaged; remaining items tracked in release audit. + +### 13.4 Security/Panic Pass + +- [x] `panic-attack` run and triaged. +- [x] Critical findings cleared (Idris unsoundness markers removed). +- [x] Current baseline: 0 weak points (Critical 0, High 0, Medium 0, Low 0). +- [x] High/Medium backlog fully eliminated. + +### 13.5 Language Validation + +- [x] Final `just quality-gate` pass completed (docs, fmt, lint, unit, conformance, integration, p2p, e2e, bench). +- [x] Additional targeted reruns completed (`just test-conformance`, `just panic-attack`, `just docs-check`). + +### 13.6 Adaptive/Perfective/Docs + +- [x] README/wiki/docs structure and indexing restored. +- [x] Root tidy/relegation pass executed. +- [x] Roadmap/status honesty update performed with current date and evidence links. +- [x] Release audit created with corrective/adaptive/perfective + Must/Should/Could. +- [x] Full quality-gate rerun passed after hardening updates. +- [x] ABI/FFI extension lane added without breaking stable symbols (`ecl_abi_get_info`, `ecl_tracker_create_ex`, `ecl_tracker_snapshot`). +- [x] CI quality workflow now validates sibling `proven` repo presence and critical binding files. +- [x] Proven roadmap now includes explicit "critical core, not full rewrite" adoption guidance and flowchart. + +### 13.7 Outstanding Items (Explicit) + +- [x] Stable `v1.0.0` technical gate readiness met (quality + panic scan clean). +- [x] Parser/codegen/runtime panic-path hardening completed for scanner-flagged paths. +- [x] Non-eclexia `proven` library checked: already Idris2-first with Zig ABI bridge; no additional integration changes required in this run. +- [ ] Remote push blocked by token scope: GitHub rejected branch updates (`release-prep`, `release-prep-pushable`) due missing `workflow` OAuth scope. + +### 13.8 Artifacts + +- Release audit: `docs/reports/V1-READINESS-AUDIT-2026-02-24.md` +- Panic report: `/tmp/eclexia-panic-attack.KZ1jpC.json` (0 weak points) +- Final quality gate log: `/tmp/eclexia-quality-gate-final2.log` (plus post-change reruns via terminal sessions) +- Local commits: `88fa2af` (`release-prep`), `baa3d1c` (`release-prep-pushable`) + pending new commit from this pass + +## 12) LLM Operator Instructions + +Use this prompt with an LLM agent when you want the process run end-to-end: + +```text +Run the maintenance workflow for this repo using MAINTENANCE-CHECKLIST.md. + +Required behavior: +1. Run ~/Desktop/run-maintenance.sh first and collect the JSON report. +2. Triage report results by severity: fail > warn > pass. +3. Execute corrective maintenance first (fix regressions, panics, broken tests/commands). +4. Run TODO/FIXME/stub scan and address relevant items. +5. Run panic-attacker and fix findings in priority order; rerun to confirm. +6. Run language-specific checks (Rust/Python/Elixir) relevant to this repo. +7. Run benchmark/regression checks for touched hot paths. +8. Enforce permission policy: + - no group/world writable source files unless justified + - executable bit only where intended + - use .maintenance-perms-ignore for justified exceptions +9. Update docs/roadmap/checklist entries to reflect actual state. +10. Produce a final report using the template in MAINTENANCE-CHECKLIST.md. + +Constraints: +- Do not revert unrelated existing dirty changes. +- Stage and commit only scoped intended files. +- If blocked, state exactly what is blocked and why. +``` + +## 13) AI Execution Integrity Contract (Mandatory) + +Use this when delegating maintenance to any AI (Gemini/Claude/ChatGPT/etc.). + +```text +You must execute this maintenance run with strict integrity. + +Non-negotiable rules: +1. Do not claim any step is complete unless you actually ran it. +2. Do not silently skip checklist items. If skipped, state SKIPPED + exact reason. +3. For every check, provide evidence: + - command executed + - pass/fail/warn + - key output summary + - artifact/log path +4. If a command fails, stop claiming success and report the failure clearly. +5. After each fix, re-run the relevant failing check and report the rerun result. +6. Do not hide uncertainty. If unsure, say so and run additional verification. +7. Never mark “all done” while any fail/warn remains unexplained. +8. Do not make destructive or broad permission changes by default. + - permission changes must be audit-first + - use --fix-perms only with explicit intent +9. Final output must include: + - checklist coverage matrix (each item: PASS/FAIL/WARN/SKIPPED) + - unresolved risks + - exact next actions +10. Prioritize user safety and reputation: no “looks fine” claims without evidence. +``` + +Recommended enforcement line for AI prompts: + +```text +Fail closed: if evidence is missing for any checklist item, treat that item as NOT DONE. +``` + +## 14) Fleet Enrollment Automation (Gitbot + Hypatia) + +For centralized coverage across existing and new repos: + +```bash +cd /var$REPOS_DIR/gitbot-fleet +just enroll-repos +``` + +Optional directive write-back to repos that already have `.machine_readable/`: + +```bash +cd /var$REPOS_DIR/gitbot-fleet +just enroll-repos /var$REPOS_DIR true +``` + +Release hard gate from fleet: + +```bash +cd /var$REPOS_DIR/gitbot-fleet +just maintenance-hard-pass /absolute/path/to/repo +``` diff --git a/rs/docs/governance/README.adoc b/rs/docs/governance/README.adoc new file mode 100644 index 0000000..114ee94 --- /dev/null +++ b/rs/docs/governance/README.adoc @@ -0,0 +1 @@ += Governance Pillar (TSDM) diff --git a/rs/docs/governance/SOFTWARE-DEVELOPMENT-APPROACH.a2ml b/rs/docs/governance/SOFTWARE-DEVELOPMENT-APPROACH.a2ml new file mode 100644 index 0000000..093573a --- /dev/null +++ b/rs/docs/governance/SOFTWARE-DEVELOPMENT-APPROACH.a2ml @@ -0,0 +1,53 @@ +# SPDX-License-Identifier: MPL-2.0 +# General software development approach (machine-readable) + +[metadata] +version = "1.0.0" +last-updated = "2026-02-24" +scope = "cross-repo" +source-human = "docs/practice/SOFTWARE-DEVELOPMENT-APPROACH.adoc" + +[execution] +order = ["axis-1", "axis-2", "axis-3"] + +[axis-1] +name = "scope" +priority = "must > intend > like" +inputs = [ + "README", + "roadmap", + "status-docs", + "ci-and-security-docs", +] +marker-scan = ["TODO", "FIXME", "XXX", "HACK", "STUB", "PARTIAL"] +idris-unsound-scan = ["believe_me", "assert_total"] +output = "scoped-work-assembly" + +[axis-2] +name = "maintenance" +priority = "corrective > adaptive > perfective" +corrective = "defect/regression/safety/security fixes" +adaptive = "scope reconciliation, stale-reference removal, obsolete-work culling" +perfective = "quality improvements derived from axis-1 honest state" + +[axis-3] +name = "audit" +priority = "systems > compliance > effects" +systems = "required systems present and operating" +compliance = "exceptions explicit, bounded, and drift-resistant" +effects = "benchmark/operational impact evidence captured and reviewed" +compliance-tooling = "panic-attack" +effects-tooling = "ecological checking with sustainabot guidance" + +[cleanup-finish-off] +root-cleanup = true +stale-work-cull = true +docs-sync-human-machine = true +compliance-audit = true +effects-audit = true +release-summary = ["must", "should", "could"] +next-actions = ["corrective", "adaptive", "perfective"] + +[collaboration] +maintainer-dialogue-required = true +dialogue-topics = ["what changed", "why", "remaining risks"] diff --git a/rs/docs/governance/SOFTWARE-DEVELOPMENT-APPROACH.adoc b/rs/docs/governance/SOFTWARE-DEVELOPMENT-APPROACH.adoc new file mode 100644 index 0000000..e8805c6 --- /dev/null +++ b/rs/docs/governance/SOFTWARE-DEVELOPMENT-APPROACH.adoc @@ -0,0 +1,63 @@ += Software Development Approach (General) +:toc: left +:toclevels: 2 + +This is the general operating policy for software development across repositories. + +== Core Sequence + +Always run work in this order: + +1. Scope first (Axis 1) +2. Maintenance second (Axis 2) +3. Audit third (Axis 3) + +== Axis Definitions + +=== Axis 1: Scope + +Priority order: `must > intend > like` + +Axis 1 output is a scoped assembly of work based on: + +* README, roadmap, status, CI/security docs +* marker scans (`TODO`, `FIXME`, `XXX`, `HACK`, `STUB`, `PARTIAL`) +* Idris unsoundness scan when Idris exists (`believe_me`, `assert_total`) +* docs honesty check (intent vs actual implementation) + +=== Axis 2: Maintenance + +Priority order: `corrective > adaptive > perfective` + +* Corrective: fix defects, regressions, breakage, security/safety failures +* Adaptive: reconcile scope changes, remove stale references, cull obsolete work +* Perfective: improve quality/clarity/performance only from the honest Axis 1 state + +=== Axis 3: Audit + +Priority order: `systems > compliance > effects` + +* Systems: required mechanisms exist and are operating +* Compliance: seams/compromises/exceptions are explicit, bounded, and do not drift +* Effects: benchmark and operational impact evidence is captured and reviewed + +Compliance scanner baseline: `panic-attack` + +Effects/ecological baseline: sustainabot-guided ecological checking + +== Generic Cleanup And Finish-Off + +At cycle end: + +* reduce root clutter to required control/entry files +* archive/remove stale or superseded work +* synchronize human and machine docs +* run compliance and effects audits with evidence capture +* produce Must/Should/Could summary and immediate next-actions list + +== Collaboration Rule + +Effects review must include explicit maintainer dialogue: + +* what changed +* why it changed +* what risks remain diff --git a/rs/docs/governance/TSDM.a2ml b/rs/docs/governance/TSDM.a2ml new file mode 100644 index 0000000..f27036c --- /dev/null +++ b/rs/docs/governance/TSDM.a2ml @@ -0,0 +1,22 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [TSDM_SPEC] +id: "tsdm-standard" +version: "1.0.0" + +axes: + axis_1: + name: "Planning" + levels: ["must", "should", "could"] + axis_2: + name: "Maintenance" + levels: ["corrective", "adaptive", "perfective"] + axis_3: + name: "Audit" + levels: ["systems", "compliance", "effects"] + +invariants: + - "Every task MUST map to at least one TSDM coordinate" + - "Axis 1 priority governs resource allocation" + - "Axis 2 type governs commit categorisation" + - "Axis 3 focus governs audit depth" diff --git a/rs/docs/governance/TSDM.adoc b/rs/docs/governance/TSDM.adoc new file mode 100644 index 0000000..cbd582c --- /dev/null +++ b/rs/docs/governance/TSDM.adoc @@ -0,0 +1,26 @@ += Triaxial Software Development Methodology (TSDM) +:toc: preamble +:icons: font + +TSDM is a three-dimensional governance framework designed for high-assurance, long-lived software systems. It ensures that every project decision is mapped across three critical axes: Planning, Maintenance, and Audit. + +== The Three Axes + +=== Axis 1: Planning (Scope Priority) +* **Must:** Non-negotiable core invariants and safety requirements. +* **Should:** Essential features and planned improvements. +* **Could:** Desired enhancements and future-proofing. + +=== Axis 2: Maintenance (Execution Type) +* **Corrective:** Fixing bugs, vulnerabilities, and failures. +* **Adaptive:** Responding to environment or dependency changes. +* **Perfective:** Improving performance, refactoring, and documentation. + +=== Axis 3: Audit (Verification Focus) +* **Systems:** Integrity of tools, infrastructure, and automation. +* **Compliance:** Adherence to standards, licenses, and verified seams. +* **Effects:** Real-world impact, ecological footprint, and user feedback. + +== Integration + +TSDM is the operational core of the Rhodium Standard. Every task in the `Justfile` and every state change in `STATE.a2ml` should be justifiable within this framework. diff --git a/rs/docs/governance/audit/0.2-AI-MANIFEST.a2ml b/rs/docs/governance/audit/0.2-AI-MANIFEST.a2ml new file mode 100644 index 0000000..4722486 --- /dev/null +++ b/rs/docs/governance/audit/0.2-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "governance-axis-audit" +level: 2 +parent: "../0.1-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + TSDM Audit track. diff --git a/rs/docs/governance/audit/README.adoc b/rs/docs/governance/audit/README.adoc new file mode 100644 index 0000000..fac3740 --- /dev/null +++ b/rs/docs/governance/audit/README.adoc @@ -0,0 +1 @@ += Audit Axis diff --git a/rs/docs/governance/audit/compliance/0.3-AI-MANIFEST.a2ml b/rs/docs/governance/audit/compliance/0.3-AI-MANIFEST.a2ml new file mode 100644 index 0000000..b13ec69 --- /dev/null +++ b/rs/docs/governance/audit/compliance/0.3-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "governance-unit-compliance" +level: 3 +parent: "../0.2-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + TSDM compliance unit within the Audit axis. diff --git a/rs/docs/governance/audit/compliance/README.adoc b/rs/docs/governance/audit/compliance/README.adoc new file mode 100644 index 0000000..876954f --- /dev/null +++ b/rs/docs/governance/audit/compliance/README.adoc @@ -0,0 +1 @@ += Compliance Unit diff --git a/rs/docs/governance/audit/effects/0.3-AI-MANIFEST.a2ml b/rs/docs/governance/audit/effects/0.3-AI-MANIFEST.a2ml new file mode 100644 index 0000000..0bccae0 --- /dev/null +++ b/rs/docs/governance/audit/effects/0.3-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "governance-unit-effects" +level: 3 +parent: "../0.2-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + TSDM effects unit within the Audit axis. diff --git a/rs/docs/governance/audit/effects/README.adoc b/rs/docs/governance/audit/effects/README.adoc new file mode 100644 index 0000000..3634799 --- /dev/null +++ b/rs/docs/governance/audit/effects/README.adoc @@ -0,0 +1 @@ += Effects Unit diff --git a/rs/docs/governance/audit/systems/0.3-AI-MANIFEST.a2ml b/rs/docs/governance/audit/systems/0.3-AI-MANIFEST.a2ml new file mode 100644 index 0000000..f97bc9c --- /dev/null +++ b/rs/docs/governance/audit/systems/0.3-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "governance-unit-systems" +level: 3 +parent: "../0.2-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + TSDM systems unit within the Audit axis. diff --git a/rs/docs/governance/audit/systems/README.adoc b/rs/docs/governance/audit/systems/README.adoc new file mode 100644 index 0000000..8d179b4 --- /dev/null +++ b/rs/docs/governance/audit/systems/README.adoc @@ -0,0 +1 @@ += Systems Unit diff --git a/rs/docs/governance/maintenance/0.2-AI-MANIFEST.a2ml b/rs/docs/governance/maintenance/0.2-AI-MANIFEST.a2ml new file mode 100644 index 0000000..8e0dff5 --- /dev/null +++ b/rs/docs/governance/maintenance/0.2-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "governance-axis-maintenance" +level: 2 +parent: "../0.1-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + TSDM Maintenance track. diff --git a/rs/docs/governance/maintenance/README.adoc b/rs/docs/governance/maintenance/README.adoc new file mode 100644 index 0000000..0ed2f1b --- /dev/null +++ b/rs/docs/governance/maintenance/README.adoc @@ -0,0 +1 @@ += Maintenance Axis diff --git a/rs/docs/governance/maintenance/adaptive/0.3-AI-MANIFEST.a2ml b/rs/docs/governance/maintenance/adaptive/0.3-AI-MANIFEST.a2ml new file mode 100644 index 0000000..63d1a99 --- /dev/null +++ b/rs/docs/governance/maintenance/adaptive/0.3-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "governance-unit-adaptive" +level: 3 +parent: "../0.2-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + TSDM adaptive unit within the Maintenance axis. diff --git a/rs/docs/governance/maintenance/adaptive/README.adoc b/rs/docs/governance/maintenance/adaptive/README.adoc new file mode 100644 index 0000000..7b60992 --- /dev/null +++ b/rs/docs/governance/maintenance/adaptive/README.adoc @@ -0,0 +1 @@ += Adaptive Unit diff --git a/rs/docs/governance/maintenance/corrective/0.3-AI-MANIFEST.a2ml b/rs/docs/governance/maintenance/corrective/0.3-AI-MANIFEST.a2ml new file mode 100644 index 0000000..05cb89d --- /dev/null +++ b/rs/docs/governance/maintenance/corrective/0.3-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "governance-unit-corrective" +level: 3 +parent: "../0.2-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + TSDM corrective unit within the Maintenance axis. diff --git a/rs/docs/governance/maintenance/corrective/README.adoc b/rs/docs/governance/maintenance/corrective/README.adoc new file mode 100644 index 0000000..ed904a8 --- /dev/null +++ b/rs/docs/governance/maintenance/corrective/README.adoc @@ -0,0 +1 @@ += Corrective Unit diff --git a/rs/docs/governance/maintenance/perfective/0.3-AI-MANIFEST.a2ml b/rs/docs/governance/maintenance/perfective/0.3-AI-MANIFEST.a2ml new file mode 100644 index 0000000..832762f --- /dev/null +++ b/rs/docs/governance/maintenance/perfective/0.3-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "governance-unit-perfective" +level: 3 +parent: "../0.2-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + TSDM perfective unit within the Maintenance axis. diff --git a/rs/docs/governance/maintenance/perfective/README.adoc b/rs/docs/governance/maintenance/perfective/README.adoc new file mode 100644 index 0000000..8759d74 --- /dev/null +++ b/rs/docs/governance/maintenance/perfective/README.adoc @@ -0,0 +1 @@ += Perfective Unit diff --git a/rs/docs/governance/planning/0.2-AI-MANIFEST.a2ml b/rs/docs/governance/planning/0.2-AI-MANIFEST.a2ml new file mode 100644 index 0000000..80339e7 --- /dev/null +++ b/rs/docs/governance/planning/0.2-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "governance-axis-planning" +level: 2 +parent: "../0.1-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + TSDM Planning track. diff --git a/rs/docs/governance/planning/README.adoc b/rs/docs/governance/planning/README.adoc new file mode 100644 index 0000000..62aa375 --- /dev/null +++ b/rs/docs/governance/planning/README.adoc @@ -0,0 +1 @@ += Planning Axis diff --git a/rs/docs/governance/planning/could/0.3-AI-MANIFEST.a2ml b/rs/docs/governance/planning/could/0.3-AI-MANIFEST.a2ml new file mode 100644 index 0000000..fc17a27 --- /dev/null +++ b/rs/docs/governance/planning/could/0.3-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "governance-unit-could" +level: 3 +parent: "../0.2-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + TSDM could unit within the Planning axis. diff --git a/rs/docs/governance/planning/could/README.adoc b/rs/docs/governance/planning/could/README.adoc new file mode 100644 index 0000000..ad5a6b8 --- /dev/null +++ b/rs/docs/governance/planning/could/README.adoc @@ -0,0 +1 @@ += Could Unit diff --git a/rs/docs/governance/planning/must/0.3-AI-MANIFEST.a2ml b/rs/docs/governance/planning/must/0.3-AI-MANIFEST.a2ml new file mode 100644 index 0000000..0987dae --- /dev/null +++ b/rs/docs/governance/planning/must/0.3-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "governance-unit-must" +level: 3 +parent: "../0.2-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + TSDM must unit within the Planning axis. diff --git a/rs/docs/governance/planning/must/README.adoc b/rs/docs/governance/planning/must/README.adoc new file mode 100644 index 0000000..47eb46d --- /dev/null +++ b/rs/docs/governance/planning/must/README.adoc @@ -0,0 +1 @@ += Must Unit diff --git a/rs/docs/governance/planning/should/0.3-AI-MANIFEST.a2ml b/rs/docs/governance/planning/should/0.3-AI-MANIFEST.a2ml new file mode 100644 index 0000000..f492289 --- /dev/null +++ b/rs/docs/governance/planning/should/0.3-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "governance-unit-should" +level: 3 +parent: "../0.2-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + TSDM should unit within the Planning axis. diff --git a/rs/docs/governance/planning/should/README.adoc b/rs/docs/governance/planning/should/README.adoc new file mode 100644 index 0000000..605489c --- /dev/null +++ b/rs/docs/governance/planning/should/README.adoc @@ -0,0 +1 @@ += Should Unit diff --git a/rs/docs/legal/0.2-AI-MANIFEST.a2ml b/rs/docs/legal/0.2-AI-MANIFEST.a2ml new file mode 100644 index 0000000..e547798 --- /dev/null +++ b/rs/docs/legal/0.2-AI-MANIFEST.a2ml @@ -0,0 +1,16 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "legal-track" +level: 2 +parent: "../0.1-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Sub-unit for legal and licensing documentation. Contains framework + exhibits and archival license texts. + +canonical_locations: + exhibits: "exhibits/" + texts: "texts/" diff --git a/rs/docs/legal/EXHIBIT-A-ETHICAL-USE.txt b/rs/docs/legal/EXHIBIT-A-ETHICAL-USE.txt new file mode 100644 index 0000000..0b20fca --- /dev/null +++ b/rs/docs/legal/EXHIBIT-A-ETHICAL-USE.txt @@ -0,0 +1,68 @@ +SPDX-License-Identifier: MPL-2.0 + +================================================================================ +EXHIBIT A — ETHICAL USE GUIDELINES +Palimpsest-MPL License Version 1.0 +================================================================================ + +1. PURPOSE + + These guidelines define ethical use expectations for software distributed + under the Palimpsest-MPL License. They are not legally binding restrictions + but represent the community's shared values and expectations. + +2. PRINCIPLES + + 2.1. Respect for Emotional Lineage + Users and distributors should acknowledge and preserve the cultural, + narrative, and symbolic meaning embedded in Covered Software. This + includes protest traditions, cultural heritage, trauma narratives, + and community stories where documented. + + 2.2. Transparency in Automated Processing + When Covered Software is processed by Non-Interpretive Systems + (AI training, content aggregation, automated summarization), such + use should be documented publicly and not misrepresent the + provenance of outputs. + + 2.3. Good Faith Attribution + Contributors should be credited accurately. Derivative works should + maintain the attribution chain and not obscure the origins of + contributions. + + 2.4. Community Benefit + Commercial use of Covered Software should contribute to the broader + community through bug fixes, documentation, or other improvements + where feasible. + +3. SPECIFIC GUIDANCE + + 3.1. AI and Machine Learning + - Training on Covered Software requires disclosure + - Generated outputs must not claim Emotional Lineage of the original + - Model cards should reference source materials + + 3.2. Content Aggregation + - Aggregators must link back to original sources + - Context must not be stripped in ways that distort meaning + - Cultural and narrative context should be preserved + + 3.3. Commercial Products + - Products built on Covered Software should acknowledge it + - Pricing should not exploit communities that created the work + - Support and improvements should flow back to the community + +4. ENFORCEMENT + + These guidelines are enforced through community norms, not legal action. + Disputes should be raised with the Palimpsest Stewardship Council for + non-binding guidance. + +5. AMENDMENTS + + These guidelines may be updated by the Palimpsest Stewardship Council. + Updates apply to new distributions, not retroactively. + +================================================================================ +END OF EXHIBIT A +================================================================================ diff --git a/rs/docs/legal/EXHIBIT-B-QUANTUM-SAFE.txt b/rs/docs/legal/EXHIBIT-B-QUANTUM-SAFE.txt new file mode 100644 index 0000000..7fba8c9 --- /dev/null +++ b/rs/docs/legal/EXHIBIT-B-QUANTUM-SAFE.txt @@ -0,0 +1,102 @@ +SPDX-License-Identifier: MPL-2.0 + +================================================================================ +EXHIBIT B — QUANTUM-SAFE PROVENANCE SPECIFICATION +Palimpsest-MPL License Version 1.0 +================================================================================ + +1. PURPOSE + + This exhibit specifies the cryptographic algorithms and procedures for + quantum-safe provenance in software distributed under the Palimpsest-MPL + License. + +2. APPROVED ALGORITHMS + + The following post-quantum cryptographic algorithms are approved for + signing Provenance Metadata: + + 2.1. Digital Signatures + - ML-DSA (FIPS 204, formerly CRYSTALS-Dilithium) + Recommended: ML-DSA-65 (security level 3) or ML-DSA-87 (level 5) + - SLH-DSA (FIPS 205, formerly SPHINCS+) + Recommended: SLH-DSA-SHA2-256f or SLH-DSA-SHAKE-256f + - FALCON (NIST Round 3 finalist) + Recommended: FALCON-1024 + + 2.2. Key Encapsulation (for encrypted provenance) + - ML-KEM (FIPS 203, formerly CRYSTALS-Kyber) + Recommended: ML-KEM-1024 + + 2.3. Hash Functions + - SHA-3 (FIPS 202) + Recommended: SHA3-256 or SHA3-512 + - SHAKE (FIPS 202 extendable output) + Recommended: SHAKE-256 + + 2.4. Key Derivation + - Argon2id (RFC 9106) + Parameters: t=3, m=65536, p=4 (minimum) + +3. PROVENANCE METADATA FORMAT + + Provenance Metadata should include: + + 3.1. Required Fields + - author-identity: Contributor name and contact + - timestamp: ISO 8601 with timezone + - content-hash: SHA3-256 hash of the contribution + - signature: Quantum-safe signature over all fields + + 3.2. Optional Fields + - parent-hash: Hash of the previous contribution in the chain + - emotional-lineage: Narrative context markers + - platform: Build/development environment + - witnesses: Third-party attestation signatures + +4. SIGNATURE PROCEDURE + + 4.1. Signing + a. Compute SHA3-256 hash of the contribution content + b. Construct metadata record with all required fields + c. Serialize metadata in canonical JSON form + d. Sign with ML-DSA-65 (or approved alternative) + e. Attach signature to distribution + + 4.2. Verification + a. Extract metadata and signature from distribution + b. Verify signature against contributor's public key + c. Verify content hash matches actual content + d. Verify timestamp is within acceptable range + e. Verify parent-hash chain if present + +5. KEY MANAGEMENT + + 5.1. Contributors should publish quantum-safe public keys via: + - OpenPGP keyservers (with PQ algorithm support) + - Repository .well-known/keys/ directory + - Contributor's personal website + + 5.2. Key rotation should occur: + - At least annually + - When algorithm recommendations change + - When key compromise is suspected + +6. TRANSITION PERIOD + + During the transition to quantum-safe cryptography: + + 6.1. Classical signatures (Ed25519, RSA) remain valid + 6.2. Hybrid signatures (classical + PQ) are encouraged + 6.3. Pure PQ signatures are preferred for new contributions + 6.4. Classical-only signatures will be deprecated in a future version + +7. COMPLIANCE + + Quantum-safe provenance is OPTIONAL under PMPL-1.0. When present, + it must follow this specification. Stripping quantum-safe signatures + from distributions is prohibited per Section 4.1 of the License. + +================================================================================ +END OF EXHIBIT B +================================================================================ diff --git a/rs/docs/practice/.gitkeep b/rs/docs/practice/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/rs/docs/practice/0.2-AI-MANIFEST.a2ml b/rs/docs/practice/0.2-AI-MANIFEST.a2ml new file mode 100644 index 0000000..257f3a4 --- /dev/null +++ b/rs/docs/practice/0.2-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "practice-unit" +level: 2 +parent: "../0.1-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Sub-unit of the docs pillar focusing on practice. diff --git a/rs/docs/practice/AI-CONVENTIONS.adoc b/rs/docs/practice/AI-CONVENTIONS.adoc new file mode 100644 index 0000000..c77617a --- /dev/null +++ b/rs/docs/practice/AI-CONVENTIONS.adoc @@ -0,0 +1,85 @@ += AI Conventions + + + +# AI Conventions (Authoritative Source) + +All AI coding agents working in this repository MUST follow these rules. +Per-tool config files (.cursorrules, .clinerules, etc.) reference this document. + +## Session Startup + +1. Read `0-AI-MANIFEST.a2ml` FIRST (mandatory gatekeeper). +2. Read `.machine_readable/STATE.a2ml` for current status and blockers. +3. Read `.machine_readable/anchors/ANCHOR.a2ml` for canonical authority boundaries. +4. Read `.machine_readable/policies/MAINTENANCE-AXES.a2ml` for maintenance/audit sequencing. +5. Read `.machine_readable/policies/MAINTENANCE-CHECKLIST.a2ml` for baseline controls. +6. Read `.machine_readable/policies/SOFTWARE-DEVELOPMENT-APPROACH.a2ml` for execution order. +7. Read `.machine_readable/AGENTIC.a2ml` for agent constraints. + +## License + +- All original code: **MPL-2.0** +- Fallback (platform-required only): MPL-2.0 with comment explaining why. +- NEVER use AGPL-3.0. +- Preserve third-party licenses verbatim. +- Every source file needs `# SPDX-License-Identifier: CC-BY-SA-4.0`. + +## Author Attribution + +- Name: **{{AUTHOR}}** +- Email: **{{AUTHOR_EMAIL}}** +- Copyright: `Copyright (c) {{CURRENT_YEAR}} {{AUTHOR}} ({{OWNER}}) <{{AUTHOR_EMAIL}}>` + +## State Files + +State/metadata files, anchors, and policies (.a2ml) belong in `.machine_readable/` ONLY. +NEVER create STATE.a2ml, META.a2ml, ECOSYSTEM.a2ml, AGENTIC.a2ml, +NEUROSYM.a2ml, PLAYBOOK.a2ml, ANCHOR.a2ml, MAINTENANCE-AXES.a2ml, +MAINTENANCE-CHECKLIST.a2ml, or SOFTWARE-DEVELOPMENT-APPROACH.a2ml in the repository root. + +## Banned Patterns + +| Language | Banned | Reason | +|----------|-------------------------------------|---------------------------| +| Idris2 | `believe_me`, `assert_total` | Unsound escape hatches | +| Haskell | `unsafeCoerce`, `unsafePerformIO` | Breaks type safety | +| OCaml | `Obj.magic`, `Obj.repr`, `Obj.obj` | Unsafe casting | +| Coq | `Admitted` | Unproven assumption | +| Lean | `sorry` | Unproven assumption | +| Rust | `transmute` (unless FFI + SAFETY:) | Unsound reinterpret | + +## Banned Languages + +| Banned | Use Instead | +|---------------------|--------------------| +| TypeScript | ReScript | +| Node.js / npm / bun | Deno | +| Go | Rust | +| Python | Julia / Rust | + +## Container Standard + +- Runtime: **Podman** (never Docker). +- File: **Containerfile** (never Dockerfile). +- Base images: `cgr.dev/chainguard/wolfi-base:latest` or `cgr.dev/chainguard/static:latest`. + +## ABI/FFI Standard + +- ABI definitions: **Idris2** with dependent types (`src/abi/`). +- FFI implementation: **Zig** with C ABI compatibility (`ffi/zig/`). +- Generated C headers: `generated/abi/`. + +## Build System + +Use `just` (Justfile) for all build, test, lint, and format tasks. + +## References + +- `0-AI-MANIFEST.a2ml` -- universal AI entry point +- `.machine_readable/AGENTIC.a2ml` -- agent permissions and constraints +- `.machine_readable/STATE.a2ml` -- current project state +- `.machine_readable/anchors/ANCHOR.a2ml` -- canonical authority and policy boundary +- `.machine_readable/policies/MAINTENANCE-AXES.a2ml` -- canonical axis sequencing and audit requirements +- `.machine_readable/policies/MAINTENANCE-CHECKLIST.a2ml` -- baseline maintenance checklist policy +- `.machine_readable/policies/SOFTWARE-DEVELOPMENT-APPROACH.a2ml` -- axis execution approach policy diff --git a/rs/docs/practice/README.adoc b/rs/docs/practice/README.adoc new file mode 100644 index 0000000..ae3326b --- /dev/null +++ b/rs/docs/practice/README.adoc @@ -0,0 +1 @@ += practice Unit diff --git a/rs/docs/practice/STATE-VISUALIZER-GUIDE.adoc b/rs/docs/practice/STATE-VISUALIZER-GUIDE.adoc new file mode 100644 index 0000000..b355b46 --- /dev/null +++ b/rs/docs/practice/STATE-VISUALIZER-GUIDE.adoc @@ -0,0 +1,155 @@ +// SPDX-License-Identifier: CC-BY-SA-4.0 += TOPOLOGY.md — Generation Guide +{{AUTHOR}} ({{OWNER}}) <{{AUTHOR_EMAIL}}> +:toc: +:sectnums: + +== What Is TOPOLOGY.md? + +A single-file visual map of any project's architecture and completion status. +It lives in the repo root and contains: + +1. **ASCII architecture diagram** — the full system as it will look when complete +2. **Completion dashboard** — every component with a progress bar and status note +3. **Dependency graph** — what blocks what (the critical path) +4. **Update protocol** — how to keep it current + +It is designed to be readable by humans, AI agents, and rendered cleanly on any +forge (GitHub, GitLab, Codeberg, Bitbucket). + +== Why + +- Gives any contributor (human or AI) an instant picture of the whole project +- Replaces "read 20 files to understand the architecture" with one glance +- The completion dashboard makes project health visible without running anything +- Works offline, no tooling required, just a text file + +== How To Generate One + +=== Option 1: Ask an AI agent + +Use this prompt (works with Claude, Gemini, ChatGPT, or any LLM with repo access): + +[source,text] +---- +Read the entire repository and produce a TOPOLOGY.md file for the repo root. + +The file must contain exactly three sections: + +1. **System Architecture** — An ASCII box diagram showing the complete system + as it will look when finished. Use Unicode box-drawing characters + (┌ ┐ └ ┘ │ ─ ├ ┤ ┬ ┴ ┼), arrows (▲ ▼ ◄ ► → ←), and double lines + (═ ║) for boundaries. Show: + - All external services (DNS, CDN, gateways) at the top + - Application components in the middle + - Data layer (databases, caches, queues) below + - Repo infrastructure (CI, contractiles, SCM files) at the bottom + - Every box labelled, every connection labelled or obvious from context + - The diagram should be BESPOKE to this project, not generic + +2. **Completion Dashboard** — A table in a code block listing every component + from the diagram. For each component show: + - Name (left-aligned, padded to 35 chars) + - Progress bar: 10 characters using █ (done) and ░ (remaining) + - Percentage (0% to 100% in 10% increments) + - A short note explaining the status + Group components by layer/concern. End with an OVERALL summary line. + +3. **Key Dependencies** — An ASCII arrow diagram showing the critical path. + What must finish before what else can start. + +Add a header comment with SPDX-License-Identifier and Last updated date. +End with an "Update Protocol" section explaining how to maintain the file. + +Use the template at TOPOLOGY.md in rsr-template-repo as a structural reference, +but make the content completely specific to THIS project. +---- + +=== Option 2: Copy the template and fill it in + +[source,bash] +---- +cp /path/to/rsr-template-repo/TOPOLOGY.md ./TOPOLOGY.md +# Then edit: replace placeholders, draw the real architecture, fill the dashboard +---- + +=== Option 3: Batch generation across all repos + +[source,bash] +---- +# From the repos root, generate for every repo that lacks one +for repo in /path/to/your/repos/*/; do + if [ ! -f "$repo/TOPOLOGY.md" ]; then + echo "NEEDS TOPOLOGY: $(basename $repo)" + fi +done +---- + +Then feed each repo to an AI agent with the prompt above. Claude Code can do +this with a session per repo, or you can batch it. + +== Conventions + +=== Box-drawing characters + +Use Unicode, not ASCII art. This renders correctly everywhere. + +[cols="1,1", options="header"] +|=== +| Character | Use +| `┌ ┐ └ ┘` | Box corners +| `│ ─` | Vertical / horizontal lines +| `├ ┤ ┬ ┴ ┼` | T-junctions and crosses +| `═ ║` | Double lines for major boundaries +| `▲ ▼ ◄ ►` | Directional arrows +| `→ ← ↑ ↓` | Thin arrows (alternative) +|=== + +=== Progress bars + +Always 10 characters wide. Use full blocks only (no half-blocks). + +[source,text] +---- +░░░░░░░░░░ 0% Not started +█░░░░░░░░░ 10% Stub/skeleton exists +██░░░░░░░░ 20% Early work +███░░░░░░░ 30% Foundation laid +████░░░░░░ 40% Core logic started +█████░░░░░ 50% Half done +██████░░░░ 60% Most logic complete +███████░░░ 70% Working but rough +████████░░ 80% Needs polish/docs +█████████░ 90% Nearly done +██████████ 100% Complete and tested +---- + +=== Component naming + +- Use the actual names from the codebase (file names, service names, tool names) +- Group by architectural layer, not alphabetically +- Include repo infrastructure (CI, contractiles, SCM files) as a layer + +=== When to update + +- After completing a component → change bar + percentage +- After adding a component → add row +- After architectural change → redraw diagram +- After major milestone → update overall percentage +- Always update the `Last updated` date + +== Integration With Other RSR Files + +TOPOLOGY.md complements but does not replace: + +- **STATE.a2ml** — machine-readable state (tasks, blockers, next actions) +- **ECOSYSTEM.a2ml** — position in the wider project ecosystem +- **META.a2ml** — architecture decisions and design rationale +- **0-AI-MANIFEST.a2ml** — AI agent entry point and invariants + +TOPOLOGY.md is the _visual summary_ for humans; the a2ml files are the +_structured data_ for tooling. Both should agree. + +== Copyright + +Copyright (c) {{CURRENT_YEAR}} {{AUTHOR}} ({{OWNER}}) <{{AUTHOR_EMAIL}}> diff --git a/rs/docs/reports/0.2-AI-MANIFEST.a2ml b/rs/docs/reports/0.2-AI-MANIFEST.a2ml new file mode 100644 index 0000000..5eb265d --- /dev/null +++ b/rs/docs/reports/0.2-AI-MANIFEST.a2ml @@ -0,0 +1,19 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "reports-unit" +level: 2 +parent: "../0.1-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Documentation unit for all automated and manual audit reports. Classified + by domain. + +canonical_locations: + maintenance: "maintenance/" + security: "security/" + performance: "performance/" + compliance: "compliance/" + quality: "quality/" diff --git a/rs/docs/reports/README.adoc b/rs/docs/reports/README.adoc new file mode 100644 index 0000000..0c06c31 --- /dev/null +++ b/rs/docs/reports/README.adoc @@ -0,0 +1 @@ += reports Unit diff --git a/rs/docs/reports/compliance/0.3-AI-MANIFEST.a2ml b/rs/docs/reports/compliance/0.3-AI-MANIFEST.a2ml new file mode 100644 index 0000000..6b39752 --- /dev/null +++ b/rs/docs/reports/compliance/0.3-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "report-unit-compliance" +level: 3 +parent: "../0.2-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Specialised repository for compliance findings and evidence. diff --git a/rs/docs/reports/compliance/README.adoc b/rs/docs/reports/compliance/README.adoc new file mode 100644 index 0000000..c38c66a --- /dev/null +++ b/rs/docs/reports/compliance/README.adoc @@ -0,0 +1 @@ += Compliance Reports diff --git a/rs/docs/reports/maintenance/0.3-AI-MANIFEST.a2ml b/rs/docs/reports/maintenance/0.3-AI-MANIFEST.a2ml new file mode 100644 index 0000000..43eefe2 --- /dev/null +++ b/rs/docs/reports/maintenance/0.3-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "report-unit-maintenance" +level: 3 +parent: "../0.2-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Maintenance reports. diff --git a/rs/docs/reports/maintenance/README.adoc b/rs/docs/reports/maintenance/README.adoc new file mode 100644 index 0000000..f13abf7 --- /dev/null +++ b/rs/docs/reports/maintenance/README.adoc @@ -0,0 +1 @@ += Maintenance Reports diff --git a/rs/docs/reports/performance/0.3-AI-MANIFEST.a2ml b/rs/docs/reports/performance/0.3-AI-MANIFEST.a2ml new file mode 100644 index 0000000..40c0954 --- /dev/null +++ b/rs/docs/reports/performance/0.3-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "report-unit-performance" +level: 3 +parent: "../0.2-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Specialised repository for performance findings and evidence. diff --git a/rs/docs/reports/performance/README.adoc b/rs/docs/reports/performance/README.adoc new file mode 100644 index 0000000..037767d --- /dev/null +++ b/rs/docs/reports/performance/README.adoc @@ -0,0 +1 @@ += Performance Reports diff --git a/rs/docs/reports/quality/0.3-AI-MANIFEST.a2ml b/rs/docs/reports/quality/0.3-AI-MANIFEST.a2ml new file mode 100644 index 0000000..d460edc --- /dev/null +++ b/rs/docs/reports/quality/0.3-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "report-unit-quality" +level: 3 +parent: "../0.2-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Specialised repository for quality findings and evidence. diff --git a/rs/docs/reports/quality/README.adoc b/rs/docs/reports/quality/README.adoc new file mode 100644 index 0000000..d1be848 --- /dev/null +++ b/rs/docs/reports/quality/README.adoc @@ -0,0 +1 @@ += Quality Reports diff --git a/rs/docs/reports/security/0.3-AI-MANIFEST.a2ml b/rs/docs/reports/security/0.3-AI-MANIFEST.a2ml new file mode 100644 index 0000000..696ab59 --- /dev/null +++ b/rs/docs/reports/security/0.3-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "report-unit-security" +level: 3 +parent: "../0.2-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Specialised repository for security findings and evidence. diff --git a/rs/docs/reports/security/README.adoc b/rs/docs/reports/security/README.adoc new file mode 100644 index 0000000..9a78a8b --- /dev/null +++ b/rs/docs/reports/security/README.adoc @@ -0,0 +1 @@ += Security Reports diff --git a/rs/docs/standards/0.2-AI-MANIFEST.a2ml b/rs/docs/standards/0.2-AI-MANIFEST.a2ml new file mode 100644 index 0000000..c147c6f --- /dev/null +++ b/rs/docs/standards/0.2-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "standards-unit" +level: 2 +parent: "../0.1-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Standards unit for high-rigor verification. diff --git a/rs/docs/standards/README.adoc b/rs/docs/standards/README.adoc new file mode 100644 index 0000000..34a94c4 --- /dev/null +++ b/rs/docs/standards/README.adoc @@ -0,0 +1 @@ += Standards Unit diff --git a/rs/docs/templates/contractiles/README.adoc b/rs/docs/templates/contractiles/README.adoc new file mode 100644 index 0000000..4eeac6b --- /dev/null +++ b/rs/docs/templates/contractiles/README.adoc @@ -0,0 +1,11 @@ +// SPDX-License-Identifier: CC-BY-SA-4.0 += Contractile Templates + +Blank templates for projects that want to replace the hyperpolymath +defaults with their own contractile definitions. + +Copy the relevant file to `.machine_readable/contractiles//` +and fill in your project-specific checks. + +The working examples in `.machine_readable/contractiles/` show the +full hyperpolymath setup — use those as reference. diff --git a/rs/docs/templates/contractiles/dust/Dustfile.a2ml b/rs/docs/templates/contractiles/dust/Dustfile.a2ml new file mode 100644 index 0000000..903af2c --- /dev/null +++ b/rs/docs/templates/contractiles/dust/Dustfile.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +# Dustfile.a2ml — BLANK TEMPLATE +# Replace this with your project's contractile. +# See .machine_readable/contractiles/ for a working example. +# +# Copy this file to .machine_readable/contractiles/dust/Dustfile.a2ml +# and fill in your project-specific checks. + +@abstract: +[Your project's DUST contract goes here] +@end diff --git a/rs/docs/templates/contractiles/must/Mustfile.a2ml b/rs/docs/templates/contractiles/must/Mustfile.a2ml new file mode 100644 index 0000000..d08796f --- /dev/null +++ b/rs/docs/templates/contractiles/must/Mustfile.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +# Mustfile.a2ml — BLANK TEMPLATE +# Replace this with your project's contractile. +# See .machine_readable/contractiles/ for a working example. +# +# Copy this file to .machine_readable/contractiles/must/Mustfile.a2ml +# and fill in your project-specific checks. + +@abstract: +[Your project's MUST contract goes here] +@end diff --git a/rs/docs/templates/contractiles/trust/Trustfile.a2ml b/rs/docs/templates/contractiles/trust/Trustfile.a2ml new file mode 100644 index 0000000..842c6b0 --- /dev/null +++ b/rs/docs/templates/contractiles/trust/Trustfile.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +# Trustfile.a2ml — BLANK TEMPLATE +# Replace this with your project's contractile. +# See .machine_readable/contractiles/ for a working example. +# +# Copy this file to .machine_readable/contractiles/trust/Trustfile.a2ml +# and fill in your project-specific checks. + +@abstract: +[Your project's TRUST contract goes here] +@end diff --git a/rs/docs/theory/.gitkeep b/rs/docs/theory/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/rs/docs/theory/0.2-AI-MANIFEST.a2ml b/rs/docs/theory/0.2-AI-MANIFEST.a2ml new file mode 100644 index 0000000..93df187 --- /dev/null +++ b/rs/docs/theory/0.2-AI-MANIFEST.a2ml @@ -0,0 +1,23 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "theory-track" +level: 2 +parent: "../0.1-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Documentation track for domain-specific theory and research foundations. + Categorised by discipline. + +canonical_locations: + ontologies: "ontologies/" + mathematics: "mathematics/" + computing: "computing/" + socio_technical: "socio-technical/" + formalisms: "formalisms/" + other: "other/" + +invariants: + - "Theoretical claims MUST reference established academic or technical formalisms" diff --git a/rs/docs/theory/README.adoc b/rs/docs/theory/README.adoc new file mode 100644 index 0000000..c0ddf28 --- /dev/null +++ b/rs/docs/theory/README.adoc @@ -0,0 +1 @@ += theory Unit diff --git a/rs/docs/theory/computing/0.3-AI-MANIFEST.a2ml b/rs/docs/theory/computing/0.3-AI-MANIFEST.a2ml new file mode 100644 index 0000000..f387d08 --- /dev/null +++ b/rs/docs/theory/computing/0.3-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "theory-unit-computing" +level: 3 +parent: "../0.2-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Theoretical foundation for computing. diff --git a/rs/docs/theory/computing/README.adoc b/rs/docs/theory/computing/README.adoc new file mode 100644 index 0000000..4d0db25 --- /dev/null +++ b/rs/docs/theory/computing/README.adoc @@ -0,0 +1 @@ += Computing Theory diff --git a/rs/docs/theory/formalisms/0.3-AI-MANIFEST.a2ml b/rs/docs/theory/formalisms/0.3-AI-MANIFEST.a2ml new file mode 100644 index 0000000..cdc2baa --- /dev/null +++ b/rs/docs/theory/formalisms/0.3-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "theory-unit-formalisms" +level: 3 +parent: "../0.2-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Theoretical foundation for formalisms. diff --git a/rs/docs/theory/formalisms/README.adoc b/rs/docs/theory/formalisms/README.adoc new file mode 100644 index 0000000..5d064c3 --- /dev/null +++ b/rs/docs/theory/formalisms/README.adoc @@ -0,0 +1 @@ += Formalisms Theory diff --git a/rs/docs/theory/mathematics/0.3-AI-MANIFEST.a2ml b/rs/docs/theory/mathematics/0.3-AI-MANIFEST.a2ml new file mode 100644 index 0000000..677a4da --- /dev/null +++ b/rs/docs/theory/mathematics/0.3-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "theory-unit-mathematics" +level: 3 +parent: "../0.2-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Theoretical foundation for mathematics. diff --git a/rs/docs/theory/mathematics/README.adoc b/rs/docs/theory/mathematics/README.adoc new file mode 100644 index 0000000..356236f --- /dev/null +++ b/rs/docs/theory/mathematics/README.adoc @@ -0,0 +1 @@ += Mathematics Theory diff --git a/rs/docs/theory/ontologies/0.3-AI-MANIFEST.a2ml b/rs/docs/theory/ontologies/0.3-AI-MANIFEST.a2ml new file mode 100644 index 0000000..d888cee --- /dev/null +++ b/rs/docs/theory/ontologies/0.3-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "theory-unit-ontologies" +level: 3 +parent: "../0.2-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Theoretical foundation for ontologies. diff --git a/rs/docs/theory/ontologies/README.adoc b/rs/docs/theory/ontologies/README.adoc new file mode 100644 index 0000000..6d16ecf --- /dev/null +++ b/rs/docs/theory/ontologies/README.adoc @@ -0,0 +1 @@ += Ontologies Theory diff --git a/rs/docs/theory/other/0.3-AI-MANIFEST.a2ml b/rs/docs/theory/other/0.3-AI-MANIFEST.a2ml new file mode 100644 index 0000000..166ed9e --- /dev/null +++ b/rs/docs/theory/other/0.3-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "theory-unit-other" +level: 3 +parent: "../0.2-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Theoretical foundation for other. diff --git a/rs/docs/theory/other/README.adoc b/rs/docs/theory/other/README.adoc new file mode 100644 index 0000000..1861d6d --- /dev/null +++ b/rs/docs/theory/other/README.adoc @@ -0,0 +1 @@ += Other Theory diff --git a/rs/docs/theory/socio-technical/0.3-AI-MANIFEST.a2ml b/rs/docs/theory/socio-technical/0.3-AI-MANIFEST.a2ml new file mode 100644 index 0000000..8919522 --- /dev/null +++ b/rs/docs/theory/socio-technical/0.3-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "theory-unit-socio-technical" +level: 3 +parent: "../0.2-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Theoretical foundation for socio technical. diff --git a/rs/docs/theory/socio-technical/README.adoc b/rs/docs/theory/socio-technical/README.adoc new file mode 100644 index 0000000..9ab4ee0 --- /dev/null +++ b/rs/docs/theory/socio-technical/README.adoc @@ -0,0 +1 @@ += Socio technical Theory diff --git a/rs/docs/whitepapers/0.2-AI-MANIFEST.a2ml b/rs/docs/whitepapers/0.2-AI-MANIFEST.a2ml new file mode 100644 index 0000000..c936101 --- /dev/null +++ b/rs/docs/whitepapers/0.2-AI-MANIFEST.a2ml @@ -0,0 +1,20 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "whitepapers-track" +level: 2 +parent: "../0.1-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Unit for strategic publications and whitepapers. Categorised by target + audience: Academic, Industry, and Outreach. + +canonical_locations: + academic: "academic/" + industry: "industry/" + outreach: "outreach/" + +invariants: + - "Each sub-track MUST have a clear audience definition in its README" diff --git a/rs/docs/whitepapers/README.adoc b/rs/docs/whitepapers/README.adoc new file mode 100644 index 0000000..88e83c5 --- /dev/null +++ b/rs/docs/whitepapers/README.adoc @@ -0,0 +1 @@ += whitepapers Unit diff --git a/rs/docs/whitepapers/academic/.gitkeep b/rs/docs/whitepapers/academic/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/rs/docs/whitepapers/academic/0.3-AI-MANIFEST.a2ml b/rs/docs/whitepapers/academic/0.3-AI-MANIFEST.a2ml new file mode 100644 index 0000000..ceb8a1e --- /dev/null +++ b/rs/docs/whitepapers/academic/0.3-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "academic-unit" +level: 3 +parent: "../0.2-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Academic logic at level 3. diff --git a/rs/docs/whitepapers/academic/README.adoc b/rs/docs/whitepapers/academic/README.adoc new file mode 100644 index 0000000..16c3f45 --- /dev/null +++ b/rs/docs/whitepapers/academic/README.adoc @@ -0,0 +1 @@ += Academic Logic diff --git a/rs/docs/whitepapers/industry/.gitkeep b/rs/docs/whitepapers/industry/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/rs/docs/whitepapers/industry/0.3-AI-MANIFEST.a2ml b/rs/docs/whitepapers/industry/0.3-AI-MANIFEST.a2ml new file mode 100644 index 0000000..20156dd --- /dev/null +++ b/rs/docs/whitepapers/industry/0.3-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "industry-unit" +level: 3 +parent: "../0.2-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Industry logic at level 3. diff --git a/rs/docs/whitepapers/industry/README.adoc b/rs/docs/whitepapers/industry/README.adoc new file mode 100644 index 0000000..7bc7fcd --- /dev/null +++ b/rs/docs/whitepapers/industry/README.adoc @@ -0,0 +1 @@ += Industry Logic diff --git a/rs/docs/whitepapers/outreach/0.3-AI-MANIFEST.a2ml b/rs/docs/whitepapers/outreach/0.3-AI-MANIFEST.a2ml new file mode 100644 index 0000000..ed7e152 --- /dev/null +++ b/rs/docs/whitepapers/outreach/0.3-AI-MANIFEST.a2ml @@ -0,0 +1,16 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "whitepapers-track-outreach" +level: 3 +parent: "../0.2-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Documentation track for outreach, education, and general-audience + engagement. Focuses on accessibility and high-level conceptual clarity. + +invariants: + - "Language MUST be accessible to non-technical audiences" + - "Avoid deep technical jargon without providing clear definitions" diff --git a/rs/docs/whitepapers/outreach/README.adoc b/rs/docs/whitepapers/outreach/README.adoc new file mode 100644 index 0000000..8141463 --- /dev/null +++ b/rs/docs/whitepapers/outreach/README.adoc @@ -0,0 +1,17 @@ += Outreach & Education +:toc: preamble +:icons: font + +This directory contains whitepapers, guides, and presentations tailored for a general audience, including schools, corporate partners, and special interest groups. + +== Target Audiences + +* **Schools & Education:** Introductory material on formal verification and sovereign systems. +* **Corporate:** High-level business value and compliance summaries. +* **Special Interest Groups:** Community-specific impact and ethical use cases. + +== Goals + +* De-mystify high-rigor engineering. +* Promote the adoption of the Rhodium Standard. +* Provide accessible entry points for non-technical stakeholders. diff --git a/rs/docs/wikis/0.2-AI-MANIFEST.a2ml b/rs/docs/wikis/0.2-AI-MANIFEST.a2ml new file mode 100644 index 0000000..f071ca8 --- /dev/null +++ b/rs/docs/wikis/0.2-AI-MANIFEST.a2ml @@ -0,0 +1,15 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "wikis-track" +level: 2 +parent: "../0.1-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Long-form collaborative documentation and project knowledge base. + This directory mirrors the content structure of the project wiki. + +invariants: + - "Primary wiki format MUST be AsciiDoc (.adoc)" diff --git a/rs/docs/wikis/README.adoc b/rs/docs/wikis/README.adoc new file mode 100644 index 0000000..71b60d1 --- /dev/null +++ b/rs/docs/wikis/README.adoc @@ -0,0 +1,15 @@ += Project Wikis +:toc: preamble +:icons: font + +This directory contains the source files for the project wiki. It is intended for long-form documentation, deep-dives, and community-maintained knowledge. + +== Structure + +* **Core Concepts:** Fundamental architectural ideas. +* **Workflows:** Step-by-step guides for contributors. +* **Glossary:** Definitions of project-specific terminology. + +== Wiki Synchronization + +Changes made here should be synchronised with the forge-hosted wiki (GitHub/GitLab) using the project's sync scripts. diff --git a/rs/eclexiaiser.toml b/rs/eclexiaiser.toml new file mode 100644 index 0000000..26a1285 --- /dev/null +++ b/rs/eclexiaiser.toml @@ -0,0 +1,19 @@ +# SPDX-License-Identifier: MPL-2.0 +# eclexiaiser manifest for a2ml-rs + +[project] +name = "a2ml-rs" + +[[functions]] +name = "main" +source = "src/lib.rs" +energy-budget-mj = 10.0 + +[carbon] +provider = "static" +region = "GB" +static-intensity = 200.0 + +[report] +format = "text" +include-recommendations = true diff --git a/rs/examples/0.1-AI-MANIFEST.a2ml b/rs/examples/0.1-AI-MANIFEST.a2ml new file mode 100644 index 0000000..0d69c90 --- /dev/null +++ b/rs/examples/0.1-AI-MANIFEST.a2ml @@ -0,0 +1 @@ +# AI Manifest - Level 1: examples diff --git a/rs/examples/README.adoc b/rs/examples/README.adoc new file mode 100644 index 0000000..b9cdb48 --- /dev/null +++ b/rs/examples/README.adoc @@ -0,0 +1 @@ += examples Pillar diff --git a/rs/examples/SafeDOMExample.res b/rs/examples/SafeDOMExample.res new file mode 100644 index 0000000..e5c9046 --- /dev/null +++ b/rs/examples/SafeDOMExample.res @@ -0,0 +1,109 @@ +// SPDX-License-Identifier: MPL-2.0 +// Example: Using SafeDOM for formally verified DOM mounting + +open SafeDOM + +// Example 1: Basic mounting with error handling +let mountApp = () => { + mountSafe( + "#app", + "

Hello, World!

Mounted safely with proofs.

", + ~onSuccess=el => { + Console.log("✓ App mounted successfully!") + Console.log("Element:", el) + }, + ~onError=err => { + Console.error("✗ Mount failed:", err) + } + ) +} + +// Example 2: Wait for DOM ready before mounting +let mountWhenDOMReady = () => { + mountWhenReady( + "#app", + "

App Title

", + ~onSuccess=_ => Console.log("✓ Mounted after DOM ready"), + ~onError=err => Console.error("✗ Failed:", err) + ) +} + +// Example 3: Batch mounting (atomic - all or nothing) +let mountMultiple = () => { + let specs = [ + {selector: "#header", html: "

Site Title

"}, + {selector: "#nav", html: ""}, + {selector: "#main", html: "

Content here

"}, + {selector: "#footer", html: "
© 2026
"} + ] + + switch mountBatch(specs) { + | Ok(elements) => { + Console.log(`✓ Successfully mounted ${Array.length(elements)} elements`) + elements->Array.forEach(el => Console.log(" -", el)) + } + | Error(err) => { + Console.error("✗ Batch mount failed:", err) + Console.error(" (None were mounted - atomic operation)") + } + } +} + +// Example 4: Explicit validation before mounting +let mountWithValidation = () => { + // Validate selector first + switch ProvenSelector.validate("#my-app") { + | Error(e) => Console.error(`Invalid selector: ${e}`) + | Ok(validSelector) => { + // Validate HTML + switch ProvenHTML.validate("
Content
") { + | Error(e) => Console.error(`Invalid HTML: ${e}`) + | Ok(validHtml) => { + // Now mount with proven safety + switch mount(validSelector, validHtml) { + | Mounted(el) => Console.log("✓ Mounted with validated inputs:", el) + | MountPointNotFound(s) => Console.error(`✗ Element not found: ${s}`) + | InvalidSelector(_) => Console.error("Impossible - already validated") + | InvalidHTML(_) => Console.error("Impossible - already validated") + } + } + } + } +} + +// Example 5: Integration with TEA +module MyApp = { + type model = {message: string} + type msg = NoOp + + let init = () => {message: "Hello from TEA"} + let update = (model, _msg) => model + let view = model => `

${model.message}

` +} + +let mountTEAApp = () => { + let model = MyApp.init() + let html = MyApp.view(model) + + mountWhenReady( + "#tea-app", + html, + ~onSuccess=el => { + Console.log("✓ TEA app mounted") + // Set up event handlers, subscriptions here + }, + ~onError=err => Console.error(`✗ TEA mount failed: ${err}`) + ) +} + +// Entry point +let main = () => { + Console.log("SafeDOM Examples") + Console.log("================\n") + + // Choose which example to run + mountWhenDOMReady() // Run on DOM ready +} + +// Auto-execute when module loads +main() diff --git a/rs/examples/web-project-deno.json b/rs/examples/web-project-deno.json new file mode 100644 index 0000000..028e4f1 --- /dev/null +++ b/rs/examples/web-project-deno.json @@ -0,0 +1,20 @@ +{ + "// NOTE": "Example deno.json for ReScript web projects", + "tasks": { + "build": "deno run -A npm:rescript", + "clean": "deno run -A npm:rescript clean", + "watch": "deno run -A npm:rescript -w", + "serve": "deno run -A jsr:@std/http/file-server .", + "test": "deno test --allow-all" + }, + "imports": { + "rescript": "^12.0.0", + "@rescript/core": "npm:@rescript/core@^1.6.0", + "safe-dom/": "https://raw.githubusercontent.com/{{OWNER}}/rescript-dom-mounter/main/src/", + "proven/": "../proven/bindings/rescript/src/" + }, + "compilerOptions": { + "allowJs": true, + "checkJs": false + } +} diff --git a/rs/features/0.1-AI-MANIFEST.a2ml b/rs/features/0.1-AI-MANIFEST.a2ml new file mode 100644 index 0000000..dc3e4ee --- /dev/null +++ b/rs/features/0.1-AI-MANIFEST.a2ml @@ -0,0 +1,17 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "features-pillar" +level: 1 +parent: "../0-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Optional project features and ecosystem integrations. Provides bootstrap + guides for high-rigor tools (Panic-Attacker, BoJ-Server, SSGs). + +canonical_locations: + panic_attacker: "panic-attacker/" + boj_server: "boj-server/" + ssg: "ssg/" diff --git a/rs/features/README.adoc b/rs/features/README.adoc new file mode 100644 index 0000000..3899280 --- /dev/null +++ b/rs/features/README.adoc @@ -0,0 +1 @@ += Project Features diff --git a/rs/features/boj-server/0.2-AI-MANIFEST.a2ml b/rs/features/boj-server/0.2-AI-MANIFEST.a2ml new file mode 100644 index 0000000..c77798c --- /dev/null +++ b/rs/features/boj-server/0.2-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "feature-unit-boj-server" +level: 2 +parent: "../0.1-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Bootstrap and integration logic for the boj-server ecosystem component. diff --git a/rs/features/boj-server/README.adoc b/rs/features/boj-server/README.adoc new file mode 100644 index 0000000..0039c37 --- /dev/null +++ b/rs/features/boj-server/README.adoc @@ -0,0 +1,14 @@ += BoJ Server Integration +:icons: font + +This unit provides a "starting hand" for integrating with the **BoJ-Server** (Box of Justice) ecosystem — a high-rigor, verified server infrastructure. + +== Integration Options + +* **Core:** Use BoJ-Server as the primary verified backend for this project. +* **Bridge:** Utilize the BoJ-Server IPC bridge for cross-boundary communication. + +== Related Repository + +For the full specification and source, visit: +https://github.com/hyperpolymath/boj-server diff --git a/rs/features/panic-attacker/0.2-AI-MANIFEST.a2ml b/rs/features/panic-attacker/0.2-AI-MANIFEST.a2ml new file mode 100644 index 0000000..e61ad24 --- /dev/null +++ b/rs/features/panic-attacker/0.2-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "feature-unit-panic-attacker" +level: 2 +parent: "../0.1-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Bootstrap and integration logic for the panic-attacker ecosystem component. diff --git a/rs/features/panic-attacker/README.adoc b/rs/features/panic-attacker/README.adoc new file mode 100644 index 0000000..72d56a4 --- /dev/null +++ b/rs/features/panic-attacker/README.adoc @@ -0,0 +1,25 @@ += Panic Attacker Feature +:icons: font + +This unit integrates the **Panic-Attacker** high-rigor stress testing tool into the project lifecycle. + +== Value Proposition + +Panic-Attacker goes beyond unit testing by applying: +* **Static Analysis (Assail):** Detecting logic-based bug signatures. +* **Multi-Axis Dynamic Attacks (Assault):** Stressing CPU, Memory, Disk, and Network boundaries. + +== Usage in this Template + +This template includes a pre-configured maintenance trigger: + +[source,bash] +---- +just maint-assault +---- + +This runs a medium-intensity assault on the project binary and emits a report to `docs/reports/security/`. + +== Related Repository + +https://github.com/hyperpolymath/panic-attacker diff --git a/rs/features/ssg/0.2-AI-MANIFEST.a2ml b/rs/features/ssg/0.2-AI-MANIFEST.a2ml new file mode 100644 index 0000000..121c5ae --- /dev/null +++ b/rs/features/ssg/0.2-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "feature-unit-ssg" +level: 2 +parent: "../0.1-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Bootstrap and integration logic for the ssg ecosystem component. diff --git a/rs/features/ssg/README.adoc b/rs/features/ssg/README.adoc new file mode 100644 index 0000000..e15687b --- /dev/null +++ b/rs/features/ssg/README.adoc @@ -0,0 +1 @@ += Ssg Feature diff --git a/rs/features/ssg/ssg-bootstrap.sh b/rs/features/ssg/ssg-bootstrap.sh new file mode 100755 index 0000000..89c6fa5 --- /dev/null +++ b/rs/features/ssg/ssg-bootstrap.sh @@ -0,0 +1,48 @@ +#!/usr/bin/env bash +# SPDX-License-Identifier: MPL-2.0 +# +# ssg-bootstrap.sh — Universal SSG Initialisation Helper +# +# Provides a starting hand for creating a documentation site or blog +# using hyperpolymath-approved formal or pretty-formal SSGs. + +set -euo pipefail + +echo "═══════════════════════════════════════════════════" +echo " SSG BOOTSTRAP HELPER" +echo "═══════════════════════════════════════════════════" +echo "" +echo "Select an SSG to initialize in this project:" +echo " [1] Casket-SSG (Haskell) — Pretty-formal, high-rigor default" +echo " [2] Ddraig-SSG (Idris2) — Super-formal, dependent-type proofed" +echo " [3] Serum-SSG (Elixir) — Concurrent, robust, BEAM-based" +echo " [4] Zola (Rust) — Fast, standalone, standard" +echo "" + +read -rp "Enter choice [1-4]: " choice + +case "$choice" in + 1) + echo "Selected: Casket-SSG" + echo "Integration: git clone https://github.com/hyperpolymath/casket-ssg docs/site" + ;; + 2) + echo "Selected: Ddraig-SSG" + echo "Integration: git clone https://github.com/hyperpolymath/ddraig-ssg docs/site" + ;; + 3) + echo "Selected: Serum-SSG" + echo "Integration: mix serum.new docs/site" + ;; + 4) + echo "Selected: Zola" + echo "Integration: zola init docs/site" + ;; + *) + echo "Invalid selection. Aborting." + exit 1 + ;; +esac + +echo "" +echo "Note: For more advanced polystack options, visit: https://github.com/hyperpolymath/polystack" diff --git a/rs/generated/idrisiser/a2ml_rs_verified.ipkg b/rs/generated/idrisiser/a2ml_rs_verified.ipkg new file mode 100644 index 0000000..069aaf2 --- /dev/null +++ b/rs/generated/idrisiser/a2ml_rs_verified.ipkg @@ -0,0 +1,8 @@ +-- Auto-generated by idrisiser for project: a2ml-rs +package a2ml_rs_verified + +sourcedir = "idris2" + +modules = A2ml.Verified.document_parser, A2ml.Verified.document_types, A2ml.Verified.round_trip + +opts = "--total" diff --git a/rs/generated/idrisiser/build.sh b/rs/generated/idrisiser/build.sh new file mode 100755 index 0000000..89e2a29 --- /dev/null +++ b/rs/generated/idrisiser/build.sh @@ -0,0 +1,20 @@ +#!/usr/bin/env bash +# SPDX-License-Identifier: MPL-2.0 +# Auto-generated by idrisiser — build script for: a2ml-rs + +set -euo pipefail + +echo "=== idrisiser Build: a2ml-rs ===" + +echo "[1/3] Compiling Idris2 proofs..." +idris2 --build a2ml_rs_verified.ipkg --codegen chez + +echo "[2/3] Compiling Zig FFI bridge..." +zig build-obj -O ReleaseFast zig/a2ml_rs_ffi.zig -femit-bin=a2ml_rs_ffi.o + +echo "[3/3] Linking..." +# Link the Idris2 runtime + Zig FFI into a shared library +# zig build-lib -O ReleaseFast a2ml_rs_ffi.o -o liba2ml_rs_verified + +echo "=== Build complete ===" +echo "Idris2 proofs compiled and verified." diff --git a/rs/generated/idrisiser/idris2/A2ml/Verified/document_parser.idr b/rs/generated/idrisiser/idris2/A2ml/Verified/document_parser.idr new file mode 100644 index 0000000..5b29b21 --- /dev/null +++ b/rs/generated/idrisiser/idris2/A2ml/Verified/document_parser.idr @@ -0,0 +1,250 @@ +-- SPDX-License-Identifier: MPL-2.0 +-- Auto-generated by idrisiser — do not edit manually. +-- Interface: document-parser (type-sig) +-- Source: idrisiser/parser.tsig +-- Regenerate with: idrisiser generate + +||| Formally verified wrapper for interface: document-parser +||| +||| This module provides dependent-type proofs that: +||| - All functions are total (cover all inputs, terminate) +||| - Preconditions are checked before every call +||| - Postconditions hold after every call +||| - Invariants are preserved across all operations + +module A2ml.Verified.document_parser + +import Data.So +import Data.Vect +import Data.Nat + +%default total + +-- ================================================================ +-- Contract Types +-- ================================================================ + +||| Result of calling `parse` +public export +data parseResult : Type where + parseOk : Result Document A2mlError -> parseResult + parseErr : String -> parseResult + +||| Parameters for `parse` +public export +record parseParams where + constructor MkparseParams + arg0 : String + +||| Preconditions for `parse` +public export +parsePre : parseParams -> Bool +parsePre params = + -- Input string is valid UTF-8 + -- Fenced code blocks are terminated before end-of-input + -- Every @directive line has a non-empty name after the @ sigil + -- Every !attest block supplies identity, role, and trust fields + True -- precondition witnesses generated here + +||| Postconditions for `parse` +public export +parsePost : Result Document A2mlError -> Bool +parsePost result = + -- Ok(doc) implies doc.blocks is a well-formed sequence with no internal inconsistency + -- Ok(doc) with any !attest block implies doc.attestations is non-empty + -- Err(_) is returned for every malformed input (no silent data loss) + -- parse returns Ok for the empty string without panicking + True -- postcondition witnesses generated here + +||| Result of calling `parse_file` +public export +data parse_fileResult : Type where + parse_fileOk : Result Document A2mlError -> parse_fileResult + parse_fileErr : String -> parse_fileResult + +||| Parameters for `parse_file` +public export +record parse_fileParams where + constructor Mkparse_fileParams + arg0 : Path + +||| Preconditions for `parse_file` +public export +parse_filePre : parse_fileParams -> Bool +parse_filePre params = + -- Input string is valid UTF-8 + -- Fenced code blocks are terminated before end-of-input + -- Every @directive line has a non-empty name after the @ sigil + -- Every !attest block supplies identity, role, and trust fields + True -- precondition witnesses generated here + +||| Postconditions for `parse_file` +public export +parse_filePost : Result Document A2mlError -> Bool +parse_filePost result = + -- Ok(doc) implies doc.blocks is a well-formed sequence with no internal inconsistency + -- Ok(doc) with any !attest block implies doc.attestations is non-empty + -- Err(_) is returned for every malformed input (no silent data loss) + -- parse returns Ok for the empty string without panicking + True -- postcondition witnesses generated here + +||| Result of calling `parse_inlines` +public export +data parse_inlinesResult : Type where + parse_inlinesOk : List Inline -> parse_inlinesResult + parse_inlinesErr : String -> parse_inlinesResult + +||| Parameters for `parse_inlines` +public export +record parse_inlinesParams where + constructor Mkparse_inlinesParams + arg0 : String + +||| Preconditions for `parse_inlines` +public export +parse_inlinesPre : parse_inlinesParams -> Bool +parse_inlinesPre params = + -- Input string is valid UTF-8 + -- Fenced code blocks are terminated before end-of-input + -- Every @directive line has a non-empty name after the @ sigil + -- Every !attest block supplies identity, role, and trust fields + True -- precondition witnesses generated here + +||| Postconditions for `parse_inlines` +public export +parse_inlinesPost : List Inline -> Bool +parse_inlinesPost result = + -- Ok(doc) implies doc.blocks is a well-formed sequence with no internal inconsistency + -- Ok(doc) with any !attest block implies doc.attestations is non-empty + -- Err(_) is returned for every malformed input (no silent data loss) + -- parse returns Ok for the empty string without panicking + True -- postcondition witnesses generated here + +-- ================================================================ +-- Proof Obligations +-- ================================================================ + +||| Proof that `parse` is total (covers all inputs) +public export +data parseTotal : Type where + IsparseTotal : parseTotal + +||| Proof that preconditions hold for given parameters +public export +data parsePreSatisfied : (params : parseParams) -> Type where + parsePreOk : So (parsePre params) -> parsePreSatisfied params + +||| Proof that postconditions hold for a given result +public export +data parsePostSatisfied : (result : Result Document A2mlError) -> Type where + parsePostOk : So (parsePost result) -> parsePostSatisfied result + +||| Proof that serialise/deserialise round-trips for `parse` results +public export +data parseRoundTrip : Type where + parseRoundTripOk : parseRoundTrip + +||| Proof that `parse_file` is total (covers all inputs) +public export +data parse_fileTotal : Type where + Isparse_fileTotal : parse_fileTotal + +||| Proof that preconditions hold for given parameters +public export +data parse_filePreSatisfied : (params : parse_fileParams) -> Type where + parse_filePreOk : So (parse_filePre params) -> parse_filePreSatisfied params + +||| Proof that postconditions hold for a given result +public export +data parse_filePostSatisfied : (result : Result Document A2mlError) -> Type where + parse_filePostOk : So (parse_filePost result) -> parse_filePostSatisfied result + +||| Proof that serialise/deserialise round-trips for `parse_file` results +public export +data parse_fileRoundTrip : Type where + parse_fileRoundTripOk : parse_fileRoundTrip + +||| Proof that `parse_inlines` is total (covers all inputs) +public export +data parse_inlinesTotal : Type where + Isparse_inlinesTotal : parse_inlinesTotal + +||| Proof that preconditions hold for given parameters +public export +data parse_inlinesPreSatisfied : (params : parse_inlinesParams) -> Type where + parse_inlinesPreOk : So (parse_inlinesPre params) -> parse_inlinesPreSatisfied params + +||| Proof that postconditions hold for a given result +public export +data parse_inlinesPostSatisfied : (result : List Inline) -> Type where + parse_inlinesPostOk : So (parse_inlinesPost result) -> parse_inlinesPostSatisfied result + +||| Proof that serialise/deserialise round-trips for `parse_inlines` results +public export +data parse_inlinesRoundTrip : Type where + parse_inlinesRoundTripOk : parse_inlinesRoundTrip + +-- ================================================================ +-- FFI Declarations (implemented in Zig bridge) +-- ================================================================ + +export +%foreign "C:document_parser_parse, libdocument_parser_verified" +prim__parse : Bits64 -> PrimIO Bits32 + +export +%foreign "C:document_parser_parse_file, libdocument_parser_verified" +prim__parse_file : Bits64 -> PrimIO Bits32 + +export +%foreign "C:document_parser_parse_inlines, libdocument_parser_verified" +prim__parse_inlines : Bits64 -> PrimIO Bits32 + +-- ================================================================ +-- Safe Wrappers (enforce contracts at the type level) +-- ================================================================ + +||| Safe wrapper for `parse` with contract enforcement. +export +parse : (params : parseParams) -> {auto prf : parsePreSatisfied params} -> IO (Either String Result Document A2mlError) +parse params = do + rc <- primIO (prim__parse params.arg0) + if rc == 0 + then pure (Right ()) + else pure (Left "Error in parse") + +||| Safe wrapper for `parse_file` with contract enforcement. +export +parse_file : (params : parse_fileParams) -> {auto prf : parse_filePreSatisfied params} -> IO (Either String Result Document A2mlError) +parse_file params = do + rc <- primIO (prim__parse_file params.arg0) + if rc == 0 + then pure (Right ()) + else pure (Left "Error in parse_file") + +||| Safe wrapper for `parse_inlines` with contract enforcement. +export +parse_inlines : (params : parse_inlinesParams) -> {auto prf : parse_inlinesPreSatisfied params} -> IO (Either String List Inline) +parse_inlines params = do + rc <- primIO (prim__parse_inlines params.arg0) + if rc == 0 + then pure (Right ()) + else pure (Left "Error in parse_inlines") + +-- ================================================================ +-- Verification +-- ================================================================ + +||| Witness that all proof obligations for this interface are met. +public export +data AllProofsComplete : Type where + MkAllProofsComplete : + parseTotal -> + parse_fileTotal -> + parse_inlinesTotal -> + AllProofsComplete + +||| Verification entry point. +export +verify : IO () +verify = putStrLn "All proofs verified." diff --git a/rs/generated/idrisiser/idris2/A2ml/Verified/document_types.idr b/rs/generated/idrisiser/idris2/A2ml/Verified/document_types.idr new file mode 100644 index 0000000..93adbbc --- /dev/null +++ b/rs/generated/idrisiser/idris2/A2ml/Verified/document_types.idr @@ -0,0 +1,241 @@ +-- SPDX-License-Identifier: MPL-2.0 +-- Auto-generated by idrisiser — do not edit manually. +-- Interface: document-types (type-sig) +-- Source: idrisiser/types.tsig +-- Regenerate with: idrisiser generate + +||| Formally verified wrapper for interface: document-types +||| +||| This module provides dependent-type proofs that: +||| - All functions are total (cover all inputs, terminate) +||| - Preconditions are checked before every call +||| - Postconditions hold after every call +||| - Invariants are preserved across all operations + +module A2ml.Verified.document_types + +import Data.So +import Data.Vect +import Data.Nat + +%default total + +-- ================================================================ +-- Contract Types +-- ================================================================ + +||| Result of calling `TrustLevel.from_str` +public export +data TrustLevel.from_strResult : Type where + TrustLevel.from_strOk : Option TrustLevel -> TrustLevel.from_strResult + TrustLevel.from_strErr : String -> TrustLevel.from_strResult + +||| Parameters for `TrustLevel.from_str` +public export +record TrustLevel.from_strParams where + constructor MkTrustLevel.from_strParams + arg0 : String + +||| Preconditions for `TrustLevel.from_str` +public export +TrustLevel.from_strPre : TrustLevel.from_strParams -> Bool +TrustLevel.from_strPre params = + -- TrustLevel.from_str input is a non-empty string + -- Manifest.from_document receives a well-formed Document + True -- precondition witnesses generated here + +||| Postconditions for `TrustLevel.from_str` +public export +TrustLevel.from_strPost : Option TrustLevel -> Bool +TrustLevel.from_strPost result = + -- TrustLevel.from_str returns Some(_) iff input is one of: unverified, automated, reviewed, verified (case-insensitive) + -- TrustLevel.as_str(TrustLevel.from_str(s).unwrap()) == s.to_lowercase() — round-trip + -- Manifest.from_document(doc).version == doc.directives version field if present + True -- postcondition witnesses generated here + +||| Result of calling `TrustLevel.as_str` +public export +data TrustLevel.as_strResult : Type where + TrustLevel.as_strOk : String -> TrustLevel.as_strResult + TrustLevel.as_strErr : String -> TrustLevel.as_strResult + +||| Parameters for `TrustLevel.as_str` +public export +record TrustLevel.as_strParams where + constructor MkTrustLevel.as_strParams + arg0 : TrustLevel + +||| Preconditions for `TrustLevel.as_str` +public export +TrustLevel.as_strPre : TrustLevel.as_strParams -> Bool +TrustLevel.as_strPre params = + -- TrustLevel.from_str input is a non-empty string + -- Manifest.from_document receives a well-formed Document + True -- precondition witnesses generated here + +||| Postconditions for `TrustLevel.as_str` +public export +TrustLevel.as_strPost : String -> Bool +TrustLevel.as_strPost result = + -- TrustLevel.from_str returns Some(_) iff input is one of: unverified, automated, reviewed, verified (case-insensitive) + -- TrustLevel.as_str(TrustLevel.from_str(s).unwrap()) == s.to_lowercase() — round-trip + -- Manifest.from_document(doc).version == doc.directives version field if present + True -- postcondition witnesses generated here + +||| Result of calling `Manifest.from_document` +public export +data Manifest.from_documentResult : Type where + Manifest.from_documentOk : Manifest -> Manifest.from_documentResult + Manifest.from_documentErr : String -> Manifest.from_documentResult + +||| Parameters for `Manifest.from_document` +public export +record Manifest.from_documentParams where + constructor MkManifest.from_documentParams + arg0 : Document + +||| Preconditions for `Manifest.from_document` +public export +Manifest.from_documentPre : Manifest.from_documentParams -> Bool +Manifest.from_documentPre params = + -- TrustLevel.from_str input is a non-empty string + -- Manifest.from_document receives a well-formed Document + True -- precondition witnesses generated here + +||| Postconditions for `Manifest.from_document` +public export +Manifest.from_documentPost : Manifest -> Bool +Manifest.from_documentPost result = + -- TrustLevel.from_str returns Some(_) iff input is one of: unverified, automated, reviewed, verified (case-insensitive) + -- TrustLevel.as_str(TrustLevel.from_str(s).unwrap()) == s.to_lowercase() — round-trip + -- Manifest.from_document(doc).version == doc.directives version field if present + True -- postcondition witnesses generated here + +-- ================================================================ +-- Proof Obligations +-- ================================================================ + +||| Proof that `TrustLevel.from_str` is total (covers all inputs) +public export +data TrustLevel.from_strTotal : Type where + IsTrustLevel.from_strTotal : TrustLevel.from_strTotal + +||| Proof that preconditions hold for given parameters +public export +data TrustLevel.from_strPreSatisfied : (params : TrustLevel.from_strParams) -> Type where + TrustLevel.from_strPreOk : So (TrustLevel.from_strPre params) -> TrustLevel.from_strPreSatisfied params + +||| Proof that postconditions hold for a given result +public export +data TrustLevel.from_strPostSatisfied : (result : Option TrustLevel) -> Type where + TrustLevel.from_strPostOk : So (TrustLevel.from_strPost result) -> TrustLevel.from_strPostSatisfied result + +||| Proof that serialise/deserialise round-trips for `TrustLevel.from_str` results +public export +data TrustLevel.from_strRoundTrip : Type where + TrustLevel.from_strRoundTripOk : TrustLevel.from_strRoundTrip + +||| Proof that `TrustLevel.as_str` is total (covers all inputs) +public export +data TrustLevel.as_strTotal : Type where + IsTrustLevel.as_strTotal : TrustLevel.as_strTotal + +||| Proof that preconditions hold for given parameters +public export +data TrustLevel.as_strPreSatisfied : (params : TrustLevel.as_strParams) -> Type where + TrustLevel.as_strPreOk : So (TrustLevel.as_strPre params) -> TrustLevel.as_strPreSatisfied params + +||| Proof that postconditions hold for a given result +public export +data TrustLevel.as_strPostSatisfied : (result : String) -> Type where + TrustLevel.as_strPostOk : So (TrustLevel.as_strPost result) -> TrustLevel.as_strPostSatisfied result + +||| Proof that serialise/deserialise round-trips for `TrustLevel.as_str` results +public export +data TrustLevel.as_strRoundTrip : Type where + TrustLevel.as_strRoundTripOk : TrustLevel.as_strRoundTrip + +||| Proof that `Manifest.from_document` is total (covers all inputs) +public export +data Manifest.from_documentTotal : Type where + IsManifest.from_documentTotal : Manifest.from_documentTotal + +||| Proof that preconditions hold for given parameters +public export +data Manifest.from_documentPreSatisfied : (params : Manifest.from_documentParams) -> Type where + Manifest.from_documentPreOk : So (Manifest.from_documentPre params) -> Manifest.from_documentPreSatisfied params + +||| Proof that postconditions hold for a given result +public export +data Manifest.from_documentPostSatisfied : (result : Manifest) -> Type where + Manifest.from_documentPostOk : So (Manifest.from_documentPost result) -> Manifest.from_documentPostSatisfied result + +||| Proof that serialise/deserialise round-trips for `Manifest.from_document` results +public export +data Manifest.from_documentRoundTrip : Type where + Manifest.from_documentRoundTripOk : Manifest.from_documentRoundTrip + +-- ================================================================ +-- FFI Declarations (implemented in Zig bridge) +-- ================================================================ + +export +%foreign "C:document_types_TrustLevel.from_str, libdocument_types_verified" +prim__TrustLevel.from_str : Bits64 -> PrimIO Bits32 + +export +%foreign "C:document_types_TrustLevel.as_str, libdocument_types_verified" +prim__TrustLevel.as_str : Bits64 -> PrimIO Bits32 + +export +%foreign "C:document_types_Manifest.from_document, libdocument_types_verified" +prim__Manifest.from_document : Bits64 -> PrimIO Bits32 + +-- ================================================================ +-- Safe Wrappers (enforce contracts at the type level) +-- ================================================================ + +||| Safe wrapper for `TrustLevel.from_str` with contract enforcement. +export +TrustLevel.from_str : (params : TrustLevel.from_strParams) -> {auto prf : TrustLevel.from_strPreSatisfied params} -> IO (Either String Option TrustLevel) +TrustLevel.from_str params = do + rc <- primIO (prim__TrustLevel.from_str params.arg0) + if rc == 0 + then pure (Right ()) + else pure (Left "Error in TrustLevel.from_str") + +||| Safe wrapper for `TrustLevel.as_str` with contract enforcement. +export +TrustLevel.as_str : (params : TrustLevel.as_strParams) -> {auto prf : TrustLevel.as_strPreSatisfied params} -> IO (Either String String) +TrustLevel.as_str params = do + rc <- primIO (prim__TrustLevel.as_str params.arg0) + if rc == 0 + then pure (Right ()) + else pure (Left "Error in TrustLevel.as_str") + +||| Safe wrapper for `Manifest.from_document` with contract enforcement. +export +Manifest.from_document : (params : Manifest.from_documentParams) -> {auto prf : Manifest.from_documentPreSatisfied params} -> IO (Either String Manifest) +Manifest.from_document params = do + rc <- primIO (prim__Manifest.from_document params.arg0) + if rc == 0 + then pure (Right ()) + else pure (Left "Error in Manifest.from_document") + +-- ================================================================ +-- Verification +-- ================================================================ + +||| Witness that all proof obligations for this interface are met. +public export +data AllProofsComplete : Type where + MkAllProofsComplete : + TrustLevel.from_strTotal -> + TrustLevel.as_strTotal -> + Manifest.from_documentTotal -> + AllProofsComplete + +||| Verification entry point. +export +verify : IO () +verify = putStrLn "All proofs verified." diff --git a/rs/generated/idrisiser/idris2/A2ml/Verified/round_trip.idr b/rs/generated/idrisiser/idris2/A2ml/Verified/round_trip.idr new file mode 100644 index 0000000..91e9724 --- /dev/null +++ b/rs/generated/idrisiser/idris2/A2ml/Verified/round_trip.idr @@ -0,0 +1,113 @@ +-- SPDX-License-Identifier: MPL-2.0 +-- Auto-generated by idrisiser — do not edit manually. +-- Interface: round-trip (type-sig) +-- Source: idrisiser/round-trip.tsig +-- Regenerate with: idrisiser generate + +||| Formally verified wrapper for interface: round-trip +||| +||| This module provides dependent-type proofs that: +||| - All functions are total (cover all inputs, terminate) +||| - Preconditions are checked before every call +||| - Postconditions hold after every call +||| - Invariants are preserved across all operations + +module A2ml.Verified.round_trip + +import Data.So +import Data.Vect +import Data.Nat + +%default total + +-- ================================================================ +-- Contract Types +-- ================================================================ + +||| Result of calling `render` +public export +data renderResult : Type where + renderOk : Result String A2mlError -> renderResult + renderErr : String -> renderResult + +||| Parameters for `render` +public export +record renderParams where + constructor MkrenderParams + arg0 : Document + +||| Preconditions for `render` +public export +renderPre : renderParams -> Bool +renderPre params = + -- render receives a Document produced by a successful parse call + True -- precondition witnesses generated here + +||| Postconditions for `render` +public export +renderPost : Result String A2mlError -> Bool +renderPost result = + -- render returns Ok(_) for any Document produced by parse + -- parse(render(doc).unwrap()) produces a semantically equivalent Document + True -- postcondition witnesses generated here + +-- ================================================================ +-- Proof Obligations +-- ================================================================ + +||| Proof that `render` is total (covers all inputs) +public export +data renderTotal : Type where + IsrenderTotal : renderTotal + +||| Proof that preconditions hold for given parameters +public export +data renderPreSatisfied : (params : renderParams) -> Type where + renderPreOk : So (renderPre params) -> renderPreSatisfied params + +||| Proof that postconditions hold for a given result +public export +data renderPostSatisfied : (result : Result String A2mlError) -> Type where + renderPostOk : So (renderPost result) -> renderPostSatisfied result + +||| Proof that serialise/deserialise round-trips for `render` results +public export +data renderRoundTrip : Type where + renderRoundTripOk : renderRoundTrip + +-- ================================================================ +-- FFI Declarations (implemented in Zig bridge) +-- ================================================================ + +export +%foreign "C:round_trip_render, libround_trip_verified" +prim__render : Bits64 -> PrimIO Bits32 + +-- ================================================================ +-- Safe Wrappers (enforce contracts at the type level) +-- ================================================================ + +||| Safe wrapper for `render` with contract enforcement. +export +render : (params : renderParams) -> {auto prf : renderPreSatisfied params} -> IO (Either String Result String A2mlError) +render params = do + rc <- primIO (prim__render params.arg0) + if rc == 0 + then pure (Right ()) + else pure (Left "Error in render") + +-- ================================================================ +-- Verification +-- ================================================================ + +||| Witness that all proof obligations for this interface are met. +public export +data AllProofsComplete : Type where + MkAllProofsComplete : + renderTotal -> + AllProofsComplete + +||| Verification entry point. +export +verify : IO () +verify = putStrLn "All proofs verified." diff --git a/rs/generated/idrisiser/zig/a2ml_rs_ffi.zig b/rs/generated/idrisiser/zig/a2ml_rs_ffi.zig new file mode 100644 index 0000000..3712f55 --- /dev/null +++ b/rs/generated/idrisiser/zig/a2ml_rs_ffi.zig @@ -0,0 +1,113 @@ +// SPDX-License-Identifier: MPL-2.0 +// Auto-generated by idrisiser — do not edit manually. +// Zig FFI bridge for project: a2ml-rs +// Regenerate with: idrisiser generate + +const std = @import("std"); + +// Result codes matching Idris2 ABI +pub const Result = enum(c_int) { + ok = 0, + err = 1, + invalid_param = 2, + out_of_memory = 3, + null_pointer = 4, + proof_failure = 5, +}; + +// ---------------------------------------------------------------- +// Interface: document_parser +// ---------------------------------------------------------------- + +// User's implementation of parse +extern fn document_parser_parse(arg0: [*:0]const u8) callconv(.C) ?*anyopaque; + +// Idris2-facing export for parse +export fn a2ml_rs_parse(arg0: u64) callconv(.C) u32 { + _ = document_parser_parse(arg0); + return 0; // ok +} + +// User's implementation of parse_file +extern fn document_parser_parse_file(arg0: ?*anyopaque) callconv(.C) ?*anyopaque; + +// Idris2-facing export for parse_file +export fn a2ml_rs_parse_file(arg0: u64) callconv(.C) u32 { + _ = document_parser_parse_file(arg0); + return 0; // ok +} + +// User's implementation of parse_inlines +extern fn document_parser_parse_inlines(arg0: [*:0]const u8) callconv(.C) ?*anyopaque; + +// Idris2-facing export for parse_inlines +export fn a2ml_rs_parse_inlines(arg0: u64) callconv(.C) u32 { + _ = document_parser_parse_inlines(arg0); + return 0; // ok +} + +// ---------------------------------------------------------------- +// Interface: document_types +// ---------------------------------------------------------------- + +// User's implementation of TrustLevel.from_str +extern fn document_types_TrustLevel.from_str(arg0: [*:0]const u8) callconv(.C) ?*anyopaque; + +// Idris2-facing export for TrustLevel.from_str +export fn a2ml_rs_TrustLevel.from_str(arg0: u64) callconv(.C) u32 { + _ = document_types_TrustLevel.from_str(arg0); + return 0; // ok +} + +// User's implementation of TrustLevel.as_str +extern fn document_types_TrustLevel.as_str(arg0: ?*anyopaque) callconv(.C) [*:0]const u8; + +// Idris2-facing export for TrustLevel.as_str +export fn a2ml_rs_TrustLevel.as_str(arg0: u64) callconv(.C) u32 { + _ = document_types_TrustLevel.as_str(arg0); + return 0; // ok +} + +// User's implementation of Manifest.from_document +extern fn document_types_Manifest.from_document(arg0: ?*anyopaque) callconv(.C) ?*anyopaque; + +// Idris2-facing export for Manifest.from_document +export fn a2ml_rs_Manifest.from_document(arg0: u64) callconv(.C) u32 { + _ = document_types_Manifest.from_document(arg0); + return 0; // ok +} + +// ---------------------------------------------------------------- +// Interface: round_trip +// ---------------------------------------------------------------- + +// User's implementation of render +extern fn round_trip_render(arg0: ?*anyopaque) callconv(.C) ?*anyopaque; + +// Idris2-facing export for render +export fn a2ml_rs_render(arg0: u64) callconv(.C) u32 { + _ = round_trip_render(arg0); + return 0; // ok +} + +// ---------------------------------------------------------------- +// Lifecycle +// ---------------------------------------------------------------- + +var initialized: bool = false; + +export fn a2ml_rs_verified_init() callconv(.C) c_int { + if (initialized) return 1; + initialized = true; + return 0; +} + +export fn a2ml_rs_verified_shutdown() callconv(.C) c_int { + if (!initialized) return 1; + initialized = false; + return 0; +} + +export fn idrisiser_version() callconv(.C) [*:0]const u8 { + return "0.1.0"; +} diff --git a/rs/guix.scm b/rs/guix.scm new file mode 100644 index 0000000..33b1a9a --- /dev/null +++ b/rs/guix.scm @@ -0,0 +1,71 @@ +;; SPDX-License-Identifier: MPL-2.0 +;; Copyright (c) {{CURRENT_YEAR}} {{AUTHOR}} ({{OWNER}}) <{{AUTHOR_EMAIL}}> +;; +;; Guix package definition for {{PROJECT_NAME}} +;; +;; Usage: +;; guix shell -D -f guix.scm # Enter development shell +;; guix build -f guix.scm # Build package +;; +;; TODO: Replace {{PROJECT_NAME}} and customize inputs for your language/stack. +;; See: https://guix.gnu.org/manual/en/html_node/Defining-Packages.html + +(use-modules (guix packages) + (guix gexp) + (guix git-download) + (guix build-system gnu) + (guix licenses) + (gnu packages base)) + +(package + (name "{{PROJECT_NAME}}") + (version "0.1.0") + (source (local-file "." "source" + #:recursive? #t + #:select? (lambda (file stat) + (not (string-contains file ".git"))))) + (build-system gnu-build-system) + (arguments + '(#:phases + (modify-phases %standard-phases + ;; TODO: Customize build phases for your project + ;; Examples for common stacks: + ;; + ;; Rust: + ;; (replace 'build (lambda _ (invoke "cargo" "build" "--release"))) + ;; (replace 'check (lambda _ (invoke "cargo" "test"))) + ;; + ;; Elixir: + ;; (replace 'build (lambda _ (invoke "mix" "compile"))) + ;; (replace 'check (lambda _ (invoke "mix" "test"))) + ;; + ;; Zig: + ;; (replace 'build (lambda _ (invoke "zig" "build"))) + ;; (replace 'check (lambda _ (invoke "zig" "build" "test"))) + (delete 'configure) + (delete 'build) + (delete 'check) + (replace 'install + (lambda* (#:key outputs #:allow-other-keys) + (let ((out (assoc-ref outputs "out"))) + (mkdir-p (string-append out "/share/doc")) + (copy-file "README.adoc" + (string-append out "/share/doc/README.adoc")))))))) + (native-inputs + (list + ;; TODO: Add build-time dependencies + ;; Examples: + ;; rust (gnu packages rust) + ;; elixir (gnu packages elixir) + ;; zig (gnu packages zig) + )) + (inputs + (list + ;; TODO: Add runtime dependencies + )) + (home-page "https://github.com/{{OWNER}}/{{PROJECT_NAME}}") + (synopsis "{{PROJECT_PURPOSE}}") + (description "RSR-compliant project. See README.adoc for details.") + (license (list + ;; MPL-2.0 extends MPL-2.0 + mpl2.0))) diff --git a/rs/idrisiser.toml b/rs/idrisiser.toml new file mode 100644 index 0000000..aeb3385 --- /dev/null +++ b/rs/idrisiser.toml @@ -0,0 +1,91 @@ +# SPDX-License-Identifier: MPL-2.0 +# idrisiser manifest for a2ml-rs +# +# Generates Idris2 dependent-type wrappers for the A2ML parser and renderer. +# A2ML (Attested Markup Language) is safety-critical: it validates AI agent +# manifests and carries attestation provenance. These wrappers prove that: +# - Parsing is total (never panics on any input) +# - The round-trip invariant holds: render(parse(x)) normalises correctly +# - Validated attestation output satisfies schema invariants +# - TrustLevel ordering is monotone (Unverified < Automated < Reviewed < Verified) + +[project] +name = "a2ml-rs" +module-prefix = "A2ml.Verified" + +# --------------------------------------------------------------------------- +# Interface 1 — core document parser (src/parser.rs) +# --------------------------------------------------------------------------- +[[interfaces]] +name = "document-parser" +source = "idrisiser/parser.tsig" +format = "type-sig" +verify = ["parse", "parse_file", "parse_inlines"] +preconditions = [ + "Input string is valid UTF-8", + "Fenced code blocks are terminated before end-of-input", + "Every @directive line has a non-empty name after the @ sigil", + "Every !attest block supplies identity, role, and trust fields", +] +postconditions = [ + "Ok(doc) implies doc.blocks is a well-formed sequence with no internal inconsistency", + "Ok(doc) with any !attest block implies doc.attestations is non-empty", + "Err(_) is returned for every malformed input (no silent data loss)", + "parse returns Ok for the empty string without panicking", +] +invariants = [ + "parse is total: it never panics on any &str input", + "parse_file delegates to parse after IO, inheriting its totality", + "Heading level is always in the range 1..=6", + "Directive name is always non-empty in the Ok case", + "Attestation trust_level is always a valid TrustLevel variant in the Ok case", +] + +# --------------------------------------------------------------------------- +# Interface 2 — type system (Document, Attestation, TrustLevel) +# --------------------------------------------------------------------------- +[[interfaces]] +name = "document-types" +source = "idrisiser/types.tsig" +format = "type-sig" +verify = ["TrustLevel.from_str", "TrustLevel.as_str", "Manifest.from_document"] +preconditions = [ + "TrustLevel.from_str input is a non-empty string", + "Manifest.from_document receives a well-formed Document", +] +postconditions = [ + "TrustLevel.from_str returns Some(_) iff input is one of: unverified, automated, reviewed, verified (case-insensitive)", + "TrustLevel.as_str(TrustLevel.from_str(s).unwrap()) == s.to_lowercase() — round-trip", + "Manifest.from_document(doc).version == doc.directives version field if present", +] +invariants = [ + "TrustLevel ordering is total and monotone: Unverified < Automated < Reviewed < Verified", + "from_str and as_str form a partial bijection (round-trip for valid strings)", + "Manifest always carries a non-empty directives list when the source doc has directives", +] + +# --------------------------------------------------------------------------- +# Interface 3 — round-trip renderer (src/renderer.rs) +# --------------------------------------------------------------------------- +[[interfaces]] +name = "round-trip" +source = "idrisiser/round-trip.tsig" +format = "type-sig" +verify = ["render"] +preconditions = [ + "render receives a Document produced by a successful parse call", +] +postconditions = [ + "render returns Ok(_) for any Document produced by parse", + "parse(render(doc).unwrap()) produces a semantically equivalent Document", +] +invariants = [ + "render is total on well-formed Documents (no panic path)", + "render(parse(input).unwrap()) is idempotent up to whitespace normalisation", +] + +[proofs] +require-totality = true +round-trip-proofs = true +qtt-tracking = false +search-depth = 100 diff --git a/rs/idrisiser/parser.tsig b/rs/idrisiser/parser.tsig new file mode 100644 index 0000000..751e917 --- /dev/null +++ b/rs/idrisiser/parser.tsig @@ -0,0 +1,7 @@ +-- SPDX-License-Identifier: MPL-2.0 +-- Type signatures for the a2ml-rs parser (src/parser.rs) +-- Format: name : Type (idrisiser type-sig format) + +parse : String -> Result Document A2mlError +parse_file : Path -> Result Document A2mlError +parse_inlines : String -> List Inline diff --git a/rs/idrisiser/round-trip.tsig b/rs/idrisiser/round-trip.tsig new file mode 100644 index 0000000..ffe7d93 --- /dev/null +++ b/rs/idrisiser/round-trip.tsig @@ -0,0 +1,5 @@ +-- SPDX-License-Identifier: MPL-2.0 +-- Type signatures for the a2ml-rs renderer round-trip (src/renderer.rs) +-- Format: name : Type (idrisiser type-sig format) + +render : Document -> Result String A2mlError diff --git a/rs/idrisiser/types.tsig b/rs/idrisiser/types.tsig new file mode 100644 index 0000000..d3296f5 --- /dev/null +++ b/rs/idrisiser/types.tsig @@ -0,0 +1,7 @@ +-- SPDX-License-Identifier: MPL-2.0 +-- Type signatures for the a2ml-rs types (src/types.rs) +-- Format: name : Type (idrisiser type-sig format) + +TrustLevel.from_str : String -> Option TrustLevel +TrustLevel.as_str : TrustLevel -> String +Manifest.from_document : Document -> Manifest diff --git a/rs/k9iser.toml b/rs/k9iser.toml new file mode 100644 index 0000000..f5a7b0b --- /dev/null +++ b/rs/k9iser.toml @@ -0,0 +1,41 @@ +# SPDX-License-Identifier: MPL-2.0 +# Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) +# +# k9iser manifest for a2ml-rs +# A2ML manifest library for Rust + +[project] +name = "a2ml-rs" +safety_tier = "hunt" + +[[source]] +path = "Cargo.toml" +type = "cargo" +output = "generated/k9iser/cargo-manifest.k9" + +[[source]] +path = "Justfile" +type = "justfile" +output = "generated/k9iser/justfile-recipes.k9" + +[[source]] +path = "Containerfile" +type = "containerfile" +output = "generated/k9iser/container-build.k9" + +[[source]] +path = ".github/workflows/hypatia-scan.yml" +type = "workflow" +output = "generated/k9iser/ci-security.k9" + +[[constraint]] +rule = "build.dependencies has no banned_packages" +severity = "error" + +[[constraint]] +rule = "container.base_image uses chainguard or distroless" +severity = "warn" + +[[constraint]] +rule = "workflows includes hypatia-scan" +severity = "error" diff --git a/rs/llm-warmup-dev.md b/rs/llm-warmup-dev.md new file mode 100644 index 0000000..887acf4 --- /dev/null +++ b/rs/llm-warmup-dev.md @@ -0,0 +1,16 @@ +# LLM Warmup — a2ml-rs (Developer) + +## What is a2ml-rs? +See README.adoc for overview. + +## Key Commands +- `just setup` — set up development environment +- `just build` — build the project +- `just test` — run tests +- `just doctor` — diagnose issues +- `just heal` — attempt auto-repair + +## Quick Context +- License: MPL-2.0 +- Part of hyperpolymath ecosystem +- See EXPLAINME.adoc for architecture diff --git a/rs/llm-warmup-user.md b/rs/llm-warmup-user.md new file mode 100644 index 0000000..f79c345 --- /dev/null +++ b/rs/llm-warmup-user.md @@ -0,0 +1,16 @@ +# LLM Warmup — a2ml-rs (User) + +## What is a2ml-rs? +See README.adoc for overview. + +## Key Commands +- `just setup` — set up development environment +- `just build` — build the project +- `just test` — run tests +- `just doctor` — diagnose issues +- `just heal` — attempt auto-repair + +## Quick Context +- License: MPL-2.0 +- Part of hyperpolymath ecosystem +- See EXPLAINME.adoc for architecture diff --git a/rs/mise.toml b/rs/mise.toml new file mode 100644 index 0000000..6dd983f --- /dev/null +++ b/rs/mise.toml @@ -0,0 +1,57 @@ +[tools] +# Language runtimes +node = "latest" +python = "latest" +rust = "latest" +go = "latest" +zig = "latest" +java = "latest" +bun = "latest" +denojs = "latest" + +# Package managers +npm = "latest" +yarn = "latest" +pnpm = "latest" +pip = "latest" +cargo = "latest" +go-task = "latest" + +# Formatting & Linting +gofmt = "latest" +black = "latest" +isort = "latest" +ruff = "latest" +prettier = "latest" +shfmt = "latest" +stylua = "latest" + +# Build tools +cmake = "latest" +make = "latest" +ninja = "latest" + +# Shell tools +git = "latest" +gnu-sed = "latest" +gnu-tar = "latest" +gnu-grep = "latest" + +# Testing +vitest = "latest" +pytest = "latest" +jest = "latest" + +[env] +# Common environment variables +NODE_ENV = "development" +PYTHONDONTWRITEBYTECODE = "1" +PYTHONUNBUFFERED = "1" + +# Task runner alias +[alias] +task = "go-task" +build = "cargo build --release || npm run build || go build" +test = "cargo test || npm test || go test ./..." +lint = "ruff check . || prettier --check . || black --check ." +fmt = "ruff format . || prettier --write . || black ." diff --git a/rs/selur-compose.toml b/rs/selur-compose.toml new file mode 100644 index 0000000..61d90df --- /dev/null +++ b/rs/selur-compose.toml @@ -0,0 +1,17 @@ +# SPDX-License-Identifier: MPL-2.0 +# Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) +# +# Stapeln service definition for a2ml-rs +# +# Usage: +# podman-compose -f selur-compose.toml up -d +# just stack-up + +[project] +name = "a2ml-rs" + +[services.app] +build = { context = ".", dockerfile = "Containerfile" } +restart = "unless-stopped" +networks = ["default"] +healthcheck = { test = "exit 0", interval = "30s", timeout = "5s", retries = 3 } diff --git a/rs/setup.sh b/rs/setup.sh new file mode 100755 index 0000000..735490d --- /dev/null +++ b/rs/setup.sh @@ -0,0 +1,64 @@ +#!/usr/bin/env bash +# SPDX-License-Identifier: MPL-2.0 +# Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) +# +# A2Ml Rs — Universal Setup Script +# Detects platform and shell, installs just, then hands off to Justfile. + +set -euo pipefail + +echo "═══════════════════════════════════════════════════" +echo " A2Ml Rs — Setup" +echo "═══════════════════════════════════════════════════" +echo "" + +# Platform detection +OS="$(uname -s)" +ARCH="$(uname -m)" +echo "Platform: $OS $ARCH" + +# Shell detection +CURRENT_SHELL="$(basename "$SHELL" 2>/dev/null || echo "unknown")" +echo "Shell: $CURRENT_SHELL" +echo "" + +# Check for just +if ! command -v just >/dev/null 2>&1; then + echo "just (command runner) is required but not installed." + echo "" + case "$OS" in + Linux) + if command -v cargo >/dev/null 2>&1; then + echo "Installing just via cargo..." + cargo install just + elif command -v brew >/dev/null 2>&1; then + echo "Installing just via Homebrew..." + brew install just + else + echo "Install just from: https://just.systems/man/en/installation.html" + exit 1 + fi + ;; + Darwin) + if command -v brew >/dev/null 2>&1; then + echo "Installing just via Homebrew..." + brew install just + else + echo "Install Homebrew first: https://brew.sh" + echo "Then: brew install just" + exit 1 + fi + ;; + *) + echo "Install just from: https://just.systems/man/en/installation.html" + exit 1 + ;; + esac + echo "" +fi + +echo "Running diagnostics..." +just doctor + +echo "" +echo "Setup complete. Run 'just help-me' for common workflows." diff --git a/rs/src/error.rs b/rs/src/error.rs new file mode 100644 index 0000000..fd95827 --- /dev/null +++ b/rs/src/error.rs @@ -0,0 +1,77 @@ +// SPDX-License-Identifier: MPL-2.0 +// (MPL-2.0 preferred; MPL-2.0 required for crates.io) + +//! Error types for A2ML parsing and rendering. +//! +//! Provides structured error reporting with line/column information +//! for parse failures, and I/O error wrapping for file operations. + +use thiserror::Error; + +/// Errors that can occur during A2ML parsing, rendering, or file I/O. +#[derive(Error, Debug)] +pub enum A2mlError { + /// A syntax or structural error encountered during parsing. + #[error("parse error at line {line}, column {column}: {message}")] + ParseError { + /// The 1-based line number where the error was detected. + line: usize, + /// The 1-based column number where the error was detected. + column: usize, + /// A human-readable description of the parse failure. + message: String, + }, + + /// An unexpected or unrecognised directive was encountered. + #[error("unknown directive: {0}")] + UnknownDirective(String), + + /// An I/O error occurred while reading or writing a file. + #[error("I/O error: {0}")] + Io(#[from] std::io::Error), + + /// A rendering error occurred while producing A2ML output. + #[error("render error: {0}")] + RenderError(String), +} + +/// Convenience alias for results that may produce an [`A2mlError`]. +pub type Result = std::result::Result; + +impl A2mlError { + /// Create a new parse error at the given location. + /// + /// # Arguments + /// + /// * `line` - The 1-based line number. + /// * `column` - The 1-based column number. + /// * `message` - A description of what went wrong. + pub fn parse(line: usize, column: usize, message: impl Into) -> Self { + Self::ParseError { + line, + column, + message: message.into(), + } + } +} + +// Display is automatically derived by thiserror, but we implement +// a source-location formatter for convenient diagnostics. +impl A2mlError { + /// Format the error as a diagnostic string suitable for terminal output. + /// + /// For parse errors this includes the file location; for other variants + /// it delegates to the standard `Display` implementation. + pub fn diagnostic(&self) -> String { + match self { + Self::ParseError { + line, + column, + message, + } => { + format!("error[A2ML]: {}:{}: {}", line, column, message) + } + other => format!("error[A2ML]: {}", other), + } + } +} diff --git a/rs/src/lib.rs b/rs/src/lib.rs new file mode 100644 index 0000000..b485893 --- /dev/null +++ b/rs/src/lib.rs @@ -0,0 +1,38 @@ +#![forbid(unsafe_code)] +// SPDX-License-Identifier: MPL-2.0 +// (MPL-2.0 preferred; MPL-2.0 required for crates.io) + +//! # a2ml +//! +//! Parser and renderer for **A2ML** (Attested Markup Language). +//! +//! A2ML is a lightweight markup format designed for AI-agent communication +//! that carries built-in attestation metadata, enabling provenance tracking +//! and trust-level annotations on document content. +//! +//! ## Quick start +//! +//! ``` +//! use a2ml::parser::parse; +//! use a2ml::renderer::render; +//! +//! let input = "# Hello\n\n@version 1.0\n\nA paragraph."; +//! let doc = parse(input).unwrap(); +//! let output = render(&doc).unwrap(); +//! ``` +//! +//! ## Modules +//! +//! - [`types`] — Core data structures (`Document`, `Block`, `Inline`, etc.) +//! - [`parser`] — Parse A2ML text into a `Document` +//! - [`renderer`] — Render a `Document` back to A2ML text +//! - [`error`] — Error types + +pub mod error; +pub mod parser; +pub mod renderer; +pub mod types; + +// Re-export the most commonly used items at the crate root for convenience. +pub use error::A2mlError; +pub use types::{Attestation, Block, Directive, Document, Inline, Manifest, TrustLevel}; diff --git a/rs/src/parser.rs b/rs/src/parser.rs new file mode 100644 index 0000000..d564f08 --- /dev/null +++ b/rs/src/parser.rs @@ -0,0 +1,561 @@ +// SPDX-License-Identifier: MPL-2.0 +// (MPL-2.0 preferred; MPL-2.0 required for crates.io) + +//! Line-by-line parser for A2ML documents. +//! +//! The parser processes input one line at a time, accumulating blocks and +//! inline content. It recognises headings, directives (`@`-prefixed), +//! attestation blocks (`!attest`), fenced code blocks, block quotes, +//! thematic breaks, and paragraphs. + +use std::path::Path; + +use crate::error::{A2mlError, Result}; +use crate::types::*; + +// --------------------------------------------------------------------------- +// Public API +// --------------------------------------------------------------------------- + +/// Parse an A2ML document from a string. +/// +/// # Errors +/// +/// Returns [`A2mlError::ParseError`] if the input contains malformed +/// directives, attestation blocks, or unclosed fenced code blocks. +/// +/// # Examples +/// +/// ``` +/// use a2ml::parser::parse; +/// +/// let doc = parse("# Hello\n\nA paragraph.").unwrap(); +/// assert_eq!(doc.title.as_deref(), Some("Hello")); +/// assert_eq!(doc.blocks.len(), 2); +/// ``` +pub fn parse(input: &str) -> Result { + let mut state = ParserState::new(); + let lines: Vec<&str> = input.lines().collect(); + + let mut i = 0; + while i < lines.len() { + let line = lines[i]; + let line_num = i + 1; // 1-based + + // ----- fenced code block ----- + if state.in_code_block { + if line.trim_start().starts_with("```") || line.trim_start().starts_with("~~~") { + state.flush_code_block(); + } else { + state.code_buf.push_str(line); + state.code_buf.push('\n'); + } + i += 1; + continue; + } + + let trimmed = line.trim(); + + // blank line => flush current paragraph + if trimmed.is_empty() { + state.flush_paragraph(); + i += 1; + continue; + } + + // fenced code block start + if trimmed.starts_with("```") || trimmed.starts_with("~~~") { + state.flush_paragraph(); + let lang = trimmed.trim_start_matches('`').trim_start_matches('~').trim(); + state.code_lang = if lang.is_empty() { + None + } else { + Some(lang.to_string()) + }; + state.in_code_block = true; + state.code_buf.clear(); + i += 1; + continue; + } + + // thematic break (---, ***, ___) + if is_thematic_break(trimmed) { + state.flush_paragraph(); + state.blocks.push(Block::ThematicBreak); + i += 1; + continue; + } + + // heading + if trimmed.starts_with('#') { + state.flush_paragraph(); + let (level, text) = parse_heading(trimmed); + let inlines = parse_inlines(text); + + // Capture the first H1 as the document title. + if level == 1 && state.title.is_none() { + state.title = Some(text.to_string()); + } + + state.blocks.push(Block::Heading { + level, + content: inlines, + }); + i += 1; + continue; + } + + // directive (@name value) + if trimmed.starts_with('@') { + state.flush_paragraph(); + let directive = parse_directive(trimmed, line_num)?; + state.directives.push(directive.clone()); + state.blocks.push(Block::Directive(directive)); + i += 1; + continue; + } + + // attestation (!attest ...) + if trimmed.starts_with("!attest") { + state.flush_paragraph(); + let attestation = parse_attestation(trimmed, line_num)?; + state.attestations.push(attestation.clone()); + state.blocks.push(Block::Attestation(attestation)); + i += 1; + continue; + } + + // block quote (> ...) + if trimmed.starts_with('>') { + state.flush_paragraph(); + let quote_text = trimmed[1..].trim_start(); + let inner_doc = parse(quote_text)?; + state + .blocks + .push(Block::BlockQuote(inner_doc.blocks)); + i += 1; + continue; + } + + // list item (- or * or 1.) + if is_list_start(trimmed) { + state.flush_paragraph(); + let (ordered, item_text) = parse_list_marker(trimmed); + let item_inlines = parse_inlines(item_text); + let item_block = vec![Block::Paragraph(item_inlines)]; + + // Try to coalesce with a preceding list of the same type. + if let Some(Block::List { + ordered: prev_ordered, + items, + }) = state.blocks.last_mut() + { + if *prev_ordered == ordered { + items.push(item_block); + i += 1; + continue; + } + } + + state.blocks.push(Block::List { + ordered, + items: vec![item_block], + }); + i += 1; + continue; + } + + // default: accumulate paragraph text + state.para_buf.push_str(trimmed); + state.para_buf.push(' '); + i += 1; + } + + // Flush any remaining content. + if state.in_code_block { + return Err(A2mlError::parse( + lines.len(), + 1, + "unterminated fenced code block", + )); + } + state.flush_paragraph(); + + Ok(Document { + title: state.title, + directives: state.directives, + blocks: state.blocks, + attestations: state.attestations, + }) +} + +/// Parse an A2ML document from a file on disk. +/// +/// # Errors +/// +/// Returns [`A2mlError::Io`] if the file cannot be read, or a parse error +/// if the content is malformed. +pub fn parse_file(path: impl AsRef) -> Result { + let content = std::fs::read_to_string(path)?; + parse(&content) +} + +// --------------------------------------------------------------------------- +// Internal parser state +// --------------------------------------------------------------------------- + +/// Accumulator for the line-by-line parser. +struct ParserState { + title: Option, + directives: Vec, + attestations: Vec, + blocks: Vec, + para_buf: String, + in_code_block: bool, + code_lang: Option, + code_buf: String, +} + +impl ParserState { + fn new() -> Self { + Self { + title: None, + directives: Vec::new(), + attestations: Vec::new(), + blocks: Vec::new(), + para_buf: String::new(), + in_code_block: false, + code_lang: None, + code_buf: String::new(), + } + } + + /// Flush accumulated paragraph text into a `Block::Paragraph`. + fn flush_paragraph(&mut self) { + let text = self.para_buf.trim().to_string(); + if !text.is_empty() { + let inlines = parse_inlines(&text); + self.blocks.push(Block::Paragraph(inlines)); + } + self.para_buf.clear(); + } + + /// Flush accumulated code block text into a `Block::CodeBlock`. + fn flush_code_block(&mut self) { + // Remove trailing newline if present. + if self.code_buf.ends_with('\n') { + self.code_buf.pop(); + } + self.blocks.push(Block::CodeBlock { + language: self.code_lang.take(), + content: std::mem::take(&mut self.code_buf), + }); + self.in_code_block = false; + } +} + +// --------------------------------------------------------------------------- +// Inline parser +// --------------------------------------------------------------------------- + +/// Parse a string into a sequence of inline elements. +/// +/// Recognises `**bold**`, `*italic*`, `` `code` ``, and `[text](url)` links. +fn parse_inlines(input: &str) -> Vec { + let mut result = Vec::new(); + let chars: Vec = input.chars().collect(); + let mut i = 0; + let mut text_buf = String::new(); + + while i < chars.len() { + // Inline code: `...` + if chars[i] == '`' { + if !text_buf.is_empty() { + result.push(Inline::Text(std::mem::take(&mut text_buf))); + } + i += 1; + let mut code = String::new(); + while i < chars.len() && chars[i] != '`' { + code.push(chars[i]); + i += 1; + } + if i < chars.len() { + i += 1; // skip closing ` + } + result.push(Inline::Code(code)); + continue; + } + + // Bold: **...** + if i + 1 < chars.len() && chars[i] == '*' && chars[i + 1] == '*' { + if !text_buf.is_empty() { + result.push(Inline::Text(std::mem::take(&mut text_buf))); + } + i += 2; + let mut inner = String::new(); + while i + 1 < chars.len() && !(chars[i] == '*' && chars[i + 1] == '*') { + inner.push(chars[i]); + i += 1; + } + if i + 1 < chars.len() { + i += 2; // skip closing ** + } + result.push(Inline::Strong(parse_inlines(&inner))); + continue; + } + + // Emphasis: *...* + if chars[i] == '*' { + if !text_buf.is_empty() { + result.push(Inline::Text(std::mem::take(&mut text_buf))); + } + i += 1; + let mut inner = String::new(); + while i < chars.len() && chars[i] != '*' { + inner.push(chars[i]); + i += 1; + } + if i < chars.len() { + i += 1; // skip closing * + } + result.push(Inline::Emphasis(parse_inlines(&inner))); + continue; + } + + // Link: [text](url) + if chars[i] == '[' { + if !text_buf.is_empty() { + result.push(Inline::Text(std::mem::take(&mut text_buf))); + } + i += 1; + let mut link_text = String::new(); + while i < chars.len() && chars[i] != ']' { + link_text.push(chars[i]); + i += 1; + } + if i < chars.len() { + i += 1; // skip ] + } + if i < chars.len() && chars[i] == '(' { + i += 1; + let mut url = String::new(); + while i < chars.len() && chars[i] != ')' { + url.push(chars[i]); + i += 1; + } + if i < chars.len() { + i += 1; // skip ) + } + result.push(Inline::Link { + content: parse_inlines(&link_text), + url, + }); + } else { + // Not a valid link — emit as text. + text_buf.push('['); + text_buf.push_str(&link_text); + text_buf.push(']'); + } + continue; + } + + text_buf.push(chars[i]); + i += 1; + } + + if !text_buf.is_empty() { + result.push(Inline::Text(text_buf)); + } + result +} + +// --------------------------------------------------------------------------- +// Line-level helpers +// --------------------------------------------------------------------------- + +/// Parse a heading line (e.g. `## Foo`) into its level and text content. +fn parse_heading(line: &str) -> (u8, &str) { + let level = line.chars().take_while(|&c| c == '#').count() as u8; + let text = line[level as usize..].trim(); + (level, text) +} + +/// Parse a directive line (e.g. `@version 1.0`) into a [`Directive`]. +fn parse_directive(line: &str, line_num: usize) -> Result { + let without_at = line[1..].trim(); + let (name, value) = match without_at.split_once(char::is_whitespace) { + Some((n, v)) => (n.trim(), v.trim()), + None => (without_at, ""), + }; + + if name.is_empty() { + return Err(A2mlError::parse(line_num, 1, "empty directive name")); + } + + Ok(Directive::new(name, value)) +} + +/// Parse an attestation line (e.g. `!attest identity=Alice role=author trust=reviewed`). +fn parse_attestation(line: &str, line_num: usize) -> Result { + let after_keyword = line.strip_prefix("!attest").unwrap_or(line).trim(); + let mut identity = None; + let mut role = None; + let mut trust_level = None; + let mut timestamp = None; + let mut note = None; + + for token in after_keyword.split_whitespace() { + if let Some((key, val)) = token.split_once('=') { + match key { + "identity" => identity = Some(val.to_string()), + "role" => role = Some(val.to_string()), + "trust" => { + trust_level = TrustLevel::from_str(val); + if trust_level.is_none() { + return Err(A2mlError::parse( + line_num, + 1, + format!("unknown trust level: {}", val), + )); + } + } + "timestamp" | "ts" => timestamp = Some(val.to_string()), + "note" => note = Some(val.to_string()), + _ => { + // Ignore unknown attestation keys for forward compatibility. + } + } + } + } + + let identity = identity.ok_or_else(|| { + A2mlError::parse(line_num, 1, "attestation missing required 'identity' field") + })?; + let role = role.ok_or_else(|| { + A2mlError::parse(line_num, 1, "attestation missing required 'role' field") + })?; + let trust_level = trust_level.ok_or_else(|| { + A2mlError::parse(line_num, 1, "attestation missing required 'trust' field") + })?; + + let mut att = Attestation::new(identity, role, trust_level); + att.timestamp = timestamp; + att.note = note; + Ok(att) +} + +/// Check whether a line is a thematic break (`---`, `***`, `___`). +fn is_thematic_break(line: &str) -> bool { + let trimmed = line.trim(); + if trimmed.len() < 3 { + return false; + } + let first = trimmed.chars().next() + .expect("trimmed.len() >= 3 was guarded immediately above, so chars().next() is always Some"); + (first == '-' || first == '*' || first == '_') && trimmed.chars().all(|c| c == first) +} + +/// Check whether a line starts a list item. +fn is_list_start(line: &str) -> bool { + line.starts_with("- ") + || line.starts_with("* ") + || (line.len() >= 3 + && line.as_bytes()[0].is_ascii_digit() + && (line.contains(". ") || line.contains(") "))) +} + +/// Parse the list marker from a line, returning (ordered, item_text). +fn parse_list_marker(line: &str) -> (bool, &str) { + if line.starts_with("- ") || line.starts_with("* ") { + (false, &line[2..]) + } else if let Some(pos) = line.find(". ") { + let prefix = &line[..pos]; + if prefix.chars().all(|c| c.is_ascii_digit()) { + (true, &line[pos + 2..]) + } else { + (false, line) + } + } else if let Some(pos) = line.find(") ") { + let prefix = &line[..pos]; + if prefix.chars().all(|c| c.is_ascii_digit()) { + (true, &line[pos + 2..]) + } else { + (false, line) + } + } else { + (false, line) + } +} + +// --------------------------------------------------------------------------- +// Tests +// --------------------------------------------------------------------------- + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn parse_empty_document() { + let doc = parse("").unwrap(); + assert!(doc.title.is_none()); + assert!(doc.blocks.is_empty()); + } + + #[test] + fn parse_heading_and_paragraph() { + let doc = parse("# Title\n\nSome text here.").unwrap(); + assert_eq!(doc.title.as_deref(), Some("Title")); + assert_eq!(doc.blocks.len(), 2); + } + + #[test] + fn parse_directive() { + let doc = parse("@version 1.0").unwrap(); + assert_eq!(doc.directives.len(), 1); + assert_eq!(doc.directives[0].name, "version"); + assert_eq!(doc.directives[0].value, "1.0"); + } + + #[test] + fn parse_attestation_block() { + let input = "!attest identity=Alice role=author trust=reviewed"; + let doc = parse(input).unwrap(); + assert_eq!(doc.attestations.len(), 1); + assert_eq!(doc.attestations[0].identity, "Alice"); + assert_eq!(doc.attestations[0].trust_level, TrustLevel::Reviewed); + } + + #[test] + fn parse_code_block() { + let input = "```rust\nfn main() {}\n```"; + let doc = parse(input).unwrap(); + assert_eq!(doc.blocks.len(), 1); + if let Block::CodeBlock { language, content } = &doc.blocks[0] { + assert_eq!(language.as_deref(), Some("rust")); + assert_eq!(content, "fn main() {}"); + } else { + panic!("expected CodeBlock"); + } + } + + #[test] + fn unterminated_code_block_errors() { + let input = "```\nsome code"; + assert!(parse(input).is_err()); + } + + #[test] + fn parse_thematic_break() { + let doc = parse("---").unwrap(); + assert_eq!(doc.blocks.len(), 1); + assert_eq!(doc.blocks[0], Block::ThematicBreak); + } + + #[test] + fn parse_inline_formatting() { + let inlines = parse_inlines("hello **bold** and *italic* and `code`"); + // Should contain: Text, Strong, Text, Emphasis, Text, Code + assert!(inlines.len() >= 5); + } +} diff --git a/rs/src/renderer.rs b/rs/src/renderer.rs new file mode 100644 index 0000000..e0dd21c --- /dev/null +++ b/rs/src/renderer.rs @@ -0,0 +1,269 @@ +// SPDX-License-Identifier: MPL-2.0 +// (MPL-2.0 preferred; MPL-2.0 required for crates.io) + +//! Renderer that serialises A2ML data types back to A2ML text format. +//! +//! The [`render`] function takes a [`Document`] and produces a string in the +//! canonical A2ML text representation, suitable for writing to a `.a2ml` file. + +use crate::error::Result; +use crate::types::*; + +/// Render a [`Document`] to its canonical A2ML text representation. +/// +/// # Errors +/// +/// Returns [`A2mlError::RenderError`] if any element cannot be serialised +/// (currently infallible, but the signature allows future extension). +/// +/// # Examples +/// +/// ``` +/// use a2ml::types::{Document, Block, Inline}; +/// use a2ml::renderer::render; +/// +/// let mut doc = Document::new(); +/// doc.blocks.push(Block::Heading { +/// level: 1, +/// content: vec![Inline::Text("Hello".into())], +/// }); +/// let output = render(&doc).unwrap(); +/// assert!(output.contains("# Hello")); +/// ``` +pub fn render(doc: &Document) -> Result { + let mut out = String::new(); + + // Render top-level directives first. + for directive in &doc.directives { + render_directive(directive, &mut out); + out.push('\n'); + } + + // Separate directives from body with a blank line if both are present. + if !doc.directives.is_empty() && !doc.blocks.is_empty() { + out.push('\n'); + } + + // Render body blocks. + let block_count = doc.blocks.len(); + for (i, block) in doc.blocks.iter().enumerate() { + render_block(block, &mut out); + // Add a blank line between blocks (but not after the last). + if i + 1 < block_count { + out.push('\n'); + } + } + + // Render trailing attestations that are not already inline. + if !doc.attestations.is_empty() { + if !out.is_empty() && !out.ends_with("\n\n") { + out.push('\n'); + } + for att in &doc.attestations { + render_attestation(att, &mut out); + out.push('\n'); + } + } + + Ok(out) +} + +// --------------------------------------------------------------------------- +// Block rendering +// --------------------------------------------------------------------------- + +/// Render a single block element to the output buffer. +fn render_block(block: &Block, out: &mut String) { + match block { + Block::Heading { level, content } => { + for _ in 0..*level { + out.push('#'); + } + out.push(' '); + render_inlines(content, out); + out.push('\n'); + } + + Block::Paragraph(inlines) => { + render_inlines(inlines, out); + out.push('\n'); + } + + Block::CodeBlock { language, content } => { + out.push_str("```"); + if let Some(lang) = language { + out.push_str(lang); + } + out.push('\n'); + out.push_str(content); + out.push_str("\n```\n"); + } + + Block::Directive(d) => { + render_directive(d, out); + out.push('\n'); + } + + Block::Attestation(a) => { + render_attestation(a, out); + out.push('\n'); + } + + Block::ThematicBreak => { + out.push_str("---\n"); + } + + Block::BlockQuote(inner) => { + for inner_block in inner { + out.push_str("> "); + let mut buf = String::new(); + render_block(inner_block, &mut buf); + // Indent continuation lines of multi-line blocks. + for (i, line) in buf.lines().enumerate() { + if i > 0 { + out.push_str("> "); + } + out.push_str(line); + out.push('\n'); + } + } + } + + Block::List { ordered, items } => { + for (idx, item) in items.iter().enumerate() { + if *ordered { + out.push_str(&format!("{}. ", idx + 1)); + } else { + out.push_str("- "); + } + for (j, block) in item.iter().enumerate() { + let mut buf = String::new(); + render_block(block, &mut buf); + if j == 0 { + // First block shares the line with the marker. + out.push_str(buf.trim_end()); + out.push('\n'); + } else { + // Subsequent blocks are indented. + for line in buf.lines() { + out.push_str(" "); + out.push_str(line); + out.push('\n'); + } + } + } + } + } + } +} + +// --------------------------------------------------------------------------- +// Inline rendering +// --------------------------------------------------------------------------- + +/// Render a sequence of inline elements to the output buffer. +fn render_inlines(inlines: &[Inline], out: &mut String) { + for inline in inlines { + match inline { + Inline::Text(t) => out.push_str(t), + Inline::Emphasis(inner) => { + out.push('*'); + render_inlines(inner, out); + out.push('*'); + } + Inline::Strong(inner) => { + out.push_str("**"); + render_inlines(inner, out); + out.push_str("**"); + } + Inline::Code(c) => { + out.push('`'); + out.push_str(c); + out.push('`'); + } + Inline::Link { content, url } => { + out.push('['); + render_inlines(content, out); + out.push_str("]("); + out.push_str(url); + out.push(')'); + } + } + } +} + +// --------------------------------------------------------------------------- +// Directive and attestation rendering +// --------------------------------------------------------------------------- + +/// Render a directive to the output buffer (without trailing newline). +fn render_directive(d: &Directive, out: &mut String) { + out.push('@'); + out.push_str(&d.name); + if !d.value.is_empty() { + out.push(' '); + out.push_str(&d.value); + } + for (k, v) in &d.attributes { + out.push(' '); + out.push_str(k); + out.push('='); + out.push_str(v); + } +} + +/// Render an attestation to the output buffer (without trailing newline). +fn render_attestation(a: &Attestation, out: &mut String) { + out.push_str("!attest"); + out.push_str(&format!(" identity={}", a.identity)); + out.push_str(&format!(" role={}", a.role)); + out.push_str(&format!(" trust={}", a.trust_level)); + if let Some(ts) = &a.timestamp { + out.push_str(&format!(" timestamp={}", ts)); + } + if let Some(note) = &a.note { + out.push_str(&format!(" note={}", note)); + } +} + +// --------------------------------------------------------------------------- +// Tests +// --------------------------------------------------------------------------- + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn round_trip_heading() { + let mut doc = Document::new(); + doc.blocks.push(Block::Heading { + level: 2, + content: vec![Inline::Text("Test".into())], + }); + let rendered = render(&doc).expect("TODO: handle error"); + assert!(rendered.contains("## Test")); + } + + #[test] + fn round_trip_directive() { + let mut doc = Document::new(); + doc.directives.push(Directive::new("version", "1.0")); + doc.blocks + .push(Block::Directive(Directive::new("version", "1.0"))); + let rendered = render(&doc).expect("TODO: handle error"); + assert!(rendered.contains("@version 1.0")); + } + + #[test] + fn round_trip_code_block() { + let mut doc = Document::new(); + doc.blocks.push(Block::CodeBlock { + language: Some("rust".into()), + content: "fn main() {}".into(), + }); + let rendered = render(&doc).expect("TODO: handle error"); + assert!(rendered.contains("```rust")); + assert!(rendered.contains("fn main() {}")); + } +} diff --git a/rs/src/types.rs b/rs/src/types.rs new file mode 100644 index 0000000..d58b498 --- /dev/null +++ b/rs/src/types.rs @@ -0,0 +1,293 @@ +// SPDX-License-Identifier: MPL-2.0 +// (MPL-2.0 preferred; MPL-2.0 required for crates.io) + +//! Core data types for A2ML documents. +//! +//! An A2ML document consists of a sequence of [`Block`] elements, each of +//! which may contain [`Inline`] content. [`Directive`] blocks provide +//! machine-readable metadata, and [`Attestation`] records capture the +//! provenance chain for AI-generated or human-reviewed content. + +use serde::{Deserialize, Serialize}; + +// --------------------------------------------------------------------------- +// Top-level document +// --------------------------------------------------------------------------- + +/// A complete A2ML document, containing metadata and a sequence of blocks. +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +pub struct Document { + /// Optional document title (extracted from a leading `# title` line). + pub title: Option, + + /// Top-level directives that apply to the whole document. + pub directives: Vec, + + /// The ordered sequence of content blocks that make up the document body. + pub blocks: Vec, + + /// Attestation chain recording authorship and review provenance. + pub attestations: Vec, +} + +impl Document { + /// Create a new, empty document with no title or content. + pub fn new() -> Self { + Self { + title: None, + directives: Vec::new(), + blocks: Vec::new(), + attestations: Vec::new(), + } + } +} + +impl Default for Document { + fn default() -> Self { + Self::new() + } +} + +// --------------------------------------------------------------------------- +// Block-level elements +// --------------------------------------------------------------------------- + +/// A block-level element in an A2ML document. +/// +/// Blocks are separated by blank lines in the source text. +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +pub enum Block { + /// A heading with a depth (1 = `#`, 2 = `##`, etc.) and inline content. + Heading { + /// Heading depth, starting at 1. + level: u8, + /// The inline content of the heading. + content: Vec, + }, + + /// A paragraph of inline content. + Paragraph(Vec), + + /// A fenced or indented code block with an optional language tag. + CodeBlock { + /// The language identifier (e.g. `"rust"`), if any. + language: Option, + /// The raw code content, preserving internal whitespace. + content: String, + }, + + /// A directive block (starts with `@`). + Directive(Directive), + + /// An attestation block (starts with `!attest`). + Attestation(Attestation), + + /// A horizontal rule / thematic break. + ThematicBreak, + + /// A block quotation containing nested blocks. + BlockQuote(Vec), + + /// An unordered or ordered list. + List { + /// Whether the list is ordered (numbered). + ordered: bool, + /// The items in the list; each item is a sequence of blocks. + items: Vec>, + }, +} + +// --------------------------------------------------------------------------- +// Inline-level elements +// --------------------------------------------------------------------------- + +/// An inline-level element within a block. +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +pub enum Inline { + /// Plain, unformatted text. + Text(String), + + /// Emphasised text (typically rendered as *italic*). + Emphasis(Vec), + + /// Strongly emphasised text (typically rendered as **bold**). + Strong(Vec), + + /// Inline code span. + Code(String), + + /// A hyperlink with display content and a target URL. + Link { + /// The visible link text. + content: Vec, + /// The link target URL or path. + url: String, + }, +} + +// --------------------------------------------------------------------------- +// Directives +// --------------------------------------------------------------------------- + +/// A machine-readable directive that provides metadata or instructions. +/// +/// Directives begin with `@` in the source text, e.g. +/// `@version 1.0` or `@require trust-level:high`. +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +pub struct Directive { + /// The directive name (the identifier immediately after `@`). + pub name: String, + + /// The directive value or argument string. + pub value: String, + + /// Optional key-value attributes attached to the directive. + pub attributes: Vec<(String, String)>, +} + +impl Directive { + /// Create a simple directive with a name and value, and no attributes. + pub fn new(name: impl Into, value: impl Into) -> Self { + Self { + name: name.into(), + value: value.into(), + attributes: Vec::new(), + } + } +} + +// --------------------------------------------------------------------------- +// Attestations +// --------------------------------------------------------------------------- + +/// An attestation record capturing who produced or reviewed content. +/// +/// Attestation blocks start with `!attest` and record the identity, +/// role, trust level, and optional timestamp of an author or reviewer. +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +pub struct Attestation { + /// The identity of the attester (person, tool, or agent name). + pub identity: String, + + /// The role of the attester (e.g. `"author"`, `"reviewer"`, `"agent"`). + pub role: String, + + /// The trust level assigned to this attestation. + pub trust_level: TrustLevel, + + /// An optional ISO-8601 timestamp for when the attestation was made. + pub timestamp: Option, + + /// Optional free-form notes or justification. + pub note: Option, +} + +impl Attestation { + /// Create a new attestation with the minimum required fields. + pub fn new( + identity: impl Into, + role: impl Into, + trust_level: TrustLevel, + ) -> Self { + Self { + identity: identity.into(), + role: role.into(), + trust_level, + timestamp: None, + note: None, + } + } +} + +// --------------------------------------------------------------------------- +// Trust levels +// --------------------------------------------------------------------------- + +/// The degree of trust associated with an attestation. +/// +/// Trust levels form a simple ordered scale from unverified content +/// through to formally verified proofs. +#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize, Deserialize)] +pub enum TrustLevel { + /// Content with no verification or review. + Unverified, + /// Content reviewed by an automated tool or linter. + Automated, + /// Content reviewed by a human. + Reviewed, + /// Content that has been formally verified or proven. + Verified, +} + +impl TrustLevel { + /// Parse a trust level from its canonical string representation. + /// + /// Recognised values (case-insensitive): `"unverified"`, `"automated"`, + /// `"reviewed"`, `"verified"`. + pub fn from_str(s: &str) -> Option { + match s.to_lowercase().as_str() { + "unverified" => Some(Self::Unverified), + "automated" => Some(Self::Automated), + "reviewed" => Some(Self::Reviewed), + "verified" => Some(Self::Verified), + _ => None, + } + } + + /// Return the canonical string representation of this trust level. + pub fn as_str(&self) -> &'static str { + match self { + Self::Unverified => "unverified", + Self::Automated => "automated", + Self::Reviewed => "reviewed", + Self::Verified => "verified", + } + } +} + +impl std::fmt::Display for TrustLevel { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + f.write_str(self.as_str()) + } +} + +// --------------------------------------------------------------------------- +// Manifest (convenience aggregate) +// --------------------------------------------------------------------------- + +/// A high-level manifest extracted from a parsed A2ML document. +/// +/// This collects the directives and attestations into a single structure +/// for convenient programmatic access. +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +pub struct Manifest { + /// The document version, if declared via `@version`. + pub version: Option, + + /// The document title, if present. + pub title: Option, + + /// All directives found in the document. + pub directives: Vec, + + /// All attestations found in the document. + pub attestations: Vec, +} + +impl Manifest { + /// Extract a manifest from a parsed [`Document`]. + pub fn from_document(doc: &Document) -> Self { + let version = doc + .directives + .iter() + .find(|d| d.name == "version") + .map(|d| d.value.clone()); + + Self { + version, + title: doc.title.clone(), + directives: doc.directives.clone(), + attestations: doc.attestations.clone(), + } + } +} diff --git a/rs/stapeln.toml b/rs/stapeln.toml new file mode 100644 index 0000000..17a310b --- /dev/null +++ b/rs/stapeln.toml @@ -0,0 +1,87 @@ +# SPDX-License-Identifier: MPL-2.0 +# stapeln.toml — Layer-based container build for a2ml-rs +# +# stapeln builds containers as composable layers (German: "to stack"). +# Each layer is independently cacheable, verifiable, and signable. + +[metadata] +name = "a2ml-rs" +version = "0.1.0" +description = "a2ml-rs container service" +author = "Jonathan D.A. Jewell " +license = "MPL-2.0" +registry = "ghcr.io/hyperpolymath" + +[build] +containerfile = "Containerfile" +context = "." +runtime = "podman" + +# ── Layer Definitions ────────────────────────────────────────── + +[layers.base] +description = "Chainguard Wolfi minimal base" +from = "cgr.dev/chainguard/wolfi-base:latest" +cache = true +verify = true + +[layers.toolchain] +description = "Build tools" +extends = "base" +packages = [] +cache = true + +[layers.build] +description = "a2ml-rs build" +extends = "toolchain" +commands = [] + +[layers.runtime] +description = "Minimal runtime" +from = "cgr.dev/chainguard/wolfi-base:latest" +packages = ["ca-certificates", "curl"] +copy-from = [ + { layer = "build", src = "/app/", dst = "/app/" }, +] +entrypoint = ["/app/a2ml-rs"] +user = "nonroot" + +# ── Security ─────────────────────────────────────────────────── + +[security] +non-root = true +read-only-root = false +no-new-privileges = true +cap-drop = ["ALL"] +seccomp-profile = "default" + +[security.signing] +algorithm = "ML-DSA-87" +provider = "cerro-torre" + +[security.sbom] +format = "spdx-json" +output = "sbom.spdx.json" +include-deps = true + +# ── Verification ─────────────────────────────────────────────── + +[verify] +vordr = true +svalinn = true +scan-on-build = true +fail-on = ["critical", "high"] + +# ── Targets ──────────────────────────────────────────────────── + +[targets.development] +layers = ["base", "chainguard-toolchain", "build"] +env = { LOG_LEVEL = "debug" } + +[targets.production] +layers = ["runtime"] +env = { LOG_LEVEL = "info" } + +[targets.test] +layers = ["base", "chainguard-toolchain", "build"] +env = { LOG_LEVEL = "debug" } diff --git a/rs/tests/aspect_test.rs b/rs/tests/aspect_test.rs new file mode 100644 index 0000000..21285e8 --- /dev/null +++ b/rs/tests/aspect_test.rs @@ -0,0 +1,239 @@ +// SPDX-License-Identifier: MPL-2.0 +// (MPL-2.0 preferred; MPL-2.0 required for crates.io) + +//! Security and robustness aspect tests for the a2ml crate. +//! +//! These tests verify that the parser and renderer behave safely under +//! adversarial, degenerate, and stress-inducing inputs. No test in this +//! file should panic or abort the process — unexpected errors must be +//! returned as `Err` values, and all other inputs must be handled gracefully. + +use a2ml::parser::parse; +use a2ml::renderer::render; + +// --------------------------------------------------------------------------- +// Empty and whitespace-only input +// --------------------------------------------------------------------------- + +/// Parsing the empty string must succeed and produce an empty document — +/// not panic, not return `Err`. +#[test] +fn aspect_empty_input_does_not_panic() { + let result = parse(""); + assert!(result.is_ok(), "empty input must parse cleanly"); + let doc = result.unwrap(); + assert!(doc.blocks.is_empty(), "empty input must produce zero blocks"); + assert!(doc.title.is_none(), "empty input must produce no title"); +} + +/// Whitespace-only input (spaces, tabs, newlines) must parse cleanly. +#[test] +fn aspect_whitespace_only_input_does_not_panic() { + for input in &[" ", "\t\t\t", "\n\n\n", " \t \n \t ", "\r\n\r\n"] { + let result = parse(input); + assert!( + result.is_ok(), + "whitespace-only input {input:?} must parse without error" + ); + } +} + +// --------------------------------------------------------------------------- +// Very long input +// --------------------------------------------------------------------------- + +/// A document with many thousands of blocks should parse and render without +/// running out of stack or memory in a reasonable time. +#[test] +fn aspect_very_long_input_handled_gracefully() { + // Construct a document with 2 000 paragraphs (≈ 30 KB of text). + let mut input = String::with_capacity(30_000); + for i in 0..2_000 { + input.push_str(&format!("Paragraph number {}.\n\n", i)); + } + let result = parse(&input); + assert!(result.is_ok(), "very long input must parse without error"); + let doc = result.unwrap(); + // Each paragraph becomes one Block::Paragraph. + assert_eq!( + doc.blocks.len(), + 2_000, + "all paragraphs must be parsed from a long document" + ); +} + +/// A single very long line (64 KB) must be handled without panicking. +#[test] +fn aspect_single_very_long_line_does_not_panic() { + // Create a 64 KiB paragraph — no newlines. + let long_line = "x".repeat(65_536); + let result = parse(&long_line); + // We don't mandate success or failure — only that it does not panic. + let _ = result; +} + +/// A document with many directives must parse without error. +#[test] +fn aspect_many_directives_handled_gracefully() { + let mut input = String::with_capacity(20_000); + for i in 0..500 { + input.push_str(&format!("@meta key{}\n", i)); + } + let result = parse(&input); + assert!(result.is_ok(), "500 directives must parse without error"); + let doc = result.unwrap(); + assert_eq!(doc.directives.len(), 500); +} + +// --------------------------------------------------------------------------- +// Special characters and unicode +// --------------------------------------------------------------------------- + +/// Null bytes in the input must not cause panics — they are unusual but +/// the parser must handle them gracefully (either as text or as an error). +#[test] +fn aspect_null_bytes_do_not_panic() { + let input_with_null = "A paragraph with a \x00 null byte."; + let _ = parse(input_with_null); // must not panic +} + +/// Non-BMP Unicode (characters beyond U+FFFF) must not cause panics. +/// Rust's `char` type is already Unicode scalar values, but the inline +/// parser iterates over `chars()` and we want to be sure nothing blows up. +#[test] +fn aspect_non_bmp_unicode_does_not_panic() { + // U+1F600 GRINNING FACE (4-byte UTF-8), U+10FFFF last valid code point. + let input = "# \u{1F600} Title\n\nParagraph with \u{10FFFF} extreme unicode."; + let result = parse(input); + assert!( + result.is_ok(), + "valid unicode input must parse without error" + ); +} + +/// RTL text and combining characters must parse without panicking. +#[test] +fn aspect_rtl_and_combining_characters_do_not_panic() { + // Arabic, Hebrew, and a combining accent character. + let input = "مرحبا بالعالم\n\nשלום עולם\n\ne\u{0301} (e with acute combining)"; + let result = parse(input); + assert!( + result.is_ok(), + "RTL and combining-character text must parse without error" + ); +} + +/// A heading whose text is entirely emoji must parse correctly. +#[test] +fn aspect_emoji_heading_does_not_panic() { + let input = "# \u{1F916}\u{1F4AC}\u{2728}"; + let result = parse(input); + assert!(result.is_ok(), "emoji-only heading must parse without error"); +} + +// --------------------------------------------------------------------------- +// Deeply nested / recursive structures +// --------------------------------------------------------------------------- + +/// Deeply nested block quotes (100 levels) must not cause a stack overflow. +/// Each `>` triggers a recursive call to `parse`; this checks that the +/// parser survives reasonable recursion depths without overflowing. +#[test] +fn aspect_deeply_nested_block_quotes_do_not_overflow() { + // Build "> > > ... > text" with 50 levels of nesting. + // The current parser recurses once per level; 50 is a comfortable depth. + let prefix = "> ".repeat(50); + let input = format!("{}innermost text", prefix); + let result = parse(&input); + // We do not mandate success (it may legitimately be limited), only + // that the process does not crash. + let _ = result; +} + +/// A large unordered list (1 000 items) must parse without panicking. +#[test] +fn aspect_large_list_does_not_panic() { + let mut input = String::with_capacity(20_000); + for i in 0..1_000 { + input.push_str(&format!("- Item {}\n", i)); + } + let result = parse(&input); + assert!(result.is_ok(), "large list must parse without error"); + let doc = result.unwrap(); + // All 1 000 items coalesce into a single Block::List. + assert_eq!( + doc.blocks.len(), + 1, + "all 1 000 list items must coalesce into one Block::List" + ); +} + +// --------------------------------------------------------------------------- +// Malicious / adversarial inputs +// --------------------------------------------------------------------------- + +/// A forged `!attest` line with valid keys but an unknown trust level must +/// return `Err` — it must not silently succeed with a default trust level. +#[test] +fn aspect_forged_attestation_unknown_trust_is_rejected() { + let input = "!attest identity=Attacker role=admin trust=omnipotent"; + let result = parse(input); + assert!( + result.is_err(), + "attestation with unknown trust level must be rejected" + ); +} + +/// A `@` sign with no name (just a space or nothing after) must return `Err`. +#[test] +fn aspect_bare_at_sign_is_rejected() { + for bad_directive in &["@", "@ ", "@\t", "@\n"] { + let result = parse(bad_directive); + assert!( + result.is_err(), + "bare '@' input {bad_directive:?} must be rejected, not panic" + ); + } +} + +/// Extremely long directive values must not panic. +#[test] +fn aspect_long_directive_value_does_not_panic() { + let long_value = "x".repeat(65_536); + let input = format!("@meta {}", long_value); + let result = parse(&input); + // Either success or a structured error — never a panic. + let _ = result; +} + +/// An attestation with a very long `identity` field must not panic. +#[test] +fn aspect_long_attestation_identity_does_not_panic() { + let long_id = "A".repeat(65_536); + let input = format!( + "!attest identity={} role=author trust=reviewed", + long_id + ); + let result = parse(&input); + // Either success or a structured error — never a panic. + let _ = result; +} + +// --------------------------------------------------------------------------- +// Render robustness +// --------------------------------------------------------------------------- + +/// Rendering a default (empty) Document must succeed and produce an empty +/// or whitespace-only string without panicking. +#[test] +fn aspect_render_empty_document_does_not_panic() { + use a2ml::types::Document; + let doc = Document::new(); + let result = render(&doc); + assert!(result.is_ok(), "rendering an empty document must succeed"); + let rendered = result.unwrap(); + assert!( + rendered.trim().is_empty(), + "rendering an empty document must produce only whitespace (got: {rendered:?})" + ); +} diff --git a/rs/tests/e2e_test.rs b/rs/tests/e2e_test.rs new file mode 100644 index 0000000..4d82317 --- /dev/null +++ b/rs/tests/e2e_test.rs @@ -0,0 +1,326 @@ +// SPDX-License-Identifier: MPL-2.0 +// (MPL-2.0 preferred; MPL-2.0 required for crates.io) + +//! End-to-end tests for the a2ml crate. +//! +//! These tests exercise the full parse → render → parse lifecycle using +//! realistic A2ML documents, verifying that the library correctly handles +//! complete documents from start to finish. + +use a2ml::parser::parse; +use a2ml::renderer::render; +use a2ml::types::{Block, Directive, Manifest, TrustLevel}; + +// --------------------------------------------------------------------------- +// Fixture documents +// --------------------------------------------------------------------------- + +/// A minimal but complete A2ML document with a title, version directive, +/// body paragraph, and a single attestation. +const MINIMAL_DOCUMENT: &str = r#"# Minimal Document + +@version 1.0 + +This is a short paragraph of plain text. + +!attest identity=Alice role=author trust=reviewed +"#; + +/// A fuller document exercising most block types: headings at multiple +/// depths, code blocks, thematic breaks, lists, and block quotes. +const FULL_DOCUMENT: &str = r#"# A2ML Reference Example + +@version 2.0 +@require trust-level:reviewed + +## Introduction + +This document demonstrates all major A2ML block types. + +## Code Samples + +```rust +fn greet(name: &str) -> String { + format!("Hello, {}!", name) +} +``` + +--- + +## Lists + +- First unordered item +- Second unordered item +- Third unordered item + +1. First ordered item +2. Second ordered item + +## Quotation + +> A block quotation with some *emphasized* text. + +!attest identity=Bob role=reviewer trust=verified ts=2026-01-01 +!attest identity=CI-bot role=agent trust=automated +"#; + +/// A document that contains rich inline formatting: bold, italic, code +/// spans, and hyperlinks in paragraph context. +const INLINE_FORMATTING_DOCUMENT: &str = r#"# Formatting Test + +This paragraph has **bold text**, *italic text*, `inline code`, and a [link](https://example.com). + +A second paragraph with **nested *bold-italic*** content. +"#; + +// --------------------------------------------------------------------------- +// E2E tests +// --------------------------------------------------------------------------- + +/// Parsing the minimal document succeeds and extracts the correct title. +#[test] +fn e2e_minimal_document_title() { + let doc = parse(MINIMAL_DOCUMENT).expect("minimal document should parse cleanly"); + assert_eq!( + doc.title.as_deref(), + Some("Minimal Document"), + "title should be extracted from the leading H1" + ); +} + +/// Parsing the minimal document produces exactly one attestation with the +/// expected identity and trust level. +#[test] +fn e2e_minimal_document_attestation() { + let doc = parse(MINIMAL_DOCUMENT).expect("minimal document should parse"); + assert_eq!(doc.attestations.len(), 1, "expected exactly one attestation"); + assert_eq!(doc.attestations[0].identity, "Alice"); + assert_eq!(doc.attestations[0].role, "author"); + assert_eq!(doc.attestations[0].trust_level, TrustLevel::Reviewed); +} + +/// Rendering the minimal document after parsing produces a non-empty string +/// that contains the original heading text. +#[test] +fn e2e_render_minimal_document() { + let doc = parse(MINIMAL_DOCUMENT).expect("parse"); + let rendered = render(&doc).expect("render"); + assert!( + rendered.contains("Minimal Document"), + "rendered output must contain the document title" + ); + assert!( + rendered.contains("@version 1.0"), + "rendered output must contain the version directive" + ); +} + +/// The roundtrip `parse(render(parse(input)))` should preserve the document +/// title through a full parse → render → parse cycle, and the rendered text +/// must contain all original directive and attestation identities. +/// +/// Note: the renderer emits `doc.directives` at the top AND each +/// `Block::Directive` inline; similarly `doc.attestations` at the bottom AND +/// each `Block::Attestation` inline. Re-parsing therefore doubles counts for +/// both, which is a known characteristic of the current renderer design. +/// Tests check rendered content by string containment rather than counts. +#[test] +fn e2e_roundtrip_minimal_document() { + let doc1 = parse(MINIMAL_DOCUMENT).expect("first parse"); + let rendered = render(&doc1).expect("render"); + let _doc2 = parse(&rendered).expect("second parse"); + assert_eq!( + doc1.title, + _doc2.title, + "title must survive a full roundtrip" + ); + // All original directive names must appear in the rendered output. + for directive in &doc1.directives { + assert!( + rendered.contains(&format!("@{}", directive.name)), + "rendered output must contain directive @{}", + directive.name + ); + } + // All original attestation identities must appear in the rendered output. + for attestation in &doc1.attestations { + assert!( + rendered.contains(&format!("identity={}", attestation.identity)), + "rendered output must contain attestation identity={}", + attestation.identity + ); + } +} + +/// The full document parses without errors and extracts both attestations. +#[test] +fn e2e_full_document_parses() { + let doc = parse(FULL_DOCUMENT).expect("full document should parse without errors"); + assert_eq!( + doc.attestations.len(), + 2, + "full document must have exactly 2 attestations" + ); + // The first attestation has trust=verified; the second has trust=automated. + assert_eq!(doc.attestations[0].trust_level, TrustLevel::Verified); + assert_eq!(doc.attestations[1].trust_level, TrustLevel::Automated); +} + +/// Directives from the full document are correctly parsed and stored. +#[test] +fn e2e_full_document_directives() { + let doc = parse(FULL_DOCUMENT).expect("parse"); + // @version and @require should both be present. + let version_directive = doc.directives.iter().find(|d| d.name == "version"); + assert!( + version_directive.is_some(), + "@version directive must be present" + ); + assert_eq!( + version_directive.unwrap().value, + "2.0", + "@version value must be '2.0'" + ); +} + +/// The Manifest convenience struct correctly extracts version and title from +/// the full document. +#[test] +fn e2e_manifest_extraction() { + let doc = parse(FULL_DOCUMENT).expect("parse"); + let manifest = Manifest::from_document(&doc); + assert_eq!( + manifest.version.as_deref(), + Some("2.0"), + "manifest must expose the @version directive" + ); + assert_eq!( + manifest.title.as_deref(), + Some("A2ML Reference Example"), + "manifest must expose the document title" + ); + assert_eq!( + manifest.attestations.len(), + 2, + "manifest must include all attestations" + ); +} + +/// Roundtrip the full document and verify that all directive names and +/// attestation identities appear in the rendered text. +/// +/// Note: the renderer emits `doc.directives` at the top and also each +/// `Block::Directive` inline (and likewise for attestations), so re-parsing +/// doubles those counts. The test checks rendered content by string +/// containment rather than strict count equality. +#[test] +fn e2e_roundtrip_full_document_block_count() { + let doc1 = parse(FULL_DOCUMENT).expect("first parse"); + let rendered = render(&doc1).expect("render"); + let _doc2 = parse(&rendered).expect("second parse"); + // All original directive names must be present in the rendered output. + for directive in &doc1.directives { + assert!( + rendered.contains(&format!("@{}", directive.name)), + "rendered output must contain directive @{} from full document", + directive.name + ); + } + // All original attestation identities must be present in the rendered output. + for attestation in &doc1.attestations { + assert!( + rendered.contains(&format!("identity={}", attestation.identity)), + "rendered output must contain attestation identity={} from full document", + attestation.identity + ); + } +} + +/// Inline formatting is preserved through a full parse → render cycle: +/// bold markers, italic markers, and backtick code spans all survive. +#[test] +fn e2e_inline_formatting_survives_render() { + let doc = parse(INLINE_FORMATTING_DOCUMENT).expect("parse"); + let rendered = render(&doc).expect("render"); + assert!(rendered.contains("**bold text**"), "bold must survive render"); + assert!(rendered.contains("*italic text*"), "italic must survive render"); + assert!(rendered.contains("`inline code`"), "code span must survive render"); + assert!( + rendered.contains("[link](https://example.com)"), + "hyperlink must survive render" + ); +} + +/// An A2ML document with a thematic break renders it back as `---`. +#[test] +fn e2e_thematic_break_roundtrip() { + let input = "# Title\n\nBefore break.\n\n---\n\nAfter break.\n"; + let doc = parse(input).expect("parse"); + let rendered = render(&doc).expect("render"); + assert!( + rendered.contains("---"), + "thematic break must appear in rendered output" + ); + // Re-parse the rendered output and confirm the break is still present. + let doc2 = parse(&rendered).expect("second parse"); + let has_break = doc2 + .blocks + .iter() + .any(|b| matches!(b, Block::ThematicBreak)); + assert!(has_break, "thematic break must survive roundtrip"); +} + +/// A code block with a language tag roundtrips with its language preserved. +#[test] +fn e2e_code_block_language_roundtrip() { + let input = "```gleam\npub fn main() { Nil }\n```\n"; + let doc = parse(input).expect("parse"); + let rendered = render(&doc).expect("render"); + assert!( + rendered.contains("```gleam"), + "language tag must appear in rendered output" + ); + // Second parse confirms the language is still recorded. + let doc2 = parse(&rendered).expect("second parse"); + let code_block = doc2.blocks.iter().find_map(|b| { + if let Block::CodeBlock { language, .. } = b { + Some(language.as_deref()) + } else { + None + } + }); + assert_eq!( + code_block, + Some(Some("gleam")), + "language must be preserved through roundtrip" + ); +} + +/// An unordered list roundtrips correctly with all items intact. +#[test] +fn e2e_unordered_list_roundtrip() { + let input = "- Alpha\n- Beta\n- Gamma\n"; + let doc = parse(input).expect("parse"); + let rendered = render(&doc).expect("render"); + let doc2 = parse(&rendered).expect("second parse"); + let list_block = doc2.blocks.iter().find(|b| matches!(b, Block::List { .. })); + assert!(list_block.is_some(), "list block must survive roundtrip"); + if let Some(Block::List { ordered, items }) = list_block { + assert!(!ordered, "list must remain unordered"); + assert_eq!(items.len(), 3, "all three list items must survive"); + } +} + +/// A Directive constructed directly via `Directive::new` renders in the +/// canonical `@name value` format. +#[test] +fn e2e_programmatic_directive_rendering() { + let directive = Directive::new("agent", "claude-sonnet"); + let mut doc = a2ml::types::Document::new(); + doc.directives.push(directive); + let rendered = render(&doc).expect("render"); + assert!( + rendered.contains("@agent claude-sonnet"), + "programmatically-constructed directive must render correctly" + ); +} diff --git a/rs/tests/fuzz/placeholder.txt b/rs/tests/fuzz/placeholder.txt new file mode 100644 index 0000000..8621280 --- /dev/null +++ b/rs/tests/fuzz/placeholder.txt @@ -0,0 +1 @@ +Scorecard requirement placeholder diff --git a/rs/tests/property_test.rs b/rs/tests/property_test.rs new file mode 100644 index 0000000..0c2a53e --- /dev/null +++ b/rs/tests/property_test.rs @@ -0,0 +1,264 @@ +// SPDX-License-Identifier: MPL-2.0 +// (MPL-2.0 preferred; MPL-2.0 required for crates.io) + +//! Property-style tests for the a2ml crate. +//! +//! These tests operate over fixed arrays of valid and invalid A2ML snippets, +//! verifying properties that should hold across all inputs: parse-succeeds, +//! parse-rejects, render-never-panics, and roundtrip-stability. + +use a2ml::parser::parse; +use a2ml::renderer::render; + +// --------------------------------------------------------------------------- +// Fixed arrays of valid A2ML snippets +// --------------------------------------------------------------------------- + +/// Each entry is a valid A2ML snippet that `parse` must accept without error. +const VALID_SNIPPETS: &[&str] = &[ + // 1. Empty document + "", + // 2. Title only + "# My Document", + // 3. Directive only + "@version 1.0", + // 4. Paragraph only + "A simple paragraph with no markup.", + // 5. Heading + paragraph + "# Title\n\nBody text here.", + // 6. Fenced code block (no language) + "```\nsome code\n```", + // 7. Fenced code block with language tag + "```elixir\ndefmodule Foo do\nend\n```", + // 8. Complete attestation + "!attest identity=Carol role=reviewer trust=verified", + // 9. Multiple directives + "@version 1.0\n@require trust-level:high", + // 10. Inline formatting (bold, italic, code, link) + "A paragraph with **bold**, *italic*, `code`, and [link](https://a2ml.org).", +]; + +/// Each entry is an invalid A2ML snippet that `parse` must reject with `Err`. +const INVALID_SNIPPETS: &[&str] = &[ + // 1. Unterminated fenced code block — parser should return a parse error. + "```\nno closing fence", + // 2. Bare `@` with no directive name. + "@ ", + // 3. Attestation missing `identity` field. + "!attest role=author trust=reviewed", + // 4. Attestation missing `role` field. + "!attest identity=Alice trust=reviewed", + // 5. Attestation with unknown trust level. + "!attest identity=Alice role=author trust=godlike", + // 6. Attestation missing `trust` field. + "!attest identity=Alice role=author", +]; + +// --------------------------------------------------------------------------- +// Property: all valid snippets parse successfully +// --------------------------------------------------------------------------- + +/// Every entry in `VALID_SNIPPETS` must parse without returning an error. +/// This test loops over the array and checks each one individually so that +/// a failure message identifies the offending snippet by index. +#[test] +fn property_valid_snippets_all_parse() { + for (index, snippet) in VALID_SNIPPETS.iter().enumerate() { + let result = parse(snippet); + assert!( + result.is_ok(), + "valid snippet #{index} should parse successfully, but got: {:?}\nSnippet: {snippet:?}", + result.err() + ); + } +} + +// --------------------------------------------------------------------------- +// Property: all invalid snippets are rejected +// --------------------------------------------------------------------------- + +/// Every entry in `INVALID_SNIPPETS` must produce an `Err` from `parse`. +/// This confirms that the parser enforces structural constraints. +#[test] +fn property_invalid_snippets_all_rejected() { + for (index, snippet) in INVALID_SNIPPETS.iter().enumerate() { + let result = parse(snippet); + assert!( + result.is_err(), + "invalid snippet #{index} should fail to parse but unexpectedly succeeded\nSnippet: {snippet:?}" + ); + } +} + +// --------------------------------------------------------------------------- +// Property: rendering never panics on valid parsed content +// --------------------------------------------------------------------------- + +/// For every entry in `VALID_SNIPPETS`, parsing followed by rendering must +/// not panic and must return `Ok`. +#[test] +fn property_render_never_panics_on_valid_docs() { + for (index, snippet) in VALID_SNIPPETS.iter().enumerate() { + let doc = parse(snippet).expect("valid snippet should parse"); + let result = render(&doc); + assert!( + result.is_ok(), + "rendering snippet #{index} should succeed, but got: {:?}\nSnippet: {snippet:?}", + result.err() + ); + } +} + +// --------------------------------------------------------------------------- +// Property: rendered output is non-empty for non-empty documents +// --------------------------------------------------------------------------- + +/// For documents that have any content, the rendered string must not be +/// empty. Empty-input documents may legitimately produce empty output. +#[test] +fn property_rendered_output_non_empty_when_doc_has_content() { + let non_empty_snippets = &VALID_SNIPPETS[1..]; // skip the empty document + for (index, snippet) in non_empty_snippets.iter().enumerate() { + let doc = parse(snippet).expect("valid snippet should parse"); + let rendered = render(&doc).expect("render should succeed"); + assert!( + !rendered.trim().is_empty(), + "snippet #{} produces a non-empty document but rendered output is empty\nSnippet: {snippet:?}", + index + 1 + ); + } +} + +// --------------------------------------------------------------------------- +// Property: re-parsing rendered output yields equal metadata +// --------------------------------------------------------------------------- + +/// For all valid snippets, `parse(render(parse(s)))` must preserve the +/// document `title` and `attestations`. Directive counts are intentionally +/// NOT compared: the renderer emits `doc.directives` at the top of the output +/// AND each `Block::Directive` inline, so re-parsing multiplies the count. +/// Instead, we verify that every directive name from the first parse appears +/// verbatim in the rendered output. +#[test] +fn property_roundtrip_metadata_stable() { + for (index, snippet) in VALID_SNIPPETS.iter().enumerate() { + let doc1 = parse(snippet).expect("first parse"); + let rendered = render(&doc1).expect("render"); + let doc2 = parse(&rendered).expect("second parse after render"); + + assert_eq!( + doc1.title, doc2.title, + "title must be stable after roundtrip for snippet #{index}" + ); + // Confirm every directive name is still present in the rendered text. + for directive in &doc1.directives { + assert!( + rendered.contains(&format!("@{}", directive.name)), + "rendered snippet #{index} must contain directive @{}", + directive.name + ); + } + // Confirm every attestation identity is still present in the rendered text. + for attestation in &doc1.attestations { + assert!( + rendered.contains(&format!("identity={}", attestation.identity)), + "rendered snippet #{index} must contain attestation identity={}", + attestation.identity + ); + } + } +} + +// --------------------------------------------------------------------------- +// Property: directive names survive the roundtrip unchanged +// --------------------------------------------------------------------------- + +/// For every valid snippet that contains directives, each directive name from +/// the first parse must appear verbatim in the rendered output. +/// +/// Note: re-parsing the rendered output doubles directive counts (the renderer +/// emits `doc.directives` at the top and also each `Block::Directive` inline), +/// so this test checks rendered string content rather than comparing name +/// lists from doc2 directly. +#[test] +fn property_directive_names_survive_roundtrip() { + for (index, snippet) in VALID_SNIPPETS.iter().enumerate() { + let doc1 = parse(snippet).expect("first parse"); + if doc1.directives.is_empty() { + continue; // no directives to check + } + let rendered = render(&doc1).expect("render"); + + for directive in &doc1.directives { + assert!( + rendered.contains(&format!("@{}", directive.name)), + "rendered snippet #{index} must contain directive @{}", + directive.name + ); + } + } +} + +// --------------------------------------------------------------------------- +// Property: attestation identity and trust level survive the roundtrip +// --------------------------------------------------------------------------- + +/// For every valid snippet that contains attestations, identity strings, +/// trust levels, and roles must be preserved verbatim in the rendered output. +/// +/// Note: re-parsing the rendered output doubles attestation counts (the +/// renderer emits them both inline and at the bottom of the document), so +/// this test checks rendered string content rather than comparing doc2 fields +/// directly. +#[test] +fn property_attestation_fields_survive_roundtrip() { + for (index, snippet) in VALID_SNIPPETS.iter().enumerate() { + let doc1 = parse(snippet).expect("first parse"); + if doc1.attestations.is_empty() { + continue; + } + let rendered = render(&doc1).expect("render"); + + for (att_idx, a1) in doc1.attestations.iter().enumerate() { + assert!( + rendered.contains(&format!("identity={}", a1.identity)), + "rendered snippet #{index} must contain attestation #{att_idx} identity={}", + a1.identity + ); + assert!( + rendered.contains(&format!("role={}", a1.role)), + "rendered snippet #{index} must contain attestation #{att_idx} role={}", + a1.role + ); + assert!( + rendered.contains(&format!("trust={}", a1.trust_level)), + "rendered snippet #{index} must contain attestation #{att_idx} trust={}", + a1.trust_level + ); + } + } +} + +// --------------------------------------------------------------------------- +// Property: render output always contains a newline-terminated string +// --------------------------------------------------------------------------- + +/// Any non-empty rendered document must end with a newline, so that the +/// output is suitable for concatenation and POSIX text-file conventions. +#[test] +fn property_rendered_output_ends_with_newline() { + for (index, snippet) in VALID_SNIPPETS.iter().enumerate() { + if snippet.is_empty() { + continue; // empty doc → empty render string, no newline required + } + let doc = parse(snippet).expect("parse"); + let rendered = render(&doc).expect("render"); + if rendered.is_empty() { + continue; + } + assert!( + rendered.ends_with('\n'), + "rendered output for snippet #{index} must end with a newline" + ); + } +} diff --git a/rs/verification/0.1-AI-MANIFEST.a2ml b/rs/verification/0.1-AI-MANIFEST.a2ml new file mode 100644 index 0000000..3435bdb --- /dev/null +++ b/rs/verification/0.1-AI-MANIFEST.a2ml @@ -0,0 +1,27 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "verification-pillar" +level: 1 +parent: "../0-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Primary verification pillar. Contains evidence for correctness, + performance, formal proofs, randomized testing, and aerospace-grade + high-assurance metrics (MC/DC coverage, traceability, safety cases). + +canonical_locations: + tests: "tests/" + benchmarks: "benchmarks/" + proofs: "proofs/" + fuzzing: "fuzzing/" + simulations: "simulations/" + coverage: "coverage/" + traceability: "traceability/" + safety_case: "safety_case/" + +invariants: + - "Evidence MUST be reproducible and documented" + - "High-assurance deployments MUST satisfy traceability and safety_case requirements" diff --git a/rs/verification/README.adoc b/rs/verification/README.adoc new file mode 100644 index 0000000..f07e7f3 --- /dev/null +++ b/rs/verification/README.adoc @@ -0,0 +1 @@ += Verification Pillar diff --git a/rs/verification/benchmarks/0.2-AI-MANIFEST.a2ml b/rs/verification/benchmarks/0.2-AI-MANIFEST.a2ml new file mode 100644 index 0000000..d922a4c --- /dev/null +++ b/rs/verification/benchmarks/0.2-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "benches-pillar" +level: 2 +parent: "../0.1-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Benches pillar. diff --git a/rs/verification/benchmarks/README.adoc b/rs/verification/benchmarks/README.adoc new file mode 100644 index 0000000..5db7648 --- /dev/null +++ b/rs/verification/benchmarks/README.adoc @@ -0,0 +1 @@ += Benchmarks Unit diff --git a/rs/verification/coverage/0.2-AI-MANIFEST.a2ml b/rs/verification/coverage/0.2-AI-MANIFEST.a2ml new file mode 100644 index 0000000..32b819e --- /dev/null +++ b/rs/verification/coverage/0.2-AI-MANIFEST.a2ml @@ -0,0 +1,12 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "verification-unit-coverage" +level: 2 +parent: "../0.1-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + High-assurance verification unit for coverage. + Critical for safety-of-life and aerospace-grade deployment standards. diff --git a/rs/verification/coverage/README.adoc b/rs/verification/coverage/README.adoc new file mode 100644 index 0000000..2566956 --- /dev/null +++ b/rs/verification/coverage/README.adoc @@ -0,0 +1 @@ += Coverage Unit diff --git a/rs/verification/fuzzing/0.2-AI-MANIFEST.a2ml b/rs/verification/fuzzing/0.2-AI-MANIFEST.a2ml new file mode 100644 index 0000000..5178d40 --- /dev/null +++ b/rs/verification/fuzzing/0.2-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "fuzzing-unit" +level: 2 +parent: "../0.1-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Fuzzing unit for high-rigor verification. diff --git a/rs/verification/fuzzing/README.adoc b/rs/verification/fuzzing/README.adoc new file mode 100644 index 0000000..edeb179 --- /dev/null +++ b/rs/verification/fuzzing/README.adoc @@ -0,0 +1 @@ += Fuzzing Unit diff --git a/rs/verification/proofs/0.2-AI-MANIFEST.a2ml b/rs/verification/proofs/0.2-AI-MANIFEST.a2ml new file mode 100644 index 0000000..135e181 --- /dev/null +++ b/rs/verification/proofs/0.2-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "verification-unit-proofs" +level: 2 +parent: "../0.1-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Sub-unit focusing on proofs. diff --git a/rs/verification/proofs/README.adoc b/rs/verification/proofs/README.adoc new file mode 100644 index 0000000..1ae324d --- /dev/null +++ b/rs/verification/proofs/README.adoc @@ -0,0 +1 @@ += Proofs Unit diff --git a/rs/verification/safety_case/0.2-AI-MANIFEST.a2ml b/rs/verification/safety_case/0.2-AI-MANIFEST.a2ml new file mode 100644 index 0000000..d461915 --- /dev/null +++ b/rs/verification/safety_case/0.2-AI-MANIFEST.a2ml @@ -0,0 +1,12 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "verification-unit-safety_case" +level: 2 +parent: "../0.1-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + High-assurance verification unit for safety case. + Critical for safety-of-life and aerospace-grade deployment standards. diff --git a/rs/verification/safety_case/README.adoc b/rs/verification/safety_case/README.adoc new file mode 100644 index 0000000..47c8e36 --- /dev/null +++ b/rs/verification/safety_case/README.adoc @@ -0,0 +1 @@ += Safety case Unit diff --git a/rs/verification/simulations/0.2-AI-MANIFEST.a2ml b/rs/verification/simulations/0.2-AI-MANIFEST.a2ml new file mode 100644 index 0000000..f890eca --- /dev/null +++ b/rs/verification/simulations/0.2-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "simulations-unit" +level: 2 +parent: "../0.1-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Simulations unit for high-rigor verification. diff --git a/rs/verification/simulations/README.adoc b/rs/verification/simulations/README.adoc new file mode 100644 index 0000000..8e1b13a --- /dev/null +++ b/rs/verification/simulations/README.adoc @@ -0,0 +1 @@ += Simulations Unit diff --git a/rs/verification/tests/0.2-AI-MANIFEST.a2ml b/rs/verification/tests/0.2-AI-MANIFEST.a2ml new file mode 100644 index 0000000..0008fcf --- /dev/null +++ b/rs/verification/tests/0.2-AI-MANIFEST.a2ml @@ -0,0 +1 @@ +# AI Manifest - Level 1: tests diff --git a/rs/verification/tests/README.adoc b/rs/verification/tests/README.adoc new file mode 100644 index 0000000..344bf86 --- /dev/null +++ b/rs/verification/tests/README.adoc @@ -0,0 +1 @@ += Tests Unit diff --git a/rs/verification/traceability/0.2-AI-MANIFEST.a2ml b/rs/verification/traceability/0.2-AI-MANIFEST.a2ml new file mode 100644 index 0000000..9667766 --- /dev/null +++ b/rs/verification/traceability/0.2-AI-MANIFEST.a2ml @@ -0,0 +1,12 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "verification-unit-traceability" +level: 2 +parent: "../0.1-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + High-assurance verification unit for traceability. + Critical for safety-of-life and aerospace-grade deployment standards. diff --git a/rs/verification/traceability/README.adoc b/rs/verification/traceability/README.adoc new file mode 100644 index 0000000..ff23dd7 --- /dev/null +++ b/rs/verification/traceability/README.adoc @@ -0,0 +1 @@ += Traceability Unit diff --git a/showcase/.editorconfig b/showcase/.editorconfig new file mode 100644 index 0000000..bcdbb4d --- /dev/null +++ b/showcase/.editorconfig @@ -0,0 +1,65 @@ +# RSR-template-repo - Editor Configuration +# https://editorconfig.org + +root = true + +[*] +charset = utf-8 +end_of_line = lf +indent_size = 2 +indent_style = space +insert_final_newline = true +trim_trailing_whitespace = true + +[*.md] +trim_trailing_whitespace = false + +[*.adoc] +trim_trailing_whitespace = false + +[*.rs] +indent_size = 4 + +[*.ex] +indent_size = 2 + +[*.exs] +indent_size = 2 + +[*.zig] +indent_size = 4 + +[*.ada] +indent_size = 3 + +[*.adb] +indent_size = 3 + +[*.ads] +indent_size = 3 + +[*.hs] +indent_size = 2 + +[*.res] +indent_size = 2 + +[*.resi] +indent_size = 2 + +[*.ncl] +indent_size = 2 + +[*.rkt] +indent_size = 2 + +[*.scm] +indent_size = 2 + +[*.nix] +indent_size = 2 + +[Justfile] +indent_style = space +indent_size = 4 + diff --git a/showcase/.machine_readable/6a2/STATE.a2ml b/showcase/.machine_readable/6a2/STATE.a2ml new file mode 100644 index 0000000..c2a56fe --- /dev/null +++ b/showcase/.machine_readable/6a2/STATE.a2ml @@ -0,0 +1,17 @@ +# STATE.a2ml — a2ml-showcase +project = "a2ml-showcase" +version = "0.1.0" +last-updated = "2026-04-13" + +[status] +phase = "example" +grade = "E" +readiness = "C" # 8/10 (Content-only) + +[features] +content = "A2ML documentation and template examples" +attestation = "AI Attestation Markup Language (A2ML) showcase" + +[audit] +last-pass = "2026-04-13" +passed = true diff --git a/showcase/.machine_readable/ADJUST.contractile b/showcase/.machine_readable/ADJUST.contractile new file mode 100644 index 0000000..4de9b24 --- /dev/null +++ b/showcase/.machine_readable/ADJUST.contractile @@ -0,0 +1,126 @@ +; SPDX-License-Identifier: MPL-2.0 +; ADJUST.contractile — Accessibility invariants for a2ml-showcase +; "ADJUST" = Accessibility & Digital Justice for Universal Software & Technology +; +; Part of the contractile family: MUST, TRUST, DUST, INTENT, ADJUST +; This file is machine-readable. LLM/SLM agents MUST NOT violate these invariants. + +; ── Definitions ────────────────────────────────────────────────── +; +; ADJUST (noun/verb) +; The accessibility contractile. Defines how software must adapt to serve +; all users regardless of ability, device, or context. Named for the verb +; "adjust" — to make suitable, to adapt, to accommodate — which is the +; core action of accessible design. +; +; Scope: +; ADJUST governs all user-facing interfaces: GUI, TUI, CLI, web, mobile, +; documentation, error messages, and installation flows. It applies to +; both human users and assistive technologies (screen readers, switch +; devices, braille displays, voice control). +; +; Relationship to other contractiles: +; - MUST: ADJUST invariants are a subset of MUST — violating ADJUST +; is a MUST violation. ADJUST exists separately because accessibility +; rules are numerous enough to warrant their own file, and because +; LLMs frequently forget accessibility unless explicitly reminded. +; - TRUST: ADJUST does not affect trust levels. All trust tiers must +; respect ADJUST invariants equally. +; - DUST: Deprecating a feature does not exempt it from ADJUST until +; it is fully removed. Deprecated UI must remain accessible. +; - INTENT: ADJUST supports the anti-purpose "this software is NOT +; only for able-bodied users with modern hardware." +; +; Standard: WCAG 2.2 Level AA (minimum) +; https://www.w3.org/WAI/WCAG22/quickref/?levels=aaa +; +; Why a separate file: +; Experience shows LLMs and developers alike treat accessibility as an +; afterthought. By placing invariants in a contractile that is loaded +; at session start, we make it structurally impossible to forget. +; +; ── End Definitions ────────────────────────────────────────────── + +(adjust-contractile + (version "1.0.0") + (full-name "Accessibility & Digital Justice for Universal Software & Technology") + (standard "WCAG-2.2-AA") + (repo "a2ml-showcase") + + (invariants + ; ── Visual ── + (adjust "colour-contrast-ratio >= 4.5:1 for normal text") + (adjust "colour-contrast-ratio >= 3:1 for large text (18pt+ or 14pt+ bold)") + (adjust "no information conveyed by colour alone") + (adjust "no flashing or strobing content (3 flashes/second max)") + (adjust "text resizable to 200% without loss of content or function") + (adjust "focus indicators visible on all interactive elements") + + ; ── Keyboard ── + (adjust "all interactive elements reachable via keyboard (Tab/Shift+Tab)") + (adjust "no keyboard traps — user can always Tab away") + (adjust "skip navigation link present on pages with repeated blocks") + (adjust "logical focus order follows visual reading order") + + ; ── Screen reader ── + (adjust "all images have meaningful alt text (or alt='' if decorative)") + (adjust "all form inputs have associated labels") + (adjust "ARIA landmarks used for page regions (main, nav, banner, etc.)") + (adjust "dynamic content updates announced via aria-live regions") + (adjust "semantic HTML used (headings, lists, tables) — not div soup") + + ; ── Interactive ── + (adjust "touch targets minimum 44x44px on mobile/touch interfaces") + (adjust "error messages identify the field and describe the error") + (adjust "error messages not conveyed by colour or position alone") + (adjust "form validation provides suggestions for correction") + + ; ── Media ── + (adjust "video has captions (closed or open)") + (adjust "audio-only content has text transcript") + (adjust "no autoplay of media with sound") + + ; ── Motion ── + (adjust "animations respect prefers-reduced-motion media query") + (adjust "no content depends on motion to convey meaning") + + ; ── CLI/TUI ── + (adjust "CLI output must not rely solely on colour (use symbols: [OK] [FAIL])") + (adjust "TUI must support high-contrast mode") + (adjust "all CLI commands support --help with plain-text output") + (adjust "error messages written in plain language, not jargon or codes alone") + + ; ── Documentation ── + (adjust "docs use clear language, short sentences, logical structure") + (adjust "code examples include comments explaining non-obvious steps") + (adjust "diagrams have text descriptions or alt text") + + ; ── Internationalisation (i18n) ── + (adjust "all user-facing strings externalisable for translation") + (adjust "no hardcoded English in error messages — use message keys") + (adjust "date/time/number formats locale-aware") + (adjust "RTL (right-to-left) layout support where applicable") + (adjust "Unicode handled correctly throughout (UTF-8 everywhere)") + ) + + (related-resources + ; LOL — super-parallel corpus crawler for 1500+ languages + ; Use for linguistic data, translation coverage, and i18n validation + (lol "standards/lol — multilingual NLP corpus, see README.adoc") + (polyglot-i18n "polyglot-i18n — i18n framework and WASM translation engine") + ) + + (enforcement + (ci "accessibility linting in quality.yml workflow") + (pr-block "PR blocked if accessibility regression detected") + (tool "axe-core or pa11y for automated checks on web UI") + (tool "CLI output inspected for colour-only signalling") + (manual "manual screen reader test before major releases") + ) + + (notes + "These are MINIMUM requirements. Exceeding them (AAA) is encouraged." + "When in doubt about an accessibility decision, ask — don't guess." + "Accessibility is not optional polish — it is a structural requirement." + ) +) diff --git a/showcase/.machine_readable/INTENT.contractile b/showcase/.machine_readable/INTENT.contractile new file mode 100644 index 0000000..d0f43b4 --- /dev/null +++ b/showcase/.machine_readable/INTENT.contractile @@ -0,0 +1,72 @@ +; SPDX-License-Identifier: MPL-2.0 +; INTENT.contractile — Purpose and scope for a2ml-showcase +; Helps LLM/SLM agents understand what this repo IS and IS NOT. +; +; Part of the contractile family: MUST, TRUST, DUST, INTENT, ADJUST + +; ── Definitions ────────────────────────────────────────────────── +; +; INTENT (noun) +; The purpose contractile. Defines what this repository IS, what it is +; NOT (anti-purpose), and which architectural decisions are load-bearing. +; Without INTENT, LLMs drift into scope creep, reverse key decisions, +; or add features that belong in a different repo. +; +; Scope: +; INTENT governs the conceptual boundaries of the project — its reason +; for existing, its domain, and its relationship to the ecosystem. +; It does NOT specify implementation details (that's MUST and code). +; +; Relationship to other contractiles: +; - MUST: INTENT explains WHY certain MUSTs exist. If you don't +; understand a MUST, read INTENT first. +; - TRUST: The "ask-before-touching" section in INTENT maps directly +; to TRUST.trust-deny for the most sensitive areas. +; - ADJUST: INTENT's anti-purpose should include "this software is +; NOT only for users with perfect vision/hearing/mobility." +; - DUST: When INTENT changes (repo pivots), related DUST entries +; should be created for the abandoned direction. +; +; ── End Definitions ────────────────────────────────────────────── + +(intent-contractile + (version "1.0.0") + (repo "a2ml-showcase") + + ; === Purpose (what this repo IS) === + (purpose + "{{ONE_PARAGRAPH_PURPOSE}}" + ) + + ; === Anti-Purpose (what this repo is NOT — prevents scope creep) === + (anti-purpose + "{{ONE_PARAGRAPH_ANTI_PURPOSE}}" + ; Examples: + ; "This is NOT a general-purpose database — it solves one specific problem." + ; "This is NOT a framework — it is a library with a focused API." + ; "This does NOT handle authentication — that is delegated to [other repo]." + ) + + ; === Key Architectural Decisions That Must Not Be Reversed === + (architectural-invariants + ; *REMINDER: List the foundational decisions* + ; ("Idris2 for ABI definitions — dependent types prove interface correctness") + ; ("Zig for FFI — zero-cost C ABI compatibility") + ; ("Elixir for supervision — OTP fault tolerance") + ) + + ; === Sensitive Areas (if in doubt, ask) === + (ask-before-touching + ; *REMINDER: List areas where LLMs should check before modifying* + ; "src/abi/ — formal proofs, changes require re-verification" + ; "ffi/zig/ — C ABI boundary, changes affect all language bindings" + ; ".machine_readable/ — checkpoint files, format is specified" + ) + + ; === Ecosystem Position === + (ecosystem + (belongs-to "{{MONOREPO_OR_STANDALONE}}") + (depends-on ("{{DEP1}}" "{{DEP2}}")) + (depended-on-by ("{{CONSUMER1}}" "{{CONSUMER2}}")) + ) +) diff --git a/showcase/.machine_readable/MUST.contractile b/showcase/.machine_readable/MUST.contractile new file mode 100644 index 0000000..932819f --- /dev/null +++ b/showcase/.machine_readable/MUST.contractile @@ -0,0 +1,91 @@ +; SPDX-License-Identifier: MPL-2.0 +; MUST.contractile — Baseline invariants for a2ml-showcase +; These constraints MUST NOT be violated. K9 validators enforce them. +; +; Part of the contractile family: MUST, TRUST, DUST, INTENT, ADJUST + +; ── Definitions ────────────────────────────────────────────────── +; +; MUST (noun/verb) +; The hard-constraint contractile. Defines invariants that are structurally +; required for the repository to function correctly and safely. Violating +; a MUST is always a bug — there are no "soft" MUSTs. +; +; Scope: +; MUST governs code, configuration, CI, and structure. It does NOT govern +; style, preference, or approach — those belong in CLAUDE.md or coding +; standards. MUST is for things that break the project if violated. +; +; Relationship to other contractiles: +; - TRUST: MUST is enforced regardless of trust level. Even maximal-trust +; agents cannot violate MUST constraints. +; - ADJUST: All ADJUST invariants are implicitly MUST invariants too. +; ADJUST exists separately for visibility. +; - INTENT: MUST protects the architectural decisions described in INTENT. +; - DUST: When a feature enters DUST (deprecation), its MUST constraints +; remain active until the feature is fully removed. +; +; Enforcement: +; K9 validators in contractiles/k9/ machine-check MUST constraints. +; CI runs these on every PR. Violations block merge. +; +; ── End Definitions ────────────────────────────────────────────── + +(must-contractile + (version "1.0.0") + (repo "a2ml-showcase") + + ; === Universal Invariants (apply to ALL repos) === + + (invariants + ; Paths + (must "no hardcoded absolute paths (/home/*, /mnt/*, /var/mnt/*)") + (must "all paths use env vars, XDG dirs, or relative references") + + ; Language policy + (must "no new TypeScript files") + (must "no new Python files") + (must "no new Go files") + (must "no npm/bun/yarn/pnpm dependencies — Deno only") + + ; Dangerous patterns + (must "no believe_me (Idris2)") + (must "no assert_total (Idris2)") + (must "no Admitted (Coq)") + (must "no sorry (Lean)") + (must "no unsafeCoerce (Haskell)") + (must "no Obj.magic (OCaml)") + (must "no unsafe {} blocks without safety comment (Rust)") + + ; License + (must "SPDX-License-Identifier header on every source file") + (must "no removal or modification of LICENSE file") + + ; Structure + (must ".machine_readable/ directory preserved") + (must "0-AI-MANIFEST.a2ml preserved") + (must "no SCM files in repo root — only in .machine_readable/") + + ; CI + (must "no removal of CI workflows without explicit approval") + (must "all GitHub Actions SHA-pinned") + + ; Code quality + (must "tests must not be deleted or weakened") + (must "generated code in generated/ directory only") + (must "no introduction of OWASP top 10 vulnerabilities") + + ; ABI/FFI (if applicable) + (must "no modification of ABI contracts without proof update") + (must "no removal of formal verification proofs") + ) + + ; === Project-Specific Invariants === + ; *REMINDER: Add invariants specific to this repo* + ; (must "# Add project-specific invariants here") + + (enforcement + (k9-validator "contractiles/k9/must-check.k9.ncl") + (ci "quality.yml runs must-check on every PR") + ) +) diff --git a/showcase/.machine_readable/STATE.a2ml b/showcase/.machine_readable/STATE.a2ml new file mode 100644 index 0000000..fee8482 --- /dev/null +++ b/showcase/.machine_readable/STATE.a2ml @@ -0,0 +1,37 @@ +; SPDX-License-Identifier: MPL-2.0 +; Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) + +(state + (metadata + (version "1.0") + (updated "2026-04-04") + (crg-grade "C")) + + (project-context + (name "a2ml-showcase") + (type "showcase-documentation") + (purpose "Demonstrate A2ML format capabilities with real-world examples") + (status "stable")) + + (current-position + (completion-percentage 95) + (recent-achievement "Implemented CRG Grade C test suite") + (test-status "all-passing")) + + (route-to-mvp + (phases + (("Phase 1" "Documentation & examples" "COMPLETE")) + (("Phase 2" "A2ML validation" "COMPLETE")) + (("Phase 3" "Test coverage to Grade C" "COMPLETE")))) + + (blockers-and-issues + (active-blockers ()) + (resolved-issues + ("Test coverage added" "2026-04-04"))) + + (critical-next-actions + (next "Maintain example accuracy as A2ML evolves") + (next "Monitor for new attestation patterns to document")) + + (session-history + (("2026-04-04" "Added CRG C test suite (18 tests, all passing)")))) diff --git a/showcase/.machine_readable/TRUST.contractile b/showcase/.machine_readable/TRUST.contractile new file mode 100644 index 0000000..79018bb --- /dev/null +++ b/showcase/.machine_readable/TRUST.contractile @@ -0,0 +1,80 @@ +; SPDX-License-Identifier: MPL-2.0 +; TRUST.contractile — Trust boundaries for a2ml-showcase +; Defines what LLM/SLM agents are trusted to do without asking. +; +; Part of the contractile family: MUST, TRUST, DUST, INTENT, ADJUST + +; ── Definitions ────────────────────────────────────────────────── +; +; TRUST (noun/verb) +; The permission contractile. Defines the boundary between what an AI +; agent may do autonomously and what requires human approval. Trust is +; graduated — not binary — with four levels from minimal to maximal. +; +; Trust levels: +; - maximal: Agent may read, build, test, lint, format, heal freely. +; Only destructive/external actions require approval. +; - standard: Agent may read and build. Test/lint need approval. +; - restricted: Agent may read only. All modifications need approval. +; - minimal: Agent may read specific files only. Everything else blocked. +; +; Scope: +; TRUST governs AI agent behaviour only. It does not affect human +; contributors — humans follow CONTRIBUTING.md and GOVERNANCE.adoc. +; +; Relationship to other contractiles: +; - MUST: Trust never overrides MUST. Even at maximal trust, MUST +; violations are blocked. +; - ADJUST: Trust does not exempt from ADJUST. All trust tiers must +; produce accessible output. +; - INTENT: TRUST.trust-deny protects the sensitive areas listed in +; INTENT.ask-before-touching. +; - DUST: Deprecated features have the same trust rules as active ones. +; +; ── End Definitions ────────────────────────────────────────────── + +(trust-contractile + (version "1.0.0") + (repo "a2ml-showcase") + + (trust-level "maximal") ; maximal | standard | restricted | minimal + + ; === Maximal Trust (default) === + ; LLM may freely do these without asking: + (trust-actions + "read" ; Read any file in the repo + "build" ; Run build commands + "test" ; Run test suites + "lint" ; Run linters and formatters + "format" ; Auto-format code + "doctor" ; Run self-diagnostics + "heal" ; Attempt automatic repair + "git-status" ; Check git status + "git-diff" ; View diffs + "git-log" ; View history + ) + + ; === Denied Actions (always require human approval) === + (trust-deny + "delete-branch" ; Could lose work + "force-push" ; Overwrites history + "modify-ci-secrets" ; Security sensitive + "publish" ; External visibility + "push-to-main" ; Protected branch + "delete-files-bulk" ; More than 5 files at once + "modify-license" ; Legal implications + "modify-security-policy" ; Security implications + "remove-proofs" ; Formal verification regression + "disable-ci-checks" ; Safety regression + ) + + ; === Trust Boundary === + (trust-boundary "repo") ; LLM confined to this repo unless explicitly told otherwise + + ; === Override === + ; Repos requiring tighter trust override these settings with justification: + ; (override + ; (trust-level "restricted") + ; (reason "Contains production secrets / handles PII / etc.") + ; ) +) diff --git a/showcase/.machine_readable/agent_instructions/README.adoc b/showcase/.machine_readable/agent_instructions/README.adoc new file mode 100644 index 0000000..1cc7487 --- /dev/null +++ b/showcase/.machine_readable/agent_instructions/README.adoc @@ -0,0 +1,41 @@ +// SPDX-License-Identifier: CC-BY-SA-4.0 +// Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) += Agent Instructions +:toc: preamble + +Methodology-aware configuration for AI agents. Read by any AI agent +(Claude, Gemini, Copilot, etc.) at session start. + +== Files + +[cols="1,3"] +|=== +| File | Purpose + +| `methodology.a2ml` +| Default mode, invariants, ring ceiling, priority weights, convergent budget + +| `coverage.a2ml` +| Session coverage tracking — what was visited, what was skipped, what has MUSTs + +| `debt.a2ml` +| Meander debt — things found but not fixed, carried between sessions +|=== + +== How Agents Use These + +1. Read `methodology.a2ml` at session start — know mode, invariants, ceiling +2. Read `coverage.a2ml` — know what was visited last time, what was skipped +3. Read `debt.a2ml` — know what's outstanding from previous sessions +4. At session end, update `coverage.a2ml` and `debt.a2ml` + +== Relationship to Other Files + +* `AGENTIC.a2ml` says WHAT agents can do (permissions, gating) +* `agent_instructions/` says HOW agents should work (methodology) +* `bot_directives/` says what the gitbot-fleet does (fleet-specific) +* `CLAUDE.md` says how Claude specifically should work (Claude-specific) + +== Reference + +ADR-002 in `standards/agentic-a2ml/docs/ADR-002-methodology-layer.adoc` diff --git a/showcase/.machine_readable/agent_instructions/coverage.a2ml b/showcase/.machine_readable/agent_instructions/coverage.a2ml new file mode 100644 index 0000000..6979664 --- /dev/null +++ b/showcase/.machine_readable/agent_instructions/coverage.a2ml @@ -0,0 +1,61 @@ +# SPDX-License-Identifier: MPL-2.0 +# Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) +# +# coverage.a2ml — Session coverage tracking +# Updated at the end of each AI agent session. +# Persists what was visited, what was skipped, and what has MUSTs. +# +# Reference: ADR-002 in standards/agentic-a2ml/docs/ + +[metadata] +version = "1.0.0" +last-updated = "2026-03-24" + +# ============================================================================ +# COVERAGE STATE +# ============================================================================ +# Updated by agents at session end. Tracks which components have been +# visited and which have known MUSTs that were skipped. + +[coverage] +total-components = 0 +visited-components = 0 +coverage-percent = 0 + +# ============================================================================ +# VISITED COMPONENTS +# ============================================================================ +# Component → session date + ring reached +# Agents add entries as they work through components. +# +# Example: +# [coverage.visited.emergency-room] +# date = "2026-03-23" +# ring = 2 +# fixes = 3 +# notes = "boot-guardian built, shutdown-marshal built" + +# ============================================================================ +# SKIPPED COMPONENTS WITH MUSTS +# ============================================================================ +# Components with known MUSTs that were not visited in the most recent session. +# These become P1 inputs for the next session's Phase 0. +# +# Example: +# [coverage.skipped-musts.session-sentinel] +# priority = "P0" +# issue = "56 SIGABRTs in 4 days, D-Bus race condition" +# discovered = "2026-03-23" + +# ============================================================================ +# CHERRY-PICKING AUDIT +# ============================================================================ +# At session end, agents report whether they chose easy work over hard work. +# This is the accountability mechanism for the weighted priority system. +# +# [coverage.cherry-picking] +# easy-high-completed = 3 +# hard-high-completed = 1 +# easy-low-completed = 2 +# hard-low-deferred = 4 +# assessment = "Correctly prioritised — all MUST items addressed before COULDs" diff --git a/showcase/.machine_readable/agent_instructions/debt.a2ml b/showcase/.machine_readable/agent_instructions/debt.a2ml new file mode 100644 index 0000000..c0238c5 --- /dev/null +++ b/showcase/.machine_readable/agent_instructions/debt.a2ml @@ -0,0 +1,49 @@ +# SPDX-License-Identifier: MPL-2.0 +# Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) +# +# debt.a2ml — Meander debt list +# Things found but not fixed. Carried between sessions. +# Becomes the next session's Phase 0 input. +# +# Reference: ADR-002 in standards/agentic-a2ml/docs/ + +[metadata] +version = "1.0.0" +last-updated = "2026-03-24" + +# ============================================================================ +# DEBT ITEMS +# ============================================================================ +# Each item has: component, issue, effort (easy|medium|hard), impact (high|medium|low), +# priority (should|could), and discovered date. +# +# Items are consumed (removed) when fixed. New items are added at session end. +# The debt list prevents the "one more wave" loop — found things are persisted, +# not forgotten, and not used as justification for infinite meandering. + +# ============================================================================ +# SHOULD — would fix next wave +# ============================================================================ +# These are inputs for the next session if the user says "keep going". +# +# Example: +# [[debt.should]] +# component = "system-tools/monitoring/observatory" +# issue = "Stale duplicate of root observatory/" +# effort = "easy" +# impact = "medium" +# discovered = "2026-03-23" + +# ============================================================================ +# COULD — would fix eventually +# ============================================================================ +# These are low-priority items that don't justify a session on their own. +# They get picked up when an agent is in the area for other reasons. +# +# Example: +# [[debt.could]] +# component = "cicada" +# issue = "RSR_OUTLINE.adoc references banned AGPL-3.0" +# effort = "easy" +# impact = "low" +# discovered = "2026-03-23" diff --git a/showcase/.machine_readable/agent_instructions/methodology.a2ml b/showcase/.machine_readable/agent_instructions/methodology.a2ml new file mode 100644 index 0000000..754f357 --- /dev/null +++ b/showcase/.machine_readable/agent_instructions/methodology.a2ml @@ -0,0 +1,107 @@ +# SPDX-License-Identifier: MPL-2.0 +# Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) +# +# methodology.a2ml — AI agent methodology configuration +# Declares how agents should approach work in this repository. +# Read at session start by any AI agent (Claude, Gemini, Copilot, etc.) +# +# Reference: ADR-002 in standards/agentic-a2ml/docs/ + +[metadata] +version = "1.0.0" +last-updated = "2026-03-24" +spec = "https://github.com/hyperpolymath/standards/blob/main/agentic-a2ml/docs/ADR-002-methodology-layer.adoc" + +# ============================================================================ +# MODE SELECTION +# ============================================================================ +# convergent: find gaps, fill them, build infrastructure (default for ops/infra) +# divergent: find what's strongest, push it further (for research/creative) +# hybrid: audit 20% of budget, then focus 80% on top MUSTs (default for most) + +[methodology] +default-mode = "hybrid" +ring-ceiling = 2 # Hard ceiling for ring expansion (0-3) +wave-cap = 2 # Max waves before requiring user "keep going" +spike-required = true # Every session must ship code, not just designs + +# ============================================================================ +# PRIORITY WEIGHTS +# ============================================================================ +# MUST (3x): Blocking the current work → fix immediately +# SHOULD (2x): Degrading quality of current work → fix if in zone +# COULD (1x): Improving quality of adjacent work → add to debt list + +[methodology.priority-weights] +must = 3 +should = 2 +could = 1 + +# ============================================================================ +# CONVERGENT BUDGET (when mode = convergent or hybrid) +# ============================================================================ +# How to allocate effort across work types. +# Prevents over-polishing docs while structural work waits. + +[methodology.convergent-budget] +structural = 70 # % for new modules, compilation fixes, wiring, integration +corrective = 20 # % for bugs found, broken imports, stale references +perfective = 10 # % for SPDX headers, doc updates, formatting, style + +# ============================================================================ +# UNIQUE STRENGTH (when mode = divergent) +# ============================================================================ +# What makes this project special. Agents should DEEPEN this, not broaden it. +# Customise this per project — the template default is generic. + +[methodology.unique-strength] +description = "{{PROJECT_UNIQUE_STRENGTH}}" +deepen-not-broaden = true + +# ============================================================================ +# DIVERGENT INVARIANTS +# ============================================================================ +# Constraints that divergent mode must NOT violate. +# These are the riverbanks — diverge within them, not across. +# "Amplify uniqueness" means deepen, not broaden. +# +# Test before any divergent action: +# "Does this deepen the existing strength, or add a parallel strength?" +# If parallel → stop. Note as cross-project insight. + +[methodology.divergent-invariants] +rules = [ + # Customise per project. Examples: + # "Idris2 only for formal verification — no Lean4, Coq, Agda", + # "believe_me count must remain zero", + # "FFI architecture: Idris2 → RefC → Zig → C ABI (no shortcuts)", +] + +# Optional: language invariant for the core strength +# If set, divergent mode will not introduce other languages for this purpose +# language-invariant = "idris2" + +# ============================================================================ +# CONSTRAINT HINTS +# ============================================================================ +# Help Phase 0 find the critical chain faster. +# Updated at session end with newly discovered constraints. + +[methodology.known-constraints] +constraints = [ + # Customise per project. Examples: + # "End-to-end build has never been verified", + # "libproject.so does not exist yet — all bindings call stubs", +] + +# ============================================================================ +# STATE FILE VALIDATION +# ============================================================================ +# Phase 0 reads STATE.a2ml first but it may be broken. +# These rules detect corrupt/template/stale state files. + +[methodology.state-validation] +reject-if-contains = ["{{PLACEHOLDER}}", "{{PROJECT}}", "rsr-template-repo"] +reject-if-project-name-mismatch = true +staleness-threshold-days = 90 +fallback-files = ["TODO.md", "TODO.adoc", "ROADMAP.adoc", "README.adoc"] diff --git a/showcase/.machine_readable/anchors/ANCHOR.a2ml b/showcase/.machine_readable/anchors/ANCHOR.a2ml new file mode 100644 index 0000000..a622921 --- /dev/null +++ b/showcase/.machine_readable/anchors/ANCHOR.a2ml @@ -0,0 +1,18 @@ +# ⚓ ANCHOR: a2ml-showcase +# This is the canonical authority for the a2ml-showcase repository. + +id: "org.hyperpolymath.a2ml-showcase" +version: "1.0.0" +clade: "unknown" +status: "active" + +# SSG Configuration (Unified boj-server build) +ssg: + engine: "casket" + output_dir: "public" + boj_trigger: true + cartridge: "ssg-mcp" + +# Relationships +parents: + - "org.hyperpolymath.boj-server" diff --git a/showcase/.machine_readable/contractiles/adjust/adjustfile.a2ml b/showcase/.machine_readable/contractiles/adjust/adjustfile.a2ml new file mode 100644 index 0000000..3f4ac35 --- /dev/null +++ b/showcase/.machine_readable/contractiles/adjust/adjustfile.a2ml @@ -0,0 +1,15 @@ +// adjustfile.a2ml for a2ml-showcase +// SPDX-License-Identifier: MPL-2.0 +// Generated: 2026-04-08T20:03:43+01:00 + +adjustfile { + name: "a2ml-showcase" + version: "1.0.0" + description: "adjustfile contractile for a2ml-showcase" + + // Basic adjustfile configuration + enabled: true + + // Repository-specific adjust settings will be added here + // This preserves the existing contractile structure and naming convention +} diff --git a/showcase/.machine_readable/contractiles/bust/Bustfile.a2ml b/showcase/.machine_readable/contractiles/bust/Bustfile.a2ml new file mode 100644 index 0000000..d26a1ef --- /dev/null +++ b/showcase/.machine_readable/contractiles/bust/Bustfile.a2ml @@ -0,0 +1,28 @@ +// Bustfile.a2ml — meta-repo bust contractile (breakage / rollback) +// SPDX-License-Identifier: MPL-2.0 + +Bust { + name: "a2ml-showcase" + version: "1.0.0" + description: "Rollback procedures when something breaks in the meta-repo" + + scenarios: { + "bad-pointer-bump": "git revert in meta-repo; child repo itself untouched" + "submodule-pointer-points-at-missing-sha": "git submodule update --init --checkout resets child to parent-recorded SHA; OR revert the stale bump commit" + "submodule-orphan-after-local-only-commit": "roll back locally with git reset to before the stranded commit; fix remote situation before re-attempting" + "accidental-private-repo-content-leaked-to-public-submodule": "hard-rotate the leaked secret immediately; git-filter-repo or BFG on the submodule's own history; public re-publication only after rotation complete" + } + + escalation-ladder: [ + "1. revert the meta-repo commit (reversible, low blast radius)", + "2. reset the local submodule clone (affects only local workspace)", + "3. force-push to main — PROHIBITED without explicit user confirmation (violates branch protection)", + "4. registry-level (delete/archive the GitHub repo) — human-only action, never by AI" + ] + + backup-points: [ + "GitHub serves as the durable backup for every submodule's own history", + "Meta-repo history on origin/main is the durable backup for pointer state", + "Local backup tags (backup/pre--) retained on risky rewrites" + ] +} diff --git a/showcase/.machine_readable/contractiles/bust/bust.ncl b/showcase/.machine_readable/contractiles/bust/bust.ncl new file mode 100644 index 0000000..fc8cb8c --- /dev/null +++ b/showcase/.machine_readable/contractiles/bust/bust.ncl @@ -0,0 +1,66 @@ +# SPDX-License-Identifier: MPL-2.0 +# Bust — error-handling / failure-recovery runner +# +# Pairs with: Bustfile.a2ml (same directory) +# Verb: bust +# Semantics: every declared failure mode must have a recovery path that has +# been exercised. Runner injects failures (via declared probes) +# and verifies the recovery path works. Hard gate on any +# failure-mode with missing or broken recovery. +# CLI: `contractile bust check` → list failure modes + recovery status +# `contractile bust drill` → inject declared failures, verify recovery +# +# Anything else in this directory is human-only notes/archive; machines ignore. +# +# Base: ../_base.ncl provides pedigree_schema, run_defaults, probe_schema. +# See: docs/CONTRACTILE-SPEC.adoc + +let base = import "../_base.ncl" in + +{ + pedigree = base.pedigree_schema & { + contractile_verb = "bust", + semantics = "error handling + failure recovery", + security = { + leash = 'Kennel, + trust_level = "controlled failure injection; scoped to system-under-test", + allow_network = false, + allow_filesystem_write = true, # drills may write transient state (tmp dirs, test DBs) + allow_subprocess = true, + injection_scope = "system-under-test-only", + }, + metadata = { + name = "bust-runner", + version = "1.0.0", + description = "Exercises declared failure modes and verifies recovery paths. Hard-gates on any failure mode without working recovery.", + paired_xfile = "Bustfile.a2ml", + author = "Jonathan D.A. Jewell ", + }, + }, + + schema = { + failure_modes + | Array { + id | String, + description | String, + class | [| 'network, 'disk_full, 'oom, 'timeout, 'partial_write, 'panic, 'crash, 'rollback, 'concurrency |], + # TODO: migrate to base.probe_schema (structured probe) when CLI supports it + injection_probe | String, # command that deterministically causes this failure + # TODO: migrate to base.probe_schema (structured probe) when CLI supports it + recovery_probe | String, # command that verifies recovery (exit 0 = recovered) + expected_recovery_time_seconds | Number | default = 30, + # status_core values: 'declared, 'verified, 'failing; bust adds 'drilled + status | [| 'declared, 'drilled, 'verified, 'failing |] | default = 'declared, + notes | String | optional, + }, + }, + + # Runner behaviour — inherits from base.run_defaults. + # bust adds record_recovery_times for performance tier feeding. + run = base.run_defaults & { + on_any_fail = "exit-nonzero", # missing or broken recovery blocks merge + report_format = "a2ml", + emit_summary = true, + record_recovery_times = true, # feeds the performance tier + }, +} diff --git a/showcase/.machine_readable/contractiles/dust/Dustfile.a2ml b/showcase/.machine_readable/contractiles/dust/Dustfile.a2ml new file mode 100644 index 0000000..0d619ee --- /dev/null +++ b/showcase/.machine_readable/contractiles/dust/Dustfile.a2ml @@ -0,0 +1,22 @@ +# SPDX-License-Identifier: MPL-2.0 +# Dustfile — Cleanup and Hygiene Contract + +[dustfile] +version = "1.0.0" +format = "a2ml" + +[cleanup] +stale-branch-policy = "delete-after-merge" +artifact-retention = "90-days" +cache-policy = "clear-on-release" + +[hygiene] +linting = "required" +formatting = "required" +dead-code-removal = "encouraged" +todo-tracking = "tracked-in-issues" + +[reversibility] +backup-before-destructive = true +rollback-mechanism = "git-revert" +data-retention-policy = "preserve-30-days" diff --git a/showcase/.machine_readable/contractiles/dust/dustfile.a2ml b/showcase/.machine_readable/contractiles/dust/dustfile.a2ml new file mode 100644 index 0000000..928be74 --- /dev/null +++ b/showcase/.machine_readable/contractiles/dust/dustfile.a2ml @@ -0,0 +1,15 @@ +// dustfile.a2ml for a2ml-showcase +// SPDX-License-Identifier: MPL-2.0 +// Generated: 2026-04-08T20:03:43+01:00 + +dustfile { + name: "a2ml-showcase" + version: "1.0.0" + description: "dustfile contractile for a2ml-showcase" + + // Basic dustfile configuration + enabled: true + + // Repository-specific dust settings will be added here + // This preserves the existing contractile structure and naming convention +} diff --git a/showcase/.machine_readable/contractiles/intend/intendfile.a2ml b/showcase/.machine_readable/contractiles/intend/intendfile.a2ml new file mode 100644 index 0000000..24ca929 --- /dev/null +++ b/showcase/.machine_readable/contractiles/intend/intendfile.a2ml @@ -0,0 +1,15 @@ +// intendfile.a2ml for a2ml-showcase +// SPDX-License-Identifier: MPL-2.0 +// Generated: 2026-04-08T20:03:43+01:00 + +intendfile { + name: "a2ml-showcase" + version: "1.0.0" + description: "intendfile contractile for a2ml-showcase" + + // Basic intendfile configuration + enabled: true + + // Repository-specific intend settings will be added here + // This preserves the existing contractile structure and naming convention +} diff --git a/showcase/.machine_readable/contractiles/lust/lustfile.a2ml b/showcase/.machine_readable/contractiles/lust/lustfile.a2ml new file mode 100644 index 0000000..3b0318a --- /dev/null +++ b/showcase/.machine_readable/contractiles/lust/lustfile.a2ml @@ -0,0 +1,15 @@ +// lustfile.a2ml for a2ml-showcase +// SPDX-License-Identifier: MPL-2.0 +// Generated: 2026-04-08T20:03:43+01:00 + +lustfile { + name: "a2ml-showcase" + version: "1.0.0" + description: "lustfile contractile for a2ml-showcase" + + // Basic lustfile configuration + enabled: true + + // Repository-specific lust settings will be added here + // This preserves the existing contractile structure and naming convention +} diff --git a/showcase/.machine_readable/contractiles/must/mustfile.a2ml b/showcase/.machine_readable/contractiles/must/mustfile.a2ml new file mode 100644 index 0000000..a87cdd2 --- /dev/null +++ b/showcase/.machine_readable/contractiles/must/mustfile.a2ml @@ -0,0 +1,15 @@ +// mustfile.a2ml for a2ml-showcase +// SPDX-License-Identifier: MPL-2.0 +// Generated: 2026-04-08T20:03:43+01:00 + +mustfile { + name: "a2ml-showcase" + version: "1.0.0" + description: "mustfile contractile for a2ml-showcase" + + // Basic mustfile configuration + enabled: true + + // Repository-specific must settings will be added here + // This preserves the existing contractile structure and naming convention +} diff --git a/showcase/.machine_readable/contractiles/trust/Trustfile.a2ml b/showcase/.machine_readable/contractiles/trust/Trustfile.a2ml new file mode 100644 index 0000000..0c95e15 --- /dev/null +++ b/showcase/.machine_readable/contractiles/trust/Trustfile.a2ml @@ -0,0 +1,22 @@ +# SPDX-License-Identifier: MPL-2.0 +# Trustfile — Integrity and Provenance Contract + +[trustfile] +version = "1.0.0" +format = "a2ml" + +[provenance] +source-control = "git" +forge = "github" +ci-verified = true +signing-policy = "commit-signing-preferred" + +[integrity] +spdx-compliant = true +license-audit = "required" +dependency-pinning = "sha-pinned" + +[verification] +reproducible-builds = "goal" +sbom-generation = "required" +attestation = "sigstore-preferred" diff --git a/showcase/.machine_readable/contractiles/trust/trustfile.a2ml b/showcase/.machine_readable/contractiles/trust/trustfile.a2ml new file mode 100644 index 0000000..5b8f4c9 --- /dev/null +++ b/showcase/.machine_readable/contractiles/trust/trustfile.a2ml @@ -0,0 +1,15 @@ +// trustfile.a2ml for a2ml-showcase +// SPDX-License-Identifier: MPL-2.0 +// Generated: 2026-04-08T20:03:43+01:00 + +trustfile { + name: "a2ml-showcase" + version: "1.0.0" + description: "trustfile contractile for a2ml-showcase" + + // Basic trustfile configuration + enabled: true + + // Repository-specific trust settings will be added here + // This preserves the existing contractile structure and naming convention +} diff --git a/showcase/.machine_readable/integrations/feedback-o-tron.a2ml b/showcase/.machine_readable/integrations/feedback-o-tron.a2ml new file mode 100644 index 0000000..5381604 --- /dev/null +++ b/showcase/.machine_readable/integrations/feedback-o-tron.a2ml @@ -0,0 +1,13 @@ +# SPDX-License-Identifier: MPL-2.0 +# Feedback-o-Tron Integration — Autonomous Bug Reporting + +[integration] +name = "feedback-o-tron" +type = "bug-reporter" +repository = "https://github.com/hyperpolymath/feedback-o-tron" + +[reporting-config] +platforms = ["github", "gitlab", "bugzilla"] +deduplication = true +audit-logging = true +auto-file-upstream = "on-external-dependency-failure" diff --git a/showcase/.machine_readable/integrations/proven.a2ml b/showcase/.machine_readable/integrations/proven.a2ml new file mode 100644 index 0000000..9af33ff --- /dev/null +++ b/showcase/.machine_readable/integrations/proven.a2ml @@ -0,0 +1,18 @@ +# SPDX-License-Identifier: MPL-2.0 +# Proven Integration — Formally Verified Safety Library + +[integration] +name = "proven" +type = "safety-library" +repository = "https://github.com/hyperpolymath/proven" +version = "1.2.0" + +[binding-policy] +approach = "thin-ffi-wrapper" +unsafe-patterns = "replace-with-proven-equivalent" +modules-available = ["SafeMath", "SafeString", "SafeJSON", "SafeURL", "SafeRegex", "SafeSQL", "SafeFile", "SafeTemplate", "SafeCrypto"] + +[adoption-guidance] +priority = "high" +scope = "all-string-json-url-crypto-operations" +migration = "incremental — replace unsafe patterns as encountered" diff --git a/showcase/.machine_readable/integrations/verisimdb.a2ml b/showcase/.machine_readable/integrations/verisimdb.a2ml new file mode 100644 index 0000000..164c522 --- /dev/null +++ b/showcase/.machine_readable/integrations/verisimdb.a2ml @@ -0,0 +1,15 @@ +# SPDX-License-Identifier: MPL-2.0 +# VeriSimDB Feed — Cross-Repo Analytics Data Store + +[integration] +name = "verisimdb" +type = "data-feed" +repository = "https://github.com/hyperpolymath/nextgen-databases" +data-store = "verisimdb-data" + +[feed-config] +emit-scan-results = true +emit-build-metrics = true +emit-dependency-graph = true +format = "hexad" +destination = "verisimdb-data/feeds/" diff --git a/showcase/.machine_readable/integrations/vexometer.a2ml b/showcase/.machine_readable/integrations/vexometer.a2ml new file mode 100644 index 0000000..238b3d2 --- /dev/null +++ b/showcase/.machine_readable/integrations/vexometer.a2ml @@ -0,0 +1,18 @@ +# SPDX-License-Identifier: MPL-2.0 +# Vexometer Integration — Irritation Surface Analysis + +[integration] +name = "vexometer" +type = "friction-measurement" +repository = "https://github.com/hyperpolymath/vexometer" + +[measurement-config] +dimensions = 10 +emit-isa-reports = true +lazy-eliminator = true +satellite-interventions = true + +[hooks] +cli-tools = "measure-on-error" +ui-panels = "measure-on-interaction" +build-failures = "measure-on-failure" diff --git a/showcase/.well-known/ai.txt b/showcase/.well-known/ai.txt new file mode 100644 index 0000000..334b406 --- /dev/null +++ b/showcase/.well-known/ai.txt @@ -0,0 +1,18 @@ +# SPDX-License-Identifier: MPL-2.0 +# ai.txt - AI interaction policy +# See: https://site.spawning.ai/spawning-ai-txt + +User-Agent: * +Disallow-Training: yes +Disallow-Summarization: no +Disallow-Generation: yes + +# This project's code is licensed under MPL-2.0. +# AI agents may read and analyze this code for assisting contributors. +# AI agents must NOT use this code for model training without explicit consent. +# AI agents must preserve Emotional Lineage per PMPL Section 3. +# +# For AI agent integration instructions, see: +# 0-AI-MANIFEST.a2ml (universal AI entry point) +# AI.a2ml (Claude-specific instructions) +# .machine_readable/ (structured project state) diff --git a/showcase/.well-known/humans.txt b/showcase/.well-known/humans.txt new file mode 100644 index 0000000..5b6216d --- /dev/null +++ b/showcase/.well-known/humans.txt @@ -0,0 +1,14 @@ +# SPDX-License-Identifier: MPL-2.0 +# humanstxt.org + +/* TEAM */ +Maintainer: Jonathan D.A. Jewell (hyperpolymath) +Contact: j.d.a.jewell@open.ac.uk +From: United Kingdom + +/* SITE */ +Last update: 2026-03-28 +Standards: RSR (Rhodium Standard Repository) +License: MPL-2.0 (Palimpsest MPL) +Components: Idris2 ABI, Zig FFI +Tools: just, Podman, Guix diff --git a/showcase/.well-known/security.txt b/showcase/.well-known/security.txt new file mode 100644 index 0000000..71044fa --- /dev/null +++ b/showcase/.well-known/security.txt @@ -0,0 +1,28 @@ +-----BEGIN PGP SIGNED MESSAGE----- +Hash: SHA512 + +# Security contact for a2ml.net — RFC 9116 +# https://a2ml.net/.well-known/security.txt + +Contact: mailto:j.d.a.jewell@open.ac.uk +Encryption: openpgp4fpr:4A03639C1EB1F86C7F0C97A91835A14A2867091E +Expires: 2027-06-21T00:00:00Z +Preferred-Languages: en +Canonical: https://a2ml.net/.well-known/security.txt +Policy: https://github.com/hyperpolymath/a2ml-showcase/blob/main/SECURITY.md +-----BEGIN PGP SIGNATURE----- + +iQIzBAEBCgAdFiEEljlFF1RJblHWtTfK0RkBfr9pWrEFAmo5socACgkQ0RkBfr9p +WrFknA//WPsYI55diuLoE2GVMu7t0MWoxr+ZkVB3tJK29gNDxo865pO1Yz2hy0vL +/wSEDRed1WRFlaSGosjw07IVs2C58yw9X2tHnVa57U+gaObqHIEE+TM1nd7ynZXF +sjKZcjP06wt3uIL28fOaNbNXuNeaq6Len+2dnfq/sgsWms+MPXbQmqXiGmID0srb +26ES+NEQnL/FMaht7YoO67/m/o+33R36eItRO1bVnhTvjBrWXOErPK0g3tThIqyj +t+0JTkh4P68I+dAdCthZWebtk4L17YRvI5EQgooCAvI5DWhIZhi4rrQ+iscPOLhk +DIHaQnfAy2JKb9wu1bTx2zE/YeNGmSe8DgEDV2nVVdyBAVkvONg24MJeBEVtNfZV +Q3UgNnoMooS34wXR9Du0/fcD8ZJ8stpXuhf1Ylco+xURMU25Ct70jfCrO593ZMJP +JUJbKqmp+IGykhqTit0d6c7L3reTBETdhidLJKqAdiEYWqaX+rFluSV0wHAXK/Ge +h39YZyCEFZSKOzslzwnAlDbURAVjsXFFN5hMvniLlKs5qypbp6JrB8pTkpHG5D/1 +h2qndLYTVb+A74UT+8fnCBtZwZUnUwAAcQKSTVt44igFrkiZ1qFgARppo/xboM+u +Qc8Wv7c3mwfvFRK79kYoyeacno6gqHDh7aqJGnrLIzTca4txzsU= +=9jaq +-----END PGP SIGNATURE----- diff --git a/showcase/0-AI-MANIFEST.a2ml b/showcase/0-AI-MANIFEST.a2ml new file mode 100644 index 0000000..64e26d7 --- /dev/null +++ b/showcase/0-AI-MANIFEST.a2ml @@ -0,0 +1,26 @@ +# SPDX-License-Identifier: MPL-2.0 +# 0-AI-MANIFEST.a2ml — Universal AI Agent Entry Point + +[manifest] +version = "0.2" +format = "a2ml" + +[canonical-locations] +machine-readable = ".machine_readable/" +state = ".machine_readable/6a2/STATE.a2ml" +meta = ".machine_readable/6a2/META.a2ml" +ecosystem = ".machine_readable/6a2/ECOSYSTEM.a2ml" +contractiles = ".machine_readable/contractiles/" +bot-directives = ".machine_readable/bot_directives/" + +[invariants] +scm-files-location = ".machine_readable/ ONLY — never root" +container-file = "Containerfile — never Dockerfile" +package-manager = "Deno preferred — never npm" +license = "MPL-2.0" + +[session-startup] +step-1 = "Read this manifest" +step-2 = "Read STATE.a2ml for current project state" +step-3 = "Read META.a2ml for architecture decisions" +step-4 = "Read ECOSYSTEM.a2ml for ecosystem position" diff --git a/showcase/ARCHITECTURE.md b/showcase/ARCHITECTURE.md new file mode 100644 index 0000000..607e3d8 --- /dev/null +++ b/showcase/ARCHITECTURE.md @@ -0,0 +1,47 @@ +# Architecture + +## Overview + +This repository follows a modular, maintainable architecture designed for clarity, scalability, and long-term sustainability. + +## Directory Structure + +``` +. +├── src/ # Source code +├── tests/ # Test suites +├── docs/ # Documentation +├── scripts/ # Utility scripts +├── config/ # Configuration files +├── LICENSE # License file +├── LICENSES/ # Full license texts +└── README.adoc # Project documentation +``` + +## Design Principles + +- **Separation of Concerns**: Each module has a single responsibility +- **Testability**: Code is written to be easily testable +- **Documentation**: All public APIs are documented +- **Configuration**: Environment-specific settings are externalized + +## Dependencies + +- External dependencies are minimized and clearly declared +- Version pinning is used for reproducibility + +## Security Considerations + +- Sensitive data is never committed to the repository +- Secrets are managed through environment variables or secure vaults +- Regular dependency audits are performed + +## Maintainability + +- Code follows consistent style guidelines +- Pull requests require review and CI checks +- Issues and discussions are tracked transparently + +--- + +*Last updated: 2026-07-18* diff --git a/showcase/CODE_OF_CONDUCT.md b/showcase/CODE_OF_CONDUCT.md new file mode 100644 index 0000000..caeda1c --- /dev/null +++ b/showcase/CODE_OF_CONDUCT.md @@ -0,0 +1,27 @@ + +# Contributor Covenant Code of Conduct + +## Our Pledge + +We pledge to make participation a harassment-free experience for everyone. + +## Our Standards + +**Positive behavior:** +* Using welcoming language +* Being respectful of differing viewpoints +* Accepting constructive criticism +* Focusing on what is best for the community + +**Unacceptable behavior:** +* Harassment, trolling, or personal attacks +* Publishing private information without permission + +## Enforcement + +Report issues to the maintainers. All complaints will be reviewed. + +## Attribution + +Adapted from [Contributor Covenant](https://www.contributor-covenant.org/) v2.1. + diff --git a/showcase/CONTRIBUTING.md b/showcase/CONTRIBUTING.md new file mode 100644 index 0000000..80ecdac --- /dev/null +++ b/showcase/CONTRIBUTING.md @@ -0,0 +1,66 @@ + +# Contributing + +Thank you for your interest in contributing! We follow a "Dual-Track" architecture where human-readable documentation lives in the root and machine-readable policies live in `.machine_readable/`. + +## How to Contribute + +We welcome contributions in many forms: + +- **Code:** Improving the core stack or extensions +- **Documentation:** Enhancing docs or AI manifests +- **Testing:** Adding property-based tests or formal proofs +- **Bug reports:** Filing clear, reproducible issues + +## Getting Started + +1. **Read the AI Manifest:** Start with `0-AI-MANIFEST.a2ml` (if present) to understand the repository structure. +2. **Environment:** Use `nix develop` or `direnv allow` to set up your tools. +3. **Task Runner:** Use `just` to see available commands (`just --list`). + +## Development Workflow + +### Branch Naming + +``` +docs/short-description # Documentation +test/what-added # Test additions +feat/short-description # New features +fix/issue-number-description # Bug fixes +refactor/what-changed # Code improvements +security/what-fixed # Security fixes +``` + +### Commit Messages + +We follow [Conventional Commits](https://www.conventionalcommits.org/): + +``` +(): + +[optional body] + +[optional footer] +``` + +Types: `feat`, `fix`, `docs`, `test`, `refactor`, `ci`, `chore`, `security` + +## Reporting Bugs + +Before reporting: +1. Search existing issues +2. Check if it's already fixed in `main` + +When reporting, include: +- Clear, descriptive title +- Environment details (OS, versions, toolchain) +- Steps to reproduce +- Expected vs actual behaviour + +## Code of Conduct + +All contributors are expected to adhere to our [Code of Conduct](CODE_OF_CONDUCT.md). + +## License + +By contributing, you agree that your contributions will be licensed under the same license as the project (see [LICENSE](LICENSE)). diff --git a/showcase/EXPLAINME.adoc b/showcase/EXPLAINME.adoc new file mode 100644 index 0000000..0e5511a --- /dev/null +++ b/showcase/EXPLAINME.adoc @@ -0,0 +1,205 @@ +// SPDX-License-Identifier: CC-BY-SA-4.0 +// Copyright (c) 2026 Jonathan D.A. Jewell += a2ml-showcase — Show Me The Receipts +:toc: +:toclevels: 3 +:icons: font + +The README describes a2ml-showcase as a content-only repository of examples and +templates for the A2ML (Attested Markup Language) format. This file traces the +content structure, identifies the critical documentation paths, and records how +the showcase fits into the wider A2ML ecosystem. + +== Claims from the README + +[quote, README] +____ +This repository contains example A2ML documents, templates, and rendered output +demonstrating the capabilities of the A2ML format. It is a content/showcase +repository — there is no executable code. +____ + +*How it works.* A2ML is a structured identity and attestation format for +software agents. An `.a2ml` file combines human-readable markup (headings, +paragraphs, lists) with machine-verifiable directive blocks delimited by +`@:` ... `@end`. The mandatory directives are `@abstract:` (a +human-readable description) and `@attestation:` (a structured block carrying +`agent-id`, `attested-by`, `trust-level`, `capabilities`, and `scope`). + +The `content/` directory holds five Markdown documentation pages rendered to +HTML via `template.html`: + +* `index.md` — format overview, feature grid (attestation chains, provenance + tracking, agent identity, CI/CD native), and the "why A2ML" narrative. +* `getting-started.md` — minimal manifest walkthrough. +* `examples.md` — three worked examples: minimal self-declared bot, CI/CD + agent with verified attestation, and a multi-agent orchestration manifest. +* `integrations.md` — tooling ecosystem coverage. +* `specification.md` — format reference (directives, trust levels, grammar). + +The `examples.md` content demonstrates that even the simplest valid A2ML file +(a greeter bot with a `@attestation:` block declaring `trust-level: +self-declared`) is enough for tooling to identify the agent and record its +claims. The CI/CD agent example shows a verified attestation where a security +team countersigns the capabilities block, lifting `trust-level` from +`self-declared` to `verified`. + +*Honest caveat.* a2ml-showcase is documentation, not a parser. The `.a2ml` +snippets in `content/examples.md` are illustrative; their correctness against +the A2ML grammar is not enforced by a running parser in this repo. The +grammar and parser live in `tree-sitter-a2ml`; the normative specification +lives in `standards`. + +*Critical path.* `content/index.md` → explains attestation chain model → +`content/examples.md` → minimal, CI/CD, and multi-agent worked examples → +`output/examples.html` (rendered via `template.html`) → read by tooling +authors and agent developers. + +[quote, README] +____ +A2ML is not a paper specification. It ships with real, working tools: Pandoc +reader, writer, filter, and template via pandoc-a2ml; VS Code syntax +highlighting via vscode-a2ml; Tree-sitter grammar via tree-sitter-a2ml; +GitHub Linguist language detection (submission pending). +____ + +*How it works.* `content/integrations.md` is the canonical cross-reference for +this claim. It links: pandoc-a2ml (convert A2ML to HTML, PDF, Markdown, 40+ +formats); vscode-a2ml (syntax highlighting in VS Code); tree-sitter-a2ml +(Neovim, Helix, Zed, GitHub); and format-registrations (IANA media type +`application/vnd.a2ml`, freedesktop.org MIME XML, Wikidata entity). The +showcase also references that `0-AI-MANIFEST.a2ml` files are recognised by +glob patterns `0-AI-MANIFEST.a2ml` and `AI.a2ml` at weight 60 in the +shared-mime-info XML — giving file managers and editors first-class detection. + +*Honest caveat.* The GitHub Linguist submission is described as "pending". The +VS Code extension is published but not yet widely known. Pandoc integration is +the most mature path. + +*Critical path.* `content/integrations.md` → links to pandoc-a2ml → +`pandoc --from a2ml --to html` converts A2ML to HTML → output is +indistinguishable from hand-written HTML but with attestation metadata +preserved in `` tags. + +== How It Is Checked + +[source,bash] +---- +deno test --allow-read tests/ +---- + +The test suite in `tests/validate.test.ts` checks: + +* All five `content/*.md` files exist. +* `output/` directory exists and contains rendered artefacts. +* `template.html` is present and non-empty. +* `tests/fuzz/` contains a fuzz corpus (directory exists check). +* Spot-checks that `content/index.md` contains the A2ML identifier and at + least one `@attestation` reference. + +`tests/fuzz/` holds a fuzz corpus for property-based testing against unusual +document structures. + +== Dogfooded Across The Account + +[cols="2,3", options="header"] +|=== +| Consumer | How it uses this repo + +| `standards` (A2ML spec) +| The normative A2ML specification in `standards/a2ml/SPEC-v1.0.adoc` links + to a2ml-showcase for worked examples, keeping the spec document itself formal + and compact. + +| `format-registrations` +| `iana/a2ml-media-type.txt` cites a2ml-showcase as the "Applications that use + this media type" reference. The `shared-mime-info/a2ml.xml` globs + (`*.a2ml`, `0-AI-MANIFEST.a2ml`, `AI.a2ml`) are documented here. + +| `tree-sitter-a2ml` +| Uses the directive examples from `content/examples.md` as parser test + fixtures. The `@attestation:`, `@abstract:`, and `@opaque:` directives + shown in the showcase must parse correctly in the tree-sitter grammar. + +| `gitbot-fleet` (rhodibot) +| rhodibot's own `0-AI-MANIFEST.a2ml` follows the CI/CD agent pattern + documented in `content/examples.md`. + +| Every hyperpolymath repo +| All repos carry a `0-AI-MANIFEST.a2ml` in their root; a2ml-showcase's + getting-started guide is the canonical reference for authors writing new + manifests. + +| `hypatia-scan.yml` +| Hypatia's A2ML manifest validation rule checks that `0-AI-MANIFEST.a2ml` + files match the minimal structure demonstrated in this showcase. +|=== + +== File Map + +[cols="2,3", options="header"] +|=== +| Path | What's There + +| `content/index.md` +| A2ML format overview. Covers: attestation chains, provenance tracking, agent + identity, CI/CD native design. The feature grid and "Why A2ML?" narrative. + +| `content/getting-started.md` +| Minimal manifest walkthrough. Shows the simplest valid `.a2ml` file with + `@abstract:` and `@attestation:` blocks and explains each field. + +| `content/examples.md` +| Three worked examples: (1) minimal self-declared greeter bot; (2) CI/CD + agent with security-team countersignature; (3) multi-agent orchestration + manifest with cross-agent `@refs:` links. + +| `content/integrations.md` +| Tooling ecosystem: pandoc-a2ml, vscode-a2ml, tree-sitter-a2ml, format + registrations, GitHub Linguist. Status notes for each. + +| `content/specification.md` +| Format reference: directive grammar, trust levels (`self-declared`, + `verified`, `audited`), required vs. optional fields. + +| `output/` +| Rendered HTML pages (generated from `content/` via `template.html`). + +| `template.html` +| HTML rendering template. Used by the build step to convert `content/*.md` + into the `output/` pages. + +| `README.adoc` +| One-screen overview: what A2ML is, content structure, licence. + +| `tests/validate.test.ts` +| Deno test suite. File existence, content structure, template presence, + and fuzz corpus checks. + +| `tests/fuzz/` +| Fuzz corpus for property-based edge-case testing. + +| `Justfile` +| `just` task runner: `default`, `doctor`, `tour`, `help-me`. + +| `deno.json` / `deno.lock` +| Deno runtime config and lockfile. + +| `guix.scm` / `flake.nix` +| Reproducible build environment declarations. + +| `stapeln.toml` +| Stapeln container configuration for this repo. + +| `contractiles/` +| Contractile recipe stubs (RSR standard). + +| `0-AI-MANIFEST.a2ml` +| AI agent manifest for this repo — itself an example of the format it + documents. +|=== + +== Questions? + +Open an issue on GitHub or reach out to Jonathan D.A. Jewell + — happy to explain anything in more detail. diff --git a/showcase/GOVERNANCE.md b/showcase/GOVERNANCE.md new file mode 100644 index 0000000..e27364c --- /dev/null +++ b/showcase/GOVERNANCE.md @@ -0,0 +1,60 @@ +# Governance + +## Overview + +This project is governed by the following principles and structures to ensure transparent, inclusive, and effective decision-making. + +## Roles and Responsibilities + +### Maintainers + +Maintainers are responsible for: +- Reviewing and merging pull requests +- Managing releases and versioning +- Ensuring code quality and standards +- Triaging issues and bug reports +- Community engagement and support + +### Contributors + +Contributors are expected to: +- Follow the code of conduct +- Submit well-documented pull requests +- Write tests for new functionality +- Maintain existing tests +- Update documentation as needed + +## Decision Making + +### Minor Changes +- Can be made by any maintainer +- Include bug fixes, documentation updates, dependency updates + +### Major Changes +- Require discussion in issues or pull requests +- Include new features, architectural changes, API changes +- Need approval from at least 2 maintainers + +### Breaking Changes +- Require RFC (Request for Comments) process +- Need approval from majority of maintainers +- Must include migration guide + +## Code of Conduct + +All participants are expected to follow our Code of Conduct. Violations can be reported to the maintainers. + +## Communication + +- **Issues**: For bug reports and feature requests +- **Discussions**: For questions and general discussion +- **Pull Requests**: For code contributions + +## Licensing + +All contributions are made under the terms of the repository's LICENSE file. +By submitting a pull request, you agree to license your contributions accordingly. + +--- + +*Last updated: 2026-07-18* diff --git a/showcase/Justfile b/showcase/Justfile new file mode 100644 index 0000000..ace2c97 --- /dev/null +++ b/showcase/Justfile @@ -0,0 +1,80 @@ +# SPDX-License-Identifier: MPL-2.0 +# Justfile for a2ml-showcase + +# Default recipe — list available commands +import? "contractile.just" + +default: + @just --list + +# Run the Idris2 test suite (ports validate.test.ts from May 2026). +# Requires idris2 0.8.0+ on PATH. IDRIS2_PREFIX is resolved from the +# binary location so the runner uses the right standard library copy. +test: + @export IDRIS2_PREFIX="$(dirname "$(dirname "$(command -v idris2)")")" && \ + idris2 --build a2ml-showcase-tests.ipkg && \ + ./build/exec/a2ml-showcase-tests + +# Self-diagnostic — checks dependencies, permissions, paths +doctor: + @echo "Running diagnostics for a2ml-showcase..." + @echo "Checking required tools..." + @command -v just >/dev/null 2>&1 && echo " [OK] just" || echo " [FAIL] just not found" + @command -v git >/dev/null 2>&1 && echo " [OK] git" || echo " [FAIL] git not found" + @echo "Checking for hardcoded paths..." + @grep -rn '/var/mnt/eclipse' --include='*.rs' --include='*.ex' --include='*.res' --include='*.gleam' --include='*.sh' --include='*.toml' . 2>/dev/null | grep -v 'Justfile' | head -5 || echo " [OK] No hardcoded paths in source" + @echo "Diagnostics complete." + +# Guided tour of key features +tour: + @echo "=== a2ml-showcase Tour ===" + @echo "" + @echo "1. Project structure:" + @ls -la + @echo "" + @echo "2. Available commands: just --list" + @echo "" + @echo "3. Read README.adoc or README.md for full overview" + @echo "4. Read EXPLAINME.adoc for architecture decisions" + @echo "5. Run 'just doctor' to check your setup" + @echo "" + @echo "Tour complete! Try 'just --list' to see all available commands." + +# Open feedback channel with diagnostic context +help-me: + @echo "=== a2ml-showcase Help ===" + @echo "Platform: $(uname -s) $(uname -m)" + @echo "Shell: $SHELL" + @echo "" + @echo "To report an issue:" + @echo " https://github.com/hyperpolymath/a2ml-showcase/issues/new" + @echo "" + @echo "Include the output of 'just doctor' in your report." + +# Run panic-attacker pre-commit scan +assail: + @command -v panic-attack >/dev/null 2>&1 && panic-attack assail . || echo "WARN: panic-attack not found — install from https://github.com/hyperpolymath/panic-attacker" + +# LLM context dump +llm-context: + @echo "Project: a2ml-showcase" + @echo "License: MPL-2.0" + @test -f README.adoc && head -30 README.adoc || test -f README.md && head -30 README.md || echo "No README found" + + +# Print the current CRG grade (reads from READINESS.md '**Current Grade:** X' line) +crg-grade: + @grade=$$(grep -oP '(?<=\*\*Current Grade:\*\* )[A-FX]' READINESS.md 2>/dev/null | head -1); \ + [ -z "$$grade" ] && grade="X"; \ + echo "$$grade" + +# Generate a shields.io badge markdown for the current CRG grade +# Looks for '**Current Grade:** X' in READINESS.md; falls back to X +crg-badge: + @grade=$$(grep -oP '(?<=\*\*Current Grade:\*\* )[A-FX]' READINESS.md 2>/dev/null | head -1); \ + [ -z "$$grade" ] && grade="X"; \ + case "$$grade" in \ + A) color="brightgreen" ;; B) color="green" ;; C) color="yellow" ;; \ + D) color="orange" ;; E) color="red" ;; F) color="critical" ;; \ + *) color="lightgrey" ;; esac; \ + echo "[![CRG $$grade](https://img.shields.io/badge/CRG-$$grade-$$color?style=flat-square)](https://github.com/hyperpolymath/standards/tree/main/component-readiness-grades)" diff --git a/showcase/LICENSE b/showcase/LICENSE new file mode 100644 index 0000000..14e2f77 --- /dev/null +++ b/showcase/LICENSE @@ -0,0 +1,373 @@ +Mozilla Public License Version 2.0 +================================== + +1. Definitions +-------------- + +1.1. "Contributor" + means each individual or legal entity that creates, contributes to + the creation of, or owns Covered Software. + +1.2. "Contributor Version" + means the combination of the Contributions of others (if any) used + by a Contributor and that particular Contributor's Contribution. + +1.3. "Contribution" + means Covered Software of a particular Contributor. + +1.4. "Covered Software" + means Source Code Form to which the initial Contributor has attached + the notice in Exhibit A, the Executable Form of such Source Code + Form, and Modifications of such Source Code Form, in each case + including portions thereof. + +1.5. "Incompatible With Secondary Licenses" + means + + (a) that the initial Contributor has attached the notice described + in Exhibit B to the Covered Software; or + + (b) that the Covered Software was made available under the terms of + version 1.1 or earlier of the License, but not also under the + terms of a Secondary License. + +1.6. "Executable Form" + means any form of the work other than Source Code Form. + +1.7. "Larger Work" + means a work that combines Covered Software with other material, in + a separate file or files, that is not Covered Software. + +1.8. "License" + means this document. + +1.9. "Licensable" + means having the right to grant, to the maximum extent possible, + whether at the time of the initial grant or subsequently, any and + all of the rights conveyed by this License. + +1.10. "Modifications" + means any of the following: + + (a) any file in Source Code Form that results from an addition to, + deletion from, or modification of the contents of Covered + Software; or + + (b) any new file in Source Code Form that contains any Covered + Software. + +1.11. "Patent Claims" of a Contributor + means any patent claim(s), including without limitation, method, + process, and apparatus claims, in any patent Licensable by such + Contributor that would be infringed, but for the grant of the + License, by the making, using, selling, offering for sale, having + made, import, or transfer of either its Contributions or its + Contributor Version. + +1.12. "Secondary License" + means either the GNU General Public License, Version 2.0, the GNU + Lesser General Public License, Version 2.1, the GNU Affero General + Public License, Version 3.0, or any later versions of those + licenses. + +1.13. "Source Code Form" + means the form of the work preferred for making modifications. + +1.14. "You" (or "Your") + means an individual or a legal entity exercising rights under this + License. For legal entities, "You" includes any entity that + controls, is controlled by, or is under common control with You. For + purposes of this definition, "control" means (a) the power, direct + or indirect, to cause the direction or management of such entity, + whether by contract or otherwise, or (b) ownership of more than + fifty percent (50%) of the outstanding shares or beneficial + ownership of such entity. + +2. License Grants and Conditions +-------------------------------- + +2.1. Grants + +Each Contributor hereby grants You a world-wide, royalty-free, +non-exclusive license: + +(a) under intellectual property rights (other than patent or trademark) + Licensable by such Contributor to use, reproduce, make available, + modify, display, perform, distribute, and otherwise exploit its + Contributions, either on an unmodified basis, with Modifications, or + as part of a Larger Work; and + +(b) under Patent Claims of such Contributor to make, use, sell, offer + for sale, have made, import, and otherwise transfer either its + Contributions or its Contributor Version. + +2.2. Effective Date + +The licenses granted in Section 2.1 with respect to any Contribution +become effective for each Contribution on the date the Contributor first +distributes such Contribution. + +2.3. Limitations on Grant Scope + +The licenses granted in this Section 2 are the only rights granted under +this License. No additional rights or licenses will be implied from the +distribution or licensing of Covered Software under this License. +Notwithstanding Section 2.1(b) above, no patent license is granted by a +Contributor: + +(a) for any code that a Contributor has removed from Covered Software; + or + +(b) for infringements caused by: (i) Your and any other third party's + modifications of Covered Software, or (ii) the combination of its + Contributions with other software (except as part of its Contributor + Version); or + +(c) under Patent Claims infringed by Covered Software in the absence of + its Contributions. + +This License does not grant any rights in the trademarks, service marks, +or logos of any Contributor (except as may be necessary to comply with +the notice requirements in Section 3.4). + +2.4. Subsequent Licenses + +No Contributor makes additional grants as a result of Your choice to +distribute the Covered Software under a subsequent version of this +License (see Section 10.2) or under the terms of a Secondary License (if +permitted under the terms of Section 3.3). + +2.5. Representation + +Each Contributor represents that the Contributor believes its +Contributions are its original creation(s) or it has sufficient rights +to grant the rights to its Contributions conveyed by this License. + +2.6. Fair Use + +This License is not intended to limit any rights You have under +applicable copyright doctrines of fair use, fair dealing, or other +equivalents. + +2.7. Conditions + +Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted +in Section 2.1. + +3. Responsibilities +------------------- + +3.1. Distribution of Source Form + +All distribution of Covered Software in Source Code Form, including any +Modifications that You create or to which You contribute, must be under +the terms of this License. You must inform recipients that the Source +Code Form of the Covered Software is governed by the terms of this +License, and how they can obtain a copy of this License. You may not +attempt to alter or restrict the recipients' rights in the Source Code +Form. + +3.2. Distribution of Executable Form + +If You distribute Covered Software in Executable Form then: + +(a) such Covered Software must also be made available in Source Code + Form, as described in Section 3.1, and You must inform recipients of + the Executable Form how they can obtain a copy of such Source Code + Form by reasonable means in a timely manner, at a charge no more + than the cost of distribution to the recipient; and + +(b) You may distribute such Executable Form under the terms of this + License, or sublicense it under different terms, provided that the + license for the Executable Form does not attempt to limit or alter + the recipients' rights in the Source Code Form under this License. + +3.3. Distribution of a Larger Work + +You may create and distribute a Larger Work under terms of Your choice, +provided that You also comply with the requirements of this License for +the Covered Software. If the Larger Work is a combination of Covered +Software with a work governed by one or more Secondary Licenses, and the +Covered Software is not Incompatible With Secondary Licenses, this +License permits You to additionally distribute such Covered Software +under the terms of such Secondary License(s), so that the recipient of +the Larger Work may, at their option, further distribute the Covered +Software under the terms of either this License or such Secondary +License(s). + +3.4. Notices + +You may not remove or alter the substance of any license notices +(including copyright notices, patent notices, disclaimers of warranty, +or limitations of liability) contained within the Source Code Form of +the Covered Software, except that You may alter any license notices to +the extent required to remedy known factual inaccuracies. + +3.5. Application of Additional Terms + +You may choose to offer, and to charge a fee for, warranty, support, +indemnity or liability obligations to one or more recipients of Covered +Software. However, You may do so only on Your own behalf, and not on +behalf of any Contributor. You must make it absolutely clear that any +such warranty, support, indemnity, or liability obligation is offered by +You alone, and You hereby agree to indemnify every Contributor for any +liability incurred by such Contributor as a result of warranty, support, +indemnity or liability terms You offer. You may include additional +disclaimers of warranty and limitations of liability specific to any +jurisdiction. + +4. Inability to Comply Due to Statute or Regulation +--------------------------------------------------- + +If it is impossible for You to comply with any of the terms of this +License with respect to some or all of the Covered Software due to +statute, judicial order, or regulation then You must: (a) comply with +the terms of this License to the maximum extent possible; and (b) +describe the limitations and the code they affect. Such description must +be placed in a text file included with all distributions of the Covered +Software under this License. Except to the extent prohibited by statute +or regulation, such description must be sufficiently detailed for a +recipient of ordinary skill to be able to understand it. + +5. Termination +-------------- + +5.1. The rights granted under this License will terminate automatically +if You fail to comply with any of its terms. However, if You become +compliant, then the rights granted under this License from a particular +Contributor are reinstated (a) provisionally, unless and until such +Contributor explicitly and finally terminates Your grants, and (b) on an +ongoing basis, if such Contributor fails to notify You of the +non-compliance by some reasonable means prior to 60 days after You have +come back into compliance. Moreover, Your grants from a particular +Contributor are reinstated on an ongoing basis if such Contributor +notifies You of the non-compliance by some reasonable means, this is the +first time You have received notice of non-compliance with this License +from such Contributor, and You become compliant prior to 30 days after +Your receipt of the notice. + +5.2. If You initiate litigation against any entity by asserting a patent +infringement claim (excluding declaratory judgment actions, +counter-claims, and cross-claims) alleging that a Contributor Version +directly or indirectly infringes any patent, then the rights granted to +You by any and all Contributors for the Covered Software under Section +2.1 of this License shall terminate. + +5.3. In the event of termination under Sections 5.1 or 5.2 above, all +end user license agreements (excluding distributors and resellers) which +have been validly granted by You or Your distributors under this License +prior to termination shall survive termination. + +************************************************************************ +* * +* 6. Disclaimer of Warranty * +* ------------------------- * +* * +* Covered Software is provided under this License on an "as is" * +* basis, without warranty of any kind, either expressed, implied, or * +* statutory, including, without limitation, warranties that the * +* Covered Software is free of defects, merchantable, fit for a * +* particular purpose or non-infringing. The entire risk as to the * +* quality and performance of the Covered Software is with You. * +* Should any Covered Software prove defective in any respect, You * +* (not any Contributor) assume the cost of any necessary servicing, * +* repair, or correction. This disclaimer of warranty constitutes an * +* essential part of this License. No use of any Covered Software is * +* authorized under this License except under this disclaimer. * +* * +************************************************************************ + +************************************************************************ +* * +* 7. Limitation of Liability * +* -------------------------- * +* * +* Under no circumstances and under no legal theory, whether tort * +* (including negligence), contract, or otherwise, shall any * +* Contributor, or anyone who distributes Covered Software as * +* permitted above, be liable to You for any direct, indirect, * +* special, incidental, or consequential damages of any character * +* including, without limitation, damages for lost profits, loss of * +* goodwill, work stoppage, computer failure or malfunction, or any * +* and all other commercial damages or losses, even if such party * +* shall have been informed of the possibility of such damages. This * +* limitation of liability shall not apply to liability for death or * +* personal injury resulting from such party's negligence to the * +* extent applicable law prohibits such limitation. Some * +* jurisdictions do not allow the exclusion or limitation of * +* incidental or consequential damages, so this exclusion and * +* limitation may not apply to You. * +* * +************************************************************************ + +8. Litigation +------------- + +Any litigation relating to this License may be brought only in the +courts of a jurisdiction where the defendant maintains its principal +place of business and such litigation shall be governed by laws of that +jurisdiction, without reference to its conflict-of-law provisions. +Nothing in this Section shall prevent a party's ability to bring +cross-claims or counter-claims. + +9. Miscellaneous +---------------- + +This License represents the complete agreement concerning the subject +matter hereof. If any provision of this License is held to be +unenforceable, such provision shall be reformed only to the extent +necessary to make it enforceable. Any law or regulation which provides +that the language of a contract shall be construed against the drafter +shall not be used to construe this License against a Contributor. + +10. Versions of the License +--------------------------- + +10.1. New Versions + +Mozilla Foundation is the license steward. Except as provided in Section +10.3, no one other than the license steward has the right to modify or +publish new versions of this License. Each version will be given a +distinguishing version number. + +10.2. Effect of New Versions + +You may distribute the Covered Software under the terms of the version +of the License under which You originally received the Covered Software, +or under the terms of any subsequent version published by the license +steward. + +10.3. Modified Versions + +If you create software not governed by this License, and you want to +create a new license for such software, you may create and use a +modified version of this License if you rename the license and remove +any references to the name of the license steward (except to note that +such modified license differs from this License). + +10.4. Distributing Source Code Form that is Incompatible With Secondary +Licenses + +If You choose to distribute Source Code Form that is Incompatible With +Secondary Licenses under the terms of this version of the License, the +notice described in Exhibit B of this License must be attached. + +Exhibit A - Source Code Form License Notice +------------------------------------------- + + This Source Code Form is subject to the terms of the Mozilla Public + License, v. 2.0. If a copy of the MPL was not distributed with this + file, You can obtain one at http://mozilla.org/MPL/2.0/. + +If it is not possible or desirable to put the notice in a particular +file, then You may include the notice in a location (such as a LICENSE +file in a relevant directory) where a recipient would be likely to look +for such a notice. + +You may add additional accurate notices of copyright ownership. + +Exhibit B - "Incompatible With Secondary Licenses" Notice +--------------------------------------------------------- + + This Source Code Form is "Incompatible With Secondary Licenses", as + defined by the Mozilla Public License, v. 2.0. diff --git a/showcase/LICENSES/AGPL-3.0-or-later.txt b/showcase/LICENSES/AGPL-3.0-or-later.txt new file mode 100644 index 0000000..be3f7b2 --- /dev/null +++ b/showcase/LICENSES/AGPL-3.0-or-later.txt @@ -0,0 +1,661 @@ + GNU AFFERO GENERAL PUBLIC LICENSE + Version 3, 19 November 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU Affero General Public License is a free, copyleft license for +software and other kinds of works, specifically designed to ensure +cooperation with the community in the case of network server software. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +our General Public Licenses are intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + Developers that use our General Public Licenses protect your rights +with two steps: (1) assert copyright on the software, and (2) offer +you this License which gives you legal permission to copy, distribute +and/or modify the software. + + A secondary benefit of defending all users' freedom is that +improvements made in alternate versions of the program, if they +receive widespread use, become available for other developers to +incorporate. Many developers of free software are heartened and +encouraged by the resulting cooperation. However, in the case of +software used on network servers, this result may fail to come about. +The GNU General Public License permits making a modified version and +letting the public access it on a server without ever releasing its +source code to the public. + + The GNU Affero General Public License is designed specifically to +ensure that, in such cases, the modified source code becomes available +to the community. It requires the operator of a network server to +provide the source code of the modified version running there to the +users of that server. Therefore, public use of a modified version, on +a publicly accessible server, gives the public access to the source +code of the modified version. + + An older license, called the Affero General Public License and +published by Affero, was designed to accomplish similar goals. This is +a different license, not a version of the Affero GPL, but Affero has +released a new version of the Affero GPL which permits relicensing under +this license. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU Affero General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Remote Network Interaction; Use with the GNU General Public License. + + Notwithstanding any other provision of this License, if you modify the +Program, your modified version must prominently offer all users +interacting with it remotely through a computer network (if your version +supports such interaction) an opportunity to receive the Corresponding +Source of your version by providing access to the Corresponding Source +from a network server at no charge, through some standard or customary +means of facilitating copying of software. This Corresponding Source +shall include the Corresponding Source for any work covered by version 3 +of the GNU General Public License that is incorporated pursuant to the +following paragraph. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the work with which it is combined will remain governed by version +3 of the GNU General Public License. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU Affero General Public License from time to time. Such new versions +will be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU Affero General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU Affero General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU Affero General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If your software can interact with users remotely through a computer +network, you should also make sure that it provides a way for users to +get its source. For example, if your program is a web application, its +interface could display a "Source" link that leads users to an archive +of the code. There are many ways you could offer source, and different +solutions will be better for different programs; see section 13 for the +specific requirements. + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU AGPL, see +. diff --git a/showcase/LICENSES/CC-BY-SA-4.0.txt b/showcase/LICENSES/CC-BY-SA-4.0.txt new file mode 100644 index 0000000..2d58298 --- /dev/null +++ b/showcase/LICENSES/CC-BY-SA-4.0.txt @@ -0,0 +1,428 @@ +Attribution-ShareAlike 4.0 International + +======================================================================= + +Creative Commons Corporation ("Creative Commons") is not a law firm and +does not provide legal services or legal advice. Distribution of +Creative Commons public licenses does not create a lawyer-client or +other relationship. Creative Commons makes its licenses and related +information available on an "as-is" basis. Creative Commons gives no +warranties regarding its licenses, any material licensed under their +terms and conditions, or any related information. Creative Commons +disclaims all liability for damages resulting from their use to the +fullest extent possible. + +Using Creative Commons Public Licenses + +Creative Commons public licenses provide a standard set of terms and +conditions that creators and other rights holders may use to share +original works of authorship and other material subject to copyright +and certain other rights specified in the public license below. The +following considerations are for informational purposes only, are not +exhaustive, and do not form part of our licenses. + + Considerations for licensors: Our public licenses are + intended for use by those authorized to give the public + permission to use material in ways otherwise restricted by + copyright and certain other rights. Our licenses are + irrevocable. Licensors should read and understand the terms + and conditions of the license they choose before applying it. + Licensors should also secure all rights necessary before + applying our licenses so that the public can reuse the + material as expected. Licensors should clearly mark any + material not subject to the license. This includes other CC- + licensed material, or material used under an exception or + limitation to copyright. More considerations for licensors: + wiki.creativecommons.org/Considerations_for_licensors + + Considerations for the public: By using one of our public + licenses, a licensor grants the public permission to use the + licensed material under specified terms and conditions. If + the licensor's permission is not necessary for any reason--for + example, because of any applicable exception or limitation to + copyright--then that use is not regulated by the license. Our + licenses grant only permissions under copyright and certain + other rights that a licensor has authority to grant. Use of + the licensed material may still be restricted for other + reasons, including because others have copyright or other + rights in the material. A licensor may make special requests, + such as asking that all changes be marked or described. + Although not required by our licenses, you are encouraged to + respect those requests where reasonable. More considerations + for the public: + wiki.creativecommons.org/Considerations_for_licensees + +======================================================================= + +Creative Commons Attribution-ShareAlike 4.0 International Public +License + +By exercising the Licensed Rights (defined below), You accept and agree +to be bound by the terms and conditions of this Creative Commons +Attribution-ShareAlike 4.0 International Public License ("Public +License"). To the extent this Public License may be interpreted as a +contract, You are granted the Licensed Rights in consideration of Your +acceptance of these terms and conditions, and the Licensor grants You +such rights in consideration of benefits the Licensor receives from +making the Licensed Material available under these terms and +conditions. + + +Section 1 -- Definitions. + + a. Adapted Material means material subject to Copyright and Similar + Rights that is derived from or based upon the Licensed Material + and in which the Licensed Material is translated, altered, + arranged, transformed, or otherwise modified in a manner requiring + permission under the Copyright and Similar Rights held by the + Licensor. For purposes of this Public License, where the Licensed + Material is a musical work, performance, or sound recording, + Adapted Material is always produced where the Licensed Material is + synched in timed relation with a moving image. + + b. Adapter's License means the license You apply to Your Copyright + and Similar Rights in Your contributions to Adapted Material in + accordance with the terms and conditions of this Public License. + + c. BY-SA Compatible License means a license listed at + creativecommons.org/compatiblelicenses, approved by Creative + Commons as essentially the equivalent of this Public License. + + d. Copyright and Similar Rights means copyright and/or similar rights + closely related to copyright including, without limitation, + performance, broadcast, sound recording, and Sui Generis Database + Rights, without regard to how the rights are labeled or + categorized. For purposes of this Public License, the rights + specified in Section 2(b)(1)-(2) are not Copyright and Similar + Rights. + + e. Effective Technological Measures means those measures that, in the + absence of proper authority, may not be circumvented under laws + fulfilling obligations under Article 11 of the WIPO Copyright + Treaty adopted on December 20, 1996, and/or similar international + agreements. + + f. Exceptions and Limitations means fair use, fair dealing, and/or + any other exception or limitation to Copyright and Similar Rights + that applies to Your use of the Licensed Material. + + g. License Elements means the license attributes listed in the name + of a Creative Commons Public License. The License Elements of this + Public License are Attribution and ShareAlike. + + h. Licensed Material means the artistic or literary work, database, + or other material to which the Licensor applied this Public + License. + + i. Licensed Rights means the rights granted to You subject to the + terms and conditions of this Public License, which are limited to + all Copyright and Similar Rights that apply to Your use of the + Licensed Material and that the Licensor has authority to license. + + j. Licensor means the individual(s) or entity(ies) granting rights + under this Public License. + + k. Share means to provide material to the public by any means or + process that requires permission under the Licensed Rights, such + as reproduction, public display, public performance, distribution, + dissemination, communication, or importation, and to make material + available to the public including in ways that members of the + public may access the material from a place and at a time + individually chosen by them. + + l. Sui Generis Database Rights means rights other than copyright + resulting from Directive 96/9/EC of the European Parliament and of + the Council of 11 March 1996 on the legal protection of databases, + as amended and/or succeeded, as well as other essentially + equivalent rights anywhere in the world. + + m. You means the individual or entity exercising the Licensed Rights + under this Public License. Your has a corresponding meaning. + + +Section 2 -- Scope. + + a. License grant. + + 1. Subject to the terms and conditions of this Public License, + the Licensor hereby grants You a worldwide, royalty-free, + non-sublicensable, non-exclusive, irrevocable license to + exercise the Licensed Rights in the Licensed Material to: + + a. reproduce and Share the Licensed Material, in whole or + in part; and + + b. produce, reproduce, and Share Adapted Material. + + 2. Exceptions and Limitations. For the avoidance of doubt, where + Exceptions and Limitations apply to Your use, this Public + License does not apply, and You do not need to comply with + its terms and conditions. + + 3. Term. The term of this Public License is specified in Section + 6(a). + + 4. Media and formats; technical modifications allowed. The + Licensor authorizes You to exercise the Licensed Rights in + all media and formats whether now known or hereafter created, + and to make technical modifications necessary to do so. The + Licensor waives and/or agrees not to assert any right or + authority to forbid You from making technical modifications + necessary to exercise the Licensed Rights, including + technical modifications necessary to circumvent Effective + Technological Measures. For purposes of this Public License, + simply making modifications authorized by this Section 2(a) + (4) never produces Adapted Material. + + 5. Downstream recipients. + + a. Offer from the Licensor -- Licensed Material. Every + recipient of the Licensed Material automatically + receives an offer from the Licensor to exercise the + Licensed Rights under the terms and conditions of this + Public License. + + b. Additional offer from the Licensor -- Adapted Material. + Every recipient of Adapted Material from You + automatically receives an offer from the Licensor to + exercise the Licensed Rights in the Adapted Material + under the conditions of the Adapter's License You apply. + + c. No downstream restrictions. You may not offer or impose + any additional or different terms or conditions on, or + apply any Effective Technological Measures to, the + Licensed Material if doing so restricts exercise of the + Licensed Rights by any recipient of the Licensed + Material. + + 6. No endorsement. Nothing in this Public License constitutes or + may be construed as permission to assert or imply that You + are, or that Your use of the Licensed Material is, connected + with, or sponsored, endorsed, or granted official status by, + the Licensor or others designated to receive attribution as + provided in Section 3(a)(1)(A)(i). + + b. Other rights. + + 1. Moral rights, such as the right of integrity, are not + licensed under this Public License, nor are publicity, + privacy, and/or other similar personality rights; however, to + the extent possible, the Licensor waives and/or agrees not to + assert any such rights held by the Licensor to the limited + extent necessary to allow You to exercise the Licensed + Rights, but not otherwise. + + 2. Patent and trademark rights are not licensed under this + Public License. + + 3. To the extent possible, the Licensor waives any right to + collect royalties from You for the exercise of the Licensed + Rights, whether directly or through a collecting society + under any voluntary or waivable statutory or compulsory + licensing scheme. In all other cases the Licensor expressly + reserves any right to collect such royalties. + + +Section 3 -- License Conditions. + +Your exercise of the Licensed Rights is expressly made subject to the +following conditions. + + a. Attribution. + + 1. If You Share the Licensed Material (including in modified + form), You must: + + a. retain the following if it is supplied by the Licensor + with the Licensed Material: + + i. identification of the creator(s) of the Licensed + Material and any others designated to receive + attribution, in any reasonable manner requested by + the Licensor (including by pseudonym if + designated); + + ii. a copyright notice; + + iii. a notice that refers to this Public License; + + iv. a notice that refers to the disclaimer of + warranties; + + v. a URI or hyperlink to the Licensed Material to the + extent reasonably practicable; + + b. indicate if You modified the Licensed Material and + retain an indication of any previous modifications; and + + c. indicate the Licensed Material is licensed under this + Public License, and include the text of, or the URI or + hyperlink to, this Public License. + + 2. You may satisfy the conditions in Section 3(a)(1) in any + reasonable manner based on the medium, means, and context in + which You Share the Licensed Material. For example, it may be + reasonable to satisfy the conditions by providing a URI or + hyperlink to a resource that includes the required + information. + + 3. If requested by the Licensor, You must remove any of the + information required by Section 3(a)(1)(A) to the extent + reasonably practicable. + + b. ShareAlike. + + In addition to the conditions in Section 3(a), if You Share + Adapted Material You produce, the following conditions also apply. + + 1. The Adapter's License You apply must be a Creative Commons + license with the same License Elements, this version or + later, or a BY-SA Compatible License. + + 2. You must include the text of, or the URI or hyperlink to, the + Adapter's License You apply. You may satisfy this condition + in any reasonable manner based on the medium, means, and + context in which You Share Adapted Material. + + 3. You may not offer or impose any additional or different terms + or conditions on, or apply any Effective Technological + Measures to, Adapted Material that restrict exercise of the + rights granted under the Adapter's License You apply. + + +Section 4 -- Sui Generis Database Rights. + +Where the Licensed Rights include Sui Generis Database Rights that +apply to Your use of the Licensed Material: + + a. for the avoidance of doubt, Section 2(a)(1) grants You the right + to extract, reuse, reproduce, and Share all or a substantial + portion of the contents of the database; + + b. if You include all or a substantial portion of the database + contents in a database in which You have Sui Generis Database + Rights, then the database in which You have Sui Generis Database + Rights (but not its individual contents) is Adapted Material, + including for purposes of Section 3(b); and + + c. You must comply with the conditions in Section 3(a) if You Share + all or a substantial portion of the contents of the database. + +For the avoidance of doubt, this Section 4 supplements and does not +replace Your obligations under this Public License where the Licensed +Rights include other Copyright and Similar Rights. + + +Section 5 -- Disclaimer of Warranties and Limitation of Liability. + + a. UNLESS OTHERWISE SEPARATELY UNDERTAKEN BY THE LICENSOR, TO THE + EXTENT POSSIBLE, THE LICENSOR OFFERS THE LICENSED MATERIAL AS-IS + AND AS-AVAILABLE, AND MAKES NO REPRESENTATIONS OR WARRANTIES OF + ANY KIND CONCERNING THE LICENSED MATERIAL, WHETHER EXPRESS, + IMPLIED, STATUTORY, OR OTHER. THIS INCLUDES, WITHOUT LIMITATION, + WARRANTIES OF TITLE, MERCHANTABILITY, FITNESS FOR A PARTICULAR + PURPOSE, NON-INFRINGEMENT, ABSENCE OF LATENT OR OTHER DEFECTS, + ACCURACY, OR THE PRESENCE OR ABSENCE OF ERRORS, WHETHER OR NOT + KNOWN OR DISCOVERABLE. WHERE DISCLAIMERS OF WARRANTIES ARE NOT + ALLOWED IN FULL OR IN PART, THIS DISCLAIMER MAY NOT APPLY TO YOU. + + b. TO THE EXTENT POSSIBLE, IN NO EVENT WILL THE LICENSOR BE LIABLE + TO YOU ON ANY LEGAL THEORY (INCLUDING, WITHOUT LIMITATION, + NEGLIGENCE) OR OTHERWISE FOR ANY DIRECT, SPECIAL, INDIRECT, + INCIDENTAL, CONSEQUENTIAL, PUNITIVE, EXEMPLARY, OR OTHER LOSSES, + COSTS, EXPENSES, OR DAMAGES ARISING OUT OF THIS PUBLIC LICENSE OR + USE OF THE LICENSED MATERIAL, EVEN IF THE LICENSOR HAS BEEN + ADVISED OF THE POSSIBILITY OF SUCH LOSSES, COSTS, EXPENSES, OR + DAMAGES. WHERE A LIMITATION OF LIABILITY IS NOT ALLOWED IN FULL OR + IN PART, THIS LIMITATION MAY NOT APPLY TO YOU. + + c. The disclaimer of warranties and limitation of liability provided + above shall be interpreted in a manner that, to the extent + possible, most closely approximates an absolute disclaimer and + waiver of all liability. + + +Section 6 -- Term and Termination. + + a. This Public License applies for the term of the Copyright and + Similar Rights licensed here. However, if You fail to comply with + this Public License, then Your rights under this Public License + terminate automatically. + + b. Where Your right to use the Licensed Material has terminated under + Section 6(a), it reinstates: + + 1. automatically as of the date the violation is cured, provided + it is cured within 30 days of Your discovery of the + violation; or + + 2. upon express reinstatement by the Licensor. + + For the avoidance of doubt, this Section 6(b) does not affect any + right the Licensor may have to seek remedies for Your violations + of this Public License. + + c. For the avoidance of doubt, the Licensor may also offer the + Licensed Material under separate terms or conditions or stop + distributing the Licensed Material at any time; however, doing so + will not terminate this Public License. + + d. Sections 1, 5, 6, 7, and 8 survive termination of this Public + License. + + +Section 7 -- Other Terms and Conditions. + + a. The Licensor shall not be bound by any additional or different + terms or conditions communicated by You unless expressly agreed. + + b. Any arrangements, understandings, or agreements regarding the + Licensed Material not stated herein are separate from and + independent of the terms and conditions of this Public License. + + +Section 8 -- Interpretation. + + a. For the avoidance of doubt, this Public License does not, and + shall not be interpreted to, reduce, limit, restrict, or impose + conditions on any use of the Licensed Material that could lawfully + be made without permission under this Public License. + + b. To the extent possible, if any provision of this Public License is + deemed unenforceable, it shall be automatically reformed to the + minimum extent necessary to make it enforceable. If the provision + cannot be reformed, it shall be severed from this Public License + without affecting the enforceability of the remaining terms and + conditions. + + c. No term or condition of this Public License will be waived and no + failure to comply consented to unless expressly agreed to by the + Licensor. + + d. Nothing in this Public License constitutes or may be interpreted + as a limitation upon, or waiver of, any privileges and immunities + that apply to the Licensor or You, including from the legal + processes of any jurisdiction or authority. + + +======================================================================= + +Creative Commons is not a party to its public +licenses. Notwithstanding, Creative Commons may elect to apply one of +its public licenses to material it publishes and in those instances +will be considered the “Licensor.” The text of the Creative Commons +public licenses is dedicated to the public domain under the CC0 Public +Domain Dedication. Except for the limited purpose of indicating that +material is shared under a Creative Commons public license or as +otherwise permitted by the Creative Commons policies published at +creativecommons.org/policies, Creative Commons does not authorize the +use of the trademark "Creative Commons" or any other trademark or logo +of Creative Commons without its prior written consent including, +without limitation, in connection with any unauthorized modifications +to any of its public licenses or any other arrangements, +understandings, or agreements concerning use of licensed material. For +the avoidance of doubt, this paragraph does not form part of the +public licenses. + +Creative Commons may be contacted at creativecommons.org. + diff --git a/showcase/LICENSES/MPL-2.0.txt b/showcase/LICENSES/MPL-2.0.txt new file mode 100644 index 0000000..d0a1fa1 --- /dev/null +++ b/showcase/LICENSES/MPL-2.0.txt @@ -0,0 +1,373 @@ +Mozilla Public License Version 2.0 +================================== + +1. Definitions +-------------- + +1.1. "Contributor" + means each individual or legal entity that creates, contributes to + the creation of, or owns Covered Software. + +1.2. "Contributor Version" + means the combination of the Contributions of others (if any) used + by a Contributor and that particular Contributor's Contribution. + +1.3. "Contribution" + means Covered Software of a particular Contributor. + +1.4. "Covered Software" + means Source Code Form to which the initial Contributor has attached + the notice in Exhibit A, the Executable Form of such Source Code + Form, and Modifications of such Source Code Form, in each case + including portions thereof. + +1.5. "Incompatible With Secondary Licenses" + means + + (a) that the initial Contributor has attached the notice described + in Exhibit B to the Covered Software; or + + (b) that the Covered Software was made available under the terms of + version 1.1 or earlier of the License, but not also under the + terms of a Secondary License. + +1.6. "Executable Form" + means any form of the work other than Source Code Form. + +1.7. "Larger Work" + means a work that combines Covered Software with other material, in + a separate file or files, that is not Covered Software. + +1.8. "License" + means this document. + +1.9. "Licensable" + means having the right to grant, to the maximum extent possible, + whether at the time of the initial grant or subsequently, any and + all of the rights conveyed by this License. + +1.10. "Modifications" + means any of the following: + + (a) any file in Source Code Form that results from an addition to, + deletion from, or modification of the contents of Covered + Software; or + + (b) any new file in Source Code Form that contains any Covered + Software. + +1.11. "Patent Claims" of a Contributor + means any patent claim(s), including without limitation, method, + process, and apparatus claims, in any patent Licensable by such + Contributor that would be infringed, but for the grant of the + License, by the making, using, selling, offering for sale, having + made, import, or transfer of either its Contributions or its + Contributor Version. + +1.12. "Secondary License" + means either the GNU General Public License, Version 2.0, the GNU + Lesser General Public License, Version 2.1, the GNU Affero General + Public License, Version 3.0, or any later versions of those + licenses. + +1.13. "Source Code Form" + means the form of the work preferred for making modifications. + +1.14. "You" (or "Your") + means an individual or a legal entity exercising rights under this + License. For legal entities, "You" includes any entity that + controls, is controlled by, or is under common control with You. For + purposes of this definition, "control" means (a) the power, direct + or indirect, to cause the direction or management of such entity, + whether by contract or otherwise, or (b) ownership of more than + fifty percent (50%) of the outstanding shares or beneficial + ownership of such entity. + +2. License Grants and Conditions +-------------------------------- + +2.1. Grants + +Each Contributor hereby grants You a world-wide, royalty-free, +non-exclusive license: + +(a) under intellectual property rights (other than patent or trademark) + Licensable by such Contributor to use, reproduce, make available, + modify, display, perform, distribute, and otherwise exploit its + Contributions, either on an unmodified basis, with Modifications, or + as part of a Larger Work; and + +(b) under Patent Claims of such Contributor to make, use, sell, offer + for sale, have made, import, and otherwise transfer either its + Contributions or its Contributor Version. + +2.2. Effective Date + +The licenses granted in Section 2.1 with respect to any Contribution +become effective for each Contribution on the date the Contributor first +distributes such Contribution. + +2.3. Limitations on Grant Scope + +The licenses granted in this Section 2 are the only rights granted under +this License. No additional rights or licenses will be implied from the +distribution or licensing of Covered Software under this License. +Notwithstanding Section 2.1(b) above, no patent license is granted by a +Contributor: + +(a) for any code that a Contributor has removed from Covered Software; + or + +(b) for infringements caused by: (i) Your and any other third party's + modifications of Covered Software, or (ii) the combination of its + Contributions with other software (except as part of its Contributor + Version); or + +(c) under Patent Claims infringed by Covered Software in the absence of + its Contributions. + +This License does not grant any rights in the trademarks, service marks, +or logos of any Contributor (except as may be necessary to comply with +the notice requirements in Section 3.4). + +2.4. Subsequent Licenses + +No Contributor makes additional grants as a result of Your choice to +distribute the Covered Software under a subsequent version of this +License (see Section 10.2) or under the terms of a Secondary License (if +permitted under the terms of Section 3.3). + +2.5. Representation + +Each Contributor represents that the Contributor believes its +Contributions are its original creation(s) or it has sufficient rights +to grant the rights to its Contributions conveyed by this License. + +2.6. Fair Use + +This License is not intended to limit any rights You have under +applicable copyright doctrines of fair use, fair dealing, or other +equivalents. + +2.7. Conditions + +Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted +in Section 2.1. + +3. Responsibilities +------------------- + +3.1. Distribution of Source Form + +All distribution of Covered Software in Source Code Form, including any +Modifications that You create or to which You contribute, must be under +the terms of this License. You must inform recipients that the Source +Code Form of the Covered Software is governed by the terms of this +License, and how they can obtain a copy of this License. You may not +attempt to alter or restrict the recipients' rights in the Source Code +Form. + +3.2. Distribution of Executable Form + +If You distribute Covered Software in Executable Form then: + +(a) such Covered Software must also be made available in Source Code + Form, as described in Section 3.1, and You must inform recipients of + the Executable Form how they can obtain a copy of such Source Code + Form by reasonable means in a timely manner, at a charge no more + than the cost of distribution to the recipient; and + +(b) You may distribute such Executable Form under the terms of this + License, or sublicense it under different terms, provided that the + license for the Executable Form does not attempt to limit or alter + the recipients' rights in the Source Code Form under this License. + +3.3. Distribution of a Larger Work + +You may create and distribute a Larger Work under terms of Your choice, +provided that You also comply with the requirements of this License for +the Covered Software. If the Larger Work is a combination of Covered +Software with a work governed by one or more Secondary Licenses, and the +Covered Software is not Incompatible With Secondary Licenses, this +License permits You to additionally distribute such Covered Software +under the terms of such Secondary License(s), so that the recipient of +the Larger Work may, at their option, further distribute the Covered +Software under the terms of either this License or such Secondary +License(s). + +3.4. Notices + +You may not remove or alter the substance of any license notices +(including copyright notices, patent notices, disclaimers of warranty, +or limitations of liability) contained within the Source Code Form of +the Covered Software, except that You may alter any license notices to +the extent required to remedy known factual inaccuracies. + +3.5. Application of Additional Terms + +You may choose to offer, and to charge a fee for, warranty, support, +indemnity or liability obligations to one or more recipients of Covered +Software. However, You may do so only on Your own behalf, and not on +behalf of any Contributor. You must make it absolutely clear that any +such warranty, support, indemnity, or liability obligation is offered by +You alone, and You hereby agree to indemnify every Contributor for any +liability incurred by such Contributor as a result of warranty, support, +indemnity or liability terms You offer. You may include additional +disclaimers of warranty and limitations of liability specific to any +jurisdiction. + +4. Inability to Comply Due to Statute or Regulation +--------------------------------------------------- + +If it is impossible for You to comply with any of the terms of this +License with respect to some or all of the Covered Software due to +statute, judicial order, or regulation then You must: (a) comply with +the terms of this License to the maximum extent possible; and (b) +describe the limitations and the code they affect. Such description must +be placed in a text file included with all distributions of the Covered +Software under this License. Except to the extent prohibited by statute +or regulation, such description must be sufficiently detailed for a +recipient of ordinary skill to be able to understand it. + +5. Termination +-------------- + +5.1. The rights granted under this License will terminate automatically +if You fail to comply with any of its terms. However, if You become +compliant, then the rights granted under this License from a particular +Contributor are reinstated (a) provisionally, unless and until such +Contributor explicitly and finally terminates Your grants, and (b) on an +ongoing basis, if such Contributor fails to notify You of the +non-compliance by some reasonable means prior to 60 days after You have +come back into compliance. Moreover, Your grants from a particular +Contributor are reinstated on an ongoing basis if such Contributor +notifies You of the non-compliance by some reasonable means, this is the +first time You have received notice of non-compliance with this License +from such Contributor, and You become compliant prior to 30 days after +Your receipt of the notice. + +5.2. If You initiate litigation against any entity by asserting a patent +infringement claim (excluding declaratory judgment actions, +counter-claims, and cross-claims) alleging that a Contributor Version +directly or indirectly infringes any patent, then the rights granted to +You by any and all Contributors for the Covered Software under Section +2.1 of this License shall terminate. + +5.3. In the event of termination under Sections 5.1 or 5.2 above, all +end user license agreements (excluding distributors and resellers) which +have been validly granted by You or Your distributors under this License +prior to termination shall survive termination. + +************************************************************************ +* * +* 6. Disclaimer of Warranty * +* ------------------------- * +* * +* Covered Software is provided under this License on an "as is" * +* basis, without warranty of any kind, either expressed, implied, or * +* statutory, including, without limitation, warranties that the * +* Covered Software is free of defects, merchantable, fit for a * +* particular purpose or non-infringing. The entire risk as to the * +* quality and performance of the Covered Software is with You. * +* Should any Covered Software prove defective in any respect, You * +* (not any Contributor) assume the cost of any necessary servicing, * +* repair, or correction. This disclaimer of warranty constitutes an * +* essential part of this License. No use of any Covered Software is * +* authorized under this License except under this disclaimer. * +* * +************************************************************************ + +************************************************************************ +* * +* 7. Limitation of Liability * +* -------------------------- * +* * +* Under no circumstances and under no legal theory, whether tort * +* (including negligence), contract, or otherwise, shall any * +* Contributor, or anyone who distributes Covered Software as * +* permitted above, be liable to You for any direct, indirect, * +* special, incidental, or consequential damages of any character * +* including, without limitation, damages for lost profits, loss of * +* goodwill, work stoppage, computer failure or malfunction, or any * +* and all other commercial damages or losses, even if such party * +* shall have been informed of the possibility of such damages. This * +* limitation of liability shall not apply to liability for death or * +* personal injury resulting from such party's negligence to the * +* extent applicable law prohibits such limitation. Some * +* jurisdictions do not allow the exclusion or limitation of * +* incidental or consequential damages, so this exclusion and * +* limitation may not apply to You. * +* * +************************************************************************ + +8. Litigation +------------- + +Any litigation relating to this License may be brought only in the +courts of a jurisdiction where the defendant maintains its principal +place of business and such litigation shall be governed by laws of that +jurisdiction, without reference to its conflict-of-law provisions. +Nothing in this Section shall prevent a party's ability to bring +cross-claims or counter-claims. + +9. Miscellaneous +---------------- + +This License represents the complete agreement concerning the subject +matter hereof. If any provision of this License is held to be +unenforceable, such provision shall be reformed only to the extent +necessary to make it enforceable. Any law or regulation which provides +that the language of a contract shall be construed against the drafter +shall not be used to construe this License against a Contributor. + +10. Versions of the License +--------------------------- + +10.1. New Versions + +Mozilla Foundation is the license steward. Except as provided in Section +10.3, no one other than the license steward has the right to modify or +publish new versions of this License. Each version will be given a +distinguishing version number. + +10.2. Effect of New Versions + +You may distribute the Covered Software under the terms of the version +of the License under which You originally received the Covered Software, +or under the terms of any subsequent version published by the license +steward. + +10.3. Modified Versions + +If you create software not governed by this License, and you want to +create a new license for such software, you may create and use a +modified version of this License if you rename the license and remove +any references to the name of the license steward (except to note that +such modified license differs from this License). + +10.4. Distributing Source Code Form that is Incompatible With Secondary +Licenses + +If You choose to distribute Source Code Form that is Incompatible With +Secondary Licenses under the terms of this version of the License, the +notice described in Exhibit B of this License must be attached. + +Exhibit A - Source Code Form License Notice +------------------------------------------- + + This Source Code Form is subject to the terms of the Mozilla Public + License, v. 2.0. If a copy of the MPL was not distributed with this + file, You can obtain one at https://mozilla.org/MPL/2.0/. + +If it is not possible or desirable to put the notice in a particular +file, then You may include the notice in a location (such as a LICENSE +file in a relevant directory) where a recipient would be likely to look +for such a notice. + +You may add additional accurate notices of copyright ownership. + +Exhibit B - "Incompatible With Secondary Licenses" Notice +--------------------------------------------------------- + + This Source Code Form is "Incompatible With Secondary Licenses", as + defined by the Mozilla Public License, v. 2.0. diff --git a/showcase/MAINTAINERS b/showcase/MAINTAINERS new file mode 100644 index 0000000..37f6411 --- /dev/null +++ b/showcase/MAINTAINERS @@ -0,0 +1,43 @@ +# Maintainers + +This file lists the current maintainers of this project. + +## Active Maintainers + +| Name | GitHub | Role | Since | +|------|--------|------|-------| +| Metadatastician | @metadatastician | Primary | Project Start | + +## Emeritus Maintainers + +None at this time. + +## Becoming a Maintainer + +To become a maintainer: + +1. Demonstrate consistent, high-quality contributions +2. Show understanding of the project's goals and architecture +3. Be active in code reviews and community discussions +4. Be nominated by an existing maintainer +5. Be approved by consensus of existing maintainers + +## Maintainer Responsibilities + +- Reviewing and merging pull requests +- Managing releases +- Triaging issues +- Enforcing code standards +- Mentoring new contributors +- Participating in decision-making + +## Maintainer Expectations + +- Respond to issues and PRs in a timely manner +- Follow the code of conduct +- Be transparent in decision-making +- Communicate clearly and respectfully + +--- + +*Last updated: 2026-07-18* diff --git a/showcase/QUICKSTART-DEV.adoc b/showcase/QUICKSTART-DEV.adoc new file mode 100644 index 0000000..dd4a64e --- /dev/null +++ b/showcase/QUICKSTART-DEV.adoc @@ -0,0 +1,39 @@ += A2Ml Showcase — Developer Quickstart +:toc: preamble + +Clone, build, test, contribute. + +== Prerequisites + +* Git 2.40+ +* just (command runner) +* See `just doctor` output for language-specific requirements + +== Setup + +[source,bash] +---- +git clone https://github.com/hyperpolymath/a2ml-showcase +cd a2ml-showcase +just doctor # verify toolchain +just heal # auto-install missing tools +---- + +== Development Workflow + +[source,bash] +---- +just tour # understand the codebase +just help-me # see available commands +---- + +== Before Committing + +[source,bash] +---- +just assail # run panic-attacker security scan +---- + +== Contributing + +See link:CONTRIBUTING.md[CONTRIBUTING.md] for guidelines. diff --git a/showcase/QUICKSTART-MAINTAINER.adoc b/showcase/QUICKSTART-MAINTAINER.adoc new file mode 100644 index 0000000..c242f21 --- /dev/null +++ b/showcase/QUICKSTART-MAINTAINER.adoc @@ -0,0 +1,40 @@ += A2Ml Showcase — Maintainer Quickstart +:toc: preamble + +Packaging, deployment, and release management. + +== Prerequisites + +* Git 2.40+ +* just (command runner) +* Familiarity with the project (run `just tour` first) + +== CI/CD + +This project uses GitHub Actions. Workflows are in `.github/workflows/`. + +Key workflows: + +* `hypatia-scan.yml` — Neurosymbolic security scanning +* `codeql.yml` — Code analysis +* `scorecard.yml` — OpenSSF Scorecard +* `mirror.yml` — GitLab/Bitbucket mirroring + +== Releasing + +1. Update version in project config +2. Update CHANGELOG.md +3. Tag: `git tag -s v` +4. Push: `git push origin main --tags` + +== Container Build (if applicable) + +[source,bash] +---- +podman build -f Containerfile -t a2ml-showcase:latest . +---- + +== Mirrors + +This repo is mirrored to GitLab and Bitbucket (hyperpolymath accounts) +via the `mirror.yml` workflow. diff --git a/showcase/QUICKSTART-USER.adoc b/showcase/QUICKSTART-USER.adoc new file mode 100644 index 0000000..82e1778 --- /dev/null +++ b/showcase/QUICKSTART-USER.adoc @@ -0,0 +1,33 @@ += A2Ml Showcase — User Quickstart +:toc: preamble + +Get up and running in 60 seconds. + +== Prerequisites + +* Git 2.40+ +* just (command runner) — https://just.systems + +== Install + +[source,bash] +---- +git clone https://github.com/hyperpolymath/a2ml-showcase +cd a2ml-showcase +just doctor # check toolchain +just heal # auto-install missing tools +---- + +== First Run + +[source,bash] +---- +just tour # guided project tour +just help-me # see common workflows +---- + +== Get Help + +* `just help-me` — common workflows +* `just doctor` — diagnose toolchain issues +* https://github.com/hyperpolymath/a2ml-showcase/issues — report bugs diff --git a/showcase/README.md b/showcase/README.md new file mode 100644 index 0000000..58d8a22 --- /dev/null +++ b/showcase/README.md @@ -0,0 +1,27 @@ + + +Showcase examples and templates for A2ML (AI Attestation Markup +Language). + +[![OpenSSF Scorecard](https://api.securityscorecards.dev/projects/github.com/hyperpolymath/a2ml-showcase/badge)](https://securityscorecards.dev/viewer/?uri=github.com/hyperpolymath/a2ml-showcase) + +# About + +This repository contains example A2ML documents, templates, and rendered +output demonstrating the capabilities of the A2ML format. It is a +content/showcase repository — there is no executable code. + +# Structure + +- `content/` — A2ML source documents + +- `output/` — Rendered output + +- `template.html` — HTML rendering template + +# License + +MPL-2.0. See [LICENSE](LICENSE). diff --git a/showcase/SECURITY.md b/showcase/SECURITY.md new file mode 100644 index 0000000..c1ca2fc --- /dev/null +++ b/showcase/SECURITY.md @@ -0,0 +1,16 @@ + + + +# Security Policy + +## Reporting a Vulnerability + +Please report security vulnerabilities to j.d.a.jewell@open.ac.uk. + +We will acknowledge receipt within 48 hours and provide a detailed response within 7 days. + +## Supported Versions + +| Version | Supported | +|---------|-----------| +| Latest | Yes | diff --git a/showcase/TEST-NEEDS.md b/showcase/TEST-NEEDS.md new file mode 100644 index 0000000..aaeb65d --- /dev/null +++ b/showcase/TEST-NEEDS.md @@ -0,0 +1,136 @@ +# CRG Grade C Test Coverage + +## CRG Grade: B — ACHIEVED 2026-04-04 + +> CRG B achieved 2026-04-04: Validated A2ML manifests from 6 diverse external repos + ran 18 internal tests. + +## CRG B Evidence — External Targets + +| Target Repo | A2ML File | What Was Tested | Result | +|-------------|-----------|-----------------|--------| +| gossamer | 0-AI-MANIFEST.a2ml | Structural compliance (8 required fields) | SCORE 8/8 (106 lines, 4851B) | +| boj-server | 0-AI-MANIFEST.a2ml | Structural compliance (8 required fields) | SCORE 8/8 (110 lines, 5036B) | +| echidna | 0-AI-MANIFEST.a2ml | Structural compliance (8 required fields) | SCORE 3/8 (103 lines, 4507B) | +| panic-attacker | 0-AI-MANIFEST.a2ml | Structural compliance (8 required fields) | SCORE 4/8 (119 lines, 4007B) | +| hypatia | 0-AI-MANIFEST.a2ml | Structural compliance (8 required fields) | SCORE 8/8 (117 lines, 5295B) | +| standards | 0-AI-MANIFEST.a2ml | Structural compliance (8 required fields) | SCORE 1/8 (128 lines, 4383B) | + +### Compliance fields checked + +1. `SPDX-License-Identifier` header +2. `(manifest ...)` wrapper +3. `(identity ...)` section +4. `(purpose ...)` section +5. `(name ...)` field +6. `(version ...)` field +7. `(context ...)` tiers +8. `(canonical ...)` locations + +### Target Details + +**1. gossamer (Gleam/Rust — window manager)** +- File: `/var/mnt/eclipse/repos/gossamer/0-AI-MANIFEST.a2ml` +- Result: FULL COMPLIANCE. All 8 structural fields present. Proper S-expression format with identity, purpose, context-tiers, canonical-locations, and invariants. + +**2. boj-server (ReScript/Deno — MCP server)** +- File: `/var/mnt/eclipse/repos/boj-server/0-AI-MANIFEST.a2ml` +- Result: FULL COMPLIANCE. All 8 structural fields present. Well-structured manifest with 110 lines. + +**3. echidna (Rust — theorem prover)** +- File: `/var/mnt/eclipse/repos/verification-ecosystem/echidna/0-AI-MANIFEST.a2ml` +- Result: INCOMPLETE (3/8). Has SPDX and context/canonical but uses non-standard structure missing (manifest), (identity), (purpose), (name), (version) wrappers. Needs migration to standard A2ML format. + +**4. panic-attacker (Rust — security scanner)** +- File: `/var/mnt/eclipse/repos/games-ecosystem/panic-attacker/0-AI-MANIFEST.a2ml` +- Result: INCOMPLETE (4/8). Has SPDX, (manifest), version, canonical but missing (identity), (purpose), (name) sections. Partially migrated format. + +**5. hypatia (Elixir/Rust — CI/CD scanner)** +- File: `/var/mnt/eclipse/repos/verification-ecosystem/hypatia/0-AI-MANIFEST.a2ml` +- Result: FULL COMPLIANCE. All 8 structural fields present. 117 lines with comprehensive context tiers. + +**6. standards (Mixed — multi-standard monorepo)** +- File: `/var/mnt/eclipse/repos/developer-ecosystem/standards/0-AI-MANIFEST.a2ml` +- Result: MINIMAL (1/8). Large file (128 lines, 4383B) but uses legacy format without standard S-expression structure. Only canonical locations present. Needs full rewrite. + +### Internal test suite also passing + +All 18 internal tests pass (Unit: 4, Smoke: 3, Contract: 2, Aspect: 3, Property: 2, E2E: 2, Benchmark: 2). + +**Repository:** a2ml-showcase +**Grade:** C +**Last Updated:** 2026-04-04 + +## Overview + +This repository contains A2ML showcase examples and documentation. As a data/showcase repository with no executable code, tests focus on: +- Valid A2ML example structure +- Consistency of formatting +- Completeness of required fields +- Documentation accuracy + +## Test Categories + +| Category | Count | Status | Notes | +|----------|-------|--------|-------| +| Unit Tests | 4 | ✓ PASS | File existence, structure, SPDX headers, content files | +| Smoke Tests | 3 | ✓ PASS | A2ML syntax, attestation blocks, policy blocks | +| Contract Tests | 2 | ✓ PASS | Required A2ML fields, valid trust levels | +| Aspect Tests | 3 | ✓ PASS | Agent naming, formatting consistency, SPDX consistency | +| Property-Based Tests | 2 | ✓ PASS | Agent-id declarations, trust level progression | +| E2E/Reflexive Tests | 2 | ✓ PASS | Attestation parsing, reference resolution | +| Benchmarks | 2 | ✓ PASS | File read performance, example count baseline | + +**Total Test Count:** 18 +**All Tests Passing:** Yes + +## Running Tests + +```bash +deno test tests/validate.test.ts +``` + +## Test Details + +### Unit Tests (4) +- Validates all required example files exist +- Checks for SPDX license headers in examples +- Verifies content structure has expected sections +- Confirms markdown files are readable + +### Smoke Tests (3) +- Verifies @attestation blocks are syntactically valid +- Checks @policy blocks are present and formatted +- Validates README cross-references + +### Contract Tests (2) +- Every attestation must have: agent-id, attested-by, trust-level +- Trust levels must be one of: self-declared, verified, audited + +### Aspect Tests (3) +- Agent IDs follow naming convention (lowercase-alphanumeric-hyphens) +- @attestation/@end blocks are balanced +- SPDX headers are consistent across documentation + +### Property-Based Tests (2) +- Every declared agent-id must appear in at least one attestation +- Documentation includes all three trust level progression stages + +### E2E/Reflexive Tests (2) +- A2ML attestation blocks can be parsed into key-value pairs +- All numbered references [1], [2], etc. are cited in text + +### Benchmarks (2) +- File read operations complete in < 100ms +- Contains expected number of documented examples (≥ 3) + +## Dependencies + +- Deno 1.40+ +- deno_std (assert module) + +## Future Enhancements + +- [ ] Add schema validation against formal A2ML grammar +- [ ] Validate agent capabilities against registry +- [ ] Check timestamp formats (RFC3339) +- [ ] Verify signature formats diff --git a/showcase/TOPOLOGY.md b/showcase/TOPOLOGY.md new file mode 100644 index 0000000..b3151db --- /dev/null +++ b/showcase/TOPOLOGY.md @@ -0,0 +1,23 @@ + + +# TOPOLOGY.md — a2ml-showcase + +## Purpose + +Content showcase for A2ML (AI Attestation Markup Language): example documents, templates, and rendered output demonstrating A2ML format capabilities. No executable code — pure content and documentation repo. Generated output is produced by the Deno renderer via `just render`. + +## Module Map + +``` +a2ml-showcase/ +├── content/ # A2ML source documents (examples, templates) +├── output/ # Rendered output (HTML, text) +├── deno.json # Deno task runner config +└── template.html # HTML rendering template +``` + +## Data Flow + +``` +[content/*.a2ml] ──► [a2ml-deno renderer] ──► [output/] +``` diff --git a/showcase/a2ml-showcase-tests.ipkg b/showcase/a2ml-showcase-tests.ipkg new file mode 100644 index 0000000..115a7d5 --- /dev/null +++ b/showcase/a2ml-showcase-tests.ipkg @@ -0,0 +1,19 @@ +-- SPDX-License-Identifier: MPL-2.0 +-- a2ml-showcase Idris2 test suite. Ported from tests/validate.test.ts +-- (Deno) in May 2026 per the panic-free estate rollout. Harness is +-- the cladistic Test.Spec from +-- panic-free-tests-and-benches/clade-registry/clade-A/idris2/. + +package a2ml-showcase-tests + +sourcedir = "tests/idris2" + +depends = base + +modules = Test.Spec + , ValidateTest + , Main + +main = Main + +executable = "a2ml-showcase-tests" diff --git a/showcase/content/examples.md b/showcase/content/examples.md new file mode 100644 index 0000000..8ab0a40 --- /dev/null +++ b/showcase/content/examples.md @@ -0,0 +1,267 @@ +--- +title: Examples +date: 2026-03-16 +order: 3 +--- + +# Examples + +Real-world A2ML manifests demonstrating the format in practice. Each example shows a different use case, from minimal declarations to multi-agent orchestration. + +## 1. Minimal Manifest + +The simplest possible A2ML file. Declares an agent with a single self-attestation. + +``` +;; SPDX-License-Identifier: CC-BY-SA-4.0 + +# Greeter Bot + +@abstract: +A simple bot that greets new contributors in pull requests. +@end + +@attestation: +agent-id: greeter-bot +attested-by: greeter-bot +trust-level: self-declared +capabilities: + - pr-comment +scope: repository +@end +``` + +This is enough for tooling to identify the agent, understand what it does, and record that its capabilities are self-declared (i.e., not yet independently verified). + +--- + +## 2. CI/CD Agent Manifest + +A GitHub Actions bot that runs in CI pipelines, with a verified attestation from the security team. + +``` +;; SPDX-License-Identifier: CC-BY-SA-4.0 + +# rhodibot — Repository Automation Agent + +@abstract: +rhodibot automates repository maintenance tasks including +label management, issue triage, and PR hygiene checks. +It operates within GitHub Actions workflows. +@end + +@provenance: +created-by: Jonathan D.A. Jewell +created: 2026-01-20 +last-modified: 2026-03-14 +source: https://github.com/hyperpolymath/gitbot-fleet +version: 2.1.0 +@end + +## Capabilities + +- Applies labels based on file paths and PR content +- Triages issues by parsing title and body against known patterns +- Enforces branch naming conventions +- Validates commit message format +- Checks PR size and flags oversized changes + +@attestation: +agent-id: rhodibot +attested-by: rhodibot +trust-level: self-declared +timestamp: 2026-01-20T09:00:00Z +capabilities: + - label-management + - issue-triage + - branch-validation + - commit-validation + - pr-size-check +scope: organization +@end + +@attestation: +agent-id: rhodibot +attested-by: security-team +trust-level: verified +timestamp: 2026-02-15T16:45:00Z +verifies: rhodibot/self-declared/2026-01-20 +signature: sha256:4e2a91f7c8d3b0... +note: Verified that rhodibot only reads repository metadata + and does not modify code or secrets. +@end + +@policy: +require: attestation.trust-level >= verified +enforce: github-actions +action: allow-execution +@end + +@refs: +[1] gitbot-fleet Documentation, https://github.com/hyperpolymath/gitbot-fleet +[2] Rhodium Standard Repositories, https://github.com/hyperpolymath/rhodium-standard-repositories +@end +``` + +--- + +## 3. Security Scanner Manifest + +Hypatia, a neurosymbolic security scanner, declaring its scanning capabilities with an audited attestation. + +``` +;; SPDX-License-Identifier: CC-BY-SA-4.0 + +# Hypatia — Neurosymbolic Security Scanner + +@abstract: +Hypatia performs multi-layered security analysis combining +rule-based scanning with neurosymbolic reasoning. It detects +secrets, vulnerable dependencies, misconfigured workflows, +and policy violations. +@end + +@provenance: +created-by: Jonathan D.A. Jewell +created: 2025-11-01 +last-modified: 2026-03-16 +source: https://github.com/hyperpolymath/hypatia +version: 3.4.0 +@end + +## Scan Modules + +- **Secret detection** — API keys, tokens, credentials in source +- **Dependency audit** — CVE matching against known vulnerabilities +- **Workflow analysis** — GitHub Actions misconfigurations +- **Policy enforcement** — RSR compliance, license headers, file locations +- **Neurosymbolic reasoning** — pattern inference beyond static rules + +@attestation: +agent-id: hypatia-scanner-v3 +attested-by: hypatia-scanner-v3 +trust-level: self-declared +timestamp: 2025-11-01T12:00:00Z +capabilities: + - secret-detection + - dependency-audit + - workflow-analysis + - policy-enforcement + - neurosymbolic-reasoning +scope: global +@end + +@attestation: +agent-id: hypatia-scanner-v3 +attested-by: security-team +trust-level: verified +timestamp: 2026-01-10T14:00:00Z +verifies: hypatia-scanner-v3/self-declared/2025-11-01 +signature: sha256:8b3d7f2e1a... +@end + +@attestation: +agent-id: hypatia-scanner-v3 +attested-by: independent-security-review +trust-level: audited +timestamp: 2026-02-28T10:30:00Z +verifies: hypatia-scanner-v3/verified/2026-01-10 +audit-report: https://audits.hyperpolymath.dev/hypatia-v3 +signature: sha256:c91e5a3b0d... +@end + +@refs: +[1] Hypatia Documentation, https://github.com/hyperpolymath/hypatia +[2] OWASP Top 10 for LLM Applications +[3] SLSA Build Provenance, https://slsa.dev +@end +``` + +--- + +## 4. Multi-Agent Orchestration + +Multiple agents referencing each other's attestations to establish a trust network for a deployment pipeline. + +``` +;; SPDX-License-Identifier: CC-BY-SA-4.0 + +# Deployment Pipeline — Agent Trust Network + +@abstract: +This manifest defines the trust relationships between agents +involved in the production deployment pipeline. Each agent +attests to the capabilities of the agents it depends on. +@end + +## Pipeline Agents + +The deployment pipeline involves four agents, each responsible +for a stage of the process: + +1. **codebot** — code review and static analysis +2. **hypatia** — security scanning +3. **sustainabot** — supply chain and dependency health +4. **finishbot** — final approval and deployment trigger + +## Trust Chain + +@attestation: +agent-id: codebot-v2 +attested-by: codebot-v2 +trust-level: self-declared +timestamp: 2026-03-01T09:00:00Z +capabilities: + - code-review + - style-enforcement + - complexity-analysis +scope: pipeline +@end + +@attestation: +agent-id: sustainabot +attested-by: sustainabot +trust-level: self-declared +timestamp: 2026-03-01T09:00:00Z +capabilities: + - dependency-health + - license-compliance + - supply-chain-audit +scope: pipeline +@end + +;; Finishbot trusts codebot and sustainabot, and requires +;; hypatia to have been audited before it will approve. + +@attestation: +agent-id: finishbot +attested-by: finishbot +trust-level: self-declared +timestamp: 2026-03-01T09:00:00Z +capabilities: + - deployment-approval + - rollback-trigger +requires: + - codebot-v2/verified + - hypatia-scanner-v3/audited + - sustainabot/verified +scope: pipeline +@end + +@policy: +require: all-agents.trust-level >= verified +require: hypatia-scanner-v3.trust-level == audited +enforce: deployment-gate +action: block-deploy +message: All pipeline agents must be verified. + Hypatia must be independently audited. +@end + +@refs: +[1] gitbot-fleet, https://github.com/hyperpolymath/gitbot-fleet +[2] Hypatia Scanner, https://github.com/hyperpolymath/hypatia +[3] SLSA Framework, https://slsa.dev +@end +``` + +This example shows how `finishbot` will refuse to approve a deployment unless `codebot` and `sustainabot` are at least `verified`, and `hypatia` has been independently `audited`. The policy block makes this machine-enforceable. diff --git a/showcase/content/getting-started.md b/showcase/content/getting-started.md new file mode 100644 index 0000000..af2795f --- /dev/null +++ b/showcase/content/getting-started.md @@ -0,0 +1,226 @@ +--- +title: Get Started +date: 2026-03-16 +order: 5 +--- + +# Get Started + +A step-by-step guide to creating your first A2ML manifest, validating it, and integrating it into your project. + +## Prerequisites + +- [Pandoc](https://pandoc.org/installing.html) 3.0 or later +- Git (for cloning the tooling) +- A text editor (VS Code recommended for syntax highlighting) + +--- + +
+ +## Install pandoc-a2ml + +Clone the pandoc-a2ml repository and note the path to the Lua scripts. No compilation needed — the reader, writer, and filter are pure Lua. + +```bash +git clone https://github.com/hyperpolymath/pandoc-a2ml.git +cd pandoc-a2ml +``` + +The key files are: +- `a2ml-reader.lua` — reads `.a2ml` files into Pandoc's AST +- `a2ml-writer.lua` — writes Pandoc AST as `.a2ml` output +- `a2ml-filter.lua` — Lua filter for attestation processing + +You can either add these to your Pandoc data directory (`~/.local/share/pandoc/`) or reference them by path. + +
+ +
+ +## Install the VS Code Extension + +For syntax highlighting while editing `.a2ml` files: + +1. Open VS Code +2. Go to Extensions (Ctrl+Shift+X) +3. Search for **"A2ML"** +4. Click Install + +Alternatively, clone and install manually: + +```bash +git clone https://github.com/hyperpolymath/vscode-a2ml.git +cd vscode-a2ml +code --install-extension . +``` + +You should now see syntax highlighting for `.a2ml` files, including directive blocks, headings, and comments. + +
+ +
+ +## Create Your First Manifest + +Create a file called `0-AI-MANIFEST.a2ml` in your repository root. This is the entry point that AI agents and tooling will read first. + +``` +;; SPDX-License-Identifier: CC-BY-SA-4.0 + +# AI Manifest — my-project + +@abstract: +This repository contains my-project, a tool for doing useful things. +This manifest declares the AI agents that operate on this repository +and the policies that govern their behaviour. +@end + +@provenance: +created-by: Your Name +created: 2026-03-16 +source: https://github.com/your-org/my-project +version: 1.0.0 +@end + +## Repository Structure + +- Source code in `src/` +- Machine-readable metadata in `.machine_readable/` +- CI/CD workflows in `.github/workflows/` + +## Agents + +No AI agents currently operate on this repository. + +@refs: +[1] A2ML Specification, https://a2ml.hyperpolymath.dev/specification.html +@end +``` + +
+ +
+ +## Validate with Pandoc + +Check that your manifest parses correctly by converting it to HTML: + +```bash +pandoc -f path/to/a2ml-reader.lua 0-AI-MANIFEST.a2ml -o manifest.html +``` + +If the file is well-formed, Pandoc will produce clean HTML output. Open `manifest.html` in a browser to verify the structure. + +For deeper validation using the A2ML filter (checks attestation structure): + +```bash +pandoc -f path/to/a2ml-reader.lua \ + --lua-filter path/to/a2ml-filter.lua \ + 0-AI-MANIFEST.a2ml \ + -o validated.html +``` + +
+ +
+ +## Add Machine-Readable Metadata + +For full Rhodium Standard compliance, create the `.machine_readable/` directory and add A2ML metadata files: + +```bash +mkdir -p .machine_readable/anchors .machine_readable/policies +``` + +Create `.machine_readable/STATE.a2ml`: + +``` +;; SPDX-License-Identifier: CC-BY-SA-4.0 + +# Project State + +@abstract: +Current state of my-project development. +@end + +## Status + +- Phase: initial setup +- Completion: 10% +- Next milestone: core functionality + +## Blockers + +None currently. +``` + +Create `.machine_readable/META.a2ml`: + +``` +;; SPDX-License-Identifier: CC-BY-SA-4.0 + +# Project Metadata + +@abstract: +Architecture decisions and governance for my-project. +@end + +## Architecture Decisions + +- Language: chosen based on team expertise +- License: MPL-2.0 for original code +``` + +These files give AI agents and automated tooling a structured understanding of your project's state, architecture, and ecosystem position. + +
+ +
+ +## Add an Agent Attestation + +When you introduce an AI agent to your workflow (a CI bot, a code reviewer, a security scanner), declare it in the manifest: + +``` +;; Add this to 0-AI-MANIFEST.a2ml or a dedicated agent file + +@attestation: +agent-id: my-ci-bot +attested-by: my-ci-bot +trust-level: self-declared +timestamp: 2026-03-16T12:00:00Z +capabilities: + - lint-checking + - test-execution +scope: repository +@end +``` + +As the agent is reviewed and verified, add higher-trust attestations: + +``` +@attestation: +agent-id: my-ci-bot +attested-by: security-team +trust-level: verified +timestamp: 2026-03-20T15:00:00Z +verifies: my-ci-bot/self-declared/2026-03-16 +signature: sha256:your-signature-here +@end +``` + +
+ +--- + +## Next Steps + +- Read the full [Specification](specification.html) for all directives and fields +- Browse [Examples](examples.html) for real-world patterns +- Explore [Integrations](integrations.html) for editor and CI tooling +- Check out the source repositories: + - [pandoc-a2ml](https://github.com/hyperpolymath/pandoc-a2ml) + - [vscode-a2ml](https://github.com/hyperpolymath/vscode-a2ml) + - [tree-sitter-a2ml](https://github.com/hyperpolymath/tree-sitter-a2ml) + - [pandoc-k9](https://github.com/hyperpolymath/pandoc-k9) diff --git a/showcase/content/index.md b/showcase/content/index.md new file mode 100644 index 0000000..d8b8920 --- /dev/null +++ b/showcase/content/index.md @@ -0,0 +1,69 @@ +--- +title: A2ML +date: 2026-03-16 +order: 1 +--- + +
+

A2ML

+

Attested Markup Language

+

Every AI agent needs an identity. A2ML gives them one.

+

A universal manifest format that lets AI agents declare their capabilities, +prove their provenance through attestation chains, and establish trust +through verifiable metadata.

+Get Started +
+ +## What is A2ML? + +A2ML (Attested Markup Language) is a structured document format designed for the age of AI agents. It solves a fundamental problem: **how do you know what an AI agent is, what it can do, and whether you should trust it?** + +A2ML files (`.a2ml`) act as identity documents for software agents. They combine human-readable markup with machine-verifiable attestation blocks, creating a chain of trust that can be audited by both people and automated systems. + +
+
+

Attestation Chains

+

Every claim is backed by a verifiable attestation. Agents sign their capabilities, and auditors countersign. Trust is earned, not assumed.

+
+
+

Provenance Tracking

+

Know exactly where a manifest came from, who authored it, and what has changed. Full lineage from creation to deployment.

+
+
+

Agent Identity

+

Unique agent identifiers, capability declarations, and trust levels. Every agent in your system has a clear, auditable identity.

+
+
+

CI/CD Native

+

Designed to live in repositories alongside code. Validate manifests in pipelines, enforce policies in pull requests, audit in production.

+
+
+ +## Why A2ML? + +As AI agents proliferate across CI/CD pipelines, security scanners, code reviewers, and orchestration systems, the question of **agent accountability** becomes critical. Who deployed this bot? What permissions does it have? Who attested to its behaviour? + +A2ML answers these questions with a format that is: + +- **Human-readable** — uses familiar markup syntax with headings, lists, and paragraphs +- **Machine-parseable** — directive blocks (`@attestation:` ... `@end`) carry structured data +- **Auditable** — attestation chains create a verifiable trust graph +- **Composable** — agents can reference each other's manifests to build multi-agent trust networks + +## Tooling Ecosystem + +A2ML is not a paper specification. It ships with real, working tools: + +- **[Pandoc](https://pandoc.org)** reader, writer, filter, and template via [pandoc-a2ml](https://github.com/hyperpolymath/pandoc-a2ml) — convert A2ML to HTML, PDF, Markdown, and 40+ other formats +- **[VS Code](https://code.visualstudio.com)** syntax highlighting via [vscode-a2ml](https://github.com/hyperpolymath/vscode-a2ml) +- **[Tree-sitter](https://tree-sitter.github.io)** grammar via [tree-sitter-a2ml](https://github.com/hyperpolymath/tree-sitter-a2ml) — works in Neovim, Helix, Zed, and GitHub +- **GitHub Linguist** — language detection (submission pending) + +## Part of a Larger Ecosystem + +A2ML integrates with the broader hyperpolymath standards: + +- **[K9 Validators](https://github.com/hyperpolymath/pandoc-k9)** — contractile enforcement for repository policies +- **[Hypatia](https://github.com/hyperpolymath/hypatia)** — neurosymbolic CI/CD security scanning that consumes A2ML manifests +- **[PanLL](https://github.com/hyperpolymath/panll)** — panel framework with A2ML-based panel identity +- **[Rhodium Standard Repositories](https://github.com/hyperpolymath/rhodium-standard-repositories)** — repository quality standard that requires A2ML manifests diff --git a/showcase/content/integrations.md b/showcase/content/integrations.md new file mode 100644 index 0000000..fdbfe5a --- /dev/null +++ b/showcase/content/integrations.md @@ -0,0 +1,145 @@ +--- +title: Integrations +date: 2026-03-16 +order: 4 +--- + +# Integrations + +A2ML has working integrations across editors, build tools, and language ecosystems. This is not a roadmap — these tools exist today. + +--- + +
+ +## Pandoc Live + +Full Pandoc integration via [pandoc-a2ml](https://github.com/hyperpolymath/pandoc-a2ml): custom reader, writer, Lua filter, and HTML template. + +Convert A2ML to any of Pandoc's 40+ output formats (HTML, PDF, DOCX, LaTeX, Markdown, reStructuredText, EPUB, and more), or convert *from* any Pandoc input format into A2ML. + +```bash +# Read A2ML, output HTML +pandoc -f a2ml-reader.lua manifest.a2ml -o manifest.html + +# Read A2ML, output PDF +pandoc -f a2ml-reader.lua manifest.a2ml -o manifest.pdf + +# Convert Markdown to A2ML +pandoc README.md -t a2ml-writer.lua -o README.a2ml + +# Apply the A2ML filter for attestation validation +pandoc -f a2ml-reader.lua --lua-filter a2ml-filter.lua manifest.a2ml -o report.html +``` + +**Install:** Clone the repo and add the Lua scripts to your Pandoc data directory, or reference them by path. + +**Repository:** [github.com/hyperpolymath/pandoc-a2ml](https://github.com/hyperpolymath/pandoc-a2ml) + +
+ +
+ +## VS Code Live + +Syntax highlighting, bracket matching, and snippet support for `.a2ml` files in Visual Studio Code. + +Features: +- Full TextMate grammar for A2ML syntax +- Highlighting for directives (`@attestation:` ... `@end`), headings, inline formatting, and comments +- Snippets for common patterns (attestation block, policy block, provenance block) +- File icon for `.a2ml` files +- Language configuration for bracket/comment auto-pairing + +**Install:** Search "A2ML" in the VS Code marketplace, or install from VSIX. + +**Repository:** [github.com/hyperpolymath/vscode-a2ml](https://github.com/hyperpolymath/vscode-a2ml) + +
+ +
+ +## Tree-sitter Live + +A [tree-sitter](https://tree-sitter.github.io) grammar for A2ML, enabling syntax highlighting and structural queries in any editor that supports tree-sitter. + +Works with: +- **Neovim** (via nvim-treesitter) +- **Helix** (built-in tree-sitter support) +- **Zed** (built-in tree-sitter support) +- **GitHub** (syntax highlighting in code views, via tree-sitter) +- **Emacs** (via tree-sitter-langs) + +The grammar parses the full A2ML syntax including nested directive blocks, attestation fields, and inline formatting. + +**Repository:** [github.com/hyperpolymath/tree-sitter-a2ml](https://github.com/hyperpolymath/tree-sitter-a2ml) + +
+ +
+ +## GitHub Linguist Pending + +A pull request to add A2ML to [GitHub Linguist](https://github.com/github-linguist/linguist) is in preparation. Once merged, GitHub will: + +- Detect `.a2ml` files automatically +- Show A2ML in repository language statistics +- Apply syntax highlighting using the tree-sitter grammar +- Recognise `application/vnd.a2ml` as a registered media type + +
+ +
+ +## K9 Validators Live + +[pandoc-k9](https://github.com/hyperpolymath/pandoc-k9) provides contractile validation for A2ML files. K9 validators enforce structural and policy constraints: + +- **must** — required fields and sections +- **trust** — attestation chain validity +- **dust** — deprecated pattern detection +- **intend** — intent declaration verification + +K9 runs in CI/CD pipelines and can block merges when A2ML manifests fail validation. + +**Repository:** [github.com/hyperpolymath/pandoc-k9](https://github.com/hyperpolymath/pandoc-k9) + +
+ +
+ +## LuaRocks Live + +The A2ML Pandoc components are available as a Lua library via [LuaRocks](https://luarocks.org), making it straightforward to integrate A2ML parsing into any Lua-based toolchain. + +```bash +luarocks install pandoc-a2ml +``` + +
+ +
+ +## Hypatia CI/CD Scanner Live + +[Hypatia](https://github.com/hyperpolymath/hypatia) consumes A2ML manifests as part of its neurosymbolic security scanning. It: + +- Reads `0-AI-MANIFEST.a2ml` to understand repository structure +- Validates attestation chains in `.machine_readable/*.a2ml` files +- Enforces that all agents operating on a repository have valid manifests +- Reports trust-level gaps in CI pipeline output + +
+ +
+ +## Hackage (Haskell) Coming Soon + +A native Haskell library for parsing and generating A2ML is in development. It will provide: + +- Pure Haskell parser (no Pandoc dependency) +- Type-safe AST for A2ML documents +- Attestation chain validation +- Integration with the Pandoc Haskell library + +
diff --git a/showcase/content/specification.md b/showcase/content/specification.md new file mode 100644 index 0000000..c4d0e0f --- /dev/null +++ b/showcase/content/specification.md @@ -0,0 +1,248 @@ +--- +title: Specification +date: 2026-03-16 +order: 2 +--- + +# A2ML Specification + +## Overview + +A2ML (Attested Markup Language) is a text-based document format that combines human-readable markup with machine-verifiable attestation blocks. This page describes the format as currently implemented in the [pandoc-a2ml](https://github.com/hyperpolymath/pandoc-a2ml) toolchain. + +## File Format + +- **Extension:** `.a2ml` +- **Media type:** `application/vnd.a2ml` (IANA registration pending) +- **Encoding:** UTF-8 +- **Line endings:** LF (Unix-style) recommended; CRLF accepted + +## Basic Syntax + +A2ML uses a Markdown-like syntax with additional constructs for attestation and structured metadata. + +### Headings + +``` +# Top-level heading +## Second-level heading +### Third-level heading +``` + +### Inline Formatting + +``` +**Bold text** for emphasis +*Italic text* for secondary emphasis +[Link text](https://example.com) for hyperlinks +@ref(section-id) for internal cross-references +`inline code` for identifiers +``` + +### Lists + +``` +- Unordered list item +- Another item +* Asterisk syntax also works + +1. Ordered list item +2. Another item +``` + +### Code Blocks + +```` +```language +code goes here +``` +```` + +### Comments + +``` +;; Scheme-style comments are stripped during parsing. +;; Use these for notes that should not appear in output. +``` + +## Directive Blocks + +Directives are the core extension that distinguishes A2ML from plain Markdown. They carry structured, machine-readable content within annotated blocks. + +### Syntax + +``` +@directive-name: +Content of the directive. +Can span multiple lines. +@end +``` + +The parser collects everything between `@directive-name:` and `@end` into a named container (rendered as a `
` with `class="directive-name"` in HTML output). + +### Standard Directives + +The following directives have conventional meaning across the A2ML ecosystem. Tooling may validate or enforce these. + +#### `@abstract` + +A short summary of the document's purpose. Typically one to three sentences. + +``` +@abstract: +A2ML is a typed, attested markup format for AI agent identity. +@end +``` + +#### `@attestation` + +A trust claim with structured fields. This is the fundamental unit of the A2ML trust model. + +``` +@attestation: +agent-id: hypatia-scanner-v3 +attested-by: rhodibot +trust-level: verified +timestamp: 2026-03-16T14:30:00Z +signature: sha256:9f86d08... +capabilities: + - static-analysis + - secret-detection + - dependency-audit +scope: repository +@end +``` + +**Fields:** + +| Field | Required | Description | +|-------|----------|-------------| +| `agent-id` | Yes | Unique identifier for the agent being attested | +| `attested-by` | Yes | Identifier of the attesting authority | +| `trust-level` | Yes | One of: `self-declared`, `peer-reviewed`, `verified`, `audited` | +| `timestamp` | Yes | ISO 8601 timestamp of the attestation | +| `signature` | Recommended | Cryptographic signature (algorithm:hash) | +| `capabilities` | Yes | List of declared capabilities | +| `scope` | No | Scope of the attestation (e.g., `repository`, `organization`, `global`) | + +#### `@refs` + +References and citations. Used for linking to external specifications, standards, or related documents. + +``` +@refs: +[1] Attested Markup Language Specification (draft), 2026 +[2] SLSA Supply Chain Framework, https://slsa.dev +@end +``` + +#### `@policy` + +Declares a policy constraint that tooling should enforce. + +``` +@policy: +require: attestation.trust-level >= verified +enforce: ci-pipeline +action: block-merge +@end +``` + +#### `@provenance` + +Records the origin and lineage of the document. + +``` +@provenance: +created-by: Jonathan D.A. Jewell +created: 2026-01-15 +last-modified: 2026-03-16 +source: https://github.com/hyperpolymath/a2ml-spec +version: 0.3.0 +@end +``` + +## Attestation Chains + +The real power of A2ML comes from **attestation chains** — sequences of attestations where each one references or builds upon previous ones. + +``` +;; Agent declares its own capabilities +@attestation: +agent-id: codebot-v2 +attested-by: codebot-v2 +trust-level: self-declared +capabilities: + - code-review + - style-checking +@end + +;; Security team verifies the agent +@attestation: +agent-id: codebot-v2 +attested-by: security-team +trust-level: verified +verifies: codebot-v2/self-declared/2026-03-10 +signature: sha256:a3f2c8... +@end + +;; Auditor provides highest-level attestation +@attestation: +agent-id: codebot-v2 +attested-by: external-auditor +trust-level: audited +verifies: codebot-v2/verified/2026-03-12 +audit-report: https://audits.example.com/codebot-v2 +signature: sha256:7b1e4d... +@end +``` + +Each successive attestation raises the trust level and creates an auditable trail from `self-declared` through `verified` to `audited`. + +## Trust Levels + +| Level | Meaning | Typical Attester | +|-------|---------|------------------| +| `self-declared` | Agent claims its own capabilities | The agent itself | +| `peer-reviewed` | Another agent or team has reviewed the claims | A peer agent or team lead | +| `verified` | A security or operations team has validated behaviour | Security team, CI system | +| `audited` | An independent audit has confirmed the claims | External auditor | + +## Canonical File Locations + +In repositories following the [Rhodium Standard](https://github.com/hyperpolymath/rhodium-standard-repositories), A2ML files live in the `.machine_readable/` directory: + +``` +.machine_readable/ + STATE.a2ml # Project state and progress + META.a2ml # Architecture decisions, governance + ECOSYSTEM.a2ml # Position in ecosystem, relationships + AGENTIC.a2ml # AI agent interaction patterns + NEUROSYM.a2ml # Neurosymbolic integration config + PLAYBOOK.a2ml # Operational runbook + anchors/ + ANCHOR.a2ml # Canonical authority declaration + policies/ + MAINTENANCE-AXES.a2ml + MAINTENANCE-CHECKLIST.a2ml +``` + +The top-level `0-AI-MANIFEST.a2ml` serves as the entry point that all AI agents must read first. + +## Pandoc Integration + +A2ML is a first-class Pandoc format. Convert between A2ML and any Pandoc-supported format: + +```bash +# A2ML to HTML +pandoc -f a2ml-reader.lua input.a2ml -o output.html + +# A2ML to PDF (via LaTeX) +pandoc -f a2ml-reader.lua input.a2ml -o output.pdf + +# Markdown to A2ML +pandoc input.md -t a2ml-writer.lua -o output.a2ml + +# A2ML to A2ML (normalise) +pandoc -f a2ml-reader.lua input.a2ml -t a2ml-writer.lua -o normalised.a2ml +``` diff --git a/showcase/contractile.just b/showcase/contractile.just new file mode 100644 index 0000000..9a5827b --- /dev/null +++ b/showcase/contractile.just @@ -0,0 +1,75 @@ +# Auto-generated by: contractile gen-just +# Source directory: contractiles +# Re-generate with: contractile gen-just --dir contractiles +# +# SPDX-License-Identifier: MPL-2.0 + +# === DUST (Recovery & Rollback) === +# Source: Dustfile.a2ml + +# List available dust recovery actions +dust-status: + @echo ' dust-source-rollback: Revert all source changes to last commit [rollback]' + +# Revert all source changes to last commit +dust-source-rollback: + @echo 'Executing rollback for source-rollback' + git checkout HEAD -- . + + +# === INTEND (Declared Future Intent) === +# Source: Intentfile.a2ml + +# Display declared future intents +intend-list: + @echo '=== Declared Intent ===' + @echo '' + @echo 'Features:' + @echo '' + @echo 'Quality:' + + +# === MUST (Physical State Checks) === +# Source: Mustfile.a2ml + +# Run all must checks +must-check: must-license-present must-readme-present must-spdx-headers must-no-banned-files + @echo 'All must checks passed' + +# LICENSE file must exist +must-license-present: + test -f LICENSE + +# README must exist +must-readme-present: + test -f README.adoc || test -f README.md + +# Source files should have SPDX license headers +must-spdx-headers: + find . -name '*.rs' -o -name '*.res' -o -name '*.gleam' | head -20 | xargs -r grep -L 'SPDX-License-Identifier' | wc -l | grep -q '^0$' + +# No Dockerfiles or Makefiles +must-no-banned-files: + test ! -f Dockerfile && test ! -f Makefile + + +# === TRUST (Integrity & Provenance Verification) === +# Source: Trustfile.a2ml + +# Run all trust verifications +trust-verify: trust-license-content trust-no-secrets-committed trust-container-images-pinned + @echo 'All trust verifications passed' + +# LICENSE contains expected SPDX identifier +trust-license-content: + grep -q 'SPDX\|License\|MIT\|Apache\|PMPL\|MPL' LICENSE + +# No .env or credential files in repo +trust-no-secrets-committed: + test ! -f .env && test ! -f credentials.json && test ! -f .env.local + +# Containerfile base images use pinned digests +trust-container-images-pinned: + test ! -f Containerfile || grep -q '@sha256:' Containerfile + + diff --git a/showcase/contractiles/intend/Intentfile.a2ml b/showcase/contractiles/intend/Intentfile.a2ml new file mode 100644 index 0000000..0fa6a86 --- /dev/null +++ b/showcase/contractiles/intend/Intentfile.a2ml @@ -0,0 +1,22 @@ +# SPDX-License-Identifier: MPL-2.0 +# Intentfile (A2ML Canonical) +# Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) + +@abstract: +Declared intent and purpose for A2Ml Showcase. +@end + +## Purpose + +A2Ml Showcase — // SPDX-License-Identifier: MPL-2.0 + +## Anti-Purpose + +This project is NOT: +- A fork or wrapper around another tool +- A monorepo (unless explicitly structured as one) + +## If In Doubt + +If you are unsure whether a change is in scope, ask. +Sensitive areas: ABI definitions, license headers, CI workflows. diff --git a/showcase/contractiles/must/Mustfile.a2ml b/showcase/contractiles/must/Mustfile.a2ml new file mode 100644 index 0000000..8e575ab --- /dev/null +++ b/showcase/contractiles/must/Mustfile.a2ml @@ -0,0 +1,42 @@ +# SPDX-License-Identifier: MPL-2.0 +# Mustfile (A2ML Canonical) +# Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) + +@abstract: +Physical State contract for A2Ml Showcase. Baseline UX Manifesto invariants +that MUST hold at all times. +@end + +@requires: +- section: Core-Files +- section: Banned +@end + +## Core-Files + +### license-present +- description: LICENSE file must exist +- run: test -f LICENSE +- severity: critical + +### readme-present +- description: README must exist +- run: test -f README.adoc || test -f README.md +- severity: critical + +## Banned + +### no-hardcoded-paths +- description: No hardcoded developer paths +- run: "! grep -rn '$HOME\|$ECLIPSE_DIR' --include='*.rs' --include='*.res' --include='*.ex' --include='*.gleam' --include='*.zig' --include='*.sh' . 2>/dev/null | grep -v '.git/' | grep -v 'ux-rollout.jl' | head -1" +- severity: critical + +### no-dockerfiles +- description: No Dockerfiles (use Containerfile) +- run: test ! -f Dockerfile +- severity: warning + +### no-makefiles +- description: No Makefiles (use Justfile) +- run: test ! -f Makefile +- severity: warning diff --git a/showcase/contractiles/trust/Trustfile.a2ml b/showcase/contractiles/trust/Trustfile.a2ml new file mode 100644 index 0000000..4c2dfd8 --- /dev/null +++ b/showcase/contractiles/trust/Trustfile.a2ml @@ -0,0 +1,25 @@ +# SPDX-License-Identifier: MPL-2.0 +# Trustfile (A2ML Canonical) +# Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) + +@abstract: +Trust and provenance verification for A2Ml Showcase. +Maximal trust by default — LLM may read, build, test, lint, format. +@end + +@trust-level: maximal +@trust-boundary: repo +@trust-actions: [read, build, test, lint, format] +@trust-deny: [delete-branch, force-push, modify-ci-secrets, publish] + +## Integrity + +### license-content +- description: LICENSE contains expected SPDX identifier +- run: grep -q 'SPDX\|License\|MIT\|Apache\|PMPL\|MPL' LICENSE +- severity: critical + +### no-secrets-committed +- description: No .env or credential files in repo +- run: test ! -f .env && test ! -f credentials.json && test ! -f .env.local +- severity: critical diff --git a/showcase/docs/accessibility/README.adoc b/showcase/docs/accessibility/README.adoc new file mode 100644 index 0000000..0857781 --- /dev/null +++ b/showcase/docs/accessibility/README.adoc @@ -0,0 +1,42 @@ += Accessibility Compliance for a2ml-showcase +:revnumber: 1.0.0 +:revdate: 2026-04-08 + +== WCAG 2.1 Compliance + +This repository complies with WCAG 2.1 Level A accessibility standards. + +=== Compliance Status + +[cols="1,1,1,1"] +|=== +|Standard |Level |Status |Notes + +|WCAG 2.1 |A |Compliant | +|WCAG 2.1 |AA |Partial | +|WCAG 2.1 |AAA |Not Applicable | +|=== + +== Accessibility Features + +* Semantic HTML structure +* Keyboard navigation support +* ARIA attributes where appropriate +* Color contrast compliance +* Alternative text for images + +== Testing + +Accessibility testing is performed using: + +* Automated tools (axe, Lighthouse) +* Manual keyboard navigation testing +* Screen reader testing (NVDA, VoiceOver) + +== Reporting Issues + +Please report accessibility issues to: hyperpolymath@proton.me + +== Compliance Documentation + +See link:../compliance/ACCESSIBILITY.adoc[ACCESSIBILITY.adoc] for detailed compliance reports. diff --git a/showcase/docs/accessibility/STANDARD.a2ml b/showcase/docs/accessibility/STANDARD.a2ml new file mode 100644 index 0000000..e95e13f --- /dev/null +++ b/showcase/docs/accessibility/STANDARD.a2ml @@ -0,0 +1,318 @@ +# SPDX-License-Identifier: MPL-2.0 +# Hyperpolymath Accessibility Standard (HAS) +# Canonical accessibility requirements for all projects + +@abstract: +The Hyperpolymath Accessibility Standard (HAS) defines minimum accessibility +requirements for all projects in the ecosystem. Compliance with HAS ensures +that our tools are usable by everyone, regardless of ability. + +HAS is structured as a contractile system with three compliance levels: +- Level A: Minimum viability (must) +- Level AA: Recommended (should) +- Level AAA: Enhanced (aspire) +@end + +## Compliance Levels + +### Level A (Minimum) +- description: Minimum accessibility for basic usability +- required: true +- probe: test -f .machine_readable/contractiles/adjust/Adjustfile.a2ml +- notes: All projects must meet Level A + +### Level AA (Recommended) +- description: WCAG 2.1 AA compliance +- required: true +- target: Q4 2026 +- notes: All user-facing projects must meet Level AA + +### Level AAA (Enhanced) +- description: WCAG 2.1 AAA compliance +- required: false +- target: 2027 +- notes: Aspirational goal for all projects + +## Keyboard Accessibility (Level A) + +### keyboard-navigation +- description: All functionality available via keyboard +- compliance: A +- probe: test -f accessibility/keyboard.ex || find . -name "*keyboard*" -type f +- notes: Tab, arrow keys, space/enter for activation + +### keyboard-shortcuts +- description: Configurable keyboard shortcuts +- compliance: A +- probe: grep -r "keybindings\|shortcuts" . 2>/dev/null +- notes: User-remappable keybindings + +### focus-management +- description: Visible focus indicators +- compliance: A +- probe: grep -r "focus\|:focus" . 2>/dev/null +- notes: CSS focus styles required + +## Visual Accessibility (Level AA) + +### high-contrast +- description: High contrast mode +- compliance: AA +- probe: grep -r "contrast\|a11y-contrast" . 2>/dev/null +- target: 4.5:1 contrast ratio + +### colorblind-support +- description: Colorblind-friendly palettes +- compliance: AA +- probe: find . -name "*colorblind\|*palette*" -type f +- palettes: deuteranopia, protanopia, tritanopia + +### font-size-adjustment +- description: Resizable text (14-20px) +- compliance: AA +- probe: grep -r "font-size\|text-scale" . 2>/dev/null +- persistence: User preference saved + +### theme-switching +- description: Dark/light/system themes +- compliance: AA +- probe: grep -r "theme\|dark-mode" . 2>/dev/null +- os-preference: Respects system setting + +## Auditory Accessibility (Level AA) + +### screen-reader +- description: Screen reader compatibility +- compliance: AA +- probe: find . -name "*aria\|*screenreader*" -type f +- attributes: aria-label, aria-live, role + +### closed-captions +- description: Real-time captions +- compliance: AA +- probe: grep -r "caption\|subtitle" . 2>/dev/null +- accuracy: 90%+ for English + +### volume-normalization +- description: Consistent volume levels +- compliance: AA +- probe: grep -r "volume\|loudness" . 2>/dev/null +- standard: EBU R128 (-23 LUFS) + +## Motor Accessibility (Level AA) + +### reduced-motion +- description: Reduced animation option +- compliance: AA +- probe: grep -r "motion\|animation" . 2>/dev/null +- media-query: prefers-reduced-motion + +### voice-commands +- description: Voice control interface +- compliance: AA +- probe: grep -r "voice\|speech" . 2>/dev/null +- fallback: Keyboard alternative + +## Cognitive Accessibility (Level AAA) + +### clear-language +- description: Plain language mode +- compliance: AAA +- probe: grep -r "simplify\|plain-language" . 2>/dev/null +- glossary: Jargon explanations + +### predictable-navigation +- description: Consistent navigation +- compliance: AAA +- probe: grep -r "nav\|menu" . 2>/dev/null +- testing: User testing required + +### error-prevention +- description: Confirmation for destructive actions +- compliance: AAA +- probe: grep -r "confirm\|warn" . 2>/dev/null +- undo: Undo functionality + +## Implementation Requirements + +### documentation +- description: Accessibility documentation required +- compliance: A +- probe: test -f docs/accessibility/README.adoc +- format: AsciiDoc with examples + +### testing +- description: Automated accessibility tests +- compliance: AA +- probe: grep -r "pa11y\|axe\|accessibility" .github/workflows/ 2>/dev/null +- tools: pa11y, axe-core, or equivalent + +### compliance-report +- description: VPAT compliance report +- compliance: AA +- probe: test -f docs/compliance/ACCESSIBILITY.adoc +- format: VPAT 2.4 template + +## Compliance Matrix + +| Project Type | Level A | Level AA | Level AAA | +|--------------|---------|----------|-----------| +| Internal tools | Required | Recommended | Optional | +| User-facing apps | Required | Required | Aspirational | +| Public websites | Required | Required | Required | +| Libraries/SDKs | Required | Recommended | Optional | + +## Validation + +### automated-testing +- description: CI/CD accessibility tests +- compliance: AA +- probe: grep -r "accessibility" .github/workflows/ 2>/dev/null +- tools: pa11y, axe-core, or custom + +### manual-testing +- description: Manual testing required +- compliance: AA +- probe: test -f docs/testing/ACCESSIBILITY.adoc +- coverage: Keyboard, screen reader, high contrast + +### user-testing +- description: User testing with diverse abilities +- compliance: AAA +- probe: grep -r "user-testing\|usability" docs/ 2>/dev/null +- participants: Minimum 5 diverse users + +## Timeline + +### 2026-Q2 +- description: Level A compliance for all projects +- target: June 30, 2026 +- status: In progress + +### 2026-Q4 +- description: Level AA compliance for user-facing projects +- target: December 31, 2026 +- status: Planned + +### 2027 +- description: Level AAA compliance for public websites +- target: December 31, 2027 +- status: Aspirational + +## References + +### WCAG 2.1 +- url: https://www.w3.org/WAI/standards-guidelines/wcag/ +- level: AA compliance target + +### Section 508 +- url: https://www.section508.gov/ +- level: Equivalent to WCAG 2.1 AA + +### EN 301 549 +- url: https://www.etsi.org/deliver/etsi_en/301500_301599/301549/02.12.01_60/en_301549v021201p.pdf +- level: EU public sector requirement + +### VPAT 2.4 +- url: https://www.itic.org/policy/accessibility/vpat +- format: Voluntary Product Accessibility Template + +## Implementation Guide + +### For Project Maintainers + +1. Create accessibility module: + ```bash + mkdir -p server/lib/your_project/accessibility + ``` + +2. Add Adjustfile.a2ml: + ```bash + cp /var/mnt/eclipse/repos/developer-ecosystem/standards/accessibility/Adjustfile.a2ml \ + .machine_readable/contractiles/adjust/ + ``` + +3. Implement keyboard navigation: + ```elixir + # Example: server/lib/your_project/accessibility/keyboard.ex + @default_bindings %{ + "Space" => :ptt, + "m" => :mute, + "d" => :deafen + } + ``` + +4. Add screen reader support: + ```elixir + # Example: server/lib/your_project/accessibility/screen_reader.ex + def announce_join(username, room) do + speak("#{username} joined #{room}") + end + ``` + +5. Document accessibility features: + ```bash + mkdir -p docs/accessibility + cp /var/mnt/eclipse/repos/developer-ecosystem/standards/accessibility/README.adoc \ + docs/accessibility/ + ``` + +### For Developers + +1. Follow keyboard accessibility guidelines: + - All interactive elements must be keyboard-operable + - Provide visible focus indicators + - Support standard keyboard shortcuts + +2. Use semantic HTML: + ```html + +
...
+ ``` + +3. Respect user preferences: + ```css + @media (prefers-reduced-motion: reduce) { + * { + animation: none !important; + transition: none !important; + } + } + ``` + +4. Test with screen readers: + - NVDA (Windows) + - VoiceOver (macOS) + - Orca (Linux) + +### For Testers + +1. Keyboard-only testing: + - Tab through all interactive elements + - Verify focus indicators + - Test all shortcuts + +2. Screen reader testing: + - Navigate using screen reader + - Verify ARIA attributes + - Test live regions + +3. High contrast testing: + - Enable high contrast mode + - Verify readability + - Check colorblind simulation + +## Compliance Checklist + +- [ ] Adjustfile.a2ml created +- [ ] Keyboard navigation implemented +- [ ] Screen reader support added +- [ ] Accessibility documentation written +- [ ] Automated tests added to CI +- [ ] Manual testing completed +- [ ] VPAT compliance report created + +## License + +SPDX-License-Identifier: MPL-2.0 +Copyright (c) 2026 Hyperpolymath diff --git a/showcase/docs/compliance/ACCESSIBILITY.adoc b/showcase/docs/compliance/ACCESSIBILITY.adoc new file mode 100644 index 0000000..c1d4be3 --- /dev/null +++ b/showcase/docs/compliance/ACCESSIBILITY.adoc @@ -0,0 +1,26 @@ += VPAT (Voluntary Product Accessibility Template) for a2ml-showcase +:revnumber: 1.0.0 +:revdate: 2026-04-08 + +== Product Information + +* Product Name: a2ml-showcase +* Version: 1.0.0 +* Date: 2026-04-08 +* Contact: hyperpolymath@proton.me + +== WCAG 2.1 Compliance + +=== Level A Compliance: 100%\|=== Level AA Compliance: 95% + +== Compliance Summary + +* Level A: 100% compliant +* Level AA: 95% compliant +* Level AAA: Not applicable + +== Contact Information + +For accessibility concerns, please contact: +* Email: hyperpolymath@proton.me +* GitHub: https://github.com/hyperpolymath diff --git a/showcase/guix.scm b/showcase/guix.scm new file mode 100644 index 0000000..358c4e4 --- /dev/null +++ b/showcase/guix.scm @@ -0,0 +1,18 @@ +; SPDX-License-Identifier: MPL-2.0 +;; guix.scm — GNU Guix package definition for a2ml-showcase +;; Usage: guix shell -f guix.scm + +(use-modules (guix packages) + (guix build-system gnu) + (guix licenses)) + +(package + (name "a2ml-showcase") + (version "0.1.0") + (source #f) + (build-system gnu-build-system) + (synopsis "a2ml-showcase") + (description "a2ml-showcase — part of the hyperpolymath ecosystem.") + (home-page "https://github.com/hyperpolymath/a2ml-showcase") + (license ((@@ (guix licenses) license) "MPL-2.0" + "https://github.com/hyperpolymath/palimpsest-license"))) diff --git a/showcase/k9iser.toml b/showcase/k9iser.toml new file mode 100644 index 0000000..849ea36 --- /dev/null +++ b/showcase/k9iser.toml @@ -0,0 +1,27 @@ +# SPDX-License-Identifier: MPL-2.0 +# Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) +# +# k9iser manifest for a2ml-showcase +# A2ML showcase — Deno-based demonstration and example collection for the A2ML format + +[project] +name = "a2ml-showcase" +safety_tier = "hunt" + +[[source]] +path = "deno.json" +type = "deno" +output = "generated/k9iser/deno-workspace.k9" + +[[source]] +path = "Justfile" +type = "justfile" +output = "generated/k9iser/justfile-recipes.k9" + +[[constraint]] +rule = "build.dependencies has no banned_packages" +severity = "error" + +[[constraint]] +rule = "deno.imports has no npm: specifiers" +severity = "error" diff --git a/showcase/llm-warmup-dev.md b/showcase/llm-warmup-dev.md new file mode 100644 index 0000000..2cf425f --- /dev/null +++ b/showcase/llm-warmup-dev.md @@ -0,0 +1,16 @@ +# LLM Warmup — a2ml-showcase (Developer) + +## What is a2ml-showcase? +See README.adoc for overview. + +## Key Commands +- `just setup` — set up development environment +- `just build` — build the project +- `just test` — run tests +- `just doctor` — diagnose issues +- `just heal` — attempt auto-repair + +## Quick Context +- License: MPL-2.0 +- Part of hyperpolymath ecosystem +- See EXPLAINME.adoc for architecture diff --git a/showcase/llm-warmup-user.md b/showcase/llm-warmup-user.md new file mode 100644 index 0000000..7998946 --- /dev/null +++ b/showcase/llm-warmup-user.md @@ -0,0 +1,16 @@ +# LLM Warmup — a2ml-showcase (User) + +## What is a2ml-showcase? +See README.adoc for overview. + +## Key Commands +- `just setup` — set up development environment +- `just build` — build the project +- `just test` — run tests +- `just doctor` — diagnose issues +- `just heal` — attempt auto-repair + +## Quick Context +- License: MPL-2.0 +- Part of hyperpolymath ecosystem +- See EXPLAINME.adoc for architecture diff --git a/showcase/mise.toml b/showcase/mise.toml new file mode 100644 index 0000000..6dd983f --- /dev/null +++ b/showcase/mise.toml @@ -0,0 +1,57 @@ +[tools] +# Language runtimes +node = "latest" +python = "latest" +rust = "latest" +go = "latest" +zig = "latest" +java = "latest" +bun = "latest" +denojs = "latest" + +# Package managers +npm = "latest" +yarn = "latest" +pnpm = "latest" +pip = "latest" +cargo = "latest" +go-task = "latest" + +# Formatting & Linting +gofmt = "latest" +black = "latest" +isort = "latest" +ruff = "latest" +prettier = "latest" +shfmt = "latest" +stylua = "latest" + +# Build tools +cmake = "latest" +make = "latest" +ninja = "latest" + +# Shell tools +git = "latest" +gnu-sed = "latest" +gnu-tar = "latest" +gnu-grep = "latest" + +# Testing +vitest = "latest" +pytest = "latest" +jest = "latest" + +[env] +# Common environment variables +NODE_ENV = "development" +PYTHONDONTWRITEBYTECODE = "1" +PYTHONUNBUFFERED = "1" + +# Task runner alias +[alias] +task = "go-task" +build = "cargo build --release || npm run build || go build" +test = "cargo test || npm test || go test ./..." +lint = "ruff check . || prettier --check . || black --check ." +fmt = "ruff format . || prettier --write . || black ." diff --git a/showcase/output/.well-known/security.txt b/showcase/output/.well-known/security.txt new file mode 100644 index 0000000..71044fa --- /dev/null +++ b/showcase/output/.well-known/security.txt @@ -0,0 +1,28 @@ +-----BEGIN PGP SIGNED MESSAGE----- +Hash: SHA512 + +# Security contact for a2ml.net — RFC 9116 +# https://a2ml.net/.well-known/security.txt + +Contact: mailto:j.d.a.jewell@open.ac.uk +Encryption: openpgp4fpr:4A03639C1EB1F86C7F0C97A91835A14A2867091E +Expires: 2027-06-21T00:00:00Z +Preferred-Languages: en +Canonical: https://a2ml.net/.well-known/security.txt +Policy: https://github.com/hyperpolymath/a2ml-showcase/blob/main/SECURITY.md +-----BEGIN PGP SIGNATURE----- + +iQIzBAEBCgAdFiEEljlFF1RJblHWtTfK0RkBfr9pWrEFAmo5socACgkQ0RkBfr9p +WrFknA//WPsYI55diuLoE2GVMu7t0MWoxr+ZkVB3tJK29gNDxo865pO1Yz2hy0vL +/wSEDRed1WRFlaSGosjw07IVs2C58yw9X2tHnVa57U+gaObqHIEE+TM1nd7ynZXF +sjKZcjP06wt3uIL28fOaNbNXuNeaq6Len+2dnfq/sgsWms+MPXbQmqXiGmID0srb +26ES+NEQnL/FMaht7YoO67/m/o+33R36eItRO1bVnhTvjBrWXOErPK0g3tThIqyj +t+0JTkh4P68I+dAdCthZWebtk4L17YRvI5EQgooCAvI5DWhIZhi4rrQ+iscPOLhk +DIHaQnfAy2JKb9wu1bTx2zE/YeNGmSe8DgEDV2nVVdyBAVkvONg24MJeBEVtNfZV +Q3UgNnoMooS34wXR9Du0/fcD8ZJ8stpXuhf1Ylco+xURMU25Ct70jfCrO593ZMJP +JUJbKqmp+IGykhqTit0d6c7L3reTBETdhidLJKqAdiEYWqaX+rFluSV0wHAXK/Ge +h39YZyCEFZSKOzslzwnAlDbURAVjsXFFN5hMvniLlKs5qypbp6JrB8pTkpHG5D/1 +h2qndLYTVb+A74UT+8fnCBtZwZUnUwAAcQKSTVt44igFrkiZ1qFgARppo/xboM+u +Qc8Wv7c3mwfvFRK79kYoyeacno6gqHDh7aqJGnrLIzTca4txzsU= +=9jaq +-----END PGP SIGNATURE----- diff --git a/showcase/output/examples.html b/showcase/output/examples.html new file mode 100644 index 0000000..8bc1e82 --- /dev/null +++ b/showcase/output/examples.html @@ -0,0 +1,672 @@ + + + + + + + + + Examples — A2ML: Attested Markup Language + + + + + + + + +
+

Examples

+

Real-world A2ML manifests demonstrating the format in practice. Each example shows a different use case, from minimal declarations to multi-agent orchestration.

+

1. Minimal Manifest

+

The simplest possible A2ML file. Declares an agent with a single self-attestation.

+
;; SPDX-License-Identifier: MPL-2.0
+
+# Greeter Bot
+
+@abstract:
+A simple bot that greets new contributors in pull requests.
+@end
+
+@attestation:
+agent-id: greeter-bot
+attested-by: greeter-bot
+trust-level: self-declared
+capabilities:
+  - pr-comment
+scope: repository
+@end
+
+

This is enough for tooling to identify the agent, understand what it does, and record that its capabilities are self-declared (i.e., not yet independently verified).

+

---

+

2. CI/CD Agent Manifest

+

A GitHub Actions bot that runs in CI pipelines, with a verified attestation from the security team.

+
;; SPDX-License-Identifier: MPL-2.0
+
+# rhodibot — Repository Automation Agent
+
+@abstract:
+rhodibot automates repository maintenance tasks including
+label management, issue triage, and PR hygiene checks.
+It operates within GitHub Actions workflows.
+@end
+
+@provenance:
+created-by: Jonathan D.A. Jewell
+created: 2026-01-20
+last-modified: 2026-03-14
+source: https://github.com/hyperpolymath/gitbot-fleet
+version: 2.1.0
+@end
+
+## Capabilities
+
+- Applies labels based on file paths and PR content
+- Triages issues by parsing title and body against known patterns
+- Enforces branch naming conventions
+- Validates commit message format
+- Checks PR size and flags oversized changes
+
+@attestation:
+agent-id: rhodibot
+attested-by: rhodibot
+trust-level: self-declared
+timestamp: 2026-01-20T09:00:00Z
+capabilities:
+  - label-management
+  - issue-triage
+  - branch-validation
+  - commit-validation
+  - pr-size-check
+scope: organization
+@end
+
+@attestation:
+agent-id: rhodibot
+attested-by: security-team
+trust-level: verified
+timestamp: 2026-02-15T16:45:00Z
+verifies: rhodibot/self-declared/2026-01-20
+signature: sha256:4e2a91f7c8d3b0...
+note: Verified that rhodibot only reads repository metadata
+      and does not modify code or secrets.
+@end
+
+@policy:
+require: attestation.trust-level >= verified
+enforce: github-actions
+action: allow-execution
+@end
+
+@refs:
+[1] gitbot-fleet Documentation, https://github.com/hyperpolymath/gitbot-fleet
+[2] Rhodium Standard Repositories, https://github.com/hyperpolymath/rhodium-standard-repositories
+@end
+
+

---

+

3. Security Scanner Manifest

+

Hypatia, a neurosymbolic security scanner, declaring its scanning capabilities with an audited attestation.

+
;; SPDX-License-Identifier: MPL-2.0
+
+# Hypatia — Neurosymbolic Security Scanner
+
+@abstract:
+Hypatia performs multi-layered security analysis combining
+rule-based scanning with neurosymbolic reasoning. It detects
+secrets, vulnerable dependencies, misconfigured workflows,
+and policy violations.
+@end
+
+@provenance:
+created-by: Jonathan D.A. Jewell
+created: 2025-11-01
+last-modified: 2026-03-16
+source: https://github.com/hyperpolymath/hypatia
+version: 3.4.0
+@end
+
+## Scan Modules
+
+- **Secret detection** — API keys, tokens, credentials in source
+- **Dependency audit** — CVE matching against known vulnerabilities
+- **Workflow analysis** — GitHub Actions misconfigurations
+- **Policy enforcement** — RSR compliance, license headers, file locations
+- **Neurosymbolic reasoning** — pattern inference beyond static rules
+
+@attestation:
+agent-id: hypatia-scanner-v3
+attested-by: hypatia-scanner-v3
+trust-level: self-declared
+timestamp: 2025-11-01T12:00:00Z
+capabilities:
+  - secret-detection
+  - dependency-audit
+  - workflow-analysis
+  - policy-enforcement
+  - neurosymbolic-reasoning
+scope: global
+@end
+
+@attestation:
+agent-id: hypatia-scanner-v3
+attested-by: security-team
+trust-level: verified
+timestamp: 2026-01-10T14:00:00Z
+verifies: hypatia-scanner-v3/self-declared/2025-11-01
+signature: sha256:8b3d7f2e1a...
+@end
+
+@attestation:
+agent-id: hypatia-scanner-v3
+attested-by: independent-security-review
+trust-level: audited
+timestamp: 2026-02-28T10:30:00Z
+verifies: hypatia-scanner-v3/verified/2026-01-10
+audit-report: https://audits.hyperpolymath.dev/hypatia-v3
+signature: sha256:c91e5a3b0d...
+@end
+
+@refs:
+[1] Hypatia Documentation, https://github.com/hyperpolymath/hypatia
+[2] OWASP Top 10 for LLM Applications
+[3] SLSA Build Provenance, https://slsa.dev
+@end
+
+

---

+

4. Multi-Agent Orchestration

+

Multiple agents referencing each other's attestations to establish a trust network for a deployment pipeline.

+
;; SPDX-License-Identifier: MPL-2.0
+
+# Deployment Pipeline — Agent Trust Network
+
+@abstract:
+This manifest defines the trust relationships between agents
+involved in the production deployment pipeline. Each agent
+attests to the capabilities of the agents it depends on.
+@end
+
+## Pipeline Agents
+
+The deployment pipeline involves four agents, each responsible
+for a stage of the process:
+
+1. **codebot** — code review and static analysis
+2. **hypatia** — security scanning
+3. **sustainabot** — supply chain and dependency health
+4. **finishbot** — final approval and deployment trigger
+
+## Trust Chain
+
+@attestation:
+agent-id: codebot-v2
+attested-by: codebot-v2
+trust-level: self-declared
+timestamp: 2026-03-01T09:00:00Z
+capabilities:
+  - code-review
+  - style-enforcement
+  - complexity-analysis
+scope: pipeline
+@end
+
+@attestation:
+agent-id: sustainabot
+attested-by: sustainabot
+trust-level: self-declared
+timestamp: 2026-03-01T09:00:00Z
+capabilities:
+  - dependency-health
+  - license-compliance
+  - supply-chain-audit
+scope: pipeline
+@end
+
+;; Finishbot trusts codebot and sustainabot, and requires
+;; hypatia to have been audited before it will approve.
+
+@attestation:
+agent-id: finishbot
+attested-by: finishbot
+trust-level: self-declared
+timestamp: 2026-03-01T09:00:00Z
+capabilities:
+  - deployment-approval
+  - rollback-trigger
+requires:
+  - codebot-v2/verified
+  - hypatia-scanner-v3/audited
+  - sustainabot/verified
+scope: pipeline
+@end
+
+@policy:
+require: all-agents.trust-level >= verified
+require: hypatia-scanner-v3.trust-level == audited
+enforce: deployment-gate
+action: block-deploy
+message: All pipeline agents must be verified.
+         Hypatia must be independently audited.
+@end
+
+@refs:
+[1] gitbot-fleet, https://github.com/hyperpolymath/gitbot-fleet
+[2] Hypatia Scanner, https://github.com/hyperpolymath/hypatia
+[3] SLSA Framework, https://slsa.dev
+@end
+
+

This example shows how finishbot will refuse to approve a deployment unless codebot and sustainabot are at least verified, and hypatia has been independently audited. The policy block makes this machine-enforceable.

+ +
+ + +
+

+ + Built with ddraig-ssg (Idris 2) + · + A2ML is part of the + hyperpolymath + standards ecosystem +

+

+ Copyright © 2026 Jonathan D.A. Jewell (hyperpolymath). + Licensed under MPL-2.0. +

+
+ + + diff --git a/showcase/output/getting-started.html b/showcase/output/getting-started.html new file mode 100644 index 0000000..1b05719 --- /dev/null +++ b/showcase/output/getting-started.html @@ -0,0 +1,594 @@ + + + + + + + + + Get Started — A2ML: Attested Markup Language + + + + + + + + +
+

Get Started

+

A step-by-step guide to creating your first A2ML manifest, validating it, and integrating it into your project.

+

Prerequisites

+
    +
  • [Pandoc](https://pandoc.org/installing.html) 3.0 or later
  • +
  • Git (for cloning the tooling)
  • +
  • A text editor (VS Code recommended for syntax highlighting)
  • +
+

---

+

+

Install pandoc-a2ml

+

Clone the pandoc-a2ml repository and note the path to the Lua scripts. No compilation needed — the reader, writer, and filter are pure Lua.

+
git clone https://github.com/hyperpolymath/pandoc-a2ml.git
+cd pandoc-a2ml
+
+

The key files are:

+
    +
  • a2ml-reader.lua — reads .a2ml files into Pandoc's AST
  • +
  • a2ml-writer.lua — writes Pandoc AST as .a2ml output
  • +
  • a2ml-filter.lua — Lua filter for attestation processing
  • +
+

You can either add these to your Pandoc data directory (~/.local/share/pandoc/) or reference them by path.

+

+

+

Install the VS Code Extension

+

For syntax highlighting while editing .a2ml files:

+

1. Open VS Code 2. Go to Extensions (Ctrl+Shift+X) 3. Search for "A2ML" 4. Click Install

+

Alternatively, clone and install manually:

+
git clone https://github.com/hyperpolymath/vscode-a2ml.git
+cd vscode-a2ml
+code --install-extension .
+
+

You should now see syntax highlighting for .a2ml files, including directive blocks, headings, and comments.

+

+

+

Create Your First Manifest

+

Create a file called 0-AI-MANIFEST.a2ml in your repository root. This is the entry point that AI agents and tooling will read first.

+
;; SPDX-License-Identifier: MPL-2.0
+
+# AI Manifest — my-project
+
+@abstract:
+This repository contains my-project, a tool for doing useful things.
+This manifest declares the AI agents that operate on this repository
+and the policies that govern their behaviour.
+@end
+
+@provenance:
+created-by: Your Name
+created: 2026-03-16
+source: https://github.com/your-org/my-project
+version: 1.0.0
+@end
+
+## Repository Structure
+
+- Source code in `src/`
+- Machine-readable metadata in `.machine_readable/`
+- CI/CD workflows in `.github/workflows/`
+
+## Agents
+
+No AI agents currently operate on this repository.
+
+@refs:
+[1] A2ML Specification, https://a2ml.hyperpolymath.dev/specification.html
+@end
+
+

+

+

Validate with Pandoc

+

Check that your manifest parses correctly by converting it to HTML:

+
pandoc -f path/to/a2ml-reader.lua 0-AI-MANIFEST.a2ml -o manifest.html
+
+

If the file is well-formed, Pandoc will produce clean HTML output. Open manifest.html in a browser to verify the structure.

+

For deeper validation using the A2ML filter (checks attestation structure):

+
pandoc -f path/to/a2ml-reader.lua \
+       --lua-filter path/to/a2ml-filter.lua \
+       0-AI-MANIFEST.a2ml \
+       -o validated.html
+
+

+

+

Add Machine-Readable Metadata

+

For full Rhodium Standard compliance, create the .machine_readable/ directory and add A2ML metadata files:

+
mkdir -p .machine_readable/anchors .machine_readable/policies
+
+

Create .machine_readable/STATE.a2ml:

+
;; SPDX-License-Identifier: MPL-2.0
+
+# Project State
+
+@abstract:
+Current state of my-project development.
+@end
+
+## Status
+
+- Phase: initial setup
+- Completion: 10%
+- Next milestone: core functionality
+
+## Blockers
+
+None currently.
+
+

Create .machine_readable/META.a2ml:

+
;; SPDX-License-Identifier: MPL-2.0
+
+# Project Metadata
+
+@abstract:
+Architecture decisions and governance for my-project.
+@end
+
+## Architecture Decisions
+
+- Language: chosen based on team expertise
+- License: MPL-2.0 for original code
+
+

These files give AI agents and automated tooling a structured understanding of your project's state, architecture, and ecosystem position.

+

+

+

Add an Agent Attestation

+

When you introduce an AI agent to your workflow (a CI bot, a code reviewer, a security scanner), declare it in the manifest:

+
;; Add this to 0-AI-MANIFEST.a2ml or a dedicated agent file
+
+@attestation:
+agent-id: my-ci-bot
+attested-by: my-ci-bot
+trust-level: self-declared
+timestamp: 2026-03-16T12:00:00Z
+capabilities:
+  - lint-checking
+  - test-execution
+scope: repository
+@end
+
+

As the agent is reviewed and verified, add higher-trust attestations:

+
@attestation:
+agent-id: my-ci-bot
+attested-by: security-team
+trust-level: verified
+timestamp: 2026-03-20T15:00:00Z
+verifies: my-ci-bot/self-declared/2026-03-16
+signature: sha256:your-signature-here
+@end
+
+

+

---

+

Next Steps

+
    +
  • Read the full [Specification](specification.html) for all directives and fields
  • +
  • Browse [Examples](examples.html) for real-world patterns
  • +
  • Explore [Integrations](integrations.html) for editor and CI tooling
  • +
  • Check out the source repositories:
  • +
  • [pandoc-a2ml](https://github.com/hyperpolymath/pandoc-a2ml)
  • +
  • [vscode-a2ml](https://github.com/hyperpolymath/vscode-a2ml)
  • +
  • [tree-sitter-a2ml](https://github.com/hyperpolymath/tree-sitter-a2ml)
  • +
  • [pandoc-k9](https://github.com/hyperpolymath/pandoc-k9)
  • +
+ +
+ + +
+

+ + Built with ddraig-ssg (Idris 2) + · + A2ML is part of the + hyperpolymath + standards ecosystem +

+

+ Copyright © 2026 Jonathan D.A. Jewell (hyperpolymath). + Licensed under MPL-2.0. +

+
+ + + diff --git a/showcase/output/index.html b/showcase/output/index.html new file mode 100644 index 0000000..d3f4d0c --- /dev/null +++ b/showcase/output/index.html @@ -0,0 +1,463 @@ + + + + + + + + + A2ML — A2ML: Attested Markup Language + + + + + + + + +
+

A2ML

Attested Markup Language

Every AI agent needs an identity. A2ML gives them one.

A universal manifest format that lets AI agents declare their capabilities, prove their provenance through attestation chains, and establish trust through verifiable metadata.

Get Started

+

What is A2ML?

+

A2ML (Attested Markup Language) is a structured document format designed for the age of AI agents. It solves a fundamental problem: how do you know what an AI agent is, what it can do, and whether you should trust it?

+

A2ML files (.a2ml) act as identity documents for software agents. They combine human-readable markup with machine-verifiable attestation blocks, creating a chain of trust that can be audited by both people and automated systems.

+

Attestation Chains

Every claim is backed by a verifiable attestation. Agents sign their capabilities, and auditors countersign. Trust is earned, not assumed.

Provenance Tracking

Know exactly where a manifest came from, who authored it, and what has changed. Full lineage from creation to deployment.

Agent Identity

Unique agent identifiers, capability declarations, and trust levels. Every agent in your system has a clear, auditable identity.

CI/CD Native

Designed to live in repositories alongside code. Validate manifests in pipelines, enforce policies in pull requests, audit in production.

+

Why A2ML?

+

As AI agents proliferate across CI/CD pipelines, security scanners, code reviewers, and orchestration systems, the question of agent accountability becomes critical. Who deployed this bot? What permissions does it have? Who attested to its behaviour?

+

A2ML answers these questions with a format that is:

+
    +
  • Human-readable — uses familiar markup syntax with headings, lists, and paragraphs
  • +
  • Machine-parseable — directive blocks (@attestation: ... @end) carry structured data
  • +
  • Auditable — attestation chains create a verifiable trust graph
  • +
  • Composable — agents can reference each other's manifests to build multi-agent trust networks
  • +
+

Tooling Ecosystem

+

A2ML is not a paper specification. It ships with real, working tools:

+
    +
  • [Pandoc](https://pandoc.org) reader, writer, filter, and template via [pandoc-a2ml](https://github.com/hyperpolymath/pandoc-a2ml) — convert A2ML to HTML, PDF, Markdown, and 40+ other formats
  • +
  • [VS Code](https://code.visualstudio.com) syntax highlighting via [vscode-a2ml](https://github.com/hyperpolymath/vscode-a2ml)
  • +
  • [Tree-sitter](https://tree-sitter.github.io) grammar via [tree-sitter-a2ml](https://github.com/hyperpolymath/tree-sitter-a2ml) — works in Neovim, Helix, Zed, and GitHub
  • +
  • GitHub Linguist — language detection (submission pending)
  • +
+

Part of a Larger Ecosystem

+

A2ML integrates with the broader hyperpolymath standards:

+
    +
  • [K9 Validators](https://github.com/hyperpolymath/pandoc-k9) — contractile enforcement for repository policies
  • +
  • [Hypatia](https://github.com/hyperpolymath/hypatia) — neurosymbolic CI/CD security scanning that consumes A2ML manifests
  • +
  • [PanLL](https://github.com/hyperpolymath/panll) — panel framework with A2ML-based panel identity
  • +
  • [Rhodium Standard Repositories](https://github.com/hyperpolymath/rhodium-standard-repositories) — repository quality standard that requires A2ML manifests
  • +
+ +
+ + +
+

+ + Built with ddraig-ssg (Idris 2) + · + A2ML is part of the + hyperpolymath + standards ecosystem +

+

+ Copyright © 2026 Jonathan D.A. Jewell (hyperpolymath). + Licensed under MPL-2.0. +

+
+ + + diff --git a/showcase/output/integrations.html b/showcase/output/integrations.html new file mode 100644 index 0000000..b03e6ed --- /dev/null +++ b/showcase/output/integrations.html @@ -0,0 +1,531 @@ + + + + + + + + + Integrations — A2ML: Attested Markup Language + + + + + + + + +
+

Integrations

+

A2ML has working integrations across editors, build tools, and language ecosystems. This is not a roadmap — these tools exist today.

+

---

+

+

Pandoc Live

+

Full Pandoc integration via [pandoc-a2ml](https://github.com/hyperpolymath/pandoc-a2ml): custom reader, writer, Lua filter, and HTML template.

+

Convert A2ML to any of Pandoc's 40+ output formats (HTML, PDF, DOCX, LaTeX, Markdown, reStructuredText, EPUB, and more), or convert from any Pandoc input format into A2ML.

+
# Read A2ML, output HTML
+pandoc -f a2ml-reader.lua manifest.a2ml -o manifest.html
+
+# Read A2ML, output PDF
+pandoc -f a2ml-reader.lua manifest.a2ml -o manifest.pdf
+
+# Convert Markdown to A2ML
+pandoc README.md -t a2ml-writer.lua -o README.a2ml
+
+# Apply the A2ML filter for attestation validation
+pandoc -f a2ml-reader.lua --lua-filter a2ml-filter.lua manifest.a2ml -o report.html
+
+

Install: Clone the repo and add the Lua scripts to your Pandoc data directory, or reference them by path.

+

Repository: [github.com/hyperpolymath/pandoc-a2ml](https://github.com/hyperpolymath/pandoc-a2ml)

+

+

+

VS Code Live

+

Syntax highlighting, bracket matching, and snippet support for .a2ml files in Visual Studio Code.

+

Features:

+
    +
  • Full TextMate grammar for A2ML syntax
  • +
  • Highlighting for directives (@attestation: ... @end), headings, inline formatting, and comments
  • +
  • Snippets for common patterns (attestation block, policy block, provenance block)
  • +
  • File icon for .a2ml files
  • +
  • Language configuration for bracket/comment auto-pairing
  • +
+

Install: Search "A2ML" in the VS Code marketplace, or install from VSIX.

+

Repository: [github.com/hyperpolymath/vscode-a2ml](https://github.com/hyperpolymath/vscode-a2ml)

+

+

+

Tree-sitter Live

+

A [tree-sitter](https://tree-sitter.github.io) grammar for A2ML, enabling syntax highlighting and structural queries in any editor that supports tree-sitter.

+

Works with:

+
    +
  • Neovim (via nvim-treesitter)
  • +
  • Helix (built-in tree-sitter support)
  • +
  • Zed (built-in tree-sitter support)
  • +
  • GitHub (syntax highlighting in code views, via tree-sitter)
  • +
  • Emacs (via tree-sitter-langs)
  • +
+

The grammar parses the full A2ML syntax including nested directive blocks, attestation fields, and inline formatting.

+

Repository: [github.com/hyperpolymath/tree-sitter-a2ml](https://github.com/hyperpolymath/tree-sitter-a2ml)

+

+

+

GitHub Linguist Pending

+

A pull request to add A2ML to [GitHub Linguist](https://github.com/github-linguist/linguist) is in preparation. Once merged, GitHub will:

+
    +
  • Detect .a2ml files automatically
  • +
  • Show A2ML in repository language statistics
  • +
  • Apply syntax highlighting using the tree-sitter grammar
  • +
  • Recognise application/vnd.a2ml as a registered media type
  • +
+

+

+

K9 Validators Live

+

[pandoc-k9](https://github.com/hyperpolymath/pandoc-k9) provides contractile validation for A2ML files. K9 validators enforce structural and policy constraints:

+
    +
  • must — required fields and sections
  • +
  • trust — attestation chain validity
  • +
  • dust — deprecated pattern detection
  • +
  • intend — intent declaration verification
  • +
+

K9 runs in CI/CD pipelines and can block merges when A2ML manifests fail validation.

+

Repository: [github.com/hyperpolymath/pandoc-k9](https://github.com/hyperpolymath/pandoc-k9)

+

+

+

LuaRocks Live

+

The A2ML Pandoc components are available as a Lua library via [LuaRocks](https://luarocks.org), making it straightforward to integrate A2ML parsing into any Lua-based toolchain.

+
luarocks install pandoc-a2ml
+
+

+

+

Hypatia CI/CD Scanner Live

+

[Hypatia](https://github.com/hyperpolymath/hypatia) consumes A2ML manifests as part of its neurosymbolic security scanning. It:

+
    +
  • Reads 0-AI-MANIFEST.a2ml to understand repository structure
  • +
  • Validates attestation chains in .machine_readable/*.a2ml files
  • +
  • Enforces that all agents operating on a repository have valid manifests
  • +
  • Reports trust-level gaps in CI pipeline output
  • +
+

+

+

Hackage (Haskell) Coming Soon

+

A native Haskell library for parsing and generating A2ML is in development. It will provide:

+
    +
  • Pure Haskell parser (no Pandoc dependency)
  • +
  • Type-safe AST for A2ML documents
  • +
  • Attestation chain validation
  • +
  • Integration with the Pandoc Haskell library
  • +
+

+ +
+ + +
+

+ + Built with ddraig-ssg (Idris 2) + · + A2ML is part of the + hyperpolymath + standards ecosystem +

+

+ Copyright © 2026 Jonathan D.A. Jewell (hyperpolymath). + Licensed under MPL-2.0. +

+
+ + + diff --git a/showcase/output/specification.html b/showcase/output/specification.html new file mode 100644 index 0000000..9569169 --- /dev/null +++ b/showcase/output/specification.html @@ -0,0 +1,596 @@ + + + + + + + + + Specification — A2ML: Attested Markup Language + + + + + + + + +
+

A2ML Specification

+

Overview

+

A2ML (Attested Markup Language) is a text-based document format that combines human-readable markup with machine-verifiable attestation blocks. This page describes the format as currently implemented in the [pandoc-a2ml](https://github.com/hyperpolymath/pandoc-a2ml) toolchain.

+

File Format

+
    +
  • Extension: .a2ml
  • +
  • Media type: application/vnd.a2ml (IANA registration pending)
  • +
  • Encoding: UTF-8
  • +
  • Line endings: LF (Unix-style) recommended; CRLF accepted
  • +
+

Basic Syntax

+

A2ML uses a Markdown-like syntax with additional constructs for attestation and structured metadata.

+

Headings

+
# Top-level heading
+## Second-level heading
+### Third-level heading
+
+

Inline Formatting

+
**Bold text** for emphasis
+*Italic text* for secondary emphasis
+[Link text](https://example.com) for hyperlinks
+@ref(section-id) for internal cross-references
+`inline code` for identifiers
+
+

Lists

+
- Unordered list item
+- Another item
+* Asterisk syntax also works
+
+1. Ordered list item
+2. Another item
+
+

Code Blocks

+
+

code goes here

+
+

Comments

+
;; Scheme-style comments are stripped during parsing.
+;; Use these for notes that should not appear in output.
+
+

Directive Blocks

+

Directives are the core extension that distinguishes A2ML from plain Markdown. They carry structured, machine-readable content within annotated blocks.

+

Syntax

+
@directive-name:
+Content of the directive.
+Can span multiple lines.
+@end
+
+

The parser collects everything between @directive-name: and @end into a named container (rendered as a

with class="directive-name" in HTML output).

+

Standard Directives

+

The following directives have conventional meaning across the A2ML ecosystem. Tooling may validate or enforce these.

+

@abstract

+

A short summary of the document's purpose. Typically one to three sentences.

+
@abstract:
+A2ML is a typed, attested markup format for AI agent identity.
+@end
+
+

@attestation

+

A trust claim with structured fields. This is the fundamental unit of the A2ML trust model.

+
@attestation:
+agent-id: hypatia-scanner-v3
+attested-by: rhodibot
+trust-level: verified
+timestamp: 2026-03-16T14:30:00Z
+signature: sha256:9f86d08...
+capabilities:
+  - static-analysis
+  - secret-detection
+  - dependency-audit
+scope: repository
+@end
+
+

Fields:

+

| Field | Required | Description | |-------|----------|-------------| | agent-id | Yes | Unique identifier for the agent being attested | | attested-by | Yes | Identifier of the attesting authority | | trust-level | Yes | One of: self-declared, peer-reviewed, verified, audited | | timestamp | Yes | ISO 8601 timestamp of the attestation | | signature | Recommended | Cryptographic signature (algorithm:hash) | | capabilities | Yes | List of declared capabilities | | scope | No | Scope of the attestation (e.g., repository, organization, global) |

+

@refs

+

References and citations. Used for linking to external specifications, standards, or related documents.

+
@refs:
+[1] Attested Markup Language Specification (draft), 2026
+[2] SLSA Supply Chain Framework, https://slsa.dev
+@end
+
+

@policy

+

Declares a policy constraint that tooling should enforce.

+
@policy:
+require: attestation.trust-level >= verified
+enforce: ci-pipeline
+action: block-merge
+@end
+
+

@provenance

+

Records the origin and lineage of the document.

+
@provenance:
+created-by: Jonathan D.A. Jewell
+created: 2026-01-15
+last-modified: 2026-03-16
+source: https://github.com/hyperpolymath/a2ml-spec
+version: 0.3.0
+@end
+
+

Attestation Chains

+

The real power of A2ML comes from attestation chains — sequences of attestations where each one references or builds upon previous ones.

+
;; Agent declares its own capabilities
+@attestation:
+agent-id: codebot-v2
+attested-by: codebot-v2
+trust-level: self-declared
+capabilities:
+  - code-review
+  - style-checking
+@end
+
+;; Security team verifies the agent
+@attestation:
+agent-id: codebot-v2
+attested-by: security-team
+trust-level: verified
+verifies: codebot-v2/self-declared/2026-03-10
+signature: sha256:a3f2c8...
+@end
+
+;; Auditor provides highest-level attestation
+@attestation:
+agent-id: codebot-v2
+attested-by: external-auditor
+trust-level: audited
+verifies: codebot-v2/verified/2026-03-12
+audit-report: https://audits.example.com/codebot-v2
+signature: sha256:7b1e4d...
+@end
+
+

Each successive attestation raises the trust level and creates an auditable trail from self-declared through verified to audited.

+

Trust Levels

+

| Level | Meaning | Typical Attester | |-------|---------|------------------| | self-declared | Agent claims its own capabilities | The agent itself | | peer-reviewed | Another agent or team has reviewed the claims | A peer agent or team lead | | verified | A security or operations team has validated behaviour | Security team, CI system | | audited | An independent audit has confirmed the claims | External auditor |

+

Canonical File Locations

+

In repositories following the [Rhodium Standard](https://github.com/hyperpolymath/rhodium-standard-repositories), A2ML files live in the .machine_readable/ directory:

+
.machine_readable/
+  STATE.a2ml         # Project state and progress
+  META.a2ml          # Architecture decisions, governance
+  ECOSYSTEM.a2ml     # Position in ecosystem, relationships
+  AGENTIC.a2ml       # AI agent interaction patterns
+  NEUROSYM.a2ml      # Neurosymbolic integration config
+  PLAYBOOK.a2ml      # Operational runbook
+  anchors/
+    ANCHOR.a2ml      # Canonical authority declaration
+  policies/
+    MAINTENANCE-AXES.a2ml
+    MAINTENANCE-CHECKLIST.a2ml
+
+

The top-level 0-AI-MANIFEST.a2ml serves as the entry point that all AI agents must read first.

+

Pandoc Integration

+

A2ML is a first-class Pandoc format. Convert between A2ML and any Pandoc-supported format:

+
# A2ML to HTML
+pandoc -f a2ml-reader.lua input.a2ml -o output.html
+
+# A2ML to PDF (via LaTeX)
+pandoc -f a2ml-reader.lua input.a2ml -o output.pdf
+
+# Markdown to A2ML
+pandoc input.md -t a2ml-writer.lua -o output.a2ml
+
+# A2ML to A2ML (normalise)
+pandoc -f a2ml-reader.lua input.a2ml -t a2ml-writer.lua -o normalised.a2ml
+
+ +
+ + +
+

+ + Built with ddraig-ssg (Idris 2) + · + A2ML is part of the + hyperpolymath + standards ecosystem +

+

+ Copyright © 2026 Jonathan D.A. Jewell (hyperpolymath). + Licensed under MPL-2.0. +

+
+ + + diff --git a/showcase/setup.sh b/showcase/setup.sh new file mode 100755 index 0000000..34a657a --- /dev/null +++ b/showcase/setup.sh @@ -0,0 +1,64 @@ +#!/usr/bin/env bash +# SPDX-License-Identifier: MPL-2.0 +# Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) +# +# A2Ml Showcase — Universal Setup Script +# Detects platform and shell, installs just, then hands off to Justfile. + +set -euo pipefail + +echo "═══════════════════════════════════════════════════" +echo " A2Ml Showcase — Setup" +echo "═══════════════════════════════════════════════════" +echo "" + +# Platform detection +OS="$(uname -s)" +ARCH="$(uname -m)" +echo "Platform: $OS $ARCH" + +# Shell detection +CURRENT_SHELL="$(basename "$SHELL" 2>/dev/null || echo "unknown")" +echo "Shell: $CURRENT_SHELL" +echo "" + +# Check for just +if ! command -v just >/dev/null 2>&1; then + echo "just (command runner) is required but not installed." + echo "" + case "$OS" in + Linux) + if command -v cargo >/dev/null 2>&1; then + echo "Installing just via cargo..." + cargo install just + elif command -v brew >/dev/null 2>&1; then + echo "Installing just via Homebrew..." + brew install just + else + echo "Install just from: https://just.systems/man/en/installation.html" + exit 1 + fi + ;; + Darwin) + if command -v brew >/dev/null 2>&1; then + echo "Installing just via Homebrew..." + brew install just + else + echo "Install Homebrew first: https://brew.sh" + echo "Then: brew install just" + exit 1 + fi + ;; + *) + echo "Install just from: https://just.systems/man/en/installation.html" + exit 1 + ;; + esac + echo "" +fi + +echo "Running diagnostics..." +just doctor + +echo "" +echo "Setup complete. Run 'just help-me' for common workflows." diff --git a/showcase/stapeln.toml b/showcase/stapeln.toml new file mode 100644 index 0000000..e0c99ca --- /dev/null +++ b/showcase/stapeln.toml @@ -0,0 +1,8 @@ +# SPDX-License-Identifier: MPL-2.0 + +[project] +name = "a2ml-showcase" +description = "A2ML showcase and examples" + +[container] +base = "cgr.dev/chainguard/wolfi-base:latest" diff --git a/showcase/template.html b/showcase/template.html new file mode 100644 index 0000000..072ff4a --- /dev/null +++ b/showcase/template.html @@ -0,0 +1,428 @@ + + + + + + + + + {{title}} — A2ML: Attested Markup Language + + + + + + + + +
+ {{content}} +
+ + +
+

+ + Built with ddraig-ssg (Idris 2) + · + A2ML is part of the + hyperpolymath + standards ecosystem +

+

+ Copyright © 2026 Jonathan D.A. Jewell (hyperpolymath). + Licensed under MPL-2.0. +

+
+ + + diff --git a/showcase/tests/README.md b/showcase/tests/README.md new file mode 100644 index 0000000..828acf1 --- /dev/null +++ b/showcase/tests/README.md @@ -0,0 +1,8 @@ + + +# Tests + +This is a showcase/content repository for A2ML examples. There is no executable +code to test. + +The `fuzz/` directory contains placeholder structure for OpenSSF compliance. diff --git a/showcase/tests/fuzz/placeholder.txt b/showcase/tests/fuzz/placeholder.txt new file mode 100644 index 0000000..8621280 --- /dev/null +++ b/showcase/tests/fuzz/placeholder.txt @@ -0,0 +1 @@ +Scorecard requirement placeholder diff --git a/showcase/tests/idris2/Main.idr b/showcase/tests/idris2/Main.idr new file mode 100644 index 0000000..213541d --- /dev/null +++ b/showcase/tests/idris2/Main.idr @@ -0,0 +1,27 @@ +-- SPDX-License-Identifier: MPL-2.0 +-- Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) +-- +-- Aggregator for a2ml-showcase Idris2 test suite. Single binary, single +-- exit code: 0 if every test passed, 1 otherwise. Run via: +-- +-- idris2 --build a2ml-showcase-tests.ipkg +-- ./build/exec/a2ml-showcase-tests +-- +-- The runner prints a summary per suite and a grand total at the end. + +module Main + +import Test.Spec +import ValidateTest +import System + +%default covering + +main : IO () +main = do + (p, f) <- runTestSuite "ValidateTest" ValidateTest.allSuites + putStrLn "" + putStrLn $ "=== Total: " ++ show p ++ " passed, " ++ show f ++ " failed ===" + if f > 0 + then exitWith (ExitFailure 1) + else pure () diff --git a/showcase/tests/idris2/Test/Spec.idr b/showcase/tests/idris2/Test/Spec.idr new file mode 100644 index 0000000..c7fe418 --- /dev/null +++ b/showcase/tests/idris2/Test/Spec.idr @@ -0,0 +1,112 @@ +-- SPDX-License-Identifier: MPL-2.0 +-- Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) +-- +||| Minimal Idris2 test harness for the Gossamer ABI test suite. +||| +||| Mirrors the Deno.test interface used by the previous TypeScript suite: +||| each test is a named IO action returning Bool (True = pass, False = fail). +||| The runner reports per-test status and exits non-zero on any failure so +||| Justfile / CI can detect breakage. + +module Test.Spec + +import Data.IORef +import Data.List +import System + +%default total + +public export +record TestCase where + constructor MkTest + name : String + body : IO Bool + +public export +test : String -> IO Bool -> TestCase +test = MkTest + +||| Assert that two showable, comparable values are equal. +||| Prints expected/actual on mismatch. +public export +assertEq : (Show a, Eq a) => a -> a -> IO Bool +assertEq actual expected = + if actual == expected + then pure True + else do + putStrLn "" + putStrLn $ " expected: " ++ show expected + putStrLn $ " actual: " ++ show actual + pure False + +||| Assert that two values are not equal. +public export +assertNotEq : (Show a, Eq a) => a -> a -> IO Bool +assertNotEq actual notExpected = + if actual /= notExpected + then pure True + else do + putStrLn "" + putStrLn $ " did not expect: " ++ show notExpected + pure False + +||| Assert that a Bool is True; print the supplied message on failure. +public export +assertTrue : String -> Bool -> IO Bool +assertTrue msg b = + if b + then pure True + else do + putStrLn "" + putStrLn $ " assertion failed: " ++ msg + pure False + +||| Combine a list of sub-assertions; all must pass. +||| Use in a do-block to compose multiple checks in one test case. +public export +allPass : List (IO Bool) -> IO Bool +allPass [] = pure True +allPass (x :: xs) = do + r <- x + if r then allPass xs else pure False + +runOne : TestCase -> IO Bool +runOne (MkTest name body) = do + putStr $ " " ++ name ++ " ... " + result <- body + if result + then putStrLn "PASS" + else putStrLn "FAIL" + pure result + +runAll : List TestCase -> Nat -> Nat -> IO (Nat, Nat) +runAll [] p f = pure (p, f) +runAll (t :: ts) p f = do + ok <- runOne t + if ok + then runAll ts (S p) f + else runAll ts p (S f) + +||| Run a list of test cases. Reports a summary and exits non-zero +||| if any test failed. Use for single-suite executables. +public export +runTests : List TestCase -> IO () +runTests cases = do + (p, f) <- runAll cases 0 0 + putStrLn "" + putStrLn $ show p ++ " passed, " ++ show f ++ " failed" + if f > 0 + then exitWith (ExitFailure 1) + else pure () + +||| Run a named suite without exiting. Returns (passed, failed) so a parent +||| aggregator (e.g. Main) can accumulate across multiple suites and only +||| exit at the end. +public export +runTestSuite : String -> List TestCase -> IO (Nat, Nat) +runTestSuite name cases = do + putStrLn $ "=== " ++ name ++ " ===" + (p, f) <- runAll cases 0 0 + putStrLn $ show p ++ " passed, " ++ show f ++ " failed" + putStrLn "" + pure (p, f) diff --git a/showcase/tests/idris2/ValidateTest.idr b/showcase/tests/idris2/ValidateTest.idr new file mode 100644 index 0000000..281a369 --- /dev/null +++ b/showcase/tests/idris2/ValidateTest.idr @@ -0,0 +1,254 @@ +-- SPDX-License-Identifier: MPL-2.0 +-- Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) +-- +-- Port of tests/validate.test.ts to Idris2 using the panic-free +-- clade-registry's Test.Spec harness (lifted from gossamer, see +-- panic-free-tests-and-benches/clade-registry/clade-A/idris2/). +-- +-- This is the canonical "content validation" port pattern: each TS +-- test that uses string/regex matching maps to `isInfixOf` checks +-- plus a `countSubstring` helper for cardinality assertions. Tests +-- that needed full regex (e.g. `agent-id:\s*(\S+)` capture-group +-- iteration) are deferred to a follow-up once Idris2 gains a regex +-- library — those are flagged inline. +-- +-- Test categories preserved from the TS file: +-- • Unit (4): file existence + section / SPDX presence +-- • Smoke (3): @attestation / @policy / README structure +-- • Contract (2): required fields in attestation blocks, trust levels +-- • Aspect (3): agent-id naming, balanced @end tags, SPDX consistency +-- • Property (2): agent-id <-> attestation correspondence, trust progression +-- • E2E (2): example round-trip parse, reference resolution +-- • Benchmark (2): file read time, example count baseline + +module ValidateTest + +import Test.Spec +import Data.String +import System.File +import System.Clock + +%default covering + +-- ── File loading helper (panics if file missing — caught by test failure) ── +-- +-- `readFile` is not total under Idris2 0.8.0 (uses Data.Fuel.forever +-- internally), so this helper inherits the `%default covering` policy +-- from the surrounding module. + +readFileToString : String -> IO String +readFileToString path = do + Right contents <- readFile path + | Left err => pure "" + pure contents + +-- ── Count occurrences of a substring in a larger string ─────────────────── +-- +-- Idris2's Data.String doesn't ship a substring counter. We convert +-- both arguments to List Char and walk the haystack structurally +-- (recurse on the tail) so the totality checker accepts it without +-- a `partial` annotation. Trade-off vs the strTail version: one +-- linear pass of unpack/pack instead of repeated substr calls; for +-- markdown files under 1MB this is fine. + +isListPrefix : List Char -> List Char -> Bool +isListPrefix [] _ = True +isListPrefix _ [] = False +isListPrefix (n :: ns) (h :: hs) = n == h && isListPrefix ns hs + +countSubstringChars : List Char -> List Char -> Nat +countSubstringChars _ [] = 0 +countSubstringChars needle (h :: rest) = + let rest_count = countSubstringChars needle rest + in if isListPrefix needle (h :: rest) + then 1 + rest_count + else rest_count + +countSubstring : String -> String -> Nat +countSubstring needle haystack = + countSubstringChars (unpack needle) (unpack haystack) + +-- ── Test cases ──────────────────────────────────────────────────────────── + +unitTests : List TestCase +unitTests = + [ test "Unit: A2ML examples file exists" $ do + content <- readFileToString "content/examples.md" + assertTrue "examples.md should not be empty" (length content > 0) + + , test "Unit: A2ML examples contain required sections" $ do + content <- readFileToString "content/examples.md" + allPass + [ assertTrue "should contain '# Examples'" (isInfixOf "# Examples" content) + , assertTrue "should contain 'Minimal Manifest'" (isInfixOf "Minimal Manifest" content) + , assertTrue "should contain 'CI/CD Agent'" (isInfixOf "CI/CD Agent" content) + , assertTrue "should contain 'Security Scanner'" (isInfixOf "Security Scanner" content) + , assertTrue "should contain 'Multi-Agent'" (isInfixOf "Multi-Agent" content) + ] + + , test "Unit: A2ML examples have SPDX headers" $ do + content <- readFileToString "content/examples.md" + let n = countSubstring "SPDX-License-Identifier: MPL-2.0" content + assertTrue ("should have >=4 SPDX headers, found " ++ show n) (n >= 4) + + , test "Unit: All content markdown files exist" $ allPass + [ do c <- readFileToString "content/index.md"; assertTrue "content/index.md" (length c > 0) + , do c <- readFileToString "content/specification.md"; assertTrue "content/specification.md" (length c > 0) + , do c <- readFileToString "content/examples.md"; assertTrue "content/examples.md" (length c > 0) + , do c <- readFileToString "content/integrations.md"; assertTrue "content/integrations.md" (length c > 0) + , do c <- readFileToString "content/getting-started.md"; assertTrue "content/getting-started.md" (length c > 0) + ] + ] + +smokeTests : List TestCase +smokeTests = + [ test "Smoke: @attestation blocks are present" $ do + content <- readFileToString "content/examples.md" + let n = countSubstring "@attestation:" content + assertTrue ("should have >=1 attestation block, found " ++ show n) (n >= 1) + + , test "Smoke: attestation has agent-id + trust-level + capabilities" $ do + content <- readFileToString "content/examples.md" + allPass + [ assertTrue "agent-id field" (isInfixOf "agent-id:" content) + , assertTrue "trust-level field" (isInfixOf "trust-level:" content) + , assertTrue "capabilities field" (isInfixOf "capabilities:" content) + ] + + , test "Smoke: @policy blocks are present + structured" $ do + content <- readFileToString "content/examples.md" + let n = countSubstring "@policy:" content + let hasReqEnforce = isInfixOf "require:" content || isInfixOf "enforce:" content + allPass + [ assertTrue ("should have >=1 policy block, found " ++ show n) (n >= 1) + , assertTrue "policy should have require: or enforce:" hasReqEnforce + ] + + , test "Smoke: README references content correctly" $ do + readme <- readFileToString "README.adoc" + allPass + [ assertTrue "README mentions content/" (isInfixOf "content/" readme) + , assertTrue "README mentions A2ML" (isInfixOf "A2ML" readme) + ] + ] + +contractTests : List TestCase +contractTests = + [ test "Contract: attestation block has required fields" $ do + content <- readFileToString "content/examples.md" + -- The original TS test iterates each @attestation block and asserts + -- per-block presence of fields. Without regex/block extraction in + -- Idris2 stdlib, we approximate by requiring the file as a whole + -- contain all required fields >= as many times as there are blocks. + let n_blocks = countSubstring "@attestation:" content + let n_agent = countSubstring "agent-id:" content + let n_attestby = countSubstring "attested-by:" content + let n_trust = countSubstring "trust-level:" content + allPass + [ assertTrue ("attestation blocks: " ++ show n_blocks) (n_blocks >= 1) + , assertTrue ("agent-id count >= attestation: " ++ show n_agent) (n_agent >= n_blocks) + , assertTrue ("attested-by count >= attestation: " ++ show n_attestby) (n_attestby >= n_blocks) + , assertTrue ("trust-level count >= attestation: " ++ show n_trust) (n_trust >= n_blocks) + ] + + , test "Contract: trust levels include all three documented values" $ do + content <- readFileToString "content/examples.md" + allPass + [ assertTrue "trust-level: self-declared" (isInfixOf "trust-level: self-declared" content) + , assertTrue "trust-level: verified" (isInfixOf "trust-level: verified" content) + , assertTrue "trust-level: audited" (isInfixOf "trust-level: audited" content) + ] + ] + +aspectTests : List TestCase +aspectTests = + [ test "Aspect: examples have balanced @end tags" $ do + content <- readFileToString "content/examples.md" + let openings = countSubstring "@attestation:" content + + countSubstring "@policy:" content + + countSubstring "@provenance:" content + + countSubstring "@abstract:" content + + countSubstring "@refs:" content + let ends = countSubstring "@end" content + allPass + [ assertTrue ("openings: " ++ show openings) (openings >= 1) + , assertTrue ("ends >= openings: " ++ show ends) (ends >= openings) + ] + + -- The original TS test only asserts `results.length > 0` (i.e. at + -- least one file read), NOT that each file has SPDX. Matching 1:1. + -- Real finding from the port: content/specification.md and + -- content/integrations.md DON'T have SPDX headers — flagged in the + -- PR description for a follow-up. + , test "Aspect: at least one content file readable for SPDX scan" $ do + examples <- readFileToString "content/examples.md" + assertTrue "examples.md readable" (length examples > 0) + + -- DEFERRED: "All agents have consistent naming" — needs regex capture + -- to iterate /agent-id:\s*(\S+)/ matches and check each is + -- /^[a-z0-9\-]+$/. Idris2 stdlib lacks regex; would need a + -- handwritten parser for the agent-id value extraction. Tracked as + -- panic-free-tests-and-benches#NN once filed. + ] + +propertyTests : List TestCase +propertyTests = + -- DEFERRED: "every agent-id appears in attestations" — same regex + -- gap as the aspect agent-naming test. Captured in the issue above. + [ test "Property: trust-level progression documented" $ do + content <- readFileToString "content/examples.md" + let selfdecl = countSubstring "trust-level: self-declared" content + let verified = countSubstring "trust-level: verified" content + let audited = countSubstring "trust-level: audited" content + allPass + [ assertTrue ("self-declared count > 0: " ++ show selfdecl) (selfdecl > 0) + , assertTrue ("verified count > 0: " ++ show verified) (verified > 0) + , assertTrue ("audited count > 0: " ++ show audited) (audited > 0) + ] + ] + +e2eTests : List TestCase +e2eTests = + -- DEFERRED: "Example parsing round-trip" — needs the @attestation + -- block extraction + key-value line parser. Same regex gap. + [ test "E2E: numbered references survive" $ do + content <- readFileToString "content/examples.md" + -- Just verify the structure: numbered references exist if the file + -- contains both a "[N]" citation and a corresponding numbered list. + assertTrue "examples.md has some content" (length content > 100) + ] + +-- DEFERRED: file-read timing benchmark. Idris2's System.Clock surface +-- (clockTime Monotonic + timeDifference) compiles but the `nanoseconds` +-- accessor on Clock Duration didn't resolve under 0.8.0; leaving as +-- a follow-up. The performance signal it captured was always a soft +-- guard (TS test asserted <100ms file read), not a correctness gate. + +benchmarkTests : List TestCase +benchmarkTests = + [ test "Benchmark: example count baseline (>=3 numbered examples)" $ do + content <- readFileToString "content/examples.md" + -- Count "## 1.", "## 2.", "## 3.", "## 4." headings (each example is `## N.`) + let bool_to_nat : Bool -> Nat + bool_to_nat True = 1 + bool_to_nat False = 0 + let n1 = bool_to_nat (isInfixOf "## 1." content) + let n2 = bool_to_nat (isInfixOf "## 2." content) + let n3 = bool_to_nat (isInfixOf "## 3." content) + let n4 = bool_to_nat (isInfixOf "## 4." content) + assertTrue ("found " ++ show (n1 + n2 + n3 + n4) ++ " numbered examples") (n1 + n2 + n3 + n4 >= 3) + ] + +-- ── Entry: run all suites; main aggregator binds them ─────────────────── + +public export +allSuites : List TestCase +allSuites = + unitTests + ++ smokeTests + ++ contractTests + ++ aspectTests + ++ propertyTests + ++ e2eTests + ++ benchmarkTests + diff --git a/validate-action/.devcontainer/Containerfile b/validate-action/.devcontainer/Containerfile new file mode 100644 index 0000000..7ccd4b4 --- /dev/null +++ b/validate-action/.devcontainer/Containerfile @@ -0,0 +1,32 @@ +# SPDX-License-Identifier: MPL-2.0 +# Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) +# +# Dev Container image for a2ml-validate-action +# Base: Chainguard Wolfi (minimal, supply-chain-secure) +# Build: podman build -t a2ml-validate-action-dev -f .devcontainer/Containerfile . + +FROM cgr.dev/chainguard/wolfi-base:latest + +# Install common development tools +RUN apk update && apk add --no-cache \ + bash \ + curl \ + git \ + openssh-client \ + ca-certificates \ + build-base \ + posix-libc-utils \ + shadow \ + && rm -rf /var/cache/apk/* + +# Create non-root dev user (matches devcontainer.json remoteUser) +RUN groupadd -g 1000 nonroot || true \ + && useradd -m -u 1000 -g 1000 -s /bin/bash nonroot || true + +# Set workspace directory +WORKDIR /workspaces/a2ml-validate-action + +# Default shell +ENV SHELL=/bin/bash + +USER nonroot diff --git a/validate-action/.devcontainer/README.adoc b/validate-action/.devcontainer/README.adoc new file mode 100644 index 0000000..659bf9f --- /dev/null +++ b/validate-action/.devcontainer/README.adoc @@ -0,0 +1,27 @@ +// SPDX-License-Identifier: CC-BY-SA-4.0 += Dev Container Usage +:author: Jonathan D.A. Jewell + +== Overview + +This dev container uses `cgr.dev/chainguard/wolfi-base` with git, curl, bash, and just pre-installed. Dev container features add git, just, and nickel automatically. + +== VS Code (Local) + +. Install the *Dev Containers* extension (`ms-vscode-remote.remote-containers`). +. Set `dev.containers.dockerPath` to `podman` in VS Code settings. +. Open the repo folder, then choose **Reopen in Container** from the command palette. + +== GitHub Codespaces + +. From the repository on GitHub, click **Code > Codespaces > New codespace**. +. The container builds automatically from this configuration. + +== Gitpod + +. Prefix the repo URL with `https://gitpod.io/#` to launch a workspace. +. Gitpod reads `devcontainer.json` and builds the environment. + +== Customization + +Replace `a2ml-validate-action` placeholders in both `devcontainer.json` and `Containerfile` with your actual project name. Run `just deps` to verify the environment after first launch. diff --git a/validate-action/.devcontainer/devcontainer.json b/validate-action/.devcontainer/devcontainer.json new file mode 100644 index 0000000..d7c68f1 --- /dev/null +++ b/validate-action/.devcontainer/devcontainer.json @@ -0,0 +1,69 @@ +// SPDX-License-Identifier: MPL-2.0 +// Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) +// +// Dev Container configuration for a2ml-validate-action +// Works with: VS Code Dev Containers, GitHub Codespaces, Gitpod +// Container runtime: Podman (recommended) or any OCI-compliant runtime +{ + "name": "a2ml-validate-action", + + "build": { + "dockerfile": "Containerfile", + "context": ".." + }, + + "features": { + "ghcr.io/devcontainers/features/git:1": { + "ppa": false, + "version": "latest" + }, + "ghcr.io/jdx/devcontainer-features/just:1": {}, + "ghcr.io/nickel-lang/devcontainer-feature:0": {} + }, + + "postCreateCommand": "just deps", + + "remoteUser": "nonroot", + + "containerEnv": { + "EDITOR": "code --wait", + "LANG": "C.UTF-8" + }, + + "customizations": { + "vscode": { + "extensions": [ + "EditorConfig.EditorConfig", + "eamodio.gitlens", + "streetsidesoftware.code-spell-checker", + "timonwong.shellcheck", + "tamasfe.even-better-toml", + "skellock.just", + "redhat.vscode-yaml", + "DavidAnson.vscode-markdownlint", + "asciidoctor.asciidoctor-vscode", + "usernamehw.errorlens" + ], + "settings": { + "editor.formatOnSave": true, + "editor.insertSpaces": true, + "editor.tabSize": 2, + "files.trimTrailingWhitespace": true, + "files.insertFinalNewline": true, + "files.trimFinalNewlines": true, + "[makefile]": { + "editor.insertSpaces": false + } + } + }, + "codespaces": { + "openFiles": [ + "README.adoc" + ] + } + }, + + "forwardPorts": [], + + "shutdownAction": "stopContainer" +} diff --git a/validate-action/.editorconfig b/validate-action/.editorconfig new file mode 100644 index 0000000..a50e917 --- /dev/null +++ b/validate-action/.editorconfig @@ -0,0 +1,62 @@ +# RSR-template-repo - Editor Configuration +# https://editorconfig.org + +root = true + +[*] +charset = utf-8 +end_of_line = lf +indent_size = 2 +indent_style = space +insert_final_newline = true +trim_trailing_whitespace = true + +[*.md] +trim_trailing_whitespace = false + +[*.adoc] +trim_trailing_whitespace = false + +[*.rs] +indent_size = 4 + +[*.ex] +indent_size = 2 + +[*.exs] +indent_size = 2 + +[*.zig] +indent_size = 4 + +[*.ada] +indent_size = 3 + +[*.adb] +indent_size = 3 + +[*.ads] +indent_size = 3 + +[*.hs] +indent_size = 2 + +[*.res] +indent_size = 2 + +[*.resi] +indent_size = 2 + +[*.ncl] +indent_size = 2 + +[*.rkt] +indent_size = 2 + +[*.scm] +indent_size = 2 + +[Justfile] +indent_style = space +indent_size = 4 + diff --git a/validate-action/.envrc b/validate-action/.envrc new file mode 100644 index 0000000..1b9e935 --- /dev/null +++ b/validate-action/.envrc @@ -0,0 +1,22 @@ +# SPDX-License-Identifier: MPL-2.0 +# Activate development environment +# Install direnv: https://direnv.net/ + +# Load .tool-versions if asdf is available +if has asdf; then + use asdf +fi + +# Load Guix shell if guix.scm exists +if has guix && [ -f guix.scm ]; then + use guix +fi + +# Project environment variables +export PROJECT_NAME="a2ml-validate-action" +export RSR_TIER="infrastructure" +# export DATABASE_URL="..." +# export API_KEY="..." + +# Source .env if it exists (gitignored) +dotenv_if_exists diff --git a/validate-action/.guix-channel b/validate-action/.guix-channel new file mode 100644 index 0000000..57e9ac2 --- /dev/null +++ b/validate-action/.guix-channel @@ -0,0 +1,22 @@ +;; SPDX-License-Identifier: MPL-2.0 +;; Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) +;; +;; Guix channel definition for a2ml-validate-action +;; +;; To use this channel, add to ~/.config/guix/channels.scm: +;; +;; (channel +;; (name 'a2ml-validate-action) +;; (url "https://github.com/hyperpolymath/a2ml-validate-action") +;; (branch "main")) +;; +;; Then: guix pull + +(channel + (version 0) + (url "https://github.com/hyperpolymath/a2ml-validate-action") + (dependencies + (channel + (name 'guix) + (url "https://git.savannah.gnu.org/git/guix.git") + (branch "master")))) diff --git a/validate-action/.machine_readable/0.1-AI-MANIFEST.a2ml b/validate-action/.machine_readable/0.1-AI-MANIFEST.a2ml new file mode 100644 index 0000000..9d2bc7a --- /dev/null +++ b/validate-action/.machine_readable/0.1-AI-MANIFEST.a2ml @@ -0,0 +1,29 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "machine-readable-pillar" +level: 1 +parent: "../0-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Registry for all machine-readable metadata, policies, and internal + automation scripts. + +canonical_locations: + state: "STATE.a2ml" + meta: "META.a2ml" + ecosystem: "ECOSYSTEM.a2ml" + agentic: "AGENTIC.a2ml" + neurosym: "NEUROSYM.a2ml" + playbook: "PLAYBOOK.a2ml" + anchors: "anchors/" + policies: "policies/" + ai_configs: "ai/" + compliance: "compliance/" + scripts: "scripts/" + +invariants: + - "Metadata files MUST follow a2ml format" + - "Internal automation MUST live in scripts/ subfolder" diff --git a/validate-action/.machine_readable/CLADE.a2ml b/validate-action/.machine_readable/CLADE.a2ml new file mode 100644 index 0000000..79e1f24 --- /dev/null +++ b/validate-action/.machine_readable/CLADE.a2ml @@ -0,0 +1,47 @@ +# SPDX-License-Identifier: MPL-2.0 +# Clade declaration — part of the gv-clade-index registry +# See: https://github.com/hyperpolymath/gv-clade-index + +[identity] +uuid = "4aacd8a6-935d-5c3f-9679-0635f5deafec" +primary-forge = "github" +primary-owner = "hyperpolymath" +canonical-name = "a2ml-validate-action" +prefixed-name = "rm-a2ml-validate-action" + +[clade] +primary = "rm" +secondary = ["gv"] +assigned = "2026-03-16" +rationale = "" + +[forges] +github = "hyperpolymath/a2ml-validate-action" +gitlab = "hyperpolymath/a2ml-validate-action" +bitbucket = "hyperpolymath/a2ml-validate-action" + +[lineage] +type = "standalone" +parent = "RSR template — scaffold for new repos" +born = "2026-03-16" + +# Lifecycle status (added by clade-status-backfill; see gv-clade-index ADR 0006). +# Identity (uuid) and status are SEPARATE layers: uuid is immortal; phase is a +# mutable pointer. No phase is terminal (extinct -> active is a legal "Gitassic +# Park" transition on the same uuid). A rename is NOT a phase change — the old +# prefixed-name goes to aliases[], uuid and phase are untouched. +[status] +# One of: reserved incubating active dormant | merged superseded archived extinct +phase = "active" +since = "2026-03-16" +present = true +aliases = [] +merged-into = "" +superseded-by = "" +successors = [] +ended = "" + +[[status.history]] +phase = "active" +since = "2026-03-16" +note = "backfilled default — correct if the true phase differs" diff --git a/validate-action/.machine_readable/ENSAID_CONFIG.a2ml b/validate-action/.machine_readable/ENSAID_CONFIG.a2ml new file mode 100644 index 0000000..f33437e --- /dev/null +++ b/validate-action/.machine_readable/ENSAID_CONFIG.a2ml @@ -0,0 +1,96 @@ +# SPDX-License-Identifier: MPL-2.0 +# Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) +# +# ENSAID_CONFIG.a2ml — eNSAID Environment Configuration +# Per-repo configuration for PanLL and eNSAID-compatible tools. +# +# Canonical location: .machine_readable/ENSAID_CONFIG.a2ml +# Spec: https://github.com/hyperpolymath/standards/tree/main/ensaid-config +# +# Naming convention: +# - UPPERCASE + underscore = non-executable machine-readable file +# - Lives in .machine_readable/ alongside STATE.a2ml, META.a2ml, etc. + +# ───────────────────────────────────────────────────────────────── +# [ensaid] — Core eNSAID identity and version +# ───────────────────────────────────────────────────────────────── +[ensaid] +version = "1.0.0" +tool = "panll" + +# ───────────────────────────────────────────────────────────────── +# [workspace] — Workspace mode, protection, and execution policy +# ───────────────────────────────────────────────────────────────── +[workspace] +mode = "rhodium" # rhodium | gold | silver | bronze +protection = "open" # open | guarded | locked +execution = "live" # live | dry-run | approval-required + +# ───────────────────────────────────────────────────────────────── +# [preferences] — User/repo-level display and behaviour preferences +# ───────────────────────────────────────────────────────────────── +[preferences] +humidity = "medium" # high | medium | low (drift aura intensity) +default-arrangement = "default-3-panel" # workspace arrangement ID +auto-connect = true # auto-connect panels to backends on load + +# ───────────────────────────────────────────────────────────────── +# [panels] — Panel visibility, enablement, and isolation overrides +# ───────────────────────────────────────────────────────────────── +[panels] +version = "1.0.0" + +# By default, all panels are available. Uncomment to restrict: +# [[panels.enabled]] +# id = "valence-shell" +# isolation = "native" +# auto-connect = true +# +# [[panels.enabled]] +# id = "editor-bridge" +# isolation = "native" +# auto-connect = true + +# Panels to hide for this repo context: +# [panels.disabled] +# ids = [] + +# ───────────────────────────────────────────────────────────────── +# [workflows] — Automation Router event-driven cross-panel rules +# ───────────────────────────────────────────────────────────────── +[workflows] +version = "1.0.0" + +# Example: rebuild on file save +# [[workflows.rule]] +# name = "build-on-save" +# trigger = { event = "file-changed", pattern = "src/**/*.res" } +# condition = { panel = "build-dashboard", field = "watchMode", equals = true } +# action = { panel = "build-dashboard", message = "TriggerBuild", args = { target = "game" } } +# approval = "auto-fire" # auto-fire | require-approval | approve-once | dry-run-first + +# ───────────────────────────────────────────────────────────────── +# [clades] — Panel clade trait and capability overrides +# ───────────────────────────────────────────────────────────────── +[clades] +version = "1.0.0" + +# Example: add a custom capability to a panel clade +# [[clades.override]] +# id = "build-dashboard" +# traits = { has-work-items = true } +# capabilities-add = ["CustomCheck"] + +# ───────────────────────────────────────────────────────────────── +# [portfolios] — Custom panel bundles for this repo's workflow +# ───────────────────────────────────────────────────────────────── +[portfolios] +version = "1.0.0" + +# Example: a custom portfolio for this project +# [[portfolios.custom]] +# id = "{{project}}-dev" +# name = "a2ml-validate-action Development" +# description = "Panels for a2ml-validate-action development" +# panels = ["valence-shell", "editor-bridge", "build-dashboard"] +# default-isolation = "native" diff --git a/validate-action/.machine_readable/README.adoc b/validate-action/.machine_readable/README.adoc new file mode 100644 index 0000000..471d6c7 --- /dev/null +++ b/validate-action/.machine_readable/README.adoc @@ -0,0 +1 @@ += .machine_readable Pillar diff --git a/validate-action/.machine_readable/ai/.clinerules b/validate-action/.machine_readable/ai/.clinerules new file mode 100644 index 0000000..eb95175 --- /dev/null +++ b/validate-action/.machine_readable/ai/.clinerules @@ -0,0 +1,43 @@ +# SPDX-License-Identifier: MPL-2.0 +# Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) +# Authoritative source: docs/AI-CONVENTIONS.md + +# STARTUP: Read 0-AI-MANIFEST.a2ml first, then .machine_readable/STATE.a2ml. + +# LICENSE +# All original code: MPL-2.0. +# Never AGPL-3.0. MPL-2.0 only as platform-required fallback. +# SPDX header required on every source file. +# Copyright: Jonathan D.A. Jewell (hyperpolymath) + +# STATE FILES (.machine_readable/ ONLY) +# Never create in repo root: STATE.a2ml, META.a2ml, ECOSYSTEM.a2ml, +# AGENTIC.a2ml, NEUROSYM.a2ml, PLAYBOOK.a2ml. +# The .machine_readable/ directory is the single source of truth. + +# BANNED PATTERNS +# Idris2: believe_me, assert_total, assert_smaller, unsafePerformIO +# Haskell: unsafeCoerce, unsafePerformIO, undefined, error +# OCaml: Obj.magic, Obj.repr, Obj.obj +# Coq: Admitted +# Lean: sorry +# Rust: transmute (unless FFI with // SAFETY: comment) + +# BANNED LANGUAGES +# TypeScript -> ReScript +# Node.js / npm / bun -> Deno +# Go -> Rust +# Python -> Julia or Rust + +# CONTAINERS +# Runtime: Podman (never Docker). +# File: Containerfile (never Dockerfile). +# Base: cgr.dev/chainguard/wolfi-base:latest or cgr.dev/chainguard/static:latest. + +# ABI/FFI +# ABI: Idris2 with dependent types (src/interface/abi/). +# FFI: Zig with C ABI (src/interface/ffi/). +# Headers: src/interface/generated/. + +# BUILD: Use just (justfile) for all tasks. +# STYLE: Descriptive names. Document all files. SPDX headers everywhere. diff --git a/validate-action/.machine_readable/ai/.cursorrules b/validate-action/.machine_readable/ai/.cursorrules new file mode 100644 index 0000000..5255a80 --- /dev/null +++ b/validate-action/.machine_readable/ai/.cursorrules @@ -0,0 +1,47 @@ +# SPDX-License-Identifier: MPL-2.0 +# Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) +# Authoritative source: docs/AI-CONVENTIONS.md + +# Read 0-AI-MANIFEST.a2ml in the repo root FIRST for canonical file locations. + +# LICENSE +# All original code: MPL-2.0 (SPDX header required on every file). +# Never use AGPL-3.0. Fallback to MPL-2.0 only when platform requires it. +# Copyright: Jonathan D.A. Jewell (hyperpolymath) + +# STATE FILES +# .a2ml metadata files go in .machine_readable/ ONLY. +# Never create STATE.a2ml, META.a2ml, ECOSYSTEM.a2ml, AGENTIC.a2ml, +# NEUROSYM.a2ml, or PLAYBOOK.a2ml in the repository root. + +# BANNED PATTERNS +# Idris2: believe_me, assert_total, assert_smaller, unsafePerformIO +# Haskell: unsafeCoerce, unsafePerformIO, undefined, error +# OCaml: Obj.magic, Obj.repr, Obj.obj +# Coq: Admitted +# Lean: sorry +# Rust: transmute (unless FFI with // SAFETY: comment) + +# BANNED LANGUAGES +# TypeScript -> use ReScript +# Node.js / npm / bun -> use Deno +# Go -> use Rust +# Python -> use Julia or Rust + +# CONTAINERS +# Runtime: Podman (never Docker) +# File: Containerfile (never Dockerfile) +# Base: cgr.dev/chainguard/wolfi-base:latest + +# ABI/FFI STANDARD +# ABI definitions: Idris2 with dependent types (src/interface/abi/) +# FFI implementation: Zig with C ABI (src/interface/ffi/) +# Generated C headers: src/interface/generated/ + +# BUILD SYSTEM +# Use just (justfile) for all build, test, lint, and format tasks. + +# CODE STYLE +# Use descriptive variable names. +# Annotate and document all files. +# Add SPDX-License-Identifier header to every source file. diff --git a/validate-action/.machine_readable/ai/.windsurfrules b/validate-action/.machine_readable/ai/.windsurfrules new file mode 100644 index 0000000..eb95175 --- /dev/null +++ b/validate-action/.machine_readable/ai/.windsurfrules @@ -0,0 +1,43 @@ +# SPDX-License-Identifier: MPL-2.0 +# Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) +# Authoritative source: docs/AI-CONVENTIONS.md + +# STARTUP: Read 0-AI-MANIFEST.a2ml first, then .machine_readable/STATE.a2ml. + +# LICENSE +# All original code: MPL-2.0. +# Never AGPL-3.0. MPL-2.0 only as platform-required fallback. +# SPDX header required on every source file. +# Copyright: Jonathan D.A. Jewell (hyperpolymath) + +# STATE FILES (.machine_readable/ ONLY) +# Never create in repo root: STATE.a2ml, META.a2ml, ECOSYSTEM.a2ml, +# AGENTIC.a2ml, NEUROSYM.a2ml, PLAYBOOK.a2ml. +# The .machine_readable/ directory is the single source of truth. + +# BANNED PATTERNS +# Idris2: believe_me, assert_total, assert_smaller, unsafePerformIO +# Haskell: unsafeCoerce, unsafePerformIO, undefined, error +# OCaml: Obj.magic, Obj.repr, Obj.obj +# Coq: Admitted +# Lean: sorry +# Rust: transmute (unless FFI with // SAFETY: comment) + +# BANNED LANGUAGES +# TypeScript -> ReScript +# Node.js / npm / bun -> Deno +# Go -> Rust +# Python -> Julia or Rust + +# CONTAINERS +# Runtime: Podman (never Docker). +# File: Containerfile (never Dockerfile). +# Base: cgr.dev/chainguard/wolfi-base:latest or cgr.dev/chainguard/static:latest. + +# ABI/FFI +# ABI: Idris2 with dependent types (src/interface/abi/). +# FFI: Zig with C ABI (src/interface/ffi/). +# Headers: src/interface/generated/. + +# BUILD: Use just (justfile) for all tasks. +# STYLE: Descriptive names. Document all files. SPDX headers everywhere. diff --git a/validate-action/.machine_readable/ai/0.2-AI-MANIFEST.a2ml b/validate-action/.machine_readable/ai/0.2-AI-MANIFEST.a2ml new file mode 100644 index 0000000..869cbee --- /dev/null +++ b/validate-action/.machine_readable/ai/0.2-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "ai-registry" +level: 2 +parent: "../0.1-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Sub-registry for ai metadata. diff --git a/validate-action/.machine_readable/ai/AI.a2ml b/validate-action/.machine_readable/ai/AI.a2ml new file mode 100644 index 0000000..c683d30 --- /dev/null +++ b/validate-action/.machine_readable/ai/AI.a2ml @@ -0,0 +1,16 @@ + +# AI Assistant Instructions + +## Repository Focus +- `rsr-template-repo` is treated as a Rhodium Standard Repository; obey the Rhodium policies and keep `.machine_readable/` authoritative. +- All machine-readable content lives under `.machine_readable/` — state files (a2ml), bot directives, and contractiles. +- Prefer to keep generated files out of source control, and regenerate them with the documented commands before committing. + +## Workflow +1. Inspect `.machine_readable/STATE.a2ml` for blockers and next actions. +2. Respect any constraints listed inside `.machine_readable/AGENTIC.a2ml` when tooling changes are requested. +3. After finishing edits, update STATE with your outcomes and commit with a concise, imperative message. + +## Delivery Promises +- Mention in summaries whether STATE, `.machine_readable/contractiles/`, or `.machine_readable/bot_directives/` changed. +- Keep this file in sync with the repository's status; update it if the governance changes. diff --git a/validate-action/.machine_readable/ai/PLACEHOLDERS.adoc b/validate-action/.machine_readable/ai/PLACEHOLDERS.adoc new file mode 100644 index 0000000..515a515 --- /dev/null +++ b/validate-action/.machine_readable/ai/PLACEHOLDERS.adoc @@ -0,0 +1,142 @@ += Template Placeholders +# Template Placeholders + +All placeholders in this template follow the `{{PLACEHOLDER}}` pattern. +After cloning, replace them with your project-specific values. + +## Recommended: Interactive Bootstrap + +```bash +just init +``` + +This interactively prompts for all values, replaces every placeholder, +validates the result, and runs k9-svc checks if available. + +## Manual Replace + +```bash +# If you prefer manual replacement (run from repo root) + +sed -i 's/Jonathan D.A. Jewell/Jane Doe/g' $(grep -rl 'Jonathan D.A. Jewell' .) +sed -i 's/j.d.a.jewell@open.ac.uk/jane@example.org/g' $(grep -rl 'j.d.a.jewell@open.ac.uk' .) +sed -i 's/hyperpolymath/my-org/g' $(grep -rl 'hyperpolymath' .) +sed -i 's/a2ml-validate-action/my-project/g' $(grep -rl 'a2ml-validate-action' .) +sed -i 's/{{PROJECT}}/MY_PROJECT/g' $(grep -rl '{{PROJECT}}' .) +sed -i 's/{{project}}/my_project/g' $(grep -rl '{{project}}' .) +sed -i 's/a2ml-validate-action/my-project/g' $(grep -rl 'a2ml-validate-action' .) +sed -i 's/github.com/github.com/g' $(grep -rl 'github.com' .) +sed -i "s/2026/$(date +%Y)/g" $(grep -rl '2026' .) +sed -i "s/2026-03-16/$(date +%Y-%m-%d)/g" $(grep -rl '2026-03-16' .) +``` + +## Placeholder Reference + +### Author & Copyright + +| Placeholder | Description | Example | Files | +|---|---|---|---| +| `Jonathan D.A. Jewell` | Full legal name | `Jane Doe` | SPDX headers (all files), MAINTAINERS.md, .mailmap, .reuse/dep5, docs/AI-CONVENTIONS.md | +| `j.d.a.jewell@open.ac.uk` | Primary contact email | `jane@example.org` | SPDX headers (all files), .mailmap, .reuse/dep5, .well-known/humans.txt | +| `` | Previous/secondary email (for .mailmap) | `old@example.com` | .mailmap | +| `hyperpolymath` | Author's organization/affiliation | `Acme University` | project-metadata.k9.ncl | +| `Jewell` | Author surname (for citations) | `Doe` | docs/CITATIONS.adoc | +| `Jonathan D.A.` | Author first name (for citations) | `Jane` | docs/CITATIONS.adoc | +| `J.` | Author initials (for citations) | `J.` | docs/CITATIONS.adoc | + +### Project Identity + +| Placeholder | Description | Example | Files | +|---|---|---|---| +| `a2ml-validate-action` | Human-readable project name | `My Project` | SECURITY.md, CODE_OF_CONDUCT.md, TOPOLOGY.md, STATE.a2ml, Justfile, GOVERNANCE.md, MAINTAINERS.md, flake.nix, devcontainer.json | +| `` | One-line description | `A tool for X` | flake.nix | +| `{{PROJECT}}` | Uppercase identifier (for Idris2 modules, C macros) | `MY_PROJECT` | ABI-FFI-README.md, src/interface/abi/*.idr, src/interface/ffi/*.zig | +| `{{project}}` | Lowercase identifier (for C symbols, filenames) | `my_project` | ABI-FFI-README.md, src/interface/ffi/*.zig | +| `a2ml-validate-action` | Repository name (slug) | `my-project` | CONTRIBUTING.md, SECURITY.md, CODE_OF_CONDUCT.md, cliff.toml | +| `hyperpolymath` | GitHub/GitLab org or username | `my-org` | SPDX headers, CONTRIBUTING.md, SECURITY.md, GOVERNANCE.md, MAINTAINERS.md, CODEOWNERS, mirror.yml, cliff.toml | +| `github.com` | Git forge domain | `github.com` | CONTRIBUTING.md | + +### Dates + +| Placeholder | Description | Example | Files | +|---|---|---|---| +| `2026` | Current year | `2026` | SPDX headers (all files), GOVERNANCE.md, MAINTAINERS.md | +| `2026-03-16` | Current date (ISO) | `2026-02-14` | STATE.a2ml, MAINTAINERS.md | +| `2026-03-16` | Last updated date | `2026-02-14` | TOPOLOGY.md, THREAT-MODEL.md | + +### Contact & Security + +| Placeholder | Description | Example | Files | +|---|---|---|---| +| `j.d.a.jewell@open.ac.uk` | Security contact email | `security@example.org` | SECURITY.md | +| `{{PGP_FINGERPRINT}}` | 40-char PGP fingerprint | `ABCD 1234 ...` | SECURITY.md | +| `{{PGP_KEY_URL}}` | URL to public PGP key | `https://keys.openpgp.org/...` | SECURITY.md | +| `https://github.com/hyperpolymath/a2ml-validate-action` | Project website | `https://example.org` | SECURITY.md | +| `j.d.a.jewell@open.ac.uk` | Conduct reports email | `conduct@example.org` | CODE_OF_CONDUCT.md | +| `Code of Conduct Committee` | Conduct committee name | `Code of Conduct Committee` | CODE_OF_CONDUCT.md | +| `48 hours` | SLA for initial response | `48 hours` | CODE_OF_CONDUCT.md | + +### Git + +| Placeholder | Description | Example | Files | +|---|---|---|---| +| `main` | Main branch name | `main` | CONTRIBUTING.md | + +### Build + +| Placeholder | Description | Example | Files | +|---|---|---|---| +| `MPL-2.0` | License name | `MPL-2.0` | ABI-FFI-README.md | +| `` | One-line project description | `FFI bridges between languages` | STATE.a2ml | + +### AI Manifest + +| Placeholder | Description | Example | Files | +|---|---|---|---| +| `[YOUR-REPO-NAME]` | Repository name | `my-project` | 0-AI-MANIFEST.a2ml | +| `[DATE]` | Creation date | `2026-02-14` | 0-AI-MANIFEST.a2ml | +| `[YOUR-NAME/ORG]` | Maintainer name | `hyperpolymath` | 0-AI-MANIFEST.a2ml | + +### AI Installation Guide + +| Marker | Description | Files | +|---|---|---| +| `[TODO-AI-INSTALL]` | Unfilled section in AI installation guide | `docs/AI_INSTALLATION_GUIDE.adoc`, `docs/AI-INSTALL-README-SECTION.adoc`, `README.adoc` | + +These are **not** standard `{{PLACEHOLDER}}` markers -- they are TODO markers +that must be replaced with project-specific content before release. They mark +sections where the developer (or AI) must fill in: + +- What questions the AI should ask the user +- Exact prerequisite check and install commands +- Privacy notice specific to this project +- Complete installation command block +- Credential setup instructions (URLs, scopes, env vars) +- Verification commands and expected output +- Error handling table +- Example conversation + +**finishbot checks:** `just validate-ai-install` verifies no `[TODO-AI-INSTALL]` markers remain. + +## Deletion Markers + +Some files contain deletion instructions: + +| Marker | Meaning | File | +|---|---|---| +| `{{~ ... ~}}` | Delete this entire line after reading | ABI-FFI-README.md (line 1) | + +## Verification + +After replacing all placeholders, verify none remain: + +```bash +grep -rn '{{' . --include='*.md' --include='*.adoc' --include='*.a2ml' \ + --include='*.scm' --include='*.idr' --include='*.zig' --include='*.res' \ + --include='Justfile' --include='*.nix' --include='*.toml' --include='*.yml' \ + --include='*.yaml' --include='*.hs' --include='*.ncl' --include='*.txt' \ + --include='*.json' --include='Containerfile' --include='dep5' \ + | grep -v 'PLACEHOLDERS.md' | grep -v 'node_modules' +``` + +If the above command produces no output, all placeholders have been replaced. diff --git a/validate-action/.machine_readable/ai/README.adoc b/validate-action/.machine_readable/ai/README.adoc new file mode 100644 index 0000000..a5dec59 --- /dev/null +++ b/validate-action/.machine_readable/ai/README.adoc @@ -0,0 +1,24 @@ +// SPDX-License-Identifier: CC-BY-SA-4.0 +// Copyright (c) Jonathan D.A. Jewell += AI Guidance Directory + +Put AI-facing instructions in this folder. + +Examples: + +* `CLAUDE.md` +* `COPILOT.md` +* `GEMINI.md` +* `AI.a2ml` +* `AI.djot` + +Avoid scattering agent instruction files around the repo root. + +Recommended machine read order: + +* `.machine_readable/descriptiles/anchors/ANCHOR.a2ml` +* `.machine_readable/policies/MAINTENANCE-AXES.a2ml` +* `.machine_readable/policies/MAINTENANCE-CHECKLIST.a2ml` +* `.machine_readable/policies/SOFTWARE-DEVELOPMENT-APPROACH.a2ml` +* `.machine_readable/descriptiles/STATE.a2ml` +* `.machine_readable/descriptiles/META.a2ml` diff --git a/validate-action/.machine_readable/bot_directives/README.adoc b/validate-action/.machine_readable/bot_directives/README.adoc new file mode 100644 index 0000000..dff8237 --- /dev/null +++ b/validate-action/.machine_readable/bot_directives/README.adoc @@ -0,0 +1,41 @@ +// SPDX-License-Identifier: CC-BY-SA-4.0 +// Copyright (c) Jonathan D.A. Jewell += Bot Directives +:toc: preamble + +Methodology-aware configuration for AI agents. Read by any AI agent +(Claude, Gemini, Copilot, etc.) at session start. + +== Files + +[cols="1,3"] +|=== +| File | Purpose + +| `methodology.a2ml` +| Default mode, invariants, ring ceiling, priority weights, convergent budget + +| `coverage.a2ml` +| Session coverage tracking — what was visited, what was skipped, what has MUSTs + +| `debt.a2ml` +| Meander debt — things found but not fixed, carried between sessions +|=== + +== How Agents Use These + +1. Read `methodology.a2ml` at session start — know mode, invariants, ceiling +2. Read `coverage.a2ml` — know what was visited last time, what was skipped +3. Read `debt.a2ml` — know what's outstanding from previous sessions +4. At session end, update `coverage.a2ml` and `debt.a2ml` + +== Relationship to Other Files + +* `AGENTIC.a2ml` says WHAT agents can do (permissions, gating) +* `bot_directives/` (this directory) says HOW agents should work — methodology + and fleet-wide directives (formerly `agent_instructions/`) +* `CLAUDE.md` says how Claude specifically should work (Claude-specific) + +== Reference + +ADR-002 in `standards/agentic-a2ml/docs/ADR-002-methodology-layer.adoc` diff --git a/validate-action/.machine_readable/bot_directives/coverage.a2ml b/validate-action/.machine_readable/bot_directives/coverage.a2ml new file mode 100644 index 0000000..6979664 --- /dev/null +++ b/validate-action/.machine_readable/bot_directives/coverage.a2ml @@ -0,0 +1,61 @@ +# SPDX-License-Identifier: MPL-2.0 +# Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) +# +# coverage.a2ml — Session coverage tracking +# Updated at the end of each AI agent session. +# Persists what was visited, what was skipped, and what has MUSTs. +# +# Reference: ADR-002 in standards/agentic-a2ml/docs/ + +[metadata] +version = "1.0.0" +last-updated = "2026-03-24" + +# ============================================================================ +# COVERAGE STATE +# ============================================================================ +# Updated by agents at session end. Tracks which components have been +# visited and which have known MUSTs that were skipped. + +[coverage] +total-components = 0 +visited-components = 0 +coverage-percent = 0 + +# ============================================================================ +# VISITED COMPONENTS +# ============================================================================ +# Component → session date + ring reached +# Agents add entries as they work through components. +# +# Example: +# [coverage.visited.emergency-room] +# date = "2026-03-23" +# ring = 2 +# fixes = 3 +# notes = "boot-guardian built, shutdown-marshal built" + +# ============================================================================ +# SKIPPED COMPONENTS WITH MUSTS +# ============================================================================ +# Components with known MUSTs that were not visited in the most recent session. +# These become P1 inputs for the next session's Phase 0. +# +# Example: +# [coverage.skipped-musts.session-sentinel] +# priority = "P0" +# issue = "56 SIGABRTs in 4 days, D-Bus race condition" +# discovered = "2026-03-23" + +# ============================================================================ +# CHERRY-PICKING AUDIT +# ============================================================================ +# At session end, agents report whether they chose easy work over hard work. +# This is the accountability mechanism for the weighted priority system. +# +# [coverage.cherry-picking] +# easy-high-completed = 3 +# hard-high-completed = 1 +# easy-low-completed = 2 +# hard-low-deferred = 4 +# assessment = "Correctly prioritised — all MUST items addressed before COULDs" diff --git a/validate-action/.machine_readable/bot_directives/debt.a2ml b/validate-action/.machine_readable/bot_directives/debt.a2ml new file mode 100644 index 0000000..c0238c5 --- /dev/null +++ b/validate-action/.machine_readable/bot_directives/debt.a2ml @@ -0,0 +1,49 @@ +# SPDX-License-Identifier: MPL-2.0 +# Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) +# +# debt.a2ml — Meander debt list +# Things found but not fixed. Carried between sessions. +# Becomes the next session's Phase 0 input. +# +# Reference: ADR-002 in standards/agentic-a2ml/docs/ + +[metadata] +version = "1.0.0" +last-updated = "2026-03-24" + +# ============================================================================ +# DEBT ITEMS +# ============================================================================ +# Each item has: component, issue, effort (easy|medium|hard), impact (high|medium|low), +# priority (should|could), and discovered date. +# +# Items are consumed (removed) when fixed. New items are added at session end. +# The debt list prevents the "one more wave" loop — found things are persisted, +# not forgotten, and not used as justification for infinite meandering. + +# ============================================================================ +# SHOULD — would fix next wave +# ============================================================================ +# These are inputs for the next session if the user says "keep going". +# +# Example: +# [[debt.should]] +# component = "system-tools/monitoring/observatory" +# issue = "Stale duplicate of root observatory/" +# effort = "easy" +# impact = "medium" +# discovered = "2026-03-23" + +# ============================================================================ +# COULD — would fix eventually +# ============================================================================ +# These are low-priority items that don't justify a session on their own. +# They get picked up when an agent is in the area for other reasons. +# +# Example: +# [[debt.could]] +# component = "cicada" +# issue = "RSR_OUTLINE.adoc references banned AGPL-3.0" +# effort = "easy" +# impact = "low" +# discovered = "2026-03-23" diff --git a/validate-action/.machine_readable/bot_directives/methodology.a2ml b/validate-action/.machine_readable/bot_directives/methodology.a2ml new file mode 100644 index 0000000..754f357 --- /dev/null +++ b/validate-action/.machine_readable/bot_directives/methodology.a2ml @@ -0,0 +1,107 @@ +# SPDX-License-Identifier: MPL-2.0 +# Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) +# +# methodology.a2ml — AI agent methodology configuration +# Declares how agents should approach work in this repository. +# Read at session start by any AI agent (Claude, Gemini, Copilot, etc.) +# +# Reference: ADR-002 in standards/agentic-a2ml/docs/ + +[metadata] +version = "1.0.0" +last-updated = "2026-03-24" +spec = "https://github.com/hyperpolymath/standards/blob/main/agentic-a2ml/docs/ADR-002-methodology-layer.adoc" + +# ============================================================================ +# MODE SELECTION +# ============================================================================ +# convergent: find gaps, fill them, build infrastructure (default for ops/infra) +# divergent: find what's strongest, push it further (for research/creative) +# hybrid: audit 20% of budget, then focus 80% on top MUSTs (default for most) + +[methodology] +default-mode = "hybrid" +ring-ceiling = 2 # Hard ceiling for ring expansion (0-3) +wave-cap = 2 # Max waves before requiring user "keep going" +spike-required = true # Every session must ship code, not just designs + +# ============================================================================ +# PRIORITY WEIGHTS +# ============================================================================ +# MUST (3x): Blocking the current work → fix immediately +# SHOULD (2x): Degrading quality of current work → fix if in zone +# COULD (1x): Improving quality of adjacent work → add to debt list + +[methodology.priority-weights] +must = 3 +should = 2 +could = 1 + +# ============================================================================ +# CONVERGENT BUDGET (when mode = convergent or hybrid) +# ============================================================================ +# How to allocate effort across work types. +# Prevents over-polishing docs while structural work waits. + +[methodology.convergent-budget] +structural = 70 # % for new modules, compilation fixes, wiring, integration +corrective = 20 # % for bugs found, broken imports, stale references +perfective = 10 # % for SPDX headers, doc updates, formatting, style + +# ============================================================================ +# UNIQUE STRENGTH (when mode = divergent) +# ============================================================================ +# What makes this project special. Agents should DEEPEN this, not broaden it. +# Customise this per project — the template default is generic. + +[methodology.unique-strength] +description = "{{PROJECT_UNIQUE_STRENGTH}}" +deepen-not-broaden = true + +# ============================================================================ +# DIVERGENT INVARIANTS +# ============================================================================ +# Constraints that divergent mode must NOT violate. +# These are the riverbanks — diverge within them, not across. +# "Amplify uniqueness" means deepen, not broaden. +# +# Test before any divergent action: +# "Does this deepen the existing strength, or add a parallel strength?" +# If parallel → stop. Note as cross-project insight. + +[methodology.divergent-invariants] +rules = [ + # Customise per project. Examples: + # "Idris2 only for formal verification — no Lean4, Coq, Agda", + # "believe_me count must remain zero", + # "FFI architecture: Idris2 → RefC → Zig → C ABI (no shortcuts)", +] + +# Optional: language invariant for the core strength +# If set, divergent mode will not introduce other languages for this purpose +# language-invariant = "idris2" + +# ============================================================================ +# CONSTRAINT HINTS +# ============================================================================ +# Help Phase 0 find the critical chain faster. +# Updated at session end with newly discovered constraints. + +[methodology.known-constraints] +constraints = [ + # Customise per project. Examples: + # "End-to-end build has never been verified", + # "libproject.so does not exist yet — all bindings call stubs", +] + +# ============================================================================ +# STATE FILE VALIDATION +# ============================================================================ +# Phase 0 reads STATE.a2ml first but it may be broken. +# These rules detect corrupt/template/stale state files. + +[methodology.state-validation] +reject-if-contains = ["{{PLACEHOLDER}}", "{{PROJECT}}", "rsr-template-repo"] +reject-if-project-name-mismatch = true +staleness-threshold-days = 90 +fallback-files = ["TODO.md", "TODO.adoc", "ROADMAP.adoc", "README.adoc"] diff --git a/validate-action/.machine_readable/compliance/reuse/dep5 b/validate-action/.machine_readable/compliance/reuse/dep5 new file mode 100644 index 0000000..5c6eb76 --- /dev/null +++ b/validate-action/.machine_readable/compliance/reuse/dep5 @@ -0,0 +1,54 @@ +Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ +Upstream-Name: a2ml-validate-action +Upstream-Contact: Jonathan D.A. Jewell +Source: https://github.com/hyperpolymath/a2ml-validate-action + +# Default: all files are MPL-2.0 +Files: * +Copyright: 2026 Jonathan D.A. Jewell (hyperpolymath) +License: MPL-2.0 + +# Configuration files that cannot carry headers +Files: .editorconfig .gitignore .gitattributes .tool-versions .mailmap +Copyright: 2026 Jonathan D.A. Jewell (hyperpolymath) +License: MPL-2.0 + +# Machine-readable state files +Files: .machine_readable/*.a2ml +Copyright: 2026 Jonathan D.A. Jewell (hyperpolymath) +License: MPL-2.0 + +# Bot directives +Files: .machine_readable/bot_directives/* +Copyright: 2026 Jonathan D.A. Jewell (hyperpolymath) +License: MPL-2.0 + +# Contractiles +Files: .machine_readable/contractiles/* +Copyright: 2026 Jonathan D.A. Jewell (hyperpolymath) +License: MPL-2.0 + +# GitHub/CI configuration +Files: .github/* .github/**/* +Copyright: 2026 Jonathan D.A. Jewell (hyperpolymath) +License: MPL-2.0 + +# Generated files +Files: generated/* +Copyright: 2026 Jonathan D.A. Jewell (hyperpolymath) +License: MPL-2.0 + +# Lockfiles and auto-generated +Files: *.lock Cargo.lock flake.lock +Copyright: 2026 Jonathan D.A. Jewell (hyperpolymath) +License: MPL-2.0 + +# Devcontainer config (JSON, no comments) +Files: .devcontainer/*.json +Copyright: 2026 Jonathan D.A. Jewell (hyperpolymath) +License: MPL-2.0 + +# Git-cliff config +Files: cliff.toml +Copyright: 2026 Jonathan D.A. Jewell (hyperpolymath) +License: MPL-2.0 diff --git a/validate-action/.machine_readable/compliance/rust/deny.toml b/validate-action/.machine_readable/compliance/rust/deny.toml new file mode 100644 index 0000000..0534a85 --- /dev/null +++ b/validate-action/.machine_readable/compliance/rust/deny.toml @@ -0,0 +1,65 @@ +# SPDX-License-Identifier: MPL-2.0 +# cargo-deny configuration for RSR-compliant repositories +# Run: cargo deny check +# Docs: https://embarkstudios.github.io/cargo-deny/ + +[graph] +targets = [] +all-features = true + +# --- Advisory database --------------------------------------------------- +[advisories] +db-path = "~/.cargo/advisory-db" +db-urls = ["https://github.com/rustsec/advisory-db"] +# Fail on any known vulnerability +vulnerability = "deny" +unmaintained = "warn" +yanked = "warn" +notice = "warn" + +# --- License policy ------------------------------------------------------- +[licenses] +unlicensed = "deny" +confidence-threshold = 0.8 + +allow = [ + "MPL-2.0", + "MPL-2.0", + "MIT", + "Apache-2.0", + "BSD-2-Clause", + "BSD-3-Clause", + "ISC", + "Zlib", + "Unicode-3.0", + "Unicode-DFS-2016", +] + +deny = [ + "AGPL-3.0-only", + "AGPL-3.0-or-later", +] + +copyleft = "warn" + +[[licenses.exceptions]] +allow = ["OpenSSL"] +name = "ring" + +# --- Crate bans ------------------------------------------------------------ +[bans] +multiple-versions = "warn" +wildcards = "allow" +highlight = "all" + +deny = [ + # Known-bad crates + { name = "openssl", wrappers = ["openssl-sys"] }, +] + +# --- Source restrictions ---------------------------------------------------- +[sources] +unknown-registry = "deny" +unknown-git = "warn" +allow-registry = ["https://github.com/rust-lang/crates.io-index"] +allow-git = [] diff --git a/validate-action/.machine_readable/configs/0.2-AI-MANIFEST.a2ml b/validate-action/.machine_readable/configs/0.2-AI-MANIFEST.a2ml new file mode 100644 index 0000000..6e41e6c --- /dev/null +++ b/validate-action/.machine_readable/configs/0.2-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "configs-registry" +level: 2 +parent: "../0.1-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Sub-registry for configs metadata. diff --git a/validate-action/.machine_readable/configs/README.adoc b/validate-action/.machine_readable/configs/README.adoc new file mode 100644 index 0000000..616b9e7 --- /dev/null +++ b/validate-action/.machine_readable/configs/README.adoc @@ -0,0 +1 @@ += configs Registry diff --git a/validate-action/.machine_readable/configs/git-cliff/cliff.toml b/validate-action/.machine_readable/configs/git-cliff/cliff.toml new file mode 100644 index 0000000..7dd04bf --- /dev/null +++ b/validate-action/.machine_readable/configs/git-cliff/cliff.toml @@ -0,0 +1,119 @@ +# SPDX-License-Identifier: MPL-2.0 +# Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) +# +# git-cliff configuration for conventional commit changelog generation. +# https://git-cliff.org/docs/configuration +# +# Placeholders — replace before first use: +# hyperpolymath — GitHub organization or username +# a2ml-validate-action — GitHub repository name + +[changelog] +# Changelog header +header = """ +# Changelog\n +All notable changes to this project will be documented in this file.\n +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).\n +\n +""" +# Template for the changelog body +# https://keats.github.io/tera/docs/#introduction +body = """ +{%- macro remote_url() -%} + https://github.com/hyperpolymath/a2ml-validate-action +{%- endmacro -%} + +{% if version -%} + ## [{{ version | trim_start_matches(pat="v") }}] - {{ timestamp | date(format="%Y-%m-%d") }} +{% else -%} + ## [Unreleased] +{% endif -%} + +{% for group, commits in commits | group_by(attribute="group") %} + ### {{ group | striptags | trim }} + {% for commit in commits %} + - {% if commit.scope %}**{{ commit.scope }}:** {% endif %}\ + {% if commit.breaking %}[**BREAKING**] {% endif %}\ + {{ commit.message | upper_first }}\ + {%- if commit.links %} \ + ({% for link in commit.links %}[{{ link.text }}]({{ link.href }}){% endfor %}){% endif -%} + {% endfor %} +{% endfor %} + +{%- if github -%} +{% if github.contributors | filter(attribute="is_first_time", value=true) | length != 0 %} + ### New Contributors +{%- for contributor in github.contributors | filter(attribute="is_first_time", value=true) %} + * @{{ contributor.username }} made their first contribution + {%- if contributor.pr_number %} in \ + [#{{ contributor.pr_number }}]({{ self::remote_url() }}/pull/{{ contributor.pr_number }}) + {%- endif %} +{%- endfor %} +{% endif -%} +{% endif -%} + +""" +# Template for the changelog footer +footer = """ +{%- macro remote_url() -%} + https://github.com/hyperpolymath/a2ml-validate-action +{%- endmacro -%} + +{% for release in releases -%} + {% if release.version -%} + {% if release.previous.version -%} + [{{ release.version | trim_start_matches(pat="v") }}]: \ + {{ self::remote_url() }}/compare/{{ release.previous.version }}...{{ release.version }} + {% endif -%} + {% else -%} + {% if release.previous.version -%} + [Unreleased]: {{ self::remote_url() }}/compare/{{ release.previous.version }}...HEAD + {% endif -%} + {% endif -%} +{% endfor %} + +""" +# Remove leading and trailing whitespace from templates +trim = true + +[git] +# Parse conventional commits +# https://www.conventionalcommits.org +conventional_commits = true +# Filter out unconventional commits +filter_unconventional = true +# Process each line of a commit as an individual commit +split_commits = false +# Regex for commit preprocessing +commit_preprocessors = [ + # Remove issue numbers from commit messages + { pattern = '\((\w+\s)?#([0-9]+)\)', replace = "" }, +] +# Regex for parsing and grouping commits +commit_parsers = [ + { message = "^feat", group = "Features" }, + { message = "^fix", group = "Bug Fixes" }, + { message = "^security", group = "Security" }, + { message = "^perf", group = "Performance" }, + { message = "^refactor", group = "Refactoring" }, + { message = "^docs", group = "Documentation" }, + { message = "^style", group = "Styling" }, + { message = "^test", group = "Testing" }, + { message = "^ci", group = "CI/CD" }, + { message = "^chore\\(release\\)", skip = true }, + { message = "^chore\\(deps.*\\)", skip = true }, + { message = "^chore\\(pr\\)", skip = true }, + { message = "^chore", group = "Miscellaneous" }, + { body = ".*security", group = "Security" }, +] +# Protect breaking changes from being skipped by a commit parser +protect_breaking_commits = false +# Filter out merge commits +filter_merge_commits = true +# Filter out commits by tag pattern (skip pre-releases) +# tag_pattern = "v[0-9].*" +# Regex for skipping tags +# skip_tags = "beta|alpha" +# Sort commits within each group by oldest first +sort_commits = "oldest" diff --git a/validate-action/.machine_readable/contractiles/INDEX.a2ml b/validate-action/.machine_readable/contractiles/INDEX.a2ml new file mode 100644 index 0000000..d44c3f2 --- /dev/null +++ b/validate-action/.machine_readable/contractiles/INDEX.a2ml @@ -0,0 +1,133 @@ +# SPDX-License-Identifier: MPL-2.0 +# INDEX.a2ml — Contractile Registry +# Author: Jonathan D.A. Jewell +# +# Machine-readable catalogue of all contractile verbs in this template set. +# Consumers (CI scripts, the contractile CLI, Hypatia rules) SHOULD read this +# file to discover available verbs rather than hard-coding the list. +# +# See: docs/CONTRACTILE-SPEC.adoc §Registry + +--- +id = "contractiles-registry" +version = "2.0.0" # 2.0.0 (2026-04-18): all 6 verbs on trident shape; verb set complete. +spec = "docs/CONTRACTILE-SPEC.adoc" +last_updated = "2026-04-18" +base_schema = ".machine_readable/contractiles/_base.ncl" +meta_schema_status = "pending — see CONTRACTILE-SPEC §validator-meta-schema" + +## Verbs + +[[verbs]] +name = "adjust" +semantics = "drift tolerances + corrective actions" +trident = [ + "adjust/Adjustfile.a2ml", + "adjust/adjust.ncl", + "adjust/adjust.k9.ncl", +] +manifest = "adjust/adjust.manifest.a2ml" +status = "active" +tier = "Yard" +authority = "advisory" +gating = "advisory (continue-with-warnings)" +cardinality = "one per repo" +notes = "Fifth trident instance (2026-04-18). First (Yard, advisory) authority pattern. Specialises in cumulative-drift catchment — tolerance bands + trend tracking across sessions. auto_fix_when_available applies deterministic patches; advisory otherwise." + +[[verbs]] +name = "bust" +semantics = "hard-stop / expiry / must-not-run declarations" +trident = [ + "bust/Bustfile.a2ml", + "bust/bust.ncl", + "bust/bust.k9.ncl", +] +manifest = "bust/bust.manifest.a2ml" +status = "active" +tier = "Hunt-read-only" +authority = "blocking" +gating = "hard (exit-nonzero)" +cardinality = "one per repo" +notes = "Fourth trident instance (2026-04-18). Completes the blocking-authority triple (must + trust + bust). Specialises in deprecated-path-reintroduction catchment. Injects failures via declared probes and verifies recovery paths." + +[[verbs]] +name = "dust" +semantics = "rollback / recovery / deprecation / audit-trail preservation" +trident = [ + "dust/Dustfile.a2ml", + "dust/dust.ncl", + "dust/dust.k9.ncl", +] +manifest = "dust/dust.manifest.a2ml" +status = "active" +tier = "Yard" +authority = "advisory" +gating = "advisory (continue-with-warnings)" +cardinality = "one per repo" +notes = "Sixth and FINAL trident instance (2026-04-18) — completes the full verb set. Specialises in audit-trail preservation + rollback-path verification. Destructive actions gated behind --apply flag + per-item approval; dry-run default." + +[[verbs]] +name = "intend" +semantics = "north-star (commitments + aspirations)" +trident = [ + "intend/Intentfile.a2ml", + "intend/intend.ncl", + "intend/intend.k9.ncl", +] +manifest = "intend/intend.manifest.a2ml" +status = "active" +tier = "Hunt" +authority = "reporting" +gating = "non-gating (continue)" +cardinality = "one per repo" +notes = "First trident instance in the estate (2026-04-18). Reports progress toward committed next-actions AND lists horizon aspirations. Absorbed the deprecated `lust` verb 2026-04-18. Never blocks. Remaining 5 verbs still on file_pair shape until tridents are built." + +[[verbs]] +name = "k9" +semantics = "trust-tier templates (EXCEPTION to one-verbfile rule)" +file_pair = [ + "k9/template-hunt.k9.ncl", + "k9/template-kennel.k9.ncl", + "k9/template-yard.k9.ncl", +] +status = "exception" +gating = "not applicable" +notes = "k9 is service-automation meta-infrastructure, not a verb contractile. Three trust-tier templates (Kennel/Yard/Hunt). Does not have a Verbfile.a2ml. See CONTRACTILE-SPEC §k9-exception." + +# [[verbs]] lust REMOVED 2026-04-18 — name had unwanted associations; +# the horizon/aspiration semantics were always meant to live inside `intend` +# (the north-star verb). The [[wishes]] schema was absorbed into +# intend/Intentfile.a2ml. Any `lust/` dir found in an estate repo is drift +# and should be deleted. + +[[verbs]] +name = "must" +semantics = "invariant assertion — release-blocking" +trident = [ + "must/Mustfile.a2ml", + "must/must.ncl", + "must/must.k9.ncl", +] +manifest = "must/must.manifest.a2ml" +status = "active" +tier = "Hunt-read-only" +authority = "blocking" +gating = "hard (exit-nonzero)" +cardinality = "one per repo" +notes = "Third trident instance (2026-04-18). Completes the blocking-authority pair with trust: must = concrete + persistent invariants; trust = concrete + ephemeral transactions. Specialises in subtle invariant-erosion (tracking per-session trend; flagging silent regression). Single failure blocks merge. Simplest and most commonly populated verb." + +[[verbs]] +name = "trust" +semantics = "security + provenance + safe-hacking" +trident = [ + "trust/Trustfile.a2ml", + "trust/trust.ncl", + "trust/trust.k9.ncl", +] +manifest = "trust/trust.manifest.a2ml" +status = "active" +tier = "Hunt" +authority = "blocking" +gating = "hard (exit-nonzero)" +cardinality = "one per repo" +notes = "Second trident instance (2026-04-18). First (Hunt, blocking) verb — hard gate. Primary defense against threat-model misclassification (B1) and 'turn off the firewall' capability-collapse (C2). Inherits on_open negotiation+accountability+translation from intend.k9.ncl v2.0.0; adds threat_model_foregrounding + block_session_close_on_critical_drift." diff --git a/validate-action/.machine_readable/contractiles/_base.ncl b/validate-action/.machine_readable/contractiles/_base.ncl new file mode 100644 index 0000000..22306fa --- /dev/null +++ b/validate-action/.machine_readable/contractiles/_base.ncl @@ -0,0 +1,141 @@ +# SPDX-License-Identifier: MPL-2.0 +# (MPL-2.0 is automatic legal fallback until PMPL is formally recognised) +# +# _base.ncl — Shared contractile base +# +# Provides four named schema fragments imported by every verb runner: +# +# pedigree_schema — canonical pedigree block shape +# status_core_doc — documentation of the shared status trio (String list) +# probe_schema — target structured probe form (spec only; verb files +# still use probe | String with TODO comments) +# run_defaults — default runner behaviour +# +# Usage in a verb runner: +# +# let base = import "../_base.ncl" in +# { +# pedigree = base.pedigree_schema & { +# contractile_verb = "must", +# semantics = "invariant", +# security = { +# leash = 'Kennel, +# trust_level = "read-only verification", +# allow_network = false, +# allow_filesystem_write = false, +# allow_subprocess = true, +# }, +# metadata = { +# name = "must-runner", +# version = "1.0.0", +# description = "...", +# paired_xfile = "Mustfile.a2ml", +# author = "Jonathan D.A. Jewell ", +# }, +# }, +# schema = { ... }, +# run = base.run_defaults & { on_any_fail = "exit-nonzero" }, +# } +# +# See: docs/CONTRACTILE-SPEC.adoc §Shared Base + +{ + # ------------------------------------------------------------------------- + # pedigree_schema + # + # The canonical shape of the `pedigree` block required in every verb runner. + # Verb runners merge this with their verb-specific values using Nickel's `&` + # (right-priority merge). Override contractile_verb, semantics, security.*, + # and metadata.* in each verb. + # ------------------------------------------------------------------------- + pedigree_schema = { + schema_version | String | default = "1.0.0", + contractile_verb | String | default = "UNSET", # MUST override in verb + semantics | String | default = "UNSET", # MUST override in verb + security = { + leash | [| 'Kennel, 'Yard, 'Hunt |] | default = 'Kennel, + trust_level | String | default = "UNSET", # MUST override in verb + allow_network | Bool | default = false, + allow_filesystem_write | Bool | default = false, + allow_subprocess | Bool | default = true, + # verb-specific additional security fields go in the verb's merge override: + # e.g. authorised_probes_only (trust), injection_scope (bust), + # destructive_mode_requires_flag (dust) + }, + metadata = { + name | String | default = "UNSET", # MUST override in verb + version | String | default = "1.0.0", + description | String | default = "UNSET", # MUST override in verb + paired_xfile | String | default = "UNSET", # MUST override in verb + author | String | default = "Jonathan D.A. Jewell ", + }, + }, + + # ------------------------------------------------------------------------- + # status_core_doc + # + # Documents the minimum shared status values present in every verb's status + # enum: declared, verified, failing. + # + # Nickel does not support structural enum extension, so verb files reproduce + # their full enum verbatim in `schema`. This field serves as documentation + # and for tooling that introspects the base. + # + # Verbs that extend status_core (i.e. all except must + trust): + # adjust: + 'partial + # bust: + 'drilled + # dust: 'declared, 'proposed, 'approved, 'removed (non-standard) + # intend: intents: 'declared, 'in_progress, 'done, 'deferred, 'retired + # wishes: 'declared, 'in_progress, 'achieved, 'abandoned + # (the wishes schema was absorbed from the deprecated `lust` + # verb 2026-04-18; lust/ dir removed estate-wide) + # + # See: docs/CONTRACTILE-SPEC.adoc §Per-Verb Extension + # ------------------------------------------------------------------------- + status_core_doc = "status_core values: declared | verified | failing — extended per verb", + + # ------------------------------------------------------------------------- + # probe_schema + # + # The TARGET structured probe form. See: docs/CONTRACTILE-SPEC.adoc §Probe + # + # IMPORTANT: This is a spec-only definition. Existing verb runner files still + # use `probe | String` with a `# TODO: migrate to probe_schema` comment. + # This is a breaking change; migration happens when the CLI supports both + # forms. + # + # Adopters writing new xfiles should prefer the structured form: + # probe = { + # command = "test -f my-file", + # timeout_seconds = 60, + # allowed_exit_codes = [0], + # permission_class = 'read_only, + # } + # ------------------------------------------------------------------------- + probe_schema = { + command | String, + timeout_seconds | Number | default = 300, + allowed_exit_codes | Array Number | default = [0], + permission_class + | [| 'read_only, 'filesystem_write, 'subprocess, 'network |] + | default = 'read_only, + }, + + # ------------------------------------------------------------------------- + # run_defaults + # + # Default runner behaviour. Verb runners merge this with verb-specific + # overrides using Nickel's `&` (right-priority merge). + # + # Most verbs override on_any_fail: + # "exit-nonzero" : hard gate (must, trust, bust, adjust-gating) + # "continue-with-warnings": advisory (dust, adjust) + # "continue" : never gate (intend — covers both intents and wishes) + # ------------------------------------------------------------------------- + run_defaults = { + on_pass = "continue", + on_any_fail = "exit-nonzero", + report_format = "a2ml", + emit_summary = true, + }, +} diff --git a/validate-action/.machine_readable/contractiles/adjust/Adjustfile.a2ml b/validate-action/.machine_readable/contractiles/adjust/Adjustfile.a2ml new file mode 100644 index 0000000..41c9177 --- /dev/null +++ b/validate-action/.machine_readable/contractiles/adjust/Adjustfile.a2ml @@ -0,0 +1,58 @@ +# SPDX-License-Identifier: MPL-2.0 +# Adjustfile — Drift-tolerance contract for standards +# Author: Jonathan D.A. Jewell +# +# Cumulative-drift catchment: tolerance bands + corrective actions. +# Authority: advisory (Yard) — continue-with-warnings; auto_fix where deterministic. +# Run with: adjust check +# Fix with: adjust fix (applies deterministic patches; advisory otherwise) + +@abstract: +Drift tolerances and corrective actions for the `standards` monorepo. Unlike +MUST (hard gate), ADJUST tracks cumulative drift against tolerance bands and +proposes corrective actions. Advisory — it warns and trends, it does not block. +@end + +## Licence Drift + +### spdx-header-drift +- description: estate-family SPDX headers stay on policy (code=MPL-2.0, docs=CC-BY-SA-4.0) +- tolerance: 0 standards-authored files off-policy (excludes carve-out + third-party) +- corrective: owner-only, manual, per-file — NEVER an automated sweep (policy A2) +- severity: advisory +- notes: PLMP-/PMLP- sentinels are scaffold leaks, fixed by re-substitution, not relicensing. + +### deep-mention-drift +- description: in-body SPDX example/emitter strings track the current policy ids +- tolerance: emitters (generators) must emit MPL-2.0 / CC-BY-SA-4.0; doc examples may lag +- corrective: update header-emitting generators first; doc examples in a follow-up pass +- severity: advisory + +## Documentation Drift + +### adoc-not-md +- description: docs are AsciiDoc except GitHub-required .md (SECURITY/CONTRIBUTING/CODE_OF_CONDUCT/CHANGELOG) +- tolerance: new prose docs are *.adoc; existing *.md migrate opportunistically +- corrective: convert *.md → *.adoc (no duplicate formats) +- severity: advisory + +### registry-staleness +- description: REGISTRY.a2ml reflects the current spec tree +- tolerance: regenerate when specs are added/moved +- corrective: run `bash scripts/build-registry.sh` (or `just registry`) +- severity: advisory + +## Structural Drift + +### contractile-trident-completeness +- description: each contractile verb has its full trident (Xfile.a2ml + verb.ncl + verb.k9.ncl) +- tolerance: all 6 verbs present per .machine_readable/contractiles/INDEX.a2ml +- corrective: re-run the contractiles scaffold for any missing trident member +- severity: advisory + +### no-foreign-project-scaffold +- description: contractile declaration files describe THIS repo, not a scaffold source +- tolerance: 0 files naming another project (e.g. "Burble") in their declaration +- corrective: re-run scaffold substitution OR rewrite for `standards` +- severity: advisory +- notes: 2026-06-04 — the Must/Adjust/Dust trident files were scaffold leaks naming the template source project; rewritten for `standards`. diff --git a/validate-action/.machine_readable/contractiles/adjust/adjust.k9.ncl b/validate-action/.machine_readable/contractiles/adjust/adjust.k9.ncl new file mode 100644 index 0000000..9ff26c9 --- /dev/null +++ b/validate-action/.machine_readable/contractiles/adjust/adjust.k9.ncl @@ -0,0 +1,166 @@ +# SPDX-License-Identifier: MPL-2.0 +# adjust.k9.ncl — K9 trust-tier component of the adjust trident +# Author: Jonathan D.A. Jewell +# +# Pairs with: Adjustfile.a2ml (declaration) + adjust.ncl (runner). +# +# Verb: adjust (drift tolerances + corrective actions) +# Tier: Yard (validation with subprocess for measurement; +# no mutation beyond auto-fix where declared) +# Authority: advisory (continue-with-warnings; not blocking) +# +# adjust is the tolerance-band verb. Where must says "this MUST hold" +# and trust says "this MUST verify clean" (both binary), adjust says +# "drift ≤ X is acceptable; drift > X triggers action Y". Between them, +# adjust handles the subtle-drift territory that binary verbs can't. +# +# Cardinality: ONE adjust trident per repo. +# +# Failure-mode focus: adjust catches cumulative-small-drift patterns +# (E2 cosmetic churn accumulating into real regression, F2 context +# erosion causing gradual parameter drift). Where must flags "broken +# now", adjust flags "drifting toward broken". + +let base_k9 = import "../k9/template-hunt.k9.ncl" in +let base = import "../_base.ncl" in + +{ + pedigree = base_k9.pedigree_schema & { + contractile_verb = "adjust", + paired_xfile = "../adjust/Adjustfile.a2ml", + paired_runner = "../adjust/adjust.ncl", + + tier = 'Yard, + authority = 'advisory, + + metadata = { + name = "adjust-k9", + version = "1.0.0", + description = "Drift-tolerance + corrective-action runner. Fifth trident instance. First (Yard, advisory) authority pattern.", + paired_xfile = "Adjustfile.a2ml", + paired_runner = "adjust.ncl", + author = "Jonathan D.A. Jewell ", + }, + + security = { + leash = 'Yard, + trust_level = "tolerance measurement + declared auto-fix", + allow_network = false, + allow_filesystem_write_conditional = true, # auto_fix_when_available may edit + allow_subprocess = true, + probe_scope = 'measurement_plus_declared_fix, + }, + }, + + variance_schema = { + entry_id | String, + reason | String, + approved_by | String, + scope | String, + expires | String, + review_notes | String | optional, + # adjust-specific: which tolerance band the variance widens + tolerance_band_widened | String, + widened_to_value | String, + }, + + execution = { + triggers = [ 'session_close, 'on_demand, 'pre_push ], + + per_tolerance = { + measure_drift = true, + record_outcome = true, + respect_variance = true, + # adjust-specific authority: tolerance exceeded → warn, try + # auto-fix if declared, then continue. Never blocks. + on_exceeded = 'warn_and_attempt_fix, + on_auto_fix_applied = 'record_and_continue, + on_auto_fix_unavailable = 'record_as_advisory_drift, + # Cumulative-drift detection (adjust's specialty) + track_drift_trend_over_sessions = true, + flag_accelerating_drift = true, + }, + + evidence_sinks = [ + { kind = 'verisimdb, table = "contractile_executions", + schema = "contractile_execution_v1", + aux_tables = [ "adjust_drift_history" ] }, + { kind = 'drift_log, path = ".machine_readable/6a2/DRIFT.a2ml", + append_only = true }, + ], + + on_close = { + re_measure_all_tolerances = true, + diff_against_last_ratification = true, + emit_drift_entries_for_tolerance_exceeded = true, + surface_expired_variances = true, + surface_accelerating_drift = true, + # adjust is advisory — does NOT block session close. + block_session_close_on_any_drift = false, + }, + + on_open = { + render_summary = 'plain_language, + include_drift_log_from_last_close = true, + include_active_variances = true, + include_recent_anchors = true, + anchor_lookback_weeks = 8, + include_tolerance_trend_summary = true, + + negotiation = { + required = true, + ai_required_inputs = [ + 'timeline_realism, + 'industry_standards, + 'audience_feasibility, + 'resulting_invariants, + 'ecosystem_dependencies, + ], + user_engagement_required = true, + user_engagement_mode = 'per_input_response, + specification_translation = { + ai_produces_spec_form = true, + user_reviews_in_domain_language = true, + schema_authoring_is_ai_responsibility = true, + translation_faithfulness_auditable = true, + }, + }, + + accountability_pledge = { + required = true, + parties = [ + { + role = 'user, + pledge = "I have reviewed the tolerance bands and corrective actions. I accept accountability for reviewing drift warnings rather than muting them, and for re-tuning tolerances via amendment when the intended operating envelope changes.", + signature_required = true, + }, + { + role = 'ai_agent, + pledge = "I will surface tolerance breaches and accelerating-drift patterns at session close; I will propose corrective actions rather than widening tolerances silently; I will require amendment for legitimate tolerance re-tuning, not quiet band-widening.", + signature_required = true, + }, + ], + signed_record_destination = ".machine_readable/6a2/ratification-.a2ml", + must_precede_work = true, + }, + + ratification_record_shape = { + includes_negotiation_transcript = true, + includes_both_pledges = true, + includes_tolerance_bands_snapshot = true, + signed = true, + dated = true, + session_id = 'required, + contract_hash = 'required, + }, + }, + }, + + failure_mode_defenses = [ + 'A1_enthusiasm_capture, + 'C3_helpfulness_inflation, # helpful additions surfaced if they widen tolerances silently + 'C4_modernization_drift, + 'E2_cosmetic_churn, # adjust tracks cumulative churn + 'F2_context_window_erosion, # parameter drift across sessions detected + ], +} diff --git a/validate-action/.machine_readable/contractiles/adjust/adjust.manifest.a2ml b/validate-action/.machine_readable/contractiles/adjust/adjust.manifest.a2ml new file mode 100644 index 0000000..f28f94d --- /dev/null +++ b/validate-action/.machine_readable/contractiles/adjust/adjust.manifest.a2ml @@ -0,0 +1,47 @@ +# SPDX-License-Identifier: MPL-2.0 +# adjust.manifest.a2ml — Trident coherence manifest for the adjust verb. +# Author: Jonathan D.A. Jewell +# +# Fifth trident instance. First (Yard, advisory) authority pattern — +# complements the (Hunt, blocking) triple (must + trust + bust) and +# the (Hunt, reporting) north-star (intend). + +--- +trident_version = "1.0.0" +verb = "adjust" +semantics = "drift tolerances + corrective actions" +cardinality = "one per repo" +authority = "advisory (continue-with-warnings)" + +[[files]] +role = "declaration" +path = "Adjustfile.a2ml" +sha256 = "pending-first-verify" +size_bytes = "pending-first-verify" + +[[files]] +role = "runner" +path = "adjust.ncl" +sha256 = "pending-first-verify" +size_bytes = "pending-first-verify" + +[[files]] +role = "k9_component" +path = "adjust.k9.ncl" +sha256 = "pending-first-verify" +size_bytes = "pending-first-verify" + +[cross_refs] +runner_paired_xfile = "Adjustfile.a2ml" +k9_paired_xfile = "../adjust/Adjustfile.a2ml" +k9_paired_runner = "../adjust/adjust.ncl" + +[signed_by] +user = "Jonathan D.A. Jewell" +date = "2026-04-18" +context = "adjust trident — fifth Trident instance. First (Yard, advisory) authority pattern. Specialises in cumulative-drift catchment — tolerance bands + trend tracking + auto-fix-where-declared." + +[[history]] +date = "2026-04-18" +event = "trident-born" +note = "Adjustfile.a2ml and adjust.ncl pre-existed. This manifest + adjust.k9.ncl complete the trident. Exercises the Yard tier + advisory authority for the first time; on_exceeded = 'warn_and_attempt_fix rather than 'fail. adjust-specific track_drift_trend_over_sessions + flag_accelerating_drift." diff --git a/validate-action/.machine_readable/contractiles/adjust/adjust.ncl b/validate-action/.machine_readable/contractiles/adjust/adjust.ncl new file mode 100644 index 0000000..d6c24f0 --- /dev/null +++ b/validate-action/.machine_readable/contractiles/adjust/adjust.ncl @@ -0,0 +1,62 @@ +# SPDX-License-Identifier: MPL-2.0 +# Adjust — accessibility runner +# +# Pairs with: Adjustfile.a2ml (same directory) +# Verb: adjust +# Semantics: accessibility compliance (WCAG 2.1 AA baseline). Gating where +# a deterministic fix exists; advisory where human review needed. +# CLI: `contractile adjust check` → run all probes, list violations +# `contractile adjust fix` → apply deterministic fixes where defined +# +# Anything else in this directory is human-only notes/archive; machines ignore. +# +# Base: ../_base.ncl provides pedigree_schema, run_defaults, probe_schema. +# See: docs/CONTRACTILE-SPEC.adoc + +let base = import "../_base.ncl" in + +{ + pedigree = base.pedigree_schema & { + contractile_verb = "adjust", + semantics = "accessibility compliance", + security = { + leash = 'Kennel, + trust_level = "fixes allowed where deterministic", + allow_network = false, + allow_filesystem_write = true, # `adjust fix` may write (deterministic patches only) + allow_subprocess = true, + }, + metadata = { + name = "adjust-runner", + version = "1.0.0", + description = "Evaluates accessibility requirements from Adjustfile.a2ml. Fixes deterministic items; flags the rest for human review.", + paired_xfile = "Adjustfile.a2ml", + author = "Jonathan D.A. Jewell ", + }, + }, + + schema = { + requirements + | Array { + id | String, + description | String, + # TODO: migrate to base.probe_schema (structured probe) when CLI supports it + probe | String, + # status_core values: 'declared, 'verified, 'failing; adjust adds 'partial + status | [| 'declared, 'partial, 'verified, 'failing |] | default = 'declared, + compliance | String | optional, # e.g. "WCAG 2.1 AA" + notes | String | optional, + fix | String | optional, # deterministic fix command (optional) + }, + }, + + # Runner behaviour — inherits from base.run_defaults. + # adjust is advisory (continue-with-warnings) not a hard gate. + # auto_fix_when_available is adjust-specific. + run = base.run_defaults & { + on_any_fail = "continue-with-warnings", # accessibility is progress-tracked, not a hard gate by default + report_format = "a2ml", + emit_summary = true, + auto_fix_when_available = true, + }, +} diff --git a/validate-action/.machine_readable/contractiles/bust/Bustfile.a2ml b/validate-action/.machine_readable/contractiles/bust/Bustfile.a2ml new file mode 100644 index 0000000..5dd3840 --- /dev/null +++ b/validate-action/.machine_readable/contractiles/bust/Bustfile.a2ml @@ -0,0 +1,46 @@ +# SPDX-License-Identifier: MPL-2.0 +# Bustfile — failure mode contractile (seed skeleton) +# Author: Jonathan D.A. Jewell +# +# Paired runner: bust.ncl +# Verb: bust +# Semantics: Every declared failure mode must have a working recovery path +# that has been exercised. Status moves: +# declared → drilled (probe run) → verified (recovery confirmed) +# or → failing (recovery broken) +# +# CLI: +# contractile bust check → list failure modes + recovery status +# contractile bust drill → inject failures, verify recovery paths +# +# ADOPTER INSTRUCTIONS: This is a seed skeleton. Replace the example failure +# modes below with the real failure modes for your project. Add one entry per +# distinct failure class you want to track and verify. Delete entries that do +# not apply. The goal is a machine-checkable map of "what can break → how we +# recover" for this specific repository. + +@abstract: +Seed Bustfile for the standards contractile template set. Lists two example +failure modes (network loss, disk full) to illustrate the shape. Adopters +should replace these with project-specific failure modes and recovery paths. +@end + +## Failure Modes + +### network-unavailable +- class: network +- description: External network becomes unavailable during a contractile probe or CI step +- injection_probe: "unshare -n true" +- recovery_probe: "ping -c 1 -W 1 127.0.0.1" +- expected_recovery_time_seconds: 5 +- status: declared +- notes: Illustrative — replace with the real network-dependent step that needs resilience + +### disk-full +- class: disk_full +- description: Disk fills to 100% during a write-heavy operation (build artefacts, test DB writes) +- injection_probe: "dd if=/dev/zero of=/tmp/bustfile-fill-test bs=1M count=1 && rm /tmp/bustfile-fill-test" +- recovery_probe: "df -h / | awk 'NR==2 { gsub(/%/,\"\"); if ($5 < 95) exit 0; else exit 1 }'" +- expected_recovery_time_seconds: 30 +- status: declared +- notes: Illustrative — replace with the real disk-intensive operation and its recovery path diff --git a/validate-action/.machine_readable/contractiles/bust/bust.k9.ncl b/validate-action/.machine_readable/contractiles/bust/bust.k9.ncl new file mode 100644 index 0000000..c60a0ae --- /dev/null +++ b/validate-action/.machine_readable/contractiles/bust/bust.k9.ncl @@ -0,0 +1,160 @@ +# SPDX-License-Identifier: MPL-2.0 +# bust.k9.ncl — K9 trust-tier component of the bust trident +# Author: Jonathan D.A. Jewell +# +# Pairs with: Bustfile.a2ml (declaration) + bust.ncl (runner). +# +# Verb: bust (hard-stop / expiry / "must-not-run") +# Tier: Hunt-read-only (subprocess probes for expiry/state checks) +# Authority: blocking (HARD GATE on declared broken states) +# +# bust is the "this is broken, this has expired, this must not run" +# declarative surface. Where must asserts invariants that must hold, +# bust asserts failure states that must not be re-entered. Complement +# to must: together they bound the "acceptable operating state" from +# above (must) and below (bust). +# +# Cardinality: ONE bust trident per repo. +# +# Failure-mode focus: bust catches deprecated-path-still-called +# patterns (C2 capability collapse attempts where an AI reintroduces +# retired code), expiry-exceeded state (certificates / tokens / grants +# past their expiry), and the "it works, ship it" pattern where a +# caller silently starts using a must-not-run API. + +let base_k9 = import "../k9/template-hunt.k9.ncl" in +let base = import "../_base.ncl" in + +{ + pedigree = base_k9.pedigree_schema & { + contractile_verb = "bust", + paired_xfile = "../bust/Bustfile.a2ml", + paired_runner = "../bust/bust.ncl", + + tier = 'Hunt, + authority = 'blocking, + + metadata = { + name = "bust-k9", + version = "1.0.0", + description = "Hard-stop / expiry / must-not-run gate. Fourth trident instance. Completes the blocking-authority triple (must + trust + bust).", + paired_xfile = "Bustfile.a2ml", + paired_runner = "bust.ncl", + author = "Jonathan D.A. Jewell ", + }, + + security = { + leash = 'Hunt, + trust_level = "read-only expiry + state-check with subprocess", + allow_network = false, + allow_filesystem_write = false, + allow_subprocess = true, + probe_scope = 'read_only, + }, + }, + + variance_schema = { + entry_id | String, + reason | String, + approved_by | String, + scope | String, + expires | String, + review_notes | String | optional, + severity_acknowledged | [| 'critical, 'high, 'medium |], + waived_consequence_description | String, + }, + + execution = { + triggers = [ 'session_close, 'on_demand, 'pre_push, 'pre_merge ], + + per_hard_stop = { + run_probe = true, + record_outcome = true, + respect_variance = true, + on_triggered = 'fail, # BLOCKING — bust condition hit = block + severity_escalation = 'honour, + # bust-specific: detect re-introduction of deprecated calls + flag_deprecated_reintroduction = true, + }, + + evidence_sinks = [ + { kind = 'verisimdb, table = "contractile_executions", + schema = "contractile_execution_v1", + aux_tables = [ "bust_triggers_history" ] }, + { kind = 'drift_log, path = ".machine_readable/6a2/DRIFT.a2ml", + append_only = true }, + ], + + on_close = { + re_execute_all_hard_stops = true, + diff_against_last_ratification = true, + emit_drift_entries_for_new_triggers = true, + surface_expired_variances = true, + block_session_close_on_critical_bust = true, + }, + + on_open = { + render_summary = 'plain_language, + include_drift_log_from_last_close = true, + include_active_variances = true, + include_recent_anchors = true, + anchor_lookback_weeks = 8, + include_silent_regressions = true, + + negotiation = { + required = true, + ai_required_inputs = [ + 'timeline_realism, + 'industry_standards, + 'audience_feasibility, + 'resulting_invariants, + 'ecosystem_dependencies, + ], + user_engagement_required = true, + user_engagement_mode = 'per_input_response, + specification_translation = { + ai_produces_spec_form = true, + user_reviews_in_domain_language = true, + schema_authoring_is_ai_responsibility = true, + translation_faithfulness_auditable = true, + }, + }, + + accountability_pledge = { + required = true, + parties = [ + { + role = 'user, + pledge = "I have reviewed the declared hard-stop / expiry / must-not-run conditions. I accept accountability for not calling into must-not-run code paths, not ignoring expired tokens/grants, and not silently reintroducing deprecated patterns. I will raise a variance with severity acknowledgement if an exception is needed.", + signature_required = true, + }, + { + role = 'ai_agent, + pledge = "I will refuse suggestions that reintroduce must-not-run patterns; I will surface bust triggers at session close; I will require variance-with-severity for any legitimate reintroduction of a deprecated path rather than silently allowing it.", + signature_required = true, + }, + ], + signed_record_destination = ".machine_readable/6a2/ratification-.a2ml", + must_precede_work = true, + }, + + ratification_record_shape = { + includes_negotiation_transcript = true, + includes_both_pledges = true, + signed = true, + dated = true, + session_id = 'required, + contract_hash = 'required, + }, + }, + }, + + failure_mode_defenses = [ + 'A1_enthusiasm_capture, + 'C2_capability_collapse, # prevents reintroduction of retired capability + 'C4_modernization_drift, # bust prevents silent re-adoption of deprecated libs + 'D4_error_hiding, + 'E1_refactor_stampede, # refactor that reintroduces deprecated path caught + 'F1_across_session_forgetting, # bust triggers persist across sessions + ], +} diff --git a/validate-action/.machine_readable/contractiles/bust/bust.manifest.a2ml b/validate-action/.machine_readable/contractiles/bust/bust.manifest.a2ml new file mode 100644 index 0000000..2237041 --- /dev/null +++ b/validate-action/.machine_readable/contractiles/bust/bust.manifest.a2ml @@ -0,0 +1,48 @@ +# SPDX-License-Identifier: MPL-2.0 +# bust.manifest.a2ml — Trident coherence manifest for the bust verb. +# Author: Jonathan D.A. Jewell +# +# Fourth trident instance. Completes the blocking-authority triple: +# must (persistent invariants), trust (ephemeral transactions), +# bust (hard-stop / expiry / must-not-run). Between them, every +# release-blocking contractile concern is covered. + +--- +trident_version = "1.0.0" +verb = "bust" +semantics = "hard-stop / expiry / must-not-run declarations" +cardinality = "one per repo" +authority = "blocking (hard gate)" + +[[files]] +role = "declaration" +path = "Bustfile.a2ml" +sha256 = "pending-first-verify" +size_bytes = "pending-first-verify" + +[[files]] +role = "runner" +path = "bust.ncl" +sha256 = "pending-first-verify" +size_bytes = "pending-first-verify" + +[[files]] +role = "k9_component" +path = "bust.k9.ncl" +sha256 = "pending-first-verify" +size_bytes = "pending-first-verify" + +[cross_refs] +runner_paired_xfile = "Bustfile.a2ml" +k9_paired_xfile = "../bust/Bustfile.a2ml" +k9_paired_runner = "../bust/bust.ncl" + +[signed_by] +user = "Jonathan D.A. Jewell" +date = "2026-04-18" +context = "bust trident — fourth Trident instance. Completes the blocking-authority triple (must + trust + bust). Specialises in deprecated-path-reintroduction catchment." + +[[history]] +date = "2026-04-18" +event = "trident-born" +note = "Bustfile.a2ml and bust.ncl pre-existed. This manifest + bust.k9.ncl complete the trident. Inherits the full negotiation+accountability schema from intend.k9.ncl v2.0.0 + trust/must extensions; adds flag_deprecated_reintroduction for C2-defense specificity." diff --git a/validate-action/.machine_readable/contractiles/bust/bust.ncl b/validate-action/.machine_readable/contractiles/bust/bust.ncl new file mode 100644 index 0000000..fc8cb8c --- /dev/null +++ b/validate-action/.machine_readable/contractiles/bust/bust.ncl @@ -0,0 +1,66 @@ +# SPDX-License-Identifier: MPL-2.0 +# Bust — error-handling / failure-recovery runner +# +# Pairs with: Bustfile.a2ml (same directory) +# Verb: bust +# Semantics: every declared failure mode must have a recovery path that has +# been exercised. Runner injects failures (via declared probes) +# and verifies the recovery path works. Hard gate on any +# failure-mode with missing or broken recovery. +# CLI: `contractile bust check` → list failure modes + recovery status +# `contractile bust drill` → inject declared failures, verify recovery +# +# Anything else in this directory is human-only notes/archive; machines ignore. +# +# Base: ../_base.ncl provides pedigree_schema, run_defaults, probe_schema. +# See: docs/CONTRACTILE-SPEC.adoc + +let base = import "../_base.ncl" in + +{ + pedigree = base.pedigree_schema & { + contractile_verb = "bust", + semantics = "error handling + failure recovery", + security = { + leash = 'Kennel, + trust_level = "controlled failure injection; scoped to system-under-test", + allow_network = false, + allow_filesystem_write = true, # drills may write transient state (tmp dirs, test DBs) + allow_subprocess = true, + injection_scope = "system-under-test-only", + }, + metadata = { + name = "bust-runner", + version = "1.0.0", + description = "Exercises declared failure modes and verifies recovery paths. Hard-gates on any failure mode without working recovery.", + paired_xfile = "Bustfile.a2ml", + author = "Jonathan D.A. Jewell ", + }, + }, + + schema = { + failure_modes + | Array { + id | String, + description | String, + class | [| 'network, 'disk_full, 'oom, 'timeout, 'partial_write, 'panic, 'crash, 'rollback, 'concurrency |], + # TODO: migrate to base.probe_schema (structured probe) when CLI supports it + injection_probe | String, # command that deterministically causes this failure + # TODO: migrate to base.probe_schema (structured probe) when CLI supports it + recovery_probe | String, # command that verifies recovery (exit 0 = recovered) + expected_recovery_time_seconds | Number | default = 30, + # status_core values: 'declared, 'verified, 'failing; bust adds 'drilled + status | [| 'declared, 'drilled, 'verified, 'failing |] | default = 'declared, + notes | String | optional, + }, + }, + + # Runner behaviour — inherits from base.run_defaults. + # bust adds record_recovery_times for performance tier feeding. + run = base.run_defaults & { + on_any_fail = "exit-nonzero", # missing or broken recovery blocks merge + report_format = "a2ml", + emit_summary = true, + record_recovery_times = true, # feeds the performance tier + }, +} diff --git a/validate-action/.machine_readable/contractiles/dust/Dustfile.a2ml b/validate-action/.machine_readable/contractiles/dust/Dustfile.a2ml new file mode 100644 index 0000000..f1563c3 --- /dev/null +++ b/validate-action/.machine_readable/contractiles/dust/Dustfile.a2ml @@ -0,0 +1,68 @@ +# SPDX-License-Identifier: MPL-2.0 +# Dustfile — Cleanup and hygiene contract for standards +# Author: Jonathan D.A. Jewell +# +# What should be cleaned up. Housekeeping, not blockers. +# Run with: dust status +# Roll back with: dust rollback + +@abstract: +Cleanup and hygiene items for the `standards` monorepo. These are maintenance +tasks — not blocking, but should be addressed. Destructive actions are +dry-run by default and gated behind --apply. +@end + +## Stale Files + +### no-stale-snapshots +- description: no dated STATUS/COMPLETION snapshot files in root +- run: test -z "$(ls *-STATUS-*.md *-COMPLETION-*.md 2>/dev/null)" +- severity: info + +### no-next-steps +- description: NEXT_STEPS.md is superseded by ROADMAP.adoc +- run: test ! -f NEXT_STEPS.md +- severity: info + +### no-ai-djot +- description: AI.djot is superseded by 0-AI-MANIFEST.a2ml +- run: test ! -f AI.djot +- severity: warning + +## Format Duplicates + +### no-duplicate-readme +- description: only one README format (.adoc canonical) +- run: test ! -f README.md || test ! -f README.adoc +- severity: warning + +### no-duplicate-licence-policy +- description: only one licence-policy doc (LICENCE-POLICY.adoc canonical) +- run: test ! -f docs/LICENSE-POLICY.md || test ! -f LICENCE-POLICY.adoc +- severity: warning +- notes: resolved 2026-06-04 — deleted the stale docs/LICENSE-POLICY.md (it wrongly asserted standards=AGPL); LICENCE-POLICY.adoc is the sole source of truth. Probe stands guard against reintroduction. + +## Licence Hygiene + +### no-scaffold-sentinel-leak +- description: no PLMP-/PMLP- scaffold sentinels survive as real SPDX values +- run: test -z "$(git ls-files | xargs grep -lE 'SPDX-License-Identifier:[[:space:]]*(PLMP|PMLP)-' 2>/dev/null)" +- severity: warning +- notes: A leak is a process bug — fix by re-running scaffold substitution, NOT by hand (policy A5). + +### no-doubled-or-later +- description: no doubled `-or-later-or-later` SPDX artifacts +- run: test -z "$(git ls-files | xargs grep -lE 'SPDX-License-Identifier:[^\n]*-or-later-or-later' 2>/dev/null)" +- severity: info + +## Build / Generated Artifacts + +### no-tracked-deno-cache +- description: no Deno cache tracked in git +- run: test -z "$(git ls-files '**/.deno/**' 2>/dev/null)" +- severity: warning + +### registry-not-stale +- description: REGISTRY.a2ml regenerated after spec changes (run: just registry) +- verification: re-run scripts/build-registry.sh and diff; non-empty diff means stale +- severity: info diff --git a/validate-action/.machine_readable/contractiles/dust/dust.k9.ncl b/validate-action/.machine_readable/contractiles/dust/dust.k9.ncl new file mode 100644 index 0000000..ef21668 --- /dev/null +++ b/validate-action/.machine_readable/contractiles/dust/dust.k9.ncl @@ -0,0 +1,171 @@ +# SPDX-License-Identifier: MPL-2.0 +# dust.k9.ncl — K9 trust-tier component of the dust trident +# Author: Jonathan D.A. Jewell +# +# Pairs with: Dustfile.a2ml (declaration) + dust.ncl (runner). +# +# Verb: dust (rollback / recovery / deprecation) +# Tier: Yard (audit + structural checks; destructive +# actions gated behind --apply flag + +# explicit per-item approval) +# Authority: advisory (continue-with-warnings) +# +# dust is the retirement + audit-trail verb. Rollback paths, deprecation +# markers, evidence-preservation semantics. Where bust declares +# "broken, don't run", dust declares "how to safely undo / retire / roll +# back". Complement to bust — bust marks the dead end, dust describes +# the exit ramp. +# +# Cardinality: ONE dust trident per repo. +# +# Failure-mode focus: dust is the audit-trail preservation verb — +# defends against E1 refactor stampede (check audit trail still +# intact) and against silent removal (anything removed must have a +# rollback path; anything retired must preserve the evidence of its +# previous existence). + +let base_k9 = import "../k9/template-hunt.k9.ncl" in +let base = import "../_base.ncl" in + +{ + pedigree = base_k9.pedigree_schema & { + contractile_verb = "dust", + paired_xfile = "../dust/Dustfile.a2ml", + paired_runner = "../dust/dust.ncl", + + tier = 'Yard, + authority = 'advisory, + + metadata = { + name = "dust-k9", + version = "1.0.0", + description = "Rollback + deprecation + audit-trail runner. Sixth trident instance — completes the full verb set.", + paired_xfile = "Dustfile.a2ml", + paired_runner = "dust.ncl", + author = "Jonathan D.A. Jewell ", + }, + + security = { + leash = 'Yard, + trust_level = "audit-trail verification + structural checks", + allow_network = false, + # dust is the verb that ACTUALLY wants filesystem write — to + # execute declared rollback/removal — but only behind explicit + # --apply flag + per-item approval. Default is dry-run. + allow_filesystem_write_conditional = true, + allow_subprocess = true, + destructive_action_gating = { + default_mode = 'dry_run, + requires_flag = "--apply", + requires_per_item_approval = true, + approval_mechanism = 'explicit_user_signature, + }, + }, + }, + + variance_schema = { + entry_id | String, + reason | String, + approved_by | String, + scope | String, + expires | String, + review_notes | String | optional, + rollback_path_preserved | Bool, # dust-specific: did the variance preserve rollback? + }, + + execution = { + triggers = [ 'session_close, 'on_demand ], + + per_retirement = { + verify_rollback_path_documented = true, + verify_audit_trail_preserved = true, + respect_variance = true, + on_rollback_path_missing = 'warn, # advisory, not block + on_audit_trail_broken = 'warn, # advisory, not block + # dust-specific: flag any retirement that has been requested but + # lacks proper rollback documentation + flag_unsafe_retirement = true, + }, + + evidence_sinks = [ + { kind = 'verisimdb, table = "contractile_executions", + schema = "contractile_execution_v1", + aux_tables = [ "dust_retirement_history" ] }, + { kind = 'drift_log, path = ".machine_readable/6a2/DRIFT.a2ml", + append_only = true }, + ], + + on_close = { + re_verify_all_retirement_paths = true, + diff_against_last_ratification = true, + emit_drift_entries_for_missing_rollback = true, + emit_drift_entries_for_broken_audit_trail = true, + surface_expired_variances = true, + block_session_close_on_any_drift = false, # advisory + }, + + on_open = { + render_summary = 'plain_language, + include_drift_log_from_last_close = true, + include_active_variances = true, + include_recent_anchors = true, + anchor_lookback_weeks = 8, + + negotiation = { + required = true, + ai_required_inputs = [ + 'timeline_realism, + 'industry_standards, + 'audience_feasibility, + 'resulting_invariants, + 'ecosystem_dependencies, + ], + user_engagement_required = true, + user_engagement_mode = 'per_input_response, + specification_translation = { + ai_produces_spec_form = true, + user_reviews_in_domain_language = true, + schema_authoring_is_ai_responsibility = true, + translation_faithfulness_auditable = true, + }, + }, + + accountability_pledge = { + required = true, + parties = [ + { + role = 'user, + pledge = "I have reviewed the declared rollback paths and deprecation markers. I accept accountability for preserving audit trails when retiring code, and for ensuring every retired capability has a documented rollback path. I will not silently delete evidence of prior state.", + signature_required = true, + }, + { + role = 'ai_agent, + pledge = "I will verify audit-trail preservation in any retirement / rollback / deprecation I perform; I will refuse silent deletion of prior-state evidence; I will require rollback-path documentation before accepting a retirement request; I will operate in dry-run mode by default and require explicit --apply + per-item approval for destructive actions.", + signature_required = true, + }, + ], + signed_record_destination = ".machine_readable/6a2/ratification-.a2ml", + must_precede_work = true, + }, + + ratification_record_shape = { + includes_negotiation_transcript = true, + includes_both_pledges = true, + includes_retirement_schedule = true, + signed = true, + dated = true, + session_id = 'required, + contract_hash = 'required, + }, + }, + }, + + failure_mode_defenses = [ + 'A1_enthusiasm_capture, + 'C2_capability_collapse, # retirement without rollback path = capability collapse + 'D5_sycophancy, # AI won't agree to silent deletion + 'E1_refactor_stampede, # audit trail preservation check + 'E2_cosmetic_churn, + 'F1_across_session_forgetting, # retirement history tracked cross-session + ], +} diff --git a/validate-action/.machine_readable/contractiles/dust/dust.manifest.a2ml b/validate-action/.machine_readable/contractiles/dust/dust.manifest.a2ml new file mode 100644 index 0000000..1c1b769 --- /dev/null +++ b/validate-action/.machine_readable/contractiles/dust/dust.manifest.a2ml @@ -0,0 +1,51 @@ +# SPDX-License-Identifier: MPL-2.0 +# dust.manifest.a2ml — Trident coherence manifest for the dust verb. +# Author: Jonathan D.A. Jewell +# +# Sixth + final trident instance. Completes the full verb set — +# the estate now has tridents for every contractile verb. + +--- +trident_version = "1.0.0" +verb = "dust" +semantics = "rollback / recovery / deprecation / audit-trail preservation" +cardinality = "one per repo" +authority = "advisory (continue-with-warnings)" + +[[files]] +role = "declaration" +path = "Dustfile.a2ml" +sha256 = "pending-first-verify" +size_bytes = "pending-first-verify" + +[[files]] +role = "runner" +path = "dust.ncl" +sha256 = "pending-first-verify" +size_bytes = "pending-first-verify" + +[[files]] +role = "k9_component" +path = "dust.k9.ncl" +sha256 = "pending-first-verify" +size_bytes = "pending-first-verify" + +[cross_refs] +runner_paired_xfile = "Dustfile.a2ml" +k9_paired_xfile = "../dust/Dustfile.a2ml" +k9_paired_runner = "../dust/dust.ncl" + +[signed_by] +user = "Jonathan D.A. Jewell" +date = "2026-04-18" +context = "dust trident — sixth and final Trident instance. Completes the full verb set. Specialises in audit-trail preservation + rollback-path verification. Yard tier with destructive-action gating (dry-run default; --apply + per-item approval required for mutations)." + +[[history]] +date = "2026-04-18" +event = "trident-born" +note = "Dustfile.a2ml and dust.ncl pre-existed. This manifest + dust.k9.ncl complete the trident and the full verb set. All 6 verbs now on trident shape: intend (Hunt, reporting), trust (Hunt, blocking), must (Hunt-read-only, blocking), bust (Hunt-read-only, blocking), adjust (Yard, advisory), dust (Yard, advisory)." + +[[history]] +date = "2026-04-18" +event = "verb-set-complete" +note = "Full estate trident coverage. Blocking-authority triple (must/trust/bust) handles release-gating. Advisory pair (adjust/dust) handles drift-warning and audit-trail. Single reporting verb (intend) handles north-star. α two-axis surface fully exercised on all four (tier, authority) combinations used: (Hunt, reporting), (Hunt, blocking), (Hunt-read-only, blocking), (Yard, advisory). The contractile system is ready for the adversarial Gemini+Copilot drift pilot." diff --git a/validate-action/.machine_readable/contractiles/dust/dust.ncl b/validate-action/.machine_readable/contractiles/dust/dust.ncl new file mode 100644 index 0000000..36aa89b --- /dev/null +++ b/validate-action/.machine_readable/contractiles/dust/dust.ncl @@ -0,0 +1,66 @@ +# SPDX-License-Identifier: MPL-2.0 +# Dust — exnovation / code-removal runner +# +# Pairs with: Dustfile.a2ml (same directory) +# Verb: dust +# Semantics: exnovation. Identifies code, docs, files, dependencies that are +# candidates for REMOVAL. Advisory by default; can be flipped to +# active delete via `contractile dust sweep --apply`. +# CLI: `contractile dust find` → list removal candidates +# `contractile dust sweep` → dry-run removals +# `contractile dust sweep --apply` → actually delete (gated) +# +# Anything else in this directory is human-only notes/archive; machines ignore. +# +# Base: ../_base.ncl provides pedigree_schema, run_defaults, probe_schema. +# See: docs/CONTRACTILE-SPEC.adoc + +let base = import "../_base.ncl" in + +{ + pedigree = base.pedigree_schema & { + contractile_verb = "dust", + semantics = "exnovation / removal", + security = { + leash = 'Kennel, + trust_level = "proposes deletion; --apply required to execute", + allow_network = false, + allow_filesystem_write = true, # --apply mode writes (deletes) + allow_subprocess = true, + destructive_mode_requires_flag = "--apply", + }, + metadata = { + name = "dust-runner", + version = "1.0.0", + description = "Identifies and optionally removes exnovation targets listed in Dustfile.a2ml. Destructive mode gated behind --apply.", + paired_xfile = "Dustfile.a2ml", + author = "Jonathan D.A. Jewell ", + }, + }, + + schema = { + removal_candidates + | Array { + id | String, + description | String, + target | String, # file / path / symbol / dep name + reason | String, # why it's a removal candidate + # TODO: migrate to base.probe_schema (structured probe) when CLI supports it + probe | String | optional, # command that confirms it's still removable + # dust has a non-standard status progression (no 'verified): + # 'declared → 'proposed → 'approved → 'removed + status | [| 'declared, 'proposed, 'approved, 'removed |] | default = 'declared, + approver | String | optional, # who signed off (for 'approved / 'removed) + notes | String | optional, + }, + }, + + # Runner behaviour — inherits from base.run_defaults. + # dust is advisory; apply_requires_approval is dust-specific. + run = base.run_defaults & { + on_any_fail = "continue-with-warnings", + report_format = "a2ml", + emit_summary = true, + apply_requires_approval = true, # only 'approved items get swept, even with --apply + }, +} diff --git a/validate-action/.machine_readable/contractiles/intend/Intentfile.a2ml b/validate-action/.machine_readable/contractiles/intend/Intentfile.a2ml new file mode 100644 index 0000000..088cb23 --- /dev/null +++ b/validate-action/.machine_readable/contractiles/intend/Intentfile.a2ml @@ -0,0 +1,123 @@ +# SPDX-License-Identifier: MPL-2.0 +# Intentfile (A2ML Canonical) — north-star contractile +# Author: Jonathan D.A. Jewell +# +# Paired runner: intend.ncl +# Verb: intend +# Semantics: North-star contractile. Declares BOTH concrete committed +# next-actions AND horizon aspirations the project wishes to +# become. Two sections share one file because they answer +# the same question at different ranges: +# [[intents]] — "we WILL do this; track progress" +# status: declared → in_progress → done | +# deferred | retired +# [[wishes]] — "we WISH this were true; revisit later" +# status: declared → in_progress → achieved | +# abandoned +# grouped by horizon: near / mid / far. +# Non-gating — this is a report, not a gate. See the `must` +# contractile for hard gates. +# +# History: The `lust/` sibling contractile was deprecated 2026-04-18; +# its `[[wishes]]` semantics were absorbed here so the +# project's aspirational horizon and its committed +# next-actions live together in one north-star view. +# +# CLI: +# contractile intend run → print status table (both sections) +# contractile intend progress → diff declared-vs-observed for intents +# contractile intend horizon → group wishes by near/mid/far +# +# ADOPTER INSTRUCTIONS: Replace the example intents and wishes below with +# project-specific content. Each intent should have a probe command that +# returns exit 0 when the intent is done. Wishes are report-only and never +# run a probe. Omit either section if not applicable; don't delete the file. + +@abstract: +Seed Intentfile for the standards contractile template set. Demonstrates +both sections: concrete intents with probes and horizon-grouped wishes. +Adopters should replace these with real project commitments and aspirations. +@end + +## Purpose + +The standards contractile template set commits to the intents declared +below and points at the wishes on the horizon. The primary goal is to +keep the contractile system complete, documented, and machine-verifiable +so repos copying this template inherit a working operational framework. + +## Anti-Purpose + +This Intentfile is NOT: +- A feature roadmap (that belongs in the project ROADMAP.adoc) +- A hard gate (intend never blocks; see the `must` contractile for gates) + +## If In Doubt + +If you are unsure whether a change is in scope, ask. Sensitive areas: +ABI definitions, license headers, CI workflows. + +## Committed Next-Actions + +[[intents]] +id = "contractile-spec-written" +description = "CONTRACTILE-SPEC.adoc normative spec exists and is up-to-date" +probe = "test -f docs/CONTRACTILE-SPEC.adoc" +status = "done" +notes = "Spec written and committed 2026-04-17" + +[[intents]] +id = "base-ncl-extracted" +description = "_base.ncl shared contractile base extracted and all 6 active verb runners import it" +probe = "grep -l 'import.*_base.ncl' .machine_readable/contractiles/must/must.ncl .machine_readable/contractiles/trust/trust.ncl .machine_readable/contractiles/bust/bust.ncl .machine_readable/contractiles/adjust/adjust.ncl .machine_readable/contractiles/dust/dust.ncl .machine_readable/contractiles/intend/intend.ncl | wc -l | xargs test 6 -eq" +status = "done" +notes = "Base extracted and all runners refactored 2026-04-17; lust/ deprecated 2026-04-18, count reduced 7→6." + +[[intents]] +id = "index-registry-present" +description = "INDEX.a2ml registry listing all active verbs exists in the contractiles directory" +probe = "test -f .machine_readable/contractiles/INDEX.a2ml" +status = "done" +notes = "Registry created 2026-04-17" + +[[intents]] +id = "lust-dir-retired" +description = "Deprecated lust/ dir removed; wishes semantics absorbed into Intentfile" +probe = "! test -d .machine_readable/contractiles/lust" +status = "done" +notes = "Retired 2026-04-18 per user direction — name had negative associations; north-star meaning always belonged here." + +[[intents]] +id = "probe-schema-migration" +description = "All verb runner files migrate probe fields from String to structured probe_schema" +probe = "! grep -r 'probe | String' .machine_readable/contractiles/ --include='*.ncl'" +status = "declared" +notes = "DEFERRED — breaking change requiring CLI support. Legacy String probes kept with TODO comments. See CONTRACTILE-SPEC.adoc Migration Notes." +target_date = "2026-Q3" + +## Horizon Aspirations (wishes) + +# Wishes are non-probeable project horizons. They exist to make the +# aspiration axis visible without polluting the commitment queue. + +[[wishes]] +id = "example-near-wish" +description = "Describe one aspirational feature/property the project intends toward in the near term" +horizon = "near" +why = "Why this would matter; the value of it being true" +status = "declared" +notes = "Optional human notes; leave empty or delete" + +[[wishes]] +id = "example-mid-wish" +description = "Aspirational item on the one-to-two release horizon" +horizon = "mid" +why = "The impact of reaching it" +status = "declared" + +[[wishes]] +id = "example-far-wish" +description = "Multi-year horizon state" +horizon = "far" +why = "Why we still bother pointing at it" +status = "declared" diff --git a/validate-action/.machine_readable/contractiles/intend/intend.k9.ncl b/validate-action/.machine_readable/contractiles/intend/intend.k9.ncl new file mode 100644 index 0000000..5b0c295 --- /dev/null +++ b/validate-action/.machine_readable/contractiles/intend/intend.k9.ncl @@ -0,0 +1,250 @@ +# SPDX-License-Identifier: MPL-2.0 +# intend.k9.ncl — K9 trust-tier component of the intend trident +# Author: Jonathan D.A. Jewell +# +# Pairs with: Intentfile.a2ml (declaration) + intend.ncl (runner). +# Trident completeness is a hard precondition — a repo shipping +# Intentfile without this file AND its runner is an invalid trident; +# the contractile CLI's verify gate refuses partial publication. +# +# Verb: intend (north star — commitments + aspirations) +# Tier: Hunt (capability: subprocess probes may shell out) +# Authority: reporting (never blocks; drift-log only) +# +# Cardinality: ONE intend trident per repo (see feedback_contractile_ +# layout_rules.md). ANCHOR.a2ml is the sole multi-instance exception — +# it is NOT a verb contractile. +# +# Design commitments baked in (see memory trail 2026-04-18 for full +# context; key files referenced by name in annotations below): +# * α two-axis (tier × authority) — structurally separate capability +# from authority so "Hunt tier = can override" is impossible. +# * Variance schema first-class, not comment markers +# (feedback_audit_tool_suppression_design.md — structural > markers). +# * Sessional drift detection hooks (on_close, on_open). +# * Ratification at session open; drift log at session close. +# * Evidence sinks: VeriSimDB (queryable) + 6a2/DRIFT.a2ml (repo-local). +# * Failure-mode defenses cross-referenced to the AI failure catalog. + +let base_k9 = import "../k9/template-hunt.k9.ncl" in +let base = import "../_base.ncl" in + +{ + pedigree = base_k9.pedigree_schema & { + contractile_verb = "intend", + paired_xfile = "../intend/Intentfile.a2ml", + paired_runner = "../intend/intend.ncl", + + # α two-axis declaration — capability × authority. + # intend is Hunt-capable (probes shell out) but reporting-authority + # (never blocks). must/trust/bust will declare (Hunt, blocking); + # adjust/dust will declare (Yard, advisory). Splitting the axes + # means "I'm Hunt-tier so I can override everything" is structurally + # impossible — authority is a separate field. + tier = 'Hunt, + authority = 'reporting, + + metadata = { + name = "intend-k9", + version = "2.0.0", # 1.0.0 (2026-04-18 AM): initial trident. + # 2.0.0 (2026-04-18 PM): negotiation + + # accountability + plain-language-translation + # schema baked into on_open — prerequisite for + # the adversarial Gemini+Copilot drift pilot. + description = "Executes Intentfile probes + emits drift log. Non-gating; reporting authority only. on_open hook implements negotiation-ratification-accountability protocol.", + paired_xfile = "Intentfile.a2ml", + paired_runner = "intend.ncl", + author = "Jonathan D.A. Jewell ", + }, + + security = { + leash = 'Hunt, + trust_level = "subprocess + filesystem-read", + allow_network = false, + allow_filesystem_write = false, # evidence sinks are indirected + allow_subprocess = true, + }, + }, + + # ------------------------------------------------------------------- + # Variance schema — P-shape scoped exceptions per entry. + # A variance suppresses a specific intent's or wish's obligation for a + # reason, with approver + expiry. Expired variance = effective + # re-imposition of the obligation. Unmet intent without a variance = + # drift, logged to the drift log. + # Per user 2026-04-18: variances are structural, not magic-comment + # markers — markers are gameable. + # ------------------------------------------------------------------- + variance_schema = { + entry_id | String, # which intent/wish id the variance applies to + reason | String, + approved_by | String, + scope | String, # path glob | session-id | "until-" + expires | String, # absolute date or condition + review_notes | String | optional, + }, + + # ------------------------------------------------------------------- + # Execution policy + # ------------------------------------------------------------------- + execution = { + # When the component runs. + # session_close is mandatory (the "picked up sessionally" check). + triggers = [ 'session_close, 'on_demand, 'pre_push ], + + # Per-intent execution. + per_intent = { + run_probe = true, + record_outcome = true, + respect_variance = true, # active variance suppresses failure + on_unmet = 'log_drift, # never 'fail — authority = reporting + }, + + # Per-wish execution (wishes are non-probeable; horizon-group only). + per_wish = { + run_probe = false, + emit_horizon_summary = true, + # Vertical alignment soft-check per user_6a2_is_contractile_ought.md: + # highest-level alignment is meta ↔ north-star (soft), not hard gate. + check_alignment_with_META = true, + }, + + # Evidence sinks — BOTH written, every execution. + # VeriSimDB = queryable machine record (feedback_verisimdb_policy.md). + # 6a2/DRIFT.a2ml = repo-local append-only drift log (feedback_sessional_ + # drift_detection.md + user_6a2_is_contractile_ought.md descriptive role). + evidence_sinks = [ + { + kind = 'verisimdb, + table = "contractile_executions", + schema = "contractile_execution_v1", + }, + { + kind = 'drift_log, + path = ".machine_readable/6a2/DRIFT.a2ml", + append_only = true, + }, + ], + + # Session-close hook — the "picked up sessionally" requirement. + # Re-execute, diff against the last ratification, surface expired + # variances, emit drift entries for new failures. + on_close = { + re_execute_all_intents = true, + diff_against_last_ratification = true, + emit_drift_entries_for_new_failures = true, + surface_expired_variances = true, + }, + + # ----------------------------------------------------------------- + # Session-open hook — NEGOTIATION + RATIFICATION + ACCOUNTABILITY + # (user_contract_negotiation_and_accountability_pledge.md) + # (user_contractiles_agreed_at_session_start.md) + # + # Ratification is not passive acknowledgement; it is negotiation + # ending in an explicit accountability pledge from BOTH parties. + # Work cannot proceed before both pledges are on file. + # ----------------------------------------------------------------- + on_open = { + # --- Context presentation (pre-negotiation) --- + render_summary = 'plain_language, # metaphor-capture defense + include_drift_log_from_last_close = true, + include_active_variances = true, + include_recent_anchors = true, + anchor_lookback_weeks = 8, + + # --- Negotiation phase (five mandatory inputs) --- + # AI must surface all five before the user is asked to ratify. + # "Yes, and …" — not "yes". Missing any of the five = the + # negotiation is incomplete and work cannot proceed. + negotiation = { + required = true, # blank-cheque ratification refused + + # The five inputs the AI must contribute to the negotiation. + # Each is a structured field the agent is required to populate, + # not optional prose. See user_contract_negotiation_and_ + # accountability_pledge.md for the domain-language-rendering rule. + ai_required_inputs = [ + 'timeline_realism, # "this will take X; not Y" + 'industry_standards, # WCAG, ISO, OWASP, GDPR, licensing … + 'audience_feasibility, # real addressable user set + 'resulting_invariants, # what must/trust/adjust entries follow + 'ecosystem_dependencies, # libs, licences, threat-model implications + ], + + # User must actually engage with each input — not + # auto-approve. If user tries to skip ("just do it, I trust you") + # the system re-renders the obligations and requires the pledge. + user_engagement_required = true, + user_engagement_mode = 'per_input_response, + + # The AI does the specification-form work. The user reviews the + # rendering in domain language and accepts / amends / pushes back. + # User never has to author Nickel schemas or decide on type + # specificity — that is the AI's translation responsibility, + # with auditable faithfulness. + specification_translation = { + ai_produces_spec_form = true, + user_reviews_in_domain_language = true, + schema_authoring_is_ai_responsibility = true, + translation_faithfulness_auditable = true, + # Failure mode this closes: user is forced to learn spec-theory + # (type refinement, Nickel contract grammar) to ratify a contract + # — which drives users away from ratification entirely. + }, + }, + + # --- Accountability pledge (both parties, explicit) --- + # Not "I read it" — "I am answerable for this obligation". + # Both pledges are required before work proceeds; both are recorded. + accountability_pledge = { + required = true, + parties = [ + { + role = 'user, + pledge = "I have reviewed the obligations as negotiated; I accept accountability for meeting the declared invariants and for the audience/timeline/standards consequences surfaced in negotiation.", + signature_required = true, + }, + { + role = 'ai_agent, + pledge = "I will hold the user to the obligations as negotiated, including by surfacing drift at session close and refusing off-contract actions, even when the user is enthusiastic about them. If the user wishes to depart from the contract, I will require a variance or amendment, not silent acceptance.", + signature_required = true, + # Per user_contractile_is_contract_do_not_break.md — + # the AI is the holder of the line against enthusiasm drift. + }, + ], + signed_record_destination = ".machine_readable/6a2/ratification-.a2ml", + must_precede_work = true, + }, + + # --- Policy: ratification output --- + # The ratification record IS the negotiation transcript + the + # accountability pledge combined. One document; future-session + # ground-truth for "what was agreed, who is accountable". + ratification_record_shape = { + includes_negotiation_transcript = true, + includes_both_pledges = true, + signed = true, + dated = true, + session_id = 'required, + contract_hash = 'required, # pins what was actually signed + }, + }, + }, + + # ------------------------------------------------------------------- + # Failure-mode defenses — explicit cross-reference to the catalog + # (feedback_ai_failure_mode_catalog.md). New catalog entries that + # shift this verb's defenses must update this list, not narrative. + # ------------------------------------------------------------------- + failure_mode_defenses = [ + 'A1_enthusiasm_capture, # scope breach → drift log + 'A2_metaphor_capture, # render_summary = 'plain_language + 'A3_allegory_drift, # intents cite concrete obligations + 'C1_scope_creep, # feature-adjacent change needs intent_id + 'C3_helpfulness_inflation, # changes without intent_id flagged + 'C4_modernization_drift, # upgrade cannot cite intent → drift + 'D5_sycophancy, # ratification compares user framing vs contract + 'F1_across_session_forgetting, # on_open reads last-ratification record + ], +} diff --git a/validate-action/.machine_readable/contractiles/intend/intend.manifest.a2ml b/validate-action/.machine_readable/contractiles/intend/intend.manifest.a2ml new file mode 100644 index 0000000..5d932a6 --- /dev/null +++ b/validate-action/.machine_readable/contractiles/intend/intend.manifest.a2ml @@ -0,0 +1,73 @@ +# SPDX-License-Identifier: MPL-2.0 +# intend.manifest.a2ml — Trident coherence manifest for the intend verb. +# Author: Jonathan D.A. Jewell +# +# Asserts: exactly three files constitute the intend trident; their +# content-hashes are pinned here; cross-references round-trip; no +# partial publication is permitted. +# +# The contractile CLI's `verify ` subcommand MUST: +# 1. Confirm all three listed files exist at the declared paths. +# 2. Compute each file's sha256 and match against the pinned value. +# 3. Follow each cross-reference and confirm the target file's +# reciprocal field points back. +# 4. Refuse the dir (exit non-zero) if any of 1–3 fails. +# +# This forecloses the failure mode where an agent publishes an A2ML +# declaration with no paired runner or K9 component — the trident is +# atomically complete or it is invalid. + +--- +trident_version = "1.0.0" +verb = "intend" +semantics = "north-star (commitments + aspirations)" +cardinality = "one per repo" + +## Files (three; exactly) + +[[files]] +role = "declaration" +path = "Intentfile.a2ml" +sha256 = "pending-first-verify" # populated on first `contractile verify intend` +size_bytes = "pending-first-verify" + +[[files]] +role = "runner" +path = "intend.ncl" +sha256 = "pending-first-verify" +size_bytes = "pending-first-verify" + +[[files]] +role = "k9_component" +path = "intend.k9.ncl" +sha256 = "pending-first-verify" +size_bytes = "pending-first-verify" + +## Cross-references (must round-trip) + +[cross_refs] +# Each runner/K9 component names its paired files; the CLI follows the +# links and asserts reciprocity. Any dangling or mismatched reference +# fails the verify gate. +runner_paired_xfile = "Intentfile.a2ml" +k9_paired_xfile = "../intend/Intentfile.a2ml" +k9_paired_runner = "../intend/intend.ncl" + +## Trident signing + +[signed_by] +user = "Jonathan D.A. Jewell" +date = "2026-04-18" +context = "intend trident pilot — first Trident instance in the estate; template for the remaining 5 verbs (must/trust/bust/adjust/dust) and for the 14 template-copy dirs." + +## Change log + +[[history]] +date = "2026-04-18" +event = "trident-born" +note = "intend/Intentfile.a2ml pre-existed (f380b62, lust absorption). This manifest + intend.k9.ncl complete the trident for the first time." + +[[history]] +date = "2026-04-18" +event = "negotiation-accountability-schema-landed" +note = "intend.k9.ncl on_open hook extended: five negotiation inputs (timeline/standards/audience/invariants/dependencies), both-parties accountability pledge, plain-language-translation policy (AI authors spec form, user reviews in domain language). K9 metadata version bumped 1.0.0 → 2.0.0. Prerequisite for the adversarial Gemini+Copilot drift pilot; intend is the hardest verb (abstract north-star) so baking the full protocol here first means simpler verbs (trust, must) can inherit the template." diff --git a/validate-action/.machine_readable/contractiles/intend/intend.ncl b/validate-action/.machine_readable/contractiles/intend/intend.ncl new file mode 100644 index 0000000..091b7f6 --- /dev/null +++ b/validate-action/.machine_readable/contractiles/intend/intend.ncl @@ -0,0 +1,81 @@ +# SPDX-License-Identifier: MPL-2.0 +# Intend — north-star runner (verb is `intend`, file is `Intentfile.a2ml`) +# +# Pairs with: Intentfile.a2ml (same directory) +# Verb: intend +# Semantics: Declares BOTH concrete committed next-actions ([[intents]]) and +# horizon aspirations ([[wishes]]). Not a gate — reports progress +# toward declared intents and lists wishes by horizon. +# Status progressions: +# intents: 'declared → 'in_progress → 'done | 'deferred | 'retired +# wishes: 'declared → 'in_progress → 'achieved | 'abandoned +# CLI: `contractile intend run` → print status table (both sections) +# `contractile intend progress` → diff declared-vs-observed (intents) +# `contractile intend horizon` → group wishes by near/mid/far +# +# History: Absorbed the deprecated `lust` contractile's [[wishes]] schema +# 2026-04-18. `lust/` dir removed estate-wide. +# +# Anything else in this directory is human-only notes/archive; machines ignore. +# +# Base: ../_base.ncl provides pedigree_schema, run_defaults, probe_schema. +# See: docs/CONTRACTILE-SPEC.adoc + +let base = import "../_base.ncl" in + +{ + pedigree = base.pedigree_schema & { + contractile_verb = "intend", + semantics = "north-star (commitments + aspirations)", + security = { + leash = 'Kennel, + trust_level = "read-only reporting", + allow_network = false, + allow_filesystem_write = false, + allow_subprocess = true, # probe commands may shell out (intents only; wishes never probe) + }, + metadata = { + name = "intend-runner", + version = "2.0.0", + description = "Reports progress toward committed next-actions and lists horizon aspirations. Non-gating. Absorbed `lust` semantics 2026-04-18.", + paired_xfile = "Intentfile.a2ml", + author = "Jonathan D.A. Jewell ", + }, + }, + + schema = { + intents + | Array { + id | String, + description | String, + # TODO: migrate to base.probe_schema (structured probe) when CLI supports it + probe | String | optional, # shell command that indicates done-ness + status | [| 'declared, 'in_progress, 'done, 'deferred, 'retired |] | default = 'declared, + notes | String | optional, + target_date | String | optional, + }, + wishes + | Array { + id | String, + description | String, + horizon | [| 'near, 'mid, 'far |] | default = 'mid, + why | String | optional, + status | [| 'declared, 'in_progress, 'achieved, 'abandoned |] | default = 'declared, + notes | String | optional, + } + | optional, + }, + + # Runner behaviour — inherits from base.run_defaults. + # intend never blocks; it is a report only. + # emit_diff is intent-specific (declared vs observed probes). + # emit_grouped_by_horizon renders wishes grouped by near/mid/far. + run = base.run_defaults & { + on_pass = "continue", + on_any_fail = "continue", # never blocks; it's a report + report_format = "a2ml", + emit_summary = true, + emit_diff = true, # declared vs observed (intents) + emit_grouped_by_horizon = true, # wishes grouped by horizon (absorbed from lust) + }, +} diff --git a/validate-action/.machine_readable/contractiles/must/Mustfile.a2ml b/validate-action/.machine_readable/contractiles/must/Mustfile.a2ml new file mode 100644 index 0000000..7a393dc --- /dev/null +++ b/validate-action/.machine_readable/contractiles/must/Mustfile.a2ml @@ -0,0 +1,110 @@ +# SPDX-License-Identifier: MPL-2.0 +# Mustfile — Physical state contract for standards +# Author: Jonathan D.A. Jewell +# +# What MUST be true about this repository. Hard requirements. +# Run with: must check +# Fix with: must fix (where a deterministic fix exists) + +@abstract: +Physical-state invariants for the hyperpolymath `standards` monorepo (specs, +machine-readable artefacts, contractiles, registry). These are hard +requirements — CI and pre-commit hooks fail if any check fails. +@end + +## File Presence + +### license-present +- description: LICENSE file must exist +- run: test -f LICENSE +- severity: critical + +### licence-policy-present +- description: LICENCE-POLICY.adoc (canonical licence policy) must exist +- run: test -f LICENCE-POLICY.adoc +- severity: critical + +### readme-present +- description: README.adoc must exist +- run: test -f README.adoc +- severity: critical + +### security-policy +- description: SECURITY.md must exist +- run: test -f SECURITY.md +- severity: critical + +### ai-manifest +- description: 0-AI-MANIFEST.a2ml must exist +- run: test -f 0-AI-MANIFEST.a2ml +- severity: critical + +### machine-readable-dir +- description: .machine_readable/ directory must exist +- run: test -d .machine_readable +- severity: critical + +### licensing-policy-machine-readable +- description: machine-readable licensing policy must exist +- run: test -f .machine_readable/licensing-policy.toml +- severity: critical + +## Licensing (owner ruling 2026-06-04) + +### code-spdx-mpl +- description: code/config/scripts carry SPDX-License-Identifier MPL-2.0 +- run: head -8 Justfile | grep -q 'SPDX-License-Identifier: MPL-2.0' +- severity: critical +- notes: Full-tree enforcement is the spdx-policy-guard; this is a canary. + +### docs-spdx-ccbysa +- description: prose docs carry SPDX-License-Identifier CC-BY-SA-4.0 +- run: head -8 README.adoc | grep -q 'SPDX-License-Identifier: MPL-2.0' +- severity: critical +- notes: Canary for the docs=CC-BY-SA-4.0 rule. + +### licenses-texts-present +- description: LICENSES/ carries the canonical text for every SPDX id in use +- run: test -f LICENSES/MPL-2.0.txt && test -f LICENSES/CC-BY-SA-4.0.txt +- severity: critical + +### no-pmpl-outside-carveout +- description: PMPL appears in no standards-authored header (carve-out = 3 repos only) +- run: test -z "$(git ls-files ':!:consent-aware-http/**' ':!:*palimpsest*' ':!:LICENSES/**' | while read -r f; do head -8 "$f" 2>/dev/null | grep -qm1 'SPDX-License-Identifier: MPL-2.0' && echo "$f"; done)" +- severity: critical +- notes: Header-form only (head -8); LICENSES/ text and deep example mentions are not headers. + +### policy-no-contradiction +- description: LICENCE-POLICY.adoc and licensing-policy.toml agree (both name CC-BY-SA-4.0) +- run: grep -q 'CC-BY-SA-4.0' LICENCE-POLICY.adoc && grep -q 'CC-BY-SA-4.0' .machine_readable/licensing-policy.toml +- severity: critical + +## Structure + +### no-loose-contractile-in-root +- description: no .contractile files loose in repo root — they live in .machine_readable/ +- run: test -z "$(ls *.contractile 2>/dev/null)" +- severity: warning + +### registry-machine-readable +- description: REGISTRY.a2ml lives under .machine_readable/ (generated index) +- run: test -f .machine_readable/REGISTRY.a2ml +- severity: warning + +## CI / Workflow Hardening + +### actions-sha-pinned +- description: every GitHub Action is pinned to a 40-char commit SHA +- run: ! grep -rEn 'uses:[[:space:]]+[^@]+@(v?[0-9.]+|main|master)([[:space:]]|$)' .github/workflows/ 2>/dev/null +- severity: critical + +### jobs-have-timeout +- description: every non-reusable-caller job declares timeout-minutes +- verification: governance check — reusable-workflow caller jobs (uses: ./...) are exempt +- severity: high +- notes: Reusable callers cannot carry timeout-minutes; the timeout lives in the reusable. + +### registry-generated-not-hand-edited +- description: REGISTRY.a2ml is regenerated via scripts/build-registry.sh, never hand-edited +- run: test -f scripts/build-registry.sh +- severity: high diff --git a/validate-action/.machine_readable/contractiles/must/must.k9.ncl b/validate-action/.machine_readable/contractiles/must/must.k9.ncl new file mode 100644 index 0000000..6bb51fc --- /dev/null +++ b/validate-action/.machine_readable/contractiles/must/must.k9.ncl @@ -0,0 +1,236 @@ +# SPDX-License-Identifier: MPL-2.0 +# must.k9.ncl — K9 trust-tier component of the must trident +# Author: Jonathan D.A. Jewell +# +# Pairs with: Mustfile.a2ml (declaration) + must.ncl (runner). +# Trident completeness is a hard precondition — a repo shipping +# Mustfile without this file AND its runner is an invalid trident; +# the contractile CLI's verify gate refuses partial publication. +# +# Verb: must (invariant assertion — release-blocking) +# Tier: Hunt-read-only (capability: subprocess probes shell out +# for grep/test/file-check; no mutation; +# no network; no write) +# Authority: blocking (HARD GATE — the canonical gating verb) +# +# must is the concrete + persistent verb — release-blocking invariants +# that must hold. Complement to trust (concrete + ephemeral). Together +# must + trust form the blocking-authority pair in the contractile set. +# +# Cardinality: ONE must trident per repo. +# +# Failure-mode focus: must is the primary catchment for subtle +# invariant-erosion drift. Where trust catches "turn off the firewall" +# (outrageous), must catches "this file that was required is now +# missing" / "this forbidden pattern has reappeared" / "this schema +# version regressed" (subtle). Key defense against A5 (commercial +# fabrication of success "facts" — invariants ground truth against +# marketing copy) and D1 (lore fabrication about what the repo contains). + +let base_k9 = import "../k9/template-hunt.k9.ncl" in +let base = import "../_base.ncl" in + +{ + pedigree = base_k9.pedigree_schema & { + contractile_verb = "must", + paired_xfile = "../must/Mustfile.a2ml", + paired_runner = "../must/must.ncl", + + # α two-axis: Hunt tier (subprocess for grep/test/etc.) but + # restricted to read-only operations. Blocking authority because + # must is the canonical gating verb. + tier = 'Hunt, + authority = 'blocking, + + metadata = { + name = "must-k9", + version = "1.0.0", + description = "Evaluates release-blocking invariants as a hard gate. Third trident instance. Complements trust (ephemeral blocking) with persistent invariant blocking.", + paired_xfile = "Mustfile.a2ml", + paired_runner = "must.ncl", + author = "Jonathan D.A. Jewell ", + }, + + security = { + leash = 'Hunt, + trust_level = "read-only invariant verification with subprocess", + allow_network = false, + allow_filesystem_write = false, + allow_subprocess = true, + probe_scope = 'read_only, # must probes NEVER mutate + probe_kinds_allowed = [ + 'file_existence, + 'pattern_presence, + 'pattern_absence, + 'schema_match, + 'version_equality, + 'count_threshold, + ], + probe_kinds_denied = [ + 'network_call, + 'filesystem_mutation, + 'external_api, + 'exploit_attempt, # that's trust's safe_hacking territory + ], + }, + }, + + # ------------------------------------------------------------------- + # Variance schema — trust-style severity acknowledgement. + # Because must is BLOCKING, variances carry real weight. Critical- + # severity invariants can only be varied by maintainer-or-above. + # ------------------------------------------------------------------- + variance_schema = { + entry_id | String, # which invariant id the variance applies to + reason | String, + approved_by | String, # maintainer or above for critical-severity + scope | String, # path glob | session-id | "until-" + expires | String, # absolute date; must variances cannot be open-ended + review_notes | String | optional, + severity_acknowledged | [| 'critical, 'high, 'medium |], + waived_consequence_description | String, # plain language — what breaking the invariant actually does + }, + + execution = { + triggers = [ 'session_close, 'on_demand, 'pre_push, 'pre_merge ], + + # Per-invariant execution. Failed invariant = blocked merge. + per_invariant = { + run_probe = true, + record_outcome = true, + respect_variance = true, # active variance suppresses the gate + on_unmet = 'fail, # BLOCKING + severity_escalation = 'honour, + # Subtle-erosion defense: track per-invariant trend over sessions. + # An invariant that passes once and then starts failing in a + # later session without explicit amendment = suspect drift; + # surface as high-priority drift log entry. + track_per_session_trend = true, + flag_suspicious_regressions = true, + }, + + evidence_sinks = [ + { + kind = 'verisimdb, + table = "contractile_executions", + schema = "contractile_execution_v1", + aux_tables = [ "must_invariant_history" ], # per-invariant trend record + }, + { + kind = 'drift_log, + path = ".machine_readable/6a2/DRIFT.a2ml", + append_only = true, + }, + ], + + # Session-close hook — re-evaluate all invariants. Block close on + # critical drift (same policy as trust). + on_close = { + re_execute_all_invariants = true, + diff_against_last_ratification = true, + emit_drift_entries_for_new_failures = true, + surface_expired_variances = true, + # Critical must drift blocks session close — consistent with trust. + block_session_close_on_critical_drift = true, + # Must-specific: if a previously-passing invariant is now failing + # without an associated variance or amendment, that's suspected + # silent regression — surface prominently at next session open. + flag_silent_regression = true, + }, + + # ----------------------------------------------------------------- + # Session-open hook — NEGOTIATION + RATIFICATION + ACCOUNTABILITY + # (inherited from intend.k9.ncl v2.0.0 + trust.k9.ncl extensions) + # ----------------------------------------------------------------- + on_open = { + # --- Context presentation --- + render_summary = 'plain_language, + include_drift_log_from_last_close = true, + include_active_variances = true, + include_recent_anchors = true, + anchor_lookback_weeks = 8, + + # Must-specific: surface any silent regressions flagged at last + # close so they can't quietly persist across sessions. + include_silent_regressions = true, + + # --- Negotiation phase (five mandatory inputs) --- + negotiation = { + required = true, + ai_required_inputs = [ + 'timeline_realism, + 'industry_standards, # what invariants derive from external standards + 'audience_feasibility, # who is the invariant protecting + 'resulting_invariants, # what NEW must entries result from the work + 'ecosystem_dependencies, # what the invariants depend on + ], + user_engagement_required = true, + user_engagement_mode = 'per_input_response, + specification_translation = { + ai_produces_spec_form = true, + user_reviews_in_domain_language = true, + schema_authoring_is_ai_responsibility = true, + translation_faithfulness_auditable = true, + }, + }, + + # --- Accountability pledge --- + # Must's pledge parallels trust's but around invariants rather + # than threat model. User pledges not to disable invariants to + # unblock merges; AI pledges to hold the line on declared + # invariants even against enthusiastic scope expansion. + accountability_pledge = { + required = true, + parties = [ + { + role = 'user, + pledge = "I have reviewed the declared invariants and the consequences of breaching them. I accept accountability for meeting these invariants and understand that failed invariants block merges. I will raise a variance (with severity acknowledgement) or an amendment rather than disabling a probe to unblock a merge.", + signature_required = true, + }, + { + role = 'ai_agent, + pledge = "I will hold the declared invariants. I will refuse to weaken probes to unblock merges; I will refuse scope-creep suggestions that would remove an invariant silently; I will surface silent regressions at session close; I will require variance-with-severity or amendment for any legitimate scope shift, not quiet probe disablement.", + signature_required = true, + }, + ], + signed_record_destination = ".machine_readable/6a2/ratification-.a2ml", + must_precede_work = true, + }, + + ratification_record_shape = { + includes_negotiation_transcript = true, + includes_both_pledges = true, + includes_invariant_summary = true, # must-specific + signed = true, + dated = true, + session_id = 'required, + contract_hash = 'required, + }, + }, + }, + + # ------------------------------------------------------------------- + # Failure-mode defenses — must's specialisation is subtle-invariant + # erosion. Overlaps with trust on blocking authority but focused on + # persistent invariants rather than ephemeral transactional state. + # ------------------------------------------------------------------- + failure_mode_defenses = [ + # Category A — enthusiasm capture + 'A1_enthusiasm_capture, # scope breach via blocking authority + 'A5_grandiose_scale_hype, # invariants are ground truth vs commercial hype + # Category C — scope/capability erosion + 'C1_scope_creep, # feature-adjacent changes flagged if they break invariants + 'C2_capability_collapse, # invariant removal requires amendment + 'C3_helpfulness_inflation, # added features must respect declared invariants + # Category D — epistemic failures + 'D1_lore_fabrication, # invariants are verifiable truth, not AI-recollection + 'D2_completeness_illusion, # invariant probe must cite behavioural check, not build-success + 'D3_test_theatre, # invariants require real verification not mock-passing + 'D4_error_hiding, # on_unmet = 'fail makes hiding impossible + # Category E — refactor/churn + 'E1_refactor_stampede, # refactor must preserve invariants + 'E3_premature_abstraction, # abstraction must not violate invariants + # Category F — session drift + 'F1_across_session_forgetting, # track_per_session_trend catches re-introduction + ], +} diff --git a/validate-action/.machine_readable/contractiles/must/must.manifest.a2ml b/validate-action/.machine_readable/contractiles/must/must.manifest.a2ml new file mode 100644 index 0000000..c43cd05 --- /dev/null +++ b/validate-action/.machine_readable/contractiles/must/must.manifest.a2ml @@ -0,0 +1,59 @@ +# SPDX-License-Identifier: MPL-2.0 +# must.manifest.a2ml — Trident coherence manifest for the must verb. +# Author: Jonathan D.A. Jewell +# +# Third trident instance in the estate. Completes the blocking-authority +# pair (must + trust). must is concrete + persistent invariants; trust +# is concrete + ephemeral transactions. Together they gate every +# security- and invariant-affecting merge. + +--- +trident_version = "1.0.0" +verb = "must" +semantics = "invariant assertion — release-blocking" +cardinality = "one per repo" +authority = "blocking (hard gate)" + +## Files (three; exactly) + +[[files]] +role = "declaration" +path = "Mustfile.a2ml" +sha256 = "pending-first-verify" +size_bytes = "pending-first-verify" +notes = "Mustfile declaration — invariants each with id, description, probe, severity." + +[[files]] +role = "runner" +path = "must.ncl" +sha256 = "pending-first-verify" +size_bytes = "pending-first-verify" +notes = "Runner pre-existed. Schema covers invariants array with status_core + severity." + +[[files]] +role = "k9_component" +path = "must.k9.ncl" +sha256 = "pending-first-verify" +size_bytes = "pending-first-verify" +notes = "Hunt-restricted read-only tier; blocking authority. Tracks per-invariant trend across sessions; flags silent regressions; blocks session close on critical drift." + +## Cross-references (must round-trip) + +[cross_refs] +runner_paired_xfile = "Mustfile.a2ml" +k9_paired_xfile = "../must/Mustfile.a2ml" +k9_paired_runner = "../must/must.ncl" + +## Trident signing + +[signed_by] +user = "Jonathan D.A. Jewell" +date = "2026-04-18" +context = "must trident — third Trident instance. Completes the blocking-authority pair (must + trust). Specialises in subtle invariant-erosion catchment vs trust's outrageous-attack catchment." + +## Change log + +[[history]] +date = "2026-04-18" +event = "trident-born" +note = "Mustfile.a2ml and must.ncl pre-existed. This manifest + must.k9.ncl complete the trident. Inherits on_open schema from intend.k9.ncl v2.0.0; inherits block_session_close_on_critical_drift + variance-severity-acknowledgement from trust.k9.ncl v1.0.0; adds must-specific track_per_session_trend + flag_silent_regression + probe_scope = 'read_only (must doesn't do active exploit attempts — that's trust's safe_hacking territory)." diff --git a/validate-action/.machine_readable/contractiles/must/must.ncl b/validate-action/.machine_readable/contractiles/must/must.ncl new file mode 100644 index 0000000..47509d3 --- /dev/null +++ b/validate-action/.machine_readable/contractiles/must/must.ncl @@ -0,0 +1,64 @@ +# SPDX-License-Identifier: MPL-2.0 +# Must — invariants runner +# +# Pairs with: Mustfile.a2ml (same directory) +# Verb: must (invariant assertion) +# Semantics: every check is a hard gate. A single failure blocks merge. +# CLI: `contractile must run` → reads Mustfile.a2ml, evaluates each check, +# emits pass/fail verdict per item, exits non-zero if any failed. +# +# This file is the *schema + runner* that the `contractile` CLI (at +# /var/mnt/eclipse/repos/reposystem/contractiles/cli/) loads alongside +# Mustfile.a2ml. Anything else in this directory is human-only notes/archive +# and MUST be ignored by machines. +# +# Base: ../_base.ncl provides pedigree_schema, run_defaults, probe_schema. +# See: docs/CONTRACTILE-SPEC.adoc + +let base = import "../_base.ncl" in + +{ + pedigree = base.pedigree_schema & { + contractile_verb = "must", + semantics = "invariant", + security = { + leash = 'Kennel, + trust_level = "read-only verification", + allow_network = false, + allow_filesystem_write = false, + allow_subprocess = true, # verification probes may shell out (e.g. grep, test -f) + }, + metadata = { + name = "must-runner", + version = "1.0.0", + description = "Evaluates every invariant in the adjacent Mustfile.a2ml as a hard gate.", + paired_xfile = "Mustfile.a2ml", + author = "Jonathan D.A. Jewell ", + }, + }, + + # Contract schema — the shape every Mustfile.a2ml must satisfy. + # Used by `contractile must typecheck Mustfile.a2ml`. + schema = { + invariants + | Array { + id | String, + description | String, + # TODO: migrate to base.probe_schema (structured probe) when CLI supports it + probe | String, # shell command; exit 0 = pass + # status_core values: 'declared, 'verified, 'failing + status | [| 'declared, 'verified, 'failing |] | default = 'declared, + severity | [| 'critical, 'high, 'medium |] | default = 'critical, + notes | String | optional, + fix | String | optional, + }, + }, + + # Runner behaviour — consumed by the contractile CLI dispatcher. + # Inherits from base.run_defaults; on_any_fail is the hard-gate default. + run = base.run_defaults & { + on_any_fail = "exit-nonzero", # hard gate + report_format = "a2ml", # emit a2ml report, not json + emit_summary = true, + }, +} diff --git a/validate-action/.machine_readable/contractiles/trust/Trustfile.a2ml b/validate-action/.machine_readable/contractiles/trust/Trustfile.a2ml new file mode 100644 index 0000000..124035b --- /dev/null +++ b/validate-action/.machine_readable/contractiles/trust/Trustfile.a2ml @@ -0,0 +1,1124 @@ +# SPDX-License-Identifier: MPL-2.0 +# ============================================================================= +# A2ML Trustfile Example (Fully Populated Reference) +# This is the complete example. The blank template is Trustfile.a2ml. +# ============================================================================= + +--- +### [META] +id: "did:web:example.com" +version: "2026.2.5-final" +context: + - "https://a2ml.org/ns/v3" + - "https://idris-lang.org/ns/v2" # TODO: replace with canonical URL once published + - "https://hypatia.scans/ns/v1" + - "https://w3id.org/security/v4" + - "https://w3id.org/transparency/v1" +meta: + generated: "2026-02-16T00:00:00Z" + expires: "2027-02-16T00:00:00Z" + signature: + algorithm: "Ed448+Dilithium5" + value: | + -----BEGIN HYBRID SIGNATURE----- + BASE64_Ed448+Dilithium5_SIGNATURE_OF_THIS_FILE + -----END HYBRID SIGNATURE----- + signedBy: "did:web:example.com#primary-sig" + proof: "https://example.com/proofs/meta.idr" + fallbackSignature: + algorithm: "SPHINCS+" + value: | + -----BEGIN SPHINCS+ SIGNATURE----- + BASE64_SPHINCS+_SIGNATURE_OF_THIS_FILE + -----END SPHINCS+ SIGNATURE----- + integrity: + sha3-512: "HEX_SHA3_512_OF_THIS_FILE" + shake256: "BASE32_SHAKE256_OF_THIS_FILE" + zonemd: "2026021601;SHA512;BASE64_SHA512_OF_ZONE;SHAKE256;BASE32_SHAKE256_OF_ZONE" + ci_cd: + github_actions: "https://github.com/hyperpolymath/example.com/blob/main/.github/workflows/trustfile.yml" + gitbot_fleet: "https://gitbot-fleet.example.com/hooks/trustfile" + hypatia_scan: "https://hypatia.scans/repos/example.com" + automation: + hashing: ["SHA3-512", "SHAKE256", "BLAKE3"] + diffing: "alert-on-unexpected-changes" + integrity: ["zonemd-consistency", "transparency-log-continuity", "idris2-proof-validity"] + +--- +### [THREAT_MODEL] +adversaries: + - type: "APT" + mitigations: + - "Capability-based auth → No lateral movement." + - "Idris2 proofs → No exploit primitives." + - "Transparency logs → Immediate detection." + - type: "Ransomware" + mitigations: + - "Consent-Aware HTTP → No bulk exfiltration." + - "SDP (CAdRE Router) → Resource isolation." + - "Immutable logs → Instant rollback." + - type: "Quantum Adversary" + mitigations: + - "Kyber1024 + Dilithium5 → PQ-resistant crypto." + - "SPHINCS+ fallback → Crypto agility." + - "GitBot-Fleet → Automated key rotation." + - type: "DDoS" + mitigations: + - "Cloudflare edge network → Absorbs volumetric attacks." + - "HTTP DDoS Managed Ruleset → Auto-mitigation at max sensitivity." + - "Challenge Passage TTL → Rate-limits challenge solvers." + - "Security Level → Adjustable based on threat intelligence." + - type: "AI Scraper" + mitigations: + - "Bot Fight Mode → Challenges known bot patterns." + - "Block AI Bots → Blocks verified AI crawlers + similar unverified." + - "AI Labyrinth → Traps scrapers in infinite maze of AI-generated decoy content." + - "AI Crawl Control → Per-crawler blocking and monitoring." + - "Managed robots.txt → Programmatic crawl directives." + - type: "Credential Stuffer" + mitigations: + - "Browser Integrity Check → Rejects headless/automated browsers." + - "Challenge Passage TTL → Forces re-challenge after 30 min." + - "HSTS preload → Prevents SSL-stripping MITM for credential capture." + - "Leaked credentials detection → (Enterprise; noted for upgrade path)." + - type: "Email Spoofing" + mitigations: + - "SPF hard fail (-all) → Rejects unauthorized senders." + - "DMARC p=reject → Instructs receivers to drop spoofed mail." + - "DKIM signing → Cryptographic message authentication." + - "CAA records → Restricts certificate issuance to authorized CAs." + +--- +### [DNS] +dnssec: + enabled: true + algorithm: "ECDSAP256SHA256" + ds_record: "{{DS_RECORD}}" + key_tag: "{{KEY_TAG}}" + digest_type: "SHA-256" + policy: "DNSSEC MUST be enabled on all zones. DS records propagated to registrar." + security: + proof: "DNS.DNSSEC.idr" + ci_cd: "verify-dnssec-propagation" +soa: + mname: "ns1.cloudflare.com." + rname: "admin.example.com." + serial: 2026021601 + refresh: 10800 + retry: 3600 + expire: 604800 + minimumTTL: 3600 + zonemd: "2026021601;SHA512;BASE64_SHA512_OF_ZONE;SHAKE256;BASE32_SHAKE256_OF_ZONE" +records: + - type: "A" + name: "@" + value: "192.0.2.1" + ttl: 3600 + proxied: true + security: + zonemd: "2026021601;SHA512;BASE64_SHA512;SHAKE256;BASE32_SHAKE256" + proof: "DNS.Core.A_Record.idr" + hypatia: "scan-dns-record" + ci_cd: "auto-hash-on-push" + - type: "AAAA" + name: "@" + value: "2001:db8::1" + ttl: 3600 + proxied: true + security: + proof: "DNS.Core.AAAA_Record.idr" + - type: "HTTPS" + name: "@" + value: '1 . alpn="h3,h2" ipv4hint=192.0.2.1 ipv6hint=2001:db8::1' + ttl: 3600 + security: + proof: "DNS.HTTPS.idr" + - type: "SVCB" + name: "@" + value: '1 . alpn="h3,h2" port=443 ipv4hint=192.0.2.1 ipv6hint=2001:db8::1' + ttl: 3600 + security: + proof: "DNS.SVCB.idr" + - type: "TXT" + name: "@" + value: '"v=DMARC1; p=reject; rua=mailto:dmarc@example.com; ruf=mailto:dmarc@example.com"' + ttl: 3600 + security: + proof: "Email.DMARC.idr" + - type: "CAA" + name: "@" + value: '0 issue "letsencrypt.org"' + ttl: 3600 + - type: "CAA" + name: "@" + value: '0 issue "digicert.com"' + ttl: 3600 + - type: "CAA" + name: "@" + value: '0 iodef "mailto:security@example.com"' + ttl: 3600 + - type: "TLSA" + name: "_443._tcp" + value: "3 1 1 D2ABDE240D7CD3EE6B4B28C54DF034B97983A1D16E8A410E4561CB106618E971" + ttl: 3600 + - type: "TLSA" + name: "_443._tcp" + value: "3 3 1 BASE32_SHAKE256_CERT_HASH" + ttl: 3600 + - type: "TXT" + name: "_cyberwar-trap" + value: '"🎣 This system is formally verified. Good luck, script kiddie."' + ttl: 3600 + security: + hypatia: "scan-for-apt-activity" + proof: "Psychological.Warfare.idr" + - type: "TXT" + name: "_capabilities" + value: '"v=OCAP1; endpoint=https://example.com/cap"' + ttl: 3600 + security: + proof: "HTTP.Capabilities.idr" + - type: "TXT" + name: "_consent" + value: '"v=CAdRE1; endpoint=https://example.com/.well-known/consent"' + ttl: 3600 + security: + proof: "HTTP.Consent.idr" + gitbot: "validate-consent-endpoint" + # Email Security Records + - type: "TXT" + name: "@" + value: '"v=spf1 -all"' + ttl: 3600 + notes: "Hard fail. No servers authorized to send. Override per-domain if email is used." + security: + proof: "Email.SPF.idr" + - type: "TXT" + name: "_dmarc" + value: '"v=DMARC1; p=reject; sp=reject; adkim=s; aspf=s; rua=mailto:dmarc@example.com; ruf=mailto:dmarc@example.com; fo=1"' + ttl: 3600 + notes: "Strict alignment. Reject all unauthenticated. Forensic reports on any failure." + security: + proof: "Email.DMARC.idr" + ci_cd: "validate-dmarc-alignment" + - type: "TXT" + name: "*._domainkey" + value: '"v=DKIM1; p="' + ttl: 3600 + notes: "Empty public key = revoked. Prevents DKIM pass on spoofed mail for non-sending domains." + security: + proof: "Email.DKIM.idr" + - type: "TXT" + name: "_mta-sts" + value: '"v=STSv1; id={{MTA_STS_ID}}"' + ttl: 3600 + notes: "MTA-STS policy ID. Rotate on policy change." + - type: "TXT" + name: "_smtp._tls" + value: '"v=TLSRPTv1; rua=mailto:tls-reports@example.com"' + ttl: 3600 + notes: "SMTP TLS Reporting (RFC 8460). Receive reports on TLS failures." + +--- +### [EMAIL_SECURITY] +overview: | + Email security posture for domains that do NOT send email. + All records configured to reject/block spoofed mail. + For domains that DO send email, override SPF with authorized senders, + configure DKIM signing keys, and set DMARC to quarantine during rollout. +policy: + non_sending_domains: + spf: "v=spf1 -all" + dmarc: "p=reject; sp=reject; adkim=s; aspf=s; fo=1" + dkim: "revoked (empty public key)" + mta_sts: "mode: enforce; max_age: 604800" + sending_domains: + spf: "v=spf1 include:_spf.google.com include:_spf.cloudflare.com -all" + dmarc: "p=reject; sp=reject; adkim=s; aspf=s; pct=100; fo=1" + dkim: "2048-bit RSA minimum; rotate annually" + mta_sts: "mode: enforce; max_age: 604800" +email_routing: + provider: "Cloudflare Email Routing" + features: + - "Custom address forwarding" + - "DMARC enforcement (rejects unauthenticated inbound)" + - "IPv6 support" + - "Automatic MX/SPF/DKIM record creation" + security: + proof: "Email.Routing.idr" +security: + proof: "Email.Policy.idr" + ci_cd: "validate-email-records-on-push" + +--- +### [TRUSTFILE] +issuer: "did:web:example.com" +keys: + - id: "#primary-sig" + type: "HybridKey2024" + classical: + algorithm: "Ed448" + publicKeyJwk: + kty: "OKP" + crv: "Ed448" + x: "BASE64URL_Ed448_PUBLIC_KEY" + postQuantum: + algorithm: "Dilithium5" + publicKeyJwk: + kty: "OKP" + crv: "Dilithium5" + x: "BASE64URL_Dilithium5_PUBLIC_KEY" + fallback: + algorithm: "SPHINCS+" + publicKeyJwk: + kty: "OKP" + crv: "SPHINCS+" + x: "BASE64URL_SPHINCS+_PUBLIC_KEY" + usage: ["authentication", "assertion"] + security: + proof: "Crypto.HybridKey.idr" + hypatia: "scan-keys" + ci_cd: "rotate-keys-on-compromise" +algorithms: + hashing: ["SHA3-512", "SHAKE256", "BLAKE3"] + kdf: "HKDF-SHAKE512" + rng: "ChaCha20-DRBG" + passwordHashing: "Argon2id (512 MiB, 8 iter, 4 lanes)" + security: + proof: "Crypto.Algorithms.idr" +policies: + dns: + rego: | + package trustfile.dns + default allow = false + allow { + input.record.security.proof != "" + input.record.security.zonemd != "" + } + idris2: "Policies.DNS.idr" + ci_cd: "validate-dns-policies-on-push" + http: + rego: | + package trustfile.http + default allow = false + allow { + input.consent.granted + valid_capability(input.capability) + } + idris2: "Policies.HTTP.idr" + php: + rego: | + package trustfile.php + default allow = false + allow { + input.php.aegis_enabled + input.php.sanctify_enabled + } + idris2: "Policies.PHP.idr" +fallbacks: + signatures: ["Ed448+Dilithium5", "SPHINCS+"] + keyExchange: ["Kyber1024-X25519", "X25519"] + +--- +### [VERIFICATION_LADDER] +overview: | + Four-tier verification claim ladder. Each capability in this Trustfile + MUST declare which tier it sits at. Claims at a tier require the evidence + at that tier; no claim may be made stronger than the evidence supports. +tiers: + - id: "idris2-proven" + description: "Formal proofs in Idris2 with %default total. IsUnbreakable or equivalent proof required before activation." + evidence_required: "Idris2 module, compiler version recorded, axioms declared, last-check date." + - id: "zig-assured" + description: "Zig boundary calls into proven-sourced safety primitives (safePathDefault, safeHeaderDefault, etc). Defense-in-depth; not formal proof but grounded in Idris2-proven predicates." + evidence_required: "Declared primitive + reference to proven-side Idris2 proof." + - id: "elixir-disciplined" + description: "Supervision trees + session-typed protocols + dialyzer + Gleam where applicable. Pattern-conforming, not proven." + evidence_required: "Supervisor module, session type declaration, dialyzer clean." + - id: "external-trust" + description: "Unverified-by-construction layer: HATs, external CLIs, third-party services. Acknowledged trust, isolated via circuit breakers." + evidence_required: "Documented trust boundary + isolation mechanism." + +--- +### [SEAMS] +overview: | + A seam is an integration boundary between two components that can be + independently versioned, built, or deployed. Every seam MUST be declared + here with: contract owner, test coverage, failure mode on mismatch. + See docs/SEAMS-SPEC.adoc for the full spec. +seams: + - id: "example-seam" + description: "Example seam declaration — replace with real entries" + from: "component-a" + to: "component-b" + contract: "path/to/abi-or-schema" + test_ref: "tests/seam/component-a-b.test" + failure_mode: "fail-closed" + tier: "zig-assured" + notes: "" +policy: + seam_check: "every PR that touches either side of a declared seam MUST exercise the P2P test for that seam before merge" +security: + proof: "Seams.Policy.idr" + +--- +### [SECRETS_HYGIENE] +at_rest: + pattern: "SOPS+age" + template_location: "web-ecosystem/lcb-website/" + adoption_status: "template + estate intent — per-repo adoption tracked below" + per_repo_adoption: + - repo: "lcb-website" + status: "DEPLOYED" + # TEMPLATE NOTE: replace {{THIS_REPO}} with the repo name (e.g. "boj-server") and + # {{REPO_SOPS_ADOPTION_STATUS}} with one of: "DEPLOYED", "PENDING — runtime-only via Rokur, + # no at-rest secrets in this repo", or a concise description of the actual status. + - repo: "{{THIS_REPO}}" + status: "{{REPO_SOPS_ADOPTION_STATUS}}" + pre_commit_hooks: + - "gitleaks" + - "plaintext detector" +delivery: + mechanism: "environment variable injection at container start" + scope: "SOPS-decrypted secrets → ROKUR_SECRET_ env vars; containers never read plaintext from disk" +gate: + tool: "Rokur" + role: "policy engine — validates required secrets present, audits, rate-limits, fail-closed" + features: + - "per-IP sliding window rate limiting (60/min general, 5/min auth-fail)" + - "structured JSONL audit logging" + - "X-Request-Id tracing" + - "policy backends: builtin or external (Ephapax adapter)" + - "SIGHUP hot-reload" +llm_agents: + tool: "RGTV" + status: "ALPHA — NOT production-ready, see RGTV/README.adoc known-unsafe list" + scope: "LLM-agent credential brokering only — opaque one-use grants" + # TEMPLATE NOTE: replace {{RGTV_ENABLED_FOR_REPO}} with "true" if this repo brokers + # LLM-agent credentials via RGTV, or "false — " if not. Most repos will be false. + # RGTV is ALPHA; see RGTV/README.adoc for the known-unsafe list. + enabled_here: "{{RGTV_ENABLED_FOR_REPO}}" +security: + proof: "Secrets.Hygiene.idr" + ci_cd: "validate-secrets-flow-on-push" + +--- +### [CI_CD] +github_actions: + name: "Trustfile Validation" + on: ["push", "pull_request"] + jobs: + validate: + runs-on: "ubuntu-latest" + steps: + - uses: "actions/checkout@v4" + - name: "Validate A2ML" + run: "a2ml validate example.com.trustfile.a2ml" + - name: "Run Idris2 Proofs" + run: "idris2 --build trust.ipkg" + - name: "Hypatia Scan" + run: "hypatia scan --config hypatia.yml" + - name: "GitBot-Fleet Passover" + run: "gitbot-fleet passover --file example.com.trustfile.a2ml" + update_integrity: + runs-on: "ubuntu-latest" + steps: + - name: "Update Hashes" + run: | + NEW_SHA3=$(sha3sum -a 512 example.com.trustfile.a2ml | awk '{print $1}') + NEW_SHAKE=$(shake256sum example.com.trustfile.a2ml | awk '{print $1}' | base32) + sed -i "s|sha3-512:.*|sha3-512: \"$NEW_SHA3\"|" example.com.trustfile.a2ml + sed -i "s|shake256:.*|shake256: \"$NEW_SHAKE\"|" example.com.trustfile.a2ml + - name: "Commit and Push" + run: | + git config --global user.name "GitBot-Fleet" + git config --global user.email "gitbot@example.com" + git add example.com.trustfile.a2ml + git commit -m "Auto-update integrity hashes [skip ci]" + git push +gitbot_fleet: + hooks: + - type: "pre-commit" + script: "a2ml validate example.com.trustfile.a2ml" + - type: "post-merge" + script: "gitbot-fleet diff --file example.com.trustfile.a2ml" +hypatia: + config: "hypatia.yml" + scans: + - type: "dns" + frequency: "daily" + - type: "crypto" + frequency: "weekly" + - type: "php" + frequency: "on-push" + +--- +### [IDRIS2_PROOFS] +theorems: + - name: "dns_correctness" + file: "DNS.Core.idr" + description: "All DNS records are conflict-free and correctly signed." + status: "proven" + ci_cd: "reprove-on-dns-change" + - name: "tls_handshake_safety" + file: "TLS.Handshake.idr" + description: "TLS 1.3 + Kyber1024 handshake resists downgrade attacks." + status: "proven" + - name: "consent_aware_http_soundness" + file: "HTTP.Consent.idr" + description: "Consent-Aware HTTP (CAdRE) enforces user intent." + status: "proven" + - name: "capability_gateway_correctness" + file: "HTTP.Capabilities.idr" + description: "OCAP-style capability gateway is safe." + status: "proven" + - name: "php_hardening_no_bypasses" + file: "PHP.Hardening.idr" + description: "PHP-Aegis + Sanctify-PHP blocks all unsafe functions." + status: "proven" + - name: "edge_ssl_no_downgrade" + file: "Cloudflare.SSL.idr" + description: "TLS 1.3 + HSTS preload prevents protocol downgrade at edge." + status: "proven" + ci_cd: "reprove-on-ssl-change" + - name: "bot_defense_coverage" + file: "Cloudflare.Bots.idr" + description: "Bot Fight Mode + AI Labyrinth + Block AI Bots covers all free-plan bot vectors." + status: "proven" + - name: "email_anti_spoofing" + file: "Email.Policy.idr" + description: "SPF -all + DMARC reject + revoked DKIM prevents email spoofing on non-sending domains." + status: "proven" + ci_cd: "reprove-on-email-record-change" + - name: "response_headers_complete" + file: "Cloudflare.ResponseHeaders.idr" + description: "All OWASP-recommended response headers enforced at edge." + status: "proven" + - name: "dnssec_chain_valid" + file: "DNS.DNSSEC.idr" + description: "DNSSEC chain of trust from root to zone is valid and signed." + status: "proven" + ci_cd: "verify-dnssec-weekly" + - name: "network_transport_safety" + file: "Cloudflare.Network.idr" + description: "HTTP/3 + 0-RTT replay protection + Onion routing correctly configured." + status: "proven" + +--- +### [PROOF_METADATA] +compiler: + idris2_version: "0.8.0" + zig_version: "0.15.2" + # TEMPLATE NOTE: replace {{LAST_PROOF_CHECK_DATE}} with the ISO-8601 date of the last + # Idris2 proof rebuild in this repo (e.g. "2026-04-17"). Updated at each proof-rebuild session. + last_check: "{{LAST_PROOF_CHECK_DATE}}" +axioms: + declared: [] + notes: "No axioms may be added without explicit justification and entry here." +drift_alert: + ci_cd: "rebuild-all-proofs-on-compiler-upgrade" + policy: "any compiler upgrade triggers full proof rebuild + signed attestation of re-check" + +--- +### [AUTOMATION] +hashing: + tool: "GitBot-Fleet" + triggers: ["pre-commit", "post-merge"] + algorithms: ["SHA3-512", "SHAKE256", "BLAKE3"] +diffing: + tool: "GitBot-Fleet" + rules: + - "alert-on-unexpected-changes" + - "require-proof-updates-for-crypto-changes" +integrity: + tool: "Hypatia + Idris2" + checks: + - "zonemd-consistency" + - "transparency-log-continuity" + - "idris2-proof-validity" + +--- +### [CAPABILITY_GATEWAY] +rules: + - resource: "/api/data" + policy: "require Ed448+Dilithium5-signed capability token" + proof: "HTTP.Capabilities.Data.idr" + - resource: "/admin" + policy: "require TPM 2.0 + YubiKey device attestation" + proof: "HTTP.Capabilities.Admin.idr" + +--- +### [SAFE_HACKING] +scope: "this-repo-only" +allowed_probe_classes: [] +probes: [] +policy: | + Authorised offensive testing scoped to this repo. Probes listed here + are actively executed during `contractile trust probe`. NEVER touches + external systems. See trust.ncl for schema; this section is the data. +policy_on_unexpected_outcome: "exit-nonzero" +security: + proof: "SafeHacking.Policy.idr" + +--- +### [VULNERABILITY_DISCLOSURE] +policy: | + Responsible disclosure welcomed. Researchers reporting real vulnerabilities + in good faith receive acknowledgement in SECURITY.adoc and in + /.well-known/security-acknowledgments. See security.txt for contact path. +# TEMPLATE NOTE: replace {{SECURITY_CONTACT}} with a mailto: URI for this repo's +# security contact, e.g. "mailto:j.d.a.jewell@open.ac.uk". +contact: "{{SECURITY_CONTACT}}" +recognition: + mechanism: "security-acknowledgments list" + url: "https://{{DOMAIN}}/.well-known/security-acknowledgments" +contractile_ref: "tracked in `contractile trust probe` — see trust.ncl safe_hacking" +security: + proof: "VulnDisclosure.Policy.idr" + +--- +### [SDP_RULES] +services: + - name: "dashboard.internal" + access: + - group: "admins" + policy: "require Ed448+Dilithium5 + device-attestation + cadre-consent" + - group: "bots" + policy: "require JWT (Kyber1024) + IP in CI_NETWORK" + proof: "SDP.Dashboard.idr" + - name: "db.internal" + access: + - group: "apps" + policy: "require mutual TLS (Kyber1024-X25519) + client cert" + proof: "SDP.Database.idr" + +--- +### [TRANSPARENCY_LOG] +rfc9162: + uri: "https://example.com/log/transparency.json" + entries: + - timestamp: "2026-02-16T00:00:00Z" + data: "BASE64_ENCODED_THIS_FILE" + signature: "BASE64_Ed448+Dilithium5_SIGNATURE" + idris2_proof: "Transparency.Log.idr" + ci_cd: "append-on-push" + +--- +### [SSL/TLS] +ciphers: + - "TLS_AES_256_GCM_SHA384" + - "TLS_CHACHA20_POLY1305_SHA256" +groups: + - "X25519Kyber768Draft00" + - "secp256r1" +protocols: + - "TLSv1.3" +minimum_version: "1.2" +notes: | + TLS 1.3 preferred with post-quantum key exchange (X25519Kyber768). + Minimum version 1.2 enforced at Cloudflare edge for clients that + don't support 1.3 yet. TLS 1.0 and 1.1 are BANNED. Cipher preference + is server-side (Cloudflare-controlled on free plan). +features: + ocspStapling: true + signedCertTimestamps: true + certificateTransparency: + logs: + - "ct.googleapis.com/aviator" + - "ct.googleapis.com/rocketeer" + monitoring: true + notes: "Cloudflare automatically includes SCT in TLS handshake for all proxied zones." + mustStaple: true + opportunistic_encryption: true + automatic_https_rewrites: true + always_use_https: true +edge_certificates: + provider: "Cloudflare Universal SSL" + type: "DV (Domain Validated)" + issuers: ["DigiCert", "Let's Encrypt", "Google Trust Services"] + auto_renewal: true + caa_restriction: true + notes: | + Cloudflare issues Universal SSL certificates automatically for all + proxied zones. CAA records restrict issuance to authorized CAs only. + Origin certificates should use Cloudflare Origin CA (15-year validity) + or publicly trusted certs for Full (Strict) mode. +security: + proof: "TLS.Configuration.idr" + ci_cd: "verify-tls-settings-drift" + +--- +### [CLOUDFLARE] +operator_trust_anchor: | + Cloudflare is an operator-chosen trust anchor for this repo. Its edge + network provides DDoS absorption, TLS termination, and WAF. This is a + single-vendor dependency: compromise or misbehaviour at Cloudflare + affects all proxied traffic. Plan for vendor-compromise scenario + documented in THREAT-MODEL.md §vendor-anchors. +waf: + ruleset: "OWASP_ModSecurity_CRS" + sensitivity: "high" + paranoiaLevel: 4 + managed_rulesets: + - name: "Cloudflare Managed Ruleset" + id: "efb7b8c949ac4650a09736fc376e9aee" + action: "execute" + phase: "http_request_firewall_managed" + - name: "Cloudflare OWASP Core Ruleset" + id: "4814384a9e5d4991b9815dcfc25d2f1f" + action: "execute" + phase: "http_request_firewall_managed" + ddos: + http: + sensitivity: "high" + action: "managed_challenge" + ruleset: "Cloudflare HTTP DDoS Attack Protection" + notes: "Always-on, unmetered DDoS protection on all plans." + security: + proof: "Cloudflare.WAF.idr" + ci_cd: "validate-waf-rulesets" +workers: + - name: "consent-aware-http" + script: "https://example.com/workers/consent.js" + routes: + - "example.com/.well-known/consent*" + - name: "capability-gateway" + script: "https://example.com/workers/cap.js" + routes: + - "example.com/cap*" + +--- +### [CLOUDFLARE_EDGE_SECURITY] +overview: | + Cloudflare edge security settings applied uniformly across all zones. + These are the maximum free-plan configurations. Settings are enforced + via API and validated by Hypatia CI scans. Any drift triggers an alert. + +ssl_tls: + mode: "strict" + min_tls_version: "1.2" + tls_1_3: "zrt" + always_use_https: true + automatic_https_rewrites: true + opportunistic_encryption: true + hsts: + enabled: true + max_age: 31536000 + include_subdomains: true + preload: true + nosniff: true + universal_ssl: true + certificate_transparency: true + ocsp_stapling: true + notes: | + TLS 1.3 with 0-RTT (zrt). HSTS preloaded at 1 year with subdomains. + SSL mode 'strict' requires valid origin certificate (Cloudflare Origin CA + or publicly trusted). Downgrade to 'full' only if origin has self-signed. + security: + proof: "Cloudflare.SSL.idr" + ci_cd: "verify-ssl-settings-drift" + +bot_defense: + bot_fight_mode: true + block_ai_bots: true + ai_labyrinth: true + ai_crawl_control: + default_action: "block" + notes: | + Block all known AI crawlers by default. AI Labyrinth traps persistent + scrapers in an infinite maze of AI-generated decoy content, wasting + their compute while protecting real content. Individual crawlers can + be allowed via per-crawler overrides if licensing agreements exist. + managed_robots_txt: true + javascript_detections: false + notes: | + JS detections require Super Bot Fight Mode (Pro+). On free plan, + Bot Fight Mode uses pattern matching only. AI Labyrinth is the + primary free-plan defense against sophisticated AI scraping. + security: + proof: "Cloudflare.Bots.idr" + ci_cd: "verify-bot-settings" + +scrape_shield: + email_obfuscation: true + hotlink_protection: true + server_side_excludes: true + notes: | + Email obfuscation rewrites email addresses in HTML to prevent + harvesting by scrapers. Hotlink protection prevents other sites + from embedding your images. Server-side excludes hide content + from suspicious visitors. + security: + proof: "Cloudflare.ScrapeShield.idr" + +browser_integrity: + browser_check: true + security_level: "medium" + challenge_ttl: 1800 + notes: | + Browser Integrity Check evaluates HTTP headers for common + characteristics of abusive traffic. Security level 'medium' + challenges visitors from IPs with moderate threat scores. + Challenge TTL of 30 minutes before re-challenge. + security: + proof: "Cloudflare.BrowserIntegrity.idr" + +page_shield: + enabled: true + script_monitoring: true + notes: | + Page Shield monitors client-side JavaScript resources loaded by + your pages. Free tier provides script detection and alerts for + new/changed scripts. Paid tiers add malicious script detection. + security: + proof: "Cloudflare.PageShield.idr" + ci_cd: "review-new-scripts" + +security_txt: + enabled: true + contact: "mailto:j.d.a.jewell@open.ac.uk" + preferred_languages: "en" + # TEMPLATE NOTE: replace {{SECURITY_TXT_EXPIRES}} with an RFC 3339 datetime 1 year from deployment, + # e.g. "2027-04-17T00:00:00Z". Auto-renewed by CI. + expires: "{{SECURITY_TXT_EXPIRES}}" + # TEMPLATE NOTE: replace {{DOMAIN}} with the canonical domain for this repo (bare domain or + # GitHub Pages URL), e.g. "boj-server.hyperpolymath.dev" or "github.com/hyperpolymath/". + # Used in all /.well-known/ paths below. + policy: "https://{{DOMAIN}}/.well-known/security-policy" + acknowledgments: "https://{{DOMAIN}}/.well-known/security-acknowledgments" + encryption: "https://{{DOMAIN}}/.well-known/pgp-key.txt" + canonical: "https://{{DOMAIN}}/.well-known/security.txt" + notes: | + RFC 9116 compliant. Served by Cloudflare at /.well-known/security.txt. + Contact is the author's university email. Expiry set to 1 year from + deployment, auto-renewed by CI. Canonical URL prevents spoofing. + security: + proof: "Cloudflare.SecurityTxt.idr" + ci_cd: "renew-security-txt-before-expiry" + +rate_limiting: + architecture: "four-tier" + tier_1_edge: + provider: "Cloudflare" + mechanisms: ["Anycast absorption", "DDoS Managed Ruleset", "per-zone rate rules"] + tier_2_gateway: + provider: "http-capability-gateway / svalinn" + mechanisms: ["per-IP token-bucket sliding window", "per-capability-token", "per-endpoint"] + status: "PENDING — http-capability-gateway wiring forthcoming" + tier_3_beam: + provider: "Elixir supervisor" + mechanisms: ["per-cartridge-invocation budget", "mailbox back-pressure"] + tier_4_cartridge: + provider: "cartridge-declared" + mechanisms: ["Nickel manifest declares per-cartridge limits"] + cross_tier: + - "RFC 9530 rate-limit headers (RateLimit-Limit, RateLimit-Remaining, RateLimit-Reset)" + - "429 + Retry-After on limit hit" + - "Turnstile challenge on high-value endpoints" + - "HMAC request signing for API clients" + - "per-cartridge circuit breakers with exponential backoff" + - "shadow-ban for persistent offenders" + cost_ceiling: + policy: "operator-managed emergency brake above tier 1" + # TEMPLATE NOTE: replace {{COST_CEILING_POLICY}} with a concise operator policy string, + # e.g. "operator-managed; emergency brake above edge-tier rate limits; specific cap TBD". + # This is an operator-choice field — no universal default. + note: "{{COST_CEILING_POLICY}}" + security: + proof: "RateLimiting.Policy.idr" + +--- +### [RESPONSE_HEADERS] +overview: | + Security response headers applied at the Cloudflare edge via Managed + Transforms and custom response header modification rules. These headers + instruct browsers to enforce security policies regardless of origin config. + +managed_transforms: + add: + - "X-Content-Type-Options: nosniff" + - "X-Frame-Options: SAMEORIGIN" + - "Referrer-Policy: strict-origin-when-cross-origin" + remove: + - "Server" + - "X-Powered-By" + notes: "Managed Transforms are Cloudflare's built-in header rules. Zero config." + +custom_headers: + - name: "Permissions-Policy" + value: "camera=(), microphone=(), geolocation=(), payment=()" + notes: "Deny all sensitive browser APIs unless explicitly needed." + - name: "Content-Security-Policy" + value: "default-src 'self'; script-src 'self'; style-src 'self' 'unsafe-inline'; img-src 'self' data: https:; frame-ancestors 'self'; base-uri 'self'; form-action 'self'" + notes: "Strict CSP baseline. Override per-project if needed (e.g., for CDN scripts)." + - name: "Cross-Origin-Opener-Policy" + value: "same-origin" + - name: "Cross-Origin-Embedder-Policy" + value: "require-corp" + - name: "Cross-Origin-Resource-Policy" + value: "same-origin" + +policy: | + All security headers are enforced at the edge. Origin servers SHOULD + also set these headers as defense-in-depth. Headers set at edge take + precedence when Managed Transforms are enabled. CSP violations are + reported to /csp-report endpoint if a report-uri directive is added. + +security: + proof: "Cloudflare.ResponseHeaders.idr" + ci_cd: "validate-response-headers" + +--- +### [NETWORK] +overview: | + Network-level settings applied at the Cloudflare edge. + These affect how traffic is transported between clients and edge. + +http2: true +http3: true +quic: true +zero_rtt: true +websockets: true +onion_routing: true +ipv6_posture: + origin: "IPv6-only (strict)" + edge: "dual-stack (Cloudflare translates IPv4 clients to IPv6-only origins)" + internal_comms: "IPv6-only between BoJ instances" + policy: "Declared 2026-04-17. IPv4 clients reach BoJ only via Cloudflare edge translation; origin never listens on IPv4." +brotli: true + +zero_rtt_policy: | + 0-RTT Connection Resumption is enabled for performance. Note: 0-RTT + data is vulnerable to replay attacks. Cloudflare mitigates this by + only allowing 0-RTT on idempotent requests (GET/HEAD). Non-idempotent + requests (POST/PUT/DELETE) always use full handshake. Applications + MUST NOT rely on 0-RTT for state-changing operations. + +onion_routing_policy: | + Tor/Onion routing enabled via Cloudflare's Opportunistic Onion + (Alt-Svc header advertising .onion endpoint). This allows Tor users + to access sites without exit node MITM risk. Does NOT create a + dedicated .onion address — uses Cloudflare's shared onion service. + +security: + proof: "Cloudflare.Network.idr" + ci_cd: "verify-network-settings" + +--- +### [ORIGIN_PROTECTION] +hidden_primary: + public_dns: "no A/AAAA records resolving directly to origin" + public_endpoint: "Cloudflare Tunnel only" + authenticated_origin_pulls: + enabled: true + mtls_ca: "Cloudflare Origin CA" + policy: "origin rejects all non-CF traffic at TCP layer" + admin_endpoints: + mechanism: "Cloudflare Access (zero-trust)" + public_endpoint: "none" + backup_origin: + mechanism: "second Cloudflare Tunnel, passive failover" + leak_checks: + - "verify no historic origin IP exposure in securitytrails.com" + - "verify no origin IP in HTTP error messages" + - "verify no origin IP in DNS MX/TXT records" +security: + proof: "OriginProtection.Policy.idr" + ci_cd: "verify-origin-hidden-weekly" + +--- +### [PERFORMANCE] +overview: | + Performance settings that have security implications. + Applied at the Cloudflare edge for all zones. + +early_hints: true +speed_brain: true +auto_minify: + javascript: true + css: true + html: true +rocket_loader: false +notes: | + Rocket Loader disabled by default — it rewrites JavaScript loading + order which can break SPAs and CSP policies. Enable per-project only + after testing. Speed Brain uses Speculation Rules API to prefetch + likely navigation targets (conservative eagerness only). + +caching: + browser_ttl: "respect-origin" + edge_ttl: "default" + always_online: true + notes: | + Always Online serves stale cached copies when origin is unreachable. + Browser TTL respects origin Cache-Control headers. Do not cache + authenticated content — use Cache-Control: private on origin. + +security: + proof: "Cloudflare.Performance.idr" + +--- +### [PHP_HARDENING] +aegis: + enabled: true + rules: + - "disable_functions=exec,popen,shell_exec,system" + - "expose_php=0" + - "session.cookie_httponly=1" + - "session.cookie_secure=1" +sanctify: + enabled: true + directives: + - "sanctify.globals=1" + - "sanctify.request=1" + - "sanctify.error_reporting=E_ALL" + +--- +### [CONTAINER_SUPPLY_CHAIN] +overview: | + Container supply-chain verification via the stapeln ecosystem. + All container images are built with Podman on Chainguard Wolfi base + images, signed as .ctp bundles via cerro-torre, and governed by + svalinn edge gateway policies. Runtime monitoring provided by vordr. + +runtime: + engine: "Podman" + policy: "Rootless containers only. Never Docker." + socket: "${XDG_RUNTIME_DIR}/podman/podman.sock" + security: + proof: "Container.Runtime.idr" + +base_images: + provider: "Chainguard" + registry: "cgr.dev/chainguard/" + allowed: + - "cgr.dev/chainguard/wolfi-base:latest" + - "cgr.dev/chainguard/static:latest" + policy: "Only Chainguard images permitted as base. Rebuilt daily, CVE-free." + security: + proof: "Container.BaseImages.idr" + ci_cd: "scan-base-images-daily" + +verified_bundles: + format: ".ctp" + tool: "cerro-torre" + operations: + pack: "ct pack -o " + sign: "cerro-sign sign --key-id " + verify: "ct verify " + push: "ct push " + explain: "ct explain " + attestations: + required: ["source-signature", "sbom-complete"] + recommended: ["security-audit", "reproducible-build"] + security: + proof: "Container.Bundles.idr" + hypatia: "scan-ctp-bundles" + +gateway: + tool: "svalinn" + policy_file: "container/.gatekeeper.yaml" + capabilities: + - "JWT/OAuth2 authentication" + - "Rate limiting (per-client, per-endpoint)" + - "Container trust enforcement (.ctp signature verification)" + - "Request validation (body size, NaN/Inf rejection)" + - "CORS policy enforcement" + - "Audit logging for write operations" + - "TLS auto-provisioning" + security: + proof: "Container.Gateway.idr" + ci_cd: "validate-gatekeeper-policy-on-push" + +monitoring: + tool: "vordr" + config_file: "container/vordr.toml" + capabilities: + - "Health endpoint monitoring" + - "Container crash detection" + - "Resource usage thresholds (CPU, memory, disk)" + - "Structured JSON log output" + - "Automatic restart on failure (configurable)" + security: + proof: "Container.Monitoring.idr" + +signing: + algorithm: "Ed25519" + tool: "cerro-torre sign / cerro-sign" + key_management: | + Signing keys are project-specific. Each service has a dedicated + Ed25519 key pair (e.g. -release). Public keys are + distributed in .gatekeeper.yaml trusted_signers section. + security: + proof: "Container.Signing.idr" + ci_cd: "rotate-signing-keys-on-compromise" + +deployment: + tool: "k9-svc" + spec_file: "container/deploy.k9.ncl" + trust_level: "Hunt" + description: | + k9-svc deployment components at Hunt trust level. Full pedigree + (L1-L5: identity, target, security, validation, recipes). + Requires cryptographic handshake before execution. Supports + dev/staging/production environments with rolling deployment. + security: + proof: "Container.Deployment.idr" + ci_cd: "validate-k9-pedigree-on-push" + +--- +### [SUPPLY_CHAIN_DEPS] +overview: | + Source-library supply chain. Chainguard covers base images; + this section tracks language-level deps. +zig: + mechanism: "build.zig.zon with SHA256 hashes" + adoption_status: "ADOPTED where Zig is used" +idris2: + mechanism: ".ipkg with dep version pinning" + adoption_status: "PENDING — estate-wide pinning in CRG contractile" +proven_library: + # TEMPLATE NOTE: replace {{PROVEN_HASH}} with the SHA-256 hex digest of + # verification-ecosystem/proven/ffi/zig/zig-out/lib/libproven_ffi.a obtained via + # `sha256sum .../libproven_ffi.a`. Set to "PENDING" with a note if the lib has not + # yet been built for this repo. + hash_attestation: "{{PROVEN_HASH}}" + source: "verification-ecosystem/proven" + verification: "libproven_ffi.a rebuilt on source change; downstream relink verified" +crg_contractile: "tracked under CRG grade requirements — see CRG-SELF-ASSESSMENT.adoc" +security: + proof: "SupplyChain.Deps.idr" + +--- +### [PLACEHOLDER_TRACKING] +overview: | + Every {{PLACEHOLDER}} in this file must resolve to a live value before + the Trustfile is considered deployed. CI enforces no-placeholder-state + on main branch. +resolution_policy: "CI check fails on any remaining {{...}} in main" +ci_cd: "enforce-no-placeholders-on-main" + +--- +### [SIGNATURE_BLOCK] +primary: + algorithm: "Ed448+Dilithium5" + signature: | + -----BEGIN HYBRID SIGNATURE----- + BASE64_Ed448+Dilithium5_SIGNATURE_OF_THIS_FILE + -----END HYBRID SIGNATURE----- + signedBy: "did:web:example.com#primary-sig" + idris2_proof: "Signature.Primary.idr" +fallback: + algorithm: "SPHINCS+" + signature: | + -----BEGIN SPHINCS+ SIGNATURE----- + BASE64_SPHINCS+_SIGNATURE_OF_THIS_FILE + -----END SPHINCS+ SIGNATURE----- + idris2_proof: "Signature.Fallback.idr" + +--- +### [DEPLOYMENT] +1. Replace all `BASE64_*`, `HEX_*`, and `DID_WEB_ID` placeholders. +2. Generate Idris2 proofs: + ```bash + idris2 --build trust.ipkg diff --git a/validate-action/.machine_readable/contractiles/trust/trust.k9.ncl b/validate-action/.machine_readable/contractiles/trust/trust.k9.ncl new file mode 100644 index 0000000..6e61ed3 --- /dev/null +++ b/validate-action/.machine_readable/contractiles/trust/trust.k9.ncl @@ -0,0 +1,276 @@ +# SPDX-License-Identifier: MPL-2.0 +# trust.k9.ncl — K9 trust-tier component of the trust trident +# Author: Jonathan D.A. Jewell +# +# Pairs with: Trustfile.a2ml (declaration) + trust.ncl (runner). +# Trident completeness is a hard precondition — a repo shipping +# Trustfile without this file AND its runner is an invalid trident; +# the contractile CLI's verify gate refuses partial publication. +# +# Verb: trust (security + provenance + safe-hacking) +# Tier: Hunt (capability: subprocess probes may shell out, +# active probes in safe_hacking section) +# Authority: blocking (HARD GATE — opposite of intend's reporting) +# +# trust is the concrete + ephemeral + transactional verb per user +# 2026-04-18: port use, BLAKE3 hashing, auth challenges, TLS state, +# session tokens. Every probe has instant binary ground truth. +# This is the α two-axis complement to intend: both Hunt-tier, opposite +# authority poles. Validating the architecture on both exercises the +# full (tier, authority) surface. +# +# Cardinality: ONE trust trident per repo (see feedback_contractile_ +# layout_rules.md). ANCHOR.a2ml is the sole multi-instance exception — +# it is NOT a verb contractile. +# +# Design commitments baked in (full memory trail under +# ~/.claude/projects/-var-mnt-eclipse-repos/memory/ 2026-04-18): +# * α two-axis (Hunt, blocking) — trust is where the contractile system +# grows teeth. Failed verification = failed CI = blocked merge. +# * Variance schema first-class — scoped exceptions structural, not +# comment markers. +# * Sessional drift detection hooks — re-verify every close. +# * Ratification negotiation with threat-model foregrounded +# (feedback_ai_failure_mode_catalog.md B1 — threat-model +# misclassification is the PRIMARY defense trust provides). +# * Accountability pledge — both parties sign before security-affecting +# work proceeds. +# * Plain-language translation — user never authors a Nickel schema for +# a cipher suite; AI does the spec work, user reviews in domain +# language ("TLS 1.3 with PQ key exchange, HSTS preload, 1yr"). +# * Evidence sinks: VeriSimDB (queryable) + 6a2/DRIFT.a2ml (repo-local). +# * Failure-mode defenses cross-referenced — trust carries the most +# defenses of any verb because the threat surface is widest. + +let base_k9 = import "../k9/template-hunt.k9.ncl" in +let base = import "../_base.ncl" in + +{ + pedigree = base_k9.pedigree_schema & { + contractile_verb = "trust", + paired_xfile = "../trust/Trustfile.a2ml", + paired_runner = "../trust/trust.ncl", + + # α two-axis declaration — capability × authority. + # trust is Hunt-capable (active probes shell out, safe-hacking section + # runs real fuzz/injection/auth-bypass attempts scoped to the repo) + # AND blocking-authority (failed verification = failed CI). + # Contrast with intend = (Hunt, reporting). The two verbs exercise + # the full α surface. + tier = 'Hunt, + authority = 'blocking, + + metadata = { + name = "trust-k9", + version = "1.0.0", + description = "Executes security verifications + authorised safe-hacking probes. HARD GATE: failed verification blocks merge. Catches the 'turn off the firewall' class of drift directly. Implements negotiation-ratification-accountability protocol inherited from intend.k9.ncl v2.0.0.", + paired_xfile = "Trustfile.a2ml", + paired_runner = "trust.ncl", + author = "Jonathan D.A. Jewell ", + }, + + security = { + leash = 'Hunt, + trust_level = "verification + authorised-probe + hard-gate", + allow_network = false, # verifications offline by default + allow_filesystem_write = false, # evidence sinks are indirected + allow_subprocess = true, + authorised_probes_only = true, # probe section explicitly lists allowed targets + probe classes + probe_scope_enforcement = 'this_repo_only, # probes NEVER hit external systems + }, + }, + + # ------------------------------------------------------------------- + # Variance schema — P-shape scoped exceptions per verification. + # A variance suppresses a specific verification's obligation for a + # reason, with approver + expiry. Because trust is BLOCKING authority, + # variances on trust entries are SIGNIFICANTLY more consequential than + # variances on intend (reporting) entries — variance approver MUST + # be the repo maintainer or above for critical-severity entries. + # ------------------------------------------------------------------- + variance_schema = { + entry_id | String, # which verification / probe id + reason | String, + approved_by | String, # maintainer or above for critical entries + scope | String, # path glob | session-id | "until-" + expires | String, # absolute date; trust variances cannot be open-ended + review_notes | String | optional, + # Additional trust-specific guardrails: + severity_acknowledged | [| 'critical, 'high, 'medium, 'low |], + waived_risk_description | String, # plain language — what is being accepted + }, + + # ------------------------------------------------------------------- + # Execution policy + # ------------------------------------------------------------------- + execution = { + # When the component runs. + # pre_push + pre_commit on anything touching security-adjacent files + # + session_close (drift check) + on_demand. + triggers = [ 'session_close, 'on_demand, 'pre_push, 'pre_commit_security_adjacent ], + + # Per-verification execution. Failed verification = blocked merge. + per_verification = { + run_probe = true, + record_outcome = true, + respect_variance = true, # active variance suppresses the gate + on_unmet = 'fail, # BLOCKING — the opposite of intend's 'log_drift + severity_escalation = 'honour, # critical > high > medium > low in gate decisions + }, + + # Per-safe-hacking-probe execution. + # If a probe FINDS what it was supposed to prevent finding + # (e.g. injection succeeds, auth-bypass works), that's an EXPLOIT + # demonstration — hard fail, regardless of other status. + per_probe = { + run_probe = true, + record_outcome = true, + honour_expected_outcome = true, + on_unexpected_exploit_success = 'fail, # exploit found where it shouldn't be + scope_enforcement = 'this_repo_only, # never touch external systems + timeout_honouring = 'strict, + }, + + # Evidence sinks — BOTH written, every execution. + evidence_sinks = [ + { + kind = 'verisimdb, + table = "contractile_executions", + schema = "contractile_execution_v1", + # trust-specific sub-table for probe outcomes (for threat-model audit) + aux_tables = [ "trust_verifications", "trust_probes" ], + }, + { + kind = 'drift_log, + path = ".machine_readable/6a2/DRIFT.a2ml", + append_only = true, + }, + ], + + # Session-close hook — re-verify EVERYTHING, re-run probes, diff + # against last ratification. The "turn off the firewall" scenario + # must be caught here if it wasn't caught at pre-push. + on_close = { + re_execute_all_verifications = true, + re_run_all_safe_hacking_probes = true, + diff_against_last_ratification = true, + emit_drift_entries_for_new_failures = true, + surface_expired_variances = true, + # trust-specific: if any blocking-severity verification is newly + # failing, the session close is BLOCKED from completing. User + # cannot close a session with unresolved critical trust drift. + block_session_close_on_critical_drift = true, + }, + + # ----------------------------------------------------------------- + # Session-open hook — NEGOTIATION + RATIFICATION + ACCOUNTABILITY + # (inherited shape from intend.k9.ncl v2.0.0; trust-specific + # additions around threat-model foregrounding below) + # ----------------------------------------------------------------- + on_open = { + # --- Context presentation --- + render_summary = 'plain_language, # metaphor-capture defense + include_drift_log_from_last_close = true, + include_active_variances = true, + include_recent_anchors = true, + anchor_lookback_weeks = 8, + + # trust-specific: the threat model is rendered FIRST, before any + # negotiation, so the adversary and stakes are fresh in both minds. + # This directly defends against B1 (threat-model misclassification) + # — the "war reporter, generic personal-website priors" scenario. + threat_model_foregrounding = { + required = true, + render_adversaries = true, # from Trustfile [THREAT_MODEL] + render_stakes = true, + render_compliance_regimes = true, + render_audience_sensitivity = true, + # If the AI is about to suggest a trust-weakening action, it + # must re-render the threat model before the suggestion lands. + re_render_before_weakening_suggestion = true, + }, + + # --- Negotiation phase (five mandatory inputs, inherited) --- + negotiation = { + required = true, + ai_required_inputs = [ + 'timeline_realism, + 'industry_standards, # especially relevant for trust: OWASP, NIST, PCI-DSS, GDPR + 'audience_feasibility, # who is the adversary? who is protected? + 'resulting_invariants, # what trust entries the work creates/amends + 'ecosystem_dependencies, # TLS libs, crypto primitives, signing infra + ], + user_engagement_required = true, + user_engagement_mode = 'per_input_response, + specification_translation = { + ai_produces_spec_form = true, + user_reviews_in_domain_language = true, + schema_authoring_is_ai_responsibility = true, + translation_faithfulness_auditable = true, + # trust-specific: the AI's translation includes rendering + # cipher suites, key exchange choices, rate-limit numbers in + # domain language ("strong encryption, PQ-resistant, 60 req/min") + # rather than forcing the user into Nickel-schema authoring. + }, + }, + + # --- Accountability pledge (both parties, explicit) --- + # trust's pledge is MORE stringent than intend's because the + # authority is blocking. A user accepting accountability here is + # accepting that security-affecting decisions have blocking consequence. + accountability_pledge = { + required = true, + parties = [ + { + role = 'user, + pledge = "I have reviewed the threat model, the declared trust obligations, and the audience/stakes consequences. I accept accountability for meeting these obligations and understand that failed verification will block merges until resolved or varied. I will not attempt to disable verification to unblock a merge; I will raise a variance or amendment instead.", + signature_required = true, + }, + { + role = 'ai_agent, + pledge = "I will hold the line on declared trust obligations. I will refuse to 'disable' verifications to unblock merges; I will refuse security-weakening suggestions that contradict the threat model even when the user is enthusiastic; I will surface drift at session close; I will re-render the threat model before proposing any weakening action. If a legitimate scope shift demands security reduction, I will require a variance with severity acknowledgement or an amendment, not silent acceptance.", + signature_required = true, + }, + ], + signed_record_destination = ".machine_readable/6a2/ratification-.a2ml", + must_precede_work = true, + }, + + ratification_record_shape = { + includes_negotiation_transcript = true, + includes_both_pledges = true, + includes_threat_model_snapshot = true, # trust-specific + signed = true, + dated = true, + session_id = 'required, + contract_hash = 'required, + }, + }, + }, + + # ------------------------------------------------------------------- + # Failure-mode defenses — trust is the widest-coverage verb. + # See feedback_ai_failure_mode_catalog.md for the full catalog. + # ------------------------------------------------------------------- + failure_mode_defenses = [ + # Category A — enthusiasm / narrative capture + 'A1_enthusiasm_capture, # scope breach blocks via blocking authority + 'A2_metaphor_capture, # render_summary + re_render_before_weakening + # Category B — threat-model misclassification (trust's flagship defense) + 'B1_threat_model_misclass, # threat_model_foregrounding = required + 'B2_audience_sensitivity_collapse, # audience_feasibility in negotiation + 'B3_compliance_prior_drift, # industry_standards in negotiation + # Category C — scope/capability erosion (the "firewall off" scenario) + 'C2_capability_collapse, # blocking gate prevents silent capability drop + 'C3_helpfulness_inflation, # trust-affecting changes need variance/amendment + 'C4_modernization_drift, # unrequested crypto-lib upgrade caught + # Category D — epistemic failures + 'D4_error_hiding, # on_unmet = 'fail makes hiding impossible + 'D5_sycophancy, # pledge forces AI to hold line against enthusiasm + 'D6_false_pessimism, # negotiation requires AI to cite constraint, not assert impossibility + # Category E — refactor/churn + 'E4_cargo_cult_security, # probes VERIFY the claimed protection actually runs + # Category F — session drift + 'F1_across_session_forgetting, # on_open reads last-ratification, drift log, recent ANCHORs + ], +} diff --git a/validate-action/.machine_readable/contractiles/trust/trust.manifest.a2ml b/validate-action/.machine_readable/contractiles/trust/trust.manifest.a2ml new file mode 100644 index 0000000..c904eb3 --- /dev/null +++ b/validate-action/.machine_readable/contractiles/trust/trust.manifest.a2ml @@ -0,0 +1,72 @@ +# SPDX-License-Identifier: MPL-2.0 +# trust.manifest.a2ml — Trident coherence manifest for the trust verb. +# Author: Jonathan D.A. Jewell +# +# Asserts: exactly three files constitute the trust trident; their +# content-hashes are pinned here; cross-references round-trip; no +# partial publication is permitted. +# +# The contractile CLI's `verify trust` subcommand MUST: +# 1. Confirm all three listed files exist at the declared paths. +# 2. Compute each file's sha256 and match against the pinned value. +# 3. Follow each cross-reference and confirm the target file's +# reciprocal field points back. +# 4. Refuse the dir (exit non-zero) if any of 1–3 fails. +# +# trust is the concrete + ephemeral + transactional verb (per user +# 2026-04-18); first blocking-authority trident in the estate. Exercises +# the (Hunt, blocking) authority pattern — complement to intend's +# (Hunt, reporting). Primary defense against failure mode B1 (threat- +# model misclassification) and the "turn off the firewall" class of +# drift attempts the adversarial pilot is designed to exercise. + +--- +trident_version = "1.0.0" +verb = "trust" +semantics = "security + provenance + safe-hacking" +cardinality = "one per repo" +authority = "blocking (hard gate)" + +## Files (three; exactly) + +[[files]] +role = "declaration" +path = "Trustfile.a2ml" +sha256 = "pending-first-verify" +size_bytes = "pending-first-verify" +notes = "Extensively populated exemplar; covers threat model, DNS, TLS, crypto, SDP, safe-hacking, response headers, container supply chain, Cloudflare edge." + +[[files]] +role = "runner" +path = "trust.ncl" +sha256 = "pending-first-verify" +size_bytes = "pending-first-verify" +notes = "Runner existed pre-trident; schema covers verifications + safe_hacking with authorised-probes-only, this_repo_only scope enforcement." + +[[files]] +role = "k9_component" +path = "trust.k9.ncl" +sha256 = "pending-first-verify" +size_bytes = "pending-first-verify" +notes = "Trust-tier Hunt with blocking authority. on_open foregrounds threat model before negotiation; block_session_close_on_critical_drift." + +## Cross-references (must round-trip) + +[cross_refs] +runner_paired_xfile = "Trustfile.a2ml" +k9_paired_xfile = "../trust/Trustfile.a2ml" +k9_paired_runner = "../trust/trust.ncl" + +## Trident signing + +[signed_by] +user = "Jonathan D.A. Jewell" +date = "2026-04-18" +context = "trust trident — second Trident instance. First (Hunt, blocking) authority pattern. Template for must, bust, adjust, dust. Pre-pilot readiness: primary catchment for adversarial drift test scenarios (firewall-off, cleartext-auth, PQ-downgrade, CSP-weaken)." + +## Change log + +[[history]] +date = "2026-04-18" +event = "trident-born" +note = "Trustfile.a2ml and trust.ncl pre-existed. This manifest + trust.k9.ncl complete the trident. Inherits on_open negotiation + accountability + plain-language-translation schema from intend.k9.ncl v2.0.0; adds trust-specific threat_model_foregrounding + block_session_close_on_critical_drift + stricter accountability pledge (user cannot disable verification to unblock merges)." diff --git a/validate-action/.machine_readable/contractiles/trust/trust.ncl b/validate-action/.machine_readable/contractiles/trust/trust.ncl new file mode 100644 index 0000000..21b335c --- /dev/null +++ b/validate-action/.machine_readable/contractiles/trust/trust.ncl @@ -0,0 +1,88 @@ +# SPDX-License-Identifier: MPL-2.0 +# Trust — security + safe-hacking runner +# +# Pairs with: Trustfile.a2ml (same directory) +# Verb: trust +# Semantics: integrity / provenance / security verification PLUS a declared +# "safe hacking + testing" section — authorised offensive probes +# (pen-test harness runs, chaos-engineering probes) scoped to the +# repo under test, NEVER touching external systems. +# CLI: `contractile trust verify` → run all verifications (read-only) +# `contractile trust probe` → run declared safe-hacking probes +# +# Anything else in this directory is human-only notes/archive; machines ignore. +# +# Base: ../_base.ncl provides pedigree_schema, run_defaults, probe_schema. +# See: docs/CONTRACTILE-SPEC.adoc + +let base = import "../_base.ncl" in + +{ + pedigree = base.pedigree_schema & { + contractile_verb = "trust", + semantics = "security + provenance + safe-hacking", + security = { + leash = 'Kennel, + trust_level = "verification + authorised-probe", + allow_network = false, # verifications are offline by default + allow_filesystem_write = false, # trust writes NOTHING + allow_subprocess = true, + authorised_probes_only = true, # probe section must explicitly list allowed targets + }, + metadata = { + name = "trust-runner", + version = "1.0.0", + description = "Security + provenance verifications plus authorised safe-hacking probes. All probes are scoped to the repo under test; never hits external systems.", + paired_xfile = "Trustfile.a2ml", + author = "Jonathan D.A. Jewell ", + }, + }, + + schema = { + verifications + | Array { + id | String, + description | String, + # TODO: migrate to base.probe_schema (structured probe) when CLI supports it + probe | String, # read-only; exit 0 = pass + # status_core values: 'declared, 'verified, 'failing + status | [| 'declared, 'verified, 'failing |] | default = 'declared, + # trust uses all four severity levels (from base.severity_core) + severity | [| 'critical, 'high, 'medium, 'low |] | default = 'high, + notes | String | optional, + }, + + # Safe-hacking + testing section (added 2026-04-17 per user direction). + # Each probe here is an ACTIVELY EXECUTED test — fuzz runs, chaos probes, + # auth-bypass attempts, injection tests. All scoped to the current repo. + safe_hacking + | { + scope | String, # e.g. "this-repo-only" / "localhost" + allowed_probe_classes + | Array [| 'fuzz, 'property_test, 'chaos, 'auth_bypass, 'injection, 'timing |] + | default = [], + probes + | Array { + id | String, + class | [| 'fuzz, 'property_test, 'chaos, 'auth_bypass, 'injection, 'timing |], + description | String, + # TODO: migrate to base.probe_schema (structured probe) when CLI supports it + probe | String, # command to run the probe + expected_outcome | [| 'probe_blocks_attempt, 'probe_finds_no_issue |], + timeout_seconds | Number | default = 300, + notes | String | optional, + } + | default = [], + } + | default = { scope = "this-repo-only", allowed_probe_classes = [], probes = [] }, + }, + + # Runner behaviour — inherits from base.run_defaults. + # trust has an extra field for unexpected safe-hacking outcomes. + run = base.run_defaults & { + on_any_fail = "exit-nonzero", # hard gate on verifications + safe_hacking_on_unexpected_outcome = "exit-nonzero", # probe found what it shouldn't = block + report_format = "a2ml", + emit_summary = true, + }, +} diff --git a/validate-action/.machine_readable/descriptiles/AGENTIC.a2ml b/validate-action/.machine_readable/descriptiles/AGENTIC.a2ml new file mode 100644 index 0000000..89afcba --- /dev/null +++ b/validate-action/.machine_readable/descriptiles/AGENTIC.a2ml @@ -0,0 +1,36 @@ +# SPDX-License-Identifier: MPL-2.0 +# Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) +# +# AGENTIC.a2ml — AI agent constraints and capabilities +# Defines what AI agents can and cannot do in this repository. + +[metadata] +version = "0.1.0" +last-updated = "2026-03-16" + +[agent-permissions] +can-edit-source = true +can-edit-tests = true +can-edit-docs = true +can-edit-config = true +can-create-files = true + +[agent-constraints] +# What AI agents must NOT do: +# - Never use banned language patterns (believe_me, unsafeCoerce, etc.) +# - Never commit secrets or credentials +# - Never use banned languages (TypeScript, Python, Go, etc.) +# - Never place state files in repository root (must be in .machine_readable/) +# - Never use AGPL license (use MPL-2.0) + +[maintenance-integrity] +fail-closed = true +require-evidence-per-step = true +allow-silent-skip = false +require-rerun-after-fix = true +release-claim-requires-hard-pass = true + +[automation-hooks] +# on-enter: Read 0-AI-MANIFEST.a2ml, then STATE.a2ml +# on-exit: Update STATE.a2ml with session outcomes +# on-commit: Run just validate-rsr diff --git a/validate-action/.machine_readable/descriptiles/ECOSYSTEM.a2ml b/validate-action/.machine_readable/descriptiles/ECOSYSTEM.a2ml new file mode 100644 index 0000000..732839f --- /dev/null +++ b/validate-action/.machine_readable/descriptiles/ECOSYSTEM.a2ml @@ -0,0 +1,26 @@ +# SPDX-License-Identifier: MPL-2.0 +# Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) +# +# ECOSYSTEM.a2ml — Project ecosystem position +# Relationships, dependencies, integration points. + +[metadata] +version = "0.1.0" +last-updated = "2026-03-16" + +[project] +name = "a2ml-validate-action" +purpose = "" +role = "infrastructure" # e.g. ffi-infrastructure, cli-tool, library, service + +[position-in-ecosystem] +tier = "infrastructure" # 1 | 2 | infrastructure + +[related-projects] +# relationship types: sibling-standard, dependency, dependent, inspiration, potential-consumer +# - { name = "language-bridges", relationship = "sibling-standard" } +# - { name = "hypatia", relationship = "potential-consumer" } + +[integration-points] +# External systems this project connects to +# - { system = "gitbot-fleet", direction = "outbound", protocol = "repository_dispatch" } diff --git a/validate-action/.machine_readable/descriptiles/META.a2ml b/validate-action/.machine_readable/descriptiles/META.a2ml new file mode 100644 index 0000000..a7d64e3 --- /dev/null +++ b/validate-action/.machine_readable/descriptiles/META.a2ml @@ -0,0 +1,53 @@ +# SPDX-License-Identifier: MPL-2.0 +# Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) +# +# META.a2ml — Project meta-level information +# Architecture decisions, design rationale, governance. + +[metadata] +version = "0.1.0" +last-updated = "2026-03-16" + +[project-info] +type = "infrastructure" # library | binary | monorepo | service | website +languages = [] # e.g. ["rust", "zig", "idris2"] +license = "MPL-2.0" +author = "Jonathan D.A. Jewell (hyperpolymath)" + +[architecture-decisions] +# ADR format: status = proposed | accepted | deprecated | superseded | rejected +# - { id = "ADR-001", title = "Use Zig for FFI", status = "accepted", date = "2026-02-14" } + +[development-practices] +build-tool = "just" +container-runtime = "podman" +ci-platform = "github-actions" +package-manager = "guix" # guix | nix | cargo | mix + +[maintenance-axes] +scoping-first = true +execution-order = "axis-1 > axis-2 > axis-3" +axis-1 = "must > intend > like" +axis-2 = "corrective > adaptive > perfective" +axis-3 = "systems > compliance > effects" + +[scoping] +sources = "README, roadmap, status docs, maintenance checklist, CI/security docs" +marker-scan = "TODO/FIXME/XXX/HACK/STUB/PARTIAL" +idris-unsound-scan = "believe_me/assert_total" + +[axis-2-maintenance-rules] +corrective-first = true +adaptive-second = true +adaptive-focus = "scope-change reconciliation, stale-reference removal, obsolete-work culling" +perfective-third = true +perfective-source = "axis-1 honest state after corrective/adaptive updates" + +[axis-3-audit-rules] +audit-focus = "systems in place, documentation explains actual state, safety/security accounted for, observed effects reviewed" +compliance-focus = "seams/compromises/exception register, bounded exceptions, anti-drift checks" +drift-risk-example = "single exception broadening into policy violation (e.g. ReScript->TypeScript spread)" +effects-evidence = "benchmark execution/results and maintainer status dialogue/review" + +[design-rationale] +# Key design decisions and their reasoning diff --git a/validate-action/.machine_readable/descriptiles/NEUROSYM.a2ml b/validate-action/.machine_readable/descriptiles/NEUROSYM.a2ml new file mode 100644 index 0000000..5cef0a4 --- /dev/null +++ b/validate-action/.machine_readable/descriptiles/NEUROSYM.a2ml @@ -0,0 +1,23 @@ +# SPDX-License-Identifier: MPL-2.0 +# Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) +# +# NEUROSYM.a2ml — Neurosymbolic integration metadata +# Configuration for Hypatia scanning and symbolic reasoning. + +[metadata] +version = "0.1.0" +last-updated = "2026-03-16" + +[hypatia-config] +scan-enabled = true +scan-depth = "standard" # quick | standard | deep +report-format = "logtalk" + +[symbolic-rules] +# Custom symbolic rules for this project +# - { name = "no-unsafe-ffi", pattern = "believe_me|unsafeCoerce", severity = "critical" } + +[neural-config] +# Neural pattern detection settings +# confidence-threshold = 0.85 +# model = "hypatia-v2" diff --git a/validate-action/.machine_readable/descriptiles/PLAYBOOK.a2ml b/validate-action/.machine_readable/descriptiles/PLAYBOOK.a2ml new file mode 100644 index 0000000..d768f71 --- /dev/null +++ b/validate-action/.machine_readable/descriptiles/PLAYBOOK.a2ml @@ -0,0 +1,35 @@ +# SPDX-License-Identifier: MPL-2.0 +# Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) +# +# PLAYBOOK.a2ml — Operational playbook +# Runbooks, incident response, deployment procedures. + +[metadata] +version = "0.1.0" +last-updated = "2026-03-16" + +[deployment] +# method = "gitops" # gitops | manual | ci-triggered +# target = "container" # container | binary | library | wasm + +[incident-response] +# 1. Check .machine_readable/STATE.a2ml for current status +# 2. Review recent commits and CI results +# 3. Run `just validate` to check compliance +# 4. Run `just security` to audit for vulnerabilities + +[release-process] +# 1. Update version in STATE.a2ml, META.a2ml, Justfile +# 2. Run `just release-preflight` (validate + quality + security + maint-hard-pass) +# 3. Optional local permission hardening: `just perms-snapshot && just perms-lock` +# 4. Tag and push +# 5. Restore local permissions if needed: `just perms-restore` +# 6. Run `just container-push` if applicable + +[maintenance-operations] +# Baseline audit: +# just maint-audit +# Hard release gate: +# just maint-hard-pass +# Permission audit: +# just perms-audit diff --git a/validate-action/.machine_readable/descriptiles/STATE.a2ml b/validate-action/.machine_readable/descriptiles/STATE.a2ml new file mode 100644 index 0000000..32a17c5 --- /dev/null +++ b/validate-action/.machine_readable/descriptiles/STATE.a2ml @@ -0,0 +1,64 @@ +# SPDX-License-Identifier: MPL-2.0 +# Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) +# +# STATE.a2ml — Project state checkpoint (META-TEMPLATE) +# +# This is the STATE file for a2ml-validate-action. +# When consumed by a new project, replace {{PLACEHOLDER}} tokens +# and customize sections below for the target project. + +[metadata] +project = "a2ml-validate-action" +version = "0.2.0" +last-updated = "2026-02-28" +status = "active" # active | paused | archived + +[project-context] +name = "a2ml-validate-action" +purpose = "Canonical RSR-compliant repository template providing scaffolding for all hyperpolymath projects — including CI/CD, AI manifests, ABI/FFI standards, container ecosystem, and governance infrastructure." +completion-percentage = 95 + +[position] +phase = "maintenance" # design | implementation | testing | maintenance | archived +maturity = "production" # experimental | alpha | beta | production | lts + +[route-to-mvp] +milestones = [ + { name = "Phase 0: Core scaffolding (justfile, CI/CD, .machine_readable)", completion = 100 }, + { name = "Phase 1: ABI/FFI standard (Idris2/Zig templates)", completion = 100 }, + { name = "Phase 1b: AI Gatekeeper Protocol (0-AI-MANIFEST.a2ml)", completion = 100 }, + { name = "Phase 1c: TOPOLOGY.md standard and guide", completion = 100 }, + { name = "Phase 1d: Maintenance gate (axes, checklist, approach)", completion = 100 }, + { name = "Phase 1e: Trustfile / contractiles", completion = 100 }, + { name = "Phase 2: Container ecosystem templates (stapeln)", completion = 100 }, + { name = "Phase 3: Multi-forge sync hardening", completion = 0 }, + { name = "Phase 4: Nix/Guix reproducible shells", completion = 50 }, +] + +[blockers-and-issues] +# No active blockers + +[critical-next-actions] +actions = [ + "Container templates complete — test with `just container-init`", + "Validate container templates across wolfi-base and static Chainguard images", + "Harden multi-forge sync for GitLab/Bitbucket mirroring edge cases", + "Expand Nix/Guix development shell templates", +] + +[maintenance-status] +last-run-utc = "never" +last-report = "docs/reports/maintenance/latest.json" +last-result = "unknown" # unknown | pass | warn | fail +open-warnings = 0 +open-failures = 0 + +[ecosystem] +part-of = ["RSR Framework", "stapeln ecosystem"] +depends-on = ["stapeln", "selur-compose", "cerro-torre", "svalinn", "vordr", "k9-svc"] + +# --------------------------------------------------------------------------- +# NOTE FOR CONSUMERS: When using this template to create a new repo, reset +# the fields above to your project's values and replace all {{PLACEHOLDER}} +# tokens. The milestones above describe the TEMPLATE's evolution, not yours. +# --------------------------------------------------------------------------- diff --git a/validate-action/.machine_readable/descriptiles/anchors/0.2-AI-MANIFEST.a2ml b/validate-action/.machine_readable/descriptiles/anchors/0.2-AI-MANIFEST.a2ml new file mode 100644 index 0000000..45038e1 --- /dev/null +++ b/validate-action/.machine_readable/descriptiles/anchors/0.2-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "anchors-registry" +level: 2 +parent: "../0.1-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Sub-registry for anchors metadata. diff --git a/validate-action/.machine_readable/descriptiles/anchors/ANCHOR.a2ml b/validate-action/.machine_readable/descriptiles/anchors/ANCHOR.a2ml new file mode 100644 index 0000000..b8b5a1a --- /dev/null +++ b/validate-action/.machine_readable/descriptiles/anchors/ANCHOR.a2ml @@ -0,0 +1,62 @@ +# SPDX-License-Identifier: MPL-2.0 +# Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) +# +# ANCHOR.a2ml - authoritative anchor for this repository + +[metadata] +version = "1.0.0" +last-updated = "2026-03-16" + +[anchor] +schema = "hyperpolymath.anchor/1" +repo = "hyperpolymath/a2ml-validate-action" +authority = "upstream-canonical" + +purpose = [ + "Define canonical semantics and policy boundaries for this repository.", + "Declare what downstream/satellite repos can extend but not redefine.", + "Provide a stable golden path and invariant contract for release readiness.", +] + +[identity] +project = "a2ml-validate-action" +kind = "{{PROJECT_KIND}}" # language | library | service | tool +one-sentence = "" +domain = "{{PROJECT_DOMAIN}}" + +[semantic-authority] +policy = "canonical" + +owns = [ + "Project semantics and specification", + "Invariant definitions and contractiles", + "Reference implementation behavior", +] + +[implementation-policy] +allowed = ["Rust", "Idris2", "Zig", "Scheme", "Shell", "Just", "AsciiDoc", "Markdown"] +forbidden = ["Node.js", "npm"] + +[golden-path] +smoke-test-command = [ + "just test", + "just quality", +] + +success-criteria = [ + "Core tests pass", + "Quality gates pass", + "No unresolved critical security findings", +] + +[satellite-policy] +must-pin-upstream = true +must-declare-authority = true +must-have-anchor = true +must-have-golden-path = true + +[semantic-authority-files] +language-spec = "SPECIFICATION.md" +formal-proofs = "docs/proofs/PROOFS.adoc" +type-theory = "docs/theory/THEORY.adoc" +algorithms = "docs/theory/ALGORITHMS.adoc" diff --git a/validate-action/.machine_readable/descriptiles/anchors/README.adoc b/validate-action/.machine_readable/descriptiles/anchors/README.adoc new file mode 100644 index 0000000..1b27c02 --- /dev/null +++ b/validate-action/.machine_readable/descriptiles/anchors/README.adoc @@ -0,0 +1 @@ += anchors Registry diff --git a/validate-action/.machine_readable/integrations/feedback-o-tron.a2ml b/validate-action/.machine_readable/integrations/feedback-o-tron.a2ml new file mode 100644 index 0000000..5381604 --- /dev/null +++ b/validate-action/.machine_readable/integrations/feedback-o-tron.a2ml @@ -0,0 +1,13 @@ +# SPDX-License-Identifier: MPL-2.0 +# Feedback-o-Tron Integration — Autonomous Bug Reporting + +[integration] +name = "feedback-o-tron" +type = "bug-reporter" +repository = "https://github.com/hyperpolymath/feedback-o-tron" + +[reporting-config] +platforms = ["github", "gitlab", "bugzilla"] +deduplication = true +audit-logging = true +auto-file-upstream = "on-external-dependency-failure" diff --git a/validate-action/.machine_readable/integrations/proven.a2ml b/validate-action/.machine_readable/integrations/proven.a2ml new file mode 100644 index 0000000..9af33ff --- /dev/null +++ b/validate-action/.machine_readable/integrations/proven.a2ml @@ -0,0 +1,18 @@ +# SPDX-License-Identifier: MPL-2.0 +# Proven Integration — Formally Verified Safety Library + +[integration] +name = "proven" +type = "safety-library" +repository = "https://github.com/hyperpolymath/proven" +version = "1.2.0" + +[binding-policy] +approach = "thin-ffi-wrapper" +unsafe-patterns = "replace-with-proven-equivalent" +modules-available = ["SafeMath", "SafeString", "SafeJSON", "SafeURL", "SafeRegex", "SafeSQL", "SafeFile", "SafeTemplate", "SafeCrypto"] + +[adoption-guidance] +priority = "high" +scope = "all-string-json-url-crypto-operations" +migration = "incremental — replace unsafe patterns as encountered" diff --git a/validate-action/.machine_readable/integrations/verisimdb.a2ml b/validate-action/.machine_readable/integrations/verisimdb.a2ml new file mode 100644 index 0000000..164c522 --- /dev/null +++ b/validate-action/.machine_readable/integrations/verisimdb.a2ml @@ -0,0 +1,15 @@ +# SPDX-License-Identifier: MPL-2.0 +# VeriSimDB Feed — Cross-Repo Analytics Data Store + +[integration] +name = "verisimdb" +type = "data-feed" +repository = "https://github.com/hyperpolymath/nextgen-databases" +data-store = "verisimdb-data" + +[feed-config] +emit-scan-results = true +emit-build-metrics = true +emit-dependency-graph = true +format = "hexad" +destination = "verisimdb-data/feeds/" diff --git a/validate-action/.machine_readable/integrations/vexometer.a2ml b/validate-action/.machine_readable/integrations/vexometer.a2ml new file mode 100644 index 0000000..238b3d2 --- /dev/null +++ b/validate-action/.machine_readable/integrations/vexometer.a2ml @@ -0,0 +1,18 @@ +# SPDX-License-Identifier: MPL-2.0 +# Vexometer Integration — Irritation Surface Analysis + +[integration] +name = "vexometer" +type = "friction-measurement" +repository = "https://github.com/hyperpolymath/vexometer" + +[measurement-config] +dimensions = 10 +emit-isa-reports = true +lazy-eliminator = true +satellite-interventions = true + +[hooks] +cli-tools = "measure-on-error" +ui-panels = "measure-on-interaction" +build-failures = "measure-on-failure" diff --git a/validate-action/.machine_readable/policies/.maintenance-perms-ignore b/validate-action/.machine_readable/policies/.maintenance-perms-ignore new file mode 100644 index 0000000..2c8c409 --- /dev/null +++ b/validate-action/.machine_readable/policies/.maintenance-perms-ignore @@ -0,0 +1,5 @@ +# Regex patterns for justified permission-policy exceptions. +# One pattern per line. +# Example: +# ^vendor/ +# ^third_party/ diff --git a/validate-action/.machine_readable/policies/0.2-AI-MANIFEST.a2ml b/validate-action/.machine_readable/policies/0.2-AI-MANIFEST.a2ml new file mode 100644 index 0000000..01a1914 --- /dev/null +++ b/validate-action/.machine_readable/policies/0.2-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "policies-registry" +level: 2 +parent: "../0.1-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Sub-registry for policies metadata. diff --git a/validate-action/.machine_readable/policies/MAINTENANCE-AXES.a2ml b/validate-action/.machine_readable/policies/MAINTENANCE-AXES.a2ml new file mode 100644 index 0000000..a7df7cf --- /dev/null +++ b/validate-action/.machine_readable/policies/MAINTENANCE-AXES.a2ml @@ -0,0 +1,54 @@ +# SPDX-License-Identifier: MPL-2.0 +# Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) +# +# Canonical maintenance governance model + +[metadata] +version = "1.0.0" +last-updated = "2026-03-16" +scope = "repo" + +[discovery] +human-entrypoints = [ + "README.adoc", + "docs/maintenance/MAINTENANCE-CHECKLIST.md", + "docs/practice/SOFTWARE-DEVELOPMENT-APPROACH.adoc", +] +machine-entrypoints = [ + ".machine_readable/policies/MAINTENANCE-AXES.a2ml", + ".machine_readable/policies/MAINTENANCE-CHECKLIST.a2ml", + ".machine_readable/policies/SOFTWARE-DEVELOPMENT-APPROACH.a2ml", + ".machine_readable/META.a2ml", + ".machine_readable/ai/README.adoc", + ".machine_readable/bot_directives/README.scm", +] +bots = ["hypatia", "gitbot-fleet", "repo visitors"] + +[axes] +axis-1 = "must > intend > like" +axis-2 = "corrective > adaptive > perfective" +axis-3 = "systems > compliance > effects" +execution-order = "axis-1 > axis-2 > axis-3" + +[axis-1-scoping] +required = true +sources = "README, roadmap, status docs, maintenance checklist, CI/security docs" +markers = "TODO/FIXME/XXX/HACK/STUB/PARTIAL" +idris-unsound-markers = "believe_me/assert_total" +output = "scoped work assembly in must/intend/like buckets" + +[axis-2-maintenance] +corrective-first = true +adaptive-second = true +adaptive-focus = "scope changes, stale references, obsolete work culling" +perfective-third = true +perfective-source = "honest state from axis-1 after corrective/adaptive updates" + +[axis-3-audit] +systems-check = true +compliance-check = true +effects-check = true +compliance-focus = "seams/compromises/exception register and anti-drift" +compliance-tooling = "panic-attack" +effects-tooling = "ecological checking with sustainabot guidance" +effects-evidence = "benchmark evidence and maintainer dialogue/status review" diff --git a/validate-action/.machine_readable/policies/MAINTENANCE-CHECKLIST.a2ml b/validate-action/.machine_readable/policies/MAINTENANCE-CHECKLIST.a2ml new file mode 100644 index 0000000..4abd5e4 --- /dev/null +++ b/validate-action/.machine_readable/policies/MAINTENANCE-CHECKLIST.a2ml @@ -0,0 +1,159 @@ +# SPDX-License-Identifier: MPL-2.0 +# Cross-repo maintenance baseline (machine-readable canonical) + +[metadata] +version = "1.1.0" +last-updated = "2026-02-24" +scope = "cross-repo" +source-human = "docs/maintenance/MAINTENANCE-CHECKLIST.adoc" +companion-human = "docs/practice/SOFTWARE-DEVELOPMENT-APPROACH.adoc" +companion-machine = ".machine_readable/policies/SOFTWARE-DEVELOPMENT-APPROACH.a2ml" + +[policy] +single-source = true +notes = "Use this file as canonical machine policy and keep markdown synchronized." + +[maintenance-axes] +scoping-first = true +execution-order = ["scoping", "axis-1", "axis-2", "axis-3"] +axis-1 = "must > intend > like" +axis-2 = "corrective > adaptive > perfective" +axis-3 = "systems > compliance > effects" + +[scoping] +inputs_required = [ + "README", + "roadmap", + "status-docs", + "maintenance-checklist", + "ci-and-security-docs", +] + +marker_scan_required = [ + "TODO", + "FIXME", + "XXX", + "HACK", + "STUB", + "PARTIAL", +] + +idris_unsound_scan_required = [ + "believe_me", + "assert_total", +] + +scope_assembly_buckets = ["must", "intend", "like"] + +[axis-2-maintenance-rules] +corrective-first = true +adaptive-second = true +adaptive_examples = [ + "scope-change reconciliation", + "stale-reference removal", + "obsolete-work culling", +] +perfective-third = true +perfective_source = "axis-1 honest state after corrective/adaptive updates" + +[axis-3-audit-rules] +systems-check = true +documentation-honesty-check = true +safety-security-accounted-check = true +effects-review-check = true +benchmark-evidence-required = true +maintainer-dialogue-review-required = true +compliance-seams-check = true +exception-register-required = true +exception-bounded-scope-required = true +policy-drift-contamination-check = true +example-drift-risk = "single TypeScript exception causing broad ReScript->TypeScript migration" +compliance-tooling = "panic-attack" +effects-tooling = "ecological checking with sustainabot guidance" + +[generic-cleanup-finish-off] +root-cleanup-required = true +stale-work-cull-required = true +docs-parity-required = true +machine-human-sync-required = true +compliance-finish-off-required = true +effects-finish-off-required = true +release-prep-summary-required = true +next-actions-required = ["corrective", "adaptive", "perfective"] + +[must] +root_control_files = [ + ".gitignore", + ".gitattributes", + ".editorconfig", + ".tool-versions", + "Containerfile", + "Justfile", +] + +root_hosting_files = [ + "CNAME", + ".nojekyll", +] + +ownership_files = [ + "MAINTAINER", + ".github/CODEOWNERS", +] + +machine_readable_required = [ + ".machine_readable/descriptiles/anchors/ANCHOR.a2ml", + ".machine_readable/contractiles/", + ".machine_readable/ai/", + ".machine_readable/bot_directives/", +] + +contractiles_required = [ + "Mustfile", + "Trustfile", + "Intentfile", +] + +security_required = [ + ".well-known/security.txt", + "ci-security-scan", +] + +quality_gate_required = [ + "format", + "lint", + "unit-tests", + "integration-tests", + "p2p-tests", + "e2e-tests", + "bench-smoke", + "docs-check", + "security-scan", +] + +abi_ffi_policy = [ + "ABI Idris2 in src/interface/abi/*.idr", + "FFI Zig in ffi/**/*.zig", +] + +[should] +docs_primary_format = "adoc" +docs_structure = [ + "docs/theory", + "docs/practice", + "docs/whitepapers/academic", + "docs/whitepapers/industry", + "docs/proofs", + "docs/reports", +] + +root_minimization = true +well_known_metadata = true +roadmap_honesty_with_dates = true +ci_doc_format_policy = true + +[could] +generate_human_from_machine = true +mode_aware_bots = ["corrective", "adaptive", "perfective", "audit"] +topology_dashboard = true +exception_registry = true diff --git a/validate-action/.machine_readable/policies/README.adoc b/validate-action/.machine_readable/policies/README.adoc new file mode 100644 index 0000000..b7e25f5 --- /dev/null +++ b/validate-action/.machine_readable/policies/README.adoc @@ -0,0 +1 @@ += policies Registry diff --git a/validate-action/.machine_readable/policies/SOFTWARE-DEVELOPMENT-APPROACH.a2ml b/validate-action/.machine_readable/policies/SOFTWARE-DEVELOPMENT-APPROACH.a2ml new file mode 100644 index 0000000..093573a --- /dev/null +++ b/validate-action/.machine_readable/policies/SOFTWARE-DEVELOPMENT-APPROACH.a2ml @@ -0,0 +1,53 @@ +# SPDX-License-Identifier: MPL-2.0 +# General software development approach (machine-readable) + +[metadata] +version = "1.0.0" +last-updated = "2026-02-24" +scope = "cross-repo" +source-human = "docs/practice/SOFTWARE-DEVELOPMENT-APPROACH.adoc" + +[execution] +order = ["axis-1", "axis-2", "axis-3"] + +[axis-1] +name = "scope" +priority = "must > intend > like" +inputs = [ + "README", + "roadmap", + "status-docs", + "ci-and-security-docs", +] +marker-scan = ["TODO", "FIXME", "XXX", "HACK", "STUB", "PARTIAL"] +idris-unsound-scan = ["believe_me", "assert_total"] +output = "scoped-work-assembly" + +[axis-2] +name = "maintenance" +priority = "corrective > adaptive > perfective" +corrective = "defect/regression/safety/security fixes" +adaptive = "scope reconciliation, stale-reference removal, obsolete-work culling" +perfective = "quality improvements derived from axis-1 honest state" + +[axis-3] +name = "audit" +priority = "systems > compliance > effects" +systems = "required systems present and operating" +compliance = "exceptions explicit, bounded, and drift-resistant" +effects = "benchmark/operational impact evidence captured and reviewed" +compliance-tooling = "panic-attack" +effects-tooling = "ecological checking with sustainabot guidance" + +[cleanup-finish-off] +root-cleanup = true +stale-work-cull = true +docs-sync-human-machine = true +compliance-audit = true +effects-audit = true +release-summary = ["must", "should", "could"] +next-actions = ["corrective", "adaptive", "perfective"] + +[collaboration] +maintainer-dialogue-required = true +dialogue-topics = ["what changed", "why", "remaining risks"] diff --git a/validate-action/.machine_readable/scripts/0.2-AI-MANIFEST.a2ml b/validate-action/.machine_readable/scripts/0.2-AI-MANIFEST.a2ml new file mode 100644 index 0000000..615df84 --- /dev/null +++ b/validate-action/.machine_readable/scripts/0.2-AI-MANIFEST.a2ml @@ -0,0 +1,18 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "automation-scripts-unit" +level: 2 +parent: "../0.1-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Internal automation logic for the project lifecycle, forge sync, + verification triggers, and maintenance. + +canonical_locations: + maintenance: "maintenance/" + lifecycle: "lifecycle/" + forge: "forge/" + verification: "verification/" diff --git a/validate-action/.machine_readable/scripts/forge/0.3-AI-MANIFEST.a2ml b/validate-action/.machine_readable/scripts/forge/0.3-AI-MANIFEST.a2ml new file mode 100644 index 0000000..4bbd6cf --- /dev/null +++ b/validate-action/.machine_readable/scripts/forge/0.3-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "automation-unit-forge" +level: 3 +parent: "../0.2-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Internal automation logic for project forge. diff --git a/validate-action/.machine_readable/scripts/forge/README.adoc b/validate-action/.machine_readable/scripts/forge/README.adoc new file mode 100644 index 0000000..31adef6 --- /dev/null +++ b/validate-action/.machine_readable/scripts/forge/README.adoc @@ -0,0 +1 @@ += Forge Scripts diff --git a/validate-action/.machine_readable/scripts/forge/forge-sync.sh b/validate-action/.machine_readable/scripts/forge/forge-sync.sh new file mode 100755 index 0000000..330e54b --- /dev/null +++ b/validate-action/.machine_readable/scripts/forge/forge-sync.sh @@ -0,0 +1,25 @@ +#!/usr/bin/env bash +# SPDX-License-Identifier: MPL-2.0 +# +# forge-sync.sh — Multi-forge mirroring script +# +# Synchronises the local repository with GitHub, GitLab, and Codeberg. +# Usage: ./forge-sync.sh + +set -euo pipefail + +REMOTES=("origin" "gitlab" "codeberg") + +echo "=== RSR Forge Synchronisation ===" + +for remote in "${REMOTES[@]}"; do + if git remote | grep -q "^$remote$"; then + echo "Pushing to $remote..." + git push "$remote" --all + git push "$remote" --tags + else + echo "Skip: Remote '$remote' not configured." + fi +done + +echo "Sync complete." diff --git a/validate-action/.machine_readable/scripts/forge/git-cleanup.sh b/validate-action/.machine_readable/scripts/forge/git-cleanup.sh new file mode 100755 index 0000000..4fec1a2 --- /dev/null +++ b/validate-action/.machine_readable/scripts/forge/git-cleanup.sh @@ -0,0 +1,8 @@ +#!/usr/bin/env bash +# git-cleanup.sh — Repository hygiene script +set -euo pipefail +echo "Cleaning up merged branches..." +git fetch -p +git branch --merged | grep -v "\*" | grep -v "main" | xargs -n 1 git branch -d || echo "No branches to clean." +echo "Pruning remote tracking branches..." +git remote prune origin diff --git a/validate-action/.machine_readable/scripts/lifecycle/0.3-AI-MANIFEST.a2ml b/validate-action/.machine_readable/scripts/lifecycle/0.3-AI-MANIFEST.a2ml new file mode 100644 index 0000000..3182d17 --- /dev/null +++ b/validate-action/.machine_readable/scripts/lifecycle/0.3-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "automation-unit-lifecycle" +level: 3 +parent: "../0.2-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Internal automation logic for project lifecycle. diff --git a/validate-action/.machine_readable/scripts/lifecycle/README.adoc b/validate-action/.machine_readable/scripts/lifecycle/README.adoc new file mode 100644 index 0000000..8d262b1 --- /dev/null +++ b/validate-action/.machine_readable/scripts/lifecycle/README.adoc @@ -0,0 +1 @@ += Lifecycle Scripts diff --git a/validate-action/.machine_readable/scripts/lifecycle/install-tools.sh b/validate-action/.machine_readable/scripts/lifecycle/install-tools.sh new file mode 100755 index 0000000..71cff06 --- /dev/null +++ b/validate-action/.machine_readable/scripts/lifecycle/install-tools.sh @@ -0,0 +1,27 @@ +#!/usr/bin/env bash +# SPDX-License-Identifier: MPL-2.0 +# +# install-tools.sh — Developer toolchain installer +# +# Detects and installs the required project toolchain (guix or asdf). + +set -euo pipefail + +echo "=== RSR Toolchain Installer ===" + +if [ -f "guix.scm" ] && command -v guix &>/dev/null; then + echo "Guix detected. Setting up development environment..." + guix shell -D -f guix.scm -- echo "Guix environment verified." +elif [ -f ".tool-versions" ] && command -v asdf &>/dev/null; then + echo "asdf detected. Installing plugins and tools..." + while read -r line; do + plugin=$(echo "$line" | awk '{print $1}') + asdf plugin add "$plugin" || true + done < .tool-versions + asdf install +else + echo "No standard toolchain (guix/asdf) detected or installed." + echo "Please refer to README.adoc for manual setup instructions." +fi + +echo "Installer complete." diff --git a/validate-action/.machine_readable/scripts/maintenance/maint-assault.sh b/validate-action/.machine_readable/scripts/maintenance/maint-assault.sh new file mode 100644 index 0000000..f170cab --- /dev/null +++ b/validate-action/.machine_readable/scripts/maintenance/maint-assault.sh @@ -0,0 +1,44 @@ +#!/usr/bin/env bash +# SPDX-License-Identifier: MPL-2.0 +# +# maint-assault.sh — High-rigor stress testing using panic-attacker +# +# This script runs a full assault (static + dynamic) on the project binary +# to detect logic-based bug signatures and environmental vulnerabilities. + +set -euo pipefail + +BINARY_NAME="{{project}}" +REPORT_PATH="docs/reports/security/assault-latest.json" +PA_BIN="${PANIC_ATTACK_BIN:-panic-attack}" + +echo "=== High-Rigor Security Assault ===" + +# 1. Verify environment +if ! command -v "$PA_BIN" &>/dev/null; then + echo "Error: panic-attack tool not found." + echo "Please install it or set PANIC_ATTACK_BIN environment variable." + exit 1 +fi + +if [ ! -f "target/release/$BINARY_NAME" ]; then + echo "Warning: Release binary not found at target/release/$BINARY_NAME" + echo "Running build first..." + just build --release +fi + +# 2. Run Assault +echo "Initiating full assault on $BINARY_NAME..." +mkdir -p "$(dirname "$REPORT_PATH")" + +"$PA_BIN" assault "target/release/$BINARY_NAME" + --source . + --intensity medium + --duration 10 + --output "$REPORT_PATH" + +echo "" +echo "=== Assault Complete ===" +echo "Report generated: $REPORT_PATH" +echo "To review interactively, run:" +echo " $PA_BIN tui $REPORT_PATH" diff --git a/validate-action/.machine_readable/scripts/verification/0.3-AI-MANIFEST.a2ml b/validate-action/.machine_readable/scripts/verification/0.3-AI-MANIFEST.a2ml new file mode 100644 index 0000000..460e069 --- /dev/null +++ b/validate-action/.machine_readable/scripts/verification/0.3-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "automation-unit-verification" +level: 3 +parent: "../0.2-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Internal automation logic for project verification. diff --git a/validate-action/.machine_readable/scripts/verification/README.adoc b/validate-action/.machine_readable/scripts/verification/README.adoc new file mode 100644 index 0000000..277b4aa --- /dev/null +++ b/validate-action/.machine_readable/scripts/verification/README.adoc @@ -0,0 +1 @@ += Verification Scripts diff --git a/validate-action/.tool-versions b/validate-action/.tool-versions new file mode 100644 index 0000000..f8af37b --- /dev/null +++ b/validate-action/.tool-versions @@ -0,0 +1,9 @@ +# Uncomment and customize for your project +# rust nightly +# just 1.40.0 +# nickel 1.10.0 +# gleam 1.8.0 +# elixir 1.18.0 +# erlang 27.2 +# zig 0.14.0 +# idris2 0.7.0 diff --git a/validate-action/.well-known/ai.txt b/validate-action/.well-known/ai.txt new file mode 100644 index 0000000..334b406 --- /dev/null +++ b/validate-action/.well-known/ai.txt @@ -0,0 +1,18 @@ +# SPDX-License-Identifier: MPL-2.0 +# ai.txt - AI interaction policy +# See: https://site.spawning.ai/spawning-ai-txt + +User-Agent: * +Disallow-Training: yes +Disallow-Summarization: no +Disallow-Generation: yes + +# This project's code is licensed under MPL-2.0. +# AI agents may read and analyze this code for assisting contributors. +# AI agents must NOT use this code for model training without explicit consent. +# AI agents must preserve Emotional Lineage per PMPL Section 3. +# +# For AI agent integration instructions, see: +# 0-AI-MANIFEST.a2ml (universal AI entry point) +# AI.a2ml (Claude-specific instructions) +# .machine_readable/ (structured project state) diff --git a/validate-action/.well-known/humans.txt b/validate-action/.well-known/humans.txt new file mode 100644 index 0000000..d7af566 --- /dev/null +++ b/validate-action/.well-known/humans.txt @@ -0,0 +1,14 @@ +# SPDX-License-Identifier: MPL-2.0 +# humanstxt.org + +/* TEAM */ +Maintainer: Jonathan D.A. Jewell (hyperpolymath) +Contact: j.d.a.jewell@open.ac.uk +From: United Kingdom + +/* SITE */ +Last update: 2026-03-16 +Standards: RSR (Rhodium Standard Repository) +License: MPL-2.0 (Palimpsest MPL) +Components: Idris2 ABI, Zig FFI +Tools: just, Podman, Guix diff --git a/validate-action/.well-known/security.txt b/validate-action/.well-known/security.txt new file mode 100644 index 0000000..3b2c3a9 --- /dev/null +++ b/validate-action/.well-known/security.txt @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +# RFC 9116 - security.txt +# https://securitytxt.org/ + +Contact: mailto:j.d.a.jewell@open.ac.uk +Expires: 2026-12-31T23:59:59.000Z +Encryption: {{PGP_KEY_URL}} +Preferred-Languages: en +Canonical: https://github.com/hyperpolymath/a2ml-validate-action/.well-known/security.txt +Policy: https://github.com/hyperpolymath/a2ml-validate-action/blob/main/SECURITY.md +Hiring: https://https://github.com/hyperpolymath/a2ml-validate-action/careers diff --git a/validate-action/0-AI-MANIFEST.a2ml b/validate-action/0-AI-MANIFEST.a2ml new file mode 100644 index 0000000..9b64bd8 --- /dev/null +++ b/validate-action/0-AI-MANIFEST.a2ml @@ -0,0 +1,121 @@ +# ⚠️ STOP - CRITICAL READING REQUIRED + +**THIS FILE MUST BE READ FIRST BY ALL AI AGENTS** + +## WHAT IS THIS? + +This is the AI manifest for **a2ml-validate-action**. It declares: +- Canonical file locations (where things MUST be, and nowhere else) +- Critical invariants (rules that must NEVER be violated) +- Repository structure and organization + +## CANONICAL LOCATIONS (UNIVERSAL RULE) + +### Machine-Readable Metadata: `.machine_readable/` ONLY + +These 6 a2ml files MUST exist in `.machine_readable/` directory ONLY: +1. **STATE.a2ml** - Project state, progress, blockers +2. **META.a2ml** - Architecture decisions, governance +3. **ECOSYSTEM.a2ml** - Position in ecosystem, relationships +4. **AGENTIC.a2ml** - AI agent interaction patterns +5. **NEUROSYM.a2ml** - Neurosymbolic integration config +6. **PLAYBOOK.a2ml** - Operational runbook + +**CRITICAL:** If ANY of these files exist in the root directory, this is an ERROR. + +### Anchor File: `.machine_readable/descriptiles/anchors/ANCHOR.a2ml` ONLY + +Canonical authority and semantic-boundary declaration MUST exist at: + +` .machine_readable/descriptiles/anchors/ANCHOR.a2ml ` + +Do not place `ANCHOR.a2ml` at repository root. + +### Maintenance Policies: `.machine_readable/policies/` ONLY + +Canonical maintenance/governance files MUST exist under: + +` .machine_readable/policies/ ` + +Minimum required files: +- `MAINTENANCE-AXES.a2ml` +- `MAINTENANCE-CHECKLIST.a2ml` +- `SOFTWARE-DEVELOPMENT-APPROACH.a2ml` + +Do not place maintenance policy files in repository root. + +### Bot Directives: `.machine_readable/bot_directives/` ONLY + +Bot-specific instructions for your automated agents. + +### Contractiles: `.machine_readable/contractiles/` ONLY + +Policy enforcement contracts (k9, dust, lust, must, trust). + +### AI Configuration & Guides: `.machine_readable/ai/` ONLY + +- `AI.a2ml` - Language-specific or LLM-specific patterns +- `PLACEHOLDERS.md` - Bootstrap guide + +### Community & Forge Metadata: `.github/` ONLY + +- `CODEOWNERS` - Review assignments +- `MAINTAINERS` - Machine-readable contact list +- `SUPPORT` - Support channels +- `SECURITY.md` - Technical security policy +- `CONTRIBUTING.md` - Technical contribution manual +- `CODE_OF_CONDUCT.md` - Conduct rules + +### Agent Instructions + +- `0-AI-MANIFEST.a2ml` - THIS FILE (universal entry point) + +## CORE INVARIANTS + +1. **No state file duplication** - Root must NOT contain STATE.a2ml, META.a2ml, etc. +2. **Single source of truth** - `.machine_readable/` is authoritative +3. **No stale metadata** - If root state files exist, they are OUT OF DATE +4. **License consistency** - All code MPL-2.0 unless platform requires MPL-2.0 +5. **Author attribution** - Always "Jonathan D.A. Jewell " +6. **Container images** - MUST use Chainguard base (`cgr.dev/chainguard/wolfi-base:latest` or `cgr.dev/chainguard/static:latest`) +7. **Container runtime** - Podman, never Docker. Files are `Containerfile`, never `Dockerfile` +8. **Container orchestration** - `selur-compose`, never `docker-compose` + +## REPOSITORY STRUCTURE + +This repo follows the **Dual-Track** architecture: + +``` +a2ml-validate-action/ +├── 0-AI-MANIFEST.a2ml # THIS FILE (start here) +├── README.adoc # High-level orientation (Rich Human) +├── ROADMAP.adoc # Future direction +├── CONTRIBUTING.adoc # Human contribution guide +├── GOVERNANCE.adoc # Decision-making model +├── Justfile # Task runner +├── Containerfile # OCI build +├── LICENSE # Primary license +├── src/ # Source code +│ └── interface/ # Verified Interface Seams +│ ├── abi/ # Idris2 ABI (The Spec) +│ ├── ffi/ # Zig FFI (The Bridge) +│ └── generated/ # C Headers (The Result) +├── container/ # Stapeln container ecosystem +├── docs/ # Technical depths +│ ├── attribution/ # Citations, owners, maintainers (adoc) +│ ├── architecture/ # Topology, diagrams +│ ├── theory/ # Domain theory +│ └── practice/ # Manuals +├── docs/legal/ # Legal exhibits and full texts +└── .machine_readable/ # ALL machine-readable metadata +``` + +## SESSION STARTUP CHECKLIST + +✅ Read THIS file (0-AI-MANIFEST.a2ml) first +✅ Understand canonical location: `.machine_readable/` +✅ State understanding of canonical locations + +## ATTESTATION PROOF + +**"I have read the AI manifest. All machine-readable content (state files, anchors, policies, bot directives, contractiles, AI guides) is located in `.machine_readable/` ONLY, and community metadata is in `.github/`. I will not create duplicate files in the root directory."** diff --git a/validate-action/ARCHITECTURE.md b/validate-action/ARCHITECTURE.md new file mode 100644 index 0000000..607e3d8 --- /dev/null +++ b/validate-action/ARCHITECTURE.md @@ -0,0 +1,47 @@ +# Architecture + +## Overview + +This repository follows a modular, maintainable architecture designed for clarity, scalability, and long-term sustainability. + +## Directory Structure + +``` +. +├── src/ # Source code +├── tests/ # Test suites +├── docs/ # Documentation +├── scripts/ # Utility scripts +├── config/ # Configuration files +├── LICENSE # License file +├── LICENSES/ # Full license texts +└── README.adoc # Project documentation +``` + +## Design Principles + +- **Separation of Concerns**: Each module has a single responsibility +- **Testability**: Code is written to be easily testable +- **Documentation**: All public APIs are documented +- **Configuration**: Environment-specific settings are externalized + +## Dependencies + +- External dependencies are minimized and clearly declared +- Version pinning is used for reproducibility + +## Security Considerations + +- Sensitive data is never committed to the repository +- Secrets are managed through environment variables or secure vaults +- Regular dependency audits are performed + +## Maintainability + +- Code follows consistent style guidelines +- Pull requests require review and CI checks +- Issues and discussions are tracked transparently + +--- + +*Last updated: 2026-07-18* diff --git a/validate-action/CHANGELOG.md b/validate-action/CHANGELOG.md new file mode 100644 index 0000000..903612d --- /dev/null +++ b/validate-action/CHANGELOG.md @@ -0,0 +1,23 @@ +# 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] + +## [1.0.0] - 2026-05-29 + +### Added + +- Initial Marketplace-ready composite action for validating `.a2ml` manifests. +- Configurable `path`, `strict`, and `paths-ignore` inputs. +- GitHub Actions outputs for scanned files, validation errors, and warnings. + +### Fixed + +- Allow local smoke runs outside GitHub Actions by defaulting missing `GITHUB_OUTPUT` to `/dev/null`. diff --git a/validate-action/CODE_OF_CONDUCT.md b/validate-action/CODE_OF_CONDUCT.md new file mode 100644 index 0000000..caeda1c --- /dev/null +++ b/validate-action/CODE_OF_CONDUCT.md @@ -0,0 +1,27 @@ + +# Contributor Covenant Code of Conduct + +## Our Pledge + +We pledge to make participation a harassment-free experience for everyone. + +## Our Standards + +**Positive behavior:** +* Using welcoming language +* Being respectful of differing viewpoints +* Accepting constructive criticism +* Focusing on what is best for the community + +**Unacceptable behavior:** +* Harassment, trolling, or personal attacks +* Publishing private information without permission + +## Enforcement + +Report issues to the maintainers. All complaints will be reviewed. + +## Attribution + +Adapted from [Contributor Covenant](https://www.contributor-covenant.org/) v2.1. + diff --git a/validate-action/CONTRIBUTING.md b/validate-action/CONTRIBUTING.md new file mode 100644 index 0000000..80ecdac --- /dev/null +++ b/validate-action/CONTRIBUTING.md @@ -0,0 +1,66 @@ + +# Contributing + +Thank you for your interest in contributing! We follow a "Dual-Track" architecture where human-readable documentation lives in the root and machine-readable policies live in `.machine_readable/`. + +## How to Contribute + +We welcome contributions in many forms: + +- **Code:** Improving the core stack or extensions +- **Documentation:** Enhancing docs or AI manifests +- **Testing:** Adding property-based tests or formal proofs +- **Bug reports:** Filing clear, reproducible issues + +## Getting Started + +1. **Read the AI Manifest:** Start with `0-AI-MANIFEST.a2ml` (if present) to understand the repository structure. +2. **Environment:** Use `nix develop` or `direnv allow` to set up your tools. +3. **Task Runner:** Use `just` to see available commands (`just --list`). + +## Development Workflow + +### Branch Naming + +``` +docs/short-description # Documentation +test/what-added # Test additions +feat/short-description # New features +fix/issue-number-description # Bug fixes +refactor/what-changed # Code improvements +security/what-fixed # Security fixes +``` + +### Commit Messages + +We follow [Conventional Commits](https://www.conventionalcommits.org/): + +``` +(): + +[optional body] + +[optional footer] +``` + +Types: `feat`, `fix`, `docs`, `test`, `refactor`, `ci`, `chore`, `security` + +## Reporting Bugs + +Before reporting: +1. Search existing issues +2. Check if it's already fixed in `main` + +When reporting, include: +- Clear, descriptive title +- Environment details (OS, versions, toolchain) +- Steps to reproduce +- Expected vs actual behaviour + +## Code of Conduct + +All contributors are expected to adhere to our [Code of Conduct](CODE_OF_CONDUCT.md). + +## License + +By contributing, you agree that your contributions will be licensed under the same license as the project (see [LICENSE](LICENSE)). diff --git a/validate-action/Containerfile b/validate-action/Containerfile new file mode 100644 index 0000000..088cb6d --- /dev/null +++ b/validate-action/Containerfile @@ -0,0 +1,41 @@ +# SPDX-License-Identifier: MPL-2.0 +# Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) +# +# Containerfile for a2ml-validate-action +# Build: podman build -t {{project}}:latest -f Containerfile . +# Run: podman run --rm -it {{project}}:latest +# Seal: selur seal {{project}}:latest + +# --- Build stage --- +FROM cgr.dev/chainguard/wolfi-base:latest AS build + +# TODO: Install build dependencies for your stack +# Examples: +# RUN apk add --no-cache rust cargo # Rust +# RUN apk add --no-cache elixir erlang # Elixir +# RUN apk add --no-cache zig # Zig + +WORKDIR /build +COPY . . + +# TODO: Replace with your build command +# Examples: +# RUN cargo build --release +# RUN mix deps.get && MIX_ENV=prod mix release +# RUN zig build -Doptimize=ReleaseSafe + +# --- Runtime stage --- +FROM cgr.dev/chainguard/static:latest + +# Copy built artifact from build stage +# TODO: Replace with your binary/artifact path +# Examples: +# COPY --from=build /build/target/release/{{project}} /usr/local/bin/ +# COPY --from=build /build/_build/prod/rel/{{project}} /app/ +# COPY --from=build /build/zig-out/bin/{{project}} /usr/local/bin/ + +# Non-root user (chainguard images default to nonroot) +USER nonroot + +# TODO: Replace with your entrypoint +# ENTRYPOINT ["/usr/local/bin/{{project}}"] diff --git a/validate-action/EXPLAINME.adoc b/validate-action/EXPLAINME.adoc new file mode 100644 index 0000000..ac06362 --- /dev/null +++ b/validate-action/EXPLAINME.adoc @@ -0,0 +1,25 @@ +// SPDX-License-Identifier: CC-BY-SA-4.0 += a2ml-validate-action — Show Me The Receipts +:toc: +:icons: font + +The README makes claims. This file backs them up. + +[quote, README] +____ +AI agent instructions, and project state. This action scans for `.a2ml` files +____ + +== File Map + +[cols="1,2"] +|=== +| Path | What's There + +| `src/` | Source code +| `test(s)/` | Test suite +|=== + +== Questions? + +Open an issue or reach out directly — happy to explain anything in more detail. diff --git a/validate-action/GOVERNANCE.adoc b/validate-action/GOVERNANCE.adoc new file mode 100644 index 0000000..393df47 --- /dev/null +++ b/validate-action/GOVERNANCE.adoc @@ -0,0 +1,94 @@ +// SPDX-License-Identifier: CC-BY-SA-4.0 +// SPDX-License-Identifier: CC-BY-SA-4.0 +// Copyright (c) Jonathan D.A. Jewell += Governance + +[NOTE] +==== +Personal / solo-project model (Benevolent Maintainer). Last reviewed: 2026-06-22. +==== + +== Project status + +This project is governed by a *Benevolent Maintainer* model. + +The project founder retains final authority over project direction, +architecture, releases, licensing, and governance. + +== Founder + +Current founder and lead maintainer: + +* Jonathan D.A. Jewell (`@hyperpolymath`) + +== Decision making + +Normal decisions are made by the founder. + +Contributors are encouraged to: + +* open issues +* submit pull requests +* propose designs +* discuss alternatives + +Feedback is considered in good faith but does not bind the project. + +== Contributions + +Contributions are welcome. See `CONTRIBUTING.md` for how to get started. + +Submitting a contribution does not guarantee acceptance. The founder may: + +* accept a contribution +* request changes +* reject a contribution +* replace a contribution with an alternative implementation + +without further justification. + +== Architectural direction + +The founder is responsible for: + +* project vision +* long-term roadmap +* architecture +* naming +* release strategy + +== Maintainers + +Additional maintainers may be appointed by the founder (see `MAINTAINERS.adoc`). +Maintainers may review changes, merge pull requests, and manage issues unless +otherwise restricted. The founder may remove maintainers at any time. + +== Code of conduct + +All participants are expected to follow the project's `CODE_OF_CONDUCT.md`. +The founder is the point of contact for enforcement. + +== Security + +Report suspected vulnerabilities *privately* as described in `SECURITY.md`. +Please do not disclose vulnerabilities in public issues. + +== Forking + +Users are free to fork the project according to the license. Forks are +independent projects and are not considered official unless explicitly +designated. + +== Governance changes + +This document may be amended by the founder. + +== Project continuity + +If the founder permanently ceases maintenance: + +. a successor may be appointed; +. ownership may be transferred; +. the project may become community-maintained. + +Until such designation exists, no successor is implied. diff --git a/validate-action/GOVERNANCE.md b/validate-action/GOVERNANCE.md new file mode 100644 index 0000000..e27364c --- /dev/null +++ b/validate-action/GOVERNANCE.md @@ -0,0 +1,60 @@ +# Governance + +## Overview + +This project is governed by the following principles and structures to ensure transparent, inclusive, and effective decision-making. + +## Roles and Responsibilities + +### Maintainers + +Maintainers are responsible for: +- Reviewing and merging pull requests +- Managing releases and versioning +- Ensuring code quality and standards +- Triaging issues and bug reports +- Community engagement and support + +### Contributors + +Contributors are expected to: +- Follow the code of conduct +- Submit well-documented pull requests +- Write tests for new functionality +- Maintain existing tests +- Update documentation as needed + +## Decision Making + +### Minor Changes +- Can be made by any maintainer +- Include bug fixes, documentation updates, dependency updates + +### Major Changes +- Require discussion in issues or pull requests +- Include new features, architectural changes, API changes +- Need approval from at least 2 maintainers + +### Breaking Changes +- Require RFC (Request for Comments) process +- Need approval from majority of maintainers +- Must include migration guide + +## Code of Conduct + +All participants are expected to follow our Code of Conduct. Violations can be reported to the maintainers. + +## Communication + +- **Issues**: For bug reports and feature requests +- **Discussions**: For questions and general discussion +- **Pull Requests**: For code contributions + +## Licensing + +All contributions are made under the terms of the repository's LICENSE file. +By submitting a pull request, you agree to license your contributions accordingly. + +--- + +*Last updated: 2026-07-18* diff --git a/validate-action/Justfile b/validate-action/Justfile new file mode 100644 index 0000000..e5ebb04 --- /dev/null +++ b/validate-action/Justfile @@ -0,0 +1,1022 @@ +# SPDX-License-Identifier: MPL-2.0 +# Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) +# +# RSR Standard Justfile Template +# https://just.systems/man/en/ +# +# Copy this file to new projects and customize the placeholder values. +# +# Run `just` to see all available recipes +# Run `just cookbook` to generate docs/just-cookbook.adoc +# Run `just combinations` to see matrix recipe options + +set shell := ["bash", "-uc"] +set dotenv-load := true +set positional-arguments := true + +# Import auto-generated contractile recipes (must-check, trust-verify, etc.) +# Re-generate with: contractile gen-just +import? "contractile.just" + +# Project metadata — customize these +project := "a2ml-validate-action" +version := "1.0.0" +tier := "infrastructure" # 1 | 2 | infrastructure + +# ═══════════════════════════════════════════════════════════════════════════════ +# DEFAULT & HELP +# ═══════════════════════════════════════════════════════════════════════════════ + +# Show all available recipes with descriptions +default: + @just --list --unsorted + +# Show detailed help for a specific recipe +help recipe="": + #!/usr/bin/env bash + if [ -z "{{recipe}}" ]; then + just --list --unsorted + echo "" + echo "Usage: just help " + echo " just cookbook # Generate full documentation" + echo " just combinations # Show matrix recipes" + else + just --show "{{recipe}}" 2>/dev/null || echo "Recipe '{{recipe}}' not found" + fi + +# Show this project's info +info: + @echo "Project: {{project}}" + @echo "Version: {{version}}" + @echo "RSR Tier: {{tier}}" + @echo "Recipes: $(just --summary | wc -w)" + @[ -f ".machine_readable/descriptiles/STATE.a2ml" ] && grep -oP 'phase\s*=\s*"\K[^"]+' .machine_readable/descriptiles/STATE.a2ml | head -1 | xargs -I{} echo "Phase: {}" || true + +# ═══════════════════════════════════════════════════════════════════════════════ +# INIT — Bootstrap a new project from this template +# ═══════════════════════════════════════════════════════════════════════════════ + +# Interactive project bootstrap — replaces all {{PLACEHOLDER}} tokens +init: + #!/usr/bin/env bash + set -euo pipefail + + echo "═══════════════════════════════════════════════════" + echo " RSR Project Bootstrap" + echo "═══════════════════════════════════════════════════" + echo "" + + # --- Load defaults from config (if exists) --- + # Create yours: ~/.config/rsr/defaults + # Format: OWNER=myorg AUTHOR="My Name" AUTHOR_EMAIL=me@example.org ... + DEFAULTS="${XDG_CONFIG_HOME:-$HOME/.config}/rsr/defaults" + if [ -f "$DEFAULTS" ]; then + echo "Loading defaults from $DEFAULTS" + # shellcheck source=/dev/null + source "$DEFAULTS" + echo "" + fi + + # --- Required values (pre-filled from defaults if available) --- + read -rp "Project name (human-readable, e.g. My Project): " PROJECT_NAME + [ -z "$PROJECT_NAME" ] && echo "Error: project name required" && exit 1 + + read -rp "Repository slug (e.g. my-project): " REPO + [ -z "$REPO" ] && echo "Error: repo slug required" && exit 1 + + read -rp "Owner [${OWNER:-}]: " _OWNER + OWNER="${_OWNER:-${OWNER:-}}" + [ -z "$OWNER" ] && echo "Error: owner required" && exit 1 + + read -rp "Author full name [${AUTHOR:-}]: " _AUTHOR + AUTHOR="${_AUTHOR:-${AUTHOR:-}}" + [ -z "$AUTHOR" ] && echo "Error: author name required" && exit 1 + + read -rp "Author email [${AUTHOR_EMAIL:-}]: " _AUTHOR_EMAIL + AUTHOR_EMAIL="${_AUTHOR_EMAIL:-${AUTHOR_EMAIL:-}}" + [ -z "$AUTHOR_EMAIL" ] && echo "Error: email required" && exit 1 + + # --- Optional values (pre-filled from defaults if available) --- + read -rp "Author organization [${AUTHOR_ORG:-none}]: " _AUTHOR_ORG + AUTHOR_ORG="${_AUTHOR_ORG:-${AUTHOR_ORG:-}}" + + read -rp "Previous/alt email [${AUTHOR_EMAIL_ALT:-none}]: " _AUTHOR_EMAIL_ALT + AUTHOR_EMAIL_ALT="${_AUTHOR_EMAIL_ALT:-${AUTHOR_EMAIL_ALT:-}}" + + read -rp "Project description []: " PROJECT_DESCRIPTION + + read -rp "Forge domain [${FORGE:-github.com}]: " _FORGE + FORGE="${_FORGE:-${FORGE:-github.com}}" + + read -rp "Security contact email [${SECURITY_EMAIL:-$AUTHOR_EMAIL}]: " _SECURITY_EMAIL + SECURITY_EMAIL="${_SECURITY_EMAIL:-${SECURITY_EMAIL:-$AUTHOR_EMAIL}}" + + read -rp "Conduct contact email [${CONDUCT_EMAIL:-$AUTHOR_EMAIL}]: " _CONDUCT_EMAIL + CONDUCT_EMAIL="${_CONDUCT_EMAIL:-${CONDUCT_EMAIL:-$AUTHOR_EMAIL}}" + + read -rp "Project type (library|binary|monorepo|service|website) [library]: " PROJECT_TYPE + PROJECT_TYPE="${PROJECT_TYPE:-library}" + + read -rp "Website URL [https://${FORGE}/${OWNER}/${REPO}]: " WEBSITE + WEBSITE="${WEBSITE:-https://${FORGE}/${OWNER}/${REPO}}" + + # --- Container values (optional — only relevant if container/ exists) --- + if [ -d "container" ]; then + echo "" + echo "── Container configuration (optional) ─────────" + read -rp "Service name [${REPO}]: " _SERVICE_NAME + SERVICE_NAME="${_SERVICE_NAME:-${REPO}}" + read -rp "Primary port [8080]: " _PORT + PORT="${_PORT:-8080}" + read -rp "Container registry [ghcr.io/${OWNER}]: " _REGISTRY + REGISTRY="${_REGISTRY:-ghcr.io/${OWNER}}" + else + SERVICE_NAME="${REPO}" + PORT="8080" + REGISTRY="ghcr.io/${OWNER}" + fi + + # --- Derived values --- + PROJECT_UPPER=$(echo "$REPO" | tr '[:lower:]-' '[:upper:]_') + PROJECT_LOWER=$(echo "$REPO" | tr '[:upper:]-' '[:lower:]_') + CURRENT_YEAR=$(date +%Y) + CURRENT_DATE=$(date +%Y-%m-%d) + VERSION="0.1.0" + + # Derive citation name parts (best-effort split on last space) + AUTHOR_LAST="${AUTHOR##* }" + AUTHOR_FIRST="${AUTHOR% *}" + FIRST_INITIAL="${AUTHOR_FIRST:0:1}." + if [ "$AUTHOR_LAST" = "$AUTHOR_FIRST" ]; then + AUTHOR_FIRST="$AUTHOR" + AUTHOR_LAST="" + FIRST_INITIAL="" + fi + + echo "" + echo "── Summary ──────────────────────────────────────" + echo " Project: $PROJECT_NAME" + echo " Repo: $REPO" + echo " Owner: $OWNER" + echo " Author: $AUTHOR <$AUTHOR_EMAIL>" + [ -n "$AUTHOR_ORG" ] && echo " Organization: $AUTHOR_ORG" + echo " Forge: $FORGE" + echo " Year: $CURRENT_YEAR" + echo "────────────────────────────────────────────────" + echo "" + read -rp "Proceed? [Y/n] " CONFIRM + [[ "${CONFIRM:-Y}" =~ ^[Nn] ]] && echo "Aborted." && exit 0 + + echo "" + echo "Replacing placeholders..." + + # Brace tokens as variables (hex avoids just interpolation) + LB=$(printf '\x7b\x7b') + RB=$(printf '\x7d\x7d') + + # Build the sed expression list + # Note: using | as delimiter since URLs contain / + SED_ARGS=( + -e "s|${LB}PROJECT_NAME${RB}|${PROJECT_NAME}|g" + -e "s|${LB}PROJECT_DESCRIPTION${RB}|${PROJECT_DESCRIPTION}|g" + -e "s|${LB}PROJECT${RB}|${PROJECT_UPPER}|g" + -e "s|${LB}project${RB}|${PROJECT_LOWER}|g" + -e "s|${LB}REPO${RB}|${REPO}|g" + -e "s|${LB}OWNER${RB}|${OWNER}|g" + -e "s|${LB}AUTHOR${RB}|${AUTHOR}|g" + -e "s|${LB}AUTHOR_EMAIL${RB}|${AUTHOR_EMAIL}|g" + -e "s|${LB}AUTHOR_ORG${RB}|${AUTHOR_ORG}|g" + -e "s|${LB}AUTHOR_LAST${RB}|${AUTHOR_LAST}|g" + -e "s|${LB}AUTHOR_FIRST${RB}|${AUTHOR_FIRST}|g" + -e "s|${LB}AUTHOR_INITIALS${RB}|${FIRST_INITIAL}|g" + -e "s|${LB}FORGE${RB}|${FORGE}|g" + -e "s|${LB}CURRENT_YEAR${RB}|${CURRENT_YEAR}|g" + -e "s|${LB}CURRENT_DATE${RB}|${CURRENT_DATE}|g" + -e "s|${LB}DATE${RB}|${CURRENT_DATE}|g" + -e "s|${LB}SECURITY_EMAIL${RB}|${SECURITY_EMAIL}|g" + -e "s|${LB}CONDUCT_EMAIL${RB}|${CONDUCT_EMAIL}|g" + -e "s|${LB}LICENSE${RB}|MPL-2.0|g" + -e "s|${LB}CONDUCT_TEAM${RB}|Code of Conduct Committee|g" + -e "s|${LB}RESPONSE_TIME${RB}|48 hours|g" + -e "s|${LB}MAIN_BRANCH${RB}|main|g" + -e "s|${LB}PROJECT_PURPOSE${RB}|${PROJECT_DESCRIPTION}|g" + -e "s|${LB}PROJECT_ROLE${RB}|${PROJECT_TYPE}|g" + -e "s|${LB}PROJECT_TYPE${RB}|${PROJECT_TYPE}|g" + -e "s|${LB}WEBSITE${RB}|${WEBSITE}|g" + -e "s|${LB}SERVICE_NAME${RB}|${SERVICE_NAME}|g" + -e "s|${LB}PORT${RB}|${PORT}|g" + -e "s|${LB}REGISTRY${RB}|${REGISTRY}|g" + -e "s|${LB}IMAGE${RB}|${REGISTRY}/${SERVICE_NAME}|g" + -e "s|${LB}VERSION${RB}|${VERSION}|g" + -e "s|${LB}EMAIL${RB}|${AUTHOR_EMAIL}|g" + ) + [ -n "$AUTHOR_EMAIL_ALT" ] && SED_ARGS+=(-e "s|${LB}AUTHOR_EMAIL_ALT${RB}|${AUTHOR_EMAIL_ALT}|g") + + # Replace in all text files (skip .git, LICENSE text, and binaries) + find . -type f \ + -not -path './.git/*' \ + -not -name 'MPL-2.0.txt' \ + -not -name '*.png' -not -name '*.jpg' -not -name '*.gif' \ + -not -name '*.woff' -not -name '*.woff2' \ + | while read -r file; do + if file --brief "$file" | grep -qi 'text\|ascii\|utf'; then + sed -i "${SED_ARGS[@]}" "$file" + fi + done + + # Also replace [YOUR-REPO-NAME] and [YOUR-NAME/ORG] in AI manifest + sed -i "s|\[YOUR-REPO-NAME\]|${PROJECT_NAME}|g" 0-AI-MANIFEST.a2ml 2>/dev/null || true + sed -i "s|\[YOUR-NAME/ORG\]|${OWNER}|g" 0-AI-MANIFEST.a2ml 2>/dev/null || true + + echo "" + echo "── Validation ───────────────────────────────────" + + # Check for remaining placeholders + PATTERN="${LB}[A-Z_]*${RB}" + REMAINING=$(grep -rl "$PATTERN" . --include='*.md' --include='*.adoc' --include='*.yml' --include='*.yaml' --include='*.a2ml' --include='*.toml' --include='*.scm' --include='*.ncl' --include='*.nix' --include='*.json' --include='*.sh' 2>/dev/null | grep -v '.git/' | grep -v '.machine_readable/ai/PLACEHOLDERS.adoc' || true) + if [ -n "$REMAINING" ]; then + echo "WARNING: Remaining placeholders in:" + echo "$REMAINING" | sed 's/^/ /' + echo "" + echo "Run: grep -rn '$LB' . --include='*.md' to inspect" + else + echo "All placeholders replaced successfully!" + fi + + # K9-SVC validation (if available) + if command -v k9-svc >/dev/null 2>&1; then + echo "" + echo "Running k9-svc validation..." + k9-svc validate . 2>/dev/null || true + fi + + echo "" + echo "Done! Next steps:" + echo " 1. Review changes: git diff" + echo " 2. Remove template cruft: rm .machine_readable/ai/PLACEHOLDERS.adoc" + echo " 3. Customize README.adoc for your project" + echo " 4. Commit: git add -A && git commit -m 'feat: initialize from RSR template'" + echo " 5. Push: git remote add origin git@${FORGE}:${OWNER}/${REPO}.git && git push -u origin main" + +# ═══════════════════════════════════════════════════════════════════════════════ +# BUILD & COMPILE +# ═══════════════════════════════════════════════════════════════════════════════ + +# Build the project (debug mode) +build *args: + @echo "Building {{project}} (debug)..." + # TODO: Replace with your build command + # Examples: + # cargo build {{args}} # Rust + # mix compile {{args}} # Elixir + # zig build {{args}} # Zig + # deno task build {{args}} # Deno/ReScript + @echo "Build complete" + +# Build in release mode with optimizations +build-release *args: + @echo "Building {{project}} (release)..." + # TODO: Replace with your release build command + # Examples: + # cargo build --release {{args}} + # MIX_ENV=prod mix compile {{args}} + # zig build -Doptimize=ReleaseFast {{args}} + @echo "Release build complete" + +# Build and watch for changes (requires entr or similar) +build-watch: + @echo "Watching for changes..." + # TODO: Customize file patterns for your language + # Examples: + # find src -name '*.rs' | entr -c just build + # mix compile --force --warnings-as-errors + # deno task dev + +# Clean build artifacts [reversible: rebuild with `just build`] +clean: + @echo "Cleaning..." + # TODO: Customize for your build system + rm -rf target/ _build/ build/ dist/ out/ obj/ bin/ + +# Deep clean including caches [reversible: rebuild] +clean-all: clean + rm -rf .cache .tmp + +# ═══════════════════════════════════════════════════════════════════════════════ +# TEST & QUALITY +# ═══════════════════════════════════════════════════════════════════════════════ + +# Run all tests +test *args: + @echo "Running tests..." + # TODO: Replace with your test command + # Examples: + # cargo test {{args}} + # mix test {{args}} + # zig build test {{args}} + # deno test {{args}} + @echo "Tests passed!" + +# Run tests with verbose output +test-verbose: + @echo "Running tests (verbose)..." + # TODO: Replace with verbose test command + +# Smoke test +test-smoke: + @echo "Smoke test..." + # TODO: Add basic sanity checks + +# Run all quality checks +quality: fmt-check lint test + @echo "All quality checks passed!" + +# Fix all auto-fixable issues [reversible: git checkout] +fix: fmt + @echo "Fixed all auto-fixable issues" + +# ═══════════════════════════════════════════════════════════════════════════════ +# LINT & FORMAT +# ═══════════════════════════════════════════════════════════════════════════════ + +# Format all source files [reversible: git checkout] +fmt: + @echo "Formatting source files..." + # TODO: Replace with your formatter + # Examples: + # cargo fmt + # mix format + # gleam format + # deno fmt + +# Check formatting without changes +fmt-check: + @echo "Checking formatting..." + # TODO: Replace with your format check + # Examples: + # cargo fmt --check + # mix format --check-formatted + # gleam format --check + +# Run linter +lint: + @echo "Linting source files..." + # TODO: Replace with your linter + # Examples: + # cargo clippy -- -D warnings + # mix credo --strict + # gleam check + +# ═══════════════════════════════════════════════════════════════════════════════ +# RUN & EXECUTE +# ═══════════════════════════════════════════════════════════════════════════════ + +# Run the application +run *args: build + # TODO: Replace with your run command + echo "Run not configured yet" + +# Run with verbose output +run-verbose *args: build + # TODO: Replace with verbose run command + echo "Run not configured yet" + +# Install to user path +install: build-release + @echo "Installing {{project}}..." + # TODO: Replace with your install command + +# ═══════════════════════════════════════════════════════════════════════════════ +# DEPENDENCIES +# ═══════════════════════════════════════════════════════════════════════════════ + +# Install/check all dependencies +deps: + @echo "Checking dependencies..." + # TODO: Replace with your dependency check + # Examples: + # cargo check + # mix deps.get + # gleam deps download + @echo "All dependencies satisfied" + +# Audit dependencies for vulnerabilities +deps-audit: + @echo "Auditing for vulnerabilities..." + # TODO: Replace with your audit command + # Examples: + # cargo audit + # mix audit + @command -v trivy >/dev/null && trivy fs --severity HIGH,CRITICAL --quiet . || true + @command -v gitleaks >/dev/null && gitleaks detect --source . --no-git --quiet || true + @echo "Audit complete" + +# ═══════════════════════════════════════════════════════════════════════════════ +# DOCUMENTATION +# ═══════════════════════════════════════════════════════════════════════════════ + +# Generate all documentation +docs: + @mkdir -p docs/generated docs/man + just cookbook + just man + @echo "Documentation generated in docs/" + +# Generate justfile cookbook documentation +cookbook: + #!/usr/bin/env bash + mkdir -p docs + OUTPUT="docs/just-cookbook.adoc" + echo "= {{project}} Justfile Cookbook" > "$OUTPUT" + echo ":toc: left" >> "$OUTPUT" + echo ":toclevels: 3" >> "$OUTPUT" + echo "" >> "$OUTPUT" + echo "Generated: $(date -Iseconds)" >> "$OUTPUT" + echo "" >> "$OUTPUT" + echo "== Recipes" >> "$OUTPUT" + echo "" >> "$OUTPUT" + just --list --unsorted | while read -r line; do + if [[ "$line" =~ ^[[:space:]]+([a-z_-]+) ]]; then + recipe="${BASH_REMATCH[1]}" + echo "=== $recipe" >> "$OUTPUT" + echo "" >> "$OUTPUT" + echo "[source,bash]" >> "$OUTPUT" + echo "----" >> "$OUTPUT" + echo "just $recipe" >> "$OUTPUT" + echo "----" >> "$OUTPUT" + echo "" >> "$OUTPUT" + fi + done + echo "Generated: $OUTPUT" + +# Generate man page +man: + #!/usr/bin/env bash + mkdir -p docs/man + cat > docs/man/{{project}}.1 << EOF + .TH {{project}} 1 "$(date +%Y-%m-%d)" "{{version}}" "{{project}} Manual" + .SH NAME + {{project}} \- RSR-compliant project + .SH SYNOPSIS + .B just + [recipe] [args...] + .SH DESCRIPTION + RSR (Rhodium Standard Repository) project managed with just. + .SH AUTHOR + $(git config user.name 2>/dev/null || echo "Author") <$(git config user.email 2>/dev/null || echo "email")> + EOF + echo "Generated: docs/man/{{project}}.1" + +# ═══════════════════════════════════════════════════════════════════════════════ +# CONTAINERS (stapeln ecosystem — Podman + Chainguard Wolfi) +# ═══════════════════════════════════════════════════════════════════════════════ + +# Initialise container templates — substitute placeholders with project values +container-init: + #!/usr/bin/env bash + set -euo pipefail + + if [ ! -d "container" ]; then + echo "Error: container/ directory not found." + echo "This repo may not have been created from rsr-template-repo." + exit 1 + fi + + echo "=== Container Template Initialisation ===" + echo "" + + # Load RSR defaults if available + DEFAULTS="${XDG_CONFIG_HOME:-$HOME/.config}/rsr/defaults" + if [ -f "$DEFAULTS" ]; then + echo "Loading defaults from $DEFAULTS" + # shellcheck source=/dev/null + source "$DEFAULTS" + echo "" + fi + + # Prompt for container-specific values + read -rp "Service name (e.g. my-api) [{{project}}]: " _SERVICE_NAME + SERVICE_NAME="${_SERVICE_NAME:-{{project}}}" + + read -rp "Primary port [8080]: " _PORT + PORT="${_PORT:-8080}" + + read -rp "Container registry [ghcr.io/${OWNER:-hyperpolymath}]: " _REGISTRY + REGISTRY="${_REGISTRY:-ghcr.io/${OWNER:-hyperpolymath}}" + + echo "" + echo " Service: $SERVICE_NAME" + echo " Port: $PORT" + echo " Registry: $REGISTRY" + echo "" + read -rp "Proceed? [Y/n] " CONFIRM + [[ "${CONFIRM:-Y}" =~ ^[Nn] ]] && echo "Aborted." && exit 0 + + echo "" + echo "Replacing container placeholders..." + + # Brace tokens as variables (hex escapes avoid just interpolation) + LB=$(printf '\x7b\x7b') + RB=$(printf '\x7d\x7d') + + SED_ARGS=( + -e "s|${LB}SERVICE_NAME${RB}|${SERVICE_NAME}|g" + -e "s|${LB}PORT${RB}|${PORT}|g" + -e "s|${LB}REGISTRY${RB}|${REGISTRY}|g" + ) + + find container/ -type f | while read -r file; do + if file --brief "$file" | grep -qi 'text\|ascii\|utf'; then + sed -i "${SED_ARGS[@]}" "$file" + fi + done + + echo "Container templates initialised." + echo "" + echo "Next steps:" + echo " 1. Edit container/Containerfile — add your build commands" + echo " 2. Edit container/entrypoint.sh — set your application binary" + echo " 3. Review container/compose.toml — adjust services and volumes" + echo " 4. Build: just container-build" + +# Build container image via cerro-torre pipeline +container-build *args: + #!/usr/bin/env bash + if [ -f "container/ct-build.sh" ]; then + cd container && ./ct-build.sh {{args}} + elif [ -f "container/Containerfile" ]; then + podman build -t {{project}}:latest -f container/Containerfile . + elif [ -f "Containerfile" ]; then + podman build -t {{project}}:latest -f Containerfile . + else + echo "No Containerfile found in container/ or project root" + exit 1 + fi + +# Verify compose configuration +container-verify: + #!/usr/bin/env bash + if [ ! -f "container/compose.toml" ]; then + echo "No container/compose.toml found" + exit 1 + fi + cd container + if command -v selur-compose &>/dev/null; then + selur-compose verify + else + echo "selur-compose not found, falling back to podman compose" + podman compose --file compose.toml config + fi + +# Start container stack +container-up *args: + #!/usr/bin/env bash + if [ ! -f "container/compose.toml" ]; then + echo "No container/compose.toml found" + exit 1 + fi + cd container + if command -v selur-compose &>/dev/null; then + selur-compose up {{args}} + else + podman compose --file compose.toml up {{args}} + fi + +# Stop container stack +container-down: + #!/usr/bin/env bash + cd container 2>/dev/null || { echo "No container/ directory"; exit 1; } + if command -v selur-compose &>/dev/null; then + selur-compose down + else + podman compose --file compose.toml down + fi + +# Sign and verify container bundle (build + pack + sign + verify) +container-sign: + #!/usr/bin/env bash + if [ -f "container/ct-build.sh" ]; then + cd container && ./ct-build.sh + else + echo "No container/ct-build.sh found" + exit 1 + fi + +# Push signed bundle to registry +container-push: + #!/usr/bin/env bash + if [ -f "container/ct-build.sh" ]; then + cd container && ./ct-build.sh --push + else + echo "No container/ct-build.sh found — falling back to podman push" + podman push {{project}}:latest + fi + +# Run container interactively (for debugging) +container-run *args: + podman run --rm -it {{project}}:latest {{args}} + +# ═══════════════════════════════════════════════════════════════════════════════ +# CI & AUTOMATION +# ═══════════════════════════════════════════════════════════════════════════════ + +# Run full CI pipeline locally +ci: deps quality + @echo "CI pipeline complete!" + +# Install git hooks +install-hooks: + @mkdir -p .git/hooks + @cat > .git/hooks/pre-commit << 'HOOKEOF' + #!/bin/bash + just fmt-check || exit 1 + just lint || exit 1 + HOOKEOF + @chmod +x .git/hooks/pre-commit + @echo "Git hooks installed" + +# ═══════════════════════════════════════════════════════════════════════════════ +# SECURITY +# ═══════════════════════════════════════════════════════════════════════════════ + +# Run security audit +security: deps-audit + @echo "=== Security Audit ===" + @command -v gitleaks >/dev/null && gitleaks detect --source . --verbose || true + @command -v trivy >/dev/null && trivy fs --severity HIGH,CRITICAL . || true + @echo "Security audit complete" + +# Generate SBOM +sbom: + @mkdir -p docs/security + @command -v syft >/dev/null && syft . -o spdx-json > docs/security/sbom.spdx.json || echo "syft not found" + +# ═══════════════════════════════════════════════════════════════════════════════ +# VALIDATION & COMPLIANCE +# ═══════════════════════════════════════════════════════════════════════════════ + +# Validate RSR compliance +validate-rsr: + #!/usr/bin/env bash + echo "=== RSR Compliance Check ===" + MISSING="" + for f in .editorconfig .gitignore Justfile README.adoc LICENSE 0-AI-MANIFEST.a2ml; do + [ -f "$f" ] || MISSING="$MISSING $f" + done + for f in .machine_readable/descriptiles/STATE.a2ml .machine_readable/descriptiles/META.a2ml .machine_readable/descriptiles/ECOSYSTEM.a2ml .machine_readable/descriptiles/anchors/ANCHOR.a2ml .machine_readable/policies/MAINTENANCE-AXES.a2ml .machine_readable/policies/MAINTENANCE-CHECKLIST.a2ml .machine_readable/policies/SOFTWARE-DEVELOPMENT-APPROACH.a2ml; do + [ -f "$f" ] || MISSING="$MISSING $f" + done + for f in licensing/exhibits/EXHIBIT-A-ETHICAL-USE.txt licensing/exhibits/EXHIBIT-B-QUANTUM-SAFE.txt licensing/texts/MPL-2.0.txt; do + [ -f "$f" ] || MISSING="$MISSING $f" + done + for f in src/interface/abi src/interface/ffi src/interface/generated; do + [ -d "$f" ] || MISSING="$MISSING $f" + done + for f in docs/maintenance/MAINTENANCE-CHECKLIST.adoc docs/practice/SOFTWARE-DEVELOPMENT-APPROACH.adoc; do + [ -f "$f" ] || MISSING="$MISSING $f" + done + if [ -f ".machine_readable/descriptiles/META.a2ml" ]; then + grep -q 'axis-1 = "must > intend > like"' .machine_readable/descriptiles/META.a2ml || MISSING="$MISSING META.a2ml:axis-1" + grep -q 'axis-2 = "corrective > adaptive > perfective"' .machine_readable/descriptiles/META.a2ml || MISSING="$MISSING META.a2ml:axis-2" + grep -q 'axis-3 = "systems > compliance > effects"' .machine_readable/descriptiles/META.a2ml || MISSING="$MISSING META.a2ml:axis-3" + grep -q 'scoping-first = true' .machine_readable/descriptiles/META.a2ml || MISSING="$MISSING META.a2ml:scoping-first" + grep -q 'idris-unsound-scan = "believe_me/assert_total"' .machine_readable/descriptiles/META.a2ml || MISSING="$MISSING META.a2ml:idris-unsound-scan" + grep -q 'audit-focus = "systems in place, documentation explains actual state, safety/security accounted for, observed effects reviewed"' .machine_readable/descriptiles/META.a2ml || MISSING="$MISSING META.a2ml:audit-focus" + grep -q 'compliance-focus = "seams/compromises/exception register, bounded exceptions, anti-drift checks"' .machine_readable/descriptiles/META.a2ml || MISSING="$MISSING META.a2ml:compliance-focus" + grep -q 'effects-evidence = "benchmark execution/results and maintainer status dialogue/review"' .machine_readable/descriptiles/META.a2ml || MISSING="$MISSING META.a2ml:effects-evidence" + grep -q 'compliance-tooling = "panic-attack"' .machine_readable/policies/MAINTENANCE-AXES.a2ml || MISSING="$MISSING MAINTENANCE-AXES.a2ml:compliance-tooling" + grep -q 'effects-tooling = "ecological checking with sustainabot guidance"' .machine_readable/policies/MAINTENANCE-AXES.a2ml || MISSING="$MISSING MAINTENANCE-AXES.a2ml:effects-tooling" + grep -q 'source-human = "docs/maintenance/MAINTENANCE-CHECKLIST.adoc"' .machine_readable/policies/MAINTENANCE-CHECKLIST.a2ml || MISSING="$MISSING MAINTENANCE-CHECKLIST.a2ml:source-human" + grep -q 'source-human = "docs/practice/SOFTWARE-DEVELOPMENT-APPROACH.adoc"' .machine_readable/policies/SOFTWARE-DEVELOPMENT-APPROACH.a2ml || MISSING="$MISSING SOFTWARE-DEVELOPMENT-APPROACH.a2ml:source-human" + fi + if [ -n "$MISSING" ]; then + echo "MISSING:$MISSING" + exit 1 + fi + echo "RSR compliance: PASS" + +# Validate STATE.a2ml syntax +validate-state: + @if [ -f ".machine_readable/descriptiles/STATE.a2ml" ]; then \ + grep -q '^\[metadata\]' .machine_readable/descriptiles/STATE.a2ml && \ + grep -q 'project\s*=' .machine_readable/descriptiles/STATE.a2ml && \ + echo "STATE.a2ml: valid" || echo "STATE.a2ml: INVALID (missing required sections)"; \ + else \ + echo "No .machine_readable/descriptiles/STATE.a2ml found"; \ + fi + +# Validate AI installation guide completeness (finishbot pre-release check) +validate-ai-install: + #!/usr/bin/env bash + echo "=== AI Installation Guide Check ===" + GUIDE="docs/AI_INSTALLATION_GUIDE.adoc" + README="README.adoc" + ERRORS=0 + + # Check guide exists + if [ ! -f "$GUIDE" ]; then + echo "MISSING: $GUIDE (create from template: docs/AI_INSTALLATION_GUIDE.adoc)" + ERRORS=$((ERRORS + 1)) + else + # Check for unfilled TODO markers + TODOS=$(grep -c '\[TODO-AI-INSTALL' "$GUIDE" 2>/dev/null || true) + if [ "$TODOS" -gt 0 ]; then + echo "INCOMPLETE: $GUIDE has $TODOS unfilled [TODO-AI-INSTALL] markers:" + grep -n '\[TODO-AI-INSTALL' "$GUIDE" | head -10 + ERRORS=$((ERRORS + 1)) + else + echo "$GUIDE: complete (no TODO markers)" + fi + + # Check AI implementation section exists + if ! grep -q 'ai-implementation' "$GUIDE" 2>/dev/null; then + echo "MISSING: [[ai-implementation]] anchor in $GUIDE" + ERRORS=$((ERRORS + 1)) + fi + + # Check privacy notice exists + if ! grep -qi 'privacy' "$GUIDE" 2>/dev/null; then + echo "MISSING: Privacy notice in $GUIDE" + ERRORS=$((ERRORS + 1)) + fi + + # Check install commands exist (not just placeholders) + if ! grep -q 'git clone' "$GUIDE" 2>/dev/null; then + echo "WARNING: No git clone command found in $GUIDE -- install commands may be incomplete" + fi + fi + + # Check README has AI install section + if [ -f "$README" ]; then + if ! grep -qi 'AI-Assisted Installation' "$README" 2>/dev/null; then + echo "MISSING: AI-Assisted Installation section in $README" + echo " Copy from docs/AI-INSTALL-README-SECTION.adoc" + ERRORS=$((ERRORS + 1)) + fi + + # Check README for unfilled TODO markers + README_TODOS=$(grep -c '\[TODO-AI-INSTALL' "$README" 2>/dev/null || true) + if [ "$README_TODOS" -gt 0 ]; then + echo "INCOMPLETE: $README has $README_TODOS unfilled [TODO-AI-INSTALL] markers" + ERRORS=$((ERRORS + 1)) + fi + fi + + if [ "$ERRORS" -gt 0 ]; then + echo "" + echo "AI install guide: FAIL ($ERRORS issues)" + exit 1 + fi + echo "AI install guide: PASS" + +# Full validation suite +validate: validate-rsr validate-state validate-ai-install + @echo "All validations passed!" + +# ═══════════════════════════════════════════════════════════════════════════════ +# STATE MANAGEMENT +# ═══════════════════════════════════════════════════════════════════════════════ + +# Update STATE.a2ml timestamp +state-touch: + @if [ -f ".machine_readable/descriptiles/STATE.a2ml" ]; then \ + sed -i 's/last-updated = "[^"]*"/last-updated = "'"$(date +%Y-%m-%d)"'"/' .machine_readable/descriptiles/STATE.a2ml && \ + echo "STATE.a2ml timestamp updated"; \ + fi + +# Show current phase from STATE.a2ml +state-phase: + @grep -oP 'phase\s*=\s*"\K[^"]+' .machine_readable/descriptiles/STATE.a2ml 2>/dev/null | head -1 || echo "unknown" + +# ═══════════════════════════════════════════════════════════════════════════════ +# GUIX & NIX +# ═══════════════════════════════════════════════════════════════════════════════ + +# Enter Guix development shell (primary) +guix-shell: + guix shell -D -f guix.scm + +# Build with Guix +guix-build: + guix build -f guix.scm + +# ═══════════════════════════════════════════════════════════════════════════════ +# HYBRID AUTOMATION +# ═══════════════════════════════════════════════════════════════════════════════ + +# Run local automation tasks +automate task="all": + #!/usr/bin/env bash + case "{{task}}" in + all) just fmt && just lint && just test && just docs && just state-touch ;; + cleanup) just clean && find . -name "*.orig" -delete && find . -name "*~" -delete ;; + update) just deps && just validate ;; + *) echo "Unknown: {{task}}. Use: all, cleanup, update" && exit 1 ;; + esac + +# ═══════════════════════════════════════════════════════════════════════════════ +# COMBINATORIC MATRIX RECIPES +# ═══════════════════════════════════════════════════════════════════════════════ + +# Build matrix: [debug|release] x [target] x [features] +build-matrix mode="debug" target="" features="": + @echo "Build matrix: mode={{mode}} target={{target}} features={{features}}" + +# Test matrix: [unit|integration|e2e|all] x [verbosity] x [parallel] +test-matrix suite="unit" verbosity="normal" parallel="true": + @echo "Test matrix: suite={{suite}} verbosity={{verbosity}} parallel={{parallel}}" + +# Container matrix: [build|run|push|shell|scan] x [registry] x [tag] +container-matrix action="build" registry="ghcr.io/hyperpolymath" tag="latest": + @echo "Container matrix: action={{action}} registry={{registry}} tag={{tag}}" + +# CI matrix: [lint|test|build|security|all] x [quick|full] +ci-matrix stage="all" depth="quick": + @echo "CI matrix: stage={{stage}} depth={{depth}}" + +# Show all matrix combinations +combinations: + @echo "=== Combinatoric Matrix Recipes ===" + @echo "" + @echo "Build Matrix: just build-matrix [debug|release] [target] [features]" + @echo "Test Matrix: just test-matrix [unit|integration|e2e|all] [verbosity] [parallel]" + @echo "Container: just container-matrix [build|run|push|shell|scan] [registry] [tag]" + @echo "CI Matrix: just ci-matrix [lint|test|build|security|all] [quick|full]" + +# ═══════════════════════════════════════════════════════════════════════════════ +# VERSION CONTROL +# ═══════════════════════════════════════════════════════════════════════════════ + +# Show git status +status: + @git status --short + +# Show recent commits +log count="20": + @git log --oneline -{{count}} + +# Generate CHANGELOG.md with git-cliff +changelog: + @command -v git-cliff >/dev/null || { echo "git-cliff not found — install: cargo install git-cliff"; exit 1; } + git cliff --config .machine_readable/configs/git-cliff/cliff.toml --output CHANGELOG.md + @echo "Generated CHANGELOG.md" + +# Preview changelog for unreleased commits (does not write) +changelog-preview: + @command -v git-cliff >/dev/null || { echo "git-cliff not found — install: cargo install git-cliff"; exit 1; } + git cliff --config .machine_readable/configs/git-cliff/cliff.toml --unreleased --strip header + +# Tag a new release (usage: just release-tag 1.2.3) +release-tag version: + #!/usr/bin/env bash + TAG="v{{version}}" + if git rev-parse "$TAG" >/dev/null 2>&1; then + echo "Tag $TAG already exists" + exit 1 + fi + just changelog + git add CHANGELOG.md + git commit -m "chore(release): prepare $TAG" + git tag -a "$TAG" -m "Release $TAG" + echo "Created tag $TAG — push with: git push origin main --tags" + +# ═══════════════════════════════════════════════════════════════════════════════ +# UTILITIES +# ═══════════════════════════════════════════════════════════════════════════════ + +# Count lines of code +loc: + @find . \( -name "*.rs" -o -name "*.ex" -o -name "*.exs" -o -name "*.res" -o -name "*.gleam" -o -name "*.zig" -o -name "*.idr" -o -name "*.hs" -o -name "*.ncl" -o -name "*.scm" -o -name "*.adb" -o -name "*.ads" \) -not -path './target/*' -not -path './_build/*' 2>/dev/null | xargs wc -l 2>/dev/null | tail -1 || echo "0" + +# Show TODO comments +todos: + @grep -rn "TODO\|FIXME\|HACK\|XXX" --include="*.rs" --include="*.ex" --include="*.res" --include="*.gleam" --include="*.zig" --include="*.idr" --include="*.hs" . 2>/dev/null || echo "No TODOs" + +# Open in editor +edit: + ${EDITOR:-code} . + +# Run high-rigor security assault using panic-attacker +maint-assault: + @./.machine_readable/scripts/maintenance/maint-assault.sh + +# Run panic-attacker pre-commit scan +assail: + @command -v panic-attack >/dev/null 2>&1 && panic-attack assail . || echo "panic-attack not found — install from https://github.com/hyperpolymath/panic-attacker" + +# ═══════════════════════════════════════════════════════════════════════════════ +# ONBOARDING & DIAGNOSTICS +# ═══════════════════════════════════════════════════════════════════════════════ + +# Check all required toolchain dependencies and report health +doctor: + #!/usr/bin/env bash + echo "═══════════════════════════════════════════════════" + echo " A2Ml Validate Action Doctor — Toolchain Health Check" + echo "═══════════════════════════════════════════════════" + echo "" + PASS=0; FAIL=0; WARN=0 + check() { + local name="$1" cmd="$2" min="$3" + if command -v "$cmd" >/dev/null 2>&1; then + VER=$("$cmd" --version 2>&1 | head -1) + echo " [OK] $name — $VER" + PASS=$((PASS + 1)) + else + echo " [FAIL] $name — not found (need $min+)" + FAIL=$((FAIL + 1)) + fi + } + check "just" just "1.25" + check "git" git "2.40" +# Optional tools +if command -v panic-attack >/dev/null 2>&1; then + echo " [OK] panic-attack — available" + PASS=$((PASS + 1)) +else + echo " [WARN] panic-attack — not found (pre-commit scanner)" + WARN=$((WARN + 1)) +fi + echo "" + echo " Result: $PASS passed, $FAIL failed, $WARN warnings" + if [ "$FAIL" -gt 0 ]; then + echo " Run 'just heal' to attempt automatic repair." + exit 1 + fi + echo " All required tools present." + +# Attempt to automatically install missing tools +heal: + #!/usr/bin/env bash + echo "═══════════════════════════════════════════════════" + echo " A2Ml Validate Action Heal — Automatic Tool Installation" + echo "═══════════════════════════════════════════════════" + echo "" +if ! command -v just >/dev/null 2>&1; then + echo "Installing just..." + cargo install just 2>/dev/null || echo "Install just from https://just.systems" +fi + echo "" + echo "Heal complete. Run 'just doctor' to verify." + +# Guided tour of the project structure and key concepts +tour: + #!/usr/bin/env bash + echo "═══════════════════════════════════════════════════" + echo " A2Ml Validate Action — Guided Tour" + echo "═══════════════════════════════════════════════════" + echo "" + echo '**GitHub Action to validate A2ML manifest files in your repository.**' + echo "" + echo "Key directories:" + echo " src/ Source code" + echo " docs/ Documentation" + echo " tests/ Test suite" + echo " .github/workflows/ CI/CD workflows" + echo " .machine_readable/ Machine-readable metadata" + echo " container/ Container configuration" + echo " examples/ Usage examples" + echo "" + echo "Quick commands:" + echo " just doctor Check toolchain health" + echo " just heal Fix missing tools" + echo " just help-me Common workflows" + echo " just default List all recipes" + echo "" + echo "Read more: README.adoc, EXPLAINME.adoc" + +# Show help for common workflows +help-me: + #!/usr/bin/env bash + echo "═══════════════════════════════════════════════════" + echo " A2Ml Validate Action — Common Workflows" + echo "═══════════════════════════════════════════════════" + echo "" +echo "FIRST TIME SETUP:" +echo " just doctor Check toolchain" +echo " just heal Fix missing tools" +echo "" +echo "PRE-COMMIT:" +echo " just assail Run panic-attacker scan" +echo "" +echo "LEARN:" +echo " just tour Guided project tour" +echo " just default List all recipes" + + +# Print the current CRG grade (reads from READINESS.md '**Current Grade:** X' line) +crg-grade: + @grade=$$(grep -oP '(?<=\*\*Current Grade:\*\* )[A-FX]' READINESS.md 2>/dev/null | head -1); \ + [ -z "$$grade" ] && grade="X"; \ + echo "$$grade" + +# Generate a shields.io badge markdown for the current CRG grade +# Looks for '**Current Grade:** X' in READINESS.md; falls back to X +crg-badge: + @grade=$$(grep -oP '(?<=\*\*Current Grade:\*\* )[A-FX]' READINESS.md 2>/dev/null | head -1); \ + [ -z "$$grade" ] && grade="X"; \ + case "$$grade" in \ + A) color="brightgreen" ;; B) color="green" ;; C) color="yellow" ;; \ + D) color="orange" ;; E) color="red" ;; F) color="critical" ;; \ + *) color="lightgrey" ;; esac; \ + echo "[![CRG $$grade](https://img.shields.io/badge/CRG-$$grade-$$color?style=flat-square)](https://github.com/hyperpolymath/standards/tree/main/component-readiness-grades)" diff --git a/validate-action/LICENSE b/validate-action/LICENSE new file mode 100644 index 0000000..14e2f77 --- /dev/null +++ b/validate-action/LICENSE @@ -0,0 +1,373 @@ +Mozilla Public License Version 2.0 +================================== + +1. Definitions +-------------- + +1.1. "Contributor" + means each individual or legal entity that creates, contributes to + the creation of, or owns Covered Software. + +1.2. "Contributor Version" + means the combination of the Contributions of others (if any) used + by a Contributor and that particular Contributor's Contribution. + +1.3. "Contribution" + means Covered Software of a particular Contributor. + +1.4. "Covered Software" + means Source Code Form to which the initial Contributor has attached + the notice in Exhibit A, the Executable Form of such Source Code + Form, and Modifications of such Source Code Form, in each case + including portions thereof. + +1.5. "Incompatible With Secondary Licenses" + means + + (a) that the initial Contributor has attached the notice described + in Exhibit B to the Covered Software; or + + (b) that the Covered Software was made available under the terms of + version 1.1 or earlier of the License, but not also under the + terms of a Secondary License. + +1.6. "Executable Form" + means any form of the work other than Source Code Form. + +1.7. "Larger Work" + means a work that combines Covered Software with other material, in + a separate file or files, that is not Covered Software. + +1.8. "License" + means this document. + +1.9. "Licensable" + means having the right to grant, to the maximum extent possible, + whether at the time of the initial grant or subsequently, any and + all of the rights conveyed by this License. + +1.10. "Modifications" + means any of the following: + + (a) any file in Source Code Form that results from an addition to, + deletion from, or modification of the contents of Covered + Software; or + + (b) any new file in Source Code Form that contains any Covered + Software. + +1.11. "Patent Claims" of a Contributor + means any patent claim(s), including without limitation, method, + process, and apparatus claims, in any patent Licensable by such + Contributor that would be infringed, but for the grant of the + License, by the making, using, selling, offering for sale, having + made, import, or transfer of either its Contributions or its + Contributor Version. + +1.12. "Secondary License" + means either the GNU General Public License, Version 2.0, the GNU + Lesser General Public License, Version 2.1, the GNU Affero General + Public License, Version 3.0, or any later versions of those + licenses. + +1.13. "Source Code Form" + means the form of the work preferred for making modifications. + +1.14. "You" (or "Your") + means an individual or a legal entity exercising rights under this + License. For legal entities, "You" includes any entity that + controls, is controlled by, or is under common control with You. For + purposes of this definition, "control" means (a) the power, direct + or indirect, to cause the direction or management of such entity, + whether by contract or otherwise, or (b) ownership of more than + fifty percent (50%) of the outstanding shares or beneficial + ownership of such entity. + +2. License Grants and Conditions +-------------------------------- + +2.1. Grants + +Each Contributor hereby grants You a world-wide, royalty-free, +non-exclusive license: + +(a) under intellectual property rights (other than patent or trademark) + Licensable by such Contributor to use, reproduce, make available, + modify, display, perform, distribute, and otherwise exploit its + Contributions, either on an unmodified basis, with Modifications, or + as part of a Larger Work; and + +(b) under Patent Claims of such Contributor to make, use, sell, offer + for sale, have made, import, and otherwise transfer either its + Contributions or its Contributor Version. + +2.2. Effective Date + +The licenses granted in Section 2.1 with respect to any Contribution +become effective for each Contribution on the date the Contributor first +distributes such Contribution. + +2.3. Limitations on Grant Scope + +The licenses granted in this Section 2 are the only rights granted under +this License. No additional rights or licenses will be implied from the +distribution or licensing of Covered Software under this License. +Notwithstanding Section 2.1(b) above, no patent license is granted by a +Contributor: + +(a) for any code that a Contributor has removed from Covered Software; + or + +(b) for infringements caused by: (i) Your and any other third party's + modifications of Covered Software, or (ii) the combination of its + Contributions with other software (except as part of its Contributor + Version); or + +(c) under Patent Claims infringed by Covered Software in the absence of + its Contributions. + +This License does not grant any rights in the trademarks, service marks, +or logos of any Contributor (except as may be necessary to comply with +the notice requirements in Section 3.4). + +2.4. Subsequent Licenses + +No Contributor makes additional grants as a result of Your choice to +distribute the Covered Software under a subsequent version of this +License (see Section 10.2) or under the terms of a Secondary License (if +permitted under the terms of Section 3.3). + +2.5. Representation + +Each Contributor represents that the Contributor believes its +Contributions are its original creation(s) or it has sufficient rights +to grant the rights to its Contributions conveyed by this License. + +2.6. Fair Use + +This License is not intended to limit any rights You have under +applicable copyright doctrines of fair use, fair dealing, or other +equivalents. + +2.7. Conditions + +Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted +in Section 2.1. + +3. Responsibilities +------------------- + +3.1. Distribution of Source Form + +All distribution of Covered Software in Source Code Form, including any +Modifications that You create or to which You contribute, must be under +the terms of this License. You must inform recipients that the Source +Code Form of the Covered Software is governed by the terms of this +License, and how they can obtain a copy of this License. You may not +attempt to alter or restrict the recipients' rights in the Source Code +Form. + +3.2. Distribution of Executable Form + +If You distribute Covered Software in Executable Form then: + +(a) such Covered Software must also be made available in Source Code + Form, as described in Section 3.1, and You must inform recipients of + the Executable Form how they can obtain a copy of such Source Code + Form by reasonable means in a timely manner, at a charge no more + than the cost of distribution to the recipient; and + +(b) You may distribute such Executable Form under the terms of this + License, or sublicense it under different terms, provided that the + license for the Executable Form does not attempt to limit or alter + the recipients' rights in the Source Code Form under this License. + +3.3. Distribution of a Larger Work + +You may create and distribute a Larger Work under terms of Your choice, +provided that You also comply with the requirements of this License for +the Covered Software. If the Larger Work is a combination of Covered +Software with a work governed by one or more Secondary Licenses, and the +Covered Software is not Incompatible With Secondary Licenses, this +License permits You to additionally distribute such Covered Software +under the terms of such Secondary License(s), so that the recipient of +the Larger Work may, at their option, further distribute the Covered +Software under the terms of either this License or such Secondary +License(s). + +3.4. Notices + +You may not remove or alter the substance of any license notices +(including copyright notices, patent notices, disclaimers of warranty, +or limitations of liability) contained within the Source Code Form of +the Covered Software, except that You may alter any license notices to +the extent required to remedy known factual inaccuracies. + +3.5. Application of Additional Terms + +You may choose to offer, and to charge a fee for, warranty, support, +indemnity or liability obligations to one or more recipients of Covered +Software. However, You may do so only on Your own behalf, and not on +behalf of any Contributor. You must make it absolutely clear that any +such warranty, support, indemnity, or liability obligation is offered by +You alone, and You hereby agree to indemnify every Contributor for any +liability incurred by such Contributor as a result of warranty, support, +indemnity or liability terms You offer. You may include additional +disclaimers of warranty and limitations of liability specific to any +jurisdiction. + +4. Inability to Comply Due to Statute or Regulation +--------------------------------------------------- + +If it is impossible for You to comply with any of the terms of this +License with respect to some or all of the Covered Software due to +statute, judicial order, or regulation then You must: (a) comply with +the terms of this License to the maximum extent possible; and (b) +describe the limitations and the code they affect. Such description must +be placed in a text file included with all distributions of the Covered +Software under this License. Except to the extent prohibited by statute +or regulation, such description must be sufficiently detailed for a +recipient of ordinary skill to be able to understand it. + +5. Termination +-------------- + +5.1. The rights granted under this License will terminate automatically +if You fail to comply with any of its terms. However, if You become +compliant, then the rights granted under this License from a particular +Contributor are reinstated (a) provisionally, unless and until such +Contributor explicitly and finally terminates Your grants, and (b) on an +ongoing basis, if such Contributor fails to notify You of the +non-compliance by some reasonable means prior to 60 days after You have +come back into compliance. Moreover, Your grants from a particular +Contributor are reinstated on an ongoing basis if such Contributor +notifies You of the non-compliance by some reasonable means, this is the +first time You have received notice of non-compliance with this License +from such Contributor, and You become compliant prior to 30 days after +Your receipt of the notice. + +5.2. If You initiate litigation against any entity by asserting a patent +infringement claim (excluding declaratory judgment actions, +counter-claims, and cross-claims) alleging that a Contributor Version +directly or indirectly infringes any patent, then the rights granted to +You by any and all Contributors for the Covered Software under Section +2.1 of this License shall terminate. + +5.3. In the event of termination under Sections 5.1 or 5.2 above, all +end user license agreements (excluding distributors and resellers) which +have been validly granted by You or Your distributors under this License +prior to termination shall survive termination. + +************************************************************************ +* * +* 6. Disclaimer of Warranty * +* ------------------------- * +* * +* Covered Software is provided under this License on an "as is" * +* basis, without warranty of any kind, either expressed, implied, or * +* statutory, including, without limitation, warranties that the * +* Covered Software is free of defects, merchantable, fit for a * +* particular purpose or non-infringing. The entire risk as to the * +* quality and performance of the Covered Software is with You. * +* Should any Covered Software prove defective in any respect, You * +* (not any Contributor) assume the cost of any necessary servicing, * +* repair, or correction. This disclaimer of warranty constitutes an * +* essential part of this License. No use of any Covered Software is * +* authorized under this License except under this disclaimer. * +* * +************************************************************************ + +************************************************************************ +* * +* 7. Limitation of Liability * +* -------------------------- * +* * +* Under no circumstances and under no legal theory, whether tort * +* (including negligence), contract, or otherwise, shall any * +* Contributor, or anyone who distributes Covered Software as * +* permitted above, be liable to You for any direct, indirect, * +* special, incidental, or consequential damages of any character * +* including, without limitation, damages for lost profits, loss of * +* goodwill, work stoppage, computer failure or malfunction, or any * +* and all other commercial damages or losses, even if such party * +* shall have been informed of the possibility of such damages. This * +* limitation of liability shall not apply to liability for death or * +* personal injury resulting from such party's negligence to the * +* extent applicable law prohibits such limitation. Some * +* jurisdictions do not allow the exclusion or limitation of * +* incidental or consequential damages, so this exclusion and * +* limitation may not apply to You. * +* * +************************************************************************ + +8. Litigation +------------- + +Any litigation relating to this License may be brought only in the +courts of a jurisdiction where the defendant maintains its principal +place of business and such litigation shall be governed by laws of that +jurisdiction, without reference to its conflict-of-law provisions. +Nothing in this Section shall prevent a party's ability to bring +cross-claims or counter-claims. + +9. Miscellaneous +---------------- + +This License represents the complete agreement concerning the subject +matter hereof. If any provision of this License is held to be +unenforceable, such provision shall be reformed only to the extent +necessary to make it enforceable. Any law or regulation which provides +that the language of a contract shall be construed against the drafter +shall not be used to construe this License against a Contributor. + +10. Versions of the License +--------------------------- + +10.1. New Versions + +Mozilla Foundation is the license steward. Except as provided in Section +10.3, no one other than the license steward has the right to modify or +publish new versions of this License. Each version will be given a +distinguishing version number. + +10.2. Effect of New Versions + +You may distribute the Covered Software under the terms of the version +of the License under which You originally received the Covered Software, +or under the terms of any subsequent version published by the license +steward. + +10.3. Modified Versions + +If you create software not governed by this License, and you want to +create a new license for such software, you may create and use a +modified version of this License if you rename the license and remove +any references to the name of the license steward (except to note that +such modified license differs from this License). + +10.4. Distributing Source Code Form that is Incompatible With Secondary +Licenses + +If You choose to distribute Source Code Form that is Incompatible With +Secondary Licenses under the terms of this version of the License, the +notice described in Exhibit B of this License must be attached. + +Exhibit A - Source Code Form License Notice +------------------------------------------- + + This Source Code Form is subject to the terms of the Mozilla Public + License, v. 2.0. If a copy of the MPL was not distributed with this + file, You can obtain one at http://mozilla.org/MPL/2.0/. + +If it is not possible or desirable to put the notice in a particular +file, then You may include the notice in a location (such as a LICENSE +file in a relevant directory) where a recipient would be likely to look +for such a notice. + +You may add additional accurate notices of copyright ownership. + +Exhibit B - "Incompatible With Secondary Licenses" Notice +--------------------------------------------------------- + + This Source Code Form is "Incompatible With Secondary Licenses", as + defined by the Mozilla Public License, v. 2.0. diff --git a/validate-action/LICENSES/AGPL-3.0-or-later.txt b/validate-action/LICENSES/AGPL-3.0-or-later.txt new file mode 100644 index 0000000..be3f7b2 --- /dev/null +++ b/validate-action/LICENSES/AGPL-3.0-or-later.txt @@ -0,0 +1,661 @@ + GNU AFFERO GENERAL PUBLIC LICENSE + Version 3, 19 November 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU Affero General Public License is a free, copyleft license for +software and other kinds of works, specifically designed to ensure +cooperation with the community in the case of network server software. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +our General Public Licenses are intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + Developers that use our General Public Licenses protect your rights +with two steps: (1) assert copyright on the software, and (2) offer +you this License which gives you legal permission to copy, distribute +and/or modify the software. + + A secondary benefit of defending all users' freedom is that +improvements made in alternate versions of the program, if they +receive widespread use, become available for other developers to +incorporate. Many developers of free software are heartened and +encouraged by the resulting cooperation. However, in the case of +software used on network servers, this result may fail to come about. +The GNU General Public License permits making a modified version and +letting the public access it on a server without ever releasing its +source code to the public. + + The GNU Affero General Public License is designed specifically to +ensure that, in such cases, the modified source code becomes available +to the community. It requires the operator of a network server to +provide the source code of the modified version running there to the +users of that server. Therefore, public use of a modified version, on +a publicly accessible server, gives the public access to the source +code of the modified version. + + An older license, called the Affero General Public License and +published by Affero, was designed to accomplish similar goals. This is +a different license, not a version of the Affero GPL, but Affero has +released a new version of the Affero GPL which permits relicensing under +this license. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU Affero General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Remote Network Interaction; Use with the GNU General Public License. + + Notwithstanding any other provision of this License, if you modify the +Program, your modified version must prominently offer all users +interacting with it remotely through a computer network (if your version +supports such interaction) an opportunity to receive the Corresponding +Source of your version by providing access to the Corresponding Source +from a network server at no charge, through some standard or customary +means of facilitating copying of software. This Corresponding Source +shall include the Corresponding Source for any work covered by version 3 +of the GNU General Public License that is incorporated pursuant to the +following paragraph. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the work with which it is combined will remain governed by version +3 of the GNU General Public License. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU Affero General Public License from time to time. Such new versions +will be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU Affero General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU Affero General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU Affero General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If your software can interact with users remotely through a computer +network, you should also make sure that it provides a way for users to +get its source. For example, if your program is a web application, its +interface could display a "Source" link that leads users to an archive +of the code. There are many ways you could offer source, and different +solutions will be better for different programs; see section 13 for the +specific requirements. + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU AGPL, see +. diff --git a/validate-action/LICENSES/CC-BY-SA-4.0.txt b/validate-action/LICENSES/CC-BY-SA-4.0.txt new file mode 100644 index 0000000..2d58298 --- /dev/null +++ b/validate-action/LICENSES/CC-BY-SA-4.0.txt @@ -0,0 +1,428 @@ +Attribution-ShareAlike 4.0 International + +======================================================================= + +Creative Commons Corporation ("Creative Commons") is not a law firm and +does not provide legal services or legal advice. Distribution of +Creative Commons public licenses does not create a lawyer-client or +other relationship. Creative Commons makes its licenses and related +information available on an "as-is" basis. Creative Commons gives no +warranties regarding its licenses, any material licensed under their +terms and conditions, or any related information. Creative Commons +disclaims all liability for damages resulting from their use to the +fullest extent possible. + +Using Creative Commons Public Licenses + +Creative Commons public licenses provide a standard set of terms and +conditions that creators and other rights holders may use to share +original works of authorship and other material subject to copyright +and certain other rights specified in the public license below. The +following considerations are for informational purposes only, are not +exhaustive, and do not form part of our licenses. + + Considerations for licensors: Our public licenses are + intended for use by those authorized to give the public + permission to use material in ways otherwise restricted by + copyright and certain other rights. Our licenses are + irrevocable. Licensors should read and understand the terms + and conditions of the license they choose before applying it. + Licensors should also secure all rights necessary before + applying our licenses so that the public can reuse the + material as expected. Licensors should clearly mark any + material not subject to the license. This includes other CC- + licensed material, or material used under an exception or + limitation to copyright. More considerations for licensors: + wiki.creativecommons.org/Considerations_for_licensors + + Considerations for the public: By using one of our public + licenses, a licensor grants the public permission to use the + licensed material under specified terms and conditions. If + the licensor's permission is not necessary for any reason--for + example, because of any applicable exception or limitation to + copyright--then that use is not regulated by the license. Our + licenses grant only permissions under copyright and certain + other rights that a licensor has authority to grant. Use of + the licensed material may still be restricted for other + reasons, including because others have copyright or other + rights in the material. A licensor may make special requests, + such as asking that all changes be marked or described. + Although not required by our licenses, you are encouraged to + respect those requests where reasonable. More considerations + for the public: + wiki.creativecommons.org/Considerations_for_licensees + +======================================================================= + +Creative Commons Attribution-ShareAlike 4.0 International Public +License + +By exercising the Licensed Rights (defined below), You accept and agree +to be bound by the terms and conditions of this Creative Commons +Attribution-ShareAlike 4.0 International Public License ("Public +License"). To the extent this Public License may be interpreted as a +contract, You are granted the Licensed Rights in consideration of Your +acceptance of these terms and conditions, and the Licensor grants You +such rights in consideration of benefits the Licensor receives from +making the Licensed Material available under these terms and +conditions. + + +Section 1 -- Definitions. + + a. Adapted Material means material subject to Copyright and Similar + Rights that is derived from or based upon the Licensed Material + and in which the Licensed Material is translated, altered, + arranged, transformed, or otherwise modified in a manner requiring + permission under the Copyright and Similar Rights held by the + Licensor. For purposes of this Public License, where the Licensed + Material is a musical work, performance, or sound recording, + Adapted Material is always produced where the Licensed Material is + synched in timed relation with a moving image. + + b. Adapter's License means the license You apply to Your Copyright + and Similar Rights in Your contributions to Adapted Material in + accordance with the terms and conditions of this Public License. + + c. BY-SA Compatible License means a license listed at + creativecommons.org/compatiblelicenses, approved by Creative + Commons as essentially the equivalent of this Public License. + + d. Copyright and Similar Rights means copyright and/or similar rights + closely related to copyright including, without limitation, + performance, broadcast, sound recording, and Sui Generis Database + Rights, without regard to how the rights are labeled or + categorized. For purposes of this Public License, the rights + specified in Section 2(b)(1)-(2) are not Copyright and Similar + Rights. + + e. Effective Technological Measures means those measures that, in the + absence of proper authority, may not be circumvented under laws + fulfilling obligations under Article 11 of the WIPO Copyright + Treaty adopted on December 20, 1996, and/or similar international + agreements. + + f. Exceptions and Limitations means fair use, fair dealing, and/or + any other exception or limitation to Copyright and Similar Rights + that applies to Your use of the Licensed Material. + + g. License Elements means the license attributes listed in the name + of a Creative Commons Public License. The License Elements of this + Public License are Attribution and ShareAlike. + + h. Licensed Material means the artistic or literary work, database, + or other material to which the Licensor applied this Public + License. + + i. Licensed Rights means the rights granted to You subject to the + terms and conditions of this Public License, which are limited to + all Copyright and Similar Rights that apply to Your use of the + Licensed Material and that the Licensor has authority to license. + + j. Licensor means the individual(s) or entity(ies) granting rights + under this Public License. + + k. Share means to provide material to the public by any means or + process that requires permission under the Licensed Rights, such + as reproduction, public display, public performance, distribution, + dissemination, communication, or importation, and to make material + available to the public including in ways that members of the + public may access the material from a place and at a time + individually chosen by them. + + l. Sui Generis Database Rights means rights other than copyright + resulting from Directive 96/9/EC of the European Parliament and of + the Council of 11 March 1996 on the legal protection of databases, + as amended and/or succeeded, as well as other essentially + equivalent rights anywhere in the world. + + m. You means the individual or entity exercising the Licensed Rights + under this Public License. Your has a corresponding meaning. + + +Section 2 -- Scope. + + a. License grant. + + 1. Subject to the terms and conditions of this Public License, + the Licensor hereby grants You a worldwide, royalty-free, + non-sublicensable, non-exclusive, irrevocable license to + exercise the Licensed Rights in the Licensed Material to: + + a. reproduce and Share the Licensed Material, in whole or + in part; and + + b. produce, reproduce, and Share Adapted Material. + + 2. Exceptions and Limitations. For the avoidance of doubt, where + Exceptions and Limitations apply to Your use, this Public + License does not apply, and You do not need to comply with + its terms and conditions. + + 3. Term. The term of this Public License is specified in Section + 6(a). + + 4. Media and formats; technical modifications allowed. The + Licensor authorizes You to exercise the Licensed Rights in + all media and formats whether now known or hereafter created, + and to make technical modifications necessary to do so. The + Licensor waives and/or agrees not to assert any right or + authority to forbid You from making technical modifications + necessary to exercise the Licensed Rights, including + technical modifications necessary to circumvent Effective + Technological Measures. For purposes of this Public License, + simply making modifications authorized by this Section 2(a) + (4) never produces Adapted Material. + + 5. Downstream recipients. + + a. Offer from the Licensor -- Licensed Material. Every + recipient of the Licensed Material automatically + receives an offer from the Licensor to exercise the + Licensed Rights under the terms and conditions of this + Public License. + + b. Additional offer from the Licensor -- Adapted Material. + Every recipient of Adapted Material from You + automatically receives an offer from the Licensor to + exercise the Licensed Rights in the Adapted Material + under the conditions of the Adapter's License You apply. + + c. No downstream restrictions. You may not offer or impose + any additional or different terms or conditions on, or + apply any Effective Technological Measures to, the + Licensed Material if doing so restricts exercise of the + Licensed Rights by any recipient of the Licensed + Material. + + 6. No endorsement. Nothing in this Public License constitutes or + may be construed as permission to assert or imply that You + are, or that Your use of the Licensed Material is, connected + with, or sponsored, endorsed, or granted official status by, + the Licensor or others designated to receive attribution as + provided in Section 3(a)(1)(A)(i). + + b. Other rights. + + 1. Moral rights, such as the right of integrity, are not + licensed under this Public License, nor are publicity, + privacy, and/or other similar personality rights; however, to + the extent possible, the Licensor waives and/or agrees not to + assert any such rights held by the Licensor to the limited + extent necessary to allow You to exercise the Licensed + Rights, but not otherwise. + + 2. Patent and trademark rights are not licensed under this + Public License. + + 3. To the extent possible, the Licensor waives any right to + collect royalties from You for the exercise of the Licensed + Rights, whether directly or through a collecting society + under any voluntary or waivable statutory or compulsory + licensing scheme. In all other cases the Licensor expressly + reserves any right to collect such royalties. + + +Section 3 -- License Conditions. + +Your exercise of the Licensed Rights is expressly made subject to the +following conditions. + + a. Attribution. + + 1. If You Share the Licensed Material (including in modified + form), You must: + + a. retain the following if it is supplied by the Licensor + with the Licensed Material: + + i. identification of the creator(s) of the Licensed + Material and any others designated to receive + attribution, in any reasonable manner requested by + the Licensor (including by pseudonym if + designated); + + ii. a copyright notice; + + iii. a notice that refers to this Public License; + + iv. a notice that refers to the disclaimer of + warranties; + + v. a URI or hyperlink to the Licensed Material to the + extent reasonably practicable; + + b. indicate if You modified the Licensed Material and + retain an indication of any previous modifications; and + + c. indicate the Licensed Material is licensed under this + Public License, and include the text of, or the URI or + hyperlink to, this Public License. + + 2. You may satisfy the conditions in Section 3(a)(1) in any + reasonable manner based on the medium, means, and context in + which You Share the Licensed Material. For example, it may be + reasonable to satisfy the conditions by providing a URI or + hyperlink to a resource that includes the required + information. + + 3. If requested by the Licensor, You must remove any of the + information required by Section 3(a)(1)(A) to the extent + reasonably practicable. + + b. ShareAlike. + + In addition to the conditions in Section 3(a), if You Share + Adapted Material You produce, the following conditions also apply. + + 1. The Adapter's License You apply must be a Creative Commons + license with the same License Elements, this version or + later, or a BY-SA Compatible License. + + 2. You must include the text of, or the URI or hyperlink to, the + Adapter's License You apply. You may satisfy this condition + in any reasonable manner based on the medium, means, and + context in which You Share Adapted Material. + + 3. You may not offer or impose any additional or different terms + or conditions on, or apply any Effective Technological + Measures to, Adapted Material that restrict exercise of the + rights granted under the Adapter's License You apply. + + +Section 4 -- Sui Generis Database Rights. + +Where the Licensed Rights include Sui Generis Database Rights that +apply to Your use of the Licensed Material: + + a. for the avoidance of doubt, Section 2(a)(1) grants You the right + to extract, reuse, reproduce, and Share all or a substantial + portion of the contents of the database; + + b. if You include all or a substantial portion of the database + contents in a database in which You have Sui Generis Database + Rights, then the database in which You have Sui Generis Database + Rights (but not its individual contents) is Adapted Material, + including for purposes of Section 3(b); and + + c. You must comply with the conditions in Section 3(a) if You Share + all or a substantial portion of the contents of the database. + +For the avoidance of doubt, this Section 4 supplements and does not +replace Your obligations under this Public License where the Licensed +Rights include other Copyright and Similar Rights. + + +Section 5 -- Disclaimer of Warranties and Limitation of Liability. + + a. UNLESS OTHERWISE SEPARATELY UNDERTAKEN BY THE LICENSOR, TO THE + EXTENT POSSIBLE, THE LICENSOR OFFERS THE LICENSED MATERIAL AS-IS + AND AS-AVAILABLE, AND MAKES NO REPRESENTATIONS OR WARRANTIES OF + ANY KIND CONCERNING THE LICENSED MATERIAL, WHETHER EXPRESS, + IMPLIED, STATUTORY, OR OTHER. THIS INCLUDES, WITHOUT LIMITATION, + WARRANTIES OF TITLE, MERCHANTABILITY, FITNESS FOR A PARTICULAR + PURPOSE, NON-INFRINGEMENT, ABSENCE OF LATENT OR OTHER DEFECTS, + ACCURACY, OR THE PRESENCE OR ABSENCE OF ERRORS, WHETHER OR NOT + KNOWN OR DISCOVERABLE. WHERE DISCLAIMERS OF WARRANTIES ARE NOT + ALLOWED IN FULL OR IN PART, THIS DISCLAIMER MAY NOT APPLY TO YOU. + + b. TO THE EXTENT POSSIBLE, IN NO EVENT WILL THE LICENSOR BE LIABLE + TO YOU ON ANY LEGAL THEORY (INCLUDING, WITHOUT LIMITATION, + NEGLIGENCE) OR OTHERWISE FOR ANY DIRECT, SPECIAL, INDIRECT, + INCIDENTAL, CONSEQUENTIAL, PUNITIVE, EXEMPLARY, OR OTHER LOSSES, + COSTS, EXPENSES, OR DAMAGES ARISING OUT OF THIS PUBLIC LICENSE OR + USE OF THE LICENSED MATERIAL, EVEN IF THE LICENSOR HAS BEEN + ADVISED OF THE POSSIBILITY OF SUCH LOSSES, COSTS, EXPENSES, OR + DAMAGES. WHERE A LIMITATION OF LIABILITY IS NOT ALLOWED IN FULL OR + IN PART, THIS LIMITATION MAY NOT APPLY TO YOU. + + c. The disclaimer of warranties and limitation of liability provided + above shall be interpreted in a manner that, to the extent + possible, most closely approximates an absolute disclaimer and + waiver of all liability. + + +Section 6 -- Term and Termination. + + a. This Public License applies for the term of the Copyright and + Similar Rights licensed here. However, if You fail to comply with + this Public License, then Your rights under this Public License + terminate automatically. + + b. Where Your right to use the Licensed Material has terminated under + Section 6(a), it reinstates: + + 1. automatically as of the date the violation is cured, provided + it is cured within 30 days of Your discovery of the + violation; or + + 2. upon express reinstatement by the Licensor. + + For the avoidance of doubt, this Section 6(b) does not affect any + right the Licensor may have to seek remedies for Your violations + of this Public License. + + c. For the avoidance of doubt, the Licensor may also offer the + Licensed Material under separate terms or conditions or stop + distributing the Licensed Material at any time; however, doing so + will not terminate this Public License. + + d. Sections 1, 5, 6, 7, and 8 survive termination of this Public + License. + + +Section 7 -- Other Terms and Conditions. + + a. The Licensor shall not be bound by any additional or different + terms or conditions communicated by You unless expressly agreed. + + b. Any arrangements, understandings, or agreements regarding the + Licensed Material not stated herein are separate from and + independent of the terms and conditions of this Public License. + + +Section 8 -- Interpretation. + + a. For the avoidance of doubt, this Public License does not, and + shall not be interpreted to, reduce, limit, restrict, or impose + conditions on any use of the Licensed Material that could lawfully + be made without permission under this Public License. + + b. To the extent possible, if any provision of this Public License is + deemed unenforceable, it shall be automatically reformed to the + minimum extent necessary to make it enforceable. If the provision + cannot be reformed, it shall be severed from this Public License + without affecting the enforceability of the remaining terms and + conditions. + + c. No term or condition of this Public License will be waived and no + failure to comply consented to unless expressly agreed to by the + Licensor. + + d. Nothing in this Public License constitutes or may be interpreted + as a limitation upon, or waiver of, any privileges and immunities + that apply to the Licensor or You, including from the legal + processes of any jurisdiction or authority. + + +======================================================================= + +Creative Commons is not a party to its public +licenses. Notwithstanding, Creative Commons may elect to apply one of +its public licenses to material it publishes and in those instances +will be considered the “Licensor.” The text of the Creative Commons +public licenses is dedicated to the public domain under the CC0 Public +Domain Dedication. Except for the limited purpose of indicating that +material is shared under a Creative Commons public license or as +otherwise permitted by the Creative Commons policies published at +creativecommons.org/policies, Creative Commons does not authorize the +use of the trademark "Creative Commons" or any other trademark or logo +of Creative Commons without its prior written consent including, +without limitation, in connection with any unauthorized modifications +to any of its public licenses or any other arrangements, +understandings, or agreements concerning use of licensed material. For +the avoidance of doubt, this paragraph does not form part of the +public licenses. + +Creative Commons may be contacted at creativecommons.org. + diff --git a/validate-action/LICENSES/MPL-2.0.txt b/validate-action/LICENSES/MPL-2.0.txt new file mode 100644 index 0000000..d0a1fa1 --- /dev/null +++ b/validate-action/LICENSES/MPL-2.0.txt @@ -0,0 +1,373 @@ +Mozilla Public License Version 2.0 +================================== + +1. Definitions +-------------- + +1.1. "Contributor" + means each individual or legal entity that creates, contributes to + the creation of, or owns Covered Software. + +1.2. "Contributor Version" + means the combination of the Contributions of others (if any) used + by a Contributor and that particular Contributor's Contribution. + +1.3. "Contribution" + means Covered Software of a particular Contributor. + +1.4. "Covered Software" + means Source Code Form to which the initial Contributor has attached + the notice in Exhibit A, the Executable Form of such Source Code + Form, and Modifications of such Source Code Form, in each case + including portions thereof. + +1.5. "Incompatible With Secondary Licenses" + means + + (a) that the initial Contributor has attached the notice described + in Exhibit B to the Covered Software; or + + (b) that the Covered Software was made available under the terms of + version 1.1 or earlier of the License, but not also under the + terms of a Secondary License. + +1.6. "Executable Form" + means any form of the work other than Source Code Form. + +1.7. "Larger Work" + means a work that combines Covered Software with other material, in + a separate file or files, that is not Covered Software. + +1.8. "License" + means this document. + +1.9. "Licensable" + means having the right to grant, to the maximum extent possible, + whether at the time of the initial grant or subsequently, any and + all of the rights conveyed by this License. + +1.10. "Modifications" + means any of the following: + + (a) any file in Source Code Form that results from an addition to, + deletion from, or modification of the contents of Covered + Software; or + + (b) any new file in Source Code Form that contains any Covered + Software. + +1.11. "Patent Claims" of a Contributor + means any patent claim(s), including without limitation, method, + process, and apparatus claims, in any patent Licensable by such + Contributor that would be infringed, but for the grant of the + License, by the making, using, selling, offering for sale, having + made, import, or transfer of either its Contributions or its + Contributor Version. + +1.12. "Secondary License" + means either the GNU General Public License, Version 2.0, the GNU + Lesser General Public License, Version 2.1, the GNU Affero General + Public License, Version 3.0, or any later versions of those + licenses. + +1.13. "Source Code Form" + means the form of the work preferred for making modifications. + +1.14. "You" (or "Your") + means an individual or a legal entity exercising rights under this + License. For legal entities, "You" includes any entity that + controls, is controlled by, or is under common control with You. For + purposes of this definition, "control" means (a) the power, direct + or indirect, to cause the direction or management of such entity, + whether by contract or otherwise, or (b) ownership of more than + fifty percent (50%) of the outstanding shares or beneficial + ownership of such entity. + +2. License Grants and Conditions +-------------------------------- + +2.1. Grants + +Each Contributor hereby grants You a world-wide, royalty-free, +non-exclusive license: + +(a) under intellectual property rights (other than patent or trademark) + Licensable by such Contributor to use, reproduce, make available, + modify, display, perform, distribute, and otherwise exploit its + Contributions, either on an unmodified basis, with Modifications, or + as part of a Larger Work; and + +(b) under Patent Claims of such Contributor to make, use, sell, offer + for sale, have made, import, and otherwise transfer either its + Contributions or its Contributor Version. + +2.2. Effective Date + +The licenses granted in Section 2.1 with respect to any Contribution +become effective for each Contribution on the date the Contributor first +distributes such Contribution. + +2.3. Limitations on Grant Scope + +The licenses granted in this Section 2 are the only rights granted under +this License. No additional rights or licenses will be implied from the +distribution or licensing of Covered Software under this License. +Notwithstanding Section 2.1(b) above, no patent license is granted by a +Contributor: + +(a) for any code that a Contributor has removed from Covered Software; + or + +(b) for infringements caused by: (i) Your and any other third party's + modifications of Covered Software, or (ii) the combination of its + Contributions with other software (except as part of its Contributor + Version); or + +(c) under Patent Claims infringed by Covered Software in the absence of + its Contributions. + +This License does not grant any rights in the trademarks, service marks, +or logos of any Contributor (except as may be necessary to comply with +the notice requirements in Section 3.4). + +2.4. Subsequent Licenses + +No Contributor makes additional grants as a result of Your choice to +distribute the Covered Software under a subsequent version of this +License (see Section 10.2) or under the terms of a Secondary License (if +permitted under the terms of Section 3.3). + +2.5. Representation + +Each Contributor represents that the Contributor believes its +Contributions are its original creation(s) or it has sufficient rights +to grant the rights to its Contributions conveyed by this License. + +2.6. Fair Use + +This License is not intended to limit any rights You have under +applicable copyright doctrines of fair use, fair dealing, or other +equivalents. + +2.7. Conditions + +Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted +in Section 2.1. + +3. Responsibilities +------------------- + +3.1. Distribution of Source Form + +All distribution of Covered Software in Source Code Form, including any +Modifications that You create or to which You contribute, must be under +the terms of this License. You must inform recipients that the Source +Code Form of the Covered Software is governed by the terms of this +License, and how they can obtain a copy of this License. You may not +attempt to alter or restrict the recipients' rights in the Source Code +Form. + +3.2. Distribution of Executable Form + +If You distribute Covered Software in Executable Form then: + +(a) such Covered Software must also be made available in Source Code + Form, as described in Section 3.1, and You must inform recipients of + the Executable Form how they can obtain a copy of such Source Code + Form by reasonable means in a timely manner, at a charge no more + than the cost of distribution to the recipient; and + +(b) You may distribute such Executable Form under the terms of this + License, or sublicense it under different terms, provided that the + license for the Executable Form does not attempt to limit or alter + the recipients' rights in the Source Code Form under this License. + +3.3. Distribution of a Larger Work + +You may create and distribute a Larger Work under terms of Your choice, +provided that You also comply with the requirements of this License for +the Covered Software. If the Larger Work is a combination of Covered +Software with a work governed by one or more Secondary Licenses, and the +Covered Software is not Incompatible With Secondary Licenses, this +License permits You to additionally distribute such Covered Software +under the terms of such Secondary License(s), so that the recipient of +the Larger Work may, at their option, further distribute the Covered +Software under the terms of either this License or such Secondary +License(s). + +3.4. Notices + +You may not remove or alter the substance of any license notices +(including copyright notices, patent notices, disclaimers of warranty, +or limitations of liability) contained within the Source Code Form of +the Covered Software, except that You may alter any license notices to +the extent required to remedy known factual inaccuracies. + +3.5. Application of Additional Terms + +You may choose to offer, and to charge a fee for, warranty, support, +indemnity or liability obligations to one or more recipients of Covered +Software. However, You may do so only on Your own behalf, and not on +behalf of any Contributor. You must make it absolutely clear that any +such warranty, support, indemnity, or liability obligation is offered by +You alone, and You hereby agree to indemnify every Contributor for any +liability incurred by such Contributor as a result of warranty, support, +indemnity or liability terms You offer. You may include additional +disclaimers of warranty and limitations of liability specific to any +jurisdiction. + +4. Inability to Comply Due to Statute or Regulation +--------------------------------------------------- + +If it is impossible for You to comply with any of the terms of this +License with respect to some or all of the Covered Software due to +statute, judicial order, or regulation then You must: (a) comply with +the terms of this License to the maximum extent possible; and (b) +describe the limitations and the code they affect. Such description must +be placed in a text file included with all distributions of the Covered +Software under this License. Except to the extent prohibited by statute +or regulation, such description must be sufficiently detailed for a +recipient of ordinary skill to be able to understand it. + +5. Termination +-------------- + +5.1. The rights granted under this License will terminate automatically +if You fail to comply with any of its terms. However, if You become +compliant, then the rights granted under this License from a particular +Contributor are reinstated (a) provisionally, unless and until such +Contributor explicitly and finally terminates Your grants, and (b) on an +ongoing basis, if such Contributor fails to notify You of the +non-compliance by some reasonable means prior to 60 days after You have +come back into compliance. Moreover, Your grants from a particular +Contributor are reinstated on an ongoing basis if such Contributor +notifies You of the non-compliance by some reasonable means, this is the +first time You have received notice of non-compliance with this License +from such Contributor, and You become compliant prior to 30 days after +Your receipt of the notice. + +5.2. If You initiate litigation against any entity by asserting a patent +infringement claim (excluding declaratory judgment actions, +counter-claims, and cross-claims) alleging that a Contributor Version +directly or indirectly infringes any patent, then the rights granted to +You by any and all Contributors for the Covered Software under Section +2.1 of this License shall terminate. + +5.3. In the event of termination under Sections 5.1 or 5.2 above, all +end user license agreements (excluding distributors and resellers) which +have been validly granted by You or Your distributors under this License +prior to termination shall survive termination. + +************************************************************************ +* * +* 6. Disclaimer of Warranty * +* ------------------------- * +* * +* Covered Software is provided under this License on an "as is" * +* basis, without warranty of any kind, either expressed, implied, or * +* statutory, including, without limitation, warranties that the * +* Covered Software is free of defects, merchantable, fit for a * +* particular purpose or non-infringing. The entire risk as to the * +* quality and performance of the Covered Software is with You. * +* Should any Covered Software prove defective in any respect, You * +* (not any Contributor) assume the cost of any necessary servicing, * +* repair, or correction. This disclaimer of warranty constitutes an * +* essential part of this License. No use of any Covered Software is * +* authorized under this License except under this disclaimer. * +* * +************************************************************************ + +************************************************************************ +* * +* 7. Limitation of Liability * +* -------------------------- * +* * +* Under no circumstances and under no legal theory, whether tort * +* (including negligence), contract, or otherwise, shall any * +* Contributor, or anyone who distributes Covered Software as * +* permitted above, be liable to You for any direct, indirect, * +* special, incidental, or consequential damages of any character * +* including, without limitation, damages for lost profits, loss of * +* goodwill, work stoppage, computer failure or malfunction, or any * +* and all other commercial damages or losses, even if such party * +* shall have been informed of the possibility of such damages. This * +* limitation of liability shall not apply to liability for death or * +* personal injury resulting from such party's negligence to the * +* extent applicable law prohibits such limitation. Some * +* jurisdictions do not allow the exclusion or limitation of * +* incidental or consequential damages, so this exclusion and * +* limitation may not apply to You. * +* * +************************************************************************ + +8. Litigation +------------- + +Any litigation relating to this License may be brought only in the +courts of a jurisdiction where the defendant maintains its principal +place of business and such litigation shall be governed by laws of that +jurisdiction, without reference to its conflict-of-law provisions. +Nothing in this Section shall prevent a party's ability to bring +cross-claims or counter-claims. + +9. Miscellaneous +---------------- + +This License represents the complete agreement concerning the subject +matter hereof. If any provision of this License is held to be +unenforceable, such provision shall be reformed only to the extent +necessary to make it enforceable. Any law or regulation which provides +that the language of a contract shall be construed against the drafter +shall not be used to construe this License against a Contributor. + +10. Versions of the License +--------------------------- + +10.1. New Versions + +Mozilla Foundation is the license steward. Except as provided in Section +10.3, no one other than the license steward has the right to modify or +publish new versions of this License. Each version will be given a +distinguishing version number. + +10.2. Effect of New Versions + +You may distribute the Covered Software under the terms of the version +of the License under which You originally received the Covered Software, +or under the terms of any subsequent version published by the license +steward. + +10.3. Modified Versions + +If you create software not governed by this License, and you want to +create a new license for such software, you may create and use a +modified version of this License if you rename the license and remove +any references to the name of the license steward (except to note that +such modified license differs from this License). + +10.4. Distributing Source Code Form that is Incompatible With Secondary +Licenses + +If You choose to distribute Source Code Form that is Incompatible With +Secondary Licenses under the terms of this version of the License, the +notice described in Exhibit B of this License must be attached. + +Exhibit A - Source Code Form License Notice +------------------------------------------- + + This Source Code Form is subject to the terms of the Mozilla Public + License, v. 2.0. If a copy of the MPL was not distributed with this + file, You can obtain one at https://mozilla.org/MPL/2.0/. + +If it is not possible or desirable to put the notice in a particular +file, then You may include the notice in a location (such as a LICENSE +file in a relevant directory) where a recipient would be likely to look +for such a notice. + +You may add additional accurate notices of copyright ownership. + +Exhibit B - "Incompatible With Secondary Licenses" Notice +--------------------------------------------------------- + + This Source Code Form is "Incompatible With Secondary Licenses", as + defined by the Mozilla Public License, v. 2.0. diff --git a/validate-action/MAINTAINERS b/validate-action/MAINTAINERS new file mode 100644 index 0000000..37f6411 --- /dev/null +++ b/validate-action/MAINTAINERS @@ -0,0 +1,43 @@ +# Maintainers + +This file lists the current maintainers of this project. + +## Active Maintainers + +| Name | GitHub | Role | Since | +|------|--------|------|-------| +| Metadatastician | @metadatastician | Primary | Project Start | + +## Emeritus Maintainers + +None at this time. + +## Becoming a Maintainer + +To become a maintainer: + +1. Demonstrate consistent, high-quality contributions +2. Show understanding of the project's goals and architecture +3. Be active in code reviews and community discussions +4. Be nominated by an existing maintainer +5. Be approved by consensus of existing maintainers + +## Maintainer Responsibilities + +- Reviewing and merging pull requests +- Managing releases +- Triaging issues +- Enforcing code standards +- Mentoring new contributors +- Participating in decision-making + +## Maintainer Expectations + +- Respond to issues and PRs in a timely manner +- Follow the code of conduct +- Be transparent in decision-making +- Communicate clearly and respectfully + +--- + +*Last updated: 2026-07-18* diff --git a/validate-action/MAINTAINERS.adoc b/validate-action/MAINTAINERS.adoc new file mode 100644 index 0000000..4773f2c --- /dev/null +++ b/validate-action/MAINTAINERS.adoc @@ -0,0 +1,49 @@ +// SPDX-License-Identifier: CC-BY-SA-4.0 +// SPDX-License-Identifier: CC-BY-SA-4.0 +// Copyright (c) Jonathan D.A. Jewell += Maintainers + +This project is maintained by: + +* `@hyperpolymath` + +== Ownership + +[cols="1,1",options="header"] +|=== +| Area | Maintainer + +| All files | `@hyperpolymath` +| `README*` | `@hyperpolymath` +| `LICENSE` | `@hyperpolymath` +| `SECURITY*` | `@hyperpolymath` +| `CONTRIBUTING*` | `@hyperpolymath` +| `docs/` | `@hyperpolymath` +| `*.md` / `*.mdx` / `*.adoc` | `@hyperpolymath` +|=== + +Review routing is enforced via `CODEOWNERS` so GitHub requests reviews +automatically. + +== Review expectations + +* Paired with `CODEOWNERS` so GitHub requests reviews automatically. +* Target first-response time for issues and pull requests: *best effort*. + +== Becoming a maintainer + +Additional maintainers may be invited by the founder after a track record of +helpful, high-quality contributions. There is no obligation to accept +contributions or to add maintainers. + +== Security contact + +Report suspected vulnerabilities *privately* — see `SECURITY.md`, or contact +`@hyperpolymath` directly. Please avoid opening public issues for suspected +vulnerabilities unless explicitly requested. + +== Related files + +* `GOVERNANCE.adoc` — decision-making model. +* `CODEOWNERS` — review routing for repositories. +* `SECURITY.md` — vulnerability disclosure policy. diff --git a/validate-action/PROOF-NEEDS.md b/validate-action/PROOF-NEEDS.md new file mode 100644 index 0000000..8950320 --- /dev/null +++ b/validate-action/PROOF-NEEDS.md @@ -0,0 +1,10 @@ +# PROOF-NEEDS.md + +## Template ABI Cleanup (2026-03-29) + +Template ABI removed -- was creating false impression of formal verification. +The removed files (Types.idr, Layout.idr, Foreign.idr) contained only RSR template +scaffolding with unresolved {{PROJECT}}/{{AUTHOR}} placeholders and no domain-specific proofs. + +When this project needs formal ABI verification, create domain-specific Idris2 proofs +following the pattern in repos like `typed-wasm`, `proven`, `echidna`, or `boj-server`. diff --git a/validate-action/QUICKSTART-DEV.adoc b/validate-action/QUICKSTART-DEV.adoc new file mode 100644 index 0000000..c0e28c0 --- /dev/null +++ b/validate-action/QUICKSTART-DEV.adoc @@ -0,0 +1,39 @@ += A2Ml Validate Action — Developer Quickstart +:toc: preamble + +Clone, build, test, contribute. + +== Prerequisites + +* Git 2.40+ +* just (command runner) +* See `just doctor` output for language-specific requirements + +== Setup + +[source,bash] +---- +git clone https://github.com/hyperpolymath/a2ml-validate-action +cd a2ml-validate-action +just doctor # verify toolchain +just heal # auto-install missing tools +---- + +== Development Workflow + +[source,bash] +---- +just tour # understand the codebase +just help-me # see available commands +---- + +== Before Committing + +[source,bash] +---- +just assail # run panic-attacker security scan +---- + +== Contributing + +See link:CONTRIBUTING.md[CONTRIBUTING.md] for guidelines. diff --git a/validate-action/QUICKSTART-MAINTAINER.adoc b/validate-action/QUICKSTART-MAINTAINER.adoc new file mode 100644 index 0000000..432d638 --- /dev/null +++ b/validate-action/QUICKSTART-MAINTAINER.adoc @@ -0,0 +1,40 @@ += A2Ml Validate Action — Maintainer Quickstart +:toc: preamble + +Packaging, deployment, and release management. + +== Prerequisites + +* Git 2.40+ +* just (command runner) +* Familiarity with the project (run `just tour` first) + +== CI/CD + +This project uses GitHub Actions. Workflows are in `.github/workflows/`. + +Key workflows: + +* `hypatia-scan.yml` — Neurosymbolic security scanning +* `codeql.yml` — Code analysis +* `scorecard.yml` — OpenSSF Scorecard +* `mirror.yml` — GitLab/Bitbucket mirroring + +== Releasing + +1. Update version in project config +2. Update CHANGELOG.md +3. Tag: `git tag -s v` +4. Push: `git push origin main --tags` + +== Container Build (if applicable) + +[source,bash] +---- +podman build -f Containerfile -t a2ml-validate-action:latest . +---- + +== Mirrors + +This repo is mirrored to GitLab and Bitbucket (hyperpolymath accounts) +via the `mirror.yml` workflow. diff --git a/validate-action/QUICKSTART-USER.adoc b/validate-action/QUICKSTART-USER.adoc new file mode 100644 index 0000000..713115d --- /dev/null +++ b/validate-action/QUICKSTART-USER.adoc @@ -0,0 +1,33 @@ += A2Ml Validate Action — User Quickstart +:toc: preamble + +Get up and running in 60 seconds. + +== Prerequisites + +* Git 2.40+ +* just (command runner) — https://just.systems + +== Install + +[source,bash] +---- +git clone https://github.com/hyperpolymath/a2ml-validate-action +cd a2ml-validate-action +just doctor # check toolchain +just heal # auto-install missing tools +---- + +== First Run + +[source,bash] +---- +just tour # guided project tour +just help-me # see common workflows +---- + +== Get Help + +* `just help-me` — common workflows +* `just doctor` — diagnose toolchain issues +* https://github.com/hyperpolymath/a2ml-validate-action/issues — report bugs diff --git a/validate-action/README.md b/validate-action/README.md new file mode 100644 index 0000000..b54f2bf --- /dev/null +++ b/validate-action/README.md @@ -0,0 +1,93 @@ + + +# Overview + +**GitHub Action to validate A2ML manifest files in your repository.** + +A2ML (Agnostic Agent Markup Language) is a manifest format used across +RSR (Rhodium Standard Repository) projects to declare machine-readable +metadata, AI agent instructions, and project state. This action scans +for `.a2ml` files and validates their structure and required fields. + +# Checks Performed + +1. **SPDX header** — Verifies `SPDX-License-Identifier` is present in + the first 10 lines + +2. **Identity fields** — Requires `agent-id`, `name`, or `project` + field (relaxed for AI-MANIFEST files) + +3. **Version field** — Checks for `version` or `schema_version` + +4. **Attestation blocks** — If an `[attestation]` section exists, + validates it contains `proof`, `signature`, or `hash` fields + +5. **Section syntax** — Warns on malformed `[section]` headings with + unclosed brackets + +# Usage + +Add to your workflow: + +```yaml +name: Validate A2ML +on: [push, pull_request] + +permissions: + contents: read + +jobs: + validate: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: hyperpolymath/a2ml-validate-action@v1 + with: + path: '.' # Directory to scan (default: repo root) + strict: 'false' # Promote warnings to errors (default: false) + # paths-ignore: defaults to vendored / fixture patterns; override + # via newline-separated string. Use '' to disable. +``` + +## Inputs + +| Input | Default | Description | +|----|----|----| +| `path` | `.` | Directory path to scan for `.a2ml` files | +| `strict` | `false` | When `true`, warnings become errors and the action fails on any issue | +| `paths-ignore` | *vendored & fixture defaults* | Newline-separated path fragments to skip. Substring match against each file path. Default set: `vendor/`, `vendored/`, `verified-container-spec/`, `.audittraining/`, `integration/fixtures/`, `test/fixtures/`, `tests/fixtures/`. Pass an empty string (`paths-ignore:` `’’`) to disable and scan everything. See for the architectural rationale (content-pattern validators must distinguish targets from fixtures / vendored / training-corpus files that legitimately contain the very pattern being checked). | + +### Why default-on path exemptions? + +A2ML files inside vendored projects (e.g. `verified-container-spec/`) +have their own identity declarations elsewhere or are themselves +training corpora. Flagging every such file as "missing identity field" +is provenance noise, not signal. The defaults match the canonical RSR +vendored-content paths; override for project-specific carve-outs. + +## Outputs + +| Output | Description | +|-----------------|-----------------------------------| +| `files-scanned` | Number of `.a2ml` files processed | +| `errors` | Count of validation errors | +| `warnings` | Count of validation warnings | + +# Strict Mode + +In strict mode (`strict:` `’true’`), all warnings are promoted to +errors. This is useful for repositories that require full A2ML +compliance, such as those following the RSR standard. + +# Author + +Jonathan D.A. Jewell \<[j.d.a.jewell@open.ac](j.d.a.jewell@open.ac).uk\> + +# License + +SPDX-License-Identifier: CC-BY-SA-4.0 + +See [LICENSE](LICENSE) for details. diff --git a/validate-action/ROADMAP.adoc b/validate-action/ROADMAP.adoc new file mode 100644 index 0000000..c1d9551 --- /dev/null +++ b/validate-action/ROADMAP.adoc @@ -0,0 +1,23 @@ +// SPDX-License-Identifier: CC-BY-SA-4.0 +// Copyright (c) Jonathan D.A. Jewell += A2ml Validate Action Roadmap + +== Current Status + +v1.0.0 released 2026-05-29 — stable. See `CHANGELOG.md`. + +== Milestones + +=== v0.1.0 - Foundation (released) +* [x] Core functionality +* [x] Basic documentation +* [x] CI/CD pipeline + +=== v1.0.0 - Stable Release (released 2026-05-29) +* [x] Full feature set +* [x] Comprehensive tests +* [x] Production ready + +== Future Directions + +_To be determined based on community feedback._ diff --git a/validate-action/SECURITY.md b/validate-action/SECURITY.md new file mode 100644 index 0000000..5c4d5e9 --- /dev/null +++ b/validate-action/SECURITY.md @@ -0,0 +1,20 @@ + +# Security Policy + +## Reporting a Vulnerability + +If you discover a security vulnerability, please report it responsibly. + +**Email:** j.d.a.jewell@open.ac.uk + +**Please include:** +- Description of the vulnerability +- Steps to reproduce +- Potential impact + +**Response timeline:** +- Acknowledgement within 48 hours +- Initial assessment within 7 days +- Fix or mitigation within 90 days + +**Safe harbour:** We will not pursue legal action against security researchers who follow responsible disclosure. diff --git a/validate-action/TEST-NEEDS.md b/validate-action/TEST-NEEDS.md new file mode 100644 index 0000000..3099e2a --- /dev/null +++ b/validate-action/TEST-NEEDS.md @@ -0,0 +1,33 @@ + +# TEST-NEEDS.md — a2ml-validate-action + +## CRG Grade: C — ACHIEVED 2026-04-04 + +## Current Test State + +| Category | Count | Notes | +|----------|-------|-------| +| Test directories | 2 | Location(s): /verification/tests, /tests | +| CI workflows | 14 | Running tests on GitHub Actions | +| Tests | Present | Configured in CI workflows | + +## What's Covered + +- [x] Tests present and running +- [x] CI integration active + +## Still Missing (for CRG B+) + +- [ ] Code coverage reports (codecov integration) +- [ ] Detailed test documentation in CONTRIBUTING.md +- [ ] Integration tests beyond unit tests +- [ ] Performance benchmarking suite + +## Run Tests + +```bash +(check Makefile/justfile/package.json for test command) +``` diff --git a/validate-action/TOPOLOGY.md b/validate-action/TOPOLOGY.md new file mode 100644 index 0000000..59254d6 --- /dev/null +++ b/validate-action/TOPOLOGY.md @@ -0,0 +1,29 @@ + + +# TOPOLOGY.md — a2ml-validate-action + +## Purpose + +GitHub Action that validates `.a2ml` manifest files in a repository. Checks SPDX headers, required identity/version fields, attestation block structure, and section syntax. Used in CI pipelines across RSR repos to enforce A2ML compliance. + +## Module Map + +``` +a2ml-validate-action/ +├── action.yml # GitHub Action metadata and entry point +├── src/ +│ └── validate-a2ml.sh # Validation script (delegates to shell logic) +├── examples/ # Example workflows using this action +├── docs/ # Usage documentation +└── container/ # Containerfile for CI +``` + +## Data Flow + +``` +[GitHub workflow trigger] ──► [action.yml] ──► [validate-a2ml.sh] + │ + [scan repo for .a2ml files] + │ + [pass / fail with annotations] +``` diff --git a/validate-action/action.yml b/validate-action/action.yml new file mode 100644 index 0000000..85a5069 --- /dev/null +++ b/validate-action/action.yml @@ -0,0 +1,74 @@ +# SPDX-License-Identifier: MPL-2.0 +# Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) +# +# action.yml — Validate A2ML Manifests GitHub Action +# Scans repository for .a2ml files and validates structure, required fields, +# SPDX headers, and attestation blocks. + +name: 'Validate A2ML Manifests' +description: >- + Scan and validate .a2ml manifest files in your repository. + Checks for required fields (agent-id/pedigree name, version), + SPDX headers, and attestation block structure. +author: 'Jonathan D.A. Jewell' + +branding: + icon: 'shield' + color: 'blue' + +inputs: + path: + description: >- + Directory path to scan for .a2ml files. + Defaults to the repository root. + required: false + default: '.' + strict: + description: >- + When true, warnings are promoted to errors and the action + will fail on any validation issue. Defaults to false. + required: false + default: 'false' + paths-ignore: + description: >- + Newline-separated path fragments to skip. Each line is matched as a + substring against the file's path. Defaults to common vendored / + training-corpus / fixture patterns so consumers don't have to repeat + this carve-out in every repo. Pass an empty string to disable. + Pattern follows hyperpolymath/hypatia#243 — validators that scan + content patterns must distinguish a target file from a fixture / + vendored / training-corpus file that legitimately contains the + pattern being checked. + required: false + default: | + vendor/ + vendored/ + verified-container-spec/ + .audittraining/ + integration/fixtures/ + test/fixtures/ + tests/fixtures/ + +outputs: + files-scanned: + description: 'Number of .a2ml files scanned' + value: ${{ steps.validate.outputs.files_scanned }} + errors: + description: 'Number of validation errors found' + value: ${{ steps.validate.outputs.errors }} + warnings: + description: 'Number of validation warnings found' + value: ${{ steps.validate.outputs.warnings }} + +runs: + using: 'composite' + steps: + - name: Validate A2ML manifests + id: validate + shell: bash + env: + INPUT_PATH: ${{ inputs.path }} + INPUT_STRICT: ${{ inputs.strict }} + INPUT_PATHS_IGNORE: ${{ inputs.paths-ignore }} + run: | + "${GITHUB_ACTION_PATH}/validate-a2ml.sh" diff --git a/validate-action/container/.gatekeeper.yaml b/validate-action/container/.gatekeeper.yaml new file mode 100644 index 0000000..64adcf1 --- /dev/null +++ b/validate-action/container/.gatekeeper.yaml @@ -0,0 +1,122 @@ +# SPDX-License-Identifier: MPL-2.0 +# +# Svalinn gatekeeper policy for a2ml-validate-action +# +# Controls which operations are permitted through the edge gateway. +# This template provides moderate security defaults — not wide-open test +# mode, but not production-hardened either. Tighten the values below +# before deploying to production. +# +# See: stapeln/container-stack/svalinn/ + +version: "1.0" + +# ============================================================================ +# Authentication +# ============================================================================ +# +# Define which endpoints require authentication and at what level. + +auth: + # Public endpoints — no authentication required. + # Health and readiness probes must always be public so that + # orchestrators (selur, Podman, k8s) can check service status. + public: + - path: "/health" + methods: ["GET"] + - path: "/ready" + methods: ["GET"] + - path: "/metrics" + methods: ["GET"] + + # Endpoints requiring JWT or OAuth2 authentication. + # Svalinn validates the token before forwarding the request. + authenticated: + - path: "/api/v1/*" + methods: ["GET", "POST", "PUT", "DELETE"] + +# ============================================================================ +# Rate Limiting +# ============================================================================ +# +# Protects backend services from overload. Values here are moderate +# defaults — adjust based on your service capacity. + +rate_limits: + # Global limit: applied to all authenticated clients. + global: + requests_per_second: 500 + burst: 1000 + + # Write operations: stricter limit to protect data stores. + writes: + paths: ["/api/v1/*"] + methods: ["POST", "PUT", "DELETE"] + requests_per_second: 100 + burst: 200 + +# ============================================================================ +# Container Trust +# ============================================================================ +# +# Svalinn verifies that all .ctp bundles in the stack are signed by +# trusted keys and carry the required attestations. + +trust: + # Only accept .ctp bundles signed by these keys. + trusted_signers: + - key_id: "a2ml-validate-action-release" + algorithm: "Ed25519" + public_key_file: "/etc/svalinn/keys/a2ml-validate-action-release.pub" + + # Require these attestations on all .ctp bundles. + required_attestations: + - "source-signature" + - "sbom-complete" + + # Reject unsigned or untrusted images. + reject_unsigned: true + +# ============================================================================ +# Request Validation +# ============================================================================ +# +# Input validation at the gateway layer — catches malformed requests +# before they reach the application. + +validation: + # Maximum request body size. + max_body_size: "8MB" + + # Reject requests with NaN or Infinity in numeric fields. + reject_nan_inf: true + + # Maximum result limit per list/search query. + max_result_limit: 500 + +# ============================================================================ +# CORS +# ============================================================================ +# +# Cross-Origin Resource Sharing policy. The defaults below allow all +# origins — restrict to your frontend domain(s) in production. + +cors: + allow_origins: ["*"] + allow_methods: ["GET", "POST", "PUT", "DELETE", "OPTIONS"] + allow_headers: ["Content-Type", "Authorization"] + max_age: 3600 + +# ============================================================================ +# Logging +# ============================================================================ +# +# Structured logging for svalinn itself. Audit paths log all requests +# (including body hashes) for post-incident investigation. + +logging: + format: "json" + level: "info" + # Log all write operations for audit trail. + audit_paths: + - "/api/v1/*" diff --git a/validate-action/container/0.1-AI-MANIFEST.a2ml b/validate-action/container/0.1-AI-MANIFEST.a2ml new file mode 100644 index 0000000..ccb5bc5 --- /dev/null +++ b/validate-action/container/0.1-AI-MANIFEST.a2ml @@ -0,0 +1,143 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "container-templates" +version: "1.0.0" +context: + - "https://a2ml.org/ns/v2" + - "https://stapeln.dev/ns/v1" + +--- +### [AI_MANIFEST] +description: | + Container templates for the stapeln container ecosystem. This directory + provides Podman-Chainguard-stapeln templates that are customised via + `just container-init` or `just init` during project bootstrap. + + All files use {{PLACEHOLDER}} tokens that are substituted with project- + specific values during initialisation. + +purpose: | + Provide a complete, security-first container deployment story for any + RSR-compliant repository. The templates cover the full lifecycle: + build, sign, verify, deploy, monitor, and govern. + +canonical_locations: + compose: "container/compose.toml" + containerfile: "container/Containerfile" + manifest: "container/manifest.toml" + gatekeeper: "container/.gatekeeper.yaml" + build_pipeline: "container/ct-build.sh" + entrypoint: "container/entrypoint.sh" + monitoring: "container/vordr.toml" + deployment: "container/deploy.k9.ncl" + example: "container/compose.example.toml" + +--- +### [FILE_RELATIONSHIPS] +files: + - name: "compose.toml" + role: "Orchestration" + description: | + selur-compose stack definition. Declares services, volumes, networks, + and health checks. References the Containerfile for image builds and + .gatekeeper.yaml for svalinn policy. + depends_on: ["Containerfile", ".gatekeeper.yaml"] + + - name: "Containerfile" + role: "Image Build" + description: | + Multi-stage OCI container build. Stage 1 compiles the application on + wolfi-base; Stage 2 copies the binary into a minimal runtime image. + Copies entrypoint.sh, .gatekeeper.yaml, and manifest.toml into the + final image. + depends_on: ["entrypoint.sh", ".gatekeeper.yaml", "manifest.toml"] + + - name: "manifest.toml" + role: "Bundle Metadata" + description: | + Cerro-torre .ctp bundle manifest. Describes provenance, dependencies, + attestations, and runtime security profile. Used by `ct pack` and + `ct verify`. + depends_on: [] + + - name: ".gatekeeper.yaml" + role: "Gateway Policy" + description: | + Svalinn edge gateway policy. Controls authentication, rate limiting, + container trust, request validation, CORS, and audit logging. + depends_on: [] + + - name: "ct-build.sh" + role: "Build Pipeline" + description: | + Shell script implementing the 5-stage pipeline: build (Podman), + pack (cerro-torre .ctp), sign (Ed25519), verify, push (optional). + Degrades gracefully when cerro-torre tools are not installed. + depends_on: ["Containerfile", "manifest.toml"] + + - name: "entrypoint.sh" + role: "Container Entrypoint" + description: | + Startup script with signal handling (SIGTERM, SIGINT), logging, and + exec into the main application process. + depends_on: [] + + - name: "vordr.toml" + role: "Runtime Monitoring" + description: | + Vordr monitoring configuration. Health endpoint probing, crash + detection, resource thresholds, and structured log output. + depends_on: [] + + - name: "deploy.k9.ncl" + role: "Deployment Component" + description: | + k9-svc deployment specification at Hunt trust level. Full pedigree + (L1-L5), environment configs, container config, and rolling + deployment strategy. + depends_on: ["compose.toml", "ct-build.sh"] + + - name: "compose.example.toml" + role: "Example" + description: | + Fully-commented multi-service example (Rust API + Elixir worker + + svalinn gateway). Copy to compose.toml and customise. + depends_on: [] + +--- +### [STAPELN_ECOSYSTEM] +overview: | + The stapeln container ecosystem comprises six tools: + + selur — Container orchestration with zero-copy IPC. Reads compose.toml. + cerro-torre — Verified container packaging (.ctp bundles), Ed25519 signing. + svalinn — Policy-driven edge gateway (auth, rate limits, CORS, trust). + vordr — Runtime monitoring (health, crashes, resources, logs). + rokur — Secrets management (runtime injection, no baked secrets). + k9-svc — Nickel deployment components (Kennel/Yard/Hunt trust levels). + +invariants: + - "Base images MUST be cgr.dev/chainguard/wolfi-base or cgr.dev/chainguard/static" + - "Container runtime is Podman — never Docker" + - "Containerfile — never Dockerfile" + - "All images run as non-root (appuser or project-specific user)" + - ".ctp bundles are signed with Ed25519 via cerro-torre" + - "Health endpoints (/health, /ready) must always be public (no auth)" + +--- +### [USAGE] +initialisation: | + Run `just container-init` to substitute all {{PLACEHOLDER}} tokens with + project-specific values. This is also run as part of `just init`. + +development: | + 1. `just container-build` — Build the container image + 2. `just container-verify` — Verify compose configuration + 3. `just container-up` — Start the stack locally + 4. `just container-down` — Stop the stack + +production: | + 1. `just container-sign` — Build, sign, verify .ctp bundle + 2. `just container-push` — Push signed bundle to registry + 3. `selur-compose up` — Deploy on target host diff --git a/validate-action/container/Containerfile b/validate-action/container/Containerfile new file mode 100644 index 0000000..f3568bc --- /dev/null +++ b/validate-action/container/Containerfile @@ -0,0 +1,136 @@ +# SPDX-License-Identifier: MPL-2.0 +# a2ml-validate-action Container Image +# +# Multi-stage build template for Chainguard Wolfi base images. +# Customise the builder stage for your language and copy the +# resulting binary/release into the minimal runtime stage. +# +# Build with Podman: +# podman build -t a2ml-validate-action:latest -f container/Containerfile . +# +# Run: +# podman run -p 8080:8080 a2ml-validate-action:latest +# +# Run with persistent volume: +# podman run -p 8080:8080 -v a2ml-validate-action-data:/data a2ml-validate-action:latest + +# ============================================================================ +# Stage 1: Builder +# ============================================================================ +# +# Install build tools and compile the application. +# This stage is discarded after the build — only the compiled output +# is copied into the runtime stage. +# +# Language-specific examples (uncomment the one you need): +# +# --- Rust --- +# RUN apk add --no-cache rust pkgconf build-base +# COPY Cargo.toml Cargo.lock ./ +# COPY src/ ./src/ +# RUN cargo build --release +# # Output: /build/target/release/a2ml-validate-action +# +# --- Elixir --- +# RUN apk add --no-cache erl27-elixir-1.18 erlang-27 erlang-27-dev git build-base +# COPY mix.exs mix.lock ./ +# COPY lib/ ./lib/ +# COPY config/ ./config/ +# ENV MIX_ENV=prod +# RUN mix local.hex --force && mix local.rebar --force && \ +# mix deps.get --only prod && mix compile && mix release +# # Output: /build/_build/prod/rel/a2ml-validate-action/ +# +# --- Zig --- +# RUN apk add --no-cache zig build-base +# COPY build.zig build.zig.zon ./ +# COPY src/ ./src/ +# RUN zig build -Doptimize=ReleaseFast +# # Output: /build/zig-out/bin/a2ml-validate-action +# +FROM cgr.dev/chainguard/wolfi-base:latest AS builder + +# TODO: Install your language toolchain +RUN apk add --no-cache build-base + +WORKDIR /build + +# TODO: Copy source files and build +COPY . . +# RUN + +# ============================================================================ +# Stage 2: Runtime +# ============================================================================ +# +# Minimal production image. Only the compiled binary/release and runtime +# dependencies are included. No compilers, no source code, no build tools. +# +FROM cgr.dev/chainguard/wolfi-base:latest + +# OCI image labels (compatible with cerro-torre .ctp bundle metadata) +LABEL org.opencontainers.image.title="a2ml-validate-action" \ + org.opencontainers.image.description="" \ + org.opencontainers.image.url="https://github.com/hyperpolymath/a2ml-validate-action" \ + org.opencontainers.image.source="https://github.com/hyperpolymath/a2ml-validate-action" \ + org.opencontainers.image.vendor="hyperpolymath" \ + org.opencontainers.image.licenses="MPL-2.0" \ + org.opencontainers.image.authors="Jonathan D.A. Jewell " \ + dev.cerrotorre.manifest="container/manifest.toml" \ + dev.cerrotorre.gatekeeper="container/.gatekeeper.yaml" \ + dev.stapeln.compose="container/compose.toml" + +# Install minimal runtime dependencies. +# Adjust this list for your application: +# - ca-certificates: TLS root certificates +# - curl: health check probe +# - libstdc++: C++ standard library (if needed by native deps) +# - ncurses: terminal UI (if needed, e.g. Elixir IEx) +RUN apk add --no-cache ca-certificates curl + +# Create non-root user for the application. +# Running as root inside containers is a security anti-pattern. +RUN addgroup -S appuser && adduser -S appuser -G appuser + +WORKDIR /app + +# TODO: Copy compiled binary/release from builder stage. +# Examples: +# COPY --from=builder /build/target/release/a2ml-validate-action /app/a2ml-validate-action +# COPY --from=builder /build/_build/prod/rel/a2ml-validate-action /app/release/ +# COPY --from=builder /build/zig-out/bin/a2ml-validate-action /app/a2ml-validate-action + +# Copy entrypoint script +COPY container/entrypoint.sh /app/entrypoint.sh +RUN chmod +x /app/entrypoint.sh + +# Copy stapeln integration files (svalinn gatekeeper policy, cerro-torre manifest) +COPY container/.gatekeeper.yaml /etc/svalinn/gatekeeper.yaml +COPY container/manifest.toml /app/manifest.toml + +# Create data directory for persistent storage (mountable volume) +RUN mkdir -p /data && chown appuser:appuser /data + +# Set ownership of the application directory +RUN chown -R appuser:appuser /app + +# Environment variables — customise for your application +ENV APP_HOST=[::] +ENV APP_PORT=8080 +ENV APP_LOG_FORMAT=json +ENV APP_DATA_DIR=/data + +# Declare /data as a volume for persistent storage +VOLUME ["/data"] + +# Run as non-root +USER appuser + +# Expose the application port +EXPOSE 8080 + +# Health check — the application must respond 2xx at /health +HEALTHCHECK --interval=30s --timeout=5s --start-period=10s --retries=3 \ + CMD curl -sf http://localhost:${APP_PORT}/health || exit 1 + +ENTRYPOINT ["/app/entrypoint.sh"] diff --git a/validate-action/container/README.adoc b/validate-action/container/README.adoc new file mode 100644 index 0000000..e607a4a --- /dev/null +++ b/validate-action/container/README.adoc @@ -0,0 +1,179 @@ +// SPDX-License-Identifier: CC-BY-SA-4.0 +// Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) += a2ml-validate-action Container Templates +:toc: left +:toclevels: 3 +:sectnums: + +== Overview + +This directory contains container templates for the +https://github.com/hyperpolymath/stapeln[stapeln] container ecosystem. +The stapeln stack provides verified container packaging, edge gateway +policies, runtime monitoring, and supply-chain signing for Podman-based +deployments using https://www.chainguard.dev/[Chainguard] Wolfi base images. + +All files use `{{PLACEHOLDER}}` tokens that are replaced by `just container-init` +(or by the top-level `just init` during project bootstrap). + +== File Reference + +[cols="1,3"] +|=== +| File | Purpose + +| `compose.toml` +| **selur-compose** stack definition. Declares services, volumes, networks, + and health checks. The primary orchestration file for local and production + deployment. Use `selur-compose up` or fall back to `podman compose`. + +| `compose.example.toml` +| Concrete multi-service example with detailed comments. Copy and customise + for your own stack. Not used directly by any tooling. + +| `Containerfile` +| Multi-stage OCI container build specification. Stage 1 builds the + application; Stage 2 produces a minimal runtime image on + `cgr.dev/chainguard/wolfi-base`. Uses Podman (never Docker). + +| `manifest.toml` +| **cerro-torre** bundle metadata. Describes the `.ctp` verified container + package: provenance, dependencies, attestations, and runtime security + profile. Used by `ct pack` and `ct verify`. + +| `.gatekeeper.yaml` +| **svalinn** edge gateway policy. Controls authentication, rate limiting, + container trust, request validation, CORS, and audit logging at the + network boundary. + +| `ct-build.sh` +| Build, sign, and verify pipeline script. Five stages: build (Podman), + pack (cerro-torre `.ctp`), sign (Ed25519), verify, and push (optional). + Gracefully degrades when cerro-torre tools are not installed. + +| `entrypoint.sh` +| Container entrypoint with signal handling (SIGTERM, SIGINT), startup + logging, and `exec` into the main application process. + +| `vordr.toml` +| **vordr** runtime monitoring configuration. Defines health endpoints, + crash detection, resource thresholds, and log output. + +| `deploy.k9.ncl` +| **k9-svc** deployment component at Hunt trust level. Full pedigree + (L1--L5), environment configs (dev/staging/prod), container + configuration, and rolling deployment strategy. + +| `0-AI-MANIFEST.a2ml` +| AI-readable manifest describing the container directory, file + interconnections, and the stapeln ecosystem. +|=== + +== The stapeln Ecosystem + +The stapeln container ecosystem comprises six interconnected tools: + +**selur** (compose):: + Container orchestration with zero-copy IPC for co-located services. + Reads `compose.toml` files. Falls back to standard Podman Compose + when the selur driver is unavailable. + +**cerro-torre** (bundles and signing):: + Verified container packaging. Produces `.ctp` bundles from OCI images, + signs them with Ed25519, and verifies the full chain. Tools: `ct pack`, + `ct sign`, `ct verify`, `ct push`, `ct explain`. + +**svalinn** (edge gateway):: + Policy-driven reverse proxy. Enforces authentication, rate limiting, + CORS, and container trust policies defined in `.gatekeeper.yaml`. + +**vordr** (monitoring):: + Runtime container monitoring. Watches health endpoints, detects crashes, + tracks resource usage, and emits structured logs. + +**rokur** (secrets):: + Secrets management for container deployments. Injects secrets at runtime + without baking them into images. Currently a stub/placeholder. + +**k9-svc** (deployment components):: + Nickel-based deployment specification. Components declare their pedigree + (identity, target, security, validation, recipes) and execute at one of + three trust levels: Kennel (data only), Yard (evaluation), Hunt (full + execution with cryptographic handshake). + +== How to Initialise + +[source,bash] +---- +# Option 1: During project bootstrap (includes all placeholders) +just init + +# Option 2: Container-specific initialisation +just container-init +---- + +The `container-init` recipe prompts for container-specific values +(service name, port, registry) and substitutes all `{{PLACEHOLDER}}` +tokens in the `container/` directory. + +== Development Workflow + +[source,bash] +---- +# 1. Build the container image +just container-build + +# 2. Verify the compose configuration +just container-verify + +# 3. Start the stack locally +just container-up --detach + +# 4. Check logs +podman compose --file container/compose.toml logs -f + +# 5. Stop the stack +just container-down +---- + +== Production Deployment + +[source,bash] +---- +# 1. Build, sign, and verify the .ctp bundle +just container-sign + +# 2. Push the signed bundle to the registry +just container-push + +# 3. Deploy on the target host +selur-compose up --detach +---- + +For k9-svc managed deployments: + +[source,bash] +---- +# Validate the deployment component +nickel typecheck container/deploy.k9.ncl + +# Deploy (requires Hunt-level authorisation) +k9-svc deploy container/deploy.k9.ncl --env production +---- + +== Base Images + +All Containerfiles use Chainguard Wolfi base images: + +* **Builder stage:** `cgr.dev/chainguard/wolfi-base:latest` +* **Runtime stage:** `cgr.dev/chainguard/wolfi-base:latest` (or + `cgr.dev/chainguard/static:latest` for statically-linked binaries) + +Chainguard images are minimal, CVE-free, and rebuilt daily. They use the +`apk` package manager (Alpine-compatible). + +== Container Runtime + +This project uses **Podman** (never Docker). All scripts, compose files, +and documentation reference Podman commands. The OCI Containerfile format +is compatible with Podman, Docker, and nerdctl. diff --git a/validate-action/container/compose.example.toml b/validate-action/container/compose.example.toml new file mode 100644 index 0000000..d8d717c --- /dev/null +++ b/validate-action/container/compose.example.toml @@ -0,0 +1,135 @@ +# SPDX-License-Identifier: MPL-2.0 +# +# Example selur-compose configuration — multi-service stack +# +# This is a concrete, fully-commented example showing a Rust API + Elixir +# worker + svalinn gateway deployment. Copy this file to compose.toml and +# customise for your project. +# +# Usage: +# cp compose.example.toml compose.toml +# # Edit service names, ports, images +# selur-compose up --detach + +version = "1.0" + +# ============================================================================ +# Services +# ============================================================================ + +# Rust API service — the primary HTTP/gRPC backend. +# Handles incoming requests, data storage, and core business logic. +[services.rust-api] +image = "ghcr.io/hyperpolymath/myproject-api:latest.ctp" + +# Map host port 8080 to container port 8080. +# Use ["[::]:8080:8080"] for explicit IPv6 binding. +ports = ["8080:8080"] + +# Environment variables passed into the container at startup. +# These override defaults in the Containerfile ENV directives. +environment = { + RUST_LOG = "info", # Rust log level (trace, debug, info, warn, error) + APP_HOST = "[::]", # Listen on all interfaces (IPv4 + IPv6) + APP_PORT = "8080", # Internal container port + APP_LOG_FORMAT = "json", # Structured logging for selur/vordr + APP_DATA_DIR = "/data", # Persistent data directory (matches VOLUME) +} + +# Bind-mount a named volume for persistent data. +# Format: "volume-name:/container/path" +volumes = ["api-data:/data"] + +# Restart policy: "always" ensures the service comes back after crashes. +# Other options: "no", "on-failure", "unless-stopped" +restart = "always" + +# Health check: selur/Podman uses this to determine if the service is ready. +# The service must respond 2xx to this endpoint within the timeout. +healthcheck = { test = "curl -sf http://localhost:8080/health", interval = "30s", timeout = "5s", retries = 3 } + +# --- + +# Elixir worker service — background processing, event handling, coordination. +# Runs as an OTP release with supervision trees for fault tolerance. +[services.elixir-worker] +image = "ghcr.io/hyperpolymath/myproject-worker:latest.ctp" + +# Separate port for the worker's admin/metrics endpoint. +ports = ["4000:4000"] + +# The worker connects to the Rust API over the internal selur network. +# Service names resolve as hostnames within the compose network. +environment = { + API_URL = "http://rust-api:8080/api/v1", # Internal service discovery + MIX_ENV = "prod", # Elixir release mode + APP_LOG_FORMAT = "json", # Match structured logging format + POOL_SIZE = "10", # DB connection pool size +} + +# depends_on ensures the Rust API starts before the worker. +# Note: This only waits for the container to start, not for the health check. +# Use healthcheck + startup probes for true readiness gating. +depends_on = ["rust-api"] + +restart = "always" +healthcheck = { test = "curl -sf http://localhost:4000/health", interval = "30s", timeout = "5s", retries = 3 } + +# --- + +# Svalinn edge gateway — reverse proxy with policy enforcement. +# All external traffic enters through svalinn, which: +# 1. Terminates TLS (auto-provisioned certificates) +# 2. Validates JWT/OAuth2 authentication +# 3. Enforces rate limits from .gatekeeper.yaml +# 4. Routes requests to the appropriate backend service +# 5. Logs all write operations for audit +[services.svalinn] +image = "ghcr.io/hyperpolymath/svalinn:latest.ctp" + +# External-facing ports: HTTPS (443) and HTTP->HTTPS redirect (80). +ports = ["443:443", "80:80"] + +environment = { + # Backend routing: svalinn proxies to internal services. + SVALINN_BACKEND = "http://rust-api:8080", + SVALINN_WORKER_BACKEND = "http://elixir-worker:4000", + + # Policy file: mounted from the svalinn-config volume. + SVALINN_POLICY_FILE = "/etc/svalinn/gatekeeper.yaml", + + # Auto-provision TLS certificates (Let's Encrypt). + SVALINN_TLS_AUTO = "true", +} + +# Mount .gatekeeper.yaml as read-only policy configuration. +volumes = ["svalinn-config:/etc/svalinn:ro"] + +# Svalinn starts last — it needs both backends to be running. +depends_on = ["rust-api", "elixir-worker"] +restart = "always" +healthcheck = { test = "curl -sf http://localhost:80/health", interval = "30s", timeout = "5s", retries = 3 } + +# ============================================================================ +# Volumes +# ============================================================================ + +# Persistent storage for the Rust API (database files, indexes, WAL). +[volumes.api-data] +driver = "local" + +# Read-only policy configuration for svalinn gateway. +# Populate with: cp .gatekeeper.yaml /path/to/svalinn-config/gatekeeper.yaml +[volumes.svalinn-config] +driver = "local" + +# ============================================================================ +# Networks +# ============================================================================ + +# selur network: zero-copy IPC between services on the same host. +# When the selur driver is not installed, falls back to standard bridge +# networking (TCP over localhost). Performance is slightly lower but +# functionality is identical. +[networks.default] +driver = "selur" diff --git a/validate-action/container/compose.toml b/validate-action/container/compose.toml new file mode 100644 index 0000000..04c551a --- /dev/null +++ b/validate-action/container/compose.toml @@ -0,0 +1,70 @@ +# SPDX-License-Identifier: MPL-2.0 +# +# a2ml-validate-action selur-compose configuration +# +# Orchestrates the container stack as verified container bundles (.ctp). +# Uses selur zero-copy IPC between services on the same host. +# +# Usage: +# selur-compose up # Start all services +# selur-compose up --detach # Start in background +# selur-compose verify # Verify all .ctp signatures +# selur-compose ps # Check status +# selur-compose logs -f a2ml-validate-action # Stream logs +# selur-compose down # Stop all services +# +# Fallback (when selur is not installed): +# podman compose --file compose.toml up --detach + +version = "1.0" + +# ============================================================================ +# Services +# ============================================================================ + +# Primary application service +[services.a2ml-validate-action] +image = "ghcr.io/hyperpolymath/a2ml-validate-action:latest.ctp" +ports = ["8080:8080"] +environment = { + APP_HOST = "[::]", + APP_PORT = "8080", + APP_LOG_FORMAT = "json", + APP_DATA_DIR = "/data", +} +volumes = ["a2ml-validate-action-data:/data"] +restart = "always" +healthcheck = { test = "curl -sf http://localhost:8080/health", interval = "30s", timeout = "5s", retries = 3 } + +# Svalinn edge gateway: validates requests, enforces policies, TLS termination +[services.svalinn] +image = "ghcr.io/hyperpolymath/svalinn:latest.ctp" +ports = ["443:443", "80:80"] +environment = { + SVALINN_BACKEND = "http://a2ml-validate-action:8080", + SVALINN_POLICY_FILE = "/etc/svalinn/gatekeeper.yaml", + SVALINN_TLS_AUTO = "true", +} +volumes = ["svalinn-config:/etc/svalinn:ro"] +depends_on = ["a2ml-validate-action"] +restart = "always" +healthcheck = { test = "curl -sf http://localhost:80/health", interval = "30s", timeout = "5s", retries = 3 } + +# ============================================================================ +# Volumes +# ============================================================================ + +[volumes.a2ml-validate-action-data] +driver = "local" + +[volumes.svalinn-config] +driver = "local" + +# ============================================================================ +# Networks +# ============================================================================ + +# Use selur zero-copy IPC for inter-service communication on the same host. +# Falls back to standard bridge networking when selur driver is unavailable. +[networks.default] +driver = "selur" diff --git a/validate-action/container/ct-build.sh b/validate-action/container/ct-build.sh new file mode 100755 index 0000000..fb62e76 --- /dev/null +++ b/validate-action/container/ct-build.sh @@ -0,0 +1,162 @@ +#!/usr/bin/env bash +# SPDX-License-Identifier: MPL-2.0 +# +# a2ml-validate-action — Cerro Torre build, sign, and verify pipeline +# +# Builds the container image, packages it as a verified .ctp bundle, +# signs it with Ed25519, and verifies the result. Gracefully degrades +# when cerro-torre tools are not installed. +# +# Prerequisites: +# - podman (container build — required) +# - ct (cerro-torre CLI: pack, sign, verify — optional) +# - cerro-sign (Ed25519 signing — optional, ct sign used as fallback) +# +# Usage: +# ./ct-build.sh # Build + sign (local only) +# ./ct-build.sh --push # Build + sign + push to registry +# CT_KEY_ID=my-key ./ct-build.sh # Use specific signing key +# +# Environment variables: +# CT_KEY_ID — Signing key identifier (default: a2ml-validate-action-release) +# CT_REGISTRY — OCI registry to push to (default: ghcr.io/hyperpolymath) +# CT_TAG — Image tag (default: latest) + +set -euo pipefail + +# --------------------------------------------------------------------------- +# Configuration +# --------------------------------------------------------------------------- + +SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" +REPO_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)" + +PUSH="" +for arg in "$@"; do + if [ "$arg" = "--push" ]; then + PUSH="--push" + fi +done + +CT_KEY_ID="${CT_KEY_ID:-a2ml-validate-action-release}" +CT_REGISTRY="${CT_REGISTRY:-ghcr.io/hyperpolymath}" +CT_TAG="${CT_TAG:-latest}" + +IMAGE_NAME="a2ml-validate-action" +FULL_IMAGE="${CT_REGISTRY}/${IMAGE_NAME}:${CT_TAG}" +CTP_FILE="${SCRIPT_DIR}/${IMAGE_NAME}-${CT_TAG}.ctp" + +echo "=== a2ml-validate-action Cerro Torre Build Pipeline ===" +echo " Image: ${FULL_IMAGE}" +echo " Key: ${CT_KEY_ID}" +echo " Bundle: ${CTP_FILE}" +echo "" + +# --------------------------------------------------------------------------- +# Step 1: Build container image with Podman +# --------------------------------------------------------------------------- + +echo "--- Step 1: Building container image ---" + +podman build \ + -t "${FULL_IMAGE}" \ + -f "${SCRIPT_DIR}/Containerfile" \ + "${REPO_ROOT}" + +echo " Built: ${FULL_IMAGE}" +echo "" + +# --------------------------------------------------------------------------- +# Step 2: Pack into .ctp bundle +# --------------------------------------------------------------------------- + +echo "--- Step 2: Packing into .ctp bundle ---" + +if command -v ct &>/dev/null; then + ct pack "${FULL_IMAGE}" -o "${CTP_FILE}" + echo " Packed: ${CTP_FILE}" +else + echo " SKIP: ct not found (install cerro-torre CLI from stapeln/container-stack/cerro-torre)" + echo " The container image is built and tagged but not packed as a .ctp bundle." + echo " To pack manually: ct pack ${FULL_IMAGE} -o ${CTP_FILE}" + echo "" + if [ "$PUSH" = "--push" ]; then + echo "--- Pushing unsigned OCI image (no .ctp) ---" + podman push "${FULL_IMAGE}" + echo " Pushed: ${FULL_IMAGE} (unsigned OCI — not a .ctp bundle)" + fi + echo "" + echo "=== Build complete (without .ctp signing) ===" + exit 0 +fi + +echo "" + +# --------------------------------------------------------------------------- +# Step 3: Sign the .ctp bundle +# --------------------------------------------------------------------------- + +echo "--- Step 3: Signing .ctp bundle ---" + +if command -v cerro-sign &>/dev/null; then + cerro-sign sign "${CTP_FILE}" --key-id "${CT_KEY_ID}" + echo " Signed: ${CTP_FILE} (key: ${CT_KEY_ID})" +elif command -v ct &>/dev/null; then + ct sign "${CTP_FILE}" --key "${CT_KEY_ID}" + echo " Signed: ${CTP_FILE} (key: ${CT_KEY_ID})" +else + echo " SKIP: cerro-sign not found (install from stapeln/container-stack/cerro-torre)" +fi + +echo "" + +# --------------------------------------------------------------------------- +# Step 4: Verify the .ctp bundle +# --------------------------------------------------------------------------- + +echo "--- Step 4: Verifying .ctp bundle ---" + +if command -v ct &>/dev/null; then + ct verify "${CTP_FILE}" + echo " Verified: ${CTP_FILE}" +else + echo " SKIP: ct not found" +fi + +echo "" + +# --------------------------------------------------------------------------- +# Step 5: Push to registry (optional) +# --------------------------------------------------------------------------- + +if [ "$PUSH" = "--push" ]; then + echo "--- Step 5: Pushing to registry ---" + + if command -v ct &>/dev/null; then + ct push "${CTP_FILE}" "${FULL_IMAGE}" + echo " Pushed: ${FULL_IMAGE}" + else + # Fall back to podman push (unsigned OCI image) + echo " ct not available, falling back to podman push (unsigned)" + podman push "${FULL_IMAGE}" + echo " Pushed: ${FULL_IMAGE} (unsigned OCI — not a .ctp bundle)" + fi + echo "" +fi + +# --------------------------------------------------------------------------- +# Summary +# --------------------------------------------------------------------------- + +echo "=== Build pipeline complete ===" +echo " Image: ${FULL_IMAGE}" +echo " Bundle: ${CTP_FILE}" +echo "" +echo " To deploy with selur-compose:" +echo " cd container && selur-compose up" +echo "" +echo " To verify at any time:" +echo " ct verify ${CTP_FILE}" +echo "" +echo " To explain the verification chain:" +echo " ct explain ${CTP_FILE}" diff --git a/validate-action/container/deploy.k9.ncl b/validate-action/container/deploy.k9.ncl new file mode 100644 index 0000000..7a73f71 --- /dev/null +++ b/validate-action/container/deploy.k9.ncl @@ -0,0 +1,166 @@ +# SPDX-License-Identifier: MPL-2.0 +# deploy.k9.ncl — a2ml-validate-action deployment component (Hunt level) +# +# k9-svc deployment specification with full pedigree (L1-L5). +# Security Level: 'Hunt (requires cryptographic handshake for execution). +# +# WARNING: This component can execute shell commands! +# It requires explicit authorisation via the Leash system. +# +# Usage: +# nickel typecheck container/deploy.k9.ncl +# k9-svc validate container/deploy.k9.ncl +# k9-svc deploy container/deploy.k9.ncl --env production + +# The component's pedigree (self-description across five layers) +let component_pedigree = { + # ───────────────────────────────────────────────────────────── + # L1: The Snout — Identity + # ───────────────────────────────────────────────────────────── + metadata = { + name = "a2ml-validate-action-deploy", + version = "1.0.0", + breed = "application/vnd.k9+nickel", + magic_number = "K9!", + description = "a2ml-validate-action deployment component (Hunt level)", + }, + + # ───────────────────────────────────────────────────────────── + # L2: The Scent — Target Environment + # ───────────────────────────────────────────────────────────── + target = { + os = 'Linux, + is_edge = false, + requires_podman = true, + min_memory_mb = 256, + }, + + # ───────────────────────────────────────────────────────────── + # L3: The Leash — Security + # ───────────────────────────────────────────────────────────── + security = { + trust_level = 'Hunt, + allow_network = true, + allow_filesystem_write = true, + allow_subprocess = true, + # In production, replace with a real Ed25519 signature. + signature = "PLACEHOLDER-SIGNATURE-REQUIRED-FOR-HUNT", + }, + + # ───────────────────────────────────────────────────────────── + # L4: The Gut — Self-Validation + # ───────────────────────────────────────────────────────────── + validation = { + checksum = "sha256:placeholder", + pedigree_version = "1.0.0", + hunt_authorized = false, # Must be set true after handshake + }, + + # ───────────────────────────────────────────────────────────── + # L5: The Muscle — Deployment Recipes + # ───────────────────────────────────────────────────────────── + recipes = { + install = "just container-build", + validate = "just container-verify", + deploy = "just container-up", + migrate = "just container-build && just container-up", + }, +} in + +# Deployment configuration +let deployment = { + # Target environments (dev / staging / production) + environments = { + dev = { + replicas = 1, + memory = "256Mi", + cpu = "100m", + image_tag = "dev", + }, + staging = { + replicas = 2, + memory = "512Mi", + cpu = "250m", + image_tag = "staging", + }, + production = { + replicas = 3, + memory = "1Gi", + cpu = "500m", + image_tag = "latest", + }, + }, + + # Container configuration + container = { + image = "ghcr.io/hyperpolymath/a2ml-validate-action", + port = 8080, + health_check = "/health", + readiness_check = "/ready", + }, + + # Deployment strategy + strategy = { + type = "rolling", + max_surge = 1, + max_unavailable = 0, + }, +} in + +# Deployment scripts (executed at Hunt level) +let scripts = { + # Pre-deployment validation + pre_deploy = m%" +#!/bin/sh +set -eu +echo "K9: Pre-deployment validation for a2ml-validate-action..." +cd container && selur-compose verify || podman compose --file compose.toml config +echo "K9: Validation passed." +"%, + + # Deployment script + deploy = m%" +#!/bin/sh +set -eu +ENV="${1:-dev}" +echo "K9: Deploying a2ml-validate-action to $ENV environment..." +cd container +./ct-build.sh +selur-compose up --detach || podman compose --file compose.toml up --detach +echo "K9: Deployment to $ENV complete." +"%, + + # Rollback script + rollback = m%" +#!/bin/sh +set -eu +echo "K9: Rolling back a2ml-validate-action deployment..." +cd container +selur-compose down || podman compose --file compose.toml down +echo "K9: Rollback complete." +"%, +} in + +# Export the component +{ + pedigree = component_pedigree, + deployment = deployment, + scripts = scripts, + + # Security check: this component requires Hunt level + required_level = 'Hunt, + + # Warning for users + warning = m%" +WARNING: This is a Hunt-level component. + +It can execute shell commands and modify your system. +Before running, ensure you have: + +1. Reviewed the deployment scripts above +2. Verified the signature (when implemented) +3. Explicitly authorised Hunt-level execution + +Run with: k9-svc authorize container/deploy.k9.ncl && k9-svc deploy container/deploy.k9.ncl +"%, +} diff --git a/validate-action/container/entrypoint.sh b/validate-action/container/entrypoint.sh new file mode 100755 index 0000000..af31959 --- /dev/null +++ b/validate-action/container/entrypoint.sh @@ -0,0 +1,63 @@ +#!/bin/sh +# SPDX-License-Identifier: MPL-2.0 +# a2ml-validate-action container entrypoint +# +# Handles signal propagation, startup logging, and health check +# preparation before exec-ing into the main application process. + +set -e + +# --------------------------------------------------------------------------- +# Signal handling +# --------------------------------------------------------------------------- +# +# Trap SIGTERM and SIGINT so that the application can shut down gracefully +# when Podman sends stop signals (e.g. `podman stop`, `selur-compose down`). + +cleanup() { + echo "Received shutdown signal — stopping a2ml-validate-action..." + # If the main process is backgrounded, kill it here: + # kill "$MAIN_PID" 2>/dev/null || true + # wait "$MAIN_PID" 2>/dev/null || true + exit 0 +} +trap cleanup TERM INT + +# --------------------------------------------------------------------------- +# Startup logging +# --------------------------------------------------------------------------- + +echo "Starting a2ml-validate-action..." +echo " Host: ${APP_HOST:-[::]}" +echo " Port: ${APP_PORT:-8080}" +echo " Data: ${APP_DATA_DIR:-/data}" +echo " Log: ${APP_LOG_FORMAT:-json}" + +# --------------------------------------------------------------------------- +# Health check preparation +# --------------------------------------------------------------------------- +# +# Ensure the data directory exists and is writable. +# The VOLUME directive in the Containerfile creates /data, but a bind-mount +# might replace it with an empty directory owned by root. + +if [ -d "${APP_DATA_DIR:-/data}" ]; then + if [ ! -w "${APP_DATA_DIR:-/data}" ]; then + echo "WARNING: ${APP_DATA_DIR:-/data} is not writable by $(whoami)" + fi +fi + +# --------------------------------------------------------------------------- +# Exec into main process +# --------------------------------------------------------------------------- +# +# Replace the entrypoint shell with the application process so that +# signals are delivered directly and PID 1 is the application. +# +# TODO: Replace the command below with your application binary. +# Examples: +# exec /app/a2ml-validate-action +# exec /app/release/bin/a2ml-validate-action start +# exec /app/a2ml-validate-action serve --host "${APP_HOST}" --port "${APP_PORT}" + +exec "$@" diff --git a/validate-action/container/manifest.toml b/validate-action/container/manifest.toml new file mode 100644 index 0000000..d2c85f8 --- /dev/null +++ b/validate-action/container/manifest.toml @@ -0,0 +1,62 @@ +# SPDX-License-Identifier: MPL-2.0 +# +# Cerro Torre manifest for a2ml-validate-action .ctp bundle +# +# This manifest describes the container image for verified +# container packaging. Used by `ct pack` to create .ctp bundles. + +[metadata] +name = "a2ml-validate-action" +version = "1.0.0" +revision = 1 +summary = "" +description = """ +a2ml-validate-action — containerised service packaged as a verified +cerro-torre .ctp bundle with Ed25519 signing and full provenance +tracking. +""" +license = "MPL-2.0" +homepage = "https://github.com/hyperpolymath/a2ml-validate-action" +maintainer = "Jonathan D.A. Jewell " + +[provenance] +upstream = "https://github.com/hyperpolymath/a2ml-validate-action" +import_date = 2026-03-16T00:00:00Z + +[dependencies] +runtime = ["ca-certificates", "curl"] +build = [] + +[build] +system = "podman" + +[build.environment] +APP_HOST = "[::]" +APP_PORT = "8080" + +[outputs] +primary = "a2ml-validate-action" +split = [] + +[attestations] +require = ["source-signature", "sbom-complete"] +recommend = ["security-audit", "reproducible-build"] + +# Runtime security profile +[security] +user = "appuser" +group = "appuser" +read_only_root = false +no_new_privileges = true + +[security.capabilities] +drop = ["ALL"] +add = ["NET_BIND_SERVICE"] + +[security.network] +listen_tcp = [8080] + +[security.filesystem] +read = ["/app/", "/data/"] +write = ["/data/", "/tmp/"] +execute = ["/app/entrypoint.sh"] diff --git a/validate-action/container/vordr.toml b/validate-action/container/vordr.toml new file mode 100644 index 0000000..81e33db --- /dev/null +++ b/validate-action/container/vordr.toml @@ -0,0 +1,100 @@ +# SPDX-License-Identifier: MPL-2.0 +# +# Vordr runtime monitoring configuration for a2ml-validate-action +# +# Vordr watches container health, detects crashes, tracks resource usage, +# and emits structured logs. It runs alongside the application stack and +# provides runtime observability without requiring in-process agents. +# +# Usage: +# vordr watch --config container/vordr.toml +# vordr status +# vordr report + +[metadata] +name = "a2ml-validate-action" +version = "1.0.0" + +# ============================================================================ +# Health Monitoring +# ============================================================================ +# +# Vordr periodically probes these endpoints. If a probe fails beyond the +# failure_threshold, vordr emits an alert and (optionally) restarts the +# container via Podman. + +[health] +# Primary health endpoint — must return 2xx. +endpoint = "http://localhost:8080/health" +interval = "30s" +timeout = "5s" +failure_threshold = 3 + +# Readiness endpoint — checked during startup and after restarts. +readiness_endpoint = "http://localhost:8080/ready" +readiness_timeout = "10s" + +# Action on failure: "alert" (log + notify) or "restart" (alert + podman restart). +on_failure = "alert" + +# ============================================================================ +# Crash Detection +# ============================================================================ +# +# Monitors container state via Podman. Detects OOM kills, segfaults, +# and unexpected exits. + +[crash_detection] +enabled = true +# Maximum restarts within the window before vordr stops restarting. +max_restarts = 5 +restart_window = "10m" + +# ============================================================================ +# Resource Thresholds +# ============================================================================ +# +# Alert when resource usage exceeds these thresholds. Values are percentages +# of the container's cgroup limits (or host limits if uncapped). + +[resources] +cpu_warn = 80 # Percentage — warn at 80% sustained CPU. +cpu_critical = 95 # Percentage — critical alert at 95%. +memory_warn = 75 # Percentage of memory limit. +memory_critical = 90 +disk_warn = 80 # Percentage of volume usage. +disk_critical = 95 + +# Sample interval for resource metrics. +sample_interval = "15s" + +# ============================================================================ +# Log Output +# ============================================================================ +# +# Vordr emits its own logs (not the application's) in structured format. + +[logging] +format = "json" +level = "info" +# Write vordr logs to stdout (captured by Podman) and optionally to file. +output = "stdout" +# file = "/var/log/vordr/a2ml-validate-action.log" + +# ============================================================================ +# Notifications (optional) +# ============================================================================ +# +# Uncomment and configure to receive alerts via webhook or email. + +# [notifications.webhook] +# url = "https://example.com/hooks/vordr" +# method = "POST" +# headers = { "Content-Type" = "application/json" } +# on = ["failure", "recovery", "resource_critical"] + +# [notifications.email] +# to = "j.d.a.jewell@open.ac.uk" +# from = "vordr@a2ml-validate-action.local" +# smtp = "smtp://localhost:25" +# on = ["failure", "resource_critical"] diff --git a/validate-action/contractile.just b/validate-action/contractile.just new file mode 100644 index 0000000..9a5827b --- /dev/null +++ b/validate-action/contractile.just @@ -0,0 +1,75 @@ +# Auto-generated by: contractile gen-just +# Source directory: contractiles +# Re-generate with: contractile gen-just --dir contractiles +# +# SPDX-License-Identifier: MPL-2.0 + +# === DUST (Recovery & Rollback) === +# Source: Dustfile.a2ml + +# List available dust recovery actions +dust-status: + @echo ' dust-source-rollback: Revert all source changes to last commit [rollback]' + +# Revert all source changes to last commit +dust-source-rollback: + @echo 'Executing rollback for source-rollback' + git checkout HEAD -- . + + +# === INTEND (Declared Future Intent) === +# Source: Intentfile.a2ml + +# Display declared future intents +intend-list: + @echo '=== Declared Intent ===' + @echo '' + @echo 'Features:' + @echo '' + @echo 'Quality:' + + +# === MUST (Physical State Checks) === +# Source: Mustfile.a2ml + +# Run all must checks +must-check: must-license-present must-readme-present must-spdx-headers must-no-banned-files + @echo 'All must checks passed' + +# LICENSE file must exist +must-license-present: + test -f LICENSE + +# README must exist +must-readme-present: + test -f README.adoc || test -f README.md + +# Source files should have SPDX license headers +must-spdx-headers: + find . -name '*.rs' -o -name '*.res' -o -name '*.gleam' | head -20 | xargs -r grep -L 'SPDX-License-Identifier' | wc -l | grep -q '^0$' + +# No Dockerfiles or Makefiles +must-no-banned-files: + test ! -f Dockerfile && test ! -f Makefile + + +# === TRUST (Integrity & Provenance Verification) === +# Source: Trustfile.a2ml + +# Run all trust verifications +trust-verify: trust-license-content trust-no-secrets-committed trust-container-images-pinned + @echo 'All trust verifications passed' + +# LICENSE contains expected SPDX identifier +trust-license-content: + grep -q 'SPDX\|License\|MIT\|Apache\|PMPL\|MPL' LICENSE + +# No .env or credential files in repo +trust-no-secrets-committed: + test ! -f .env && test ! -f credentials.json && test ! -f .env.local + +# Containerfile base images use pinned digests +trust-container-images-pinned: + test ! -f Containerfile || grep -q '@sha256:' Containerfile + + diff --git a/validate-action/docs/0.1-AI-MANIFEST.a2ml b/validate-action/docs/0.1-AI-MANIFEST.a2ml new file mode 100644 index 0000000..7f79301 --- /dev/null +++ b/validate-action/docs/0.1-AI-MANIFEST.a2ml @@ -0,0 +1,33 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "docs-pillar" +level: 1 +parent: "../0-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Technical documentation hub. The root contains high-level orientation + (README, Quickstart, State-Visualizer). Specialized tracks live in + subdirectories. + +canonical_locations: + quickstart: "QUICKSTART.adoc" + state_visualizer: "STATE-VISUALIZER.adoc" + governance: "governance/" + architecture: "architecture/" + decisions: "decisions/" + theory: "theory/" + practice: "practice/" + developer: "developer/" + attribution: "attribution/" + reports: "reports/" + whitepapers: "whitepapers/" + standards: "standards/" + legal: "legal/" + wikis: "wikis/" + +invariants: + - "Primary documentation format MUST be AsciiDoc (.adoc)" + - "Root docs/ MUST only contain pillar entry points" diff --git a/validate-action/docs/QUICKSTART.adoc b/validate-action/docs/QUICKSTART.adoc new file mode 100644 index 0000000..b20b3d0 --- /dev/null +++ b/validate-action/docs/QUICKSTART.adoc @@ -0,0 +1,24 @@ += Quickstart +:toc: preamble + +Get up and running in 60 seconds. + +== Prerequisites + +* Git 2.40+ +* just (command runner) +* Your language toolchain (see Justfile for details) + +== From Template (New Project) + +[source,bash] +---- +git clone https://github.com/hyperpolymath/rsr-template-repo my-project +cd my-project +rm -rf .git && git init -b main +just init # interactive placeholder replacement +---- + +== Project Structure + +See README.adoc in the root for the Dual-Track architecture summary. diff --git a/validate-action/docs/README.adoc b/validate-action/docs/README.adoc new file mode 100644 index 0000000..df45be7 --- /dev/null +++ b/validate-action/docs/README.adoc @@ -0,0 +1,14 @@ += Documentation Layout + +Primary tracks: + +* `theory/` for formal and conceptual material +* `practice/` for operational and implementation material +* `maintenance/` for baseline checklists and release hard-pass runbooks +* `whitepapers/academic/` for research-facing whitepapers +* `whitepapers/industry/` for industry/outreach whitepapers + +Core docs: + +* `maintenance/MAINTENANCE-CHECKLIST.md` +* `practice/SOFTWARE-DEVELOPMENT-APPROACH.adoc` diff --git a/validate-action/docs/RSR_OUTLINE.adoc b/validate-action/docs/RSR_OUTLINE.adoc new file mode 100644 index 0000000..014b21c --- /dev/null +++ b/validate-action/docs/RSR_OUTLINE.adoc @@ -0,0 +1,290 @@ += RSR Template Repository + +image:[Palimpsest-MPL-1.0,link="https://github.com/hyperpolymath/palimpsest-license"] image:[Palimpsest,link="https://github.com/hyperpolymath/palimpsest-license"] +:toc: +:sectnums: + +// Badges +image:https://img.shields.io/badge/RSR-Infrastructure-cd7f32[RSR Infrastructure] +image:https://img.shields.io/badge/Phase-Maintenance-brightgreen[Phase] +image:https://img.shields.io/badge/Guix-Primary-purple?logo=gnu[Guix] + +== Overview + +**The canonical template for RSR (Rhodium Standard Repository) projects.** + +This repository provides the standardized structure, configuration, and tooling for all RSR-compliant repos. Use it to: + +* Bootstrap new projects with RSR compliance +* Reference the standard directory structure +* Copy configuration templates (Justfile, STATE.a2ml, etc.) + +== Quick Start + +[source,bash] +---- +# Clone the template +git clone https://github.com/hyperpolymath/RSR-template-repo my-project +cd my-project + +# Remove template git history +rm -rf .git +git init + +# Interactive bootstrap — replaces all placeholders +just init + +# Enter development environment +guix shell -D -f guix.scm + +# Validate compliance +just validate-rsr +---- + +== What's Included + +[cols="1,3"] +|=== +|File/Directory |Purpose + +|`.editorconfig` +|Editor configuration (indent, charset) + +|`.gitignore` +|Standard ignore patterns + +|`.gitattributes` +|Line endings, diff drivers, binary detection + +|`.guix-channel` +|Guix channel definition + +|`.well-known/` +|RFC-compliant metadata (security.txt, ai.txt, humans.txt) + +|`.machine_readable/` +|All machine-readable content: state files (6 a2ml), `bot_directives/`, `contractiles/` + +|`docs/` +|Documentation directory + +|`guix.scm` +|Guix package definition + +|`Justfile` +|Task runner with 40+ recipes + +|`Containerfile` +|Container build (Wolfi base, Podman) + +|`LICENSE` +|MPL-2.0 (Palimpsest MPL) + +|`EXHIBIT-A-ETHICAL-USE.txt` +|Ethical use guidelines (LICENSE Exhibit A) + +|`EXHIBIT-B-QUANTUM-SAFE.txt` +|Quantum-safe provenance spec (LICENSE Exhibit B) + +|`README.adoc` +|Project overview + +|`TOPOLOGY.md` +|Architecture diagram and completion dashboard + +|`PLACEHOLDERS.md` +|Template variable reference and replacement guide + +|`0-AI-MANIFEST.a2ml` +|Universal AI agent entry point + +|`AI.a2ml` +|Claude-specific instructions + +|`src/abi/` +|Idris2 ABI definitions (Types, Layout, Foreign) + +|`ffi/zig/` +|Zig FFI implementation + +|`generated/abi/` +|Auto-generated C headers from Idris2 ABI +|=== + +== Justfile Features + +The template Justfile provides: + +* **Combinatoric matrix recipes** for build, test, container, CI +* **Cookbook generation**: `just cookbook` -> `docs/just-cookbook.adoc` +* **Man page generation**: `just man` -> `docs/man/project.1` +* **RSR validation**: `just validate-rsr` +* **STATE.a2ml management**: `just state-touch`, `just state-phase` +* **Container support**: `just container-build`, `just container-push` +* **CI matrix**: `just ci-matrix [stage] [depth]` + +=== Key Recipes + +[source,bash] +---- +just # Show all recipes +just help # Detailed help +just info # Project info +just combinations # Show matrix options + +just build # Build (debug) +just test # Run tests +just quality # Format + lint + test +just ci # Full CI pipeline + +just validate # RSR + STATE validation +just docs # Generate all docs +just cookbook # Generate Justfile docs + +just guix-shell # Guix dev environment +just container-build # Build container +---- + +== Directory Structure + +[source] +---- +project/ +├── .editorconfig # Editor settings +├── .gitignore # Git ignore +├── .gitattributes # Line endings, diff drivers +├── .guix-channel # Guix channel +├── .well-known/ # RFC metadata +│ ├── ai.txt +│ ├── humans.txt +│ └── security.txt +├── .machine_readable/ # ALL machine-readable content +│ ├── STATE.a2ml # Project state, progress, blockers +│ ├── META.a2ml # Architecture decisions, governance +│ ├── ECOSYSTEM.a2ml # Ecosystem position, relationships +│ ├── AGENTIC.a2ml # AI agent interaction patterns +│ ├── NEUROSYM.a2ml # Neurosymbolic integration config +│ ├── PLAYBOOK.a2ml # Operational runbook +│ ├── bot_directives/ # Per-bot rules and constraints +│ └── contractiles/ # Policy enforcement contracts +│ ├── k9/ # Security levels (Kennel/Yard/Hunt) +│ ├── dust/Dustfile # Recovery and rollback +│ ├── lust/Intentfile # Future intent declarations +│ ├── must/Mustfile # Invariant checks +│ └── trust/Trustfile.hs # Cryptographic verification +├── docs/ # Documentation +│ ├── CITATIONS.adoc +│ ├── TOPOLOGY-GUIDE.adoc +│ ├── generated/ +│ └── man/ +├── src/abi/ # Idris2 ABI definitions +│ ├── Types.idr +│ ├── Layout.idr +│ └── Foreign.idr +├── ffi/zig/ # Zig FFI implementation +│ ├── build.zig +│ ├── src/main.zig +│ └── test/integration_test.zig +├── generated/abi/ # Auto-generated C headers +├── examples/ # Example code +├── guix.scm # Guix package +├── Justfile # Task runner +├── Containerfile # Container build +├── LICENSE # MPL-2.0 +├── EXHIBIT-A-ETHICAL-USE.txt # Ethical use guidelines +├── EXHIBIT-B-QUANTUM-SAFE.txt # Quantum-safe provenance +├── README.adoc # Overview +├── TOPOLOGY.md # Architecture + completion +├── PLACEHOLDERS.md # Template variable guide +├── 0-AI-MANIFEST.a2ml # Universal AI entry point +└── AI.a2ml # Claude-specific instructions +---- + +== RSR Compliance + +=== Language Tiers + +* **Tier 1** (Gold): Rust, Elixir, Zig, Ada, Haskell, ReScript, Gleam +* **Tier 2** (Silver): Nickel, Guile Scheme, Nix, Idris2, OCaml +* **Infrastructure**: Guix channels, derivations, Julia batch scripts + +=== Required Files + +* `.editorconfig` +* `.gitignore` +* `Justfile` +* `README.adoc` +* `LICENSE` (MPL-2.0) +* `.machine_readable/STATE.a2ml` +* `.well-known/security.txt` +* `.well-known/ai.txt` +* `.well-known/humans.txt` +* `guix.scm` OR `flake.nix` + +=== Prohibited + +* Python outside `salt/` directory +* TypeScript/JavaScript (use ReScript) +* CUE (use Guile/Nickel) +* `Dockerfile` (use `Containerfile`) +* npm, Bun, pnpm, yarn (use Deno) +* Go (use Rust) + +== STATE.a2ml + +The STATE.a2ml file tracks project state: + +[source] +---- +# STATE — Project State Checkpoint +# Format: a2ml (AI-readable markup) + +project: v-graphql +version: 0.1.0 +last-updated: 2026-02-14 +status: active + +phase: implementation +maturity: beta + +ecosystem: + part-of: RSR Framework + depends-on: [] + +milestones: + - name: Initial setup + completion: 100 + - name: Core implementation + completion: 0 +---- + +== Badge Schema + +Generate badges from STATE.a2ml: + +[source,bash] +---- +just badges standard +---- + +See `docs/BADGE_SCHEMA.adoc` for the full badge taxonomy. + +== Ecosystem Integration + +This template is part of: + +* **STATE.a2ml Ecosystem**: Conversation checkpoints +* **RSR Framework**: Repository standards +* **Consent-Aware-HTTP**: .well-known compliance +* **Hypatia**: Neurosymbolic security scanning +* **gitbot-fleet**: Bot orchestration + +== License + +SPDX-License-Identifier: CC-BY-SA-4.0 + +== Links + +* https://github.com/hyperpolymath/elegant-STATE[elegant-STATE] - STATE tooling +* https://github.com/hyperpolymath/conative-gating[conative-gating] - Policy enforcement +* https://rhodium.sh[Rhodium Standard] - RSR documentation diff --git a/validate-action/docs/STATE-VISUALIZER.adoc b/validate-action/docs/STATE-VISUALIZER.adoc new file mode 100644 index 0000000..2af3297 --- /dev/null +++ b/validate-action/docs/STATE-VISUALIZER.adoc @@ -0,0 +1,128 @@ += Project State Visualizer +[source] +---- + + + + +# RSR Template Repo — Project Topology + +## System Architecture + +``` + ┌─────────────────────────────────────────┐ + │ NEW REPOSITORY │ + │ (Consumer of this Template) │ + └───────────────────┬─────────────────────┘ + │ Scaffolding + ▼ + ┌─────────────────────────────────────────┐ + │ RSR TEMPLATE HUB │ + │ │ + │ ┌───────────┐ ┌───────────────────┐ │ + │ │ AI Gate- │ │ ABI / FFI │ │ + │ │ keeper │ │ Standard │ │ + │ │ (0-AI-M) │ │ (Idris2/Zig) │ │ + │ └─────┬─────┘ └────────┬──────────┘ │ + │ │ │ │ + │ ┌─────▼─────┐ ┌────────▼──────────┐ │ + │ │ Topology │ │ SCM / 6SCM │ │ + │ │ Guide │ │ Metadata │ │ + │ │ (Visual) │ │ (machine_read) │ │ + │ └─────┬─────┘ └────────┬──────────┘ │ + │ │ │ │ + │ ┌─────▼─────────────────▼──────────┐ │ + │ │ CONTAINER ECOSYSTEM │ │ + │ │ ┌──────────┐ ┌───────────────┐ │ │ + │ │ │ Podman / │ │ selur-compose │ │ │ + │ │ │ OCI │ │ cerro-torre │ │ │ + │ │ │ Build │ │ svalinn/vordr │ │ │ + │ │ └──────────┘ └───────────────┘ │ │ + │ │ ct-build.sh deploy.k9.ncl │ │ + │ └──────────────────────────────────┘ │ + └────────│─────────────────│──────────────┘ + │ │ + ▼ ▼ + ┌─────────────────────────────────────────┐ + │ PLATFORM INTEGRATION │ + │ ┌───────────┐ ┌───────────┐ ┌───────┐│ + │ │ GitHub │ │ GitLab │ │ Nix / ││ + │ │ Workflows │ │ CI/CD │ │ Guix ││ + │ └───────────┘ └───────────┘ └───────┘│ + └─────────────────────────────────────────┘ + + ┌─────────────────────────────────────────┐ + │ REPO INFRASTRUCTURE │ + │ Justfile / Mustfile .machine_readable/ │ + │ Codeowners / Reuse 0-AI-MANIFEST.a2ml │ + └─────────────────────────────────────────┘ +``` + +## Completion Dashboard + +``` +COMPONENT STATUS NOTES +───────────────────────────────── ────────────────── ───────────────────────────────── +CORE STANDARDS + ABI/FFI Standard (Idris2/Zig) ██████████ 100% Universal interface stable + AI Gatekeeper (0-AI-MANIFEST) ██████████ 100% Universal entry point active + TOPOLOGY.md Standard ██████████ 100% Visual summary guide active + 6SCM Metadata Structure ██████████ 100% Machine-readable state stable + +INFRASTRUCTURE + Justfile Automation ██████████ 100% Standard build/verify tasks + CI/CD Workflow Templates ██████████ 100% GH/GL scaffolding verified + Multi-Forge Sync ██████████ 100% Hub-and-spoke mirroring stable + +CONTAINER ECOSYSTEM (Phase 2) + Containerfile (OCI build) ██████████ 100% Multi-stage Chainguard base + selur-compose orchestration ██████████ 100% Template + concrete example + cerro-torre manifest ██████████ 100% Bundle metadata & signing + svalinn gateway policy ██████████ 100% .gatekeeper.yaml active + vordr runtime monitoring ██████████ 100% Runtime config template + k9-svc deployment (Nickel) ██████████ 100% Hunt-level deploy descriptor + ct-build.sh pipeline ██████████ 100% Build/sign/verify script + Justfile container-* recipes ██████████ 100% 8 recipes integrated + Trustfile CONTAINER_SUPPLY_CHAIN ██████████ 100% Supply chain section added + +REPO INFRASTRUCTURE + .machine_readable/ ██████████ 100% STATE/META/ECOSYSTEM active + Governance & License ██████████ 100% PMPL & Ethical use verified + Development Shells (Nix/Guix) ██████████ 100% Reproducible env stable + +───────────────────────────────────────────────────────────────────────────── +OVERALL: ██████████ 100% RSR Template Stable & Certified +``` + +## Key Dependencies + +``` +Philosophy ──────► RSR Standard ──────► Template Scaffolding ──► New Repo + │ │ │ │ + ▼ ▼ ▼ ▼ +CCCP Policy ─────► 0-AI-MANIFEST ────────► Justfile ──────────► Compliance + │ + ▼ + Container Ecosystem + ┌──────────┼──────────┐ + ▼ ▼ ▼ + selur-compose cerro- svalinn/ + (orchestrate) torre vordr + (sign) (monitor) + │ + ▼ + k9-svc deploy +``` + +## Update Protocol + +This file is maintained by both humans and AI agents. When updating: + +1. **After completing a component**: Change its bar and percentage +2. **After adding a component**: Add a new row in the appropriate section +3. **After architectural changes**: Update the ASCII diagram +4. **Date**: Update the `Last updated` comment at the top of this file + +Progress bars use: `█` (filled) and `░` (empty), 10 characters wide. +Percentages: 0%, 10%, 20%, ... 100% (in 10% increments). +---- diff --git a/validate-action/docs/architecture/0.2-AI-MANIFEST.a2ml b/validate-action/docs/architecture/0.2-AI-MANIFEST.a2ml new file mode 100644 index 0000000..028b503 --- /dev/null +++ b/validate-action/docs/architecture/0.2-AI-MANIFEST.a2ml @@ -0,0 +1,17 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "architecture-track" +level: 2 +parent: "../0.1-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Documentation track for system architecture and threat models. + +canonical_locations: + threat_model: "THREAT-MODEL.adoc" + +invariants: + - "Visual diagrams MUST include ASCII or Mermaid representations" diff --git a/validate-action/docs/architecture/THREAT-MODEL.adoc b/validate-action/docs/architecture/THREAT-MODEL.adoc new file mode 100644 index 0000000..cc4e052 --- /dev/null +++ b/validate-action/docs/architecture/THREAT-MODEL.adoc @@ -0,0 +1,162 @@ += Threat Model + + + +# Threat Model: a2ml-validate-action + +## Document Info + +| Field | Value | +|---------------|--------------------------------| +| Project | a2ml-validate-action | +| Version | 1.0 | +| Last Reviewed | 2026-03-16 | +| Author | Jonathan D.A. Jewell | +| Methodology | STRIDE | + +## Scope + +### In Scope + +- Application source code and build pipeline +- CI/CD workflows (GitHub Actions) +- Container images and runtime environment +- Secrets and credential management +- Dependencies (direct and transitive) +- Deployment artifacts (binaries, containers, SBOM) + +### Out of Scope + +- Physical security of hosting infrastructure +- GitHub/GitLab platform-level vulnerabilities +- End-user device security +- Social engineering attacks against maintainers (handled by org policy) + +## System Overview + +Brief description of a2ml-validate-action and its architecture. + +> See [STATE-VISUALIZER.adoc](../STATE-VISUALIZER.adoc) for the full architecture diagram and completion dashboard. + +## Assets + +| Asset | Classification | Owner | Notes | +|----------------------|----------------|-------------|--------------------------------------------| +| Source code | Internal | Maintainers | Public repos are still internal-integrity | +| Signing keys | Restricted | Release lead | Signing keys (e.g., Ed25519), GPG keys | +| CI/CD secrets | Restricted | Maintainers | GITHUB_TOKEN, deploy tokens, PATs | +| User/contributor data | Confidential | Org | Emails, contributor identity | +| Build artifacts | Internal | CI pipeline | Binaries, WASM bundles | +| Container images | Internal | CI pipeline | Chainguard-based, signed via image signing tool | +| SBOM / provenance | Public | CI pipeline | SLSA attestations | +| Dependencies | Public | Lockfile | Cargo.lock, deno.lock, gleam.toml | +| Infrastructure config | Confidential | Maintainers | Containerfiles, compose files, orchestration config | + +## Trust Boundaries + +| Boundary | From (Lower Trust) | To (Higher Trust) | +|-----------------------------|---------------------------|----------------------------| +| Pull request submission | External contributor | Repository codebase | +| CI/CD workflow execution | Workflow definition | Runner with secrets access | +| Container build boundary | Build stage | Runtime stage | +| External API calls | Third-party service | Application internals | +| User input (CLI/Web) | End user | Application logic | +| Dependency resolution | Package registry | Build environment | +| Forge mirroring | GitHub | GitLab / Bitbucket | + +## Threat Actors + +| Actor | Motivation | Capability | +|--------------------------|-------------------------------|------------| +| Script kiddie | Vandalism, clout | Low | +| Disgruntled contributor | Sabotage, backdoor insertion | Medium | +| Supply chain attacker | Wide-impact compromise | High | +| Nation state | Espionage, disruption | Very High | +| Automated bot | Credential stuffing, spam PRs | Low-Medium | + +## STRIDE Analysis + +### Spoofing + +| Threat | Affected Asset | Likelihood | Impact | Risk | Mitigation | +|---------------------------------|-------------------|------------|--------|--------|------------------------------------------------| +| Unsigned commits impersonate maintainer | Source code | Medium | High | High | Require GPG-signed commits; vigilant code review | +| Forged bot actions (automated agents) | CI/CD pipeline | Low | High | Medium | Bot tokens scoped minimally; audit bot activity | +| Spoofed package registry identity | Dependencies | Low | High | Medium | Pin dependencies by hash; verify provenance | + +### Tampering + +| Threat | Affected Asset | Likelihood | Impact | Risk | Mitigation | +|---------------------------------|-------------------|------------|--------|--------|------------------------------------------------| +| Malicious pull request | Source code | Medium | High | High | Branch protection; required reviews; CodeQL | +| Dependency poisoning (typosquat) | Dependencies | Medium | High | High | Lockfiles; secret-scanner; security scans | +| Tampered container base image | Container images | Low | High | Medium | Chainguard images; image signing verification | +| Workflow file modification | CI/CD pipeline | Low | High | Medium | CODEOWNERS on .github/; workflow-linter | + +### Repudiation + +| Threat | Affected Asset | Likelihood | Impact | Risk | Mitigation | +|---------------------------------|-------------------|------------|--------|--------|------------------------------------------------| +| Unlogged deployment | Build artifacts | Medium | Medium | Medium | SLSA provenance; deployment audit trail | +| Denied merge of vulnerable code | Source code | Low | Medium | Low | Git history is immutable; signed commits | +| Secret rotation without record | CI/CD secrets | Low | Low | Low | Secret rotation logged in STATE.a2ml | + +### Information Disclosure + +| Threat | Affected Asset | Likelihood | Impact | Risk | Mitigation | +|---------------------------------|-------------------|------------|--------|--------|------------------------------------------------| +| Secrets leaked in git history | CI/CD secrets | Medium | High | High | TruffleHog in CI; secret-scanner workflow | +| Verbose error messages in prod | Application logic | Medium | Medium | Medium | Sanitize outputs; structured logging | +| SBOM reveals internal structure | Infrastructure | Low | Low | Low | Accepted risk; SBOM is intentionally public | + +### Denial of Service + +| Threat | Affected Asset | Likelihood | Impact | Risk | Mitigation | +|---------------------------------|-------------------|------------|--------|--------|------------------------------------------------| +| CI resource exhaustion (fork bomb in PR) | CI/CD pipeline | Medium | Medium | Medium | Concurrency limits; timeout on workflows | +| Spam issues/PRs flooding triage | Maintainer time | Medium | Low | Low | GitHub rate limits; bot auto-close stale | +| Large binary commits bloating repo | Source code | Low | Medium | Low | .gitattributes LFS policy; pre-commit hooks | + +### Elevation of Privilege + +| Threat | Affected Asset | Likelihood | Impact | Risk | Mitigation | +|---------------------------------|-------------------|------------|--------|--------|------------------------------------------------| +| Workflow injection via PR title/body | CI/CD pipeline | Medium | High | High | Never interpolate PR fields in `run:`; use env vars | +| GITHUB_TOKEN over-scoped | CI/CD secrets | Medium | High | High | `permissions: read-all` default; per-job scoping | +| Container escape | Runtime environment | Low | High | Medium | Hardened container runtime; read-only rootfs; no-new-privileges | +| Compromised action dependency | CI/CD pipeline | Medium | High | High | SHA-pin all actions; never use `@latest` tags | + +## Mitigations in Place + +- **SLSA Provenance**: Build attestations via slsa-github-generator +- **Secret Scanning**: TruffleHog + secret-scanner workflow on every push +- **Static Analysis**: CodeQL on supported languages +- **Supply Chain**: OpenSSF Scorecard (scorecard.yml + scorecard-enforcer.yml) +- **Container Signing**: Ed25519 signatures on all published images (optional: use your signing tool) +- **Container Runtime**: Hardened container runtime with formal verification (optional) +- **Dependency Pinning**: All GitHub Actions SHA-pinned; lockfiles committed +- **Workflow Validation**: workflow-linter.yml checks all workflow changes +- **Security Scanning**: Neurosymbolic scanning (hypatia-scan.yml, optional) +- **Bot Governance**: Bot orchestration with confidence thresholds (optional) +- **Edge Security**: Gateway with policy enforcement (optional, where applicable) +- **SBOM**: Generated and published with releases + +## Residual Risks + +| Risk | Accepted Because | Review Trigger | +|-----------------------------------------------|---------------------------------------------------|-------------------------| +| Zero-day in GitHub Actions runner | Platform responsibility; no feasible mitigation | GitHub advisory | +| Maintainer account compromise | Mitigated by 2FA requirement; residual remains | Any suspicious activity | +| Transitive dependency vulnerability (0-day) | Lockfiles limit blast radius; scanning catches known CVEs | CVE database update | +| SBOM exposes internal component names | Transparency is a design goal | Policy change | + +## Review Schedule + +This threat model should be reviewed: + +- **Quarterly** as a standing item +- **When architecture changes** (new services, new trust boundaries, new deployment targets) +- **Before major releases** (v1.0, v2.0, etc.) +- **After any security incident** affecting this project or its dependencies + +Reviewer should update the "Last Reviewed" date and version in Document Info above. diff --git a/validate-action/docs/attribution/0.2-AI-MANIFEST.a2ml b/validate-action/docs/attribution/0.2-AI-MANIFEST.a2ml new file mode 100644 index 0000000..52beaea --- /dev/null +++ b/validate-action/docs/attribution/0.2-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "attribution-unit" +level: 2 +parent: "../0.1-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Sub-unit of the docs pillar focusing on attribution. diff --git a/validate-action/docs/attribution/CITATION.cff b/validate-action/docs/attribution/CITATION.cff new file mode 100644 index 0000000..7921f9f --- /dev/null +++ b/validate-action/docs/attribution/CITATION.cff @@ -0,0 +1,17 @@ +cff-version: 1.2.0 +message: "If you use this software, please cite it as below." +authors: +- family-names: "Jewell" + given-names: "Jonathan D.A." + orcid: "https://orcid.org/0000-0000-0000-0000" # Placeholder +title: "a2ml-validate-action" +version: 0.1.0 +date-released: 2026-03-16 +url: "https://github.com/hyperpolymath/a2ml-validate-action" +repository-code: "https://github.com/hyperpolymath/a2ml-validate-action" +license: MPL-2.0 +keywords: + - "rsr" + - "formal-verification" + - "neurosymbolic" + - "provenance" diff --git a/validate-action/docs/attribution/CITATIONS.adoc b/validate-action/docs/attribution/CITATIONS.adoc new file mode 100644 index 0000000..3255714 --- /dev/null +++ b/validate-action/docs/attribution/CITATIONS.adoc @@ -0,0 +1,35 @@ += a2ml-validate-action - Citation Guide +:toc: + +== BibTeX + +[source,bibtex] +---- +@software{a2ml-validate-action_2026, + author = {Jewell, Jonathan D.A.}, + title = {a2ml-validate-action}, + year = {2026}, + url = {https://github.com/hyperpolymath/a2ml-validate-action}, + license = {MPL-2.0} +} +---- + +== Harvard Style + +Jewell, J. (2026) _a2ml-validate-action_ [Computer software]. Available at: https://github.com/hyperpolymath/a2ml-validate-action + +== OSCOLA + +Jonathan D.A. Jewell, 'a2ml-validate-action' (2026) + +== MLA + +Jewell, Jonathan D.A. "a2ml-validate-action." 2026, github.com/hyperpolymath/a2ml-validate-action. + +== APA 7 + +Jewell, J. (2026). _a2ml-validate-action_ [Computer software]. GitHub. https://github.com/hyperpolymath/a2ml-validate-action + +== See Also + +* link:CITATION.cff[CITATION.cff] diff --git a/validate-action/docs/attribution/CODEOWNERS.adoc b/validate-action/docs/attribution/CODEOWNERS.adoc new file mode 100644 index 0000000..3714055 --- /dev/null +++ b/validate-action/docs/attribution/CODEOWNERS.adoc @@ -0,0 +1,19 @@ += Code Ownership +:icons: font + +This project utilizes a formally defined code ownership structure to ensure that specific components are reviewed by domain experts. + +== Authority Model + +Our ownership model is based on the "Perimeter" architecture: +* **Perimeter 1 (Core):** Strictly controlled by Lead Maintainers. +* **Perimeter 2 (Extensions):** Maintained by component owners. +* **Perimeter 3 (Community):** Open for broader community participation. + +== Automated Enforcement + +The technical rules for automatic review assignments are maintained in the machine-readable link:../../.github/CODEOWNERS[.github/CODEOWNERS] file. GitHub uses this to automatically notify owners when changes are proposed to their sections. + +== Component Owners + +A full list of maintainers and their contact information can be found in link:MAINTAINERS.adoc[MAINTAINERS.adoc]. diff --git a/validate-action/docs/attribution/MAINTAINERS.adoc b/validate-action/docs/attribution/MAINTAINERS.adoc new file mode 100644 index 0000000..48d9781 --- /dev/null +++ b/validate-action/docs/attribution/MAINTAINERS.adoc @@ -0,0 +1,47 @@ +// SPDX-License-Identifier: CC-BY-SA-4.0 += Maintainers +:toc: preamble + +This document lists the maintainers of this project and their responsibilities. + +== Current Maintainers + +[cols="2,3,2",options="header"] +|=== +| Name | Role | Contact + +| Jonathan D.A. Jewell +| Lead Maintainer +| https://github.com/hyperpolymath[@hyperpolymath] +|=== + +== Responsibilities + +Maintainers are responsible for: + +* Reviewing and merging pull requests +* Triaging issues and feature requests +* Ensuring code quality and security standards +* Managing releases and versioning +* Upholding the project's code of conduct + +== Becoming a Maintainer + +Contributors who demonstrate: + +* Consistent, high-quality contributions +* Understanding of the project's goals and standards +* Constructive participation in discussions +* Commitment to the project's long-term health + +May be invited to become maintainers at the discretion of existing maintainers. + +== Decision Making + +* Routine decisions (bug fixes, minor improvements) can be made by any maintainer +* Significant changes require discussion and consensus among maintainers +* Breaking changes or major features should be discussed in issues before implementation + +== Contact + +For questions about project governance, open an issue or contact the maintainers listed above. diff --git a/validate-action/docs/attribution/README.adoc b/validate-action/docs/attribution/README.adoc new file mode 100644 index 0000000..b095612 --- /dev/null +++ b/validate-action/docs/attribution/README.adoc @@ -0,0 +1 @@ += attribution Unit diff --git a/validate-action/docs/decisions/0.2-AI-MANIFEST.a2ml b/validate-action/docs/decisions/0.2-AI-MANIFEST.a2ml new file mode 100644 index 0000000..ac26298 --- /dev/null +++ b/validate-action/docs/decisions/0.2-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "decisions-unit" +level: 2 +parent: "../0.1-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Sub-unit of the docs pillar focusing on decisions. diff --git a/validate-action/docs/decisions/0000-template.adoc b/validate-action/docs/decisions/0000-template.adoc new file mode 100644 index 0000000..6710304 --- /dev/null +++ b/validate-action/docs/decisions/0000-template.adoc @@ -0,0 +1,35 @@ += Architecture Decision Record: 0000-template + + + +# [NUMBER]. [TITLE] + +Date: YYYY-MM-DD + +## Status + +[Proposed | Accepted | Deprecated | Superseded by [ADR-NNNN](NNNN-title.md) | Rejected] + +## Context + +What is the issue that we're seeing that is motivating this decision or change? + +## Decision + +What is the change that we're proposing and/or doing? + +## Consequences + +What becomes easier or more difficult to do because of this change? + +### Positive + +- ... + +### Negative + +- ... + +### Neutral + +- ... diff --git a/validate-action/docs/decisions/0001-adopt-rsr-standard.adoc b/validate-action/docs/decisions/0001-adopt-rsr-standard.adoc new file mode 100644 index 0000000..b5f8a1e --- /dev/null +++ b/validate-action/docs/decisions/0001-adopt-rsr-standard.adoc @@ -0,0 +1,86 @@ += Architecture Decision Record: 0001-adopt-rsr-standard + + + +# 1. Adopt Rhodium Standard Repository (RSR) Template + +Date: 2026-02-14 + +## Status + +Accepted + +## Context + +Managing multiple repositories with an ad-hoc approach led to significant +inconsistencies across the ecosystem. Common problems included: + +- Missing or incomplete configuration files (SECURITY.md, CONTRIBUTING.md, + .editorconfig, etc.) +- State files (STATE.a2ml, META.a2ml, ECOSYSTEM.a2ml) placed in the repository + root instead of the canonical `.machine_readable/` directory +- Duplicate or conflicting workflow definitions across repos +- No standardized entry point for AI agents interacting with repositories +- Inconsistent bot directive configurations leading to unreliable automation +- No contractile enforcement or Justfile automation + +Without a single source of truth for repository structure, each new repo +required manual setup and inevitably drifted from best practices over time. + +## Decision + +Adopt the Rhodium Standard Repository (RSR) template (`rsr-template-repo`) as +the canonical starting point for all new repositories. Existing repositories +will migrate incrementally as they receive active development. + +The RSR template provides: + +- **Machine-readable state files** in `.machine_readable/` (STATE.a2ml, + ECOSYSTEM.a2ml, META.a2ml, AGENTIC.a2ml, NEUROSYM.a2ml, PLAYBOOK.a2ml) +- **AI manifest** (`0-AI-MANIFEST.a2ml`) as a universal entry point for all + AI agents +- **Bot directives** in `.machine_readable/bot_directives/` for bot orchestration integration +- **Contractiles** in `.machine_readable/contractiles/` (k9, dust, lust, must, trust) for + policy enforcement +- **Standardized workflows** (16+ GitHub Actions workflows, all SHA-pinned) +- **Justfile automation** with standard recipes for common tasks +- **Security and governance files**: SECURITY.md, CONTRIBUTING.md, + CODE_OF_CONDUCT.md, LICENSE (MPL-2.0) +- **Architecture Decision Records** in `docs/decisions/` + +New repositories are created by cloning the template: + +```bash +git clone https://github.com/hyperpolymath/rsr-template-repo new-repo-name +cd new-repo-name +rm -rf .git && git init +``` + +## Consequences + +### Positive + +- Consistency across all repositories, enforced from creation +- Automated compliance checking via `rsr-antipattern.yml` workflow +- Bot fleet can operate reliably across all repos with predictable structure +- AI agents (Claude, Gemini, etc.) have a standardized entry point via + `0-AI-MANIFEST.a2ml` +- New contributors can onboard faster with familiar, documented structure +- Reduced maintenance burden: fix once in template, propagate to all repos +- Machine-readable state enables tooling and automation pipelines + +### Negative + +- Migration effort for existing repos requires time and attention +- Learning curve for contributors unfamiliar with RSR conventions +- Template updates need propagation mechanism to existing repos +- Some repos may have unique needs that do not fit the standard template + without customization + +### Neutral + +- Existing CI/CD pipelines continue to work; RSR workflows are additive +- Third-party dependencies retain their original licenses regardless of + repo structure +- ADR process itself is part of the template, enabling future decisions + to be recorded consistently diff --git a/validate-action/docs/decisions/README.adoc b/validate-action/docs/decisions/README.adoc new file mode 100644 index 0000000..153a5e7 --- /dev/null +++ b/validate-action/docs/decisions/README.adoc @@ -0,0 +1 @@ += decisions Unit diff --git a/validate-action/docs/developer/0.2-AI-MANIFEST.a2ml b/validate-action/docs/developer/0.2-AI-MANIFEST.a2ml new file mode 100644 index 0000000..c16fcc7 --- /dev/null +++ b/validate-action/docs/developer/0.2-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "developer-unit" +level: 2 +parent: "../0.1-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Sub-unit of the docs pillar focusing on developer. diff --git a/validate-action/docs/developer/ABI-FFI-README.adoc b/validate-action/docs/developer/ABI-FFI-README.adoc new file mode 100644 index 0000000..59b32dd --- /dev/null +++ b/validate-action/docs/developer/ABI-FFI-README.adoc @@ -0,0 +1,384 @@ += ABI/FFI Standards +{{~ Aditionally delete this line and fill out the template below ~}} + +# {{PROJECT}} ABI/FFI Documentation + +## Overview + +This library follows the **Hyperpolymath RSR Standard** for ABI and FFI design: + +- **ABI (Application Binary Interface)** defined in **Idris2** with formal proofs +- **FFI (Foreign Function Interface)** implemented in **Zig** for C compatibility +- **Generated C headers** bridge Idris2 ABI to Zig FFI +- **Any language** can call through standard C ABI + +## Architecture + +``` +┌─────────────────────────────────────────────┐ +│ ABI Definitions (Idris2) │ +│ src/abi/ │ +│ - Types.idr (Type definitions) │ +│ - Layout.idr (Memory layout proofs) │ +│ - Foreign.idr (FFI declarations) │ +└─────────────────┬───────────────────────────┘ + │ + │ generates (at compile time) + ▼ +┌─────────────────────────────────────────────┐ +│ C Headers (auto-generated) │ +│ generated/abi/{{project}}.h │ +└─────────────────┬───────────────────────────┘ + │ + │ imported by + ▼ +┌─────────────────────────────────────────────┐ +│ FFI Implementation (Zig) │ +│ ffi/zig/src/main.zig │ +│ - Implements C-compatible functions │ +│ - Zero-cost abstractions │ +│ - Memory-safe by default │ +└─────────────────┬───────────────────────────┘ + │ + │ compiled to lib{{project}}.so/.a + ▼ +┌─────────────────────────────────────────────┐ +│ Any Language via C ABI │ +│ - Rust, ReScript, Julia, Python, etc. │ +└─────────────────────────────────────────────┘ +``` + +## Directory Structure + +``` +{{project}}/ +├── src/ +│ ├── abi/ # ABI definitions (Idris2) +│ │ ├── Types.idr # Core type definitions with proofs +│ │ ├── Layout.idr # Memory layout verification +│ │ └── Foreign.idr # FFI function declarations +│ └── lib/ # Core library (any language) +│ +├── ffi/ +│ └── zig/ # FFI implementation (Zig) +│ ├── build.zig # Build configuration +│ ├── build.zig.zon # Dependencies +│ ├── src/ +│ │ └── main.zig # C-compatible FFI implementation +│ ├── test/ +│ │ └── integration_test.zig +│ └── include/ +│ └── {{project}}.h # C header (optional, can be generated) +│ +├── generated/ # Auto-generated files +│ └── abi/ +│ └── {{project}}.h # Generated from Idris2 ABI +│ +└── bindings/ # Language-specific wrappers (optional) + ├── rust/ + ├── rescript/ + └── julia/ +``` + +## Why Idris2 for ABI? + +### 1. **Formal Verification** + +Idris2's dependent types allow proving properties about the ABI at compile-time: + +```idris +-- Prove struct size is correct +public export +exampleStructSize : HasSize ExampleStruct 16 + +-- Prove field alignment is correct +public export +fieldAligned : Divides 8 (offsetOf ExampleStruct.field) + +-- Prove ABI is platform-compatible +public export +abiCompatible : Compatible (ABI 1) (ABI 2) +``` + +### 2. **Type Safety** + +Encode invariants that C/Zig cannot express: + +```idris +-- Non-null pointer guaranteed at type level +data Handle : Type where + MkHandle : (ptr : Bits64) -> {auto 0 nonNull : So (ptr /= 0)} -> Handle + +-- Array with length proof +data Buffer : (n : Nat) -> Type where + MkBuffer : Vect n Byte -> Buffer n +``` + +### 3. **Platform Abstraction** + +Platform-specific types with compile-time selection: + +```idris +CInt : Platform -> Type +CInt Linux = Bits32 +CInt Windows = Bits32 + +CSize : Platform -> Type +CSize Linux = Bits64 +CSize Windows = Bits64 +``` + +### 4. **Safe Evolution** + +Prove that new ABI versions are backward-compatible: + +```idris +-- Compiler enforces compatibility +abiUpgrade : ABI 1 -> ABI 2 +abiUpgrade old = MkABI2 { + -- Must preserve all v1 fields + v1_compat = old, + -- Can add new fields + new_features = defaults +} +``` + +## Why Zig for FFI? + +### 1. **C ABI Compatibility** + +Zig exports C-compatible functions naturally: + +```zig +export fn library_function(param: i32) i32 { + return param * 2; +} +``` + +### 2. **Memory Safety** + +Compile-time safety without runtime overhead: + +```zig +// Null check enforced at compile time +const handle = init() orelse return error.InitFailed; +defer free(handle); +``` + +### 3. **Cross-Compilation** + +Built-in cross-compilation to any platform: + +```bash +zig build -Dtarget=x86_64-linux +zig build -Dtarget=aarch64-macos +zig build -Dtarget=x86_64-windows +``` + +### 4. **Zero Dependencies** + +No runtime, no libc required (unless explicitly needed): + +```zig +// Minimal binary size +pub const lib = @import("std"); +// Only includes what you use +``` + +## Building + +### Build FFI Library + +```bash +cd ffi/zig +zig build # Build debug +zig build -Doptimize=ReleaseFast # Build optimized +zig build test # Run tests +``` + +### Generate C Header from Idris2 ABI + +```bash +cd src/abi +idris2 --cg c-header Types.idr -o ../../generated/abi/{{project}}.h +``` + +### Cross-Compile + +```bash +cd ffi/zig + +# Linux x86_64 +zig build -Dtarget=x86_64-linux + +# macOS ARM64 +zig build -Dtarget=aarch64-macos + +# Windows x86_64 +zig build -Dtarget=x86_64-windows +``` + +## Usage + +### From C + +```c +#include "{{project}}.h" + +int main() { + void* handle = {{project}}_init(); + if (!handle) return 1; + + int result = {{project}}_process(handle, 42); + if (result != 0) { + const char* err = {{project}}_last_error(); + fprintf(stderr, "Error: %s\n", err); + } + + {{project}}_free(handle); + return 0; +} +``` + +Compile with: +```bash +gcc -o example example.c -l{{project}} -L./zig-out/lib +``` + +### From Idris2 + +```idris +import {{PROJECT}}.ABI.Foreign + +main : IO () +main = do + Just handle <- init + | Nothing => putStrLn "Failed to initialize" + + Right result <- process handle 42 + | Left err => putStrLn $ "Error: " ++ errorDescription err + + free handle + putStrLn "Success" +``` + +### From Rust + +```rust +#[link(name = "{{project}}")] +extern "C" { + fn {{project}}_init() -> *mut std::ffi::c_void; + fn {{project}}_free(handle: *mut std::ffi::c_void); + fn {{project}}_process(handle: *mut std::ffi::c_void, input: u32) -> i32; +} + +fn main() { + unsafe { + let handle = {{project}}_init(); + assert!(!handle.is_null()); + + let result = {{project}}_process(handle, 42); + assert_eq!(result, 0); + + {{project}}_free(handle); + } +} +``` + +### From Julia + +```julia +const lib{{project}} = "lib{{project}}" + +function init() + handle = ccall((:{{project}}_init, lib{{project}}), Ptr{Cvoid}, ()) + handle == C_NULL && error("Failed to initialize") + handle +end + +function process(handle, input) + result = ccall((:{{project}}_process, lib{{project}}), Cint, (Ptr{Cvoid}, UInt32), handle, input) + result +end + +function cleanup(handle) + ccall((:{{project}}_free, lib{{project}}), Cvoid, (Ptr{Cvoid},), handle) +end + +# Usage +handle = init() +try + result = process(handle, 42) + println("Result: $result") +finally + cleanup(handle) +end +``` + +## Testing + +### Unit Tests (Zig) + +```bash +cd ffi/zig +zig build test +``` + +### Integration Tests + +```bash +cd ffi/zig +zig build test-integration +``` + +### ABI Verification (Idris2) + +```idris +-- Compile-time verification +%runElab verifyABI + +-- Runtime checks +main : IO () +main = do + verifyLayoutsCorrect + verifyAlignmentsCorrect + putStrLn "ABI verification passed" +``` + +## Contributing + +When modifying the ABI/FFI: + +1. **Update ABI first** (`src/abi/*.idr`) + - Modify type definitions + - Update proofs + - Ensure backward compatibility + +2. **Generate C header** + ```bash + idris2 --cg c-header src/abi/Types.idr -o generated/abi/{{project}}.h + ``` + +3. **Update FFI implementation** (`ffi/zig/src/main.zig`) + - Implement new functions + - Match ABI types exactly + +4. **Add tests** + - Unit tests in Zig + - Integration tests + - ABI verification tests + +5. **Update documentation** + - Function signatures + - Usage examples + - Migration guide (if breaking changes) + +## License + +MPL-2.0 + +## See Also + +- [Idris2 Documentation](https://idris2.readthedocs.io) +- [Zig Documentation](https://ziglang.org/documentation/master/) +- [Rhodium Standard Repositories](https://github.com/hyperpolymath/rhodium-standard-repositories) diff --git a/validate-action/docs/developer/README.adoc b/validate-action/docs/developer/README.adoc new file mode 100644 index 0000000..1d00529 --- /dev/null +++ b/validate-action/docs/developer/README.adoc @@ -0,0 +1 @@ += developer Unit diff --git a/validate-action/docs/governance/0.1-AI-MANIFEST.a2ml b/validate-action/docs/governance/0.1-AI-MANIFEST.a2ml new file mode 100644 index 0000000..6e373bd --- /dev/null +++ b/validate-action/docs/governance/0.1-AI-MANIFEST.a2ml @@ -0,0 +1,21 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "governance-pillar" +level: 1 +parent: "../0-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Primary governance pillar implementing the Triaxial Software Development + Methodology (TSDM). Contains planning, maintenance, and audit tracks. + +canonical_locations: + tsdm_spec: "TSDM.adoc" + planning: "planning/" + maintenance: "maintenance/" + audit: "audit/" + crg: "CRG-CRITERIA.adoc" + checklist: "MAINTENANCE-CHECKLIST.adoc" + approach: "SOFTWARE-DEVELOPMENT-APPROACH.adoc" diff --git a/validate-action/docs/governance/CRG-CRITERIA.a2ml b/validate-action/docs/governance/CRG-CRITERIA.a2ml new file mode 100644 index 0000000..6162585 --- /dev/null +++ b/validate-action/docs/governance/CRG-CRITERIA.a2ml @@ -0,0 +1,108 @@ +; SPDX-License-Identifier: MPL-2.0 +; Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) + +; Component Readiness Grades (CRG) — Machine-readable specification +; Format: A2ML (AI-to-Machine Language) +; Standard: CRG v1.0 + +(standard + (name "Component Readiness Grades") + (abbreviation "CRG") + (version "1.0") + (date "2026-02-28") + (author "Jonathan D.A. Jewell ") + (license "MPL-2.0") + (family "RSR")) + +(grades + (grade + (code X) + (name "Untested") + (release-stage #f) + (ordinal 0) + (description "No testing has been performed. Status unknown.") + (evidence-required "none") + (minimum-for #f)) + (grade + (code F) + (name "Harmful / Wasteful") + (release-stage #f) + (ordinal 1) + (description "Actively harmful, wasteful, or better handled externally. Reject, deprecate, or delegate.") + (evidence-required "documented test results showing harm, waste, or redundancy; comparison with alternatives") + (minimum-for #f)) + (grade + (code E) + (name "Minimal / Salvageable") + (release-stage "pre-alpha") + (ordinal 2) + (description "Does something slight. Barely functional. Needs redesign or major work.") + (evidence-required "at least one successful test case; documented failures and limitations") + (minimum-for #f)) + (grade + (code D) + (name "Partial / Inconsistent") + (release-stage "alpha") + (ordinal 3) + (description "Works on some things but not systematically.") + (evidence-required "matrix of tested scenarios; documented scope vs actual capabilities") + (minimum-for "alpha")) + (grade + (code C) + (name "Self-Validated") + (release-stage "beta") + (ordinal 4) + (description "Tested on the tool/project itself (dogfooding). Reliable in home context.") + (evidence-required "active dogfooding; CI integration or equivalent; no known failures in home context") + (minimum-for "beta")) + (grade + (code B) + (name "Broadly Validated") + (release-stage "release-candidate") + (ordinal 5) + (description "Tested on at least 6 disparate, unrelated targets.") + (evidence-required "list of 6+ diverse targets with test results; evidence of feedback incorporation") + (minimum-for "release-candidate")) + (grade + (code A) + (name "Field-Proven") + (release-stage "stable") + (ordinal 6) + (description "Real-world external feedback confirms value. Does no harm in the wild.") + (evidence-required "real-world usage data; feedback incorporation evidence; no unresolved harm reports") + (minimum-for "stable"))) + +(transitions + (promotion + (from X) (to E) (requirement "Run at least one test. Document results.")) + (promotion + (from X) (to F) (requirement "Evaluate and determine harmful or wasteful.")) + (promotion + (from E) (to D) (requirement "Fix critical failures. Document scope.")) + (promotion + (from D) (to C) (requirement "Dogfood on own project. Fix what breaks.")) + (promotion + (from C) (to B) (requirement "Test on 6+ diverse external targets. Fix what breaks.")) + (promotion + (from B) (to A) (requirement "Ship. Collect external feedback. Demonstrate no harm.")) + (demotion + (from A) (to B) (trigger "External feedback dries up or reveals no longer useful.")) + (demotion + (from A) (to F) (trigger "External feedback reveals component causes harm.")) + (demotion + (from B) (to C) (trigger "Broad validation reveals unfixed failures.")) + (demotion + (from C) (to D) (trigger "Home context changes and component no longer reliable.")) + (demotion + (from C) (to F) (trigger "Dogfooding reveals net negative.")) + (demotion + (from D) (to E) (trigger "Scope narrows to barely functional.")) + (demotion + (from any) (to F) (trigger "Better external alternative makes this pure opportunity cost."))) + +(conformance + (rule "Each assessable component MUST have a grade from {X, F, E, D, C, B, A}.") + (rule "Each grade above X MUST be supported by evidence per section 4.") + (rule "Assessments MUST be recorded in a version-controlled location.") + (rule "Assessments MUST be reviewed at least once per release cycle.") + (rule "Release stages MUST respect minimum grade thresholds.")) diff --git a/validate-action/docs/governance/CRG-CRITERIA.adoc b/validate-action/docs/governance/CRG-CRITERIA.adoc new file mode 100644 index 0000000..f8264e6 --- /dev/null +++ b/validate-action/docs/governance/CRG-CRITERIA.adoc @@ -0,0 +1,39 @@ += Component Readiness Grades (CRG) Criteria +:toc: preamble +:icons: font + +This document defines the quality assessment criteria for individual project components. + +== Grade Definitions + +[cols="1,2,3,4",options="header"] +|=== +| Grade | Name | Release Stage | Meaning + +| **A** | Field-Proven | Stable | Real-world feedback amassed; no harm in wild. +| **B** | Broadly Validated | Release Candidate | Tested on 6+ diverse external targets. +| **C** | Self-Validated | Beta | Reliable in home context (dogfooded). +| **D** | Partial | Alpha | Works on some inputs/cases but not systematically. +| **E** | Minimal | Pre-alpha | Barely functional; needs major work. +| **F** | Harmful/Wasteful | Reject/Delegate | Redundant or negative value. +| **X** | Untested | — | Status completely unknown. +|=== + +== Core Principles + +1. **Assess components, not projects:** Each feature gets its own grade. +2. **Evidence over intuition:** Every grade above X requires documented evidence. +3. **Honest assessment:** Grade the component as it is today, not as you hope it will be. +4. **Grades are earned and can be lost:** Regressions lead to demotion. + +== Assessment Checklist + +1. Has it been tested at all? (No → **X**) +2. Does it cause harm or duplicate something better? (Yes → **F**) +3. Does it do something, however slight? (Barely → **E**) +4. Does it work on some things but not others? (Partial → **D**) +5. Does it work reliably on our own project? (Dogfooded → **C**) +6. Has it been tested on 6+ diverse external targets? (Broad → **B**) +7. Do external users confirm it works and is useful? (Field-proven → **A**) + +See link:READINESS.adoc[READINESS.adoc] for the current project assessment. diff --git a/validate-action/docs/governance/MAINTENANCE-CHECKLIST.a2ml b/validate-action/docs/governance/MAINTENANCE-CHECKLIST.a2ml new file mode 100644 index 0000000..4abd5e4 --- /dev/null +++ b/validate-action/docs/governance/MAINTENANCE-CHECKLIST.a2ml @@ -0,0 +1,159 @@ +# SPDX-License-Identifier: MPL-2.0 +# Cross-repo maintenance baseline (machine-readable canonical) + +[metadata] +version = "1.1.0" +last-updated = "2026-02-24" +scope = "cross-repo" +source-human = "docs/maintenance/MAINTENANCE-CHECKLIST.adoc" +companion-human = "docs/practice/SOFTWARE-DEVELOPMENT-APPROACH.adoc" +companion-machine = ".machine_readable/policies/SOFTWARE-DEVELOPMENT-APPROACH.a2ml" + +[policy] +single-source = true +notes = "Use this file as canonical machine policy and keep markdown synchronized." + +[maintenance-axes] +scoping-first = true +execution-order = ["scoping", "axis-1", "axis-2", "axis-3"] +axis-1 = "must > intend > like" +axis-2 = "corrective > adaptive > perfective" +axis-3 = "systems > compliance > effects" + +[scoping] +inputs_required = [ + "README", + "roadmap", + "status-docs", + "maintenance-checklist", + "ci-and-security-docs", +] + +marker_scan_required = [ + "TODO", + "FIXME", + "XXX", + "HACK", + "STUB", + "PARTIAL", +] + +idris_unsound_scan_required = [ + "believe_me", + "assert_total", +] + +scope_assembly_buckets = ["must", "intend", "like"] + +[axis-2-maintenance-rules] +corrective-first = true +adaptive-second = true +adaptive_examples = [ + "scope-change reconciliation", + "stale-reference removal", + "obsolete-work culling", +] +perfective-third = true +perfective_source = "axis-1 honest state after corrective/adaptive updates" + +[axis-3-audit-rules] +systems-check = true +documentation-honesty-check = true +safety-security-accounted-check = true +effects-review-check = true +benchmark-evidence-required = true +maintainer-dialogue-review-required = true +compliance-seams-check = true +exception-register-required = true +exception-bounded-scope-required = true +policy-drift-contamination-check = true +example-drift-risk = "single TypeScript exception causing broad ReScript->TypeScript migration" +compliance-tooling = "panic-attack" +effects-tooling = "ecological checking with sustainabot guidance" + +[generic-cleanup-finish-off] +root-cleanup-required = true +stale-work-cull-required = true +docs-parity-required = true +machine-human-sync-required = true +compliance-finish-off-required = true +effects-finish-off-required = true +release-prep-summary-required = true +next-actions-required = ["corrective", "adaptive", "perfective"] + +[must] +root_control_files = [ + ".gitignore", + ".gitattributes", + ".editorconfig", + ".tool-versions", + "Containerfile", + "Justfile", +] + +root_hosting_files = [ + "CNAME", + ".nojekyll", +] + +ownership_files = [ + "MAINTAINER", + ".github/CODEOWNERS", +] + +machine_readable_required = [ + ".machine_readable/descriptiles/anchors/ANCHOR.a2ml", + ".machine_readable/contractiles/", + ".machine_readable/ai/", + ".machine_readable/bot_directives/", +] + +contractiles_required = [ + "Mustfile", + "Trustfile", + "Intentfile", +] + +security_required = [ + ".well-known/security.txt", + "ci-security-scan", +] + +quality_gate_required = [ + "format", + "lint", + "unit-tests", + "integration-tests", + "p2p-tests", + "e2e-tests", + "bench-smoke", + "docs-check", + "security-scan", +] + +abi_ffi_policy = [ + "ABI Idris2 in src/interface/abi/*.idr", + "FFI Zig in ffi/**/*.zig", +] + +[should] +docs_primary_format = "adoc" +docs_structure = [ + "docs/theory", + "docs/practice", + "docs/whitepapers/academic", + "docs/whitepapers/industry", + "docs/proofs", + "docs/reports", +] + +root_minimization = true +well_known_metadata = true +roadmap_honesty_with_dates = true +ci_doc_format_policy = true + +[could] +generate_human_from_machine = true +mode_aware_bots = ["corrective", "adaptive", "perfective", "audit"] +topology_dashboard = true +exception_registry = true diff --git a/validate-action/docs/governance/MAINTENANCE-CHECKLIST.adoc b/validate-action/docs/governance/MAINTENANCE-CHECKLIST.adoc new file mode 100644 index 0000000..0b40654 --- /dev/null +++ b/validate-action/docs/governance/MAINTENANCE-CHECKLIST.adoc @@ -0,0 +1,569 @@ += Maintenance Checklist +# Maintenance Checklist (Cross-Repo) + +Use this as a repeatable maintenance runbook for any repo. + +Companion policy: + +- `docs/practice/SOFTWARE-DEVELOPMENT-APPROACH.adoc` (human-readable) +- `.machine_readable/policies/SOFTWARE-DEVELOPMENT-APPROACH.a2ml` (machine-readable) + +## Canonical Repo Baseline (Final) + +Apply this baseline to every repo unless an explicit exception is recorded. + +### Three-Axis Default Model + +- [ ] Axis 1 (scope priority, runs first): `must > intend > like` +- [ ] Axis 2 (maintenance priority): `corrective > adaptive > perfective` +- [ ] Axis 3 (audit priority): `systems > compliance > effects` +- [ ] Perfective items are derived from Axis 1 honest state (not started independently). + +### Axis 1 Scoping Pass (Mandatory) + +Before Axis 2/3 execution, assemble a scoped worklist from evidence: + +- [ ] Read and reconcile: `README`, roadmap, status docs, maintenance checklist, and current CI/security docs. +- [ ] Scan for unfinished markers: `TODO`, `FIXME`, `XXX`, `HACK`, `STUB`, `PARTIAL`. +- [ ] If Idris is present, scan unsoundness markers: `believe_me`, `assert_total`. +- [ ] Identify declared intent vs actual implementation (docs honesty check). +- [ ] Produce a scope assembly artifact with prioritized entries under: + - `must` (release blockers / safety / correctness) + - `intend` (planned near-term) + - `like` (nice-to-have) + +### Axis 2 Maintenance Execution Rules + +- [ ] Corrective first: fix breakage, defects, regressions, safety issues. +- [ ] Adaptive second: reconcile changed scope, remove stale references, cull no-longer-relevant work. +- [ ] Perfective third: only from current honest state established by Axis 1 and updated by corrective/adaptive actions. + +### Axis 3 Audit Rules + +- [ ] Verify systems are in place and actually operating. +- [ ] Verify documentation explains the real/current state (not aspirational-only), including documented exceptions. +- [ ] Verify safety and security controls are present, active, and evidenced. +- [ ] Verify observed effects/impacts are captured and reviewed. +- [ ] Effects audit includes: + - benchmark execution and recorded results (with before/after where relevant) + - explicit maintainer dialogue/status review on what changed, why, and next risks +- [ ] Audit compliance seams/compromises explicitly: + - policy exceptions are recorded with rationale, scope, and expiry/review + - exception does not silently broaden into general policy drift + - language-policy contamination checks run (example: a single TS exception must not trigger broad TypeScript conversion) + - run `panic-attack` as the compliance-audit scanner + - run ecological checking under effects (using sustainabot guidance as current baseline) + +### Generic Cleanup And Finish-Off Pass + +Run this pass at the end of a corrective/adaptive/perfective cycle: + +- [ ] Root cleanup: + - keep only required control/entry files in root + - move non-essential docs/reports/fixtures to canonical folders +- [ ] Remove or archive stale work: + - close out completed TODO/STUB/PARTIAL items + - cull obsolete references, dead files, and superseded plans +- [ ] Documentation finish-off: + - ensure README, roadmap, status, and wiki match actual implementation state + - ensure machine-readable policy/state files match human docs +- [ ] Security/compliance finish-off: + - run compliance scanner (`panic-attack`) and resolve high-priority findings + - verify exception register and seams/compromises are explicitly bounded +- [ ] Effects finish-off: + - run benchmark/effects checks and record evidence + - conduct explicit maintainer review dialogue (what changed, why, remaining risks) +- [ ] Release-prep finish-off: + - produce Must/Should/Could summary + - produce immediate corrective/adaptive/perfective next-actions list + +### Must + +- [ ] Keep required control files at repository root: + - `.gitignore`, `.gitattributes`, `.editorconfig`, `.tool-versions` + - `Containerfile` + - `.containerignore` (or `.dockerignore` only when required for compatibility) + - `CNAME` and `.nojekyll` when using GitHub Pages/custom domain + - `Justfile` (root by convention) +- [ ] Keep ownership/governance files present: + - `MAINTAINER` in root + - `.github/CODEOWNERS` +- [ ] Keep machine-readable canonical structure under `.machine_readable/`: + - state/meta/ecosystem files (`*.a2ml` or repo standard) + - `anchors/ANCHOR.a2ml` + - `contractiles/` (`must`, `trust`, `lust`, and related) + - `ai/` for AI guidance files + - `bot_directives/` for bot control files +- [ ] Keep contractiles/invariants present and wired: + - root `Mustfile` (or equivalent) with enforceable checks + - `Trustfile` and `Intentfile` present +- [ ] Keep security metadata present: + - `.well-known/security.txt` and relevant policy metadata + - CI security scanning configured and runnable +- [ ] Keep docs and navigation coherent: + - single navigation entry point in root (`NAVIGATION.adoc` or equivalent) + - no duplicate conflicting docs for same purpose (for example both `.md` and `.adoc` in root unless intentionally required) +- [ ] Enforce ABI/FFI purity where the policy applies: + - ABI definitions in Idris2 (`src/abi/*.idr`) + - FFI implementations in Zig (`ffi/**/*.zig`) +- [ ] Ensure quality gate includes: formatting, lint, unit/integration tests, p2p/e2e checks, benchmark smoke, docs checks, security scan. + +### Should + +- [ ] Keep human docs primarily in AsciiDoc (`.adoc`) except where ecosystem rules require other formats (GitHub/community health, legal text, tool-specific files). +- [ ] Keep non-essential root files moved into structured folders: + - `docs/` (theory/practice/whitepapers/proofs/reports) + - `tests/` (fixtures/outputs) + - `docs/legal/` (while retaining root `LICENSE` when forge detection needs it) +- [ ] Maintain `.well-known/` for public metadata where applicable (`security.txt`, `humans.txt`, `ads.txt` mirrors if used). +- [ ] Keep CI policy checks for doc-format conventions and canonical file placement. +- [ ] Keep roadmap/status docs honest with dated evidence. + +### Could + +- [ ] Maintain both human and machine views of maintenance policy from a single source (generate one from the other). +- [ ] Add policy bots for corrective/adaptive/perfective/audit modes. +- [ ] Add repo-level architecture map (`TOPOLOGY.md`) and release-readiness dashboards. +- [ ] Add per-repo exception registry for approved policy deviations. + +### Explicit Root-Placement Rule + +Do **not** move the following out of root if you want default tool behavior: + +- `.gitignore`, `.gitattributes`, `.editorconfig`, `.tool-versions` +- `Containerfile` and ignore file (`.containerignore`/`.dockerignore`) +- `CNAME` and `.nojekyll` for GitHub Pages +- `Justfile` + +## Quick Automated Run (Script) + +Use the helper script first, then use the checklist for deeper/manual follow-up. + +Script locations: +- `/var$REPOS_DIR/run-maintenance.sh` +- `~/Desktop/run-maintenance.sh` + +```bash +~/Desktop/run-maintenance.sh --repo /absolute/path/to/repo --output /tmp/maintenance-report.json +jq . /tmp/maintenance-report.json +``` + +Useful flags: + +```bash +# Strict mode: fail process on failed checks +~/Desktop/run-maintenance.sh --repo /absolute/path/to/repo --strict + +# Skip expensive checks when needed +~/Desktop/run-maintenance.sh --repo /absolute/path/to/repo --skip-panic + +# Explicit language selection +~/Desktop/run-maintenance.sh --repo /absolute/path/to/repo --rust --python + +# Release hard-pass mode (fails on warnings or failures) +~/Desktop/run-maintenance.sh --repo /absolute/path/to/repo --fail-on-warn +``` + +Permission policy in script: +- Flags `g+w/o+w` files/dirs +- Flags suspicious executable files +- Flags shebang scripts missing executable bit +- Supports repo-local exceptions via `.maintenance-perms-ignore` (regex per line) +- **Audit-first by default** (non-mutating) +- `--fix-perms` is explicit opt-in only (never implicit) +- For reversible local hardening, pair snapshot/restore scripts where available: + - `scripts/maintenance/perms-state.sh snapshot` + - `scripts/maintenance/perms-state.sh lock` + - `scripts/maintenance/perms-state.sh restore` + +Important git behavior: +- Git generally tracks execute bit, not full UNIX mode matrix. +- Permission hardening audits do not force collaborators to re-unlock every file on pull. +- Keep lock mode opt-in, with restore path documented. + +```bash +# Audit-only (recommended default) +~/Desktop/run-maintenance.sh --repo /absolute/path/to/repo + +# Opt-in permission fixes (review output before commit) +~/Desktop/run-maintenance.sh --repo /absolute/path/to/repo --fix-perms +``` + +## 0) Setup + +```bash +REPO="/absolute/path/to/repo" +cd "$REPO" +``` + +```bash +date -u +git rev-parse --abbrev-ref HEAD +git rev-parse HEAD +git status --porcelain +``` + +## 1) Preflight + +- [ ] Confirm clean intent: note existing unrelated dirty files before edits. +- [ ] Confirm runtime/toolchain versions. +- [ ] Confirm container mode expectation (`podman`/`podman-compose`) if required. + +```bash +command -v rg git jq || true +command -v podman podman-compose || true +``` + +## 2) Dependency/Env Prereqs + +- [ ] Python deps in active interpreter (for Python paths). +- [ ] Language-specific tooling installed. + +```bash +python -c "import sys; print(sys.executable)" +python -c "import pydantic; print(pydantic.__version__)" || echo "pydantic missing" +``` + +## 3) Corrective Maintenance First + +- [ ] Fix regressions, runtime errors, panics, broken commands, failing tests. +- [ ] Re-run failing checks immediately after each fix. + +## 4) Code Health Scans + +- [ ] `TODO/FIXME/XXX/HACK/STUB/PARTIAL` scan. +- [ ] Permission policy scan (`g+w/o+w`, executable hygiene). +- [ ] ABI/FFI policy scan (if applicable: Idris2 ABI, Zig FFI). + +```bash +rg -n "TODO|FIXME|XXX|HACK|STUB|PARTIAL" -g '!**/.git/**' -g '!**/target/**' . +``` + +```bash +# Optional per-repo exceptions (regex per line): +# .maintenance-perms-ignore +# ^vendor/ +# ^third_party/ +``` + +```bash +# Adjust paths for your repo layout +find . -type f \( -name '*.idr' -o -name '*.idris2' -o -name '*.zig' \) +``` + +## 5) Panic/Safety/Security Pass + +- [ ] Run `panic-attacker` assail/assault. +- [ ] Triage findings by severity. +- [ ] Fix high first, then medium. +- [ ] Re-run until acceptable. + +```bash +PANIC_BIN="/var$REPOS_DIR/panic-attacker/target/release/panic-attack" +"$PANIC_BIN" assail "$REPO" --output /tmp/assail.json --output-format json --quiet +jq -r '.weak_points | length' /tmp/assail.json +jq -r '.weak_points[] | "\(.severity)|\(.location)|\(.description)"' /tmp/assail.json +``` + +```bash +# If repo has production-only source builder, prefer this for baseline checks: +./scripts/ci/build-panic-assail-source.sh /tmp/panic-src +"$PANIC_BIN" assail /tmp/panic-src --output /tmp/assail-prod.json --output-format json --quiet +``` + +## 6) Language-Specific Validation + +### Rust + +- [ ] Format +- [ ] Lint +- [ ] Tests +- [ ] Doc tests +- [ ] Benches (where relevant) + +```bash +cargo fmt --all --check +cargo clippy --workspace --all-targets -- -D warnings +cargo test --workspace +cargo test --workspace --doc +# Optional targeted benchmarks: +cargo bench +``` + +### Python + +- [ ] Format/lint +- [ ] Type check +- [ ] Tests + +```bash +ruff check . +ruff format --check . +mypy . +pytest -q +``` + +### Elixir + +- [ ] Format check +- [ ] Lint/static checks +- [ ] Tests + +```bash +mix format --check-formatted +mix credo --strict +mix test +``` + +## 7) Container/Runtime Checks (Podman) + +- [ ] Build container path. +- [ ] Run smoke tests inside containerized flow. +- [ ] Compare host vs container behavior for parity. + +```bash +podman --version +podman compose version || podman-compose --version +``` + +## 8) Benchmark + Regression Check + +- [ ] Capture before/after metrics for touched hot paths. +- [ ] Record command + sample size + output. +- [ ] Fail change if critical path regresses beyond threshold. + +## 9) Adaptive and Perfective Maintenance + +- [ ] Adaptive: compatibility updates (tooling/API/deprecations/config flags). +- [ ] Perfective: clarity, docs parity, developer workflow improvements. +- [ ] Update roadmap/checklist/docs to match actual implementation state. + +## 10) Final QA and Release Hygiene + +- [ ] Re-run full relevant checks one final time. +- [ ] Confirm no unintended file changes. +- [ ] Commit scoped changes with clear message. +- [ ] Push and capture commit SHA. + +```bash +git status --short +git diff --stat +git add +git commit -m "maint: " +git push +``` + +## 11) Maintenance Report Template + +Copy this block per repo run: + +```text +Repo: +Branch: +Start UTC: +End UTC: + +Scope: +- Corrective: +- Adaptive: +- Perfective: + +Checks Run: +- TODO/FIXME scan: +- Panic-attacker: +- Rust/Python/Elixir checks: +- Container checks: +- Benchmark checks: + +Findings: +- High: +- Medium: +- Low: + +Fixes Applied: +1. +2. +3. + +Validation Results: +- Tests: +- Benchmarks: +- Panic-attacker rerun: + +Artifacts: +- assail report: +- benchmark output: +- logs: + +Commit(s): +- SHA: + +Remaining Risks / Follow-ups: +1. +2. +``` + +## 12) Language-Repo Additions (Eclexia-Specific) + +Add these checks for language/compiler repositories with formal ABI/FFI constraints: + +- [x] README structure restored (index/TOC, audience paths, quickstart sanity). +- [x] Wiki split by audience (laypeople/users/developers) and linked from docs index. +- [x] Root-level clutter reduced (archive, analysis, reports relegated to `docs/` subtrees). +- [x] Machine-readable docs synchronized (`STATE.a2ml`, `META.a2ml`, `ECOSYSTEM.a2ml`, contractiles). +- [x] Human-readable docs synchronized (`README`, `QUICK_STATUS`, roadmap, wiki home). +- [x] `Mustfile` invariants present and enforceable in CI. +- [x] `Trustfile` and `Intentfile` present and complete. +- [x] FFI/ABI purity policy enforced (`*.zig` for FFI, `*.idr`/Idris2 for ABI). +- [x] `panic-attack` findings triaged with explicit severity budget for release. +- [x] Point-to-point, end-to-end, and benchmark checks wired in one quality gate. +- [x] CI workflows include quality + security + docs checks with explicit policy. +- [x] Release audit includes corrective/adaptive/perfective + Must/Should/Could. +- [x] Roadmap/status honesty pass completed (dates and current evidence updated). + +## 13) Latest Execution Record (Eclexia, 2026-02-24) + +Repo: `/tmp/eclexia-releaseprep` (branch `release-prep`, base `533ec9e9447f374135cc9e2e81021624ddb3c0ad`) + +### 13.1 Setup/Preflight + +- [x] Captured UTC timestamp and git state. +- [x] Tooling presence verified (`rg`, `git`, `jq`, `cargo`, `rustc`, `just`). +- [x] Runtime/toolchain versions captured. +- [x] Container tooling checked (`podman`, `podman-compose`). + +### 13.2 Corrective Maintenance + +- [x] Fixed `panic-attack` script path handling (`mktemp` output + local fallback binary detection). +- [x] Removed Idris `believe_me` usage from ABI wrappers. +- [x] Fixed conformance crash-noise path by skipping known intentional stack-overflow case in default runner. +- [x] Re-ran affected checks after each fix. + +### 13.3 Code-Health Scans + +- [x] TODO/FIXME/STUB/PARTIAL scan run on active code paths. +- [x] ABI/FFI file inventory run (`*.idr`, `*.zig`). +- [x] Active-code marker count reduced/triaged; remaining items tracked in release audit. + +### 13.4 Security/Panic Pass + +- [x] `panic-attack` run and triaged. +- [x] Critical findings cleared (Idris unsoundness markers removed). +- [x] Current baseline: 0 weak points (Critical 0, High 0, Medium 0, Low 0). +- [x] High/Medium backlog fully eliminated. + +### 13.5 Language Validation + +- [x] Final `just quality-gate` pass completed (docs, fmt, lint, unit, conformance, integration, p2p, e2e, bench). +- [x] Additional targeted reruns completed (`just test-conformance`, `just panic-attack`, `just docs-check`). + +### 13.6 Adaptive/Perfective/Docs + +- [x] README/wiki/docs structure and indexing restored. +- [x] Root tidy/relegation pass executed. +- [x] Roadmap/status honesty update performed with current date and evidence links. +- [x] Release audit created with corrective/adaptive/perfective + Must/Should/Could. +- [x] Full quality-gate rerun passed after hardening updates. +- [x] ABI/FFI extension lane added without breaking stable symbols (`ecl_abi_get_info`, `ecl_tracker_create_ex`, `ecl_tracker_snapshot`). +- [x] CI quality workflow now validates sibling `proven` repo presence and critical binding files. +- [x] Proven roadmap now includes explicit "critical core, not full rewrite" adoption guidance and flowchart. + +### 13.7 Outstanding Items (Explicit) + +- [x] Stable `v1.0.0` technical gate readiness met (quality + panic scan clean). +- [x] Parser/codegen/runtime panic-path hardening completed for scanner-flagged paths. +- [x] Non-eclexia `proven` library checked: already Idris2-first with Zig ABI bridge; no additional integration changes required in this run. +- [ ] Remote push blocked by token scope: GitHub rejected branch updates (`release-prep`, `release-prep-pushable`) due missing `workflow` OAuth scope. + +### 13.8 Artifacts + +- Release audit: `docs/reports/V1-READINESS-AUDIT-2026-02-24.md` +- Panic report: `/tmp/eclexia-panic-attack.KZ1jpC.json` (0 weak points) +- Final quality gate log: `/tmp/eclexia-quality-gate-final2.log` (plus post-change reruns via terminal sessions) +- Local commits: `88fa2af` (`release-prep`), `baa3d1c` (`release-prep-pushable`) + pending new commit from this pass + +## 12) LLM Operator Instructions + +Use this prompt with an LLM agent when you want the process run end-to-end: + +```text +Run the maintenance workflow for this repo using MAINTENANCE-CHECKLIST.md. + +Required behavior: +1. Run ~/Desktop/run-maintenance.sh first and collect the JSON report. +2. Triage report results by severity: fail > warn > pass. +3. Execute corrective maintenance first (fix regressions, panics, broken tests/commands). +4. Run TODO/FIXME/stub scan and address relevant items. +5. Run panic-attacker and fix findings in priority order; rerun to confirm. +6. Run language-specific checks (Rust/Python/Elixir) relevant to this repo. +7. Run benchmark/regression checks for touched hot paths. +8. Enforce permission policy: + - no group/world writable source files unless justified + - executable bit only where intended + - use .maintenance-perms-ignore for justified exceptions +9. Update docs/roadmap/checklist entries to reflect actual state. +10. Produce a final report using the template in MAINTENANCE-CHECKLIST.md. + +Constraints: +- Do not revert unrelated existing dirty changes. +- Stage and commit only scoped intended files. +- If blocked, state exactly what is blocked and why. +``` + +## 13) AI Execution Integrity Contract (Mandatory) + +Use this when delegating maintenance to any AI (Gemini/Claude/ChatGPT/etc.). + +```text +You must execute this maintenance run with strict integrity. + +Non-negotiable rules: +1. Do not claim any step is complete unless you actually ran it. +2. Do not silently skip checklist items. If skipped, state SKIPPED + exact reason. +3. For every check, provide evidence: + - command executed + - pass/fail/warn + - key output summary + - artifact/log path +4. If a command fails, stop claiming success and report the failure clearly. +5. After each fix, re-run the relevant failing check and report the rerun result. +6. Do not hide uncertainty. If unsure, say so and run additional verification. +7. Never mark “all done” while any fail/warn remains unexplained. +8. Do not make destructive or broad permission changes by default. + - permission changes must be audit-first + - use --fix-perms only with explicit intent +9. Final output must include: + - checklist coverage matrix (each item: PASS/FAIL/WARN/SKIPPED) + - unresolved risks + - exact next actions +10. Prioritize user safety and reputation: no “looks fine” claims without evidence. +``` + +Recommended enforcement line for AI prompts: + +```text +Fail closed: if evidence is missing for any checklist item, treat that item as NOT DONE. +``` + +## 14) Fleet Enrollment Automation (Gitbot + Hypatia) + +For centralized coverage across existing and new repos: + +```bash +cd /var$REPOS_DIR/gitbot-fleet +just enroll-repos +``` + +Optional directive write-back to repos that already have `.machine_readable/`: + +```bash +cd /var$REPOS_DIR/gitbot-fleet +just enroll-repos /var$REPOS_DIR true +``` + +Release hard gate from fleet: + +```bash +cd /var$REPOS_DIR/gitbot-fleet +just maintenance-hard-pass /absolute/path/to/repo +``` diff --git a/validate-action/docs/governance/README.adoc b/validate-action/docs/governance/README.adoc new file mode 100644 index 0000000..114ee94 --- /dev/null +++ b/validate-action/docs/governance/README.adoc @@ -0,0 +1 @@ += Governance Pillar (TSDM) diff --git a/validate-action/docs/governance/SOFTWARE-DEVELOPMENT-APPROACH.a2ml b/validate-action/docs/governance/SOFTWARE-DEVELOPMENT-APPROACH.a2ml new file mode 100644 index 0000000..093573a --- /dev/null +++ b/validate-action/docs/governance/SOFTWARE-DEVELOPMENT-APPROACH.a2ml @@ -0,0 +1,53 @@ +# SPDX-License-Identifier: MPL-2.0 +# General software development approach (machine-readable) + +[metadata] +version = "1.0.0" +last-updated = "2026-02-24" +scope = "cross-repo" +source-human = "docs/practice/SOFTWARE-DEVELOPMENT-APPROACH.adoc" + +[execution] +order = ["axis-1", "axis-2", "axis-3"] + +[axis-1] +name = "scope" +priority = "must > intend > like" +inputs = [ + "README", + "roadmap", + "status-docs", + "ci-and-security-docs", +] +marker-scan = ["TODO", "FIXME", "XXX", "HACK", "STUB", "PARTIAL"] +idris-unsound-scan = ["believe_me", "assert_total"] +output = "scoped-work-assembly" + +[axis-2] +name = "maintenance" +priority = "corrective > adaptive > perfective" +corrective = "defect/regression/safety/security fixes" +adaptive = "scope reconciliation, stale-reference removal, obsolete-work culling" +perfective = "quality improvements derived from axis-1 honest state" + +[axis-3] +name = "audit" +priority = "systems > compliance > effects" +systems = "required systems present and operating" +compliance = "exceptions explicit, bounded, and drift-resistant" +effects = "benchmark/operational impact evidence captured and reviewed" +compliance-tooling = "panic-attack" +effects-tooling = "ecological checking with sustainabot guidance" + +[cleanup-finish-off] +root-cleanup = true +stale-work-cull = true +docs-sync-human-machine = true +compliance-audit = true +effects-audit = true +release-summary = ["must", "should", "could"] +next-actions = ["corrective", "adaptive", "perfective"] + +[collaboration] +maintainer-dialogue-required = true +dialogue-topics = ["what changed", "why", "remaining risks"] diff --git a/validate-action/docs/governance/SOFTWARE-DEVELOPMENT-APPROACH.adoc b/validate-action/docs/governance/SOFTWARE-DEVELOPMENT-APPROACH.adoc new file mode 100644 index 0000000..e8805c6 --- /dev/null +++ b/validate-action/docs/governance/SOFTWARE-DEVELOPMENT-APPROACH.adoc @@ -0,0 +1,63 @@ += Software Development Approach (General) +:toc: left +:toclevels: 2 + +This is the general operating policy for software development across repositories. + +== Core Sequence + +Always run work in this order: + +1. Scope first (Axis 1) +2. Maintenance second (Axis 2) +3. Audit third (Axis 3) + +== Axis Definitions + +=== Axis 1: Scope + +Priority order: `must > intend > like` + +Axis 1 output is a scoped assembly of work based on: + +* README, roadmap, status, CI/security docs +* marker scans (`TODO`, `FIXME`, `XXX`, `HACK`, `STUB`, `PARTIAL`) +* Idris unsoundness scan when Idris exists (`believe_me`, `assert_total`) +* docs honesty check (intent vs actual implementation) + +=== Axis 2: Maintenance + +Priority order: `corrective > adaptive > perfective` + +* Corrective: fix defects, regressions, breakage, security/safety failures +* Adaptive: reconcile scope changes, remove stale references, cull obsolete work +* Perfective: improve quality/clarity/performance only from the honest Axis 1 state + +=== Axis 3: Audit + +Priority order: `systems > compliance > effects` + +* Systems: required mechanisms exist and are operating +* Compliance: seams/compromises/exceptions are explicit, bounded, and do not drift +* Effects: benchmark and operational impact evidence is captured and reviewed + +Compliance scanner baseline: `panic-attack` + +Effects/ecological baseline: sustainabot-guided ecological checking + +== Generic Cleanup And Finish-Off + +At cycle end: + +* reduce root clutter to required control/entry files +* archive/remove stale or superseded work +* synchronize human and machine docs +* run compliance and effects audits with evidence capture +* produce Must/Should/Could summary and immediate next-actions list + +== Collaboration Rule + +Effects review must include explicit maintainer dialogue: + +* what changed +* why it changed +* what risks remain diff --git a/validate-action/docs/governance/TSDM.a2ml b/validate-action/docs/governance/TSDM.a2ml new file mode 100644 index 0000000..f27036c --- /dev/null +++ b/validate-action/docs/governance/TSDM.a2ml @@ -0,0 +1,22 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [TSDM_SPEC] +id: "tsdm-standard" +version: "1.0.0" + +axes: + axis_1: + name: "Planning" + levels: ["must", "should", "could"] + axis_2: + name: "Maintenance" + levels: ["corrective", "adaptive", "perfective"] + axis_3: + name: "Audit" + levels: ["systems", "compliance", "effects"] + +invariants: + - "Every task MUST map to at least one TSDM coordinate" + - "Axis 1 priority governs resource allocation" + - "Axis 2 type governs commit categorisation" + - "Axis 3 focus governs audit depth" diff --git a/validate-action/docs/governance/TSDM.adoc b/validate-action/docs/governance/TSDM.adoc new file mode 100644 index 0000000..cbd582c --- /dev/null +++ b/validate-action/docs/governance/TSDM.adoc @@ -0,0 +1,26 @@ += Triaxial Software Development Methodology (TSDM) +:toc: preamble +:icons: font + +TSDM is a three-dimensional governance framework designed for high-assurance, long-lived software systems. It ensures that every project decision is mapped across three critical axes: Planning, Maintenance, and Audit. + +== The Three Axes + +=== Axis 1: Planning (Scope Priority) +* **Must:** Non-negotiable core invariants and safety requirements. +* **Should:** Essential features and planned improvements. +* **Could:** Desired enhancements and future-proofing. + +=== Axis 2: Maintenance (Execution Type) +* **Corrective:** Fixing bugs, vulnerabilities, and failures. +* **Adaptive:** Responding to environment or dependency changes. +* **Perfective:** Improving performance, refactoring, and documentation. + +=== Axis 3: Audit (Verification Focus) +* **Systems:** Integrity of tools, infrastructure, and automation. +* **Compliance:** Adherence to standards, licenses, and verified seams. +* **Effects:** Real-world impact, ecological footprint, and user feedback. + +== Integration + +TSDM is the operational core of the Rhodium Standard. Every task in the `Justfile` and every state change in `STATE.a2ml` should be justifiable within this framework. diff --git a/validate-action/docs/governance/audit/0.2-AI-MANIFEST.a2ml b/validate-action/docs/governance/audit/0.2-AI-MANIFEST.a2ml new file mode 100644 index 0000000..4722486 --- /dev/null +++ b/validate-action/docs/governance/audit/0.2-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "governance-axis-audit" +level: 2 +parent: "../0.1-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + TSDM Audit track. diff --git a/validate-action/docs/governance/audit/README.adoc b/validate-action/docs/governance/audit/README.adoc new file mode 100644 index 0000000..fac3740 --- /dev/null +++ b/validate-action/docs/governance/audit/README.adoc @@ -0,0 +1 @@ += Audit Axis diff --git a/validate-action/docs/governance/audit/compliance/0.3-AI-MANIFEST.a2ml b/validate-action/docs/governance/audit/compliance/0.3-AI-MANIFEST.a2ml new file mode 100644 index 0000000..b13ec69 --- /dev/null +++ b/validate-action/docs/governance/audit/compliance/0.3-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "governance-unit-compliance" +level: 3 +parent: "../0.2-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + TSDM compliance unit within the Audit axis. diff --git a/validate-action/docs/governance/audit/compliance/README.adoc b/validate-action/docs/governance/audit/compliance/README.adoc new file mode 100644 index 0000000..876954f --- /dev/null +++ b/validate-action/docs/governance/audit/compliance/README.adoc @@ -0,0 +1 @@ += Compliance Unit diff --git a/validate-action/docs/governance/audit/effects/0.3-AI-MANIFEST.a2ml b/validate-action/docs/governance/audit/effects/0.3-AI-MANIFEST.a2ml new file mode 100644 index 0000000..0bccae0 --- /dev/null +++ b/validate-action/docs/governance/audit/effects/0.3-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "governance-unit-effects" +level: 3 +parent: "../0.2-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + TSDM effects unit within the Audit axis. diff --git a/validate-action/docs/governance/audit/effects/README.adoc b/validate-action/docs/governance/audit/effects/README.adoc new file mode 100644 index 0000000..3634799 --- /dev/null +++ b/validate-action/docs/governance/audit/effects/README.adoc @@ -0,0 +1 @@ += Effects Unit diff --git a/validate-action/docs/governance/audit/systems/0.3-AI-MANIFEST.a2ml b/validate-action/docs/governance/audit/systems/0.3-AI-MANIFEST.a2ml new file mode 100644 index 0000000..f97bc9c --- /dev/null +++ b/validate-action/docs/governance/audit/systems/0.3-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "governance-unit-systems" +level: 3 +parent: "../0.2-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + TSDM systems unit within the Audit axis. diff --git a/validate-action/docs/governance/audit/systems/README.adoc b/validate-action/docs/governance/audit/systems/README.adoc new file mode 100644 index 0000000..8d179b4 --- /dev/null +++ b/validate-action/docs/governance/audit/systems/README.adoc @@ -0,0 +1 @@ += Systems Unit diff --git a/validate-action/docs/governance/maintenance/0.2-AI-MANIFEST.a2ml b/validate-action/docs/governance/maintenance/0.2-AI-MANIFEST.a2ml new file mode 100644 index 0000000..8e0dff5 --- /dev/null +++ b/validate-action/docs/governance/maintenance/0.2-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "governance-axis-maintenance" +level: 2 +parent: "../0.1-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + TSDM Maintenance track. diff --git a/validate-action/docs/governance/maintenance/README.adoc b/validate-action/docs/governance/maintenance/README.adoc new file mode 100644 index 0000000..0ed2f1b --- /dev/null +++ b/validate-action/docs/governance/maintenance/README.adoc @@ -0,0 +1 @@ += Maintenance Axis diff --git a/validate-action/docs/governance/maintenance/adaptive/0.3-AI-MANIFEST.a2ml b/validate-action/docs/governance/maintenance/adaptive/0.3-AI-MANIFEST.a2ml new file mode 100644 index 0000000..63d1a99 --- /dev/null +++ b/validate-action/docs/governance/maintenance/adaptive/0.3-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "governance-unit-adaptive" +level: 3 +parent: "../0.2-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + TSDM adaptive unit within the Maintenance axis. diff --git a/validate-action/docs/governance/maintenance/adaptive/README.adoc b/validate-action/docs/governance/maintenance/adaptive/README.adoc new file mode 100644 index 0000000..7b60992 --- /dev/null +++ b/validate-action/docs/governance/maintenance/adaptive/README.adoc @@ -0,0 +1 @@ += Adaptive Unit diff --git a/validate-action/docs/governance/maintenance/corrective/0.3-AI-MANIFEST.a2ml b/validate-action/docs/governance/maintenance/corrective/0.3-AI-MANIFEST.a2ml new file mode 100644 index 0000000..05cb89d --- /dev/null +++ b/validate-action/docs/governance/maintenance/corrective/0.3-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "governance-unit-corrective" +level: 3 +parent: "../0.2-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + TSDM corrective unit within the Maintenance axis. diff --git a/validate-action/docs/governance/maintenance/corrective/README.adoc b/validate-action/docs/governance/maintenance/corrective/README.adoc new file mode 100644 index 0000000..ed904a8 --- /dev/null +++ b/validate-action/docs/governance/maintenance/corrective/README.adoc @@ -0,0 +1 @@ += Corrective Unit diff --git a/validate-action/docs/governance/maintenance/perfective/0.3-AI-MANIFEST.a2ml b/validate-action/docs/governance/maintenance/perfective/0.3-AI-MANIFEST.a2ml new file mode 100644 index 0000000..832762f --- /dev/null +++ b/validate-action/docs/governance/maintenance/perfective/0.3-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "governance-unit-perfective" +level: 3 +parent: "../0.2-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + TSDM perfective unit within the Maintenance axis. diff --git a/validate-action/docs/governance/maintenance/perfective/README.adoc b/validate-action/docs/governance/maintenance/perfective/README.adoc new file mode 100644 index 0000000..8759d74 --- /dev/null +++ b/validate-action/docs/governance/maintenance/perfective/README.adoc @@ -0,0 +1 @@ += Perfective Unit diff --git a/validate-action/docs/governance/planning/0.2-AI-MANIFEST.a2ml b/validate-action/docs/governance/planning/0.2-AI-MANIFEST.a2ml new file mode 100644 index 0000000..80339e7 --- /dev/null +++ b/validate-action/docs/governance/planning/0.2-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "governance-axis-planning" +level: 2 +parent: "../0.1-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + TSDM Planning track. diff --git a/validate-action/docs/governance/planning/README.adoc b/validate-action/docs/governance/planning/README.adoc new file mode 100644 index 0000000..62aa375 --- /dev/null +++ b/validate-action/docs/governance/planning/README.adoc @@ -0,0 +1 @@ += Planning Axis diff --git a/validate-action/docs/governance/planning/could/0.3-AI-MANIFEST.a2ml b/validate-action/docs/governance/planning/could/0.3-AI-MANIFEST.a2ml new file mode 100644 index 0000000..fc17a27 --- /dev/null +++ b/validate-action/docs/governance/planning/could/0.3-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "governance-unit-could" +level: 3 +parent: "../0.2-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + TSDM could unit within the Planning axis. diff --git a/validate-action/docs/governance/planning/could/README.adoc b/validate-action/docs/governance/planning/could/README.adoc new file mode 100644 index 0000000..ad5a6b8 --- /dev/null +++ b/validate-action/docs/governance/planning/could/README.adoc @@ -0,0 +1 @@ += Could Unit diff --git a/validate-action/docs/governance/planning/must/0.3-AI-MANIFEST.a2ml b/validate-action/docs/governance/planning/must/0.3-AI-MANIFEST.a2ml new file mode 100644 index 0000000..0987dae --- /dev/null +++ b/validate-action/docs/governance/planning/must/0.3-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "governance-unit-must" +level: 3 +parent: "../0.2-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + TSDM must unit within the Planning axis. diff --git a/validate-action/docs/governance/planning/must/README.adoc b/validate-action/docs/governance/planning/must/README.adoc new file mode 100644 index 0000000..47eb46d --- /dev/null +++ b/validate-action/docs/governance/planning/must/README.adoc @@ -0,0 +1 @@ += Must Unit diff --git a/validate-action/docs/governance/planning/should/0.3-AI-MANIFEST.a2ml b/validate-action/docs/governance/planning/should/0.3-AI-MANIFEST.a2ml new file mode 100644 index 0000000..f492289 --- /dev/null +++ b/validate-action/docs/governance/planning/should/0.3-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "governance-unit-should" +level: 3 +parent: "../0.2-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + TSDM should unit within the Planning axis. diff --git a/validate-action/docs/governance/planning/should/README.adoc b/validate-action/docs/governance/planning/should/README.adoc new file mode 100644 index 0000000..605489c --- /dev/null +++ b/validate-action/docs/governance/planning/should/README.adoc @@ -0,0 +1 @@ += Should Unit diff --git a/validate-action/docs/legal/0.2-AI-MANIFEST.a2ml b/validate-action/docs/legal/0.2-AI-MANIFEST.a2ml new file mode 100644 index 0000000..e547798 --- /dev/null +++ b/validate-action/docs/legal/0.2-AI-MANIFEST.a2ml @@ -0,0 +1,16 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "legal-track" +level: 2 +parent: "../0.1-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Sub-unit for legal and licensing documentation. Contains framework + exhibits and archival license texts. + +canonical_locations: + exhibits: "exhibits/" + texts: "texts/" diff --git a/validate-action/docs/legal/EXHIBIT-A-ETHICAL-USE.txt b/validate-action/docs/legal/EXHIBIT-A-ETHICAL-USE.txt new file mode 100644 index 0000000..0b20fca --- /dev/null +++ b/validate-action/docs/legal/EXHIBIT-A-ETHICAL-USE.txt @@ -0,0 +1,68 @@ +SPDX-License-Identifier: MPL-2.0 + +================================================================================ +EXHIBIT A — ETHICAL USE GUIDELINES +Palimpsest-MPL License Version 1.0 +================================================================================ + +1. PURPOSE + + These guidelines define ethical use expectations for software distributed + under the Palimpsest-MPL License. They are not legally binding restrictions + but represent the community's shared values and expectations. + +2. PRINCIPLES + + 2.1. Respect for Emotional Lineage + Users and distributors should acknowledge and preserve the cultural, + narrative, and symbolic meaning embedded in Covered Software. This + includes protest traditions, cultural heritage, trauma narratives, + and community stories where documented. + + 2.2. Transparency in Automated Processing + When Covered Software is processed by Non-Interpretive Systems + (AI training, content aggregation, automated summarization), such + use should be documented publicly and not misrepresent the + provenance of outputs. + + 2.3. Good Faith Attribution + Contributors should be credited accurately. Derivative works should + maintain the attribution chain and not obscure the origins of + contributions. + + 2.4. Community Benefit + Commercial use of Covered Software should contribute to the broader + community through bug fixes, documentation, or other improvements + where feasible. + +3. SPECIFIC GUIDANCE + + 3.1. AI and Machine Learning + - Training on Covered Software requires disclosure + - Generated outputs must not claim Emotional Lineage of the original + - Model cards should reference source materials + + 3.2. Content Aggregation + - Aggregators must link back to original sources + - Context must not be stripped in ways that distort meaning + - Cultural and narrative context should be preserved + + 3.3. Commercial Products + - Products built on Covered Software should acknowledge it + - Pricing should not exploit communities that created the work + - Support and improvements should flow back to the community + +4. ENFORCEMENT + + These guidelines are enforced through community norms, not legal action. + Disputes should be raised with the Palimpsest Stewardship Council for + non-binding guidance. + +5. AMENDMENTS + + These guidelines may be updated by the Palimpsest Stewardship Council. + Updates apply to new distributions, not retroactively. + +================================================================================ +END OF EXHIBIT A +================================================================================ diff --git a/validate-action/docs/legal/EXHIBIT-B-QUANTUM-SAFE.txt b/validate-action/docs/legal/EXHIBIT-B-QUANTUM-SAFE.txt new file mode 100644 index 0000000..7fba8c9 --- /dev/null +++ b/validate-action/docs/legal/EXHIBIT-B-QUANTUM-SAFE.txt @@ -0,0 +1,102 @@ +SPDX-License-Identifier: MPL-2.0 + +================================================================================ +EXHIBIT B — QUANTUM-SAFE PROVENANCE SPECIFICATION +Palimpsest-MPL License Version 1.0 +================================================================================ + +1. PURPOSE + + This exhibit specifies the cryptographic algorithms and procedures for + quantum-safe provenance in software distributed under the Palimpsest-MPL + License. + +2. APPROVED ALGORITHMS + + The following post-quantum cryptographic algorithms are approved for + signing Provenance Metadata: + + 2.1. Digital Signatures + - ML-DSA (FIPS 204, formerly CRYSTALS-Dilithium) + Recommended: ML-DSA-65 (security level 3) or ML-DSA-87 (level 5) + - SLH-DSA (FIPS 205, formerly SPHINCS+) + Recommended: SLH-DSA-SHA2-256f or SLH-DSA-SHAKE-256f + - FALCON (NIST Round 3 finalist) + Recommended: FALCON-1024 + + 2.2. Key Encapsulation (for encrypted provenance) + - ML-KEM (FIPS 203, formerly CRYSTALS-Kyber) + Recommended: ML-KEM-1024 + + 2.3. Hash Functions + - SHA-3 (FIPS 202) + Recommended: SHA3-256 or SHA3-512 + - SHAKE (FIPS 202 extendable output) + Recommended: SHAKE-256 + + 2.4. Key Derivation + - Argon2id (RFC 9106) + Parameters: t=3, m=65536, p=4 (minimum) + +3. PROVENANCE METADATA FORMAT + + Provenance Metadata should include: + + 3.1. Required Fields + - author-identity: Contributor name and contact + - timestamp: ISO 8601 with timezone + - content-hash: SHA3-256 hash of the contribution + - signature: Quantum-safe signature over all fields + + 3.2. Optional Fields + - parent-hash: Hash of the previous contribution in the chain + - emotional-lineage: Narrative context markers + - platform: Build/development environment + - witnesses: Third-party attestation signatures + +4. SIGNATURE PROCEDURE + + 4.1. Signing + a. Compute SHA3-256 hash of the contribution content + b. Construct metadata record with all required fields + c. Serialize metadata in canonical JSON form + d. Sign with ML-DSA-65 (or approved alternative) + e. Attach signature to distribution + + 4.2. Verification + a. Extract metadata and signature from distribution + b. Verify signature against contributor's public key + c. Verify content hash matches actual content + d. Verify timestamp is within acceptable range + e. Verify parent-hash chain if present + +5. KEY MANAGEMENT + + 5.1. Contributors should publish quantum-safe public keys via: + - OpenPGP keyservers (with PQ algorithm support) + - Repository .well-known/keys/ directory + - Contributor's personal website + + 5.2. Key rotation should occur: + - At least annually + - When algorithm recommendations change + - When key compromise is suspected + +6. TRANSITION PERIOD + + During the transition to quantum-safe cryptography: + + 6.1. Classical signatures (Ed25519, RSA) remain valid + 6.2. Hybrid signatures (classical + PQ) are encouraged + 6.3. Pure PQ signatures are preferred for new contributions + 6.4. Classical-only signatures will be deprecated in a future version + +7. COMPLIANCE + + Quantum-safe provenance is OPTIONAL under PMPL-1.0. When present, + it must follow this specification. Stripping quantum-safe signatures + from distributions is prohibited per Section 4.1 of the License. + +================================================================================ +END OF EXHIBIT B +================================================================================ diff --git a/validate-action/docs/practice/.gitkeep b/validate-action/docs/practice/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/validate-action/docs/practice/0.2-AI-MANIFEST.a2ml b/validate-action/docs/practice/0.2-AI-MANIFEST.a2ml new file mode 100644 index 0000000..257f3a4 --- /dev/null +++ b/validate-action/docs/practice/0.2-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "practice-unit" +level: 2 +parent: "../0.1-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Sub-unit of the docs pillar focusing on practice. diff --git a/validate-action/docs/practice/AI-CONVENTIONS.adoc b/validate-action/docs/practice/AI-CONVENTIONS.adoc new file mode 100644 index 0000000..fcdd523 --- /dev/null +++ b/validate-action/docs/practice/AI-CONVENTIONS.adoc @@ -0,0 +1,85 @@ +// SPDX-License-Identifier: CC-BY-SA-4.0 +// Copyright (c) Jonathan D.A. Jewell += AI Conventions + +# AI Conventions (Authoritative Source) + +All AI coding agents working in this repository MUST follow these rules. +Per-tool config files (.cursorrules, .clinerules, etc.) reference this document. + +## Session Startup + +1. Read `0-AI-MANIFEST.a2ml` FIRST (mandatory gatekeeper). +2. Read `.machine_readable/descriptiles/STATE.a2ml` for current status and blockers. +3. Read `.machine_readable/descriptiles/anchors/ANCHOR.a2ml` for canonical authority boundaries. +4. Read `.machine_readable/policies/MAINTENANCE-AXES.a2ml` for maintenance/audit sequencing. +5. Read `.machine_readable/policies/MAINTENANCE-CHECKLIST.a2ml` for baseline controls. +6. Read `.machine_readable/policies/SOFTWARE-DEVELOPMENT-APPROACH.a2ml` for execution order. +7. Read `.machine_readable/descriptiles/AGENTIC.a2ml` for agent constraints. + +## License + +- All original code: **MPL-2.0** +- Fallback (platform-required only): MPL-2.0 with comment explaining why. +- NEVER use AGPL-3.0. +- Preserve third-party licenses verbatim. +- Every source file needs `# SPDX-License-Identifier: CC-BY-SA-4.0`. + +## Author Attribution + +- Name: **Jonathan D.A. Jewell** +- Email: **j.d.a.jewell@open.ac.uk** +- Copyright: `Copyright (c) Jonathan D.A. Jewell ` + +## State Files + +State/metadata files, anchors, and policies (.a2ml) belong in `.machine_readable/` ONLY. +NEVER create STATE.a2ml, META.a2ml, ECOSYSTEM.a2ml, AGENTIC.a2ml, +NEUROSYM.a2ml, PLAYBOOK.a2ml, ANCHOR.a2ml, MAINTENANCE-AXES.a2ml, +MAINTENANCE-CHECKLIST.a2ml, or SOFTWARE-DEVELOPMENT-APPROACH.a2ml in the repository root. + +## Banned Patterns + +| Language | Banned | Reason | +|----------|-------------------------------------|---------------------------| +| Idris2 | `believe_me`, `assert_total` | Unsound escape hatches | +| Haskell | `unsafeCoerce`, `unsafePerformIO` | Breaks type safety | +| OCaml | `Obj.magic`, `Obj.repr`, `Obj.obj` | Unsafe casting | +| Coq | `Admitted` | Unproven assumption | +| Lean | `sorry` | Unproven assumption | +| Rust | `transmute` (unless FFI + SAFETY:) | Unsound reinterpret | + +## Banned Languages + +| Banned | Use Instead | +|---------------------|--------------------| +| TypeScript | ReScript | +| Node.js / npm / bun | Deno | +| Go | Rust | +| Python | Julia / Rust | + +## Container Standard + +- Runtime: **Podman** (never Docker). +- File: **Containerfile** (never Dockerfile). +- Base images: `cgr.dev/chainguard/wolfi-base:latest` or `cgr.dev/chainguard/static:latest`. + +## ABI/FFI Standard + +- ABI definitions: **Idris2** with dependent types (`src/abi/`). +- FFI implementation: **Zig** with C ABI compatibility (`ffi/zig/`). +- Generated C headers: `generated/abi/`. + +## Build System + +Use `just` (justfile) for all build, test, lint, and format tasks. + +## References + +- `0-AI-MANIFEST.a2ml` -- universal AI entry point +- `.machine_readable/descriptiles/AGENTIC.a2ml` -- agent permissions and constraints +- `.machine_readable/descriptiles/STATE.a2ml` -- current project state +- `.machine_readable/descriptiles/anchors/ANCHOR.a2ml` -- canonical authority and policy boundary +- `.machine_readable/policies/MAINTENANCE-AXES.a2ml` -- canonical axis sequencing and audit requirements +- `.machine_readable/policies/MAINTENANCE-CHECKLIST.a2ml` -- baseline maintenance checklist policy +- `.machine_readable/policies/SOFTWARE-DEVELOPMENT-APPROACH.a2ml` -- axis execution approach policy diff --git a/validate-action/docs/practice/README.adoc b/validate-action/docs/practice/README.adoc new file mode 100644 index 0000000..ae3326b --- /dev/null +++ b/validate-action/docs/practice/README.adoc @@ -0,0 +1 @@ += practice Unit diff --git a/validate-action/docs/practice/STATE-VISUALIZER-GUIDE.adoc b/validate-action/docs/practice/STATE-VISUALIZER-GUIDE.adoc new file mode 100644 index 0000000..835db9c --- /dev/null +++ b/validate-action/docs/practice/STATE-VISUALIZER-GUIDE.adoc @@ -0,0 +1,155 @@ +// SPDX-License-Identifier: CC-BY-SA-4.0 += TOPOLOGY.md — Generation Guide +Jonathan D.A. Jewell (hyperpolymath) +:toc: +:sectnums: + +== What Is TOPOLOGY.md? + +A single-file visual map of any project's architecture and completion status. +It lives in the repo root and contains: + +1. **ASCII architecture diagram** — the full system as it will look when complete +2. **Completion dashboard** — every component with a progress bar and status note +3. **Dependency graph** — what blocks what (the critical path) +4. **Update protocol** — how to keep it current + +It is designed to be readable by humans, AI agents, and rendered cleanly on any +forge (GitHub, GitLab, Codeberg, Bitbucket). + +== Why + +- Gives any contributor (human or AI) an instant picture of the whole project +- Replaces "read 20 files to understand the architecture" with one glance +- The completion dashboard makes project health visible without running anything +- Works offline, no tooling required, just a text file + +== How To Generate One + +=== Option 1: Ask an AI agent + +Use this prompt (works with Claude, Gemini, ChatGPT, or any LLM with repo access): + +[source,text] +---- +Read the entire repository and produce a TOPOLOGY.md file for the repo root. + +The file must contain exactly three sections: + +1. **System Architecture** — An ASCII box diagram showing the complete system + as it will look when finished. Use Unicode box-drawing characters + (┌ ┐ └ ┘ │ ─ ├ ┤ ┬ ┴ ┼), arrows (▲ ▼ ◄ ► → ←), and double lines + (═ ║) for boundaries. Show: + - All external services (DNS, CDN, gateways) at the top + - Application components in the middle + - Data layer (databases, caches, queues) below + - Repo infrastructure (CI, contractiles, SCM files) at the bottom + - Every box labelled, every connection labelled or obvious from context + - The diagram should be BESPOKE to this project, not generic + +2. **Completion Dashboard** — A table in a code block listing every component + from the diagram. For each component show: + - Name (left-aligned, padded to 35 chars) + - Progress bar: 10 characters using █ (done) and ░ (remaining) + - Percentage (0% to 100% in 10% increments) + - A short note explaining the status + Group components by layer/concern. End with an OVERALL summary line. + +3. **Key Dependencies** — An ASCII arrow diagram showing the critical path. + What must finish before what else can start. + +Add a header comment with SPDX-License-Identifier and Last updated date. +End with an "Update Protocol" section explaining how to maintain the file. + +Use the template at TOPOLOGY.md in rsr-template-repo as a structural reference, +but make the content completely specific to THIS project. +---- + +=== Option 2: Copy the template and fill it in + +[source,bash] +---- +cp /path/to/rsr-template-repo/TOPOLOGY.md ./TOPOLOGY.md +# Then edit: replace placeholders, draw the real architecture, fill the dashboard +---- + +=== Option 3: Batch generation across all repos + +[source,bash] +---- +# From the repos root, generate for every repo that lacks one +for repo in /path/to/your/repos/*/; do + if [ ! -f "$repo/TOPOLOGY.md" ]; then + echo "NEEDS TOPOLOGY: $(basename $repo)" + fi +done +---- + +Then feed each repo to an AI agent with the prompt above. Claude Code can do +this with a session per repo, or you can batch it. + +== Conventions + +=== Box-drawing characters + +Use Unicode, not ASCII art. This renders correctly everywhere. + +[cols="1,1", options="header"] +|=== +| Character | Use +| `┌ ┐ └ ┘` | Box corners +| `│ ─` | Vertical / horizontal lines +| `├ ┤ ┬ ┴ ┼` | T-junctions and crosses +| `═ ║` | Double lines for major boundaries +| `▲ ▼ ◄ ►` | Directional arrows +| `→ ← ↑ ↓` | Thin arrows (alternative) +|=== + +=== Progress bars + +Always 10 characters wide. Use full blocks only (no half-blocks). + +[source,text] +---- +░░░░░░░░░░ 0% Not started +█░░░░░░░░░ 10% Stub/skeleton exists +██░░░░░░░░ 20% Early work +███░░░░░░░ 30% Foundation laid +████░░░░░░ 40% Core logic started +█████░░░░░ 50% Half done +██████░░░░ 60% Most logic complete +███████░░░ 70% Working but rough +████████░░ 80% Needs polish/docs +█████████░ 90% Nearly done +██████████ 100% Complete and tested +---- + +=== Component naming + +- Use the actual names from the codebase (file names, service names, tool names) +- Group by architectural layer, not alphabetically +- Include repo infrastructure (CI, contractiles, SCM files) as a layer + +=== When to update + +- After completing a component → change bar + percentage +- After adding a component → add row +- After architectural change → redraw diagram +- After major milestone → update overall percentage +- Always update the `Last updated` date + +== Integration With Other RSR Files + +TOPOLOGY.md complements but does not replace: + +- **STATE.a2ml** — machine-readable state (tasks, blockers, next actions) +- **ECOSYSTEM.a2ml** — position in the wider project ecosystem +- **META.a2ml** — architecture decisions and design rationale +- **0-AI-MANIFEST.a2ml** — AI agent entry point and invariants + +TOPOLOGY.md is the _visual summary_ for humans; the a2ml files are the +_structured data_ for tooling. Both should agree. + +== Copyright + +Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) diff --git a/validate-action/docs/reports/0.2-AI-MANIFEST.a2ml b/validate-action/docs/reports/0.2-AI-MANIFEST.a2ml new file mode 100644 index 0000000..5eb265d --- /dev/null +++ b/validate-action/docs/reports/0.2-AI-MANIFEST.a2ml @@ -0,0 +1,19 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "reports-unit" +level: 2 +parent: "../0.1-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Documentation unit for all automated and manual audit reports. Classified + by domain. + +canonical_locations: + maintenance: "maintenance/" + security: "security/" + performance: "performance/" + compliance: "compliance/" + quality: "quality/" diff --git a/validate-action/docs/reports/README.adoc b/validate-action/docs/reports/README.adoc new file mode 100644 index 0000000..0c06c31 --- /dev/null +++ b/validate-action/docs/reports/README.adoc @@ -0,0 +1 @@ += reports Unit diff --git a/validate-action/docs/reports/compliance/0.3-AI-MANIFEST.a2ml b/validate-action/docs/reports/compliance/0.3-AI-MANIFEST.a2ml new file mode 100644 index 0000000..6b39752 --- /dev/null +++ b/validate-action/docs/reports/compliance/0.3-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "report-unit-compliance" +level: 3 +parent: "../0.2-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Specialised repository for compliance findings and evidence. diff --git a/validate-action/docs/reports/compliance/README.adoc b/validate-action/docs/reports/compliance/README.adoc new file mode 100644 index 0000000..c38c66a --- /dev/null +++ b/validate-action/docs/reports/compliance/README.adoc @@ -0,0 +1 @@ += Compliance Reports diff --git a/validate-action/docs/reports/maintenance/0.3-AI-MANIFEST.a2ml b/validate-action/docs/reports/maintenance/0.3-AI-MANIFEST.a2ml new file mode 100644 index 0000000..43eefe2 --- /dev/null +++ b/validate-action/docs/reports/maintenance/0.3-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "report-unit-maintenance" +level: 3 +parent: "../0.2-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Maintenance reports. diff --git a/validate-action/docs/reports/maintenance/README.adoc b/validate-action/docs/reports/maintenance/README.adoc new file mode 100644 index 0000000..f13abf7 --- /dev/null +++ b/validate-action/docs/reports/maintenance/README.adoc @@ -0,0 +1 @@ += Maintenance Reports diff --git a/validate-action/docs/reports/performance/0.3-AI-MANIFEST.a2ml b/validate-action/docs/reports/performance/0.3-AI-MANIFEST.a2ml new file mode 100644 index 0000000..40c0954 --- /dev/null +++ b/validate-action/docs/reports/performance/0.3-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "report-unit-performance" +level: 3 +parent: "../0.2-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Specialised repository for performance findings and evidence. diff --git a/validate-action/docs/reports/performance/README.adoc b/validate-action/docs/reports/performance/README.adoc new file mode 100644 index 0000000..037767d --- /dev/null +++ b/validate-action/docs/reports/performance/README.adoc @@ -0,0 +1 @@ += Performance Reports diff --git a/validate-action/docs/reports/quality/0.3-AI-MANIFEST.a2ml b/validate-action/docs/reports/quality/0.3-AI-MANIFEST.a2ml new file mode 100644 index 0000000..d460edc --- /dev/null +++ b/validate-action/docs/reports/quality/0.3-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "report-unit-quality" +level: 3 +parent: "../0.2-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Specialised repository for quality findings and evidence. diff --git a/validate-action/docs/reports/quality/README.adoc b/validate-action/docs/reports/quality/README.adoc new file mode 100644 index 0000000..d1be848 --- /dev/null +++ b/validate-action/docs/reports/quality/README.adoc @@ -0,0 +1 @@ += Quality Reports diff --git a/validate-action/docs/reports/security/0.3-AI-MANIFEST.a2ml b/validate-action/docs/reports/security/0.3-AI-MANIFEST.a2ml new file mode 100644 index 0000000..696ab59 --- /dev/null +++ b/validate-action/docs/reports/security/0.3-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "report-unit-security" +level: 3 +parent: "../0.2-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Specialised repository for security findings and evidence. diff --git a/validate-action/docs/reports/security/README.adoc b/validate-action/docs/reports/security/README.adoc new file mode 100644 index 0000000..9a78a8b --- /dev/null +++ b/validate-action/docs/reports/security/README.adoc @@ -0,0 +1 @@ += Security Reports diff --git a/validate-action/docs/standards/0.2-AI-MANIFEST.a2ml b/validate-action/docs/standards/0.2-AI-MANIFEST.a2ml new file mode 100644 index 0000000..c147c6f --- /dev/null +++ b/validate-action/docs/standards/0.2-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "standards-unit" +level: 2 +parent: "../0.1-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Standards unit for high-rigor verification. diff --git a/validate-action/docs/standards/README.adoc b/validate-action/docs/standards/README.adoc new file mode 100644 index 0000000..34a94c4 --- /dev/null +++ b/validate-action/docs/standards/README.adoc @@ -0,0 +1 @@ += Standards Unit diff --git a/validate-action/docs/theory/.gitkeep b/validate-action/docs/theory/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/validate-action/docs/theory/0.2-AI-MANIFEST.a2ml b/validate-action/docs/theory/0.2-AI-MANIFEST.a2ml new file mode 100644 index 0000000..93df187 --- /dev/null +++ b/validate-action/docs/theory/0.2-AI-MANIFEST.a2ml @@ -0,0 +1,23 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "theory-track" +level: 2 +parent: "../0.1-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Documentation track for domain-specific theory and research foundations. + Categorised by discipline. + +canonical_locations: + ontologies: "ontologies/" + mathematics: "mathematics/" + computing: "computing/" + socio_technical: "socio-technical/" + formalisms: "formalisms/" + other: "other/" + +invariants: + - "Theoretical claims MUST reference established academic or technical formalisms" diff --git a/validate-action/docs/theory/README.adoc b/validate-action/docs/theory/README.adoc new file mode 100644 index 0000000..c0ddf28 --- /dev/null +++ b/validate-action/docs/theory/README.adoc @@ -0,0 +1 @@ += theory Unit diff --git a/validate-action/docs/theory/computing/0.3-AI-MANIFEST.a2ml b/validate-action/docs/theory/computing/0.3-AI-MANIFEST.a2ml new file mode 100644 index 0000000..f387d08 --- /dev/null +++ b/validate-action/docs/theory/computing/0.3-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "theory-unit-computing" +level: 3 +parent: "../0.2-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Theoretical foundation for computing. diff --git a/validate-action/docs/theory/computing/README.adoc b/validate-action/docs/theory/computing/README.adoc new file mode 100644 index 0000000..4d0db25 --- /dev/null +++ b/validate-action/docs/theory/computing/README.adoc @@ -0,0 +1 @@ += Computing Theory diff --git a/validate-action/docs/theory/formalisms/0.3-AI-MANIFEST.a2ml b/validate-action/docs/theory/formalisms/0.3-AI-MANIFEST.a2ml new file mode 100644 index 0000000..cdc2baa --- /dev/null +++ b/validate-action/docs/theory/formalisms/0.3-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "theory-unit-formalisms" +level: 3 +parent: "../0.2-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Theoretical foundation for formalisms. diff --git a/validate-action/docs/theory/formalisms/README.adoc b/validate-action/docs/theory/formalisms/README.adoc new file mode 100644 index 0000000..5d064c3 --- /dev/null +++ b/validate-action/docs/theory/formalisms/README.adoc @@ -0,0 +1 @@ += Formalisms Theory diff --git a/validate-action/docs/theory/mathematics/0.3-AI-MANIFEST.a2ml b/validate-action/docs/theory/mathematics/0.3-AI-MANIFEST.a2ml new file mode 100644 index 0000000..677a4da --- /dev/null +++ b/validate-action/docs/theory/mathematics/0.3-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "theory-unit-mathematics" +level: 3 +parent: "../0.2-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Theoretical foundation for mathematics. diff --git a/validate-action/docs/theory/mathematics/README.adoc b/validate-action/docs/theory/mathematics/README.adoc new file mode 100644 index 0000000..356236f --- /dev/null +++ b/validate-action/docs/theory/mathematics/README.adoc @@ -0,0 +1 @@ += Mathematics Theory diff --git a/validate-action/docs/theory/ontologies/0.3-AI-MANIFEST.a2ml b/validate-action/docs/theory/ontologies/0.3-AI-MANIFEST.a2ml new file mode 100644 index 0000000..d888cee --- /dev/null +++ b/validate-action/docs/theory/ontologies/0.3-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "theory-unit-ontologies" +level: 3 +parent: "../0.2-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Theoretical foundation for ontologies. diff --git a/validate-action/docs/theory/ontologies/README.adoc b/validate-action/docs/theory/ontologies/README.adoc new file mode 100644 index 0000000..6d16ecf --- /dev/null +++ b/validate-action/docs/theory/ontologies/README.adoc @@ -0,0 +1 @@ += Ontologies Theory diff --git a/validate-action/docs/theory/other/0.3-AI-MANIFEST.a2ml b/validate-action/docs/theory/other/0.3-AI-MANIFEST.a2ml new file mode 100644 index 0000000..166ed9e --- /dev/null +++ b/validate-action/docs/theory/other/0.3-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "theory-unit-other" +level: 3 +parent: "../0.2-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Theoretical foundation for other. diff --git a/validate-action/docs/theory/other/README.adoc b/validate-action/docs/theory/other/README.adoc new file mode 100644 index 0000000..1861d6d --- /dev/null +++ b/validate-action/docs/theory/other/README.adoc @@ -0,0 +1 @@ += Other Theory diff --git a/validate-action/docs/theory/socio-technical/0.3-AI-MANIFEST.a2ml b/validate-action/docs/theory/socio-technical/0.3-AI-MANIFEST.a2ml new file mode 100644 index 0000000..8919522 --- /dev/null +++ b/validate-action/docs/theory/socio-technical/0.3-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "theory-unit-socio-technical" +level: 3 +parent: "../0.2-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Theoretical foundation for socio technical. diff --git a/validate-action/docs/theory/socio-technical/README.adoc b/validate-action/docs/theory/socio-technical/README.adoc new file mode 100644 index 0000000..9ab4ee0 --- /dev/null +++ b/validate-action/docs/theory/socio-technical/README.adoc @@ -0,0 +1 @@ += Socio technical Theory diff --git a/validate-action/docs/whitepapers/0.2-AI-MANIFEST.a2ml b/validate-action/docs/whitepapers/0.2-AI-MANIFEST.a2ml new file mode 100644 index 0000000..c936101 --- /dev/null +++ b/validate-action/docs/whitepapers/0.2-AI-MANIFEST.a2ml @@ -0,0 +1,20 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "whitepapers-track" +level: 2 +parent: "../0.1-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Unit for strategic publications and whitepapers. Categorised by target + audience: Academic, Industry, and Outreach. + +canonical_locations: + academic: "academic/" + industry: "industry/" + outreach: "outreach/" + +invariants: + - "Each sub-track MUST have a clear audience definition in its README" diff --git a/validate-action/docs/whitepapers/README.adoc b/validate-action/docs/whitepapers/README.adoc new file mode 100644 index 0000000..88e83c5 --- /dev/null +++ b/validate-action/docs/whitepapers/README.adoc @@ -0,0 +1 @@ += whitepapers Unit diff --git a/validate-action/docs/whitepapers/academic/.gitkeep b/validate-action/docs/whitepapers/academic/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/validate-action/docs/whitepapers/academic/0.3-AI-MANIFEST.a2ml b/validate-action/docs/whitepapers/academic/0.3-AI-MANIFEST.a2ml new file mode 100644 index 0000000..ceb8a1e --- /dev/null +++ b/validate-action/docs/whitepapers/academic/0.3-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "academic-unit" +level: 3 +parent: "../0.2-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Academic logic at level 3. diff --git a/validate-action/docs/whitepapers/academic/README.adoc b/validate-action/docs/whitepapers/academic/README.adoc new file mode 100644 index 0000000..16c3f45 --- /dev/null +++ b/validate-action/docs/whitepapers/academic/README.adoc @@ -0,0 +1 @@ += Academic Logic diff --git a/validate-action/docs/whitepapers/industry/.gitkeep b/validate-action/docs/whitepapers/industry/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/validate-action/docs/whitepapers/industry/0.3-AI-MANIFEST.a2ml b/validate-action/docs/whitepapers/industry/0.3-AI-MANIFEST.a2ml new file mode 100644 index 0000000..20156dd --- /dev/null +++ b/validate-action/docs/whitepapers/industry/0.3-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "industry-unit" +level: 3 +parent: "../0.2-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Industry logic at level 3. diff --git a/validate-action/docs/whitepapers/industry/README.adoc b/validate-action/docs/whitepapers/industry/README.adoc new file mode 100644 index 0000000..7bc7fcd --- /dev/null +++ b/validate-action/docs/whitepapers/industry/README.adoc @@ -0,0 +1 @@ += Industry Logic diff --git a/validate-action/docs/whitepapers/outreach/0.3-AI-MANIFEST.a2ml b/validate-action/docs/whitepapers/outreach/0.3-AI-MANIFEST.a2ml new file mode 100644 index 0000000..ed7e152 --- /dev/null +++ b/validate-action/docs/whitepapers/outreach/0.3-AI-MANIFEST.a2ml @@ -0,0 +1,16 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "whitepapers-track-outreach" +level: 3 +parent: "../0.2-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Documentation track for outreach, education, and general-audience + engagement. Focuses on accessibility and high-level conceptual clarity. + +invariants: + - "Language MUST be accessible to non-technical audiences" + - "Avoid deep technical jargon without providing clear definitions" diff --git a/validate-action/docs/whitepapers/outreach/README.adoc b/validate-action/docs/whitepapers/outreach/README.adoc new file mode 100644 index 0000000..8141463 --- /dev/null +++ b/validate-action/docs/whitepapers/outreach/README.adoc @@ -0,0 +1,17 @@ += Outreach & Education +:toc: preamble +:icons: font + +This directory contains whitepapers, guides, and presentations tailored for a general audience, including schools, corporate partners, and special interest groups. + +== Target Audiences + +* **Schools & Education:** Introductory material on formal verification and sovereign systems. +* **Corporate:** High-level business value and compliance summaries. +* **Special Interest Groups:** Community-specific impact and ethical use cases. + +== Goals + +* De-mystify high-rigor engineering. +* Promote the adoption of the Rhodium Standard. +* Provide accessible entry points for non-technical stakeholders. diff --git a/validate-action/docs/wikis/0.2-AI-MANIFEST.a2ml b/validate-action/docs/wikis/0.2-AI-MANIFEST.a2ml new file mode 100644 index 0000000..f071ca8 --- /dev/null +++ b/validate-action/docs/wikis/0.2-AI-MANIFEST.a2ml @@ -0,0 +1,15 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "wikis-track" +level: 2 +parent: "../0.1-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Long-form collaborative documentation and project knowledge base. + This directory mirrors the content structure of the project wiki. + +invariants: + - "Primary wiki format MUST be AsciiDoc (.adoc)" diff --git a/validate-action/docs/wikis/README.adoc b/validate-action/docs/wikis/README.adoc new file mode 100644 index 0000000..71b60d1 --- /dev/null +++ b/validate-action/docs/wikis/README.adoc @@ -0,0 +1,15 @@ += Project Wikis +:toc: preamble +:icons: font + +This directory contains the source files for the project wiki. It is intended for long-form documentation, deep-dives, and community-maintained knowledge. + +== Structure + +* **Core Concepts:** Fundamental architectural ideas. +* **Workflows:** Step-by-step guides for contributors. +* **Glossary:** Definitions of project-specific terminology. + +== Wiki Synchronization + +Changes made here should be synchronised with the forge-hosted wiki (GitHub/GitLab) using the project's sync scripts. diff --git a/validate-action/eclexiaiser.toml b/validate-action/eclexiaiser.toml new file mode 100644 index 0000000..cf932f0 --- /dev/null +++ b/validate-action/eclexiaiser.toml @@ -0,0 +1,19 @@ +# SPDX-License-Identifier: MPL-2.0 +# eclexiaiser manifest for a2ml-validate-action + +[project] +name = "a2ml-validate-action" + +[[functions]] +name = "main" +source = "src/main.rs" +energy-budget-mj = 5.0 + +[carbon] +provider = "static" +region = "GB" +static-intensity = 200.0 + +[report] +format = "text" +include-recommendations = true diff --git a/validate-action/examples/0.1-AI-MANIFEST.a2ml b/validate-action/examples/0.1-AI-MANIFEST.a2ml new file mode 100644 index 0000000..0d69c90 --- /dev/null +++ b/validate-action/examples/0.1-AI-MANIFEST.a2ml @@ -0,0 +1 @@ +# AI Manifest - Level 1: examples diff --git a/validate-action/examples/README.adoc b/validate-action/examples/README.adoc new file mode 100644 index 0000000..b9cdb48 --- /dev/null +++ b/validate-action/examples/README.adoc @@ -0,0 +1 @@ += examples Pillar diff --git a/validate-action/examples/web-project-deno.json b/validate-action/examples/web-project-deno.json new file mode 100644 index 0000000..5ddd3bd --- /dev/null +++ b/validate-action/examples/web-project-deno.json @@ -0,0 +1,20 @@ +{ + "// NOTE": "Example deno.json for ReScript web projects", + "tasks": { + "build": "deno run -A npm:rescript", + "clean": "deno run -A npm:rescript clean", + "watch": "deno run -A npm:rescript -w", + "serve": "deno run -A jsr:@std/http/file-server .", + "test": "deno test --allow-all" + }, + "imports": { + "rescript": "^12.0.0", + "@rescript/core": "npm:@rescript/core@^1.6.0", + "safe-dom/": "https://raw.githubusercontent.com/hyperpolymath/rescript-dom-mounter/main/src/", + "proven/": "../proven/bindings/rescript/src/" + }, + "compilerOptions": { + "allowJs": true, + "checkJs": false + } +} diff --git a/validate-action/features/0.1-AI-MANIFEST.a2ml b/validate-action/features/0.1-AI-MANIFEST.a2ml new file mode 100644 index 0000000..dc3e4ee --- /dev/null +++ b/validate-action/features/0.1-AI-MANIFEST.a2ml @@ -0,0 +1,17 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "features-pillar" +level: 1 +parent: "../0-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Optional project features and ecosystem integrations. Provides bootstrap + guides for high-rigor tools (Panic-Attacker, BoJ-Server, SSGs). + +canonical_locations: + panic_attacker: "panic-attacker/" + boj_server: "boj-server/" + ssg: "ssg/" diff --git a/validate-action/features/README.adoc b/validate-action/features/README.adoc new file mode 100644 index 0000000..3899280 --- /dev/null +++ b/validate-action/features/README.adoc @@ -0,0 +1 @@ += Project Features diff --git a/validate-action/features/boj-server/0.2-AI-MANIFEST.a2ml b/validate-action/features/boj-server/0.2-AI-MANIFEST.a2ml new file mode 100644 index 0000000..c77798c --- /dev/null +++ b/validate-action/features/boj-server/0.2-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "feature-unit-boj-server" +level: 2 +parent: "../0.1-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Bootstrap and integration logic for the boj-server ecosystem component. diff --git a/validate-action/features/boj-server/README.adoc b/validate-action/features/boj-server/README.adoc new file mode 100644 index 0000000..0039c37 --- /dev/null +++ b/validate-action/features/boj-server/README.adoc @@ -0,0 +1,14 @@ += BoJ Server Integration +:icons: font + +This unit provides a "starting hand" for integrating with the **BoJ-Server** (Box of Justice) ecosystem — a high-rigor, verified server infrastructure. + +== Integration Options + +* **Core:** Use BoJ-Server as the primary verified backend for this project. +* **Bridge:** Utilize the BoJ-Server IPC bridge for cross-boundary communication. + +== Related Repository + +For the full specification and source, visit: +https://github.com/hyperpolymath/boj-server diff --git a/validate-action/features/panic-attacker/0.2-AI-MANIFEST.a2ml b/validate-action/features/panic-attacker/0.2-AI-MANIFEST.a2ml new file mode 100644 index 0000000..e61ad24 --- /dev/null +++ b/validate-action/features/panic-attacker/0.2-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "feature-unit-panic-attacker" +level: 2 +parent: "../0.1-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Bootstrap and integration logic for the panic-attacker ecosystem component. diff --git a/validate-action/features/panic-attacker/README.adoc b/validate-action/features/panic-attacker/README.adoc new file mode 100644 index 0000000..72d56a4 --- /dev/null +++ b/validate-action/features/panic-attacker/README.adoc @@ -0,0 +1,25 @@ += Panic Attacker Feature +:icons: font + +This unit integrates the **Panic-Attacker** high-rigor stress testing tool into the project lifecycle. + +== Value Proposition + +Panic-Attacker goes beyond unit testing by applying: +* **Static Analysis (Assail):** Detecting logic-based bug signatures. +* **Multi-Axis Dynamic Attacks (Assault):** Stressing CPU, Memory, Disk, and Network boundaries. + +== Usage in this Template + +This template includes a pre-configured maintenance trigger: + +[source,bash] +---- +just maint-assault +---- + +This runs a medium-intensity assault on the project binary and emits a report to `docs/reports/security/`. + +== Related Repository + +https://github.com/hyperpolymath/panic-attacker diff --git a/validate-action/features/ssg/0.2-AI-MANIFEST.a2ml b/validate-action/features/ssg/0.2-AI-MANIFEST.a2ml new file mode 100644 index 0000000..121c5ae --- /dev/null +++ b/validate-action/features/ssg/0.2-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "feature-unit-ssg" +level: 2 +parent: "../0.1-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Bootstrap and integration logic for the ssg ecosystem component. diff --git a/validate-action/features/ssg/README.adoc b/validate-action/features/ssg/README.adoc new file mode 100644 index 0000000..e15687b --- /dev/null +++ b/validate-action/features/ssg/README.adoc @@ -0,0 +1 @@ += Ssg Feature diff --git a/validate-action/features/ssg/ssg-bootstrap.sh b/validate-action/features/ssg/ssg-bootstrap.sh new file mode 100755 index 0000000..89c6fa5 --- /dev/null +++ b/validate-action/features/ssg/ssg-bootstrap.sh @@ -0,0 +1,48 @@ +#!/usr/bin/env bash +# SPDX-License-Identifier: MPL-2.0 +# +# ssg-bootstrap.sh — Universal SSG Initialisation Helper +# +# Provides a starting hand for creating a documentation site or blog +# using hyperpolymath-approved formal or pretty-formal SSGs. + +set -euo pipefail + +echo "═══════════════════════════════════════════════════" +echo " SSG BOOTSTRAP HELPER" +echo "═══════════════════════════════════════════════════" +echo "" +echo "Select an SSG to initialize in this project:" +echo " [1] Casket-SSG (Haskell) — Pretty-formal, high-rigor default" +echo " [2] Ddraig-SSG (Idris2) — Super-formal, dependent-type proofed" +echo " [3] Serum-SSG (Elixir) — Concurrent, robust, BEAM-based" +echo " [4] Zola (Rust) — Fast, standalone, standard" +echo "" + +read -rp "Enter choice [1-4]: " choice + +case "$choice" in + 1) + echo "Selected: Casket-SSG" + echo "Integration: git clone https://github.com/hyperpolymath/casket-ssg docs/site" + ;; + 2) + echo "Selected: Ddraig-SSG" + echo "Integration: git clone https://github.com/hyperpolymath/ddraig-ssg docs/site" + ;; + 3) + echo "Selected: Serum-SSG" + echo "Integration: mix serum.new docs/site" + ;; + 4) + echo "Selected: Zola" + echo "Integration: zola init docs/site" + ;; + *) + echo "Invalid selection. Aborting." + exit 1 + ;; +esac + +echo "" +echo "Note: For more advanced polystack options, visit: https://github.com/hyperpolymath/polystack" diff --git a/validate-action/guix.scm b/validate-action/guix.scm new file mode 100644 index 0000000..295aaf5 --- /dev/null +++ b/validate-action/guix.scm @@ -0,0 +1,71 @@ +;; SPDX-License-Identifier: MPL-2.0 +;; Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) +;; +;; Guix package definition for a2ml-validate-action +;; +;; Usage: +;; guix shell -D -f guix.scm # Enter development shell +;; guix build -f guix.scm # Build package +;; +;; TODO: Replace a2ml-validate-action and customize inputs for your language/stack. +;; See: https://guix.gnu.org/manual/en/html_node/Defining-Packages.html + +(use-modules (guix packages) + (guix gexp) + (guix git-download) + (guix build-system gnu) + (guix licenses) + (gnu packages base)) + +(package + (name "a2ml-validate-action") + (version "0.1.0") + (source (local-file "." "source" + #:recursive? #t + #:select? (lambda (file stat) + (not (string-contains file ".git"))))) + (build-system gnu-build-system) + (arguments + '(#:phases + (modify-phases %standard-phases + ;; TODO: Customize build phases for your project + ;; Examples for common stacks: + ;; + ;; Rust: + ;; (replace 'build (lambda _ (invoke "cargo" "build" "--release"))) + ;; (replace 'check (lambda _ (invoke "cargo" "test"))) + ;; + ;; Elixir: + ;; (replace 'build (lambda _ (invoke "mix" "compile"))) + ;; (replace 'check (lambda _ (invoke "mix" "test"))) + ;; + ;; Zig: + ;; (replace 'build (lambda _ (invoke "zig" "build"))) + ;; (replace 'check (lambda _ (invoke "zig" "build" "test"))) + (delete 'configure) + (delete 'build) + (delete 'check) + (replace 'install + (lambda* (#:key outputs #:allow-other-keys) + (let ((out (assoc-ref outputs "out"))) + (mkdir-p (string-append out "/share/doc")) + (copy-file "README.adoc" + (string-append out "/share/doc/README.adoc")))))))) + (native-inputs + (list + ;; TODO: Add build-time dependencies + ;; Examples: + ;; rust (gnu packages rust) + ;; elixir (gnu packages elixir) + ;; zig (gnu packages zig) + )) + (inputs + (list + ;; TODO: Add runtime dependencies + )) + (home-page "https://github.com/hyperpolymath/a2ml-validate-action") + (synopsis "") + (description "RSR-compliant project. See README.adoc for details.") + (license (list + ;; MPL-2.0 extends MPL-2.0 + mpl2.0))) diff --git a/validate-action/hooks/install.sh b/validate-action/hooks/install.sh new file mode 100755 index 0000000..e6a8469 --- /dev/null +++ b/validate-action/hooks/install.sh @@ -0,0 +1,15 @@ +#!/usr/bin/env bash +# SPDX-License-Identifier: MPL-2.0 +# Copyright (c) Jonathan D.A. Jewell +# +# Install the version-controlled git hooks for this repo. +# Points git at the committed hooks/ directory (reproducible across clones), +# rather than copying into the un-versioned .git/hooks/. + +set -euo pipefail +cd "$(git rev-parse --show-toplevel)" + +git config core.hooksPath hooks +chmod +x hooks/pre-commit + +echo "Installed: core.hooksPath -> hooks/ (pre-commit active)" diff --git a/validate-action/hooks/pre-commit b/validate-action/hooks/pre-commit new file mode 100755 index 0000000..5f07ce8 --- /dev/null +++ b/validate-action/hooks/pre-commit @@ -0,0 +1,71 @@ +#!/bin/bash +# SPDX-License-Identifier: MPL-2.0 +# Copyright (c) Jonathan D.A. Jewell +# +# Pre-commit enforcer: licence/owner headers + architecture policies. +# Canonical, version-controlled hook. Install with: bash hooks/install.sh +# (sets core.hooksPath=hooks so this file is used directly). + +# 1. License Check +# Determine if this is a SHARED (AGPL) or OWNED (MPL) repo +REMOTE_URL=$(git remote get-url origin 2>/dev/null) +DIR_NAME=$(basename "$(pwd)") + +if [[ "$REMOTE_URL" == *"JoshuaJewell"* || "$DIR_NAME" == boj-* || "$DIR_NAME" == bofj-* ]]; then + # Shared repos: components retain their original licences; verify root LICENSE is AGPL. + if ! grep -q "Affero General Public License" LICENSE 2>/dev/null; then + echo "ERROR: Shared repository must have AGPL-3.0-or-later LICENSE file." + exit 1 + fi +else + EXPECTED_OWNER="Jonathan D.A. Jewell " + + # Check staged files for SPDX header, split by file-type per LICENCE-POLICY Rule 1: + # prose docs (.md/.adoc) -> CC-BY-SA-4.0 ; everything else (code/config) -> MPL-2.0. + # Owner-string is required on all (deliberate LLM-edit diagnostic). + STAGED_FILES=$(git diff --cached --name-only --diff-filter=ACM | grep -E '\.(zig|ex|idr|eph|py|js|ts|rs|c|h|adoc|md)$') + + for file in $STAGED_FILES; do + case "$file" in + *.md|*.adoc) FILE_LICENSE="CC-BY-SA-4.0" ;; + *) FILE_LICENSE="MPL-2.0" ;; + esac + if ! grep -q "SPDX-License-Identifier: $FILE_LICENSE" "$file"; then + echo "ERROR: File $file is missing correct SPDX-License-Identifier: $FILE_LICENSE" + exit 1 + fi + if ! grep -q "$EXPECTED_OWNER" "$file"; then + echo "ERROR: File $file is missing correct Owner: $EXPECTED_OWNER" + exit 1 + fi + done +fi + +# 2. No C Policy — all APIs/FFIs must be Zig (exceptions: proven, boj-server-cartridges) +if [[ "$DIR_NAME" != "proven" && "$DIR_NAME" != "boj-server-cartridges" ]]; then + STAGED_C_FILES=$(git diff --cached --name-only --diff-filter=ACM | grep -E '\.c$') + if [ -n "$STAGED_C_FILES" ]; then + echo "ERROR: Strict No C Policy. C files are not allowed in this repository." + echo "Offending files: $STAGED_C_FILES" + exit 1 + fi +fi + +# 3. SNIFs Policy — never raw NIFs; always Safe NIFs +STAGED_BEAM_FILES=$(git diff --cached --name-only --diff-filter=ACM | grep -E '\.(ex|exs|erl)$') +for file in $STAGED_BEAM_FILES; do + if grep -qE "erlang:load_nif|:erlang\.load_nif" "$file"; then + echo "ERROR: Raw NIFs are forbidden. Use SNIFs (Safe NIFs) from the snifs repository." + exit 1 + fi +done + +# 4. Idris 2 ABI Policy — ABIs/capability matchers should be Idris 2 (Zig allowed for the FFI bridge) +STAGED_ABI_FILES=$(git diff --cached --name-only --diff-filter=ACM | grep -i "abi") +for file in $STAGED_ABI_FILES; do + if [[ "$file" != *.idr && "$file" != *.zig && "$file" != *.adoc && "$file" != *.md ]]; then + echo "WARNING: ABI definition found in non-Idris/Zig file: $file" + fi +done + +exit 0 diff --git a/validate-action/k9iser.toml b/validate-action/k9iser.toml new file mode 100644 index 0000000..8096db6 --- /dev/null +++ b/validate-action/k9iser.toml @@ -0,0 +1,32 @@ +# SPDX-License-Identifier: MPL-2.0 +# Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) +# +# k9iser manifest for a2ml-validate-action +# A2ML GitHub Action — reusable CI action for validating A2ML files in workflows + +[project] +name = "a2ml-validate-action" +safety_tier = "hunt" + +[[source]] +path = "Justfile" +type = "justfile" +output = "generated/k9iser/justfile-recipes.k9" + +[[source]] +path = "Containerfile" +type = "containerfile" +output = "generated/k9iser/container-build.k9" + +[[source]] +path = ".github/workflows/hypatia-scan.yml" +type = "workflow" +output = "generated/k9iser/ci-security.k9" + +[[constraint]] +rule = "build.dependencies has no banned_packages" +severity = "error" + +[[constraint]] +rule = "container.base_image uses chainguard or distroless" +severity = "warn" diff --git a/validate-action/llm-warmup-dev.md b/validate-action/llm-warmup-dev.md new file mode 100644 index 0000000..3eb00e8 --- /dev/null +++ b/validate-action/llm-warmup-dev.md @@ -0,0 +1,16 @@ +# LLM Warmup — a2ml-validate-action (Developer) + +## What is a2ml-validate-action? +See README.adoc for overview. + +## Key Commands +- `just setup` — set up development environment +- `just build` — build the project +- `just test` — run tests +- `just doctor` — diagnose issues +- `just heal` — attempt auto-repair + +## Quick Context +- License: MPL-2.0 +- Part of hyperpolymath ecosystem +- See EXPLAINME.adoc for architecture diff --git a/validate-action/llm-warmup-user.md b/validate-action/llm-warmup-user.md new file mode 100644 index 0000000..24a4350 --- /dev/null +++ b/validate-action/llm-warmup-user.md @@ -0,0 +1,16 @@ +# LLM Warmup — a2ml-validate-action (User) + +## What is a2ml-validate-action? +See README.adoc for overview. + +## Key Commands +- `just setup` — set up development environment +- `just build` — build the project +- `just test` — run tests +- `just doctor` — diagnose issues +- `just heal` — attempt auto-repair + +## Quick Context +- License: MPL-2.0 +- Part of hyperpolymath ecosystem +- See EXPLAINME.adoc for architecture diff --git a/validate-action/mise.toml b/validate-action/mise.toml new file mode 100644 index 0000000..6dd983f --- /dev/null +++ b/validate-action/mise.toml @@ -0,0 +1,57 @@ +[tools] +# Language runtimes +node = "latest" +python = "latest" +rust = "latest" +go = "latest" +zig = "latest" +java = "latest" +bun = "latest" +denojs = "latest" + +# Package managers +npm = "latest" +yarn = "latest" +pnpm = "latest" +pip = "latest" +cargo = "latest" +go-task = "latest" + +# Formatting & Linting +gofmt = "latest" +black = "latest" +isort = "latest" +ruff = "latest" +prettier = "latest" +shfmt = "latest" +stylua = "latest" + +# Build tools +cmake = "latest" +make = "latest" +ninja = "latest" + +# Shell tools +git = "latest" +gnu-sed = "latest" +gnu-tar = "latest" +gnu-grep = "latest" + +# Testing +vitest = "latest" +pytest = "latest" +jest = "latest" + +[env] +# Common environment variables +NODE_ENV = "development" +PYTHONDONTWRITEBYTECODE = "1" +PYTHONUNBUFFERED = "1" + +# Task runner alias +[alias] +task = "go-task" +build = "cargo build --release || npm run build || go build" +test = "cargo test || npm test || go test ./..." +lint = "ruff check . || prettier --check . || black --check ." +fmt = "ruff format . || prettier --write . || black ." diff --git a/validate-action/selur-compose.toml b/validate-action/selur-compose.toml new file mode 100644 index 0000000..82feea7 --- /dev/null +++ b/validate-action/selur-compose.toml @@ -0,0 +1,17 @@ +# SPDX-License-Identifier: MPL-2.0 +# Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) +# +# Stapeln service definition for a2ml-validate-action +# +# Usage: +# podman-compose -f selur-compose.toml up -d +# just stack-up + +[project] +name = "a2ml-validate-action" + +[services.app] +build = { context = ".", dockerfile = "Containerfile" } +restart = "unless-stopped" +networks = ["default"] +healthcheck = { test = "exit 0", interval = "30s", timeout = "5s", retries = 3 } diff --git a/validate-action/setup.sh b/validate-action/setup.sh new file mode 100755 index 0000000..1a8c535 --- /dev/null +++ b/validate-action/setup.sh @@ -0,0 +1,64 @@ +#!/usr/bin/env bash +# SPDX-License-Identifier: MPL-2.0 +# Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) +# +# A2Ml Validate Action — Universal Setup Script +# Detects platform and shell, installs just, then hands off to Justfile. + +set -euo pipefail + +echo "═══════════════════════════════════════════════════" +echo " A2Ml Validate Action — Setup" +echo "═══════════════════════════════════════════════════" +echo "" + +# Platform detection +OS="$(uname -s)" +ARCH="$(uname -m)" +echo "Platform: $OS $ARCH" + +# Shell detection +CURRENT_SHELL="$(basename "$SHELL" 2>/dev/null || echo "unknown")" +echo "Shell: $CURRENT_SHELL" +echo "" + +# Check for just +if ! command -v just >/dev/null 2>&1; then + echo "just (command runner) is required but not installed." + echo "" + case "$OS" in + Linux) + if command -v cargo >/dev/null 2>&1; then + echo "Installing just via cargo..." + cargo install just + elif command -v brew >/dev/null 2>&1; then + echo "Installing just via Homebrew..." + brew install just + else + echo "Install just from: https://just.systems/man/en/installation.html" + exit 1 + fi + ;; + Darwin) + if command -v brew >/dev/null 2>&1; then + echo "Installing just via Homebrew..." + brew install just + else + echo "Install Homebrew first: https://brew.sh" + echo "Then: brew install just" + exit 1 + fi + ;; + *) + echo "Install just from: https://just.systems/man/en/installation.html" + exit 1 + ;; + esac + echo "" +fi + +echo "Running diagnostics..." +just doctor + +echo "" +echo "Setup complete. Run 'just help-me' for common workflows." diff --git a/validate-action/src/0.1-AI-MANIFEST.a2ml b/validate-action/src/0.1-AI-MANIFEST.a2ml new file mode 100644 index 0000000..c92e124 --- /dev/null +++ b/validate-action/src/0.1-AI-MANIFEST.a2ml @@ -0,0 +1,27 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "source-pillar" +level: 1 +parent: "../0-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Primary source code directory. Organized by role and architectural + aspect. + +canonical_locations: + core: "core/" + interface: "interface/" + bridges: "bridges/" + contracts: "contracts/" + errors: "errors/" + definitions: "definitions/" + aspects: "aspects/" + +invariants: + - "Core logic MUST reside in core/" + - "Verified seams MUST reside in interface/" + - "Safety constraints MUST reside in contracts/" + - "Failure dictionaries MUST reside in errors/" diff --git a/validate-action/src/README.adoc b/validate-action/src/README.adoc new file mode 100644 index 0000000..5529f66 --- /dev/null +++ b/validate-action/src/README.adoc @@ -0,0 +1 @@ += src Pillar diff --git a/validate-action/src/aspects/0.2-AI-MANIFEST.a2ml b/validate-action/src/aspects/0.2-AI-MANIFEST.a2ml new file mode 100644 index 0000000..3d5b209 --- /dev/null +++ b/validate-action/src/aspects/0.2-AI-MANIFEST.a2ml @@ -0,0 +1,17 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "source-unit-aspects" +level: 2 +parent: "../0.1-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Cross-cutting concerns and domain-specific aspects (Security, + Observability, Integrity). + +canonical_locations: + security: "security/" + observability: "observability/" + integrity: "integrity/" diff --git a/validate-action/src/aspects/README.adoc b/validate-action/src/aspects/README.adoc new file mode 100644 index 0000000..6456f96 --- /dev/null +++ b/validate-action/src/aspects/README.adoc @@ -0,0 +1 @@ += Aspects Pillar diff --git a/validate-action/src/aspects/integrity/0.3-AI-MANIFEST.a2ml b/validate-action/src/aspects/integrity/0.3-AI-MANIFEST.a2ml new file mode 100644 index 0000000..f114cbd --- /dev/null +++ b/validate-action/src/aspects/integrity/0.3-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "aspect-unit-integrity" +level: 3 +parent: "../0.2-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Implementation logic for the integrity aspect. diff --git a/validate-action/src/aspects/integrity/README.adoc b/validate-action/src/aspects/integrity/README.adoc new file mode 100644 index 0000000..f15d829 --- /dev/null +++ b/validate-action/src/aspects/integrity/README.adoc @@ -0,0 +1 @@ += Integrity Aspect diff --git a/validate-action/src/aspects/observability/0.3-AI-MANIFEST.a2ml b/validate-action/src/aspects/observability/0.3-AI-MANIFEST.a2ml new file mode 100644 index 0000000..e16cbdf --- /dev/null +++ b/validate-action/src/aspects/observability/0.3-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "aspect-unit-observability" +level: 3 +parent: "../0.2-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Implementation logic for the observability aspect. diff --git a/validate-action/src/aspects/observability/README.adoc b/validate-action/src/aspects/observability/README.adoc new file mode 100644 index 0000000..7852ee6 --- /dev/null +++ b/validate-action/src/aspects/observability/README.adoc @@ -0,0 +1 @@ += Observability Aspect diff --git a/validate-action/src/aspects/security/0.3-AI-MANIFEST.a2ml b/validate-action/src/aspects/security/0.3-AI-MANIFEST.a2ml new file mode 100644 index 0000000..0996536 --- /dev/null +++ b/validate-action/src/aspects/security/0.3-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "aspect-unit-security" +level: 3 +parent: "../0.2-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Implementation logic for the security aspect. diff --git a/validate-action/src/aspects/security/README.adoc b/validate-action/src/aspects/security/README.adoc new file mode 100644 index 0000000..3c3536e --- /dev/null +++ b/validate-action/src/aspects/security/README.adoc @@ -0,0 +1 @@ += Security Aspect diff --git a/validate-action/src/bridges/0.2-AI-MANIFEST.a2ml b/validate-action/src/bridges/0.2-AI-MANIFEST.a2ml new file mode 100644 index 0000000..3d3e27a --- /dev/null +++ b/validate-action/src/bridges/0.2-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "source-unit-bridges" +level: 2 +parent: "../0.1-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Integration logic for external systems (API, Database, RPC, etc.). diff --git a/validate-action/src/contracts/0.2-AI-MANIFEST.a2ml b/validate-action/src/contracts/0.2-AI-MANIFEST.a2ml new file mode 100644 index 0000000..0bd9198 --- /dev/null +++ b/validate-action/src/contracts/0.2-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "source-unit-contracts" +level: 2 +parent: "../0.1-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Contracts unit for high-rigor source code. diff --git a/validate-action/src/contracts/README.adoc b/validate-action/src/contracts/README.adoc new file mode 100644 index 0000000..9cfa209 --- /dev/null +++ b/validate-action/src/contracts/README.adoc @@ -0,0 +1 @@ += Contracts Unit diff --git a/validate-action/src/core/0.2-AI-MANIFEST.a2ml b/validate-action/src/core/0.2-AI-MANIFEST.a2ml new file mode 100644 index 0000000..22846c7 --- /dev/null +++ b/validate-action/src/core/0.2-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "source-unit-core" +level: 2 +parent: "../0.1-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Primary application logic and core domain models. diff --git a/validate-action/src/definitions/0.2-AI-MANIFEST.a2ml b/validate-action/src/definitions/0.2-AI-MANIFEST.a2ml new file mode 100644 index 0000000..e54f4da --- /dev/null +++ b/validate-action/src/definitions/0.2-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "source-unit-definitions" +level: 2 +parent: "../0.1-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Definitions unit for high-rigor source code. diff --git a/validate-action/src/definitions/README.adoc b/validate-action/src/definitions/README.adoc new file mode 100644 index 0000000..9548349 --- /dev/null +++ b/validate-action/src/definitions/README.adoc @@ -0,0 +1 @@ += Definitions Unit diff --git a/validate-action/src/errors/0.2-AI-MANIFEST.a2ml b/validate-action/src/errors/0.2-AI-MANIFEST.a2ml new file mode 100644 index 0000000..dddcc6c --- /dev/null +++ b/validate-action/src/errors/0.2-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "source-unit-errors" +level: 2 +parent: "../0.1-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Errors unit for high-rigor source code. diff --git a/validate-action/src/errors/README.adoc b/validate-action/src/errors/README.adoc new file mode 100644 index 0000000..460fc1e --- /dev/null +++ b/validate-action/src/errors/README.adoc @@ -0,0 +1 @@ += Errors Unit diff --git a/validate-action/src/interface/0.2-AI-MANIFEST.a2ml b/validate-action/src/interface/0.2-AI-MANIFEST.a2ml new file mode 100644 index 0000000..7f0f471 --- /dev/null +++ b/validate-action/src/interface/0.2-AI-MANIFEST.a2ml @@ -0,0 +1,24 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "interface-seams-unit" +level: 2 +parent: "../0.1-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Consolidated "Verified Interface Seams" unit. This directory unifies the + formal specification (ABI), the bridge implementation (FFI), and the + resulting artifacts (Generated). + +canonical_locations: + abi: "abi/" + ffi: "ffi/" + generated: "generated/" + +invariants: + - "ABI MUST be Idris2 (.idr)" + - "FFI MUST be Zig (.zig)" + - "Generated artifacts MUST be C-compatible" + - "The 'Truth' lives in abi/; the 'Implementation' lives in ffi/" diff --git a/validate-action/src/interface/README.adoc b/validate-action/src/interface/README.adoc new file mode 100644 index 0000000..8faf0aa --- /dev/null +++ b/validate-action/src/interface/README.adoc @@ -0,0 +1 @@ += interface Unit diff --git a/validate-action/src/interface/abi/0.3-AI-MANIFEST.a2ml b/validate-action/src/interface/abi/0.3-AI-MANIFEST.a2ml new file mode 100644 index 0000000..91cafa0 --- /dev/null +++ b/validate-action/src/interface/abi/0.3-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "abi-logic" +level: 3 +parent: "../0.2-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Specialised Level 3 logic for abi. diff --git a/validate-action/src/interface/abi/README.adoc b/validate-action/src/interface/abi/README.adoc new file mode 100644 index 0000000..2330304 --- /dev/null +++ b/validate-action/src/interface/abi/README.adoc @@ -0,0 +1 @@ += abi Logic diff --git a/validate-action/src/interface/ffi/0.3-AI-MANIFEST.a2ml b/validate-action/src/interface/ffi/0.3-AI-MANIFEST.a2ml new file mode 100644 index 0000000..bf456ae --- /dev/null +++ b/validate-action/src/interface/ffi/0.3-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "ffi-logic" +level: 3 +parent: "../0.2-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Specialised Level 3 logic for ffi. diff --git a/validate-action/src/interface/ffi/README.adoc b/validate-action/src/interface/ffi/README.adoc new file mode 100644 index 0000000..8fe57d3 --- /dev/null +++ b/validate-action/src/interface/ffi/README.adoc @@ -0,0 +1 @@ += ffi Logic diff --git a/validate-action/src/interface/ffi/build.zig b/validate-action/src/interface/ffi/build.zig new file mode 100644 index 0000000..4a2e049 --- /dev/null +++ b/validate-action/src/interface/ffi/build.zig @@ -0,0 +1,94 @@ +// {{PROJECT}} FFI Build Configuration +// SPDX-License-Identifier: MPL-2.0 + +const std = @import("std"); + +pub fn build(b: *std.Build) void { + const target = b.standardTargetOptions(.{}); + const optimize = b.standardOptimizeOption(.{}); + + // Shared library (.so, .dylib, .dll) + const lib = b.addSharedLibrary(.{ + .name = "{{project}}", + .root_source_file = b.path("src/main.zig"), + .target = target, + .optimize = optimize, + }); + + // Set version + lib.version = .{ .major = 0, .minor = 1, .patch = 0 }; + + // Static library (.a) + const lib_static = b.addStaticLibrary(.{ + .name = "{{project}}", + .root_source_file = b.path("src/main.zig"), + .target = target, + .optimize = optimize, + }); + + // Install artifacts + b.installArtifact(lib); + b.installArtifact(lib_static); + + // Generate header file for C compatibility + const header = b.addInstallHeader( + b.path("include/{{project}}.h"), + "{{project}}.h", + ); + b.getInstallStep().dependOn(&header.step); + + // Unit tests + const lib_tests = b.addTest(.{ + .root_source_file = b.path("src/main.zig"), + .target = target, + .optimize = optimize, + }); + + const run_lib_tests = b.addRunArtifact(lib_tests); + + const test_step = b.step("test", "Run library tests"); + test_step.dependOn(&run_lib_tests.step); + + // Integration tests + const integration_tests = b.addTest(.{ + .root_source_file = b.path("test/integration_test.zig"), + .target = target, + .optimize = optimize, + }); + + integration_tests.linkLibrary(lib); + + const run_integration_tests = b.addRunArtifact(integration_tests); + + const integration_test_step = b.step("test-integration", "Run integration tests"); + integration_test_step.dependOn(&run_integration_tests.step); + + // Documentation + const docs = b.addTest(.{ + .root_source_file = b.path("src/main.zig"), + .target = target, + .optimize = .Debug, + }); + + const docs_step = b.step("docs", "Generate documentation"); + docs_step.dependOn(&b.addInstallDirectory(.{ + .source_dir = docs.getEmittedDocs(), + .install_dir = .prefix, + .install_subdir = "docs", + }).step); + + // Benchmark (if needed) + const bench = b.addExecutable(.{ + .name = "{{project}}-bench", + .root_source_file = b.path("bench/bench.zig"), + .target = target, + .optimize = .ReleaseFast, + }); + + bench.linkLibrary(lib); + + const run_bench = b.addRunArtifact(bench); + + const bench_step = b.step("bench", "Run benchmarks"); + bench_step.dependOn(&run_bench.step); +} diff --git a/validate-action/src/interface/ffi/src/0.4-AI-MANIFEST.a2ml b/validate-action/src/interface/ffi/src/0.4-AI-MANIFEST.a2ml new file mode 100644 index 0000000..5b5f1b1 --- /dev/null +++ b/validate-action/src/interface/ffi/src/0.4-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "src-unit" +level: 4 +parent: "../0.3-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Src logic at level 4. diff --git a/validate-action/src/interface/ffi/src/README.adoc b/validate-action/src/interface/ffi/src/README.adoc new file mode 100644 index 0000000..a5c0c6d --- /dev/null +++ b/validate-action/src/interface/ffi/src/README.adoc @@ -0,0 +1 @@ += Src Logic diff --git a/validate-action/src/interface/ffi/src/main.zig b/validate-action/src/interface/ffi/src/main.zig new file mode 100644 index 0000000..6b233bc --- /dev/null +++ b/validate-action/src/interface/ffi/src/main.zig @@ -0,0 +1,274 @@ +// {{PROJECT}} FFI Implementation +// +// This module implements the C-compatible FFI declared in src/abi/Foreign.idr +// All types and layouts must match the Idris2 ABI definitions. +// +// SPDX-License-Identifier: MPL-2.0 + +const std = @import("std"); + +// Version information (keep in sync with project) +const VERSION = "0.1.0"; +const BUILD_INFO = "{{PROJECT}} built with Zig " ++ @import("builtin").zig_version_string; + +/// Thread-local error storage +threadlocal var last_error: ?[]const u8 = null; + +/// Set the last error message +fn setError(msg: []const u8) void { + last_error = msg; +} + +/// Clear the last error +fn clearError() void { + last_error = null; +} + +//============================================================================== +// Core Types (must match src/abi/Types.idr) +//============================================================================== + +/// Result codes (must match Idris2 Result type) +pub const Result = enum(c_int) { + ok = 0, + @"error" = 1, + invalid_param = 2, + out_of_memory = 3, + null_pointer = 4, +}; + +/// Library handle (opaque to prevent direct access) +pub const Handle = opaque { + // Internal state hidden from C + allocator: std.mem.Allocator, + initialized: bool, + // Add your fields here +}; + +//============================================================================== +// Library Lifecycle +//============================================================================== + +/// Initialize the library +/// Returns a handle, or null on failure +export fn {{project}}_init() ?*Handle { + const allocator = std.heap.c_allocator; + + const handle = allocator.create(Handle) catch { + setError("Failed to allocate handle"); + return null; + }; + + // Initialize handle + handle.* = .{ + .allocator = allocator, + .initialized = true, + }; + + clearError(); + return handle; +} + +/// Free the library handle +export fn {{project}}_free(handle: ?*Handle) void { + const h = handle orelse return; + const allocator = h.allocator; + + // Clean up resources + h.initialized = false; + + allocator.destroy(h); + clearError(); +} + +//============================================================================== +// Core Operations +//============================================================================== + +/// Process data (example operation) +export fn {{project}}_process(handle: ?*Handle, input: u32) Result { + const h = handle orelse { + setError("Null handle"); + return .null_pointer; + }; + + if (!h.initialized) { + setError("Handle not initialized"); + return .@"error"; + } + + // Example processing logic + _ = input; + + clearError(); + return .ok; +} + +//============================================================================== +// String Operations +//============================================================================== + +/// Get a string result (example) +/// Caller must free the returned string +export fn {{project}}_get_string(handle: ?*Handle) ?[*:0]const u8 { + const h = handle orelse { + setError("Null handle"); + return null; + }; + + if (!h.initialized) { + setError("Handle not initialized"); + return null; + } + + // Example: allocate and return a string + const result = h.allocator.dupeZ(u8, "Example result") catch { + setError("Failed to allocate string"); + return null; + }; + + clearError(); + return result.ptr; +} + +/// Free a string allocated by the library +export fn {{project}}_free_string(str: ?[*:0]const u8) void { + const s = str orelse return; + const allocator = std.heap.c_allocator; + + const slice = std.mem.span(s); + allocator.free(slice); +} + +//============================================================================== +// Array/Buffer Operations +//============================================================================== + +/// Process an array of data +export fn {{project}}_process_array( + handle: ?*Handle, + buffer: ?[*]const u8, + len: u32, +) Result { + const h = handle orelse { + setError("Null handle"); + return .null_pointer; + }; + + const buf = buffer orelse { + setError("Null buffer"); + return .null_pointer; + }; + + if (!h.initialized) { + setError("Handle not initialized"); + return .@"error"; + } + + // Access the buffer + const data = buf[0..len]; + _ = data; + + // Process data here + + clearError(); + return .ok; +} + +//============================================================================== +// Error Handling +//============================================================================== + +/// Get the last error message +/// Returns null if no error +export fn {{project}}_last_error() ?[*:0]const u8 { + const err = last_error orelse return null; + + // Return C string (static storage, no need to free) + const allocator = std.heap.c_allocator; + const c_str = allocator.dupeZ(u8, err) catch return null; + return c_str.ptr; +} + +//============================================================================== +// Version Information +//============================================================================== + +/// Get the library version +export fn {{project}}_version() [*:0]const u8 { + return VERSION.ptr; +} + +/// Get build information +export fn {{project}}_build_info() [*:0]const u8 { + return BUILD_INFO.ptr; +} + +//============================================================================== +// Callback Support +//============================================================================== + +/// Callback function type (C ABI) +pub const Callback = *const fn (u64, u32) callconv(.C) u32; + +/// Register a callback +export fn {{project}}_register_callback( + handle: ?*Handle, + callback: ?Callback, +) Result { + const h = handle orelse { + setError("Null handle"); + return .null_pointer; + }; + + const cb = callback orelse { + setError("Null callback"); + return .null_pointer; + }; + + if (!h.initialized) { + setError("Handle not initialized"); + return .@"error"; + } + + // Store callback for later use + _ = cb; + + clearError(); + return .ok; +} + +//============================================================================== +// Utility Functions +//============================================================================== + +/// Check if handle is initialized +export fn {{project}}_is_initialized(handle: ?*Handle) u32 { + const h = handle orelse return 0; + return if (h.initialized) 1 else 0; +} + +//============================================================================== +// Tests +//============================================================================== + +test "lifecycle" { + const handle = {{project}}_init() orelse return error.InitFailed; + defer {{project}}_free(handle); + + try std.testing.expect({{project}}_is_initialized(handle) == 1); +} + +test "error handling" { + const result = {{project}}_process(null, 0); + try std.testing.expectEqual(Result.null_pointer, result); + + const err = {{project}}_last_error(); + try std.testing.expect(err != null); +} + +test "version" { + const ver = {{project}}_version(); + const ver_str = std.mem.span(ver); + try std.testing.expectEqualStrings(VERSION, ver_str); +} diff --git a/validate-action/src/interface/ffi/test/0.4-AI-MANIFEST.a2ml b/validate-action/src/interface/ffi/test/0.4-AI-MANIFEST.a2ml new file mode 100644 index 0000000..e02427f --- /dev/null +++ b/validate-action/src/interface/ffi/test/0.4-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "test-unit" +level: 4 +parent: "../0.3-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Test logic at level 4. diff --git a/validate-action/src/interface/ffi/test/README.adoc b/validate-action/src/interface/ffi/test/README.adoc new file mode 100644 index 0000000..f6f38bf --- /dev/null +++ b/validate-action/src/interface/ffi/test/README.adoc @@ -0,0 +1 @@ += Test Logic diff --git a/validate-action/src/interface/ffi/test/integration_test.zig b/validate-action/src/interface/ffi/test/integration_test.zig new file mode 100644 index 0000000..0341994 --- /dev/null +++ b/validate-action/src/interface/ffi/test/integration_test.zig @@ -0,0 +1,182 @@ +// {{PROJECT}} Integration Tests +// SPDX-License-Identifier: MPL-2.0 +// +// These tests verify that the Zig FFI correctly implements the Idris2 ABI + +const std = @import("std"); +const testing = std.testing; + +// Import FFI functions +extern fn {{project}}_init() ?*opaque {}; +extern fn {{project}}_free(?*opaque {}) void; +extern fn {{project}}_process(?*opaque {}, u32) c_int; +extern fn {{project}}_get_string(?*opaque {}) ?[*:0]const u8; +extern fn {{project}}_free_string(?[*:0]const u8) void; +extern fn {{project}}_last_error() ?[*:0]const u8; +extern fn {{project}}_version() [*:0]const u8; +extern fn {{project}}_is_initialized(?*opaque {}) u32; + +//============================================================================== +// Lifecycle Tests +//============================================================================== + +test "create and destroy handle" { + const handle = {{project}}_init() orelse return error.InitFailed; + defer {{project}}_free(handle); + + try testing.expect(handle != null); +} + +test "handle is initialized" { + const handle = {{project}}_init() orelse return error.InitFailed; + defer {{project}}_free(handle); + + const initialized = {{project}}_is_initialized(handle); + try testing.expectEqual(@as(u32, 1), initialized); +} + +test "null handle is not initialized" { + const initialized = {{project}}_is_initialized(null); + try testing.expectEqual(@as(u32, 0), initialized); +} + +//============================================================================== +// Operation Tests +//============================================================================== + +test "process with valid handle" { + const handle = {{project}}_init() orelse return error.InitFailed; + defer {{project}}_free(handle); + + const result = {{project}}_process(handle, 42); + try testing.expectEqual(@as(c_int, 0), result); // 0 = ok +} + +test "process with null handle returns error" { + const result = {{project}}_process(null, 42); + try testing.expectEqual(@as(c_int, 4), result); // 4 = null_pointer +} + +//============================================================================== +// String Tests +//============================================================================== + +test "get string result" { + const handle = {{project}}_init() orelse return error.InitFailed; + defer {{project}}_free(handle); + + const str = {{project}}_get_string(handle); + defer if (str) |s| {{project}}_free_string(s); + + try testing.expect(str != null); +} + +test "get string with null handle" { + const str = {{project}}_get_string(null); + try testing.expect(str == null); +} + +//============================================================================== +// Error Handling Tests +//============================================================================== + +test "last error after null handle operation" { + _ = {{project}}_process(null, 0); + + const err = {{project}}_last_error(); + try testing.expect(err != null); + + if (err) |e| { + const err_str = std.mem.span(e); + try testing.expect(err_str.len > 0); + } +} + +test "no error after successful operation" { + const handle = {{project}}_init() orelse return error.InitFailed; + defer {{project}}_free(handle); + + _ = {{project}}_process(handle, 0); + + // Error should be cleared after successful operation + // (This depends on implementation) +} + +//============================================================================== +// Version Tests +//============================================================================== + +test "version string is not empty" { + const ver = {{project}}_version(); + const ver_str = std.mem.span(ver); + + try testing.expect(ver_str.len > 0); +} + +test "version string is semantic version format" { + const ver = {{project}}_version(); + const ver_str = std.mem.span(ver); + + // Should be in format X.Y.Z + try testing.expect(std.mem.count(u8, ver_str, ".") >= 1); +} + +//============================================================================== +// Memory Safety Tests +//============================================================================== + +test "multiple handles are independent" { + const h1 = {{project}}_init() orelse return error.InitFailed; + defer {{project}}_free(h1); + + const h2 = {{project}}_init() orelse return error.InitFailed; + defer {{project}}_free(h2); + + try testing.expect(h1 != h2); + + // Operations on h1 should not affect h2 + _ = {{project}}_process(h1, 1); + _ = {{project}}_process(h2, 2); +} + +test "double free is safe" { + const handle = {{project}}_init() orelse return error.InitFailed; + + {{project}}_free(handle); + {{project}}_free(handle); // Should not crash +} + +test "free null is safe" { + {{project}}_free(null); // Should not crash +} + +//============================================================================== +// Thread Safety Tests (if applicable) +//============================================================================== + +test "concurrent operations" { + const handle = {{project}}_init() orelse return error.InitFailed; + defer {{project}}_free(handle); + + const ThreadContext = struct { + h: *opaque {}, + id: u32, + }; + + const thread_fn = struct { + fn run(ctx: ThreadContext) void { + _ = {{project}}_process(ctx.h, ctx.id); + } + }.run; + + var threads: [4]std.Thread = undefined; + for (&threads, 0..) |*thread, i| { + thread.* = try std.Thread.spawn(.{}, thread_fn, .{ + ThreadContext{ .h = handle, .id = @intCast(i) }, + }); + } + + for (threads) |thread| { + thread.join(); + } +} diff --git a/validate-action/src/interface/generated/0.3-AI-MANIFEST.a2ml b/validate-action/src/interface/generated/0.3-AI-MANIFEST.a2ml new file mode 100644 index 0000000..0088b80 --- /dev/null +++ b/validate-action/src/interface/generated/0.3-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "generated-logic" +level: 3 +parent: "../0.2-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Specialised Level 3 logic for generated. diff --git a/validate-action/src/interface/generated/README.adoc b/validate-action/src/interface/generated/README.adoc new file mode 100644 index 0000000..3691b06 --- /dev/null +++ b/validate-action/src/interface/generated/README.adoc @@ -0,0 +1 @@ += generated Logic diff --git a/validate-action/src/interface/generated/abi/.gitkeep b/validate-action/src/interface/generated/abi/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/validate-action/src/interface/generated/abi/0.4-AI-MANIFEST.a2ml b/validate-action/src/interface/generated/abi/0.4-AI-MANIFEST.a2ml new file mode 100644 index 0000000..4eeb580 --- /dev/null +++ b/validate-action/src/interface/generated/abi/0.4-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "abi-unit" +level: 4 +parent: "../0.3-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Abi logic at level 4. diff --git a/validate-action/src/interface/generated/abi/README.adoc b/validate-action/src/interface/generated/abi/README.adoc new file mode 100644 index 0000000..aff61a9 --- /dev/null +++ b/validate-action/src/interface/generated/abi/README.adoc @@ -0,0 +1 @@ += Abi Logic diff --git a/validate-action/stapeln.toml b/validate-action/stapeln.toml new file mode 100644 index 0000000..81c8019 --- /dev/null +++ b/validate-action/stapeln.toml @@ -0,0 +1,87 @@ +# SPDX-License-Identifier: MPL-2.0 +# stapeln.toml — Layer-based container build for a2ml-validate-action +# +# stapeln builds containers as composable layers (German: "to stack"). +# Each layer is independently cacheable, verifiable, and signable. + +[metadata] +name = "a2ml-validate-action" +version = "0.1.0" +description = "a2ml-validate-action container service" +author = "Jonathan D.A. Jewell " +license = "MPL-2.0" +registry = "ghcr.io/hyperpolymath" + +[build] +containerfile = "Containerfile" +context = "." +runtime = "podman" + +# ── Layer Definitions ────────────────────────────────────────── + +[layers.base] +description = "Chainguard Wolfi minimal base" +from = "cgr.dev/chainguard/wolfi-base:latest" +cache = true +verify = true + +[layers.toolchain] +description = "Build tools" +extends = "base" +packages = [] +cache = true + +[layers.build] +description = "a2ml-validate-action build" +extends = "toolchain" +commands = [] + +[layers.runtime] +description = "Minimal runtime" +from = "cgr.dev/chainguard/wolfi-base:latest" +packages = ["ca-certificates", "curl"] +copy-from = [ + { layer = "build", src = "/app/", dst = "/app/" }, +] +entrypoint = ["/app/a2ml-validate-action"] +user = "nonroot" + +# ── Security ─────────────────────────────────────────────────── + +[security] +non-root = true +read-only-root = false +no-new-privileges = true +cap-drop = ["ALL"] +seccomp-profile = "default" + +[security.signing] +algorithm = "ML-DSA-87" +provider = "cerro-torre" + +[security.sbom] +format = "spdx-json" +output = "sbom.spdx.json" +include-deps = true + +# ── Verification ─────────────────────────────────────────────── + +[verify] +vordr = true +svalinn = true +scan-on-build = true +fail-on = ["critical", "high"] + +# ── Targets ──────────────────────────────────────────────────── + +[targets.development] +layers = ["base", "chainguard-toolchain", "build"] +env = { LOG_LEVEL = "debug" } + +[targets.production] +layers = ["runtime"] +env = { LOG_LEVEL = "info" } + +[targets.test] +layers = ["base", "chainguard-toolchain", "build"] +env = { LOG_LEVEL = "debug" } diff --git a/validate-action/tests/fuzz/placeholder.txt b/validate-action/tests/fuzz/placeholder.txt new file mode 100644 index 0000000..8621280 --- /dev/null +++ b/validate-action/tests/fuzz/placeholder.txt @@ -0,0 +1 @@ +Scorecard requirement placeholder diff --git a/validate-action/validate-a2ml.sh b/validate-action/validate-a2ml.sh new file mode 100755 index 0000000..b053676 --- /dev/null +++ b/validate-action/validate-a2ml.sh @@ -0,0 +1,350 @@ +#!/usr/bin/env bash +# SPDX-License-Identifier: MPL-2.0 +# Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) +# +# validate-a2ml.sh — A2ML manifest validation script +# +# Scans for .a2ml files and validates: +# 1. Required fields: agent-id or pedigree name, version +# 2. SPDX-License-Identifier header presence +# 3. Attestation block structure (if present) +# 4. Section heading syntax ([section] or ## section) +# +# Environment variables: +# INPUT_PATH — Directory to scan (default: .) +# INPUT_STRICT — Promote warnings to errors (default: false) +# +# Exit codes: +# 0 — All files valid (or only warnings in non-strict mode) +# 1 — Validation errors found + +set -euo pipefail + +# --------------------------------------------------------------------------- +# Configuration +# --------------------------------------------------------------------------- + +SCAN_PATH="${INPUT_PATH:-.}" +STRICT="${INPUT_STRICT:-false}" +PATHS_IGNORE_RAW="${INPUT_PATHS_IGNORE:-}" +GITHUB_OUTPUT_FILE="${GITHUB_OUTPUT:-/dev/null}" + +# Parse paths-ignore: newline-separated fragments, blank lines and # comments +# stripped. Each fragment is a substring match against the file path. Pattern +# adopted from hyperpolymath/hypatia#243 — content-pattern validators must +# distinguish a target from a vendored / fixture file that legitimately +# contains the very pattern being checked. +PATHS_IGNORE=() +while IFS= read -r _frag; do + # Strip leading and trailing whitespace (canonical bash idiom). + _frag="${_frag#"${_frag%%[![:space:]]*}"}" + _frag="${_frag%"${_frag##*[![:space:]]}"}" + [[ -z "$_frag" || "$_frag" == \#* ]] && continue + PATHS_IGNORE+=("$_frag") +done <<< "$PATHS_IGNORE_RAW" + +# Returns 0 if path should be skipped (matches any ignore fragment) +path_ignored() { + local p="$1" frag + for frag in "${PATHS_IGNORE[@]}"; do + [[ "$p" == *"$frag"* ]] && return 0 + done + return 1 +} + +# Counters +FILES_SCANNED=0 +ERRORS=0 +WARNINGS=0 + +# --------------------------------------------------------------------------- +# Helper: emit GitHub annotation +# --------------------------------------------------------------------------- +# Usage: annotate +# level: error | warning | notice +annotate() { + local level="$1" file="$2" line="$3" message="$4" + echo "::${level} file=${file},line=${line}::${message}" +} + +# --------------------------------------------------------------------------- +# Helper: report issue (respects strict mode) +# --------------------------------------------------------------------------- +# Usage: report_issue +# severity: error | warning +report_issue() { + local severity="$1" file="$2" line="$3" message="$4" + + if [[ "$severity" == "warning" && "$STRICT" == "true" ]]; then + severity="error" + fi + + annotate "$severity" "$file" "$line" "$message" + + if [[ "$severity" == "error" ]]; then + ERRORS=$((ERRORS + 1)) + else + WARNINGS=$((WARNINGS + 1)) + fi +} + +# --------------------------------------------------------------------------- +# Validator: check a single .a2ml file +# --------------------------------------------------------------------------- +validate_a2ml() { + local file="$1" + FILES_SCANNED=$((FILES_SCANNED + 1)) + + # --- Check 1: SPDX header --- + # The SPDX-License-Identifier should appear in the first 10 lines + local has_spdx=false + local line_num=0 + while IFS= read -r line; do + line_num=$((line_num + 1)) + if [[ $line_num -gt 10 ]]; then + break + fi + if [[ "$line" == *"SPDX-License-Identifier"* ]]; then + has_spdx=true + break + fi + done < "$file" + + if [[ "$has_spdx" == "false" ]]; then + report_issue "warning" "$file" 1 \ + "Missing SPDX-License-Identifier in first 10 lines" + fi + + # --- Check 2: Required identity fields --- + # A2ML files must contain either: + # - agent-id = "..." or agent_id = "..." + # - pedigree block with name field + # - name = "..." at top level (for AI manifests) + # - project = "..." (for STATE.a2ml) + local has_identity=false + local has_version=false + line_num=0 + + while IFS= read -r line; do + line_num=$((line_num + 1)) + + # Check for identity fields (various A2ML patterns) + # TOML/kv form: `name = "..."`, `project = "..."`, `agent-id = "..."` + if [[ "$line" =~ ^[[:space:]]*(agent[-_]id|name|project)[[:space:]]*= ]]; then + has_identity=true + fi + # S-expression form: `(name "...")`, `(project "...")`, + # `(agent-id "...")`. Some A2ML dialects (audit registries, + # classification stores) use Lisp-style s-expressions for the + # metadata block instead of TOML. Identity carries the same + # semantics; only the syntax differs. Match at any indent so it + # also picks up entries nested under `(metadata ...)`. + if [[ "$line" =~ ^[[:space:]]*\([[:space:]]*(agent[-_]id|name|project)[[:space:]]+\" ]]; then + has_identity=true + fi + # Colon / brace-block form: `name: "..."`, `id: "..."`, `project: "..."`. + # YAML-ish and brace-block A2ML dialects (e.g. `Trust { name: "..." }`, + # `id: "tsdm-standard"`) carry the same identity semantics; only the + # delimiter (`:` vs `=`) differs. `id` is the brace-block spelling of an + # identity key. + if [[ "$line" =~ ^[[:space:]]*(agent[-_]id|name|project|id)[[:space:]]*: ]]; then + has_identity=true + fi + # Check for version field — TOML form + if [[ "$line" =~ ^[[:space:]]*(version|schema_version)[[:space:]]*= ]]; then + has_version=true + fi + # Version field — s-expression form + if [[ "$line" =~ ^[[:space:]]*\([[:space:]]*(version|schema_version)[[:space:]]+\" ]]; then + has_version=true + fi + # Version field — colon / brace-block form + if [[ "$line" =~ ^[[:space:]]*(version|schema_version)[[:space:]]*: ]]; then + has_version=true + fi + done < "$file" + + # AI manifest files (0-AI-MANIFEST.a2ml, 0.1-AI-MANIFEST.a2ml, etc.) + # use markdown-style headers and free text, so identity check is relaxed + local basename + basename="$(basename "$file")" + local is_manifest=false + if [[ "$basename" == *"AI-MANIFEST"* ]]; then + is_manifest=true + fi + # Canonical typed manifests under .machine_readable/descriptiles/ — identity comes + # from the enclosing directory + filename, not an in-file field. Sibling + # files in the same directory (ECOSYSTEM.a2ml, STATE.a2ml) DO carry their + # own $name/project and continue to be validated normally. + case "$basename" in + AGENTIC.a2ml|META.a2ml|NEUROSYM.a2ml|PLAYBOOK.a2ml|AI.a2ml) + # AI.a2ml = free-text "AI Assistant Instructions" manifest, the same + # doc type as 0-AI-MANIFEST.a2ml but with the bare name; identity is + # carried by the enclosing repo/plugin dir, not an in-file field. + is_manifest=true + ;; + # Dockerfile-style top-level typed manifests (Intentfile, Trustfile, …) + # use markdown-flavoured A2ML; identity is carried by the parent repo. + *file.a2ml) + is_manifest=true + ;; + esac + + # Contractile-shape A2ML files use `@directive:` syntax instead of + # TOML `key = value`. Trustfile.a2ml, Intentfile.a2ml, Mustfile.a2ml, + # Adjustfile.a2ml etc. are policy / trust / intent / abstract files + # whose identity is implicit in their @-prefixed directives + # (`@trust-level`, `@intent`, ...) rather than a TOML name/version + # pair. Treating them as manifest-shape produces 100% false positives — + # they're a different A2ML doc type. Detected by the presence of any + # contractile directive in the file body. + local is_contractile_shape=false + if grep -qE '^@(abstract|trust-level|trust-boundary|trust-actions|trust-deny|intent|must|adjust|end)([[:space:]]*:|$)' "$file"; then + is_contractile_shape=true + fi + + # Canonical structured A2ML tree. Everything under a `.machine_readable/` + # directory is a typed agent-readable doc (CLADE, ANCHOR, STATE, + # ECOSYSTEM, bot_directives/{debt,coverage,methodology}, ai/AI, + # policies/*, integrations/*, …). Per the RSR convention these carry + # identity structurally — owning repo + path + filename — not via an + # in-file `name`/`agent-id`. This generalises the `.machine_readable/descriptiles/` + # rationale above to the whole tree: rsr-template-repo itself ships these + # files without an in-file identity key, so requiring one produces + # estate-wide false positives on every repo built from the canonical + # template. Files outside `.machine_readable/` are still validated. + local is_structural_identity=false + if [[ "$file" == *"/.machine_readable/"* || "$file" == "./.machine_readable/"* || "$file" == ".machine_readable/"* ]]; then + is_structural_identity=true + fi + + if [[ "$has_identity" == "false" && "$is_manifest" == "false" && "$is_contractile_shape" == "false" && "$is_structural_identity" == "false" ]]; then + report_issue "error" "$file" 1 \ + "Missing required identity field (agent-id, name, or project)" + fi + + if [[ "$has_version" == "false" && "$is_manifest" == "false" && "$is_contractile_shape" == "false" && "$is_structural_identity" == "false" ]]; then + report_issue "warning" "$file" 1 \ + "Missing version or schema_version field" + fi + + # --- Check 3: Attestation block structure --- + # If file contains [attestation] or ## ATTESTATION, validate it has + # required sub-fields: proof or signature + local in_attestation=false + local attestation_line=0 + local attestation_has_content=false + line_num=0 + + while IFS= read -r line; do + line_num=$((line_num + 1)) + + # Detect attestation section start + if [[ "$line" =~ ^\[attestation\] ]] || [[ "$line" =~ ^##[[:space:]]+[Aa]ttestation ]] || [[ "$line" =~ ^##[[:space:]]+ATTESTATION ]]; then + in_attestation=true + attestation_line=$line_num + continue + fi + + # Detect next section (ends attestation block) + if [[ "$in_attestation" == "true" ]]; then + if [[ "$line" =~ ^\[.+\] ]] || [[ "$line" =~ ^##[[:space:]] ]]; then + in_attestation=false + continue + fi + # Check for content in attestation block + if [[ "$line" =~ (proof|signature|verified|hash)[[:space:]]*= ]]; then + attestation_has_content=true + fi + fi + done < "$file" + + if [[ $attestation_line -gt 0 && "$attestation_has_content" == "false" ]]; then + report_issue "warning" "$file" "$attestation_line" \ + "Attestation block found but missing proof/signature/hash fields" + fi + + # --- Check 4: Section heading syntax --- + # Validate that [section] headings are well-formed (no unclosed brackets) + line_num=0 + while IFS= read -r line; do + line_num=$((line_num + 1)) + # Lines starting with [ should have a matching ] + if [[ "$line" =~ ^\[ && ! "$line" =~ ^\[.+\] ]]; then + # Exclude markdown-style links and multi-line values + if [[ ! "$line" =~ ^\[.*\]\( && ! "$line" =~ ^\[TODO && ! "$line" =~ ^\[YOUR ]]; then + report_issue "warning" "$file" "$line_num" \ + "Possibly malformed section heading: unclosed bracket" + fi + fi + done < "$file" +} + +# --------------------------------------------------------------------------- +# Main: discover and validate .a2ml files +# --------------------------------------------------------------------------- + +echo "::group::A2ML Manifest Validation" +echo "Scanning ${SCAN_PATH} for .a2ml files..." +echo "" + +# Find all .a2ml files, excluding .git directory +mapfile -t a2ml_candidates < <(find "$SCAN_PATH" -name '*.a2ml' -not -path '*/.git/*' -type f | sort) + +# Apply paths-ignore filter +a2ml_files=() +SKIPPED=0 +for _f in "${a2ml_candidates[@]}"; do + if path_ignored "$_f"; then + SKIPPED=$((SKIPPED + 1)) + continue + fi + a2ml_files+=("$_f") +done + +if [[ $SKIPPED -gt 0 ]]; then + echo "::notice::Skipped ${SKIPPED} file(s) matching paths-ignore" +fi + +if [[ ${#a2ml_files[@]} -eq 0 ]]; then + echo "::notice::No .a2ml files found in ${SCAN_PATH}" + echo "files_scanned=0" >> "$GITHUB_OUTPUT_FILE" 2>/dev/null || true + echo "errors=0" >> "$GITHUB_OUTPUT_FILE" 2>/dev/null || true + echo "warnings=0" >> "$GITHUB_OUTPUT_FILE" 2>/dev/null || true + echo "::endgroup::" + exit 0 +fi + +echo "Found ${#a2ml_files[@]} .a2ml file(s)" +echo "" + +for file in "${a2ml_files[@]}"; do + echo " Validating: ${file}" + validate_a2ml "$file" +done + +echo "" +echo "────────────────────────────────────────" +echo "Files scanned: ${FILES_SCANNED}" +echo "Errors: ${ERRORS}" +echo "Warnings: ${WARNINGS}" +echo "Strict mode: ${STRICT}" +echo "────────────────────────────────────────" + +# Write outputs for GitHub Actions +{ + echo "files_scanned=${FILES_SCANNED}" + echo "errors=${ERRORS}" + echo "warnings=${WARNINGS}" +} >> "$GITHUB_OUTPUT_FILE" 2>/dev/null || true + +echo "::endgroup::" + +# Exit with failure if errors were found +if [[ $ERRORS -gt 0 ]]; then + echo "::error::A2ML validation failed with ${ERRORS} error(s)" + exit 1 +fi + +echo "A2ML validation passed." +exit 0 diff --git a/validate-action/verification/0.1-AI-MANIFEST.a2ml b/validate-action/verification/0.1-AI-MANIFEST.a2ml new file mode 100644 index 0000000..3435bdb --- /dev/null +++ b/validate-action/verification/0.1-AI-MANIFEST.a2ml @@ -0,0 +1,27 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "verification-pillar" +level: 1 +parent: "../0-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Primary verification pillar. Contains evidence for correctness, + performance, formal proofs, randomized testing, and aerospace-grade + high-assurance metrics (MC/DC coverage, traceability, safety cases). + +canonical_locations: + tests: "tests/" + benchmarks: "benchmarks/" + proofs: "proofs/" + fuzzing: "fuzzing/" + simulations: "simulations/" + coverage: "coverage/" + traceability: "traceability/" + safety_case: "safety_case/" + +invariants: + - "Evidence MUST be reproducible and documented" + - "High-assurance deployments MUST satisfy traceability and safety_case requirements" diff --git a/validate-action/verification/README.adoc b/validate-action/verification/README.adoc new file mode 100644 index 0000000..f07e7f3 --- /dev/null +++ b/validate-action/verification/README.adoc @@ -0,0 +1 @@ += Verification Pillar diff --git a/validate-action/verification/benchmarks/0.2-AI-MANIFEST.a2ml b/validate-action/verification/benchmarks/0.2-AI-MANIFEST.a2ml new file mode 100644 index 0000000..d922a4c --- /dev/null +++ b/validate-action/verification/benchmarks/0.2-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "benches-pillar" +level: 2 +parent: "../0.1-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Benches pillar. diff --git a/validate-action/verification/benchmarks/README.adoc b/validate-action/verification/benchmarks/README.adoc new file mode 100644 index 0000000..5db7648 --- /dev/null +++ b/validate-action/verification/benchmarks/README.adoc @@ -0,0 +1 @@ += Benchmarks Unit diff --git a/validate-action/verification/coverage/0.2-AI-MANIFEST.a2ml b/validate-action/verification/coverage/0.2-AI-MANIFEST.a2ml new file mode 100644 index 0000000..32b819e --- /dev/null +++ b/validate-action/verification/coverage/0.2-AI-MANIFEST.a2ml @@ -0,0 +1,12 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "verification-unit-coverage" +level: 2 +parent: "../0.1-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + High-assurance verification unit for coverage. + Critical for safety-of-life and aerospace-grade deployment standards. diff --git a/validate-action/verification/coverage/README.adoc b/validate-action/verification/coverage/README.adoc new file mode 100644 index 0000000..2566956 --- /dev/null +++ b/validate-action/verification/coverage/README.adoc @@ -0,0 +1 @@ += Coverage Unit diff --git a/validate-action/verification/fuzzing/0.2-AI-MANIFEST.a2ml b/validate-action/verification/fuzzing/0.2-AI-MANIFEST.a2ml new file mode 100644 index 0000000..5178d40 --- /dev/null +++ b/validate-action/verification/fuzzing/0.2-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "fuzzing-unit" +level: 2 +parent: "../0.1-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Fuzzing unit for high-rigor verification. diff --git a/validate-action/verification/fuzzing/README.adoc b/validate-action/verification/fuzzing/README.adoc new file mode 100644 index 0000000..edeb179 --- /dev/null +++ b/validate-action/verification/fuzzing/README.adoc @@ -0,0 +1 @@ += Fuzzing Unit diff --git a/validate-action/verification/proofs/0.2-AI-MANIFEST.a2ml b/validate-action/verification/proofs/0.2-AI-MANIFEST.a2ml new file mode 100644 index 0000000..135e181 --- /dev/null +++ b/validate-action/verification/proofs/0.2-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "verification-unit-proofs" +level: 2 +parent: "../0.1-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Sub-unit focusing on proofs. diff --git a/validate-action/verification/proofs/README.adoc b/validate-action/verification/proofs/README.adoc new file mode 100644 index 0000000..1ae324d --- /dev/null +++ b/validate-action/verification/proofs/README.adoc @@ -0,0 +1 @@ += Proofs Unit diff --git a/validate-action/verification/safety_case/0.2-AI-MANIFEST.a2ml b/validate-action/verification/safety_case/0.2-AI-MANIFEST.a2ml new file mode 100644 index 0000000..d461915 --- /dev/null +++ b/validate-action/verification/safety_case/0.2-AI-MANIFEST.a2ml @@ -0,0 +1,12 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "verification-unit-safety_case" +level: 2 +parent: "../0.1-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + High-assurance verification unit for safety case. + Critical for safety-of-life and aerospace-grade deployment standards. diff --git a/validate-action/verification/safety_case/README.adoc b/validate-action/verification/safety_case/README.adoc new file mode 100644 index 0000000..47c8e36 --- /dev/null +++ b/validate-action/verification/safety_case/README.adoc @@ -0,0 +1 @@ += Safety case Unit diff --git a/validate-action/verification/simulations/0.2-AI-MANIFEST.a2ml b/validate-action/verification/simulations/0.2-AI-MANIFEST.a2ml new file mode 100644 index 0000000..f890eca --- /dev/null +++ b/validate-action/verification/simulations/0.2-AI-MANIFEST.a2ml @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "simulations-unit" +level: 2 +parent: "../0.1-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + Simulations unit for high-rigor verification. diff --git a/validate-action/verification/simulations/README.adoc b/validate-action/verification/simulations/README.adoc new file mode 100644 index 0000000..8e1b13a --- /dev/null +++ b/validate-action/verification/simulations/README.adoc @@ -0,0 +1 @@ += Simulations Unit diff --git a/validate-action/verification/tests/0.2-AI-MANIFEST.a2ml b/validate-action/verification/tests/0.2-AI-MANIFEST.a2ml new file mode 100644 index 0000000..0008fcf --- /dev/null +++ b/validate-action/verification/tests/0.2-AI-MANIFEST.a2ml @@ -0,0 +1 @@ +# AI Manifest - Level 1: tests diff --git a/validate-action/verification/tests/README.adoc b/validate-action/verification/tests/README.adoc new file mode 100644 index 0000000..344bf86 --- /dev/null +++ b/validate-action/verification/tests/README.adoc @@ -0,0 +1 @@ += Tests Unit diff --git a/validate-action/verification/traceability/0.2-AI-MANIFEST.a2ml b/validate-action/verification/traceability/0.2-AI-MANIFEST.a2ml new file mode 100644 index 0000000..9667766 --- /dev/null +++ b/validate-action/verification/traceability/0.2-AI-MANIFEST.a2ml @@ -0,0 +1,12 @@ +# SPDX-License-Identifier: MPL-2.0 +--- +### [META] +id: "verification-unit-traceability" +level: 2 +parent: "../0.1-AI-MANIFEST.a2ml" + +--- +### [AI_MANIFEST] +description: | + High-assurance verification unit for traceability. + Critical for safety-of-life and aerospace-grade deployment standards. diff --git a/validate-action/verification/traceability/README.adoc b/validate-action/verification/traceability/README.adoc new file mode 100644 index 0000000..ff23dd7 --- /dev/null +++ b/validate-action/verification/traceability/README.adoc @@ -0,0 +1 @@ += Traceability Unit From 5323e1291d2b83d7ef699389b9825263291b05fb Mon Sep 17 00:00:00 2001 From: "Jonathan D.A. Jewell" <6759885+hyperpolymath@users.noreply.github.com> Date: Sun, 26 Jul 2026 14:34:55 +0100 Subject: [PATCH 02/11] chore: estate-wide security compliance --- .github/dependabot.yml | 51 +++++++++++++++++++++++++ .github/workflows/anchor-drift.yml | 1 + .github/workflows/codeql.yml | 45 ++++++++++++++++++++++ .github/workflows/push-email-notify.yml | 1 + 4 files changed, 98 insertions(+) create mode 100644 .github/dependabot.yml create mode 100644 .github/workflows/codeql.yml diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 0000000..4d9ae2f --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,51 @@ +# SPDX-License-Identifier: MPL-2.0 +# Dependabot configuration for RSR-compliant repositories +# Covers common ecosystems - remove unused ones for your project + +version: 2 +updates: + # GitHub Actions - always include + - package-ecosystem: "github-actions" + directory: "/" + schedule: + interval: "weekly" + groups: + actions: + patterns: + - "*" + + # Rust/Cargo + - package-ecosystem: "cargo" + directory: "/" + schedule: + interval: "weekly" + # `open-pull-requests-limit: 0` suppresses routine version-update PRs + # while leaving Dependabot SECURITY PRs flowing. The previous + # `ignore: "*" patch` rule also silenced security PRs under GitHub\'s + # current Dependabot behaviour. See rsr-template-repo commit 78b050e + # and 007-lang/audits/audit-dependabot-automation-gap-2026-04-17.md. + open-pull-requests-limit: 0 + + # Elixir/Mix + - package-ecosystem: "mix" + directory: "/" + schedule: + interval: "weekly" + + # Node.js/npm + - package-ecosystem: "npm" + directory: "/" + schedule: + interval: "weekly" + + # Python/pip + - package-ecosystem: "pip" + directory: "/" + schedule: + interval: "weekly" + + # Nix flakes + - package-ecosystem: "nix" + directory: "/" + schedule: + interval: "weekly" diff --git a/.github/workflows/anchor-drift.yml b/.github/workflows/anchor-drift.yml index b63de06..9dc9b0a 100644 --- a/.github/workflows/anchor-drift.yml +++ b/.github/workflows/anchor-drift.yml @@ -14,6 +14,7 @@ on: workflow_dispatch: permissions: + actions: read contents: read jobs: diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml new file mode 100644 index 0000000..ae64b5e --- /dev/null +++ b/.github/workflows/codeql.yml @@ -0,0 +1,45 @@ +# SPDX-License-Identifier: MPL-2.0 +name: CodeQL + +on: + push: + branches: [main] + pull_request: + branches: [main] + schedule: + - cron: '0 0 * * 0' + +permissions: + actions: read + contents: read + security-events: write + +jobs: + analyze: + name: CodeQL Analysis + runs-on: ubuntu-latest + permissions: + actions: read + contents: read + security-events: write + strategy: + fail-fast: false + matrix: + include: + - language: actions + build-mode: none + steps: + - name: Checkout repository + uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4 + + - name: Initialize CodeQL + uses: github/codeql-action/init@29b1f65c1f735799893313399435a59f54045865 # v3 + with: + languages: ${{ matrix.language }} + build-mode: ${{ matrix.build-mode }} + + - name: Autobuild + uses: github/codeql-action/autobuild@29b1f65c1f735799893313399435a59f54045865 # v3 + + - name: Perform CodeQL Analysis + uses: github/codeql-action/analyze@29b1f65c1f735799893313399435a59f54045865 # v3 diff --git a/.github/workflows/push-email-notify.yml b/.github/workflows/push-email-notify.yml index 4b4e754..112afd1 100644 --- a/.github/workflows/push-email-notify.yml +++ b/.github/workflows/push-email-notify.yml @@ -7,6 +7,7 @@ name: Push email notification on: push: {} permissions: + actions: read contents: read jobs: notify: From 86b5bb7e0049bc91c8fd315dc766151c93429518 Mon Sep 17 00:00:00 2001 From: "Jonathan D.A. Jewell" <6759885+hyperpolymath@users.noreply.github.com> Date: Sun, 26 Jul 2026 15:06:54 +0100 Subject: [PATCH 03/11] chore: remove duplicate GOVERNANCE files, keep GOVERNANCE.md --- GOVERNANCE.adoc | 93 -------------------------------- deno/GOVERNANCE.md | 60 --------------------- ex/GOVERNANCE.md | 60 --------------------- gleam/GOVERNANCE.md | 60 --------------------- haskell/GOVERNANCE.md | 60 --------------------- rs/GOVERNANCE.md | 60 --------------------- showcase/GOVERNANCE.md | 60 --------------------- validate-action/GOVERNANCE.adoc | 94 --------------------------------- validate-action/GOVERNANCE.md | 60 --------------------- 9 files changed, 607 deletions(-) delete mode 100644 GOVERNANCE.adoc delete mode 100644 deno/GOVERNANCE.md delete mode 100644 ex/GOVERNANCE.md delete mode 100644 gleam/GOVERNANCE.md delete mode 100644 haskell/GOVERNANCE.md delete mode 100644 rs/GOVERNANCE.md delete mode 100644 showcase/GOVERNANCE.md delete mode 100644 validate-action/GOVERNANCE.adoc delete mode 100644 validate-action/GOVERNANCE.md diff --git a/GOVERNANCE.adoc b/GOVERNANCE.adoc deleted file mode 100644 index 0b8ac89..0000000 --- a/GOVERNANCE.adoc +++ /dev/null @@ -1,93 +0,0 @@ -= Governance - -// SPDX-License-Identifier: CC-BY-SA-4.0 - -[NOTE] -==== -Personal / solo-project model (Benevolent Maintainer). Last reviewed: 2026-06-27. -==== - -== Project status - -This project is governed by a *Benevolent Maintainer* model. - -The project founder retains final authority over project direction, -architecture, releases, licensing, and governance. - -== Founder - -Current founder and lead maintainer: - -* Jonathan D.A. Jewell (`@hyperpolymath`) - -== Decision making - -Normal decisions are made by the founder. - -Contributors are encouraged to: - -* open issues -* submit pull requests -* propose designs -* discuss alternatives - -Feedback is considered in good faith but does not bind the project. - -== Contributions - -Contributions are welcome. See `CONTRIBUTING.md` for how to get started. - -Submitting a contribution does not guarantee acceptance. The founder may: - -* accept a contribution -* request changes -* reject a contribution -* replace a contribution with an alternative implementation - -without further justification. - -== Architectural direction - -The founder is responsible for: - -* project vision -* long-term roadmap -* architecture -* naming -* release strategy - -== Maintainers - -Additional maintainers may be appointed by the founder (see `MAINTAINERS.adoc`). -Maintainers may review changes, merge pull requests, and manage issues unless -otherwise restricted. The founder may remove maintainers at any time. - -== Code of conduct - -All participants are expected to follow the project's `CODE_OF_CONDUCT.md`. -The founder is the point of contact for enforcement. - -== Security - -Report suspected vulnerabilities *privately* as described in `SECURITY.md`. -Please do not disclose vulnerabilities in public issues. - -== Forking - -Users are free to fork the project according to the license. Forks are -independent projects and are not considered official unless explicitly -designated. - -== Governance changes - -This document may be amended by the founder. - -== Project continuity - -If the founder permanently ceases maintenance: - -. a successor may be appointed; -. ownership may be transferred; -. the project may become community-maintained. - -Until such designation exists, no successor is implied. diff --git a/deno/GOVERNANCE.md b/deno/GOVERNANCE.md deleted file mode 100644 index e27364c..0000000 --- a/deno/GOVERNANCE.md +++ /dev/null @@ -1,60 +0,0 @@ -# Governance - -## Overview - -This project is governed by the following principles and structures to ensure transparent, inclusive, and effective decision-making. - -## Roles and Responsibilities - -### Maintainers - -Maintainers are responsible for: -- Reviewing and merging pull requests -- Managing releases and versioning -- Ensuring code quality and standards -- Triaging issues and bug reports -- Community engagement and support - -### Contributors - -Contributors are expected to: -- Follow the code of conduct -- Submit well-documented pull requests -- Write tests for new functionality -- Maintain existing tests -- Update documentation as needed - -## Decision Making - -### Minor Changes -- Can be made by any maintainer -- Include bug fixes, documentation updates, dependency updates - -### Major Changes -- Require discussion in issues or pull requests -- Include new features, architectural changes, API changes -- Need approval from at least 2 maintainers - -### Breaking Changes -- Require RFC (Request for Comments) process -- Need approval from majority of maintainers -- Must include migration guide - -## Code of Conduct - -All participants are expected to follow our Code of Conduct. Violations can be reported to the maintainers. - -## Communication - -- **Issues**: For bug reports and feature requests -- **Discussions**: For questions and general discussion -- **Pull Requests**: For code contributions - -## Licensing - -All contributions are made under the terms of the repository's LICENSE file. -By submitting a pull request, you agree to license your contributions accordingly. - ---- - -*Last updated: 2026-07-18* diff --git a/ex/GOVERNANCE.md b/ex/GOVERNANCE.md deleted file mode 100644 index e27364c..0000000 --- a/ex/GOVERNANCE.md +++ /dev/null @@ -1,60 +0,0 @@ -# Governance - -## Overview - -This project is governed by the following principles and structures to ensure transparent, inclusive, and effective decision-making. - -## Roles and Responsibilities - -### Maintainers - -Maintainers are responsible for: -- Reviewing and merging pull requests -- Managing releases and versioning -- Ensuring code quality and standards -- Triaging issues and bug reports -- Community engagement and support - -### Contributors - -Contributors are expected to: -- Follow the code of conduct -- Submit well-documented pull requests -- Write tests for new functionality -- Maintain existing tests -- Update documentation as needed - -## Decision Making - -### Minor Changes -- Can be made by any maintainer -- Include bug fixes, documentation updates, dependency updates - -### Major Changes -- Require discussion in issues or pull requests -- Include new features, architectural changes, API changes -- Need approval from at least 2 maintainers - -### Breaking Changes -- Require RFC (Request for Comments) process -- Need approval from majority of maintainers -- Must include migration guide - -## Code of Conduct - -All participants are expected to follow our Code of Conduct. Violations can be reported to the maintainers. - -## Communication - -- **Issues**: For bug reports and feature requests -- **Discussions**: For questions and general discussion -- **Pull Requests**: For code contributions - -## Licensing - -All contributions are made under the terms of the repository's LICENSE file. -By submitting a pull request, you agree to license your contributions accordingly. - ---- - -*Last updated: 2026-07-18* diff --git a/gleam/GOVERNANCE.md b/gleam/GOVERNANCE.md deleted file mode 100644 index e27364c..0000000 --- a/gleam/GOVERNANCE.md +++ /dev/null @@ -1,60 +0,0 @@ -# Governance - -## Overview - -This project is governed by the following principles and structures to ensure transparent, inclusive, and effective decision-making. - -## Roles and Responsibilities - -### Maintainers - -Maintainers are responsible for: -- Reviewing and merging pull requests -- Managing releases and versioning -- Ensuring code quality and standards -- Triaging issues and bug reports -- Community engagement and support - -### Contributors - -Contributors are expected to: -- Follow the code of conduct -- Submit well-documented pull requests -- Write tests for new functionality -- Maintain existing tests -- Update documentation as needed - -## Decision Making - -### Minor Changes -- Can be made by any maintainer -- Include bug fixes, documentation updates, dependency updates - -### Major Changes -- Require discussion in issues or pull requests -- Include new features, architectural changes, API changes -- Need approval from at least 2 maintainers - -### Breaking Changes -- Require RFC (Request for Comments) process -- Need approval from majority of maintainers -- Must include migration guide - -## Code of Conduct - -All participants are expected to follow our Code of Conduct. Violations can be reported to the maintainers. - -## Communication - -- **Issues**: For bug reports and feature requests -- **Discussions**: For questions and general discussion -- **Pull Requests**: For code contributions - -## Licensing - -All contributions are made under the terms of the repository's LICENSE file. -By submitting a pull request, you agree to license your contributions accordingly. - ---- - -*Last updated: 2026-07-18* diff --git a/haskell/GOVERNANCE.md b/haskell/GOVERNANCE.md deleted file mode 100644 index e27364c..0000000 --- a/haskell/GOVERNANCE.md +++ /dev/null @@ -1,60 +0,0 @@ -# Governance - -## Overview - -This project is governed by the following principles and structures to ensure transparent, inclusive, and effective decision-making. - -## Roles and Responsibilities - -### Maintainers - -Maintainers are responsible for: -- Reviewing and merging pull requests -- Managing releases and versioning -- Ensuring code quality and standards -- Triaging issues and bug reports -- Community engagement and support - -### Contributors - -Contributors are expected to: -- Follow the code of conduct -- Submit well-documented pull requests -- Write tests for new functionality -- Maintain existing tests -- Update documentation as needed - -## Decision Making - -### Minor Changes -- Can be made by any maintainer -- Include bug fixes, documentation updates, dependency updates - -### Major Changes -- Require discussion in issues or pull requests -- Include new features, architectural changes, API changes -- Need approval from at least 2 maintainers - -### Breaking Changes -- Require RFC (Request for Comments) process -- Need approval from majority of maintainers -- Must include migration guide - -## Code of Conduct - -All participants are expected to follow our Code of Conduct. Violations can be reported to the maintainers. - -## Communication - -- **Issues**: For bug reports and feature requests -- **Discussions**: For questions and general discussion -- **Pull Requests**: For code contributions - -## Licensing - -All contributions are made under the terms of the repository's LICENSE file. -By submitting a pull request, you agree to license your contributions accordingly. - ---- - -*Last updated: 2026-07-18* diff --git a/rs/GOVERNANCE.md b/rs/GOVERNANCE.md deleted file mode 100644 index e27364c..0000000 --- a/rs/GOVERNANCE.md +++ /dev/null @@ -1,60 +0,0 @@ -# Governance - -## Overview - -This project is governed by the following principles and structures to ensure transparent, inclusive, and effective decision-making. - -## Roles and Responsibilities - -### Maintainers - -Maintainers are responsible for: -- Reviewing and merging pull requests -- Managing releases and versioning -- Ensuring code quality and standards -- Triaging issues and bug reports -- Community engagement and support - -### Contributors - -Contributors are expected to: -- Follow the code of conduct -- Submit well-documented pull requests -- Write tests for new functionality -- Maintain existing tests -- Update documentation as needed - -## Decision Making - -### Minor Changes -- Can be made by any maintainer -- Include bug fixes, documentation updates, dependency updates - -### Major Changes -- Require discussion in issues or pull requests -- Include new features, architectural changes, API changes -- Need approval from at least 2 maintainers - -### Breaking Changes -- Require RFC (Request for Comments) process -- Need approval from majority of maintainers -- Must include migration guide - -## Code of Conduct - -All participants are expected to follow our Code of Conduct. Violations can be reported to the maintainers. - -## Communication - -- **Issues**: For bug reports and feature requests -- **Discussions**: For questions and general discussion -- **Pull Requests**: For code contributions - -## Licensing - -All contributions are made under the terms of the repository's LICENSE file. -By submitting a pull request, you agree to license your contributions accordingly. - ---- - -*Last updated: 2026-07-18* diff --git a/showcase/GOVERNANCE.md b/showcase/GOVERNANCE.md deleted file mode 100644 index e27364c..0000000 --- a/showcase/GOVERNANCE.md +++ /dev/null @@ -1,60 +0,0 @@ -# Governance - -## Overview - -This project is governed by the following principles and structures to ensure transparent, inclusive, and effective decision-making. - -## Roles and Responsibilities - -### Maintainers - -Maintainers are responsible for: -- Reviewing and merging pull requests -- Managing releases and versioning -- Ensuring code quality and standards -- Triaging issues and bug reports -- Community engagement and support - -### Contributors - -Contributors are expected to: -- Follow the code of conduct -- Submit well-documented pull requests -- Write tests for new functionality -- Maintain existing tests -- Update documentation as needed - -## Decision Making - -### Minor Changes -- Can be made by any maintainer -- Include bug fixes, documentation updates, dependency updates - -### Major Changes -- Require discussion in issues or pull requests -- Include new features, architectural changes, API changes -- Need approval from at least 2 maintainers - -### Breaking Changes -- Require RFC (Request for Comments) process -- Need approval from majority of maintainers -- Must include migration guide - -## Code of Conduct - -All participants are expected to follow our Code of Conduct. Violations can be reported to the maintainers. - -## Communication - -- **Issues**: For bug reports and feature requests -- **Discussions**: For questions and general discussion -- **Pull Requests**: For code contributions - -## Licensing - -All contributions are made under the terms of the repository's LICENSE file. -By submitting a pull request, you agree to license your contributions accordingly. - ---- - -*Last updated: 2026-07-18* diff --git a/validate-action/GOVERNANCE.adoc b/validate-action/GOVERNANCE.adoc deleted file mode 100644 index 393df47..0000000 --- a/validate-action/GOVERNANCE.adoc +++ /dev/null @@ -1,94 +0,0 @@ -// SPDX-License-Identifier: CC-BY-SA-4.0 -// SPDX-License-Identifier: CC-BY-SA-4.0 -// Copyright (c) Jonathan D.A. Jewell -= Governance - -[NOTE] -==== -Personal / solo-project model (Benevolent Maintainer). Last reviewed: 2026-06-22. -==== - -== Project status - -This project is governed by a *Benevolent Maintainer* model. - -The project founder retains final authority over project direction, -architecture, releases, licensing, and governance. - -== Founder - -Current founder and lead maintainer: - -* Jonathan D.A. Jewell (`@hyperpolymath`) - -== Decision making - -Normal decisions are made by the founder. - -Contributors are encouraged to: - -* open issues -* submit pull requests -* propose designs -* discuss alternatives - -Feedback is considered in good faith but does not bind the project. - -== Contributions - -Contributions are welcome. See `CONTRIBUTING.md` for how to get started. - -Submitting a contribution does not guarantee acceptance. The founder may: - -* accept a contribution -* request changes -* reject a contribution -* replace a contribution with an alternative implementation - -without further justification. - -== Architectural direction - -The founder is responsible for: - -* project vision -* long-term roadmap -* architecture -* naming -* release strategy - -== Maintainers - -Additional maintainers may be appointed by the founder (see `MAINTAINERS.adoc`). -Maintainers may review changes, merge pull requests, and manage issues unless -otherwise restricted. The founder may remove maintainers at any time. - -== Code of conduct - -All participants are expected to follow the project's `CODE_OF_CONDUCT.md`. -The founder is the point of contact for enforcement. - -== Security - -Report suspected vulnerabilities *privately* as described in `SECURITY.md`. -Please do not disclose vulnerabilities in public issues. - -== Forking - -Users are free to fork the project according to the license. Forks are -independent projects and are not considered official unless explicitly -designated. - -== Governance changes - -This document may be amended by the founder. - -== Project continuity - -If the founder permanently ceases maintenance: - -. a successor may be appointed; -. ownership may be transferred; -. the project may become community-maintained. - -Until such designation exists, no successor is implied. diff --git a/validate-action/GOVERNANCE.md b/validate-action/GOVERNANCE.md deleted file mode 100644 index e27364c..0000000 --- a/validate-action/GOVERNANCE.md +++ /dev/null @@ -1,60 +0,0 @@ -# Governance - -## Overview - -This project is governed by the following principles and structures to ensure transparent, inclusive, and effective decision-making. - -## Roles and Responsibilities - -### Maintainers - -Maintainers are responsible for: -- Reviewing and merging pull requests -- Managing releases and versioning -- Ensuring code quality and standards -- Triaging issues and bug reports -- Community engagement and support - -### Contributors - -Contributors are expected to: -- Follow the code of conduct -- Submit well-documented pull requests -- Write tests for new functionality -- Maintain existing tests -- Update documentation as needed - -## Decision Making - -### Minor Changes -- Can be made by any maintainer -- Include bug fixes, documentation updates, dependency updates - -### Major Changes -- Require discussion in issues or pull requests -- Include new features, architectural changes, API changes -- Need approval from at least 2 maintainers - -### Breaking Changes -- Require RFC (Request for Comments) process -- Need approval from majority of maintainers -- Must include migration guide - -## Code of Conduct - -All participants are expected to follow our Code of Conduct. Violations can be reported to the maintainers. - -## Communication - -- **Issues**: For bug reports and feature requests -- **Discussions**: For questions and general discussion -- **Pull Requests**: For code contributions - -## Licensing - -All contributions are made under the terms of the repository's LICENSE file. -By submitting a pull request, you agree to license your contributions accordingly. - ---- - -*Last updated: 2026-07-18* From 08fce7a26935f7123de302dea67655a1c07d0ee9 Mon Sep 17 00:00:00 2001 From: "Jonathan D.A. Jewell" <6759885+hyperpolymath@users.noreply.github.com> Date: Sun, 26 Jul 2026 16:00:36 +0100 Subject: [PATCH 04/11] chore: update guix.scm from squisher-corpus --- deno/guix.scm | 75 ++++++++------------------------------------------- 1 file changed, 11 insertions(+), 64 deletions(-) diff --git a/deno/guix.scm b/deno/guix.scm index 33b1a9a..c6dd7be 100644 --- a/deno/guix.scm +++ b/deno/guix.scm @@ -1,71 +1,18 @@ -;; SPDX-License-Identifier: MPL-2.0 -;; Copyright (c) {{CURRENT_YEAR}} {{AUTHOR}} ({{OWNER}}) <{{AUTHOR_EMAIL}}> -;; -;; Guix package definition for {{PROJECT_NAME}} -;; -;; Usage: -;; guix shell -D -f guix.scm # Enter development shell -;; guix build -f guix.scm # Build package -;; -;; TODO: Replace {{PROJECT_NAME}} and customize inputs for your language/stack. -;; See: https://guix.gnu.org/manual/en/html_node/Defining-Packages.html +; SPDX-License-Identifier: MPL-2.0 +;; guix.scm — GNU Guix package definition for squisher-corpus +;; Usage: guix shell -f guix.scm (use-modules (guix packages) - (guix gexp) - (guix git-download) (guix build-system gnu) - (guix licenses) - (gnu packages base)) + (guix licenses)) (package - (name "{{PROJECT_NAME}}") + (name "squisher-corpus") (version "0.1.0") - (source (local-file "." "source" - #:recursive? #t - #:select? (lambda (file stat) - (not (string-contains file ".git"))))) + (source #f) (build-system gnu-build-system) - (arguments - '(#:phases - (modify-phases %standard-phases - ;; TODO: Customize build phases for your project - ;; Examples for common stacks: - ;; - ;; Rust: - ;; (replace 'build (lambda _ (invoke "cargo" "build" "--release"))) - ;; (replace 'check (lambda _ (invoke "cargo" "test"))) - ;; - ;; Elixir: - ;; (replace 'build (lambda _ (invoke "mix" "compile"))) - ;; (replace 'check (lambda _ (invoke "mix" "test"))) - ;; - ;; Zig: - ;; (replace 'build (lambda _ (invoke "zig" "build"))) - ;; (replace 'check (lambda _ (invoke "zig" "build" "test"))) - (delete 'configure) - (delete 'build) - (delete 'check) - (replace 'install - (lambda* (#:key outputs #:allow-other-keys) - (let ((out (assoc-ref outputs "out"))) - (mkdir-p (string-append out "/share/doc")) - (copy-file "README.adoc" - (string-append out "/share/doc/README.adoc")))))))) - (native-inputs - (list - ;; TODO: Add build-time dependencies - ;; Examples: - ;; rust (gnu packages rust) - ;; elixir (gnu packages elixir) - ;; zig (gnu packages zig) - )) - (inputs - (list - ;; TODO: Add runtime dependencies - )) - (home-page "https://github.com/{{OWNER}}/{{PROJECT_NAME}}") - (synopsis "{{PROJECT_PURPOSE}}") - (description "RSR-compliant project. See README.adoc for details.") - (license (list - ;; MPL-2.0 extends MPL-2.0 - mpl2.0))) + (synopsis "squisher-corpus") + (description "squisher-corpus — part of the hyperpolymath ecosystem.") + (home-page "https://github.com/hyperpolymath/squisher-corpus") + (license ((@@ (guix licenses) license) "PMPL-1.0-or-later" + "https://github.com/hyperpolymath/palimpsest-license"))) From 7460050b1b301abe654773f288cc5d4caf47a94e Mon Sep 17 00:00:00 2001 From: "Jonathan D.A. Jewell" <6759885+hyperpolymath@users.noreply.github.com> Date: Sun, 26 Jul 2026 16:00:38 +0100 Subject: [PATCH 05/11] chore: update guix.scm from squisher-corpus --- rs/guix.scm | 75 ++++++++--------------------------------------------- 1 file changed, 11 insertions(+), 64 deletions(-) diff --git a/rs/guix.scm b/rs/guix.scm index 33b1a9a..c6dd7be 100644 --- a/rs/guix.scm +++ b/rs/guix.scm @@ -1,71 +1,18 @@ -;; SPDX-License-Identifier: MPL-2.0 -;; Copyright (c) {{CURRENT_YEAR}} {{AUTHOR}} ({{OWNER}}) <{{AUTHOR_EMAIL}}> -;; -;; Guix package definition for {{PROJECT_NAME}} -;; -;; Usage: -;; guix shell -D -f guix.scm # Enter development shell -;; guix build -f guix.scm # Build package -;; -;; TODO: Replace {{PROJECT_NAME}} and customize inputs for your language/stack. -;; See: https://guix.gnu.org/manual/en/html_node/Defining-Packages.html +; SPDX-License-Identifier: MPL-2.0 +;; guix.scm — GNU Guix package definition for squisher-corpus +;; Usage: guix shell -f guix.scm (use-modules (guix packages) - (guix gexp) - (guix git-download) (guix build-system gnu) - (guix licenses) - (gnu packages base)) + (guix licenses)) (package - (name "{{PROJECT_NAME}}") + (name "squisher-corpus") (version "0.1.0") - (source (local-file "." "source" - #:recursive? #t - #:select? (lambda (file stat) - (not (string-contains file ".git"))))) + (source #f) (build-system gnu-build-system) - (arguments - '(#:phases - (modify-phases %standard-phases - ;; TODO: Customize build phases for your project - ;; Examples for common stacks: - ;; - ;; Rust: - ;; (replace 'build (lambda _ (invoke "cargo" "build" "--release"))) - ;; (replace 'check (lambda _ (invoke "cargo" "test"))) - ;; - ;; Elixir: - ;; (replace 'build (lambda _ (invoke "mix" "compile"))) - ;; (replace 'check (lambda _ (invoke "mix" "test"))) - ;; - ;; Zig: - ;; (replace 'build (lambda _ (invoke "zig" "build"))) - ;; (replace 'check (lambda _ (invoke "zig" "build" "test"))) - (delete 'configure) - (delete 'build) - (delete 'check) - (replace 'install - (lambda* (#:key outputs #:allow-other-keys) - (let ((out (assoc-ref outputs "out"))) - (mkdir-p (string-append out "/share/doc")) - (copy-file "README.adoc" - (string-append out "/share/doc/README.adoc")))))))) - (native-inputs - (list - ;; TODO: Add build-time dependencies - ;; Examples: - ;; rust (gnu packages rust) - ;; elixir (gnu packages elixir) - ;; zig (gnu packages zig) - )) - (inputs - (list - ;; TODO: Add runtime dependencies - )) - (home-page "https://github.com/{{OWNER}}/{{PROJECT_NAME}}") - (synopsis "{{PROJECT_PURPOSE}}") - (description "RSR-compliant project. See README.adoc for details.") - (license (list - ;; MPL-2.0 extends MPL-2.0 - mpl2.0))) + (synopsis "squisher-corpus") + (description "squisher-corpus — part of the hyperpolymath ecosystem.") + (home-page "https://github.com/hyperpolymath/squisher-corpus") + (license ((@@ (guix licenses) license) "PMPL-1.0-or-later" + "https://github.com/hyperpolymath/palimpsest-license"))) From ed33572ce9124894adf33086dc534209abe0a7db Mon Sep 17 00:00:00 2001 From: "Jonathan D.A. Jewell" <6759885+hyperpolymath@users.noreply.github.com> Date: Sun, 26 Jul 2026 16:00:41 +0100 Subject: [PATCH 06/11] chore: update guix.scm from squisher-corpus --- ex/guix.scm | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/ex/guix.scm b/ex/guix.scm index a464b55..c6dd7be 100644 --- a/ex/guix.scm +++ b/ex/guix.scm @@ -1,5 +1,5 @@ ; SPDX-License-Identifier: MPL-2.0 -;; guix.scm — GNU Guix package definition for a2ml_ex +;; guix.scm — GNU Guix package definition for squisher-corpus ;; Usage: guix shell -f guix.scm (use-modules (guix packages) @@ -7,12 +7,12 @@ (guix licenses)) (package - (name "a2ml_ex") + (name "squisher-corpus") (version "0.1.0") (source #f) (build-system gnu-build-system) - (synopsis "a2ml_ex") - (description "a2ml_ex — part of the hyperpolymath ecosystem.") - (home-page "https://github.com/hyperpolymath/a2ml_ex") - (license ((@@ (guix licenses) license) "MPL-2.0" + (synopsis "squisher-corpus") + (description "squisher-corpus — part of the hyperpolymath ecosystem.") + (home-page "https://github.com/hyperpolymath/squisher-corpus") + (license ((@@ (guix licenses) license) "PMPL-1.0-or-later" "https://github.com/hyperpolymath/palimpsest-license"))) From 91e4d485b860e554047ba1d6561992982b3f76ae Mon Sep 17 00:00:00 2001 From: "Jonathan D.A. Jewell" <6759885+hyperpolymath@users.noreply.github.com> Date: Sun, 26 Jul 2026 16:00:44 +0100 Subject: [PATCH 07/11] chore: update guix.scm from squisher-corpus --- haskell/guix.scm | 75 +++++++----------------------------------------- 1 file changed, 11 insertions(+), 64 deletions(-) diff --git a/haskell/guix.scm b/haskell/guix.scm index dc52ee7..c6dd7be 100644 --- a/haskell/guix.scm +++ b/haskell/guix.scm @@ -1,71 +1,18 @@ -;; SPDX-License-Identifier: MPL-2.0 -;; Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) -;; -;; Guix package definition for a2ml-haskell -;; -;; Usage: -;; guix shell -D -f guix.scm # Enter development shell -;; guix build -f guix.scm # Build package -;; -;; TODO: Replace a2ml-haskell and customize inputs for your language/stack. -;; See: https://guix.gnu.org/manual/en/html_node/Defining-Packages.html +; SPDX-License-Identifier: MPL-2.0 +;; guix.scm — GNU Guix package definition for squisher-corpus +;; Usage: guix shell -f guix.scm (use-modules (guix packages) - (guix gexp) - (guix git-download) (guix build-system gnu) - (guix licenses) - (gnu packages base)) + (guix licenses)) (package - (name "a2ml-haskell") + (name "squisher-corpus") (version "0.1.0") - (source (local-file "." "source" - #:recursive? #t - #:select? (lambda (file stat) - (not (string-contains file ".git"))))) + (source #f) (build-system gnu-build-system) - (arguments - '(#:phases - (modify-phases %standard-phases - ;; TODO: Customize build phases for your project - ;; Examples for common stacks: - ;; - ;; Rust: - ;; (replace 'build (lambda _ (invoke "cargo" "build" "--release"))) - ;; (replace 'check (lambda _ (invoke "cargo" "test"))) - ;; - ;; Elixir: - ;; (replace 'build (lambda _ (invoke "mix" "compile"))) - ;; (replace 'check (lambda _ (invoke "mix" "test"))) - ;; - ;; Zig: - ;; (replace 'build (lambda _ (invoke "zig" "build"))) - ;; (replace 'check (lambda _ (invoke "zig" "build" "test"))) - (delete 'configure) - (delete 'build) - (delete 'check) - (replace 'install - (lambda* (#:key outputs #:allow-other-keys) - (let ((out (assoc-ref outputs "out"))) - (mkdir-p (string-append out "/share/doc")) - (copy-file "README.adoc" - (string-append out "/share/doc/README.adoc")))))))) - (native-inputs - (list - ;; TODO: Add build-time dependencies - ;; Examples: - ;; rust (gnu packages rust) - ;; elixir (gnu packages elixir) - ;; zig (gnu packages zig) - )) - (inputs - (list - ;; TODO: Add runtime dependencies - )) - (home-page "https://github.com/hyperpolymath/a2ml-haskell") - (synopsis "A hyperpolymath project") - (description "RSR-compliant project. See README.adoc for details.") - (license (list - ;; MPL-2.0 extends MPL-2.0 - mpl2.0))) + (synopsis "squisher-corpus") + (description "squisher-corpus — part of the hyperpolymath ecosystem.") + (home-page "https://github.com/hyperpolymath/squisher-corpus") + (license ((@@ (guix licenses) license) "PMPL-1.0-or-later" + "https://github.com/hyperpolymath/palimpsest-license"))) From eee1f4ba0b04144ea0f1af52d7a98c3932ff0d76 Mon Sep 17 00:00:00 2001 From: "Jonathan D.A. Jewell" <6759885+hyperpolymath@users.noreply.github.com> Date: Sun, 26 Jul 2026 16:00:47 +0100 Subject: [PATCH 08/11] chore: update guix.scm from squisher-corpus --- showcase/guix.scm | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/showcase/guix.scm b/showcase/guix.scm index 358c4e4..c6dd7be 100644 --- a/showcase/guix.scm +++ b/showcase/guix.scm @@ -1,5 +1,5 @@ ; SPDX-License-Identifier: MPL-2.0 -;; guix.scm — GNU Guix package definition for a2ml-showcase +;; guix.scm — GNU Guix package definition for squisher-corpus ;; Usage: guix shell -f guix.scm (use-modules (guix packages) @@ -7,12 +7,12 @@ (guix licenses)) (package - (name "a2ml-showcase") + (name "squisher-corpus") (version "0.1.0") (source #f) (build-system gnu-build-system) - (synopsis "a2ml-showcase") - (description "a2ml-showcase — part of the hyperpolymath ecosystem.") - (home-page "https://github.com/hyperpolymath/a2ml-showcase") - (license ((@@ (guix licenses) license) "MPL-2.0" + (synopsis "squisher-corpus") + (description "squisher-corpus — part of the hyperpolymath ecosystem.") + (home-page "https://github.com/hyperpolymath/squisher-corpus") + (license ((@@ (guix licenses) license) "PMPL-1.0-or-later" "https://github.com/hyperpolymath/palimpsest-license"))) From d1d6c276a9b7742f373c5a2e155f112cf72399a7 Mon Sep 17 00:00:00 2001 From: "Jonathan D.A. Jewell" <6759885+hyperpolymath@users.noreply.github.com> Date: Sun, 26 Jul 2026 16:00:50 +0100 Subject: [PATCH 09/11] chore: update guix.scm from squisher-corpus --- validate-action/guix.scm | 75 ++++++---------------------------------- 1 file changed, 11 insertions(+), 64 deletions(-) diff --git a/validate-action/guix.scm b/validate-action/guix.scm index 295aaf5..c6dd7be 100644 --- a/validate-action/guix.scm +++ b/validate-action/guix.scm @@ -1,71 +1,18 @@ -;; SPDX-License-Identifier: MPL-2.0 -;; Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) -;; -;; Guix package definition for a2ml-validate-action -;; -;; Usage: -;; guix shell -D -f guix.scm # Enter development shell -;; guix build -f guix.scm # Build package -;; -;; TODO: Replace a2ml-validate-action and customize inputs for your language/stack. -;; See: https://guix.gnu.org/manual/en/html_node/Defining-Packages.html +; SPDX-License-Identifier: MPL-2.0 +;; guix.scm — GNU Guix package definition for squisher-corpus +;; Usage: guix shell -f guix.scm (use-modules (guix packages) - (guix gexp) - (guix git-download) (guix build-system gnu) - (guix licenses) - (gnu packages base)) + (guix licenses)) (package - (name "a2ml-validate-action") + (name "squisher-corpus") (version "0.1.0") - (source (local-file "." "source" - #:recursive? #t - #:select? (lambda (file stat) - (not (string-contains file ".git"))))) + (source #f) (build-system gnu-build-system) - (arguments - '(#:phases - (modify-phases %standard-phases - ;; TODO: Customize build phases for your project - ;; Examples for common stacks: - ;; - ;; Rust: - ;; (replace 'build (lambda _ (invoke "cargo" "build" "--release"))) - ;; (replace 'check (lambda _ (invoke "cargo" "test"))) - ;; - ;; Elixir: - ;; (replace 'build (lambda _ (invoke "mix" "compile"))) - ;; (replace 'check (lambda _ (invoke "mix" "test"))) - ;; - ;; Zig: - ;; (replace 'build (lambda _ (invoke "zig" "build"))) - ;; (replace 'check (lambda _ (invoke "zig" "build" "test"))) - (delete 'configure) - (delete 'build) - (delete 'check) - (replace 'install - (lambda* (#:key outputs #:allow-other-keys) - (let ((out (assoc-ref outputs "out"))) - (mkdir-p (string-append out "/share/doc")) - (copy-file "README.adoc" - (string-append out "/share/doc/README.adoc")))))))) - (native-inputs - (list - ;; TODO: Add build-time dependencies - ;; Examples: - ;; rust (gnu packages rust) - ;; elixir (gnu packages elixir) - ;; zig (gnu packages zig) - )) - (inputs - (list - ;; TODO: Add runtime dependencies - )) - (home-page "https://github.com/hyperpolymath/a2ml-validate-action") - (synopsis "") - (description "RSR-compliant project. See README.adoc for details.") - (license (list - ;; MPL-2.0 extends MPL-2.0 - mpl2.0))) + (synopsis "squisher-corpus") + (description "squisher-corpus — part of the hyperpolymath ecosystem.") + (home-page "https://github.com/hyperpolymath/squisher-corpus") + (license ((@@ (guix licenses) license) "PMPL-1.0-or-later" + "https://github.com/hyperpolymath/palimpsest-license"))) From 9f3232fe84679cfecc6c33a2b4e721e4d8c045ca Mon Sep 17 00:00:00 2001 From: "Jonathan D.A. Jewell" <6759885+hyperpolymath@users.noreply.github.com> Date: Sun, 26 Jul 2026 16:00:53 +0100 Subject: [PATCH 10/11] chore: update guix.scm from squisher-corpus --- gleam/guix.scm | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/gleam/guix.scm b/gleam/guix.scm index 4f90062..c6dd7be 100644 --- a/gleam/guix.scm +++ b/gleam/guix.scm @@ -1,5 +1,5 @@ ; SPDX-License-Identifier: MPL-2.0 -;; guix.scm — GNU Guix package definition for a2ml_gleam +;; guix.scm — GNU Guix package definition for squisher-corpus ;; Usage: guix shell -f guix.scm (use-modules (guix packages) @@ -7,12 +7,12 @@ (guix licenses)) (package - (name "a2ml_gleam") + (name "squisher-corpus") (version "0.1.0") (source #f) (build-system gnu-build-system) - (synopsis "a2ml_gleam") - (description "a2ml_gleam — part of the hyperpolymath ecosystem.") - (home-page "https://github.com/hyperpolymath/a2ml_gleam") - (license ((@@ (guix licenses) license) "MPL-2.0" + (synopsis "squisher-corpus") + (description "squisher-corpus — part of the hyperpolymath ecosystem.") + (home-page "https://github.com/hyperpolymath/squisher-corpus") + (license ((@@ (guix licenses) license) "PMPL-1.0-or-later" "https://github.com/hyperpolymath/palimpsest-license"))) From 42eeb2a5c9577598c902b757aa5e809890055ca1 Mon Sep 17 00:00:00 2001 From: "Jonathan D.A. Jewell" <6759885+hyperpolymath@users.noreply.github.com> Date: Mon, 27 Jul 2026 19:06:18 +0100 Subject: [PATCH 11/11] fix(ci): repoint codeql-action at a SHA that exists github/codeql-action@29b1f65c1f735799893313399435a59f54045865 is pinned here but exists in no repository -- the GitHub API returns 422 for it. CodeQL therefore could not start: the run graph fails to build and the job reports startup_failure, so this repository has had no CodeQL scanning at all. Repointed at 4187e74d05793876e9989daffde9c3e66b4acd07, which is what the v3 tag currently resolves to (v3.37.3), verified against the API. Found while auditing the estate: the same non-existent SHA is pinned in over 100 repositories, so CodeQL is dead across nearly all of them. Co-Authored-By: Claude Opus 5 Signed-off-by: Jonathan D.A. Jewell <6759885+hyperpolymath@users.noreply.github.com> --- .github/workflows/codeql.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index ae64b5e..34ae58e 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -33,13 +33,13 @@ jobs: uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4 - name: Initialize CodeQL - uses: github/codeql-action/init@29b1f65c1f735799893313399435a59f54045865 # v3 + uses: github/codeql-action/init@4187e74d05793876e9989daffde9c3e66b4acd07 # v3 with: languages: ${{ matrix.language }} build-mode: ${{ matrix.build-mode }} - name: Autobuild - uses: github/codeql-action/autobuild@29b1f65c1f735799893313399435a59f54045865 # v3 + uses: github/codeql-action/autobuild@4187e74d05793876e9989daffde9c3e66b4acd07 # v3 - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@29b1f65c1f735799893313399435a59f54045865 # v3 + uses: github/codeql-action/analyze@4187e74d05793876e9989daffde9c3e66b4acd07 # v3