@cruba/crubal 0.0.0-stage → 0.2.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/LICENSE +202 -0
- package/README.md +97 -2
- package/dist/bin/crubal.d.ts +2 -0
- package/dist/bin/crubal.js +103 -0
- package/dist/bin/crubal.js.map +1 -0
- package/dist/src/access.d.ts +126 -0
- package/dist/src/access.js +517 -0
- package/dist/src/access.js.map +1 -0
- package/dist/src/arrival.d.ts +55 -0
- package/dist/src/arrival.js +124 -0
- package/dist/src/arrival.js.map +1 -0
- package/dist/src/browser.d.ts +10 -0
- package/dist/src/browser.js +13 -0
- package/dist/src/browser.js.map +1 -0
- package/dist/src/bundle.d.ts +66 -0
- package/dist/src/bundle.js +753 -0
- package/dist/src/bundle.js.map +1 -0
- package/dist/src/canonical.d.ts +6 -0
- package/dist/src/canonical.js +47 -0
- package/dist/src/canonical.js.map +1 -0
- package/dist/src/conditions.d.ts +28 -0
- package/dist/src/conditions.js +216 -0
- package/dist/src/conditions.js.map +1 -0
- package/dist/src/corpus.d.ts +8 -0
- package/dist/src/corpus.js +1207 -0
- package/dist/src/corpus.js.map +1 -0
- package/dist/src/defs.d.ts +151 -0
- package/dist/src/defs.js +611 -0
- package/dist/src/defs.js.map +1 -0
- package/dist/src/dictionary.d.ts +65 -0
- package/dist/src/dictionary.js +557 -0
- package/dist/src/dictionary.js.map +1 -0
- package/dist/src/exchange.d.ts +236 -0
- package/dist/src/exchange.js +1035 -0
- package/dist/src/exchange.js.map +1 -0
- package/dist/src/forms.d.ts +16 -0
- package/dist/src/forms.js +169 -0
- package/dist/src/forms.js.map +1 -0
- package/dist/src/index.d.ts +27 -0
- package/dist/src/index.js +29 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/lex.d.ts +21 -0
- package/dist/src/lex.js +142 -0
- package/dist/src/lex.js.map +1 -0
- package/dist/src/lifecycle.d.ts +84 -0
- package/dist/src/lifecycle.js +415 -0
- package/dist/src/lifecycle.js.map +1 -0
- package/dist/src/log.d.ts +78 -0
- package/dist/src/log.js +506 -0
- package/dist/src/log.js.map +1 -0
- package/dist/src/migrate.d.ts +111 -0
- package/dist/src/migrate.js +286 -0
- package/dist/src/migrate.js.map +1 -0
- package/dist/src/model.d.ts +68 -0
- package/dist/src/model.js +188 -0
- package/dist/src/model.js.map +1 -0
- package/dist/src/packages.d.ts +69 -0
- package/dist/src/packages.js +232 -0
- package/dist/src/packages.js.map +1 -0
- package/dist/src/print-text.d.ts +7 -0
- package/dist/src/print-text.js +216 -0
- package/dist/src/print-text.js.map +1 -0
- package/dist/src/publish.d.ts +27 -0
- package/dist/src/publish.js +275 -0
- package/dist/src/publish.js.map +1 -0
- package/dist/src/read-text.d.ts +10 -0
- package/dist/src/read-text.js +385 -0
- package/dist/src/read-text.js.map +1 -0
- package/dist/src/records.d.ts +31 -0
- package/dist/src/records.js +72 -0
- package/dist/src/records.js.map +1 -0
- package/dist/src/review.d.ts +22 -0
- package/dist/src/review.js +198 -0
- package/dist/src/review.js.map +1 -0
- package/dist/src/rules.d.ts +96 -0
- package/dist/src/rules.js +611 -0
- package/dist/src/rules.js.map +1 -0
- package/dist/src/schedule.d.ts +24 -0
- package/dist/src/schedule.js +126 -0
- package/dist/src/schedule.js.map +1 -0
- package/dist/src/std-packages.d.ts +9 -0
- package/dist/src/std-packages.js +268 -0
- package/dist/src/std-packages.js.map +1 -0
- package/dist/src/store.d.ts +164 -0
- package/dist/src/store.js +538 -0
- package/dist/src/store.js.map +1 -0
- package/dist/src/tree.d.ts +35 -0
- package/dist/src/tree.js +159 -0
- package/dist/src/tree.js.map +1 -0
- package/dist/src/units-table.d.ts +1 -0
- package/dist/src/units-table.js +200 -0
- package/dist/src/units-table.js.map +1 -0
- package/dist/src/units.d.ts +42 -0
- package/dist/src/units.js +98 -0
- package/dist/src/units.js.map +1 -0
- package/dist/src/views.d.ts +216 -0
- package/dist/src/views.js +761 -0
- package/dist/src/views.js.map +1 -0
- package/package.json +60 -4
|
@@ -0,0 +1,538 @@
|
|
|
1
|
+
// store.ts: the Store level (spec chapters 8 and 9). Hash-linked logs (8.5), intake through a receive
|
|
2
|
+
// contract with raw bytes kept (9.1–9.4), landing values by the trust order with alternatives (8.4),
|
|
3
|
+
// matching parts before minting rows (9.2), and evidence validation with independence and vetoes (9.7).
|
|
4
|
+
import { createHash, createPublicKey, verify } from "node:crypto";
|
|
5
|
+
import { serialize } from "./canonical.js";
|
|
6
|
+
import { readClassLine, unquote } from "./defs.js";
|
|
7
|
+
import { checkScalar, foldKey, foldValue } from "./dictionary.js";
|
|
8
|
+
import { splitTop } from "./lex.js";
|
|
9
|
+
import { readUnder } from "./read-text.js";
|
|
10
|
+
import { CrubalError, readTree } from "./tree.js";
|
|
11
|
+
const isObj = (v) => typeof v === "object" && v !== null && !Array.isArray(v);
|
|
12
|
+
// ─── Logs (8.5) ──────────────────────────────────────────────────────────────
|
|
13
|
+
export function sha256(text) {
|
|
14
|
+
return createHash("sha256").update(text, "utf8").digest("hex");
|
|
15
|
+
}
|
|
16
|
+
/** A write's hash: SHA-256 of its canonical form; a redacted write's hash is what it carries (8.5.2). */
|
|
17
|
+
export function writeHash(w) {
|
|
18
|
+
if (isObj(w) && typeof w.redacted === "string")
|
|
19
|
+
return w.redacted.replace(/^sha256:/, "");
|
|
20
|
+
return sha256(serialize(w));
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* An entry's hash (8.5): SHA-256 of its canonical form without `sig`, each write replaced by `sha256:` and
|
|
24
|
+
* its own hash, so a redacted write leaves the entry's hash where it was. A redacted entry's hash is what it
|
|
25
|
+
* carries.
|
|
26
|
+
*/
|
|
27
|
+
export function entryHash(entry) {
|
|
28
|
+
if (typeof entry.redacted === "string")
|
|
29
|
+
return entry.redacted.replace(/^sha256:/, "");
|
|
30
|
+
const { sig: _sig, ...rest } = entry;
|
|
31
|
+
if (Array.isArray(rest.writes))
|
|
32
|
+
rest.writes = rest.writes.map((w) => `sha256:${writeHash(w)}`);
|
|
33
|
+
return sha256(serialize(rest));
|
|
34
|
+
}
|
|
35
|
+
/** The owner's key in force at a moment: the one whose span holds `at`, else an undated one, else the latest. */
|
|
36
|
+
export function keyFor(keys, owner, at) {
|
|
37
|
+
const k = keys[owner];
|
|
38
|
+
if (!k)
|
|
39
|
+
return undefined;
|
|
40
|
+
const list = Array.isArray(k) ? k : [k];
|
|
41
|
+
if (at) {
|
|
42
|
+
const spans = list.filter((x) => (!x.from || x.from <= at) && (!x.until || at < x.until));
|
|
43
|
+
if (spans.length)
|
|
44
|
+
return spans.at(-1);
|
|
45
|
+
}
|
|
46
|
+
return list.find((x) => !x.from && !x.until) ?? list.at(-1);
|
|
47
|
+
}
|
|
48
|
+
/** Does `sig` (base64url) verify over the entry's hash bytes with the owner's Ed25519 key? */
|
|
49
|
+
export function verifySig(entry, owner, keys) {
|
|
50
|
+
const k = keyFor(keys, owner, typeof entry.at === "string" ? entry.at : undefined);
|
|
51
|
+
if (!k || k.alg !== "Ed25519" || typeof entry.sig !== "string")
|
|
52
|
+
return false;
|
|
53
|
+
const key = createPublicKey({ key: { kty: "OKP", crv: "Ed25519", x: k.public }, format: "jwk" });
|
|
54
|
+
return verify(null, Buffer.from(entryHash(entry), "hex"), key, Buffer.from(entry.sig, "base64url"));
|
|
55
|
+
}
|
|
56
|
+
/** Check a chain's links, and, when the owner's key is known, every entry's signature (8.5). */
|
|
57
|
+
export function verifyChain(entries, keys) {
|
|
58
|
+
let owner = "";
|
|
59
|
+
for (let i = 0; i < entries.length; i++) {
|
|
60
|
+
const e = entries[i];
|
|
61
|
+
if (i > 0 && e.prev !== `sha256:${entryHash(entries[i - 1])}`)
|
|
62
|
+
return { valid: false, "breaks-at": String(e.log), reason: "link" };
|
|
63
|
+
if (typeof e.owner === "string")
|
|
64
|
+
owner = e.owner;
|
|
65
|
+
if (keys?.[owner] && !verifySig(e, owner, keys))
|
|
66
|
+
return { valid: false, "breaks-at": String(e.log), reason: "signature" };
|
|
67
|
+
}
|
|
68
|
+
return { valid: true };
|
|
69
|
+
}
|
|
70
|
+
function readMap(lines) {
|
|
71
|
+
return lines.map((l) => {
|
|
72
|
+
const [from, to] = splitArrow(l.text, l.line);
|
|
73
|
+
const values = l.children.map((c) => splitArrow(c.text, c.line).map(unq));
|
|
74
|
+
return { from, to, values, line: l.line, valueLines: l.children.map((c) => c.line) };
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
function splitArrow(text, line) {
|
|
78
|
+
const at = text.indexOf(" -> ");
|
|
79
|
+
if (at < 0)
|
|
80
|
+
throw new CrubalError(`a map line is "from -> to": ${text}`, line);
|
|
81
|
+
return [text.slice(0, at).trim(), text.slice(at + 4).trim()];
|
|
82
|
+
}
|
|
83
|
+
const unq = (s) => (s.startsWith('"') ? JSON.parse(s) : s);
|
|
84
|
+
/** Read `contract:` blocks. */
|
|
85
|
+
export function readContracts(source) {
|
|
86
|
+
const out = [];
|
|
87
|
+
for (const node of readTree(source)) {
|
|
88
|
+
if (node.kind !== "pair" || node.key !== "contract")
|
|
89
|
+
continue;
|
|
90
|
+
const c = {
|
|
91
|
+
name: node.value.trim(),
|
|
92
|
+
kind: "receive",
|
|
93
|
+
origin: "",
|
|
94
|
+
reads: [],
|
|
95
|
+
writes: [],
|
|
96
|
+
stores: [],
|
|
97
|
+
terms: {},
|
|
98
|
+
ignore: [],
|
|
99
|
+
keepRaw: [],
|
|
100
|
+
absorb: true,
|
|
101
|
+
lands: "value",
|
|
102
|
+
line: node.line,
|
|
103
|
+
needs: [],
|
|
104
|
+
gives: [],
|
|
105
|
+
stream: [],
|
|
106
|
+
parts: {},
|
|
107
|
+
partLines: {},
|
|
108
|
+
};
|
|
109
|
+
for (const p of node.children) {
|
|
110
|
+
if (!p.key)
|
|
111
|
+
continue;
|
|
112
|
+
c.partLines[p.key] = p.line;
|
|
113
|
+
const list = () => splitTop(p.value, ",", p.line).filter(Boolean);
|
|
114
|
+
if (p.key === "needs") {
|
|
115
|
+
// Needs are an unnamed class (5.8): its lines, placed by the same sections (5.3.3, 7.7).
|
|
116
|
+
if (p.value)
|
|
117
|
+
c.needs = splitTop(p.value, ",", p.line).map((t) => readClassLine(t, p.line));
|
|
118
|
+
else {
|
|
119
|
+
let section;
|
|
120
|
+
for (const l of p.children) {
|
|
121
|
+
if (l.kind === "pair" && l.key === "section") {
|
|
122
|
+
section = unq(l.value);
|
|
123
|
+
continue;
|
|
124
|
+
}
|
|
125
|
+
c.needs.push(readClassLine(l.text, l.line, section));
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
continue;
|
|
129
|
+
}
|
|
130
|
+
if (p.key === "gives")
|
|
131
|
+
c.gives = list();
|
|
132
|
+
else if (p.key === "who")
|
|
133
|
+
c.who = p.value;
|
|
134
|
+
else if (p.key === "when")
|
|
135
|
+
c.when = p.value;
|
|
136
|
+
else if (p.key === "from")
|
|
137
|
+
c.from = p.value;
|
|
138
|
+
else if (p.key === "to")
|
|
139
|
+
c.to = p.value;
|
|
140
|
+
else if (p.key === "mode")
|
|
141
|
+
c.mode = p.value;
|
|
142
|
+
else if (p.key === "undo")
|
|
143
|
+
c.undo = p.value;
|
|
144
|
+
else if (p.key === "ref")
|
|
145
|
+
c.ref = p.value;
|
|
146
|
+
else if (p.key === "stream")
|
|
147
|
+
c.stream = list();
|
|
148
|
+
else if (p.key === "terms") {
|
|
149
|
+
// `terms:` with one term per line, or `terms: reshare no, expires 2027-01-01` on the line.
|
|
150
|
+
for (const t of p.children)
|
|
151
|
+
if (t.key)
|
|
152
|
+
c.terms[t.key] = t.value.trim();
|
|
153
|
+
for (const t of list()) {
|
|
154
|
+
const [k, ...v] = t.trim().split(/[:\s]+/);
|
|
155
|
+
if (k && v.length)
|
|
156
|
+
c.terms[k] = v.join(" ");
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
if (p.key === "kind")
|
|
160
|
+
c.kind = p.value;
|
|
161
|
+
else if (p.key === "origin")
|
|
162
|
+
c.origin = p.value;
|
|
163
|
+
else if (p.key === "prefix")
|
|
164
|
+
c.prefix = p.value;
|
|
165
|
+
else if (p.key === "reads")
|
|
166
|
+
c.reads = readMap(p.children);
|
|
167
|
+
else if (p.key === "writes")
|
|
168
|
+
c.writes = readMap(p.children);
|
|
169
|
+
else if (p.key === "stores") {
|
|
170
|
+
// Written, ourAddress -> theirField; read, the same lines the other way, value maps too.
|
|
171
|
+
c.stores = readMap(p.children);
|
|
172
|
+
c.writes = c.stores.map((m) => ({ ...m, values: [...m.values] }));
|
|
173
|
+
c.reads = c.stores.map((m) => ({ from: m.to, to: m.from, values: m.values.map(([ours, theirs]) => [theirs, ours]), line: m.line, valueLines: m.valueLines }));
|
|
174
|
+
}
|
|
175
|
+
else if (p.key === "ignore")
|
|
176
|
+
c.ignore = list();
|
|
177
|
+
else if (p.key === "keep-raw")
|
|
178
|
+
c.keepRaw = list();
|
|
179
|
+
else if (p.key === "absorb")
|
|
180
|
+
c.absorb = p.value !== "no";
|
|
181
|
+
else if (p.key === "lands")
|
|
182
|
+
c.lands = p.value;
|
|
183
|
+
// Free text the printer may have quoted (2.5) reads back as text; every other part is kept as written.
|
|
184
|
+
if (!["kind", "origin", "prefix", "reads", "writes", "stores", "ignore", "keep-raw", "absorb", "lands", "gives", "who", "when", "from", "mode", "undo", "ref", "stream", "terms"].includes(p.key))
|
|
185
|
+
c.parts[p.key] = p.key === "label" || p.key === "describe" ? unquote(p.value) : p.value;
|
|
186
|
+
}
|
|
187
|
+
if (!c.origin)
|
|
188
|
+
c.origin = c.kind === "form" ? "declared" : "reported";
|
|
189
|
+
if (c.keepRaw.length && !c.prefix)
|
|
190
|
+
throw new CrubalError(`${c.name} keeps raw fields, so it needs a prefix`, c.line);
|
|
191
|
+
// A form's fields are its needs (7.7): with no reads of its own, each answer lands on its facet by name.
|
|
192
|
+
if (c.kind === "form" && !c.reads.length && c.needs.length)
|
|
193
|
+
c.reads = c.needs.map((l) => ({ from: l.facet, to: l.facet, values: [], line: l.line, valueLines: [] }));
|
|
194
|
+
out.push(c);
|
|
195
|
+
}
|
|
196
|
+
return out;
|
|
197
|
+
}
|
|
198
|
+
/** Split a field path into names: `aspects."Run Time"` → ["aspects", "Run Time"]. */
|
|
199
|
+
export function fieldPath(path) {
|
|
200
|
+
const out = [];
|
|
201
|
+
let cur = "";
|
|
202
|
+
let quoted = false;
|
|
203
|
+
for (let i = 0; i < path.length; i++) {
|
|
204
|
+
const ch = path[i];
|
|
205
|
+
if (ch === '"') {
|
|
206
|
+
quoted = !quoted;
|
|
207
|
+
continue;
|
|
208
|
+
}
|
|
209
|
+
if (ch === "." && !quoted) {
|
|
210
|
+
out.push(cur);
|
|
211
|
+
cur = "";
|
|
212
|
+
continue;
|
|
213
|
+
}
|
|
214
|
+
cur += ch;
|
|
215
|
+
}
|
|
216
|
+
out.push(cur);
|
|
217
|
+
return out;
|
|
218
|
+
}
|
|
219
|
+
/** Write a payload's field name as a path segment, quoted when it isn't a plain name. */
|
|
220
|
+
function segment(name) {
|
|
221
|
+
return /^[A-Za-z_]\w*$/.test(name) ? name : JSON.stringify(name);
|
|
222
|
+
}
|
|
223
|
+
/** A value in one of chapter 3's object forms (`$link`, `$image`, `$qty`, `$money`, `$value`, `$empty`): a leaf, not a nesting. */
|
|
224
|
+
const valueObject = (v) => isObj(v) && Object.keys(v).some((k) => k.startsWith("$"));
|
|
225
|
+
function leaves(obj, prefix = "", whole = () => false) {
|
|
226
|
+
if (!isObj(obj) || valueObject(obj))
|
|
227
|
+
return [[prefix, obj]];
|
|
228
|
+
return Object.entries(obj).flatMap(([k, v]) => {
|
|
229
|
+
const p = prefix ? `${prefix}.${segment(k)}` : segment(k);
|
|
230
|
+
// An object at a path the contract maps as one field (a compound answer, chapter 3) is one leaf.
|
|
231
|
+
return isObj(v) && !valueObject(v) && !whole(p) ? leaves(v, p, whole) : [[p, v]];
|
|
232
|
+
});
|
|
233
|
+
}
|
|
234
|
+
function samePath(a, b) {
|
|
235
|
+
return serialize(fieldPath(a)) === serialize(fieldPath(b));
|
|
236
|
+
}
|
|
237
|
+
/** Fold one raw value through the map's value map, the aliases and the shapes, then check it (9.2). */
|
|
238
|
+
function foldIn(f, raw, map, dict) {
|
|
239
|
+
// Chapter 3's forms arrive as values: a boolean for a yes-no, an object with a `$` key, and a list read item
|
|
240
|
+
// by item. Anything else is text, read under the facet (chapter 2) after the map's value map and the aliases.
|
|
241
|
+
let childProblem;
|
|
242
|
+
const one = (r) => {
|
|
243
|
+
if (valueObject(r) || (typeof r === "boolean" && f.type === "yes-no"))
|
|
244
|
+
return r;
|
|
245
|
+
// A compound answer as an object (chapter 3): each child folded under its own facet; a child that
|
|
246
|
+
// contradicts its facet contradicts the whole answer, and the outcome names the child.
|
|
247
|
+
if (f.type === "compound" && isObj(r)) {
|
|
248
|
+
const out = {};
|
|
249
|
+
for (const [k, v] of Object.entries(r)) {
|
|
250
|
+
const child = f.children?.get(k);
|
|
251
|
+
if (!child) {
|
|
252
|
+
out[k] = v;
|
|
253
|
+
continue;
|
|
254
|
+
}
|
|
255
|
+
const folded = foldIn(child, v, undefined, dict);
|
|
256
|
+
if (folded.outcome === "contradiction")
|
|
257
|
+
childProblem = childProblem ?? child.key;
|
|
258
|
+
out[k] = folded.value;
|
|
259
|
+
}
|
|
260
|
+
return out;
|
|
261
|
+
}
|
|
262
|
+
let text = typeof r === "string" ? r : serialize(r);
|
|
263
|
+
const vm = map?.values.find(([theirs]) => theirs === text);
|
|
264
|
+
if (vm)
|
|
265
|
+
text = vm[1];
|
|
266
|
+
return readUnder(f, text, dict) ?? text;
|
|
267
|
+
};
|
|
268
|
+
const read = Array.isArray(raw)
|
|
269
|
+
? raw.flatMap((r) => {
|
|
270
|
+
const x = one(r);
|
|
271
|
+
return Array.isArray(x) ? x : [x];
|
|
272
|
+
})
|
|
273
|
+
: one(raw);
|
|
274
|
+
const value = foldValue(f, read, dict);
|
|
275
|
+
const items = Array.isArray(value) ? value : [value];
|
|
276
|
+
const checks = items.map((i) => checkScalar(f, i));
|
|
277
|
+
if (childProblem)
|
|
278
|
+
return { value, outcome: "contradiction", cites: { type: childProblem } };
|
|
279
|
+
const outcome = checks.some((c) => c.outcome === "contradiction") ? "contradiction" : checks.some((c) => c.outcome === "new") ? "new" : "absorbed";
|
|
280
|
+
const unit = checks.find((c) => c.cites?.unit)?.cites;
|
|
281
|
+
return { value, outcome, ...(unit ? { cites: unit } : {}) };
|
|
282
|
+
}
|
|
283
|
+
/** Keep a payload's exact bytes (3.8): as text when they are valid UTF-8, otherwise as base64. */
|
|
284
|
+
export function rawOf(bytes, type) {
|
|
285
|
+
const hash = createHash("sha256").update(bytes).digest("hex");
|
|
286
|
+
try {
|
|
287
|
+
return { type, sha256: hash, body: new TextDecoder("utf-8", { fatal: true }).decode(bytes) };
|
|
288
|
+
}
|
|
289
|
+
catch {
|
|
290
|
+
return { type, sha256: hash, base64: Buffer.from(bytes).toString("base64") };
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
/** Replay an intake record from its kept bytes under the current contract (9.6); earlier outcomes stay. */
|
|
294
|
+
export function replay(intake, c, dict) {
|
|
295
|
+
const again = receive(c, intake.raw.body, intake.for, dict, intake.intake);
|
|
296
|
+
const replays = [...(intake.replays ?? []), { outcomes: again.outcomes, contract: c.name }];
|
|
297
|
+
return { ...intake, replays };
|
|
298
|
+
}
|
|
299
|
+
/** Review by key across every intake record (9.5), and candidate facets proposed by recurrence. */
|
|
300
|
+
export function reviewByKey(intakes, recur = 5) {
|
|
301
|
+
const groups = new Map();
|
|
302
|
+
for (const i of intakes) {
|
|
303
|
+
for (const o of i.outcomes) {
|
|
304
|
+
if (o.outcome !== "unknown" && o.outcome !== "new")
|
|
305
|
+
continue;
|
|
306
|
+
// A unit question (11.9) is reviewed by spelling, across every facet it reached.
|
|
307
|
+
const key = o.cites?.unit ? `unit:${String(o.cites.unit)}` : (o.to ?? o.from);
|
|
308
|
+
const g = groups.get(key) ?? { objects: new Set(), values: new Set(), outcome: o.outcome };
|
|
309
|
+
g.objects.add(i.for);
|
|
310
|
+
if (o.value !== undefined)
|
|
311
|
+
g.values.add(serialize(o.value));
|
|
312
|
+
groups.set(key, g);
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
const rows = [...groups.entries()].sort((a, b) => b[1].objects.size - a[1].objects.size || a[0].localeCompare(b[0]));
|
|
316
|
+
return {
|
|
317
|
+
"by-key": rows.map(([key, g]) => ({ key, objects: g.objects.size, values: g.values.size, outcome: g.outcome })),
|
|
318
|
+
// Only keys no facet holds become candidate facets; a facet's new values go to vocabulary review.
|
|
319
|
+
proposals: rows.filter(([, g]) => g.outcome === "unknown" && g.objects.size >= recur).map(([key, g]) => ({ key, objects: g.objects.size, state: "candidate" })),
|
|
320
|
+
};
|
|
321
|
+
}
|
|
322
|
+
/** Receive a raw payload through a contract: every field gets exactly one outcome. The bytes are kept. */
|
|
323
|
+
export function receive(c, body, forRecord, dict, intakeId = "I-1") {
|
|
324
|
+
const payload = JSON.parse(body);
|
|
325
|
+
const outcomes = [];
|
|
326
|
+
for (const [path, raw] of leaves(payload, "", (p) => c.reads.some((m) => samePath(m.from, p)))) {
|
|
327
|
+
// An empty string is no answer (chapter 3: what is absent stays absent); an empty is written as `$empty`.
|
|
328
|
+
if (raw === "") {
|
|
329
|
+
outcomes.push({ from: path, outcome: "ignored" });
|
|
330
|
+
continue;
|
|
331
|
+
}
|
|
332
|
+
if (!c.absorb || c.ignore.some((i) => samePath(i, path))) {
|
|
333
|
+
outcomes.push({ from: path, outcome: "ignored" });
|
|
334
|
+
continue;
|
|
335
|
+
}
|
|
336
|
+
const map = c.reads.find((m) => samePath(m.from, path));
|
|
337
|
+
if (map) {
|
|
338
|
+
const f = dict.facets.get(map.to);
|
|
339
|
+
if (!f) {
|
|
340
|
+
outcomes.push({ from: path, to: map.to, outcome: "unknown", value: raw });
|
|
341
|
+
continue;
|
|
342
|
+
}
|
|
343
|
+
const { value, outcome, cites } = foldIn(f, raw, map, dict);
|
|
344
|
+
outcomes.push({ from: path, to: map.to, outcome, value, ...(outcome === "contradiction" ? { cites: cites ?? { type: f.key } } : cites ? { cites } : {}) });
|
|
345
|
+
continue;
|
|
346
|
+
}
|
|
347
|
+
if (c.keepRaw.some((k) => samePath(k, path))) {
|
|
348
|
+
const name = fieldPath(path).at(-1);
|
|
349
|
+
if (!/^[A-Za-z_]\w*$/.test(name))
|
|
350
|
+
throw new CrubalError(`the raw field ${path} needs a map line: ${name} isn't a key name`, c.line);
|
|
351
|
+
outcomes.push({ from: path, to: `${c.prefix}:${name}`, outcome: "unknown", value: raw });
|
|
352
|
+
continue;
|
|
353
|
+
}
|
|
354
|
+
outcomes.push({ from: path, outcome: "unknown" });
|
|
355
|
+
}
|
|
356
|
+
return {
|
|
357
|
+
intake: intakeId,
|
|
358
|
+
contract: c.name,
|
|
359
|
+
for: forRecord,
|
|
360
|
+
raw: { type: "application/json", sha256: sha256(body), body },
|
|
361
|
+
outcomes,
|
|
362
|
+
};
|
|
363
|
+
}
|
|
364
|
+
// ─── Landing values: trust and alternatives (8.4, 9.3) ───────────────────────
|
|
365
|
+
const DEFAULT_TRUST = ["person", "observed", "declared", "reported", "derived"];
|
|
366
|
+
function matchAt(who, order) {
|
|
367
|
+
const hits = [who.person ? "person" : "", who.contract ?? "", who.source.owner ?? "", who.source.origin].filter(Boolean);
|
|
368
|
+
const at = order.findIndex((e) => hits.includes(e));
|
|
369
|
+
return at;
|
|
370
|
+
}
|
|
371
|
+
/** A source's rank under a facet's order then the package's (lower wins). */
|
|
372
|
+
function rank(who, trust, facetOrder = []) {
|
|
373
|
+
const f = matchAt(who, facetOrder);
|
|
374
|
+
if (f >= 0)
|
|
375
|
+
return f;
|
|
376
|
+
const p = matchAt(who, trust);
|
|
377
|
+
return facetOrder.length + (p >= 0 ? p : trust.length);
|
|
378
|
+
}
|
|
379
|
+
function sourceAt(r, address) {
|
|
380
|
+
return r.sources?.[address] ?? r.sources?.["*"];
|
|
381
|
+
}
|
|
382
|
+
/**
|
|
383
|
+
* Land an intake record's outcomes on a record. Absorbed and conflicting values go through the trust
|
|
384
|
+
* order: the winner is current, the loser is kept as an alternative. Equal values are agreement.
|
|
385
|
+
*/
|
|
386
|
+
export function land(r, intake, source, trust = DEFAULT_TRUST, facetTrust = new Map(),
|
|
387
|
+
/** The facets declared `transitions: yes` (4.2): a later value of equal or higher trust replaces, never conflicts. */
|
|
388
|
+
transitions = new Set()) {
|
|
389
|
+
const order = trust.length ? trust : DEFAULT_TRUST;
|
|
390
|
+
const incoming = { source, ...(intake.contract ? { contract: intake.contract } : {}), ...(intake.person ? { person: true } : {}) };
|
|
391
|
+
const out = {
|
|
392
|
+
...r,
|
|
393
|
+
values: { ...r.values },
|
|
394
|
+
sources: { ...(r.sources ?? {}) },
|
|
395
|
+
};
|
|
396
|
+
for (const o of intake.outcomes) {
|
|
397
|
+
if (!o.to || o.value === undefined || !["absorbed", "conflict", "new"].includes(o.outcome))
|
|
398
|
+
continue;
|
|
399
|
+
const current = out.values[o.to];
|
|
400
|
+
if (current === undefined || (isObj(current) && current.$empty === "unknown")) {
|
|
401
|
+
out.values[o.to] = o.value;
|
|
402
|
+
out.sources[o.to] = source;
|
|
403
|
+
continue;
|
|
404
|
+
}
|
|
405
|
+
if (serialize(current) === serialize(o.value))
|
|
406
|
+
continue; // agreement: the current source stays
|
|
407
|
+
const was = sourceAt(out, o.to);
|
|
408
|
+
const fo = facetTrust.get(o.to) ?? [];
|
|
409
|
+
const incomingRank = rank(incoming, order, fo);
|
|
410
|
+
const currentRank = rank({ source: was }, order, fo);
|
|
411
|
+
// A state facet moves: a later value of equal or higher trust is the transition, not a dispute (4.2).
|
|
412
|
+
if (transitions.has(o.to) && incomingRank <= currentRank) {
|
|
413
|
+
out.values[o.to] = o.value;
|
|
414
|
+
out.sources[o.to] = source;
|
|
415
|
+
continue;
|
|
416
|
+
}
|
|
417
|
+
const incomingWins = incomingRank < currentRank;
|
|
418
|
+
const loser = incomingWins ? { value: current, origin: was.origin, via: was.via } : { value: o.value, origin: source.origin, via: source.via };
|
|
419
|
+
if (incomingWins) {
|
|
420
|
+
out.values[o.to] = o.value;
|
|
421
|
+
out.sources[o.to] = source;
|
|
422
|
+
}
|
|
423
|
+
out.alternatives = { ...(out.alternatives ?? {}) };
|
|
424
|
+
out.alternatives[o.to] = [...(out.alternatives[o.to] ?? []), loser];
|
|
425
|
+
}
|
|
426
|
+
return out;
|
|
427
|
+
}
|
|
428
|
+
/** Bind incoming parts to existing ones: by the slot's match child, else review, else a new row. */
|
|
429
|
+
export function matchParts(r, incoming, dict) {
|
|
430
|
+
const slots = (r.wears ?? []).flatMap((w) => dict.classes.get(w)?.parts ?? []);
|
|
431
|
+
const existing = (r.parts ?? []).filter(isObj).map((p) => ({ p, matched: false }));
|
|
432
|
+
const result = new Map(existing.map(({ p }) => [String(p.$row), { $row: p.$row }]));
|
|
433
|
+
const review = [];
|
|
434
|
+
const minted = [];
|
|
435
|
+
const keys = existing.map(({ p }) => String(p.$row));
|
|
436
|
+
const mint = () => {
|
|
437
|
+
const m = keys.map((k) => k.match(/^(\D+)(\d+)$/)).find(Boolean);
|
|
438
|
+
const prefix = m?.[1] ?? "r";
|
|
439
|
+
let n = Math.max(0, ...keys.map((k) => Number(k.match(/(\d+)$/)?.[1] ?? 0))) + 1;
|
|
440
|
+
while (keys.includes(`${prefix}${n}`))
|
|
441
|
+
n++;
|
|
442
|
+
keys.push(`${prefix}${n}`);
|
|
443
|
+
return `${prefix}${n}`;
|
|
444
|
+
};
|
|
445
|
+
for (const inc of incoming) {
|
|
446
|
+
const slot = slots.find((s) => s.slot === inc.slot);
|
|
447
|
+
const inSlot = existing.filter(({ p }) => Array.isArray(p.wears) && slot && p.wears.includes(slot.wears));
|
|
448
|
+
const by = slot?.match;
|
|
449
|
+
const want = by && typeof inc[by] === "string" ? foldKey(inc[by]) : null;
|
|
450
|
+
const hit = want ? inSlot.find(({ p, matched }) => !matched && isObj(p.values) && foldKey(String(p.values[by] ?? "")) === want) : undefined;
|
|
451
|
+
const label = String(by ? inc[by] : inc.slot);
|
|
452
|
+
if (hit) {
|
|
453
|
+
hit.matched = true;
|
|
454
|
+
result.set(String(hit.p.$row), { $row: hit.p.$row, matched: by, from: label });
|
|
455
|
+
continue;
|
|
456
|
+
}
|
|
457
|
+
const could = inSlot.filter((x) => !x.matched);
|
|
458
|
+
if (could.length) {
|
|
459
|
+
const names = could.map(({ p }) => String(p.$row)).join(", ");
|
|
460
|
+
review.push({ address: "parts", from: label, reason: `could be the same part as ${names} (${inc.slot}); not matched by ${by ?? "identity"}` });
|
|
461
|
+
continue;
|
|
462
|
+
}
|
|
463
|
+
minted.push({ $row: mint(), new: true, from: label });
|
|
464
|
+
}
|
|
465
|
+
return { parts: [...result.values(), ...minted], review };
|
|
466
|
+
}
|
|
467
|
+
/** Validate a value from observations: independent witnesses for and against, vetoes, and the state. */
|
|
468
|
+
export function validate(r, address, observations, confirmAt = 2, splitAt = 3) {
|
|
469
|
+
const current = serialize(r.values[address] ?? "");
|
|
470
|
+
const mine = observations.filter((o) => o.supports === r.id && o.address === address);
|
|
471
|
+
const witness = (o) => `${o.on}|${o["evidence-type"] ?? ""}`;
|
|
472
|
+
const forW = new Set();
|
|
473
|
+
const againstW = new Set();
|
|
474
|
+
const vetoes = [];
|
|
475
|
+
const against = new Map();
|
|
476
|
+
for (const o of mine) {
|
|
477
|
+
if (o.veto !== undefined) {
|
|
478
|
+
if (serialize(o.veto) === current)
|
|
479
|
+
vetoes.push(o);
|
|
480
|
+
continue;
|
|
481
|
+
}
|
|
482
|
+
if (serialize(o.value) === current)
|
|
483
|
+
forW.add(witness(o));
|
|
484
|
+
else {
|
|
485
|
+
againstW.add(witness(o));
|
|
486
|
+
const k = serialize(o.value);
|
|
487
|
+
const g = against.get(k) ?? { value: o.value, instances: new Set() };
|
|
488
|
+
g.instances.add(o.on);
|
|
489
|
+
against.set(k, g);
|
|
490
|
+
}
|
|
491
|
+
}
|
|
492
|
+
const out = {
|
|
493
|
+
record: r.id,
|
|
494
|
+
address,
|
|
495
|
+
"witnesses-for": forW.size,
|
|
496
|
+
"witnesses-against": againstW.size,
|
|
497
|
+
vetoes: vetoes.length,
|
|
498
|
+
};
|
|
499
|
+
if (vetoes.length) {
|
|
500
|
+
out.state = "contradicted";
|
|
501
|
+
out.cites = { veto: vetoes[0].obs };
|
|
502
|
+
}
|
|
503
|
+
else if (againstW.size)
|
|
504
|
+
out.state = "contradicted";
|
|
505
|
+
else if (forW.size >= confirmAt)
|
|
506
|
+
out.state = "confirmed";
|
|
507
|
+
else
|
|
508
|
+
out.state = "unobserved";
|
|
509
|
+
out.alternatives = [...against.values()].map((g) => ({ value: g.value, origin: "observed" }));
|
|
510
|
+
out["split-proposed"] = [...against.values()].some((g) => g.instances.size >= splitAt);
|
|
511
|
+
out.clusters = [...against.values()].map((g) => ({ value: g.value, instances: [...g.instances].sort() }));
|
|
512
|
+
return out;
|
|
513
|
+
}
|
|
514
|
+
/**
|
|
515
|
+
* Version splits proposed (9.7.3): for each value an address's observations contradict, a cluster of at
|
|
516
|
+
* least `splitAt` instances agreeing with each other is a review item `split:<record>`; nothing splits
|
|
517
|
+
* on its own.
|
|
518
|
+
*/
|
|
519
|
+
export function proposeSplit(records, observations, splitAt = 3) {
|
|
520
|
+
const out = [];
|
|
521
|
+
const seen = new Set();
|
|
522
|
+
for (const o of observations) {
|
|
523
|
+
const key = `${o.supports}|${o.address}`;
|
|
524
|
+
if (seen.has(key))
|
|
525
|
+
continue;
|
|
526
|
+
seen.add(key);
|
|
527
|
+
const r = records.find((x) => x.id === o.supports);
|
|
528
|
+
if (!r)
|
|
529
|
+
continue;
|
|
530
|
+
const v = validate(r, o.address, observations, 2, splitAt);
|
|
531
|
+
for (const c of v.clusters ?? []) {
|
|
532
|
+
if (c.instances.length >= splitAt)
|
|
533
|
+
out.push({ key: `split:${r.id}`, record: r.id, address: o.address, value: c.value, instances: c.instances });
|
|
534
|
+
}
|
|
535
|
+
}
|
|
536
|
+
return out;
|
|
537
|
+
}
|
|
538
|
+
//# sourceMappingURL=store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/store.ts"],"names":[],"mappings":"AAAA,sGAAsG;AACtG,qGAAqG;AACrG,wGAAwG;AAExG,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAClE,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAA+C,aAAa,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAChG,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAClE,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAEpC,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAElD,MAAM,KAAK,GAAG,CAAC,CAAmB,EAAmB,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;AAEjH,gFAAgF;AAEhF,MAAM,UAAU,MAAM,CAAC,IAAY;IACjC,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AACjE,CAAC;AAED,yGAAyG;AACzG,MAAM,UAAU,SAAS,CAAC,CAAO;IAC/B,IAAI,KAAK,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,CAAC,QAAQ,KAAK,QAAQ;QAAE,OAAO,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;IAC1F,OAAO,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;AAC9B,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,SAAS,CAAC,KAAiB;IACzC,IAAI,OAAO,KAAK,CAAC,QAAQ,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;IACtF,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,IAAI,EAAE,GAAG,KAAK,CAAC;IACrC,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC;QAAE,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAC/F,OAAO,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;AACjC,CAAC;AAOD,iHAAiH;AACjH,MAAM,UAAU,MAAM,CAAC,IAAU,EAAE,KAAa,EAAE,EAAW;IAC3D,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;IACtB,IAAI,CAAC,CAAC;QAAE,OAAO,SAAS,CAAC;IACzB,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACxC,IAAI,EAAE,EAAE,CAAC;QACP,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;QAC1F,IAAI,KAAK,CAAC,MAAM;YAAE,OAAO,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IACxC,CAAC;IACD,OAAO,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;AAC9D,CAAC;AAED,8FAA8F;AAC9F,MAAM,UAAU,SAAS,CAAC,KAAiB,EAAE,KAAa,EAAE,IAAU;IACpE,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,OAAO,KAAK,CAAC,EAAE,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IACnF,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,KAAK,SAAS,IAAI,OAAO,KAAK,CAAC,GAAG,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAC7E,MAAM,GAAG,GAAG,eAAe,CAAC,EAAE,GAAG,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;IACjG,OAAO,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC,CAAC;AACtG,CAAC;AAED,gGAAgG;AAChG,MAAM,UAAU,WAAW,CAAC,OAAqB,EAAE,IAAW;IAC5D,IAAI,KAAK,GAAG,EAAE,CAAC;IACf,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACxC,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAe,CAAC;QACnC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,UAAU,SAAS,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAe,CAAC,EAAE;YAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;QACjJ,IAAI,OAAO,CAAC,CAAC,KAAK,KAAK,QAAQ;YAAE,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC;QACjD,IAAI,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC;YAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC;IAC5H,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;AACzB,CAAC;AAwCD,SAAS,OAAO,CAAC,KAAkC;IACjD,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QACrB,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;QAC9C,MAAM,MAAM,GAAG,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,GAAG,CAAqB,CAAC,CAAC;QAC9F,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;IACvF,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,UAAU,CAAC,IAAY,EAAE,IAAY;IAC5C,MAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAChC,IAAI,EAAE,GAAG,CAAC;QAAE,MAAM,IAAI,WAAW,CAAC,+BAA+B,IAAI,EAAE,EAAE,IAAI,CAAC,CAAC;IAC/E,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,EAAE,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;AAC/D,CAAC;AAED,MAAM,GAAG,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAY,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAE/E,+BAA+B;AAC/B,MAAM,UAAU,aAAa,CAAC,MAAc;IAC1C,MAAM,GAAG,GAAe,EAAE,CAAC;IAC3B,KAAK,MAAM,IAAI,IAAI,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QACpC,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,IAAI,IAAI,CAAC,GAAG,KAAK,UAAU;YAAE,SAAS;QAC9D,MAAM,CAAC,GAAa;YAClB,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE;YACvB,IAAI,EAAE,SAAS;YACf,MAAM,EAAE,EAAE;YACV,KAAK,EAAE,EAAE;YACT,MAAM,EAAE,EAAE;YACV,MAAM,EAAE,EAAE;YACV,KAAK,EAAE,EAAE;YACT,MAAM,EAAE,EAAE;YACV,OAAO,EAAE,EAAE;YACX,MAAM,EAAE,IAAI;YACZ,KAAK,EAAE,OAAO;YACd,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,KAAK,EAAE,EAAE;YACT,KAAK,EAAE,EAAE;YACT,MAAM,EAAE,EAAE;YACV,KAAK,EAAE,EAAE;YACT,SAAS,EAAE,EAAE;SACd,CAAC;QACF,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAC9B,IAAI,CAAC,CAAC,CAAC,GAAG;gBAAE,SAAS;YACrB,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;YAC5B,MAAM,IAAI,GAAG,GAAG,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YAClE,IAAI,CAAC,CAAC,GAAG,KAAK,OAAO,EAAE,CAAC;gBACtB,yFAAyF;gBACzF,IAAI,CAAC,CAAC,KAAK;oBAAE,CAAC,CAAC,KAAK,GAAG,QAAQ,CAAC,CAAC,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;qBACtF,CAAC;oBACJ,IAAI,OAA2B,CAAC;oBAChC,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAC;wBAC3B,IAAI,CAAC,CAAC,IAAI,KAAK,MAAM,IAAI,CAAC,CAAC,GAAG,KAAK,SAAS,EAAE,CAAC;4BAC7C,OAAO,GAAG,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;4BACvB,SAAS;wBACX,CAAC;wBACD,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC;oBACvD,CAAC;gBACH,CAAC;gBACD,SAAS;YACX,CAAC;YACD,IAAI,CAAC,CAAC,GAAG,KAAK,OAAO;gBAAE,CAAC,CAAC,KAAK,GAAG,IAAI,EAAE,CAAC;iBACnC,IAAI,CAAC,CAAC,GAAG,KAAK,KAAK;gBAAE,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,KAAK,CAAC;iBACrC,IAAI,CAAC,CAAC,GAAG,KAAK,MAAM;gBAAE,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC;iBACvC,IAAI,CAAC,CAAC,GAAG,KAAK,MAAM;gBAAE,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC;iBACvC,IAAI,CAAC,CAAC,GAAG,KAAK,IAAI;gBAAE,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC;iBACnC,IAAI,CAAC,CAAC,GAAG,KAAK,MAAM;gBAAE,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC;iBACvC,IAAI,CAAC,CAAC,GAAG,KAAK,MAAM;gBAAE,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC;iBACvC,IAAI,CAAC,CAAC,GAAG,KAAK,KAAK;gBAAE,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,KAAK,CAAC;iBACrC,IAAI,CAAC,CAAC,GAAG,KAAK,QAAQ;gBAAE,CAAC,CAAC,MAAM,GAAG,IAAI,EAAE,CAAC;iBAC1C,IAAI,CAAC,CAAC,GAAG,KAAK,OAAO,EAAE,CAAC;gBAC3B,2FAA2F;gBAC3F,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,QAAQ;oBAAE,IAAI,CAAC,CAAC,GAAG;wBAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;gBACvE,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE,EAAE,CAAC;oBAAC,MAAM,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;oBAAC,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM;wBAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBAAC,CAAC;YACtH,CAAC;YACD,IAAI,CAAC,CAAC,GAAG,KAAK,MAAM;gBAAE,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC;iBAClC,IAAI,CAAC,CAAC,GAAG,KAAK,QAAQ;gBAAE,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,KAAK,CAAC;iBAC3C,IAAI,CAAC,CAAC,GAAG,KAAK,QAAQ;gBAAE,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,KAAK,CAAC;iBAC3C,IAAI,CAAC,CAAC,GAAG,KAAK,OAAO;gBAAE,CAAC,CAAC,KAAK,GAAG,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;iBACrD,IAAI,CAAC,CAAC,GAAG,KAAK,QAAQ;gBAAE,CAAC,CAAC,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;iBACvD,IAAI,CAAC,CAAC,GAAG,KAAK,QAAQ,EAAE,CAAC;gBAC5B,yFAAyF;gBACzF,CAAC,CAAC,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;gBAC/B,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;gBAClE,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,IAAI,CAAqB,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;YACpL,CAAC;iBACI,IAAI,CAAC,CAAC,GAAG,KAAK,QAAQ;gBAAE,CAAC,CAAC,MAAM,GAAG,IAAI,EAAE,CAAC;iBAC1C,IAAI,CAAC,CAAC,GAAG,KAAK,UAAU;gBAAE,CAAC,CAAC,OAAO,GAAG,IAAI,EAAE,CAAC;iBAC7C,IAAI,CAAC,CAAC,GAAG,KAAK,QAAQ;gBAAE,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,KAAK,KAAK,IAAI,CAAC;iBACpD,IAAI,CAAC,CAAC,GAAG,KAAK,OAAO;gBAAE,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC;YAC9C,uGAAuG;YACvG,IAAI,CAAC,CAAC,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC;gBAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,OAAO,IAAI,CAAC,CAAC,GAAG,KAAK,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;QAC7R,CAAC;QACD,IAAI,CAAC,CAAC,CAAC,MAAM;YAAE,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC;QACtE,IAAI,CAAC,CAAC,OAAO,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,MAAM;YAAE,MAAM,IAAI,WAAW,CAAC,GAAG,CAAC,CAAC,IAAI,yCAAyC,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;QACrH,yGAAyG;QACzG,IAAI,CAAC,CAAC,IAAI,KAAK,MAAM,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,IAAI,CAAC,CAAC,KAAK,CAAC,MAAM;YAAE,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,EAAwB,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;QAC3L,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACd,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,qFAAqF;AACrF,MAAM,UAAU,SAAS,CAAC,IAAY;IACpC,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,IAAI,GAAG,GAAG,EAAE,CAAC;IACb,IAAI,MAAM,GAAG,KAAK,CAAC;IACnB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC,CAAW,CAAC;QAC7B,IAAI,EAAE,KAAK,GAAG,EAAE,CAAC;YACf,MAAM,GAAG,CAAC,MAAM,CAAC;YACjB,SAAS;QACX,CAAC;QACD,IAAI,EAAE,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;YAC1B,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACd,GAAG,GAAG,EAAE,CAAC;YACT,SAAS;QACX,CAAC;QACD,GAAG,IAAI,EAAE,CAAC;IACZ,CAAC;IACD,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACd,OAAO,GAAG,CAAC;AACb,CAAC;AAED,yFAAyF;AACzF,SAAS,OAAO,CAAC,IAAY;IAC3B,OAAO,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;AACnE,CAAC;AAED,mIAAmI;AACnI,MAAM,WAAW,GAAG,CAAC,CAAO,EAAW,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;AAEpG,SAAS,MAAM,CAAC,GAAS,EAAE,MAAM,GAAG,EAAE,EAAE,QAAmC,GAAG,EAAE,CAAC,KAAK;IACpF,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,WAAW,CAAC,GAAG,CAAC;QAAE,OAAO,CAAC,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC;IAC5D,OAAO,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE;QAC5C,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QAC1D,iGAAiG;QACjG,OAAO,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAsB,CAAC;IACzG,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,QAAQ,CAAC,CAAS,EAAE,CAAS;IACpC,OAAO,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,KAAK,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;AAC7D,CAAC;AAeD,uGAAuG;AACvG,SAAS,MAAM,CAAC,CAAQ,EAAE,GAAS,EAAE,GAAwB,EAAE,IAAgB;IAC7E,6GAA6G;IAC7G,8GAA8G;IAC9G,IAAI,YAAgC,CAAC;IACrC,MAAM,GAAG,GAAG,CAAC,CAAO,EAAQ,EAAE;QAC5B,IAAI,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,SAAS,IAAI,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC;YAAE,OAAO,CAAC,CAAC;QAChF,kGAAkG;QAClG,uFAAuF;QACvF,IAAI,CAAC,CAAC,IAAI,KAAK,UAAU,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;YACtC,MAAM,GAAG,GAAe,EAAE,CAAC;YAC3B,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;gBACvC,MAAM,KAAK,GAAG,CAAC,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;gBACjC,IAAI,CAAC,KAAK,EAAE,CAAC;oBACX,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;oBACX,SAAS;gBACX,CAAC;gBACD,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC;gBACjD,IAAI,MAAM,CAAC,OAAO,KAAK,eAAe;oBAAE,YAAY,GAAG,YAAY,IAAI,KAAK,CAAC,GAAG,CAAC;gBACjF,GAAG,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC;YACxB,CAAC;YACD,OAAO,GAAG,CAAC;QACb,CAAC;QACD,IAAI,IAAI,GAAG,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;QACpD,MAAM,EAAE,GAAG,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,MAAM,KAAK,IAAI,CAAC,CAAC;QAC3D,IAAI,EAAE;YAAE,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;QACrB,OAAO,SAAS,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,CAAC;IAC1C,CAAC,CAAC;IACF,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC;QAC7B,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;YAChB,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;YACjB,OAAO,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACpC,CAAC,CAAC;QACJ,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACb,MAAM,KAAK,GAAG,SAAS,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IACvC,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IACrD,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACnD,IAAI,YAAY;QAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,eAAe,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,EAAE,CAAC;IAC5F,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,eAAe,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC;IACnJ,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE,KAAK,CAAC;IACtD,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;AAC9D,CAAC;AAED,kGAAkG;AAClG,MAAM,UAAU,KAAK,CAAC,KAAiB,EAAE,IAAY;IACnD,MAAM,IAAI,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC9D,IAAI,CAAC;QACH,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,WAAW,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;IAC/F,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;IAC/E,CAAC;AACH,CAAC;AAED,2GAA2G;AAC3G,MAAM,UAAU,MAAM,CAAC,MAAiD,EAAE,CAAW,EAAE,IAAgB;IACrG,MAAM,KAAK,GAAG,OAAO,CAAC,CAAC,EAAE,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,GAAG,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;IAC3E,MAAM,OAAO,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC,EAAE,EAAE,QAAQ,EAAE,KAAK,CAAC,QAA2B,EAAE,QAAQ,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IAC/G,OAAO,EAAE,GAAG,MAAM,EAAE,OAAO,EAAE,CAAC;AAChC,CAAC;AAED,mGAAmG;AACnG,MAAM,UAAU,WAAW,CAAC,OAAqD,EAAE,KAAK,GAAG,CAAC;IAC1F,MAAM,MAAM,GAAG,IAAI,GAAG,EAA0E,CAAC;IACjG,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAC;YAC3B,IAAI,CAAC,CAAC,OAAO,KAAK,SAAS,IAAI,CAAC,CAAC,OAAO,KAAK,KAAK;gBAAE,SAAS;YAC7D,iFAAiF;YACjF,MAAM,GAAG,GAAG,CAAC,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,QAAQ,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC;YAC9E,MAAM,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,GAAG,EAAU,EAAE,MAAM,EAAE,IAAI,GAAG,EAAU,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC;YAC3G,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;YACrB,IAAI,CAAC,CAAC,KAAK,KAAK,SAAS;gBAAE,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;YAC5D,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QACrB,CAAC;IACH,CAAC;IACD,MAAM,IAAI,GAAG,CAAC,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACrH,OAAO;QACL,QAAQ,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;QAC/G,kGAAkG;QAClG,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,SAAS,IAAI,CAAC,CAAC,OAAO,CAAC,IAAI,IAAI,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC,CAAC;KAChK,CAAC;AACJ,CAAC;AAED,0GAA0G;AAC1G,MAAM,UAAU,OAAO,CAAC,CAAW,EAAE,IAAY,EAAE,SAAiB,EAAE,IAAgB,EAAE,QAAQ,GAAG,KAAK;IACtG,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAS,CAAC;IACzC,MAAM,QAAQ,GAAoB,EAAE,CAAC;IACrC,KAAK,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC/F,0GAA0G;QAC1G,IAAI,GAAG,KAAK,EAAE,EAAE,CAAC;YACf,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,CAAC;YAClD,SAAS;QACX,CAAC;QACD,IAAI,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC;YACzD,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,CAAC;YAClD,SAAS;QACX,CAAC;QACD,MAAM,GAAG,GAAG,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;QACxD,IAAI,GAAG,EAAE,CAAC;YACR,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAClC,IAAI,CAAC,CAAC,EAAE,CAAC;gBACP,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;gBAC1E,SAAS;YACX,CAAC;YACD,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,MAAM,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;YAC5D,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,CAAC,OAAO,KAAK,eAAe,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;YAC3J,SAAS;QACX,CAAC;QACD,IAAI,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC;YAC7C,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAW,CAAC;YAC9C,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC;gBAAE,MAAM,IAAI,WAAW,CAAC,iBAAiB,IAAI,sBAAsB,IAAI,mBAAmB,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;YACpI,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,CAAC,CAAC,MAAM,IAAI,IAAI,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;YACzF,SAAS;QACX,CAAC;QACD,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,CAAC;IACpD,CAAC;IACD,OAAO;QACL,MAAM,EAAE,QAAQ;QAChB,QAAQ,EAAE,CAAC,CAAC,IAAI;QAChB,GAAG,EAAE,SAAS;QACd,GAAG,EAAE,EAAE,IAAI,EAAE,kBAAkB,EAAE,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE;QAC7D,QAAQ;KACT,CAAC;AACJ,CAAC;AAED,gFAAgF;AAEhF,MAAM,aAAa,GAAG,CAAC,QAAQ,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,SAAS,CAAC,CAAC;AAKhF,SAAS,OAAO,CAAC,GAAQ,EAAE,KAAe;IACxC,MAAM,IAAI,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,EAAE,GAAG,CAAC,QAAQ,IAAI,EAAE,EAAE,GAAG,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE,EAAE,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACzH,MAAM,EAAE,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,6EAA6E;AAC7E,SAAS,IAAI,CAAC,GAAQ,EAAE,KAAe,EAAE,aAAuB,EAAE;IAChE,MAAM,CAAC,GAAG,OAAO,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;IACnC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,CAAC,CAAC;IACrB,MAAM,CAAC,GAAG,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IAC9B,OAAO,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;AACzD,CAAC;AAED,SAAS,QAAQ,CAAC,CAAS,EAAE,OAAe;IAC1C,OAAO,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC,GAAG,CAAC,CAAC;AAClD,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,IAAI,CAClB,CAAS,EACT,MAA2I,EAC3I,MAAc,EACd,QAAkB,aAAa,EAC/B,aAAoC,IAAI,GAAG,EAAE;AAC7C,sHAAsH;AACtH,cAA2B,IAAI,GAAG,EAAE;IAEpC,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,aAAa,CAAC;IACnD,MAAM,QAAQ,GAAQ,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;IACxI,MAAM,GAAG,GAA8D;QACrE,GAAG,CAAC;QACJ,MAAM,EAAE,EAAE,GAAG,CAAC,CAAC,MAAM,EAAE;QACvB,OAAO,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC,OAAO,IAAI,EAAE,CAAC,EAAE;KAClC,CAAC;IACF,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;QAChC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,KAAK,KAAK,SAAS,IAAI,CAAC,CAAC,UAAU,EAAE,UAAU,EAAE,KAAK,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC;YAAE,SAAS;QACrG,MAAM,OAAO,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACjC,IAAI,OAAO,KAAK,SAAS,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS,CAAC,EAAE,CAAC;YAC9E,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC;YAC1B,GAAG,CAAC,OAAmC,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC;YACxD,SAAS;QACX,CAAC;QACD,IAAI,SAAS,CAAC,OAAO,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC;YAAE,SAAS,CAAC,sCAAsC;QAC/F,MAAM,GAAG,GAAG,QAAQ,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAW,CAAC;QAC1C,MAAM,EAAE,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC;QACtC,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;QAC/C,MAAM,WAAW,GAAG,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;QACrD,sGAAsG;QACtG,IAAI,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,YAAY,IAAI,WAAW,EAAE,CAAC;YACzD,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC;YAC1B,GAAG,CAAC,OAAmC,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC;YACxD,SAAS;QACX,CAAC;QACD,MAAM,YAAY,GAAG,YAAY,GAAG,WAAW,CAAC;QAChD,MAAM,KAAK,GAAe,YAAY,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,EAAE,CAAC;QAC3J,IAAI,YAAY,EAAE,CAAC;YACjB,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC;YAC1B,GAAG,CAAC,OAAmC,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC;QAC1D,CAAC;QACD,GAAG,CAAC,YAAY,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC,YAAY,IAAI,EAAE,CAAC,EAAE,CAAC;QACnD,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC;IACtE,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAMD,oGAAoG;AACpG,MAAM,UAAU,UAAU,CAAC,CAAS,EAAE,QAA+C,EAAE,IAAgB;IACrG,MAAM,KAAK,GAAG,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC;IAC/E,MAAM,QAAQ,GAAG,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;IACnF,MAAM,MAAM,GAAG,IAAI,GAAG,CAAqB,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,IAAY,EAAE,CAAC,CAAC,CAAC,CAAC;IAChH,MAAM,MAAM,GAAiB,EAAE,CAAC;IAChC,MAAM,MAAM,GAAiB,EAAE,CAAC;IAChC,MAAM,IAAI,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IACrD,MAAM,IAAI,GAAG,GAAG,EAAE;QAChB,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACjE,MAAM,MAAM,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC;QAC7B,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QACjF,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,MAAM,GAAG,CAAC,EAAE,CAAC;YAAE,CAAC,EAAE,CAAC;QAC3C,IAAI,CAAC,IAAI,CAAC,GAAG,MAAM,GAAG,CAAC,EAAE,CAAC,CAAC;QAC3B,OAAO,GAAG,MAAM,GAAG,CAAC,EAAE,CAAC;IACzB,CAAC,CAAC;IACF,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;QAC3B,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,GAAG,CAAC,IAAI,CAAC,CAAC;QACpD,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,IAAI,IAAI,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;QAC1G,MAAM,EAAE,GAAG,IAAI,EAAE,KAAK,CAAC;QACvB,MAAM,IAAI,GAAG,EAAE,IAAI,OAAO,GAAG,CAAC,EAAE,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAW,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QACnF,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC,OAAO,IAAI,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,EAAY,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QACtJ,MAAM,KAAK,GAAG,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC9C,IAAI,GAAG,EAAE,CAAC;YACR,GAAG,CAAC,OAAO,GAAG,IAAI,CAAC;YACnB,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,IAAY,EAAE,OAAO,EAAE,EAAY,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;YACjG,SAAS;QACX,CAAC;QACD,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;QAC/C,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;YACjB,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC9D,MAAM,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,6BAA6B,KAAK,KAAK,GAAG,CAAC,IAAI,qBAAqB,EAAE,IAAI,UAAU,EAAE,EAAE,CAAC,CAAC;YAC/I,SAAS;QACX,CAAC;QACD,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IACxD,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,EAAE,GAAG,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;AAC5D,CAAC;AAMD,wGAAwG;AACxG,MAAM,UAAU,QAAQ,CAAC,CAAS,EAAE,OAAe,EAAE,YAA2B,EAAE,SAAS,GAAG,CAAC,EAAE,OAAO,GAAG,CAAC;IAC1G,MAAM,OAAO,GAAG,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;IACnD,MAAM,IAAI,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,OAAO,KAAK,OAAO,CAAC,CAAC;IACtF,MAAM,OAAO,GAAG,CAAC,CAAc,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,eAAe,CAAC,IAAI,EAAE,EAAE,CAAC;IAC1E,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAU,CAAC;IACnC,MAAM,MAAM,GAAkB,EAAE,CAAC;IACjC,MAAM,OAAO,GAAG,IAAI,GAAG,EAAmD,CAAC;IAC3E,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;QACrB,IAAI,CAAC,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YACzB,IAAI,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,OAAO;gBAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClD,SAAS;QACX,CAAC;QACD,IAAI,SAAS,CAAC,CAAC,CAAC,KAAa,CAAC,KAAK,OAAO;YAAE,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;aAC5D,CAAC;YACJ,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;YACzB,MAAM,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,KAAa,CAAC,CAAC;YACrC,MAAM,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,KAAa,EAAE,SAAS,EAAE,IAAI,GAAG,EAAU,EAAE,CAAC;YACrF,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YACtB,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACpB,CAAC;IACH,CAAC;IACD,MAAM,GAAG,GAAe;QACtB,MAAM,EAAE,CAAC,CAAC,EAAE;QACZ,OAAO;QACP,eAAe,EAAE,IAAI,CAAC,IAAI;QAC1B,mBAAmB,EAAE,QAAQ,CAAC,IAAI;QAClC,MAAM,EAAE,MAAM,CAAC,MAAM;KACtB,CAAC;IACF,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;QAClB,GAAG,CAAC,KAAK,GAAG,cAAc,CAAC;QAC3B,GAAG,CAAC,KAAK,GAAG,EAAE,IAAI,EAAG,MAAM,CAAC,CAAC,CAAiB,CAAC,GAAG,EAAE,CAAC;IACvD,CAAC;SAAM,IAAI,QAAQ,CAAC,IAAI;QAAE,GAAG,CAAC,KAAK,GAAG,cAAc,CAAC;SAChD,IAAI,IAAI,CAAC,IAAI,IAAI,SAAS;QAAE,GAAG,CAAC,KAAK,GAAG,WAAW,CAAC;;QACpD,GAAG,CAAC,KAAK,GAAG,YAAY,CAAC;IAC9B,GAAG,CAAC,YAAY,GAAG,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC;IAC9F,GAAG,CAAC,gBAAgB,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,IAAI,OAAO,CAAC,CAAC;IACvF,GAAG,CAAC,QAAQ,GAAG,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,SAAS,EAAE,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC;IAC1G,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,YAAY,CAAC,OAAiB,EAAE,YAA2B,EAAE,OAAO,GAAG,CAAC;IACtF,MAAM,GAAG,GAAiB,EAAE,CAAC;IAC7B,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,KAAK,MAAM,CAAC,IAAI,YAAY,EAAE,CAAC;QAC7B,MAAM,GAAG,GAAG,GAAG,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC;QACzC,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;YAAE,SAAS;QAC5B,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACd,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,QAAQ,CAAC,CAAC;QACnD,IAAI,CAAC,CAAC;YAAE,SAAS;QACjB,MAAM,CAAC,GAAG,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,OAAO,EAAE,YAAY,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC;QAC3D,KAAK,MAAM,CAAC,IAAK,CAAC,CAAC,QAAmD,IAAI,EAAE,EAAE,CAAC;YAC7E,IAAI,CAAC,CAAC,SAAS,CAAC,MAAM,IAAI,OAAO;gBAAE,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,SAAS,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC;QAClJ,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
export declare class CrubalError extends Error {
|
|
2
|
+
readonly line: number | undefined;
|
|
3
|
+
constructor(message: string, line?: number);
|
|
4
|
+
}
|
|
5
|
+
export type Node = {
|
|
6
|
+
/** "pair" is `key: value` or `key:`; "item" is a `- ` list item; "line" is anything else. */
|
|
7
|
+
kind: "pair" | "item" | "line";
|
|
8
|
+
/** The key of a pair; null otherwise. */
|
|
9
|
+
key: string | null;
|
|
10
|
+
/** The text after the separator (pair), after `- ` (item, when it isn't a pair), or the whole line. */
|
|
11
|
+
value: string;
|
|
12
|
+
/** The line's whole text, comment and indentation removed. */
|
|
13
|
+
text: string;
|
|
14
|
+
line: number;
|
|
15
|
+
/** The column the line's text starts at. */
|
|
16
|
+
indent: number;
|
|
17
|
+
children: Node[];
|
|
18
|
+
/** A long-text block (2.4.1): `value` is the block's text, taken raw, and `detail` what followed the `|`. */
|
|
19
|
+
block?: true;
|
|
20
|
+
detail?: string;
|
|
21
|
+
};
|
|
22
|
+
/** Remove a `//` comment that starts the line or follows white space, outside quotes. */
|
|
23
|
+
export declare function stripComment(line: string): string;
|
|
24
|
+
/**
|
|
25
|
+
* Split a line into a pair at the separator (spec 2.1): the first `: ` (colon then space), or a colon at
|
|
26
|
+
* the end of the line. A colon inside quotes never separates.
|
|
27
|
+
*/
|
|
28
|
+
export declare function splitPair(text: string): {
|
|
29
|
+
key: string;
|
|
30
|
+
value: string;
|
|
31
|
+
} | null;
|
|
32
|
+
/** The lines inside a node, as written: each with its indentation relative to the first, comments removed. */
|
|
33
|
+
export declare function innerText(node: Node): string;
|
|
34
|
+
/** Read text into a tree of nodes. */
|
|
35
|
+
export declare function readTree(source: string): Node[];
|