@cello-protocol/daemon 0.0.121 → 0.0.123
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/dist/daemon.js +65 -12
- package/dist/daemon.js.map +1 -1
- package/dist/document-engine.d.ts.map +1 -1
- package/dist/document-engine.js +10 -4
- package/dist/document-engine.js.map +1 -1
- package/dist/document-gate.d.ts +139 -0
- package/dist/document-gate.d.ts.map +1 -0
- package/dist/document-gate.js +465 -0
- package/dist/document-gate.js.map +1 -0
- package/dist/document-write-path.d.ts +84 -0
- package/dist/document-write-path.d.ts.map +1 -0
- package/dist/document-write-path.js +445 -0
- package/dist/document-write-path.js.map +1 -0
- package/dist/reconnect-drain.d.ts +7 -0
- package/dist/reconnect-drain.d.ts.map +1 -1
- package/dist/reconnect-drain.js +18 -4
- package/dist/reconnect-drain.js.map +1 -1
- package/dist/retry-queue.d.ts +9 -1
- package/dist/retry-queue.d.ts.map +1 -1
- package/dist/retry-queue.js +38 -9
- package/dist/retry-queue.js.map +1 -1
- package/dist/session-content-handlers.d.ts.map +1 -1
- package/dist/session-content-handlers.js +7 -1
- package/dist/session-content-handlers.js.map +1 -1
- package/dist/session-node-manager.d.ts +4 -1
- package/dist/session-node-manager.d.ts.map +1 -1
- package/dist/session-node-manager.js +64 -8
- package/dist/session-node-manager.js.map +1 -1
- package/package.json +4 -4
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"document-engine.d.ts","sourceRoot":"","sources":["../src/document-engine.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAEH,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC;AACzB,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC/D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAEzC,MAAM,MAAM,qBAAqB,GAC7B,2BAA2B,GAC3B,2BAA2B,GAC3B,2BAA2B,GAC3B,yCAAyC,GACzC,6BAA6B,GAC7B,8BAA8B,GAC9B,0BAA0B,CAAC;AAE/B,MAAM,MAAM,oBAAoB,GAC5B;IAAE,EAAE,EAAE,IAAI,CAAA;CAAE;AACd,kEAAkE;GAChE;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,qBAAqB,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAElE;oDACoD;AACpD,qBAAa,mBAAoB,SAAQ,KAAK;IAC5C,QAAQ,CAAC,MAAM,EAAE,qBAAqB,CAAC;IACvC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;gBACb,MAAM,EAAE,qBAAqB,EAAE,MAAM,CAAC,EAAE,MAAM;CAM3D;AAcD,qBAAa,cAAc;;gBAGb,MAAM,EAAE,MAAM;IAI1B,2EAA2E;IAC3E,IAAI,cAAc,IAAI,MAAM,CAE3B;IAED;;;;;;;;OAQG;IACH,cAAc,CAAC,eAAe,SAAK,GAAG,CAAC,CAAC,GAAG;IAM3C;;;;;;;OAOG;IACH,YAAY,CAAC,GAAG,EAAE,CAAC,CAAC,GAAG,GAAG,MAAM;IAIhC,kBAAkB,CAAC,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI;IAIjE,sFAAsF;IACtF,WAAW,CAAC,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,gBAAgB,CAAC,EAAE,UAAU,GAAG,UAAU;IAIlE,iBAAiB,CAAC,GAAG,EAAE,CAAC,CAAC,GAAG,GAAG,UAAU;IAIzC,QAAQ,CAAC,GAAG,EAAE,CAAC,CAAC,GAAG,GAAG;QAAE,MAAM,EAAE,UAAU,CAAC;QAAC,WAAW,EAAE,UAAU,CAAA;KAAE;IAIrE;;;;;OAKG;IACH,OAAO,CAAC,MAAM,EAAE,UAAU,GAAG,CAAC,CAAC,GAAG;IA4BlC;;;;;;OAMG;IACH;;;;;;;;;OASG;IACH,WAAW,CAAC,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,GAAG,oBAAoB;
|
|
1
|
+
{"version":3,"file":"document-engine.d.ts","sourceRoot":"","sources":["../src/document-engine.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAEH,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC;AACzB,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC/D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAEzC,MAAM,MAAM,qBAAqB,GAC7B,2BAA2B,GAC3B,2BAA2B,GAC3B,2BAA2B,GAC3B,yCAAyC,GACzC,6BAA6B,GAC7B,8BAA8B,GAC9B,0BAA0B,CAAC;AAE/B,MAAM,MAAM,oBAAoB,GAC5B;IAAE,EAAE,EAAE,IAAI,CAAA;CAAE;AACd,kEAAkE;GAChE;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,qBAAqB,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAElE;oDACoD;AACpD,qBAAa,mBAAoB,SAAQ,KAAK;IAC5C,QAAQ,CAAC,MAAM,EAAE,qBAAqB,CAAC;IACvC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;gBACb,MAAM,EAAE,qBAAqB,EAAE,MAAM,CAAC,EAAE,MAAM;CAM3D;AAcD,qBAAa,cAAc;;gBAGb,MAAM,EAAE,MAAM;IAI1B,2EAA2E;IAC3E,IAAI,cAAc,IAAI,MAAM,CAE3B;IAED;;;;;;;;OAQG;IACH,cAAc,CAAC,eAAe,SAAK,GAAG,CAAC,CAAC,GAAG;IAM3C;;;;;;;OAOG;IACH,YAAY,CAAC,GAAG,EAAE,CAAC,CAAC,GAAG,GAAG,MAAM;IAIhC,kBAAkB,CAAC,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI;IAIjE,sFAAsF;IACtF,WAAW,CAAC,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,gBAAgB,CAAC,EAAE,UAAU,GAAG,UAAU;IAIlE,iBAAiB,CAAC,GAAG,EAAE,CAAC,CAAC,GAAG,GAAG,UAAU;IAIzC,QAAQ,CAAC,GAAG,EAAE,CAAC,CAAC,GAAG,GAAG;QAAE,MAAM,EAAE,UAAU,CAAC;QAAC,WAAW,EAAE,UAAU,CAAA;KAAE;IAIrE;;;;;OAKG;IACH,OAAO,CAAC,MAAM,EAAE,UAAU,GAAG,CAAC,CAAC,GAAG;IA4BlC;;;;;;OAMG;IACH;;;;;;;;;OASG;IACH,WAAW,CAAC,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,GAAG,oBAAoB;IAmFjE,wEAAwE;IACxE,kBAAkB,CAAC,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,GAAG,IAAI;IAKxD;;;;;;;;;;;;;;;;;;;;OAoBG;IACH,MAAM,CAAC,SAAS,EAAE,SAAS,mBAAmB,EAAE,GAAG;QAAE,MAAM,EAAE,UAAU,CAAC;QAAC,WAAW,EAAE,UAAU,CAAA;KAAE;CA6CnG"}
|
package/dist/document-engine.js
CHANGED
|
@@ -171,8 +171,12 @@ export class DocumentEngine {
|
|
|
171
171
|
// otherwise BUFFER an out-of-order update and resolve it on the next state-vector exchange;
|
|
172
172
|
// this refuses instead. That is right for replay, where a gap means a corrupt log — a live
|
|
173
173
|
// receive path wanting buffer-and-re-request semantics needs its own entry point, not this one.
|
|
174
|
-
|
|
175
|
-
|
|
174
|
+
// BOTH pending sets: an update carrying a delete set for structs never seen leaves
|
|
175
|
+
// pendingStructs null and pendingDs populated, and retains just the same.
|
|
176
|
+
if (shadow.store.pendingStructs !== null || shadow.store.pendingDs !== null) {
|
|
177
|
+
return this.#refuse("document_update_unresolved_dependencies", shadow.store.pendingStructs
|
|
178
|
+
? `depends on ${shadow.store.pendingStructs.missing.size} client(s) whose earlier operations are absent`
|
|
179
|
+
: "carries a delete set referring to operations this document has never seen", update);
|
|
176
180
|
}
|
|
177
181
|
Y.applyUpdate(doc, update);
|
|
178
182
|
return { ok: true };
|
|
@@ -198,8 +202,10 @@ export class DocumentEngine {
|
|
|
198
202
|
catch (err) {
|
|
199
203
|
return this.#refuse("document_update_malformed", err instanceof Error ? err.message : String(err), update);
|
|
200
204
|
}
|
|
201
|
-
if (doc.store.pendingStructs !== null) {
|
|
202
|
-
return this.#refuse("document_update_unresolved_dependencies",
|
|
205
|
+
if (doc.store.pendingStructs !== null || doc.store.pendingDs !== null) {
|
|
206
|
+
return this.#refuse("document_update_unresolved_dependencies", doc.store.pendingStructs
|
|
207
|
+
? `depends on ${doc.store.pendingStructs.missing.size} client(s) whose earlier operations are absent`
|
|
208
|
+
: "carries a delete set referring to operations this document has never seen", update);
|
|
203
209
|
}
|
|
204
210
|
return { ok: true };
|
|
205
211
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"document-engine.js","sourceRoot":"","sources":["../src/document-engine.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"document-engine.js","sourceRoot":"","sources":["../src/document-engine.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DOD-DOC-GATE-1 — the validation gate (§3.2).
|
|
3
|
+
*
|
|
4
|
+
* arrive → shadow-apply → validate the PROJECTED DIFF → admit or quarantine
|
|
5
|
+
*
|
|
6
|
+
* The shadow document is rebuilt from ACCEPTED state and discarded. Validation asks a question;
|
|
7
|
+
* admitting is a separate, explicit act, so a refused update never touches the live document.
|
|
8
|
+
*
|
|
9
|
+
* ── WHY THE RULES ARE WHAT THEY ARE ───────────────────────────────────────────────────────────
|
|
10
|
+
*
|
|
11
|
+
* Every rule here answers something DOD-DOC-FUZZ-1 MEASURED against real Yjs, and six of the nine
|
|
12
|
+
* are the ACCEPT class — input `Y.applyUpdate` returns SUCCESS for. That matters because the V1
|
|
13
|
+
* posture is "cap, catch, contain" (§16.7-7), and none of its three legs catches an accept: the
|
|
14
|
+
* size cap sees a small update, the try/catch sees success, and "structural limits on the shadow"
|
|
15
|
+
* has nothing to measure because the shadow looks fine. Measured, in order:
|
|
16
|
+
*
|
|
17
|
+
* (a) an update whose dependencies never arrive is ACCEPTED and RETAINED forever — a peer
|
|
18
|
+
* streams those until the daemon dies, and a try/catch sees only success;
|
|
19
|
+
* (b) an update carries NO document identity, so one built on a different document merges
|
|
20
|
+
* silently — binding is out-of-band work the gate must do;
|
|
21
|
+
* (c) V2-format bytes are accepted by the v1 decoder and silently drop all content;
|
|
22
|
+
* (d) trailing bytes past the decoder's cursor are ignored, so unlimited byte strings decode to
|
|
23
|
+
* identical state — which makes an update's hash a poor identifier for what it says, and
|
|
24
|
+
* that hash becomes a `0x04` leaf;
|
|
25
|
+
* (h) authorship IS the clientID, so a colliding one silently wins and the honest client's
|
|
26
|
+
* update is then accepted-and-dropped, leaving a splice of two authors with an EMPTY
|
|
27
|
+
* pending set — the (a) rule cannot see this, which is why (h) is separate;
|
|
28
|
+
* (i) a ten-byte well-formed update deletes a document's entire content. Structural limits are
|
|
29
|
+
* UPPER bounds, so a shrinking update passes every one of them.
|
|
30
|
+
*
|
|
31
|
+
* The remaining three are the throw class: a size floor (e) because an empty update throws a lib0
|
|
32
|
+
* decoder string rather than a protocol fault, one typed reason per throw (g), and a nesting-depth
|
|
33
|
+
* limit (f) because Yjs bounds depth not at all and the size cap bounds it poorly — ~16 bytes per
|
|
34
|
+
* level, so roughly 65,000 levels fit inside 1 MiB.
|
|
35
|
+
*
|
|
36
|
+
* ── QUARANTINE, NEVER DISCARD ─────────────────────────────────────────────────────────────────
|
|
37
|
+
*
|
|
38
|
+
* A refused update is HELD. Every path out of this gate — including an unexpected failure inside
|
|
39
|
+
* a rule — produces a verdict and an event. A gate that admitted on internal error would be
|
|
40
|
+
* strictly worse than one with no rules at all, and one that dropped silently would diverge the
|
|
41
|
+
* two copies permanently and invisibly (§3.2).
|
|
42
|
+
*/
|
|
43
|
+
import * as Y from "yjs";
|
|
44
|
+
import type { DocumentEngine } from "./document-engine.js";
|
|
45
|
+
import type { Logger } from "./types.js";
|
|
46
|
+
/** The one accepted update encoding (§16.7-8 pins it in the protocol types). */
|
|
47
|
+
export declare const UPDATE_ENCODING_V1 = "yjs-v1";
|
|
48
|
+
export interface GateLimits {
|
|
49
|
+
/** Pre-parse cap: bytes are refused on LENGTH before Yjs is invoked. */
|
|
50
|
+
maxUpdateBytes: number;
|
|
51
|
+
/** The document's size AFTER the update would apply. */
|
|
52
|
+
maxDocumentBytes: number;
|
|
53
|
+
/** Yjs bounds nesting not at all, and the size cap bounds it poorly. */
|
|
54
|
+
maxNestingDepth: number;
|
|
55
|
+
/** Per sender, per rolling minute. */
|
|
56
|
+
maxUpdatesPerMinute: number;
|
|
57
|
+
}
|
|
58
|
+
/** Published so a peer can discover them — a receiver-local limit nobody can learn is not a protocol. */
|
|
59
|
+
export declare const DEFAULT_GATE_LIMITS: GateLimits;
|
|
60
|
+
/** What the update WOULD do to the document — the only form in which a policy can judge it. */
|
|
61
|
+
export interface ProjectedDiff {
|
|
62
|
+
inserted: string;
|
|
63
|
+
deletedChars: number;
|
|
64
|
+
/** Keys a JSON-shaped update would touch. */
|
|
65
|
+
changedKeys: string[];
|
|
66
|
+
/** The document's size if this were admitted. */
|
|
67
|
+
resultingBytes: number;
|
|
68
|
+
maxDepth: number;
|
|
69
|
+
}
|
|
70
|
+
export interface GateContext {
|
|
71
|
+
documentId: string;
|
|
72
|
+
senderAgentId: string;
|
|
73
|
+
/** clientIDs this peer is KNOWN to write under — the out-of-band binding (h) requires. */
|
|
74
|
+
senderClientIds: number[];
|
|
75
|
+
/**
|
|
76
|
+
* The document the ENVELOPE says this update belongs to (§14). Declared, never inferred: an
|
|
77
|
+
* update carries no document identity, so a well-formed one built on an unrelated document
|
|
78
|
+
* merges silently and no property of the bytes can reveal it. Absent is a refusal.
|
|
79
|
+
*
|
|
80
|
+
* REQUIRED rather than optional so a caller cannot forget it — and the runtime refusal stays
|
|
81
|
+
* for the untyped boundary. **These fields carry no security on their own: they are only as
|
|
82
|
+
* trustworthy as the envelope signature that covers them.** DOD-DOC-ENVELOPE-1 owes a blocking
|
|
83
|
+
* AC that `documentId`, the encoding, and the sender's clientID are inside the signed TBS.
|
|
84
|
+
*/
|
|
85
|
+
declaredDocumentId: string | undefined;
|
|
86
|
+
/**
|
|
87
|
+
* The update encoding the ENVELOPE declares (§16.7-8 pins it). Declared rather than sniffed
|
|
88
|
+
* because the byte-level signatures overlap: a v2 update begins `[0, 0, …]` and a legitimate
|
|
89
|
+
* pure-delete v1 delta begins `[0, 1, …]`, so a first-byte heuristic refuses real deletions.
|
|
90
|
+
* Absent is a refusal.
|
|
91
|
+
*/
|
|
92
|
+
declaredEncoding: string | undefined;
|
|
93
|
+
appendOnly?: boolean;
|
|
94
|
+
}
|
|
95
|
+
/** A pluggable rule. Returns null to allow. DOD-DOC-SCREEN-1 registers here. */
|
|
96
|
+
export type GateRule = (diff: ProjectedDiff, context: GateContext) => {
|
|
97
|
+
reason: string;
|
|
98
|
+
detail?: string;
|
|
99
|
+
} | null;
|
|
100
|
+
/** Machine-readable, so a peer's daemon can act without parsing prose (§16.7-6). */
|
|
101
|
+
export interface GateLimitBreach {
|
|
102
|
+
name: string;
|
|
103
|
+
limit: number;
|
|
104
|
+
actual: number;
|
|
105
|
+
}
|
|
106
|
+
export interface GateQuarantine {
|
|
107
|
+
admit: false;
|
|
108
|
+
reason: string;
|
|
109
|
+
detail?: string;
|
|
110
|
+
limit?: GateLimitBreach;
|
|
111
|
+
/** The pluggable rule that refused, when one did. */
|
|
112
|
+
rule?: string;
|
|
113
|
+
/**
|
|
114
|
+
* THE UPDATE ITSELF. §3.2: a quarantined update is HELD — never admitted, never discarded — so
|
|
115
|
+
* the caller can persist it, reference it from a `0x05` leaf, and resolve it by supersession
|
|
116
|
+
* (DOD-DOC-REJECT-1). Returning only a reason would have made "never discarded" a comment
|
|
117
|
+
* rather than a property: the bytes would die with this stack frame.
|
|
118
|
+
*/
|
|
119
|
+
quarantined: Uint8Array;
|
|
120
|
+
}
|
|
121
|
+
export type GateVerdict = {
|
|
122
|
+
admit: true;
|
|
123
|
+
projectedDiff: ProjectedDiff;
|
|
124
|
+
} | GateQuarantine;
|
|
125
|
+
export declare class DocumentGate {
|
|
126
|
+
#private;
|
|
127
|
+
constructor(engine: DocumentEngine, limits: Partial<GateLimits>, logger: Logger);
|
|
128
|
+
limits(): GateLimits;
|
|
129
|
+
/** Register a pluggable rule. The screening rule (DOD-DOC-SCREEN-1) plugs in here. */
|
|
130
|
+
addRule(name: string, rule: GateRule): void;
|
|
131
|
+
/**
|
|
132
|
+
* Validate an incoming update against the accepted state.
|
|
133
|
+
*
|
|
134
|
+
* Never mutates `accepted`. Never throws — every failure, including an unexpected one inside a
|
|
135
|
+
* rule, becomes a quarantine verdict.
|
|
136
|
+
*/
|
|
137
|
+
validate(accepted: Y.Doc, update: Uint8Array, context: GateContext, now?: number): GateVerdict;
|
|
138
|
+
}
|
|
139
|
+
//# sourceMappingURL=document-gate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"document-gate.d.ts","sourceRoot":"","sources":["../src/document-gate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyCG;AAEH,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC;AACzB,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAEzC,gFAAgF;AAChF,eAAO,MAAM,kBAAkB,WAAW,CAAC;AAE3C,MAAM,WAAW,UAAU;IACzB,wEAAwE;IACxE,cAAc,EAAE,MAAM,CAAC;IACvB,wDAAwD;IACxD,gBAAgB,EAAE,MAAM,CAAC;IACzB,wEAAwE;IACxE,eAAe,EAAE,MAAM,CAAC;IACxB,sCAAsC;IACtC,mBAAmB,EAAE,MAAM,CAAC;CAC7B;AAED,yGAAyG;AACzG,eAAO,MAAM,mBAAmB,EAAE,UAOjC,CAAC;AAEF,+FAA+F;AAC/F,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,6CAA6C;IAC7C,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,iDAAiD;IACjD,cAAc,EAAE,MAAM,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,WAAW;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,0FAA0F;IAC1F,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B;;;;;;;;;OASG;IACH,kBAAkB,EAAE,MAAM,GAAG,SAAS,CAAC;IACvC;;;;;OAKG;IACH,gBAAgB,EAAE,MAAM,GAAG,SAAS,CAAC;IACrC,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,gFAAgF;AAChF,MAAM,MAAM,QAAQ,GAAG,CACrB,IAAI,EAAE,aAAa,EACnB,OAAO,EAAE,WAAW,KACjB;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAAC;AAEhD,oFAAoF;AACpF,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,KAAK,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,eAAe,CAAC;IACxB,qDAAqD;IACrD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;;;;OAKG;IACH,WAAW,EAAE,UAAU,CAAC;CACzB;AAED,MAAM,MAAM,WAAW,GAAG;IAAE,KAAK,EAAE,IAAI,CAAC;IAAC,aAAa,EAAE,aAAa,CAAA;CAAE,GAAG,cAAc,CAAC;AAEzF,qBAAa,YAAY;;gBAQX,MAAM,EAAE,cAAc,EAAE,MAAM,EAAE,OAAO,CAAC,UAAU,CAAC,EAAE,MAAM,EAAE,MAAM;IAQ/E,MAAM,IAAI,UAAU;IAIpB,sFAAsF;IACtF,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,GAAG,IAAI;IAI3C;;;;;OAKG;IACH,QAAQ,CAAC,QAAQ,EAAE,CAAC,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,WAAW,EAAE,GAAG,SAAa,GAAG,WAAW;CA4SnG"}
|