@synapsor/runner 1.1.1 → 1.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +92 -1
- package/README.md +26 -7
- package/THREAT_MODEL.md +7 -4
- package/dist/cli.d.ts +5 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/local-ui.d.ts.map +1 -1
- package/dist/runner.mjs +8060 -2615
- package/docs/README.md +19 -3
- package/docs/capability-authoring.md +20 -8
- package/docs/conformance.md +12 -0
- package/docs/current-scope.md +12 -4
- package/docs/doctor.md +21 -7
- package/docs/dsl-reference.md +91 -5
- package/docs/getting-started-own-database.md +26 -3
- package/docs/guarded-crud-writeback.md +218 -0
- package/docs/limitations.md +30 -9
- package/docs/oss-vs-cloud.md +1 -1
- package/docs/production.md +52 -20
- package/docs/release-notes.md +82 -2
- package/docs/release-policy.md +1 -1
- package/docs/result-envelope-v2.md +20 -6
- package/docs/result-envelope-v4.md +47 -0
- package/docs/reversible-change-sets.md +151 -0
- package/docs/rfcs/004-guarded-crud-receipt-authority.md +165 -0
- package/docs/rfcs/005-bounded-set-writeback.md +164 -0
- package/docs/rfcs/006-reviewed-reversible-change-sets.md +152 -0
- package/docs/runner-config-reference.md +83 -9
- package/docs/running-a-runner-fleet.md +2 -1
- package/docs/security-boundary.md +29 -9
- package/docs/writeback-executors.md +12 -11
- package/examples/runner-fleet/seed/mysql.sql +47 -0
- package/examples/runner-fleet/seed/postgres.sql +48 -0
- package/examples/support-plan-credit/README.md +31 -0
- package/examples/support-plan-credit/contract.synapsor.sql +26 -0
- package/examples/support-plan-credit/expected-output/tools-preview.txt +1 -0
- package/examples/support-plan-credit/seed/001_seed.sql +14 -1
- package/examples/support-plan-credit/synapsor.contract.json +101 -1
- package/examples/support-plan-credit/synapsor.runner.json +7 -1
- package/fixtures/protocol/MANIFEST.json +131 -1
- package/fixtures/protocol/change-set.bounded-update.v3.json +57 -0
- package/fixtures/protocol/change-set.delete.v2.json +31 -0
- package/fixtures/protocol/change-set.insert.v2.json +36 -0
- package/fixtures/protocol/change-set.update.v2.json +32 -0
- package/fixtures/protocol/compensation-change-set.update.v1.json +40 -0
- package/fixtures/protocol/execution-receipt.bounded-update-applied.v3.json +39 -0
- package/fixtures/protocol/execution-receipt.compensation-update-applied.v4.json +37 -0
- package/fixtures/protocol/execution-receipt.delete-applied.v2.json +25 -0
- package/fixtures/protocol/execution-receipt.insert-applied.v2.json +24 -0
- package/fixtures/protocol/execution-receipt.reconciliation-required.v2.json +25 -0
- package/fixtures/protocol/execution-receipt.update-applied.v2.json +25 -0
- package/fixtures/protocol/writeback-job.bounded-update.v3.json +43 -0
- package/fixtures/protocol/writeback-job.compensation-update.v4.json +34 -0
- package/fixtures/protocol/writeback-job.delete.v2.json +22 -0
- package/fixtures/protocol/writeback-job.insert.v2.json +28 -0
- package/fixtures/protocol/writeback-job.update.v2.json +24 -0
- package/package.json +1 -1
- package/schemas/change-set.v2.schema.json +245 -0
- package/schemas/change-set.v3.schema.json +112 -0
- package/schemas/compensation-change-set.v1.schema.json +32 -0
- package/schemas/execution-receipt.v2.schema.json +106 -0
- package/schemas/execution-receipt.v3.schema.json +40 -0
- package/schemas/execution-receipt.v4.schema.json +22 -0
- package/schemas/inverse-descriptor.v1.schema.json +46 -0
- package/schemas/synapsor.runner.schema.json +132 -2
- package/schemas/writeback-job.v2.schema.json +238 -0
- package/schemas/writeback-job.v3.schema.json +53 -0
- package/schemas/writeback-job.v4.schema.json +17 -0
package/CHANGELOG.md
CHANGED
|
@@ -1,6 +1,97 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
-
## 1.
|
|
3
|
+
## 1.4.0 (prepared, not published)
|
|
4
|
+
|
|
5
|
+
### Reviewed Reversible Change Sets
|
|
6
|
+
|
|
7
|
+
- Adds opt-in canonical `reversibility.mode = reviewed_inverse` and DSL
|
|
8
|
+
`REVERSIBLE` for direct SQL capabilities with human/operator approval and
|
|
9
|
+
operation-specific exact guards.
|
|
10
|
+
- Captures bounded inverse descriptors only after an unambiguous successful
|
|
11
|
+
source transaction. Inverses retain trusted identity, version metadata, and
|
|
12
|
+
reviewed writable values; kept-out data is excluded.
|
|
13
|
+
- Adds operator-only `revert <proposal-id>`, which creates a new proposal and
|
|
14
|
+
never writes or approves. Compensation inherits reviewer role/quorum and
|
|
15
|
+
passes normal approval, guarded apply, receipt, reconciliation, and replay.
|
|
16
|
+
- Supports reviewed UPDATE, INSERT, soft-delete, and exact frozen-set
|
|
17
|
+
compensation on PostgreSQL and MySQL. Fresh-state conflicts and one stale set
|
|
18
|
+
member fail closed without partial effects.
|
|
19
|
+
- Reports hard DELETE and app-owned/external effects as specifically
|
|
20
|
+
unavailable instead of claiming rollback or time travel. Successful
|
|
21
|
+
compensation captures its own bounded inverse with linear lineage capped at
|
|
22
|
+
16.
|
|
23
|
+
- Adds compensation change-set and protocol-v4 job/receipt schemas,
|
|
24
|
+
conformance fixtures, owner-authorized resources, local UI/doctor/preview
|
|
25
|
+
state, bounded metrics, crash-reconciliation tests, and the disposable
|
|
26
|
+
`corepack pnpm test:reversible` gate.
|
|
27
|
+
- Stages `@synapsor/spec@1.4.0`, `@synapsor/dsl@1.4.0`, and
|
|
28
|
+
`@synapsor/runner@1.4.0`. No npm package is published by this change.
|
|
29
|
+
|
|
30
|
+
## 1.3.0 (prepared, not published)
|
|
31
|
+
|
|
32
|
+
### Bounded Set Writeback
|
|
33
|
+
|
|
34
|
+
- Adds canonical and DSL semantics for fixed-predicate set `UPDATE`/`DELETE`
|
|
35
|
+
and exact-review batch `INSERT`, with mandatory `MAX ROWS`, aggregate value
|
|
36
|
+
bounds, and a hard 100-row implementation ceiling.
|
|
37
|
+
- Freezes ordered primary keys, tenant scope, reviewed before/after values,
|
|
38
|
+
exact versions, per-member digests, and a set digest before approval. Apply
|
|
39
|
+
locks only that frozen set and never reruns a broad selection predicate.
|
|
40
|
+
- Applies every member in one source transaction. Cap overflow, aggregate
|
|
41
|
+
overflow, stale/missing members, anomalous affected counts, dedup conflicts,
|
|
42
|
+
triggers, or widening delete cascades fail closed without partial effects.
|
|
43
|
+
- Requires human/operator approval for all bounded sets in this release;
|
|
44
|
+
policy auto-approval is rejected. Hard set delete remains exceptional and
|
|
45
|
+
soft delete is preferred.
|
|
46
|
+
- Adds protocol-v3 change-set, writeback-job, result, and receipt envelopes
|
|
47
|
+
with exact member identities and bounded safe digests, plus reconciliation
|
|
48
|
+
support for Runner-ledger crash ambiguity.
|
|
49
|
+
- Adds executable R1-R7 conformance coverage and a disposable PostgreSQL/MySQL
|
|
50
|
+
live gate for cap/aggregate rejection, atomic rollback, exact receipts,
|
|
51
|
+
batch deduplication, delete hazards, reconciliation, and 1/10/100-row bounds.
|
|
52
|
+
- Stages `@synapsor/spec@1.3.0`, `@synapsor/dsl@1.3.0`, and
|
|
53
|
+
`@synapsor/runner@1.3.0`. No npm package is published by this change.
|
|
54
|
+
|
|
55
|
+
## 1.2.0 (prepared, not published)
|
|
56
|
+
|
|
57
|
+
### Guarded CRUD And Receipt Authority
|
|
58
|
+
|
|
59
|
+
- Adds canonical and DSL operation semantics for native guarded single-row
|
|
60
|
+
`INSERT`, `UPDATE`, and `DELETE`, while preserving operation-less contracts
|
|
61
|
+
and v1 writeback jobs as guarded UPDATE.
|
|
62
|
+
- Adds operation-aware v2 change-set, writeback-job, and execution-receipt
|
|
63
|
+
schemas with trusted tenant binding, source-enforced INSERT deduplication,
|
|
64
|
+
DELETE cascade/trigger refusal, bounded diffs, and replay-safe digests.
|
|
65
|
+
- Separates receipt authority (`source_db` or `runner_ledger`) from source
|
|
66
|
+
receipt provisioning (`precreated` or `auto_migrate`). Runner-ledger mode
|
|
67
|
+
records durable intents without source receipt DDL and stops ambiguous
|
|
68
|
+
post-commit outcomes for verified operator reconciliation.
|
|
69
|
+
- Extends Postgres and MySQL adapters, onboarding, doctor, tools preview, and
|
|
70
|
+
the support-plan-credit example with least-privilege guarded CRUD paths.
|
|
71
|
+
- Adds disposable-engine verification for every operation and receipt mode,
|
|
72
|
+
retries, crash windows, concurrent applies, stale guards, and hidden DELETE
|
|
73
|
+
effects. No npm package is published by this change.
|
|
74
|
+
- Stages `@synapsor/spec@1.2.0`, `@synapsor/dsl@1.2.0`, and
|
|
75
|
+
`@synapsor/runner@1.2.0`.
|
|
76
|
+
|
|
77
|
+
## 1.1.2 (prepared, not published)
|
|
78
|
+
|
|
79
|
+
### Fleet Error And Batch Apply Correctness
|
|
80
|
+
|
|
81
|
+
- Classifies bounded source-pool saturation and recognized transient
|
|
82
|
+
PostgreSQL, MySQL, and network failures as `TEMPORARILY_UNAVAILABLE` with
|
|
83
|
+
`retryable: true` and a bounded `retry_after_ms`, while keeping raw driver
|
|
84
|
+
details out of MCP results and operational logs.
|
|
85
|
+
- Keeps non-transient database failures fail-closed as non-retryable
|
|
86
|
+
`INTERNAL` errors.
|
|
87
|
+
- Preserves the existing shared `runtime_store` bridge while
|
|
88
|
+
`apply --all-approved` applies each selected proposal, preventing stale
|
|
89
|
+
bridge state from silently skipping policy- or human-approved proposals.
|
|
90
|
+
- Adds policy-approved unit coverage and a two-Runner synthetic Postgres fleet
|
|
91
|
+
check for durable batch results and receipts.
|
|
92
|
+
- Stages only `@synapsor/runner@1.1.2`; canonical Spec and DSL remain `1.1.0`.
|
|
93
|
+
|
|
94
|
+
## 1.1.1
|
|
4
95
|
|
|
5
96
|
### Resource Read Authorization
|
|
6
97
|
|
package/README.md
CHANGED
|
@@ -74,9 +74,9 @@ evidence -> proposal -> approval -> receipt -> replay
|
|
|
74
74
|
```
|
|
75
75
|
|
|
76
76
|
The model can inspect scoped data and propose an exact change. It cannot call
|
|
77
|
-
approval or
|
|
78
|
-
Runner
|
|
79
|
-
|
|
77
|
+
approval, apply, or revert tools. A human or trusted operator approves outside
|
|
78
|
+
MCP, then Runner performs a guarded write or routes the proposal to an
|
|
79
|
+
app-owned executor.
|
|
80
80
|
|
|
81
81
|
The distinction is the complete boundary, not a read-only toggle or a generic
|
|
82
82
|
approve/reject prompt:
|
|
@@ -148,10 +148,20 @@ synapsor-runner mcp serve --config ./synapsor.runner.json --store ./.synapsor/lo
|
|
|
148
148
|
```
|
|
149
149
|
|
|
150
150
|
For proposal capabilities and writes, follow the
|
|
151
|
-
[complete own-database guide](docs/getting-started-own-database.md).
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
151
|
+
[complete own-database guide](docs/getting-started-own-database.md). Reviewed
|
|
152
|
+
single-row INSERT, UPDATE, and DELETE can use Runner's guarded direct
|
|
153
|
+
writeback. Runner also supports tightly [bounded set
|
|
154
|
+
writes](docs/bounded-set-writeback.md): fixed-predicate UPDATE/DELETE and
|
|
155
|
+
exact-review batch INSERT, with human approval, a hard 100-row ceiling, atomic
|
|
156
|
+
apply, and exact receipts. Free-form predicates, unbounded or cross-table work,
|
|
157
|
+
and external effects go through an [app-owned
|
|
158
|
+
executor](docs/writeback-executors.md) after approval.
|
|
159
|
+
|
|
160
|
+
Direct writes can use [reviewed
|
|
161
|
+
compensation](docs/reversible-change-sets.md). Receipts capture a
|
|
162
|
+
bounded inverse; `synapsor-runner revert <proposal_id>` creates a separately
|
|
163
|
+
approved proposal. This is not rollback, time travel, or app-owned
|
|
164
|
+
compensation.
|
|
155
165
|
|
|
156
166
|
## Trust And Verification
|
|
157
167
|
|
|
@@ -168,6 +178,15 @@ trust boundaries, covered threats, non-goals, and required operator controls.
|
|
|
168
178
|
It proves source rows stay unchanged before approval, guarded writeback
|
|
169
179
|
applies once, idempotent retry does not duplicate the effect, and a stale row
|
|
170
180
|
returns a conflict.
|
|
181
|
+
- `corepack pnpm test:guarded-crud` proves native single-row INSERT, UPDATE,
|
|
182
|
+
and DELETE across both databases and all receipt modes, including the
|
|
183
|
+
zero-source-schema Runner-ledger path and fail-closed reconciliation.
|
|
184
|
+
- `corepack pnpm test:bounded-set` proves proposal-time cap and aggregate
|
|
185
|
+
rejection, frozen-set drift checks, all-or-nothing set UPDATE/DELETE and
|
|
186
|
+
batch INSERT, delete-side-effect refusal, exact receipts, and 1/10/100-row
|
|
187
|
+
bounds on disposable PostgreSQL and MySQL.
|
|
188
|
+
- `corepack pnpm test:reversible` proves approval, conflict guards, redaction,
|
|
189
|
+
receipts, and replay on PostgreSQL and MySQL.
|
|
171
190
|
- The C++/Cloud round-trip verifier exports normalized contracts, validates
|
|
172
191
|
them with `@synapsor/spec`, and loads them in Runner. The shared contract and
|
|
173
192
|
verification commands are documented in [Conformance](docs/conformance.md).
|
package/THREAT_MODEL.md
CHANGED
|
@@ -53,8 +53,11 @@ idempotency boundary for effects.
|
|
|
53
53
|
- Wrong tenant or object: reads and writes include trusted primary-key and tenant predicates.
|
|
54
54
|
- Disallowed field update: patch columns must be allowlisted.
|
|
55
55
|
- Stale row: conflict guard mismatch returns `conflict` instead of silently writing.
|
|
56
|
-
- Duplicate retry:
|
|
57
|
-
-
|
|
56
|
+
- Duplicate retry: atomic source receipts or durable Runner intents plus
|
|
57
|
+
source-enforced version/unique guards prevent a known duplicate effect;
|
|
58
|
+
ambiguous ledger/source crash windows stop for reconciliation.
|
|
59
|
+
- Over-broad write: direct INSERT/UPDATE/DELETE is single-row, tenant-bound,
|
|
60
|
+
operation-guarded, and success requires exactly one affected row.
|
|
58
61
|
- Cloud credential leakage: database URLs and write credentials stay local and are not sent to Cloud.
|
|
59
62
|
- Model-callable approval: approval/commit tools are not exposed to MCP clients by default.
|
|
60
63
|
- Claims/environment confusion: an `http_claims` server fails before serving
|
|
@@ -81,8 +84,8 @@ idempotency boundary for effects.
|
|
|
81
84
|
- Sensitive data already returned to a model.
|
|
82
85
|
- Prompt injection itself.
|
|
83
86
|
- Business invariants not represented in the capability config, proposal, application handler, or database constraints.
|
|
84
|
-
- Generic multi-row business transactions, DDL,
|
|
85
|
-
cross-database atomicity in the Runner direct-write path.
|
|
87
|
+
- Generic multi-row business transactions, DDL, UPSERT, model-generated
|
|
88
|
+
predicates, or cross-database atomicity in the Runner direct-write path.
|
|
86
89
|
- A compromised IdP/JWKS host, ledger database, source database, TLS
|
|
87
90
|
terminator, or administrator-approved contract.
|
|
88
91
|
- Unbounded/high-throughput or multi-region ledger scale, compliance
|
package/dist/cli.d.ts
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import { type DbRowReader } from "@synapsor-runner/mcp-server";
|
|
3
|
-
import { type
|
|
3
|
+
import { type StoredWritebackIntent } from "@synapsor-runner/proposal-store";
|
|
4
|
+
import { type ExecutionReceiptV2, type ExecutionReceiptV3, type ExecutionReceiptV4, type WritebackJob } from "@synapsor-runner/protocol";
|
|
4
5
|
import { type SchemaInspection } from "@synapsor-runner/schema-inspector";
|
|
6
|
+
import { type ReconciliationObservation } from "@synapsor-runner/worker-core";
|
|
5
7
|
export declare function main(argv: string[]): Promise<number>;
|
|
6
8
|
type WizardAsk = (question: string, defaultValue?: string) => Promise<string>;
|
|
7
9
|
export declare function runInitWizard(args: string[], options?: {
|
|
@@ -12,5 +14,7 @@ export declare function runInitWizard(args: string[], options?: {
|
|
|
12
14
|
stdout?: Pick<NodeJS.WriteStream, "write">;
|
|
13
15
|
}): Promise<number>;
|
|
14
16
|
export declare function resolveSqlWriteDatabaseUrl(job: WritebackJob, configPath: string, env: NodeJS.ProcessEnv): Promise<string>;
|
|
17
|
+
export declare function reconciliationSupportedOutcome(observation: ReconciliationObservation): "applied" | "conflict" | "failed";
|
|
18
|
+
export declare function reconciliationReceipt(intent: StoredWritebackIntent, observation: ReconciliationObservation, outcome: "applied" | "conflict" | "failed", runnerId: string, reason: string): ExecutionReceiptV2 | ExecutionReceiptV3 | ExecutionReceiptV4;
|
|
15
19
|
export {};
|
|
16
20
|
//# sourceMappingURL=cli.d.ts.map
|
package/dist/cli.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAYA,OAAO,EAAoP,KAAK,WAAW,EAA0H,MAAM,6BAA6B,CAAC;
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAYA,OAAO,EAAoP,KAAK,WAAW,EAA0H,MAAM,6BAA6B,CAAC;AAIza,OAAO,EAgBL,KAAK,qBAAqB,EAK3B,MAAM,iCAAiC,CAAC;AACzC,OAAO,EAAgI,KAAK,kBAAkB,EAAE,KAAK,kBAAkB,EAAE,KAAK,kBAAkB,EAAuD,KAAK,YAAY,EAAwB,MAAM,2BAA2B,CAAC;AAElV,OAAO,EAQL,KAAK,gBAAgB,EAEtB,MAAM,mCAAmC,CAAC;AAC3C,OAAO,EAUL,KAAK,yBAAyB,EAE/B,MAAM,8BAA8B,CAAC;AAyUtC,wBAAsB,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CA6D1D;AA0FD,KAAK,SAAS,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;AAE9E,wBAAsB,aAAa,CACjC,IAAI,EAAE,MAAM,EAAE,EACd,OAAO,GAAE;IACP,GAAG,CAAC,EAAE,SAAS,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB,UAAU,CAAC,EAAE,gBAAgB,CAAC;IAC9B,OAAO,CAAC,EAAE,WAAW,CAAC;IACtB,MAAM,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;CACvC,GACL,OAAO,CAAC,MAAM,CAAC,CA0YjB;AAgmGD,wBAAsB,0BAA0B,CAAC,GAAG,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,CAAC,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,CAS/H;AAs4CD,wBAAgB,8BAA8B,CAAC,WAAW,EAAE,yBAAyB,GAAG,SAAS,GAAG,UAAU,GAAG,QAAQ,CAKxH;AAED,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,qBAAqB,EAC7B,WAAW,EAAE,yBAAyB,EACtC,OAAO,EAAE,SAAS,GAAG,UAAU,GAAG,QAAQ,EAC1C,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,GACb,kBAAkB,GAAG,kBAAkB,GAAG,kBAAkB,CAgH9D"}
|
package/dist/local-ui.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"local-ui.d.ts","sourceRoot":"","sources":["../src/local-ui.ts"],"names":[],"mappings":"AAEA,OAAO,EAAsC,KAAK,MAAM,EAAuB,MAAM,WAAW,CAAC;AAIjG,OAAO,EAAE,aAAa,
|
|
1
|
+
{"version":3,"file":"local-ui.d.ts","sourceRoot":"","sources":["../src/local-ui.ts"],"names":[],"mappings":"AAEA,OAAO,EAAsC,KAAK,MAAM,EAAuB,MAAM,WAAW,CAAC;AAIjG,OAAO,EAAE,aAAa,EAA6E,MAAM,iCAAiC,CAAC;AAK3I,MAAM,MAAM,cAAc,GAAG;IAC3B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,WAAW,CAAC,EAAE,kBAAkB,CAAC;CAClC,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG,CAAC,CAAC,EACjC,IAAI,EAAE,MAAM,GAAG,OAAO,EACtB,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,CAAC,KAClC,OAAO,CAAC,CAAC,CAAC,CAAC;AAEhB,MAAM,MAAM,aAAa,GAAG;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC5B,CAAC;AAEF,wBAAsB,kBAAkB,CAAC,OAAO,GAAE,cAAmB,GAAG,OAAO,CAAC,aAAa,CAAC,CA+C7F"}
|