@sovereignbase/sequencer 0.0.2 → 1.0.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/INTERNALS.md +1530 -0
- package/LICENSE +201 -201
- package/README.md +132 -99
- package/dist/index.cjs +157 -105
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +114 -10
- package/dist/index.d.cts.map +1 -1
- package/dist/index.d.ts +114 -10
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +158 -105
- package/dist/index.js.map +1 -1
- package/package.json +23 -23
package/dist/index.d.cts
CHANGED
|
@@ -1,22 +1,37 @@
|
|
|
1
1
|
|
|
2
2
|
//#region src/typescript/types/type.d.ts
|
|
3
|
-
/**
|
|
3
|
+
/** Unsigned 32-bit structural words, accepted as a typed view or JSON numeric array. */
|
|
4
4
|
type U32List = Uint32Array | ReadonlyArray<number>;
|
|
5
5
|
/**
|
|
6
6
|
* Exactly six words, in the replication order:
|
|
7
7
|
* `[anchorSession, anchorStart, anchorDiff,
|
|
8
8
|
* insertionSession, insertionStart, insertionDiff]`.
|
|
9
|
-
*
|
|
10
|
-
*
|
|
9
|
+
* The anchor triple names a logical point in an existing Insertion; the Session
|
|
10
|
+
* and start pair identifies the authored Insertion. A positive diff adds Frames;
|
|
11
|
+
* a negative diff masks original Frames. Signed values use uint32 bit patterns.
|
|
11
12
|
*/
|
|
12
13
|
type InsertionWords = U32List;
|
|
13
|
-
/**
|
|
14
|
-
|
|
15
|
-
|
|
14
|
+
/**
|
|
15
|
+
* Canonical replication operation and optional JavaScript-owned Footage.
|
|
16
|
+
* Positive Insertions may omit Footage; their Frames then read as `undefined`.
|
|
17
|
+
* Reducing Insertions carry no content into native state.
|
|
18
|
+
*/
|
|
19
|
+
type Insertion<T> = Readonly<[
|
|
20
|
+
/** Stable anchor, identity and signed Frame effect. */
|
|
21
|
+
words: InsertionWords,
|
|
22
|
+
/** Values of a positive Insertion, in original Frame order. */
|
|
23
|
+
footage?: ReadonlyArray<T | undefined>]>;
|
|
24
|
+
/**
|
|
25
|
+
* Describes one Actor's acknowledgement frontier.
|
|
26
|
+
* `[actorID, sessionID, sessionEnd, ...]` contains removal Session/frontier pairs.
|
|
27
|
+
* The application is responsible for acknowledging complete received Session prefixes.
|
|
28
|
+
*/
|
|
16
29
|
type Acknowledgement = U32List;
|
|
30
|
+
/** Ordered replication batch; delivery may be duplicated or causally reordered. */
|
|
17
31
|
type Gossip<T> = ReadonlyArray<Acknowledgement | Insertion<T>>;
|
|
18
32
|
/**
|
|
19
|
-
*
|
|
33
|
+
* Retained state required to hydrate the same visible Projection.
|
|
34
|
+
* One structural array and one JavaScript-owned content array.
|
|
20
35
|
* Small snapshots use six-word insertion records after length-prefixed ACKs;
|
|
21
36
|
* `words[0]` locates those records. Large snapshots begin with
|
|
22
37
|
* `[0, frontiersEnd, insertionCount]` and omit predictable coordinate fields.
|
|
@@ -24,27 +39,116 @@ type Gossip<T> = ReadonlyArray<Acknowledgement | Insertion<T>>;
|
|
|
24
39
|
* Positive insertion diffs consume successive spans of `footage`.
|
|
25
40
|
* `[[], []]` is an empty Sequence. Both numeric arrays and typed views are accepted.
|
|
26
41
|
*/
|
|
27
|
-
type Sequence<T> = Readonly<[
|
|
28
|
-
|
|
42
|
+
type Sequence<T> = Readonly<[
|
|
43
|
+
/** Acknowledgements followed by canonical Insertions in Structural Order. */
|
|
44
|
+
words: U32List,
|
|
45
|
+
/** Consecutive positive Insertion spans, including missing Footage slots. */
|
|
46
|
+
footage: ReadonlyArray<T | undefined>]>;
|
|
47
|
+
/** Visible mutation: insertion uses `[at, at, values]`; removal ends exclusively. */
|
|
48
|
+
type Splice<T> = Readonly<[
|
|
49
|
+
/** First affected position in the Projection after preceding Splices. */
|
|
50
|
+
startAt: number,
|
|
51
|
+
/** Exclusive removal boundary; equal to `startAt` for insertion. */
|
|
52
|
+
endWith: number,
|
|
53
|
+
/** Inserted Footage; omitted for removal. */
|
|
54
|
+
values?: ReadonlyArray<T | undefined>]>;
|
|
55
|
+
/** Splices applied in order to reproduce the remote operation's visible effect. */
|
|
29
56
|
type Change<T> = ReadonlyArray<Splice<T>>;
|
|
57
|
+
/** Visible changes and optional Gossip returned by `apply()` or `merge()`. */
|
|
30
58
|
type Result<T> = Readonly<[change: Change<T>, gossip?: Gossip<T>]>;
|
|
31
59
|
//#endregion
|
|
32
60
|
//#region src/typescript/class.d.ts
|
|
33
|
-
/**
|
|
61
|
+
/** Visible Projection of a replicated Sequence. */
|
|
34
62
|
export declare class Projection<T> {
|
|
35
63
|
readonly actorID: number;
|
|
64
|
+
/** Native instance handle; a negative value marks explicit destruction. */
|
|
36
65
|
private id;
|
|
66
|
+
/**
|
|
67
|
+
* Prepares to sequence a projection, optionally hydrating from a trusted sequence stored by the application.
|
|
68
|
+
*
|
|
69
|
+
* @param actorID Actor identifier used in acknowledgements.
|
|
70
|
+
* @param trustedSequence Optional trusted Sequence in Structural Order, stored by the application.
|
|
71
|
+
*/
|
|
37
72
|
constructor(actorID: number, trustedSequence?: unknown);
|
|
73
|
+
/**
|
|
74
|
+
* Applies gossiped Insertions and Acknowledgements.
|
|
75
|
+
*
|
|
76
|
+
* @param gossip Batch of Insertion and Acknowledgement tuples.
|
|
77
|
+
* @returns Visible changes and optional acknowledgement Gossip, or
|
|
78
|
+
* `undefined` for invalid input. Earlier entries may already have been applied.
|
|
79
|
+
*/
|
|
38
80
|
apply(gossip: unknown): Result<T> | undefined;
|
|
81
|
+
/**
|
|
82
|
+
* Inserts values at a Projection position.
|
|
83
|
+
*
|
|
84
|
+
* @param values Nonempty array of values to insert.
|
|
85
|
+
* @param at Insertion position in `0..length()`, inclusive.
|
|
86
|
+
* @returns Gossip describing the insertion.
|
|
87
|
+
*/
|
|
39
88
|
insert(values: Array<T>, at: number): Gossip<T>;
|
|
89
|
+
/**
|
|
90
|
+
* Returns the length, A.K.A. amount of entries of this projection.
|
|
91
|
+
*
|
|
92
|
+
* @returns Current Projection length.
|
|
93
|
+
*/
|
|
40
94
|
length(): number;
|
|
95
|
+
/**
|
|
96
|
+
* Applies relevant acknowledgements and nonduplicate insertions from a replica of the sequence.
|
|
97
|
+
*
|
|
98
|
+
* @param sequence Sequence to merge.
|
|
99
|
+
* @returns Visible changes and optional acknowledgement Gossip, or
|
|
100
|
+
* `undefined` if the Sequence has an invalid runtime shape.
|
|
101
|
+
*/
|
|
41
102
|
merge(sequence: unknown): Result<T> | undefined;
|
|
103
|
+
/**
|
|
104
|
+
* Removes an inclusive range of Projection positions.
|
|
105
|
+
*
|
|
106
|
+
* @param startAt First position to remove; defaults to 0.
|
|
107
|
+
* @param endWith Last position to remove; defaults to `length() - 1`.
|
|
108
|
+
* @returns Reducing Insertions and their acknowledgement as Gossip.
|
|
109
|
+
*/
|
|
42
110
|
remove(startAt?: number, endWith?: number): Gossip<T>;
|
|
111
|
+
/**
|
|
112
|
+
* Replaces an inclusive range of Projection positions.
|
|
113
|
+
*
|
|
114
|
+
* @param withValues Replacement values; an empty array only removes the range.
|
|
115
|
+
* @param startAt First position to replace; defaults to 0.
|
|
116
|
+
* @param endWith Last position to replace; defaults to `length() - 1`.
|
|
117
|
+
* @returns Removal and insertion Gossip, in that order.
|
|
118
|
+
*/
|
|
43
119
|
replace(withValues: Array<T>, startAt?: number, endWith?: number): Gossip<T>;
|
|
120
|
+
/**
|
|
121
|
+
* Retires an Actor from future compaction requirements.
|
|
122
|
+
*
|
|
123
|
+
* @remarks
|
|
124
|
+
* The application is responsible for deciding which Actors are retired and
|
|
125
|
+
* for propagating that decision to the relevant replicas.
|
|
126
|
+
*
|
|
127
|
+
* @param actorID Actor whose Acknowledgements are no longer required for compaction.
|
|
128
|
+
*/
|
|
44
129
|
retire(actorID: number): void;
|
|
130
|
+
/**
|
|
131
|
+
* Sequences state into a compact serializable format.
|
|
132
|
+
*
|
|
133
|
+
* @returns A Sequence with acknowledged removals compacted in the exported state.
|
|
134
|
+
*/
|
|
45
135
|
sequence(): Sequence<T>;
|
|
136
|
+
/**
|
|
137
|
+
* Returns the value at a Projection position.
|
|
138
|
+
*
|
|
139
|
+
* @param at Valid visible position in `0..length() - 1`.
|
|
140
|
+
* @returns The corresponding Footage value.
|
|
141
|
+
*/
|
|
46
142
|
value(at: number): T | undefined;
|
|
143
|
+
/**
|
|
144
|
+
* Returns values from an inclusive range of Projection positions.
|
|
145
|
+
*
|
|
146
|
+
* @param startAt First included position; defaults to 0.
|
|
147
|
+
* @param endWith Last included position; defaults to `length() - 1`.
|
|
148
|
+
* @returns A new array of values, or an empty array for an empty range.
|
|
149
|
+
*/
|
|
47
150
|
values(startAt?: number, endWith?: number): Array<T>;
|
|
151
|
+
/** Destroys the Projection. Repeated calls have no effect. */
|
|
48
152
|
destroy(): void;
|
|
49
153
|
}
|
|
50
154
|
//#endregion
|
package/dist/index.d.cts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.cts","names":[],"sources":["../src/typescript/types/type.ts","../src/typescript/class.ts"],"mappings":";;;KACY,UAAU,cAAc
|
|
1
|
+
{"version":3,"file":"index.d.cts","names":[],"sources":["../src/typescript/types/type.ts","../src/typescript/class.ts"],"mappings":";;;KACY,UAAU,cAAc;;;;;;;;;KAUxB,iBAAiB;;;;;;KAOjB,UAAU,KAAK;;AAGvB,OAAO;;AAEP,UAAU,cAAc;;;;;;KAShB,kBAAkB;;KAGlB,OAAO,KAAK,cAAc,kBAAkB,UAAU;;;;;;;;;;;KAYtD,SAAS,KAAK;;AAGtB,OAAO;;AAEP,SAAS,cAAc;;KAKf,OAAO,KAAK;;AAGpB;;AAEA;;AAEA,SAAS,cAAc;;KAKf,OAAO,KAAK,cAAc,OAAO;;KAEjC,OAAO,KAAK,UAAU,QAAQ,OAAO,IAAI,SAAS,OAAO;;;;qBClExD,WAAW;WAWJ;;UATV;;;;;;;EASU,YAAA,iBAChB;;;;;;;;EAYF,MAAM,kBAAkB,OAAO;;;;;;;;EAW/B,OAAO,QAAQ,MAAM,IAAI,aAAa,OAAO;;;;;;EAS7C;;;;;;;;EAWA,MAAM,oBAAoB,OAAO;;;;;;;;EAWjC,OAAO,kBAAkB,mBAAmB,OAAO;;;;;;;;;EAYnD,QAAQ,YAAY,MAAM,IAAI,kBAAkB,mBAAmB,OAAO;;;;;;;;;;EAmB1E,OAAO;;;;;;EASP,YAAY,SAAS;;;;;;;EAUrB,MAAM,aAAa;;;;;;;;EAWnB,OAAO,kBAAkB,mBAAmB,MAAM;;EAKlD"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,22 +1,37 @@
|
|
|
1
1
|
|
|
2
2
|
//#region src/typescript/types/type.d.ts
|
|
3
|
-
/**
|
|
3
|
+
/** Unsigned 32-bit structural words, accepted as a typed view or JSON numeric array. */
|
|
4
4
|
type U32List = Uint32Array | ReadonlyArray<number>;
|
|
5
5
|
/**
|
|
6
6
|
* Exactly six words, in the replication order:
|
|
7
7
|
* `[anchorSession, anchorStart, anchorDiff,
|
|
8
8
|
* insertionSession, insertionStart, insertionDiff]`.
|
|
9
|
-
*
|
|
10
|
-
*
|
|
9
|
+
* The anchor triple names a logical point in an existing Insertion; the Session
|
|
10
|
+
* and start pair identifies the authored Insertion. A positive diff adds Frames;
|
|
11
|
+
* a negative diff masks original Frames. Signed values use uint32 bit patterns.
|
|
11
12
|
*/
|
|
12
13
|
type InsertionWords = U32List;
|
|
13
|
-
/**
|
|
14
|
-
|
|
15
|
-
|
|
14
|
+
/**
|
|
15
|
+
* Canonical replication operation and optional JavaScript-owned Footage.
|
|
16
|
+
* Positive Insertions may omit Footage; their Frames then read as `undefined`.
|
|
17
|
+
* Reducing Insertions carry no content into native state.
|
|
18
|
+
*/
|
|
19
|
+
type Insertion<T> = Readonly<[
|
|
20
|
+
/** Stable anchor, identity and signed Frame effect. */
|
|
21
|
+
words: InsertionWords,
|
|
22
|
+
/** Values of a positive Insertion, in original Frame order. */
|
|
23
|
+
footage?: ReadonlyArray<T | undefined>]>;
|
|
24
|
+
/**
|
|
25
|
+
* Describes one Actor's acknowledgement frontier.
|
|
26
|
+
* `[actorID, sessionID, sessionEnd, ...]` contains removal Session/frontier pairs.
|
|
27
|
+
* The application is responsible for acknowledging complete received Session prefixes.
|
|
28
|
+
*/
|
|
16
29
|
type Acknowledgement = U32List;
|
|
30
|
+
/** Ordered replication batch; delivery may be duplicated or causally reordered. */
|
|
17
31
|
type Gossip<T> = ReadonlyArray<Acknowledgement | Insertion<T>>;
|
|
18
32
|
/**
|
|
19
|
-
*
|
|
33
|
+
* Retained state required to hydrate the same visible Projection.
|
|
34
|
+
* One structural array and one JavaScript-owned content array.
|
|
20
35
|
* Small snapshots use six-word insertion records after length-prefixed ACKs;
|
|
21
36
|
* `words[0]` locates those records. Large snapshots begin with
|
|
22
37
|
* `[0, frontiersEnd, insertionCount]` and omit predictable coordinate fields.
|
|
@@ -24,27 +39,116 @@ type Gossip<T> = ReadonlyArray<Acknowledgement | Insertion<T>>;
|
|
|
24
39
|
* Positive insertion diffs consume successive spans of `footage`.
|
|
25
40
|
* `[[], []]` is an empty Sequence. Both numeric arrays and typed views are accepted.
|
|
26
41
|
*/
|
|
27
|
-
type Sequence<T> = Readonly<[
|
|
28
|
-
|
|
42
|
+
type Sequence<T> = Readonly<[
|
|
43
|
+
/** Acknowledgements followed by canonical Insertions in Structural Order. */
|
|
44
|
+
words: U32List,
|
|
45
|
+
/** Consecutive positive Insertion spans, including missing Footage slots. */
|
|
46
|
+
footage: ReadonlyArray<T | undefined>]>;
|
|
47
|
+
/** Visible mutation: insertion uses `[at, at, values]`; removal ends exclusively. */
|
|
48
|
+
type Splice<T> = Readonly<[
|
|
49
|
+
/** First affected position in the Projection after preceding Splices. */
|
|
50
|
+
startAt: number,
|
|
51
|
+
/** Exclusive removal boundary; equal to `startAt` for insertion. */
|
|
52
|
+
endWith: number,
|
|
53
|
+
/** Inserted Footage; omitted for removal. */
|
|
54
|
+
values?: ReadonlyArray<T | undefined>]>;
|
|
55
|
+
/** Splices applied in order to reproduce the remote operation's visible effect. */
|
|
29
56
|
type Change<T> = ReadonlyArray<Splice<T>>;
|
|
57
|
+
/** Visible changes and optional Gossip returned by `apply()` or `merge()`. */
|
|
30
58
|
type Result<T> = Readonly<[change: Change<T>, gossip?: Gossip<T>]>;
|
|
31
59
|
//#endregion
|
|
32
60
|
//#region src/typescript/class.d.ts
|
|
33
|
-
/**
|
|
61
|
+
/** Visible Projection of a replicated Sequence. */
|
|
34
62
|
export declare class Projection<T> {
|
|
35
63
|
readonly actorID: number;
|
|
64
|
+
/** Native instance handle; a negative value marks explicit destruction. */
|
|
36
65
|
private id;
|
|
66
|
+
/**
|
|
67
|
+
* Prepares to sequence a projection, optionally hydrating from a trusted sequence stored by the application.
|
|
68
|
+
*
|
|
69
|
+
* @param actorID Actor identifier used in acknowledgements.
|
|
70
|
+
* @param trustedSequence Optional trusted Sequence in Structural Order, stored by the application.
|
|
71
|
+
*/
|
|
37
72
|
constructor(actorID: number, trustedSequence?: unknown);
|
|
73
|
+
/**
|
|
74
|
+
* Applies gossiped Insertions and Acknowledgements.
|
|
75
|
+
*
|
|
76
|
+
* @param gossip Batch of Insertion and Acknowledgement tuples.
|
|
77
|
+
* @returns Visible changes and optional acknowledgement Gossip, or
|
|
78
|
+
* `undefined` for invalid input. Earlier entries may already have been applied.
|
|
79
|
+
*/
|
|
38
80
|
apply(gossip: unknown): Result<T> | undefined;
|
|
81
|
+
/**
|
|
82
|
+
* Inserts values at a Projection position.
|
|
83
|
+
*
|
|
84
|
+
* @param values Nonempty array of values to insert.
|
|
85
|
+
* @param at Insertion position in `0..length()`, inclusive.
|
|
86
|
+
* @returns Gossip describing the insertion.
|
|
87
|
+
*/
|
|
39
88
|
insert(values: Array<T>, at: number): Gossip<T>;
|
|
89
|
+
/**
|
|
90
|
+
* Returns the length, A.K.A. amount of entries of this projection.
|
|
91
|
+
*
|
|
92
|
+
* @returns Current Projection length.
|
|
93
|
+
*/
|
|
40
94
|
length(): number;
|
|
95
|
+
/**
|
|
96
|
+
* Applies relevant acknowledgements and nonduplicate insertions from a replica of the sequence.
|
|
97
|
+
*
|
|
98
|
+
* @param sequence Sequence to merge.
|
|
99
|
+
* @returns Visible changes and optional acknowledgement Gossip, or
|
|
100
|
+
* `undefined` if the Sequence has an invalid runtime shape.
|
|
101
|
+
*/
|
|
41
102
|
merge(sequence: unknown): Result<T> | undefined;
|
|
103
|
+
/**
|
|
104
|
+
* Removes an inclusive range of Projection positions.
|
|
105
|
+
*
|
|
106
|
+
* @param startAt First position to remove; defaults to 0.
|
|
107
|
+
* @param endWith Last position to remove; defaults to `length() - 1`.
|
|
108
|
+
* @returns Reducing Insertions and their acknowledgement as Gossip.
|
|
109
|
+
*/
|
|
42
110
|
remove(startAt?: number, endWith?: number): Gossip<T>;
|
|
111
|
+
/**
|
|
112
|
+
* Replaces an inclusive range of Projection positions.
|
|
113
|
+
*
|
|
114
|
+
* @param withValues Replacement values; an empty array only removes the range.
|
|
115
|
+
* @param startAt First position to replace; defaults to 0.
|
|
116
|
+
* @param endWith Last position to replace; defaults to `length() - 1`.
|
|
117
|
+
* @returns Removal and insertion Gossip, in that order.
|
|
118
|
+
*/
|
|
43
119
|
replace(withValues: Array<T>, startAt?: number, endWith?: number): Gossip<T>;
|
|
120
|
+
/**
|
|
121
|
+
* Retires an Actor from future compaction requirements.
|
|
122
|
+
*
|
|
123
|
+
* @remarks
|
|
124
|
+
* The application is responsible for deciding which Actors are retired and
|
|
125
|
+
* for propagating that decision to the relevant replicas.
|
|
126
|
+
*
|
|
127
|
+
* @param actorID Actor whose Acknowledgements are no longer required for compaction.
|
|
128
|
+
*/
|
|
44
129
|
retire(actorID: number): void;
|
|
130
|
+
/**
|
|
131
|
+
* Sequences state into a compact serializable format.
|
|
132
|
+
*
|
|
133
|
+
* @returns A Sequence with acknowledged removals compacted in the exported state.
|
|
134
|
+
*/
|
|
45
135
|
sequence(): Sequence<T>;
|
|
136
|
+
/**
|
|
137
|
+
* Returns the value at a Projection position.
|
|
138
|
+
*
|
|
139
|
+
* @param at Valid visible position in `0..length() - 1`.
|
|
140
|
+
* @returns The corresponding Footage value.
|
|
141
|
+
*/
|
|
46
142
|
value(at: number): T | undefined;
|
|
143
|
+
/**
|
|
144
|
+
* Returns values from an inclusive range of Projection positions.
|
|
145
|
+
*
|
|
146
|
+
* @param startAt First included position; defaults to 0.
|
|
147
|
+
* @param endWith Last included position; defaults to `length() - 1`.
|
|
148
|
+
* @returns A new array of values, or an empty array for an empty range.
|
|
149
|
+
*/
|
|
47
150
|
values(startAt?: number, endWith?: number): Array<T>;
|
|
151
|
+
/** Destroys the Projection. Repeated calls have no effect. */
|
|
48
152
|
destroy(): void;
|
|
49
153
|
}
|
|
50
154
|
//#endregion
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","names":[],"sources":["../src/typescript/types/type.ts","../src/typescript/class.ts"],"mappings":";;;KACY,UAAU,cAAc
|
|
1
|
+
{"version":3,"file":"index.d.ts","names":[],"sources":["../src/typescript/types/type.ts","../src/typescript/class.ts"],"mappings":";;;KACY,UAAU,cAAc;;;;;;;;;KAUxB,iBAAiB;;;;;;KAOjB,UAAU,KAAK;;AAGvB,OAAO;;AAEP,UAAU,cAAc;;;;;;KAShB,kBAAkB;;KAGlB,OAAO,KAAK,cAAc,kBAAkB,UAAU;;;;;;;;;;;KAYtD,SAAS,KAAK;;AAGtB,OAAO;;AAEP,SAAS,cAAc;;KAKf,OAAO,KAAK;;AAGpB;;AAEA;;AAEA,SAAS,cAAc;;KAKf,OAAO,KAAK,cAAc,OAAO;;KAEjC,OAAO,KAAK,UAAU,QAAQ,OAAO,IAAI,SAAS,OAAO;;;;qBClExD,WAAW;WAWJ;;UATV;;;;;;;EASU,YAAA,iBAChB;;;;;;;;EAYF,MAAM,kBAAkB,OAAO;;;;;;;;EAW/B,OAAO,QAAQ,MAAM,IAAI,aAAa,OAAO;;;;;;EAS7C;;;;;;;;EAWA,MAAM,oBAAoB,OAAO;;;;;;;;EAWjC,OAAO,kBAAkB,mBAAmB,OAAO;;;;;;;;;EAYnD,QAAQ,YAAY,MAAM,IAAI,kBAAkB,mBAAmB,OAAO;;;;;;;;;;EAmB1E,OAAO;;;;;;EASP,YAAY,SAAS;;;;;;;EAUrB,MAAM,aAAa;;;;;;;;EAWnB,OAAO,kBAAkB,mBAAmB,MAAM;;EAKlD"}
|