@vuu-ui/vuu-data-local 2.1.17 → 2.1.19-beta.1

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.
Files changed (37) hide show
  1. package/package.json +10 -12
  2. package/cjs/array-data-source/aggregate-utils.js +0 -237
  3. package/cjs/array-data-source/aggregate-utils.js.map +0 -1
  4. package/cjs/array-data-source/array-data-source.js +0 -912
  5. package/cjs/array-data-source/array-data-source.js.map +0 -1
  6. package/cjs/array-data-source/array-data-utils.js +0 -62
  7. package/cjs/array-data-source/array-data-utils.js.map +0 -1
  8. package/cjs/array-data-source/group-utils.js +0 -187
  9. package/cjs/array-data-source/group-utils.js.map +0 -1
  10. package/cjs/array-data-source/sort-utils.js +0 -73
  11. package/cjs/array-data-source/sort-utils.js.map +0 -1
  12. package/cjs/index.js +0 -12
  13. package/cjs/index.js.map +0 -1
  14. package/cjs/json-data-source/JsonDataSource.js +0 -404
  15. package/cjs/json-data-source/JsonDataSource.js.map +0 -1
  16. package/cjs/tree-data-source/IconProvider.js +0 -28
  17. package/cjs/tree-data-source/IconProvider.js.map +0 -1
  18. package/cjs/tree-data-source/TreeDataSource.js +0 -434
  19. package/cjs/tree-data-source/TreeDataSource.js.map +0 -1
  20. package/esm/array-data-source/aggregate-utils.js +0 -235
  21. package/esm/array-data-source/aggregate-utils.js.map +0 -1
  22. package/esm/array-data-source/array-data-source.js +0 -910
  23. package/esm/array-data-source/array-data-source.js.map +0 -1
  24. package/esm/array-data-source/array-data-utils.js +0 -59
  25. package/esm/array-data-source/array-data-utils.js.map +0 -1
  26. package/esm/array-data-source/group-utils.js +0 -183
  27. package/esm/array-data-source/group-utils.js.map +0 -1
  28. package/esm/array-data-source/sort-utils.js +0 -69
  29. package/esm/array-data-source/sort-utils.js.map +0 -1
  30. package/esm/index.js +0 -4
  31. package/esm/index.js.map +0 -1
  32. package/esm/json-data-source/JsonDataSource.js +0 -402
  33. package/esm/json-data-source/JsonDataSource.js.map +0 -1
  34. package/esm/tree-data-source/IconProvider.js +0 -26
  35. package/esm/tree-data-source/IconProvider.js.map +0 -1
  36. package/esm/tree-data-source/TreeDataSource.js +0 -432
  37. package/esm/tree-data-source/TreeDataSource.js.map +0 -1
@@ -1,432 +0,0 @@
1
- import { BaseDataSource, KeySet, treeToDataSourceRows, NULL_RANGE, uuid, isSingleValueFilter, lastPathSegment, missingAncestor, getParentRow, metadataKeys } from '@vuu-ui/vuu-utils';
2
- import { IconProvider } from './IconProvider.js';
3
- import { parseFilter } from '@vuu-ui/vuu-filter-parser';
4
-
5
- var __defProp = Object.defineProperty;
6
- var __typeError = (msg) => {
7
- throw TypeError(msg);
8
- };
9
- var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
10
- var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
11
- var __accessCheck = (obj, member, msg) => member.has(obj) || __typeError("Cannot " + msg);
12
- var __privateGet = (obj, member, getter) => (__accessCheck(obj, member, "read from private field"), getter ? getter.call(obj) : member.get(obj));
13
- var __privateAdd = (obj, member, value) => member.has(obj) ? __typeError("Cannot add the same private member more than once") : member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
14
- var __privateSet = (obj, member, value, setter) => (__accessCheck(obj, member, "write to private field"), member.set(obj, value), value);
15
- var __privateWrapper = (obj, member, setter, getter) => ({
16
- set _(value) {
17
- __privateSet(obj, member, value);
18
- },
19
- get _() {
20
- return __privateGet(obj, member, getter);
21
- }
22
- });
23
- var _aggregations, _data, _iconProvider, _selectedRowsCount, _size, _status, _filterSet;
24
- const TREE_SCHEMA = {
25
- columns: [
26
- { name: "nodeData", serverDataType: "string" },
27
- { name: "Level 1", serverDataType: "string" },
28
- { name: "Level 2", serverDataType: "string" },
29
- { name: "Level 3", serverDataType: "string" },
30
- { name: "Level 4", serverDataType: "string" },
31
- { name: "Level 5", serverDataType: "string" }
32
- ],
33
- key: "",
34
- table: { module: "", table: "" }
35
- };
36
- const { COUNT, DEPTH, IDX, IS_EXPANDED, IS_LEAF, KEY, SELECTED } = metadataKeys;
37
- const toClientRow = (row, keys) => {
38
- const [rowIndex] = row;
39
- const clientRow = row.slice();
40
- clientRow[1] = keys.keyFor(rowIndex);
41
- return clientRow;
42
- };
43
- class TreeDataSource extends BaseDataSource {
44
- constructor({ data, ...props }) {
45
- super(props);
46
- __publicField(this, "columnDescriptors");
47
- __publicField(this, "clientCallback");
48
- __publicField(this, "expandedRows", /* @__PURE__ */ new Set());
49
- __publicField(this, "visibleRows", []);
50
- __publicField(this, "visibleRowIndex", {});
51
- __privateAdd(this, _aggregations, []);
52
- __privateAdd(this, _data);
53
- __privateAdd(this, _iconProvider);
54
- __privateAdd(this, _selectedRowsCount, 0);
55
- __privateAdd(this, _size, 0);
56
- __privateAdd(this, _status, "initialising");
57
- __privateAdd(this, _filterSet);
58
- __publicField(this, "rowCount");
59
- __publicField(this, "keys", new KeySet(this._range));
60
- __publicField(this, "indexOfRowWithKey", (key) => __privateGet(this, _data).findIndex((row) => row[KEY] === key));
61
- if (!data) {
62
- throw Error("TreeDataSource constructor called without data");
63
- }
64
- __privateSet(this, _iconProvider, new IconProvider());
65
- [this.columnDescriptors, __privateWrapper(this, _data)._] = treeToDataSourceRows(
66
- data,
67
- __privateGet(this, _iconProvider)
68
- );
69
- console.table(__privateGet(this, _data));
70
- if (this.columnDescriptors) {
71
- const columns = this.columnDescriptors.map((c) => c.name);
72
- this._configWithVisualLink = {
73
- ...this._configWithVisualLink,
74
- columns,
75
- groupBy: columns.slice(1)
76
- };
77
- }
78
- }
79
- async subscribe({
80
- aggregations,
81
- columns,
82
- range,
83
- revealSelected,
84
- selectedKeyValues,
85
- viewport = this.viewport ?? uuid()
86
- }, callback) {
87
- this.clientCallback = callback;
88
- if (aggregations) {
89
- __privateSet(this, _aggregations, aggregations);
90
- }
91
- if (columns) {
92
- this._configWithVisualLink = {
93
- ...this._configWithVisualLink,
94
- columns
95
- };
96
- }
97
- if (__privateGet(this, _status) !== "initialising") {
98
- return;
99
- }
100
- this.viewport = viewport;
101
- __privateSet(this, _status, "subscribed");
102
- __privateSet(this, _selectedRowsCount, selectedKeyValues?.length ?? 0);
103
- if (selectedKeyValues) {
104
- this.applySelectedKeyValues(selectedKeyValues, revealSelected);
105
- }
106
- [this.visibleRows, this.visibleRowIndex] = getVisibleRows(
107
- __privateGet(this, _data),
108
- this.expandedRows
109
- );
110
- this.clientCallback?.({
111
- aggregations: __privateGet(this, _aggregations),
112
- type: "subscribed",
113
- clientViewportId: this.viewport,
114
- columns: this.columns,
115
- filterSpec: this.filter,
116
- groupBy: this._configWithVisualLink.groupBy,
117
- range: this.range,
118
- sort: this.sort,
119
- tableSchema: TREE_SCHEMA
120
- });
121
- this.clientCallback({
122
- clientViewportId: this.viewport,
123
- mode: "size-only",
124
- type: "viewport-update",
125
- size: this.visibleRows.length
126
- });
127
- if (range && !this._range.equals(range)) {
128
- this.range = range;
129
- } else if (this._range !== NULL_RANGE) {
130
- this.sendRowsToClient();
131
- }
132
- }
133
- unsubscribe() {
134
- console.log("noop");
135
- }
136
- suspend() {
137
- console.log("noop");
138
- return this;
139
- }
140
- resume() {
141
- console.log("noop");
142
- return this;
143
- }
144
- disable() {
145
- console.log("noop");
146
- return this;
147
- }
148
- enable() {
149
- console.log("noop");
150
- return this;
151
- }
152
- set data(data) {
153
- [this.columnDescriptors, __privateWrapper(this, _data)._] = treeToDataSourceRows(data);
154
- requestAnimationFrame(() => {
155
- this.sendRowsToClient();
156
- });
157
- }
158
- get filter() {
159
- return this._configWithVisualLink.filterSpec;
160
- }
161
- set filter(filter) {
162
- this._configWithVisualLink = {
163
- ...this._configWithVisualLink,
164
- filterSpec: filter
165
- };
166
- if (filter.filter) {
167
- this.applyFilter(filter);
168
- } else {
169
- __privateSet(this, _filterSet, void 0);
170
- }
171
- [this.visibleRows, this.visibleRowIndex] = getVisibleRows(
172
- __privateGet(this, _data),
173
- this.expandedRows,
174
- __privateGet(this, _filterSet)
175
- );
176
- const { from, to } = this.range;
177
- this.clientCallback?.({
178
- clientViewportId: this.viewport,
179
- mode: "batch",
180
- rows: this.visibleRows.slice(from, to).map((row) => toClientRow(row, this.keys)),
181
- size: this.visibleRows.length,
182
- type: "viewport-update"
183
- });
184
- }
185
- applyFilter({ filter: filterQuery, filterStruct }) {
186
- const filter = filterStruct ?? parseFilter(filterQuery);
187
- if (isSingleValueFilter(filter)) {
188
- const filterSet = [];
189
- const regex = new RegExp(`${filter.value}`, "i");
190
- for (const row of __privateGet(this, _data)) {
191
- const { [KEY]: key, [IDX]: idx } = row;
192
- if (regex.test(lastPathSegment(key, "|"))) {
193
- filterSet.push(idx);
194
- }
195
- }
196
- __privateSet(this, _filterSet, filterSet);
197
- }
198
- }
199
- /**
200
- * used to apply an initial selection. These may not necessarily be
201
- * visible. If revealOnSelect is in force, expand nodes as necessary
202
- * to ensure selected nodes are visible
203
- */
204
- applySelectedKeyValues(keys, revealSelected = false) {
205
- keys.forEach((key) => {
206
- const rowIdx = this.indexOfRowWithKey(key);
207
- const row = __privateGet(this, _data)[rowIdx];
208
- row[SELECTED] = 1;
209
- if (revealSelected && row[DEPTH] !== 1) {
210
- const keys2 = key.slice(6).split("|").slice(0, -1);
211
- let path = "$root";
212
- do {
213
- path = `${path}|${keys2.shift()}`;
214
- this.expandedRows.add(path);
215
- } while (keys2.length);
216
- }
217
- });
218
- }
219
- select(selectRequest) {
220
- const updatedRows = [];
221
- switch (selectRequest.type) {
222
- case "SELECT_ROW": {
223
- const { preserveExistingSelection, rowKey } = selectRequest;
224
- for (const row of this.visibleRows) {
225
- const { [IDX]: rowIndex, [KEY]: key, [SELECTED]: sel } = row;
226
- if (sel === 1 && preserveExistingSelection === false && key !== rowKey) {
227
- const deselectedRow = row.slice();
228
- deselectedRow[SELECTED] = 0;
229
- this.visibleRows[rowIndex] = deselectedRow;
230
- updatedRows.push(deselectedRow);
231
- } else if (key === rowKey) {
232
- const selectedRow = row.slice();
233
- selectedRow[SELECTED] = 1;
234
- this.visibleRows[rowIndex] = selectedRow;
235
- updatedRows.push(selectedRow);
236
- }
237
- }
238
- break;
239
- }
240
- }
241
- if (updatedRows.length > 0) {
242
- this.clientCallback?.({
243
- clientViewportId: this.viewport,
244
- mode: "update",
245
- type: "viewport-update",
246
- rows: updatedRows
247
- });
248
- }
249
- }
250
- getRowKey(keyOrIndex) {
251
- if (typeof keyOrIndex === "string") {
252
- return keyOrIndex;
253
- }
254
- const row = this.getRowAtIndex(keyOrIndex);
255
- if (row === void 0) {
256
- throw Error(`row not found at index ${keyOrIndex}`);
257
- }
258
- return row[KEY];
259
- }
260
- openTreeNode(keyOrIndex) {
261
- const key = this.getRowKey(keyOrIndex);
262
- this.expandedRows.add(key);
263
- [this.visibleRows, this.visibleRowIndex] = getVisibleRows(
264
- __privateGet(this, _data),
265
- this.expandedRows
266
- );
267
- const { from, to } = this._range;
268
- this.clientCallback?.({
269
- clientViewportId: this.viewport,
270
- mode: "batch",
271
- rows: this.visibleRows.slice(from, to).map((row) => toClientRow(row, this.keys)),
272
- size: this.visibleRows.length,
273
- type: "viewport-update"
274
- });
275
- }
276
- closeTreeNode(keyOrIndex, cascade = false) {
277
- const key = this.getRowKey(keyOrIndex);
278
- this.expandedRows.delete(key);
279
- if (cascade) {
280
- for (const rowKey of this.expandedRows.keys()) {
281
- if (rowKey.startsWith(key)) {
282
- this.expandedRows.delete(rowKey);
283
- }
284
- }
285
- }
286
- [this.visibleRows, this.visibleRowIndex] = getVisibleRows(
287
- __privateGet(this, _data),
288
- this.expandedRows
289
- );
290
- this.sendRowsToClient();
291
- }
292
- get status() {
293
- return __privateGet(this, _status);
294
- }
295
- get selectedRowsCount() {
296
- return __privateGet(this, _selectedRowsCount);
297
- }
298
- get size() {
299
- return __privateGet(this, _size);
300
- }
301
- rangeRequest(range) {
302
- this.keys.reset(range);
303
- requestAnimationFrame(() => {
304
- this.sendRowsToClient();
305
- });
306
- }
307
- sendRowsToClient() {
308
- const { from, to } = this._range;
309
- this.clientCallback?.({
310
- clientViewportId: this.viewport,
311
- mode: "batch",
312
- rows: this.visibleRows.slice(from, to).map((row) => toClientRow(row, this.keys)),
313
- size: this.visibleRows.length,
314
- type: "viewport-update"
315
- });
316
- }
317
- createLink({
318
- parentVpId,
319
- link: { fromColumn, toColumn }
320
- }) {
321
- console.log("create link", {
322
- parentVpId,
323
- fromColumn,
324
- toColumn
325
- });
326
- }
327
- removeLink() {
328
- console.log("remove link");
329
- }
330
- async remoteProcedureCall() {
331
- return Promise.reject();
332
- }
333
- async menuRpcCall(rpcRequest) {
334
- console.log("rmenuRpcCall", {
335
- rpcRequest
336
- });
337
- return void 0;
338
- }
339
- getChildRows(rowKey) {
340
- const parentRow = __privateGet(this, _data).find((row) => row[KEY] === rowKey);
341
- if (parentRow) {
342
- const { [IDX]: parentIdx, [DEPTH]: parentDepth } = parentRow;
343
- let rowIdx = parentIdx + 1;
344
- const childRows = [];
345
- do {
346
- const { [DEPTH]: depth } = __privateGet(this, _data)[rowIdx];
347
- if (depth === parentDepth + 1) {
348
- childRows.push(__privateGet(this, _data)[rowIdx]);
349
- } else if (depth <= parentDepth) {
350
- break;
351
- }
352
- rowIdx += 1;
353
- } while (rowIdx < __privateGet(this, _data).length);
354
- return childRows;
355
- } else {
356
- console.warn(
357
- `JsonDataSource getChildRows row not found for key ${rowKey}`
358
- );
359
- }
360
- return [];
361
- }
362
- getRowsAtDepth(depth, visibleOnly = true) {
363
- const rows = visibleOnly ? this.visibleRows : __privateGet(this, _data);
364
- return rows.filter((row) => row[DEPTH] === depth);
365
- }
366
- getRowAtIndex(rowIdx) {
367
- return this.visibleRows[rowIdx];
368
- }
369
- }
370
- _aggregations = new WeakMap();
371
- _data = new WeakMap();
372
- _iconProvider = new WeakMap();
373
- _selectedRowsCount = new WeakMap();
374
- _size = new WeakMap();
375
- _status = new WeakMap();
376
- _filterSet = new WeakMap();
377
- function getVisibleRows(rows, expandedKeys, filterset) {
378
- const visibleRows = [];
379
- const visibleRowIndex = {};
380
- const data = filterset ?? rows;
381
- for (let i = 0, index = 0; i < data.length; i++) {
382
- const idx = filterset ? filterset[i] : i;
383
- const row = rows[idx];
384
- const {
385
- [COUNT]: count,
386
- [DEPTH]: depth,
387
- [KEY]: key,
388
- [IS_LEAF]: isLeaf
389
- } = row;
390
- if (filterset) {
391
- const previousRow = visibleRows.at(-1);
392
- if (missingAncestor(row, previousRow)) {
393
- let currentRow = row;
394
- const missingRows = [];
395
- while (currentRow) {
396
- currentRow = getParentRow(rows, currentRow);
397
- if (currentRow) {
398
- missingRows.unshift(currentRow);
399
- }
400
- }
401
- missingRows.forEach((row2) => {
402
- visibleRows.push(cloneRow(row2, index++, true));
403
- });
404
- }
405
- visibleRows.push(cloneRow(row, index++, true));
406
- visibleRowIndex[index] = i;
407
- } else {
408
- const isExpanded = expandedKeys.has(key);
409
- visibleRows.push(cloneRow(row, index, isExpanded));
410
- visibleRowIndex[index++] = i;
411
- const skipNonVisibleRows = !isLeaf && !isExpanded && count > 0;
412
- if (skipNonVisibleRows) {
413
- do {
414
- i += 1;
415
- } while (i < rows.length - 1 && rows[i + 1][DEPTH] > depth);
416
- }
417
- }
418
- }
419
- return [visibleRows, visibleRowIndex];
420
- }
421
- const cloneRow = (row, index, isExpanded) => {
422
- const dolly = row.slice();
423
- dolly[0] = index;
424
- dolly[1] = index;
425
- if (isExpanded) {
426
- dolly[IS_EXPANDED] = true;
427
- }
428
- return dolly;
429
- };
430
-
431
- export { TreeDataSource };
432
- //# sourceMappingURL=TreeDataSource.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"TreeDataSource.js","sources":["../../../../packages/vuu-data-local/src/tree-data-source/TreeDataSource.ts"],"sourcesContent":["import type { ColumnDescriptor } from \"@vuu-ui/vuu-table-types\";\nimport type {\n LinkDescriptorWithLabel,\n VuuAggregation,\n VuuRange,\n VuuRpcResponse,\n VuuRpcRequest,\n SelectRequest,\n SelectRowRequest,\n} from \"@vuu-ui/vuu-protocol-types\";\nimport type {\n DataSourceRow,\n DataSourceConstructorProps,\n DataSourceStatus,\n DataSourceSubscribeCallback,\n DataSourceSubscribeProps,\n MenuRpcResponse,\n DataSourceFilter,\n DataSource,\n TableSchema,\n} from \"@vuu-ui/vuu-data-types\";\nimport {\n BaseDataSource,\n getParentRow,\n isSingleValueFilter,\n KeySet,\n lastPathSegment,\n metadataKeys,\n missingAncestor,\n NULL_RANGE,\n TreeSourceNode,\n treeToDataSourceRows,\n uuid,\n} from \"@vuu-ui/vuu-utils\";\nimport { IconProvider } from \"./IconProvider\";\nimport { parseFilter } from \"@vuu-ui/vuu-filter-parser\";\nimport { FilterClause } from \"@vuu-ui/vuu-filter-types\";\n\nconst TREE_SCHEMA: TableSchema = {\n columns: [\n { name: \"nodeData\", serverDataType: \"string\" },\n { name: \"Level 1\", serverDataType: \"string\" },\n { name: \"Level 2\", serverDataType: \"string\" },\n { name: \"Level 3\", serverDataType: \"string\" },\n { name: \"Level 4\", serverDataType: \"string\" },\n { name: \"Level 5\", serverDataType: \"string\" },\n ],\n key: \"\",\n table: { module: \"\", table: \"\" },\n};\n\ntype VisibleRowIndex = Record<number, number>;\n\nexport interface TreeDataSourceConstructorProps\n extends Omit<DataSourceConstructorProps, \"bufferSize\" | \"table\"> {\n data: TreeSourceNode[];\n}\n\nconst { COUNT, DEPTH, IDX, IS_EXPANDED, IS_LEAF, KEY, SELECTED } = metadataKeys;\n\nconst toClientRow = (row: DataSourceRow, keys: KeySet) => {\n const [rowIndex] = row;\n const clientRow = row.slice() as DataSourceRow;\n clientRow[1] = keys.keyFor(rowIndex);\n return clientRow;\n};\n\nexport class TreeDataSource extends BaseDataSource implements DataSource {\n public columnDescriptors: ColumnDescriptor[];\n private clientCallback: DataSourceSubscribeCallback | undefined;\n private expandedRows = new Set<string>();\n private visibleRows: DataSourceRow[] = [];\n private visibleRowIndex: VisibleRowIndex = {};\n\n #aggregations: VuuAggregation[] = [];\n #data: DataSourceRow[];\n #iconProvider: IconProvider;\n #selectedRowsCount = 0;\n #size = 0;\n #status: DataSourceStatus = \"initialising\";\n #filterSet: number[] | undefined;\n\n public rowCount: number | undefined;\n\n private keys = new KeySet(this._range);\n\n constructor({ data, ...props }: TreeDataSourceConstructorProps) {\n super(props);\n\n if (!data) {\n throw Error(\"TreeDataSource constructor called without data\");\n }\n this.#iconProvider = new IconProvider();\n\n [this.columnDescriptors, this.#data] = treeToDataSourceRows(\n data,\n this.#iconProvider,\n );\n\n console.table(this.#data);\n\n if (this.columnDescriptors) {\n const columns = this.columnDescriptors.map((c) => c.name);\n this._configWithVisualLink = {\n ...this._configWithVisualLink,\n columns,\n groupBy: columns.slice(1),\n };\n }\n }\n\n async subscribe(\n {\n aggregations,\n columns,\n range,\n revealSelected,\n selectedKeyValues,\n viewport = this.viewport ?? uuid(),\n }: DataSourceSubscribeProps,\n callback: DataSourceSubscribeCallback,\n ) {\n this.clientCallback = callback;\n\n if (aggregations) {\n this.#aggregations = aggregations;\n }\n if (columns) {\n this._configWithVisualLink = {\n ...this._configWithVisualLink,\n columns,\n };\n }\n\n if (this.#status !== \"initialising\") {\n //TODO check if subscription details are still the same\n return;\n }\n\n this.viewport = viewport;\n\n this.#status = \"subscribed\";\n this.#selectedRowsCount = selectedKeyValues?.length ?? 0;\n\n if (selectedKeyValues) {\n this.applySelectedKeyValues(selectedKeyValues, revealSelected);\n }\n\n [this.visibleRows, this.visibleRowIndex] = getVisibleRows(\n this.#data,\n this.expandedRows,\n );\n\n this.clientCallback?.({\n aggregations: this.#aggregations,\n type: \"subscribed\",\n clientViewportId: this.viewport,\n columns: this.columns,\n filterSpec: this.filter,\n groupBy: this._configWithVisualLink.groupBy,\n range: this.range,\n sort: this.sort,\n tableSchema: TREE_SCHEMA,\n });\n\n this.clientCallback({\n clientViewportId: this.viewport,\n mode: \"size-only\",\n type: \"viewport-update\",\n size: this.visibleRows.length,\n });\n\n if (range && !this._range.equals(range)) {\n this.range = range;\n } else if (this._range !== NULL_RANGE) {\n this.sendRowsToClient();\n }\n }\n\n unsubscribe() {\n console.log(\"noop\");\n }\n\n suspend() {\n console.log(\"noop\");\n return this;\n }\n\n resume() {\n console.log(\"noop\");\n return this;\n }\n\n disable() {\n console.log(\"noop\");\n return this;\n }\n\n enable() {\n console.log(\"noop\");\n return this;\n }\n set data(data: TreeSourceNode[]) {\n [this.columnDescriptors, this.#data] = treeToDataSourceRows(data);\n\n requestAnimationFrame(() => {\n this.sendRowsToClient();\n });\n }\n\n get filter() {\n return this._configWithVisualLink.filterSpec;\n }\n\n set filter(filter: DataSourceFilter) {\n // Note not using the setter\n this._configWithVisualLink = {\n ...this._configWithVisualLink,\n filterSpec: filter,\n };\n\n if (filter.filter) {\n this.applyFilter(filter);\n } else {\n this.#filterSet = undefined;\n }\n\n [this.visibleRows, this.visibleRowIndex] = getVisibleRows(\n this.#data,\n this.expandedRows,\n this.#filterSet,\n );\n\n const { from, to } = this.range;\n this.clientCallback?.({\n clientViewportId: this.viewport,\n mode: \"batch\",\n rows: this.visibleRows\n .slice(from, to)\n .map((row) => toClientRow(row, this.keys)),\n size: this.visibleRows.length,\n type: \"viewport-update\",\n });\n }\n\n private applyFilter({ filter: filterQuery, filterStruct }: DataSourceFilter) {\n const filter = filterStruct ?? (parseFilter(filterQuery) as FilterClause);\n if (isSingleValueFilter(filter)) {\n const filterSet = [];\n const regex = new RegExp(`${filter.value}`, \"i\");\n for (const row of this.#data) {\n const { [KEY]: key, [IDX]: idx } = row;\n if (regex.test(lastPathSegment(key, \"|\"))) {\n filterSet.push(idx);\n }\n }\n this.#filterSet = filterSet;\n }\n }\n\n /**\n * used to apply an initial selection. These may not necessarily be\n * visible. If revealOnSelect is in force, expand nodes as necessary\n * to ensure selected nodes are visible\n */\n private applySelectedKeyValues(keys: string[], revealSelected = false) {\n keys.forEach((key) => {\n const rowIdx = this.indexOfRowWithKey(key);\n const row = this.#data[rowIdx];\n row[SELECTED] = 1;\n\n if (revealSelected && row[DEPTH] !== 1) {\n const keys = key.slice(6).split(\"|\").slice(0, -1);\n\n let path = \"$root\";\n do {\n path = `${path}|${keys.shift()}`;\n this.expandedRows.add(path);\n } while (keys.length);\n }\n });\n }\n\n private indexOfRowWithKey = (key: string) =>\n this.#data.findIndex((row) => row[KEY] === key);\n\n select(selectRequest: Omit<SelectRequest, \"vpId\">) {\n // todo get a diff\n const updatedRows: DataSourceRow[] = [];\n\n switch (selectRequest.type) {\n case \"SELECT_ROW\": {\n const { preserveExistingSelection, rowKey } = selectRequest as Omit<\n SelectRowRequest,\n \"vpId\"\n >;\n for (const row of this.visibleRows) {\n const { [IDX]: rowIndex, [KEY]: key, [SELECTED]: sel } = row;\n if (\n sel === 1 &&\n preserveExistingSelection === false &&\n key !== rowKey\n ) {\n const deselectedRow = row.slice() as DataSourceRow;\n deselectedRow[SELECTED] = 0;\n this.visibleRows[rowIndex] = deselectedRow;\n updatedRows.push(deselectedRow);\n } else if (key === rowKey) {\n const selectedRow = row.slice() as DataSourceRow;\n selectedRow[SELECTED] = 1;\n this.visibleRows[rowIndex] = selectedRow;\n updatedRows.push(selectedRow);\n }\n }\n\n break;\n }\n case \"DESELECT_ROW\": {\n break;\n }\n\n default:\n // ignore\n }\n\n if (updatedRows.length > 0) {\n this.clientCallback?.({\n clientViewportId: this.viewport,\n mode: \"update\",\n type: \"viewport-update\",\n rows: updatedRows,\n });\n }\n }\n\n private getRowKey(keyOrIndex: string | number) {\n if (typeof keyOrIndex === \"string\") {\n return keyOrIndex;\n }\n const row = this.getRowAtIndex(keyOrIndex);\n if (row === undefined) {\n throw Error(`row not found at index ${keyOrIndex}`);\n }\n return row[KEY];\n }\n\n openTreeNode(keyOrIndex: string | number) {\n const key = this.getRowKey(keyOrIndex);\n this.expandedRows.add(key);\n [this.visibleRows, this.visibleRowIndex] = getVisibleRows(\n this.#data,\n this.expandedRows,\n );\n\n const { from, to } = this._range;\n this.clientCallback?.({\n clientViewportId: this.viewport,\n\n mode: \"batch\",\n rows: this.visibleRows\n .slice(from, to)\n .map((row) => toClientRow(row, this.keys)),\n size: this.visibleRows.length,\n type: \"viewport-update\",\n });\n }\n\n closeTreeNode(keyOrIndex: string | number, cascade = false) {\n const key = this.getRowKey(keyOrIndex);\n this.expandedRows.delete(key);\n if (cascade) {\n for (const rowKey of this.expandedRows.keys()) {\n if (rowKey.startsWith(key)) {\n this.expandedRows.delete(rowKey);\n }\n }\n }\n [this.visibleRows, this.visibleRowIndex] = getVisibleRows(\n this.#data,\n this.expandedRows,\n );\n this.sendRowsToClient();\n }\n\n get status() {\n return this.#status;\n }\n\n get selectedRowsCount() {\n return this.#selectedRowsCount;\n }\n\n get size() {\n return this.#size;\n }\n\n rangeRequest(range: VuuRange) {\n this.keys.reset(range);\n requestAnimationFrame(() => {\n this.sendRowsToClient();\n });\n }\n\n private sendRowsToClient() {\n const { from, to } = this._range;\n this.clientCallback?.({\n clientViewportId: this.viewport,\n mode: \"batch\",\n rows: this.visibleRows\n .slice(from, to)\n .map((row) => toClientRow(row, this.keys)),\n size: this.visibleRows.length,\n type: \"viewport-update\",\n });\n }\n\n createLink({\n parentVpId,\n link: { fromColumn, toColumn },\n }: LinkDescriptorWithLabel) {\n console.log(\"create link\", {\n parentVpId,\n fromColumn,\n toColumn,\n });\n }\n\n removeLink() {\n console.log(\"remove link\");\n }\n\n async remoteProcedureCall<T extends VuuRpcResponse = VuuRpcResponse>() {\n return Promise.reject<T>();\n }\n\n async menuRpcCall(\n rpcRequest: Omit<VuuRpcRequest, \"vpId\">,\n ): Promise<MenuRpcResponse | undefined> {\n console.log(\"rmenuRpcCall\", {\n rpcRequest,\n });\n return undefined;\n }\n\n getChildRows(rowKey: string) {\n const parentRow = this.#data.find((row) => row[KEY] === rowKey);\n if (parentRow) {\n const { [IDX]: parentIdx, [DEPTH]: parentDepth } = parentRow;\n let rowIdx = parentIdx + 1;\n const childRows = [];\n do {\n const { [DEPTH]: depth } = this.#data[rowIdx];\n if (depth === parentDepth + 1) {\n childRows.push(this.#data[rowIdx]);\n } else if (depth <= parentDepth) {\n break;\n }\n rowIdx += 1;\n } while (rowIdx < this.#data.length);\n return childRows;\n } else {\n console.warn(\n `JsonDataSource getChildRows row not found for key ${rowKey}`,\n );\n }\n\n return [];\n }\n\n getRowsAtDepth(depth: number, visibleOnly = true) {\n const rows = visibleOnly ? this.visibleRows : this.#data;\n return rows.filter((row) => row[DEPTH] === depth);\n }\n\n getRowAtIndex(rowIdx: number) {\n return this.visibleRows[rowIdx];\n }\n}\n\nfunction getVisibleRows(\n rows: DataSourceRow[],\n expandedKeys: Set<string>,\n filterset?: number[],\n): [visibleRows: DataSourceRow[], index: VisibleRowIndex] {\n const visibleRows: DataSourceRow[] = [];\n const visibleRowIndex: VisibleRowIndex = {};\n\n const data = filterset ?? rows;\n\n for (let i = 0, index = 0; i < data.length; i++) {\n const idx = filterset ? filterset[i] : i;\n const row = rows[idx];\n const {\n [COUNT]: count,\n [DEPTH]: depth,\n [KEY]: key,\n [IS_LEAF]: isLeaf,\n } = row;\n if (filterset) {\n // assume expanded for now\n\n // if we have skipped a higher level group (that didn't directly match\n // our filter criteria, add it.\n const previousRow = visibleRows.at(-1);\n if (missingAncestor(row, previousRow)) {\n let currentRow: DataSourceRow | undefined = row;\n const missingRows = [];\n while (currentRow) {\n currentRow = getParentRow(rows, currentRow);\n if (currentRow) {\n // we will get the missing rows in reverse order\n missingRows.unshift(currentRow);\n }\n }\n missingRows.forEach((row) => {\n visibleRows.push(cloneRow(row, index++, true));\n });\n }\n\n visibleRows.push(cloneRow(row, index++, true));\n visibleRowIndex[index] = i;\n } else {\n const isExpanded = expandedKeys.has(key);\n visibleRows.push(cloneRow(row, index, isExpanded));\n visibleRowIndex[index++] = i;\n const skipNonVisibleRows = !isLeaf && !isExpanded && count > 0;\n if (skipNonVisibleRows) {\n do {\n i += 1;\n } while (i < rows.length - 1 && rows[i + 1][DEPTH] > depth);\n }\n }\n }\n return [visibleRows, visibleRowIndex];\n}\n\nconst cloneRow = (\n row: DataSourceRow,\n index: number,\n isExpanded: boolean,\n): DataSourceRow => {\n const dolly = row.slice() as DataSourceRow;\n dolly[0] = index;\n dolly[1] = index;\n if (isExpanded) {\n dolly[IS_EXPANDED] = true;\n }\n return dolly;\n};\n"],"names":["keys","row"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAAA,IAAA,aAAA,EAAA,KAAA,EAAA,aAAA,EAAA,kBAAA,EAAA,KAAA,EAAA,OAAA,EAAA,UAAA;AAsCA,MAAM,WAA2B,GAAA;AAAA,EAC/B,OAAS,EAAA;AAAA,IACP,EAAE,IAAA,EAAM,UAAY,EAAA,cAAA,EAAgB,QAAS,EAAA;AAAA,IAC7C,EAAE,IAAA,EAAM,SAAW,EAAA,cAAA,EAAgB,QAAS,EAAA;AAAA,IAC5C,EAAE,IAAA,EAAM,SAAW,EAAA,cAAA,EAAgB,QAAS,EAAA;AAAA,IAC5C,EAAE,IAAA,EAAM,SAAW,EAAA,cAAA,EAAgB,QAAS,EAAA;AAAA,IAC5C,EAAE,IAAA,EAAM,SAAW,EAAA,cAAA,EAAgB,QAAS,EAAA;AAAA,IAC5C,EAAE,IAAA,EAAM,SAAW,EAAA,cAAA,EAAgB,QAAS;AAAA,GAC9C;AAAA,EACA,GAAK,EAAA,EAAA;AAAA,EACL,KAAO,EAAA,EAAE,MAAQ,EAAA,EAAA,EAAI,OAAO,EAAG;AACjC,CAAA;AASA,MAAM,EAAE,OAAO,KAAO,EAAA,GAAA,EAAK,aAAa,OAAS,EAAA,GAAA,EAAK,UAAa,GAAA,YAAA;AAEnE,MAAM,WAAA,GAAc,CAAC,GAAA,EAAoB,IAAiB,KAAA;AACxD,EAAM,MAAA,CAAC,QAAQ,CAAI,GAAA,GAAA;AACnB,EAAM,MAAA,SAAA,GAAY,IAAI,KAAM,EAAA;AAC5B,EAAA,SAAA,CAAU,CAAC,CAAA,GAAI,IAAK,CAAA,MAAA,CAAO,QAAQ,CAAA;AACnC,EAAO,OAAA,SAAA;AACT,CAAA;AAEO,MAAM,uBAAuB,cAAqC,CAAA;AAAA,EAmBvE,WAAY,CAAA,EAAE,IAAM,EAAA,GAAG,OAAyC,EAAA;AAC9D,IAAA,KAAA,CAAM,KAAK,CAAA;AAnBb,IAAO,aAAA,CAAA,IAAA,EAAA,mBAAA,CAAA;AACP,IAAQ,aAAA,CAAA,IAAA,EAAA,gBAAA,CAAA;AACR,IAAQ,aAAA,CAAA,IAAA,EAAA,cAAA,sBAAmB,GAAY,EAAA,CAAA;AACvC,IAAA,aAAA,CAAA,IAAA,EAAQ,eAA+B,EAAC,CAAA;AACxC,IAAA,aAAA,CAAA,IAAA,EAAQ,mBAAmC,EAAC,CAAA;AAE5C,IAAA,YAAA,CAAA,IAAA,EAAA,aAAA,EAAkC,EAAC,CAAA;AACnC,IAAA,YAAA,CAAA,IAAA,EAAA,KAAA,CAAA;AACA,IAAA,YAAA,CAAA,IAAA,EAAA,aAAA,CAAA;AACA,IAAqB,YAAA,CAAA,IAAA,EAAA,kBAAA,EAAA,CAAA,CAAA;AACrB,IAAQ,YAAA,CAAA,IAAA,EAAA,KAAA,EAAA,CAAA,CAAA;AACR,IAA4B,YAAA,CAAA,IAAA,EAAA,OAAA,EAAA,cAAA,CAAA;AAC5B,IAAA,YAAA,CAAA,IAAA,EAAA,UAAA,CAAA;AAEA,IAAO,aAAA,CAAA,IAAA,EAAA,UAAA,CAAA;AAEP,IAAA,aAAA,CAAA,IAAA,EAAQ,MAAO,EAAA,IAAI,MAAO,CAAA,IAAA,CAAK,MAAM,CAAA,CAAA;AAuMrC,IAAQ,aAAA,CAAA,IAAA,EAAA,mBAAA,EAAoB,CAAC,GAAA,KAC3B,YAAK,CAAA,IAAA,EAAA,KAAA,CAAA,CAAM,SAAU,CAAA,CAAC,GAAQ,KAAA,GAAA,CAAI,GAAG,CAAA,KAAM,GAAG,CAAA,CAAA;AAnM9C,IAAA,IAAI,CAAC,IAAM,EAAA;AACT,MAAA,MAAM,MAAM,gDAAgD,CAAA;AAAA;AAE9D,IAAK,YAAA,CAAA,IAAA,EAAA,aAAA,EAAgB,IAAI,YAAa,EAAA,CAAA;AAEtC,IAAC,CAAA,IAAA,CAAK,iBAAmB,EAAA,gBAAA,CAAA,IAAA,EAAA,KAAA,CAAA,CAAA,CAAU,CAAI,GAAA,oBAAA;AAAA,MACrC,IAAA;AAAA,MACA,YAAK,CAAA,IAAA,EAAA,aAAA;AAAA,KACP;AAEA,IAAQ,OAAA,CAAA,KAAA,CAAM,mBAAK,KAAK,CAAA,CAAA;AAExB,IAAA,IAAI,KAAK,iBAAmB,EAAA;AAC1B,MAAA,MAAM,UAAU,IAAK,CAAA,iBAAA,CAAkB,IAAI,CAAC,CAAA,KAAM,EAAE,IAAI,CAAA;AACxD,MAAA,IAAA,CAAK,qBAAwB,GAAA;AAAA,QAC3B,GAAG,IAAK,CAAA,qBAAA;AAAA,QACR,OAAA;AAAA,QACA,OAAA,EAAS,OAAQ,CAAA,KAAA,CAAM,CAAC;AAAA,OAC1B;AAAA;AACF;AACF,EAEA,MAAM,SACJ,CAAA;AAAA,IACE,YAAA;AAAA,IACA,OAAA;AAAA,IACA,KAAA;AAAA,IACA,cAAA;AAAA,IACA,iBAAA;AAAA,IACA,QAAA,GAAW,IAAK,CAAA,QAAA,IAAY,IAAK;AAAA,KAEnC,QACA,EAAA;AACA,IAAA,IAAA,CAAK,cAAiB,GAAA,QAAA;AAEtB,IAAA,IAAI,YAAc,EAAA;AAChB,MAAA,YAAA,CAAA,IAAA,EAAK,aAAgB,EAAA,YAAA,CAAA;AAAA;AAEvB,IAAA,IAAI,OAAS,EAAA;AACX,MAAA,IAAA,CAAK,qBAAwB,GAAA;AAAA,QAC3B,GAAG,IAAK,CAAA,qBAAA;AAAA,QACR;AAAA,OACF;AAAA;AAGF,IAAI,IAAA,YAAA,CAAA,IAAA,EAAK,aAAY,cAAgB,EAAA;AAEnC,MAAA;AAAA;AAGF,IAAA,IAAA,CAAK,QAAW,GAAA,QAAA;AAEhB,IAAA,YAAA,CAAA,IAAA,EAAK,OAAU,EAAA,YAAA,CAAA;AACf,IAAK,YAAA,CAAA,IAAA,EAAA,kBAAA,EAAqB,mBAAmB,MAAU,IAAA,CAAA,CAAA;AAEvD,IAAA,IAAI,iBAAmB,EAAA;AACrB,MAAK,IAAA,CAAA,sBAAA,CAAuB,mBAAmB,cAAc,CAAA;AAAA;AAG/D,IAAA,CAAC,IAAK,CAAA,WAAA,EAAa,IAAK,CAAA,eAAe,CAAI,GAAA,cAAA;AAAA,MACzC,YAAK,CAAA,IAAA,EAAA,KAAA,CAAA;AAAA,MACL,IAAK,CAAA;AAAA,KACP;AAEA,IAAA,IAAA,CAAK,cAAiB,GAAA;AAAA,MACpB,cAAc,YAAK,CAAA,IAAA,EAAA,aAAA,CAAA;AAAA,MACnB,IAAM,EAAA,YAAA;AAAA,MACN,kBAAkB,IAAK,CAAA,QAAA;AAAA,MACvB,SAAS,IAAK,CAAA,OAAA;AAAA,MACd,YAAY,IAAK,CAAA,MAAA;AAAA,MACjB,OAAA,EAAS,KAAK,qBAAsB,CAAA,OAAA;AAAA,MACpC,OAAO,IAAK,CAAA,KAAA;AAAA,MACZ,MAAM,IAAK,CAAA,IAAA;AAAA,MACX,WAAa,EAAA;AAAA,KACd,CAAA;AAED,IAAA,IAAA,CAAK,cAAe,CAAA;AAAA,MAClB,kBAAkB,IAAK,CAAA,QAAA;AAAA,MACvB,IAAM,EAAA,WAAA;AAAA,MACN,IAAM,EAAA,iBAAA;AAAA,MACN,IAAA,EAAM,KAAK,WAAY,CAAA;AAAA,KACxB,CAAA;AAED,IAAA,IAAI,SAAS,CAAC,IAAA,CAAK,MAAO,CAAA,MAAA,CAAO,KAAK,CAAG,EAAA;AACvC,MAAA,IAAA,CAAK,KAAQ,GAAA,KAAA;AAAA,KACf,MAAA,IAAW,IAAK,CAAA,MAAA,KAAW,UAAY,EAAA;AACrC,MAAA,IAAA,CAAK,gBAAiB,EAAA;AAAA;AACxB;AACF,EAEA,WAAc,GAAA;AACZ,IAAA,OAAA,CAAQ,IAAI,MAAM,CAAA;AAAA;AACpB,EAEA,OAAU,GAAA;AACR,IAAA,OAAA,CAAQ,IAAI,MAAM,CAAA;AAClB,IAAO,OAAA,IAAA;AAAA;AACT,EAEA,MAAS,GAAA;AACP,IAAA,OAAA,CAAQ,IAAI,MAAM,CAAA;AAClB,IAAO,OAAA,IAAA;AAAA;AACT,EAEA,OAAU,GAAA;AACR,IAAA,OAAA,CAAQ,IAAI,MAAM,CAAA;AAClB,IAAO,OAAA,IAAA;AAAA;AACT,EAEA,MAAS,GAAA;AACP,IAAA,OAAA,CAAQ,IAAI,MAAM,CAAA;AAClB,IAAO,OAAA,IAAA;AAAA;AACT,EACA,IAAI,KAAK,IAAwB,EAAA;AAC/B,IAAA,CAAC,IAAK,CAAA,iBAAA,EAAmB,gBAAU,CAAA,IAAA,EAAA,KAAA,CAAA,CAAA,CAAA,CAAA,GAAI,qBAAqB,IAAI,CAAA;AAEhE,IAAA,qBAAA,CAAsB,MAAM;AAC1B,MAAA,IAAA,CAAK,gBAAiB,EAAA;AAAA,KACvB,CAAA;AAAA;AACH,EAEA,IAAI,MAAS,GAAA;AACX,IAAA,OAAO,KAAK,qBAAsB,CAAA,UAAA;AAAA;AACpC,EAEA,IAAI,OAAO,MAA0B,EAAA;AAEnC,IAAA,IAAA,CAAK,qBAAwB,GAAA;AAAA,MAC3B,GAAG,IAAK,CAAA,qBAAA;AAAA,MACR,UAAY,EAAA;AAAA,KACd;AAEA,IAAA,IAAI,OAAO,MAAQ,EAAA;AACjB,MAAA,IAAA,CAAK,YAAY,MAAM,CAAA;AAAA,KAClB,MAAA;AACL,MAAA,YAAA,CAAA,IAAA,EAAK,UAAa,EAAA,KAAA,CAAA,CAAA;AAAA;AAGpB,IAAA,CAAC,IAAK,CAAA,WAAA,EAAa,IAAK,CAAA,eAAe,CAAI,GAAA,cAAA;AAAA,MACzC,YAAK,CAAA,IAAA,EAAA,KAAA,CAAA;AAAA,MACL,IAAK,CAAA,YAAA;AAAA,MACL,YAAK,CAAA,IAAA,EAAA,UAAA;AAAA,KACP;AAEA,IAAA,MAAM,EAAE,IAAA,EAAM,EAAG,EAAA,GAAI,IAAK,CAAA,KAAA;AAC1B,IAAA,IAAA,CAAK,cAAiB,GAAA;AAAA,MACpB,kBAAkB,IAAK,CAAA,QAAA;AAAA,MACvB,IAAM,EAAA,OAAA;AAAA,MACN,IAAM,EAAA,IAAA,CAAK,WACR,CAAA,KAAA,CAAM,MAAM,EAAE,CAAA,CACd,GAAI,CAAA,CAAC,GAAQ,KAAA,WAAA,CAAY,GAAK,EAAA,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,MAC3C,IAAA,EAAM,KAAK,WAAY,CAAA,MAAA;AAAA,MACvB,IAAM,EAAA;AAAA,KACP,CAAA;AAAA;AACH,EAEQ,WAAY,CAAA,EAAE,MAAQ,EAAA,WAAA,EAAa,cAAkC,EAAA;AAC3E,IAAM,MAAA,MAAA,GAAS,YAAiB,IAAA,WAAA,CAAY,WAAW,CAAA;AACvD,IAAI,IAAA,mBAAA,CAAoB,MAAM,CAAG,EAAA;AAC/B,MAAA,MAAM,YAAY,EAAC;AACnB,MAAA,MAAM,QAAQ,IAAI,MAAA,CAAO,GAAG,MAAO,CAAA,KAAK,IAAI,GAAG,CAAA;AAC/C,MAAW,KAAA,MAAA,GAAA,IAAO,mBAAK,KAAO,CAAA,EAAA;AAC5B,QAAM,MAAA,EAAE,CAAC,GAAG,GAAG,KAAK,CAAC,GAAG,GAAG,GAAA,EAAQ,GAAA,GAAA;AACnC,QAAA,IAAI,MAAM,IAAK,CAAA,eAAA,CAAgB,GAAK,EAAA,GAAG,CAAC,CAAG,EAAA;AACzC,UAAA,SAAA,CAAU,KAAK,GAAG,CAAA;AAAA;AACpB;AAEF,MAAA,YAAA,CAAA,IAAA,EAAK,UAAa,EAAA,SAAA,CAAA;AAAA;AACpB;AACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,sBAAA,CAAuB,IAAgB,EAAA,cAAA,GAAiB,KAAO,EAAA;AACrE,IAAK,IAAA,CAAA,OAAA,CAAQ,CAAC,GAAQ,KAAA;AACpB,MAAM,MAAA,MAAA,GAAS,IAAK,CAAA,iBAAA,CAAkB,GAAG,CAAA;AACzC,MAAM,MAAA,GAAA,GAAM,YAAK,CAAA,IAAA,EAAA,KAAA,CAAA,CAAM,MAAM,CAAA;AAC7B,MAAA,GAAA,CAAI,QAAQ,CAAI,GAAA,CAAA;AAEhB,MAAA,IAAI,cAAkB,IAAA,GAAA,CAAI,KAAK,CAAA,KAAM,CAAG,EAAA;AACtC,QAAMA,MAAAA,KAAAA,GAAO,GAAI,CAAA,KAAA,CAAM,CAAC,CAAA,CAAE,MAAM,GAAG,CAAA,CAAE,KAAM,CAAA,CAAA,EAAG,CAAE,CAAA,CAAA;AAEhD,QAAA,IAAI,IAAO,GAAA,OAAA;AACX,QAAG,GAAA;AACD,UAAA,IAAA,GAAO,CAAG,EAAA,IAAI,CAAIA,CAAAA,EAAAA,KAAAA,CAAK,OAAO,CAAA,CAAA;AAC9B,UAAK,IAAA,CAAA,YAAA,CAAa,IAAI,IAAI,CAAA;AAAA,iBACnBA,KAAK,CAAA,MAAA;AAAA;AAChB,KACD,CAAA;AAAA;AACH,EAKA,OAAO,aAA4C,EAAA;AAEjD,IAAA,MAAM,cAA+B,EAAC;AAEtC,IAAA,QAAQ,cAAc,IAAM;AAAA,MAC1B,KAAK,YAAc,EAAA;AACjB,QAAM,MAAA,EAAE,yBAA2B,EAAA,MAAA,EAAW,GAAA,aAAA;AAI9C,QAAW,KAAA,MAAA,GAAA,IAAO,KAAK,WAAa,EAAA;AAClC,UAAA,MAAM,EAAE,CAAC,GAAG,GAAG,QAAU,EAAA,CAAC,GAAG,GAAG,GAAK,EAAA,CAAC,QAAQ,GAAG,KAAQ,GAAA,GAAA;AACzD,UAAA,IACE,GAAQ,KAAA,CAAA,IACR,yBAA8B,KAAA,KAAA,IAC9B,QAAQ,MACR,EAAA;AACA,YAAM,MAAA,aAAA,GAAgB,IAAI,KAAM,EAAA;AAChC,YAAA,aAAA,CAAc,QAAQ,CAAI,GAAA,CAAA;AAC1B,YAAK,IAAA,CAAA,WAAA,CAAY,QAAQ,CAAI,GAAA,aAAA;AAC7B,YAAA,WAAA,CAAY,KAAK,aAAa,CAAA;AAAA,WAChC,MAAA,IAAW,QAAQ,MAAQ,EAAA;AACzB,YAAM,MAAA,WAAA,GAAc,IAAI,KAAM,EAAA;AAC9B,YAAA,WAAA,CAAY,QAAQ,CAAI,GAAA,CAAA;AACxB,YAAK,IAAA,CAAA,WAAA,CAAY,QAAQ,CAAI,GAAA,WAAA;AAC7B,YAAA,WAAA,CAAY,KAAK,WAAW,CAAA;AAAA;AAC9B;AAGF,QAAA;AAAA;AAMF;AAIF,IAAI,IAAA,WAAA,CAAY,SAAS,CAAG,EAAA;AAC1B,MAAA,IAAA,CAAK,cAAiB,GAAA;AAAA,QACpB,kBAAkB,IAAK,CAAA,QAAA;AAAA,QACvB,IAAM,EAAA,QAAA;AAAA,QACN,IAAM,EAAA,iBAAA;AAAA,QACN,IAAM,EAAA;AAAA,OACP,CAAA;AAAA;AACH;AACF,EAEQ,UAAU,UAA6B,EAAA;AAC7C,IAAI,IAAA,OAAO,eAAe,QAAU,EAAA;AAClC,MAAO,OAAA,UAAA;AAAA;AAET,IAAM,MAAA,GAAA,GAAM,IAAK,CAAA,aAAA,CAAc,UAAU,CAAA;AACzC,IAAA,IAAI,QAAQ,KAAW,CAAA,EAAA;AACrB,MAAM,MAAA,KAAA,CAAM,CAA0B,uBAAA,EAAA,UAAU,CAAE,CAAA,CAAA;AAAA;AAEpD,IAAA,OAAO,IAAI,GAAG,CAAA;AAAA;AAChB,EAEA,aAAa,UAA6B,EAAA;AACxC,IAAM,MAAA,GAAA,GAAM,IAAK,CAAA,SAAA,CAAU,UAAU,CAAA;AACrC,IAAK,IAAA,CAAA,YAAA,CAAa,IAAI,GAAG,CAAA;AACzB,IAAA,CAAC,IAAK,CAAA,WAAA,EAAa,IAAK,CAAA,eAAe,CAAI,GAAA,cAAA;AAAA,MACzC,YAAK,CAAA,IAAA,EAAA,KAAA,CAAA;AAAA,MACL,IAAK,CAAA;AAAA,KACP;AAEA,IAAA,MAAM,EAAE,IAAA,EAAM,EAAG,EAAA,GAAI,IAAK,CAAA,MAAA;AAC1B,IAAA,IAAA,CAAK,cAAiB,GAAA;AAAA,MACpB,kBAAkB,IAAK,CAAA,QAAA;AAAA,MAEvB,IAAM,EAAA,OAAA;AAAA,MACN,IAAM,EAAA,IAAA,CAAK,WACR,CAAA,KAAA,CAAM,MAAM,EAAE,CAAA,CACd,GAAI,CAAA,CAAC,GAAQ,KAAA,WAAA,CAAY,GAAK,EAAA,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,MAC3C,IAAA,EAAM,KAAK,WAAY,CAAA,MAAA;AAAA,MACvB,IAAM,EAAA;AAAA,KACP,CAAA;AAAA;AACH,EAEA,aAAA,CAAc,UAA6B,EAAA,OAAA,GAAU,KAAO,EAAA;AAC1D,IAAM,MAAA,GAAA,GAAM,IAAK,CAAA,SAAA,CAAU,UAAU,CAAA;AACrC,IAAK,IAAA,CAAA,YAAA,CAAa,OAAO,GAAG,CAAA;AAC5B,IAAA,IAAI,OAAS,EAAA;AACX,MAAA,KAAA,MAAW,MAAU,IAAA,IAAA,CAAK,YAAa,CAAA,IAAA,EAAQ,EAAA;AAC7C,QAAI,IAAA,MAAA,CAAO,UAAW,CAAA,GAAG,CAAG,EAAA;AAC1B,UAAK,IAAA,CAAA,YAAA,CAAa,OAAO,MAAM,CAAA;AAAA;AACjC;AACF;AAEF,IAAA,CAAC,IAAK,CAAA,WAAA,EAAa,IAAK,CAAA,eAAe,CAAI,GAAA,cAAA;AAAA,MACzC,YAAK,CAAA,IAAA,EAAA,KAAA,CAAA;AAAA,MACL,IAAK,CAAA;AAAA,KACP;AACA,IAAA,IAAA,CAAK,gBAAiB,EAAA;AAAA;AACxB,EAEA,IAAI,MAAS,GAAA;AACX,IAAA,OAAO,YAAK,CAAA,IAAA,EAAA,OAAA,CAAA;AAAA;AACd,EAEA,IAAI,iBAAoB,GAAA;AACtB,IAAA,OAAO,YAAK,CAAA,IAAA,EAAA,kBAAA,CAAA;AAAA;AACd,EAEA,IAAI,IAAO,GAAA;AACT,IAAA,OAAO,YAAK,CAAA,IAAA,EAAA,KAAA,CAAA;AAAA;AACd,EAEA,aAAa,KAAiB,EAAA;AAC5B,IAAK,IAAA,CAAA,IAAA,CAAK,MAAM,KAAK,CAAA;AACrB,IAAA,qBAAA,CAAsB,MAAM;AAC1B,MAAA,IAAA,CAAK,gBAAiB,EAAA;AAAA,KACvB,CAAA;AAAA;AACH,EAEQ,gBAAmB,GAAA;AACzB,IAAA,MAAM,EAAE,IAAA,EAAM,EAAG,EAAA,GAAI,IAAK,CAAA,MAAA;AAC1B,IAAA,IAAA,CAAK,cAAiB,GAAA;AAAA,MACpB,kBAAkB,IAAK,CAAA,QAAA;AAAA,MACvB,IAAM,EAAA,OAAA;AAAA,MACN,IAAM,EAAA,IAAA,CAAK,WACR,CAAA,KAAA,CAAM,MAAM,EAAE,CAAA,CACd,GAAI,CAAA,CAAC,GAAQ,KAAA,WAAA,CAAY,GAAK,EAAA,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,MAC3C,IAAA,EAAM,KAAK,WAAY,CAAA,MAAA;AAAA,MACvB,IAAM,EAAA;AAAA,KACP,CAAA;AAAA;AACH,EAEA,UAAW,CAAA;AAAA,IACT,UAAA;AAAA,IACA,IAAA,EAAM,EAAE,UAAA,EAAY,QAAS;AAAA,GACH,EAAA;AAC1B,IAAA,OAAA,CAAQ,IAAI,aAAe,EAAA;AAAA,MACzB,UAAA;AAAA,MACA,UAAA;AAAA,MACA;AAAA,KACD,CAAA;AAAA;AACH,EAEA,UAAa,GAAA;AACX,IAAA,OAAA,CAAQ,IAAI,aAAa,CAAA;AAAA;AAC3B,EAEA,MAAM,mBAAiE,GAAA;AACrE,IAAA,OAAO,QAAQ,MAAU,EAAA;AAAA;AAC3B,EAEA,MAAM,YACJ,UACsC,EAAA;AACtC,IAAA,OAAA,CAAQ,IAAI,cAAgB,EAAA;AAAA,MAC1B;AAAA,KACD,CAAA;AACD,IAAO,OAAA,KAAA,CAAA;AAAA;AACT,EAEA,aAAa,MAAgB,EAAA;AAC3B,IAAM,MAAA,SAAA,GAAY,mBAAK,KAAM,CAAA,CAAA,IAAA,CAAK,CAAC,GAAQ,KAAA,GAAA,CAAI,GAAG,CAAA,KAAM,MAAM,CAAA;AAC9D,IAAA,IAAI,SAAW,EAAA;AACb,MAAM,MAAA,EAAE,CAAC,GAAG,GAAG,WAAW,CAAC,KAAK,GAAG,WAAA,EAAgB,GAAA,SAAA;AACnD,MAAA,IAAI,SAAS,SAAY,GAAA,CAAA;AACzB,MAAA,MAAM,YAAY,EAAC;AACnB,MAAG,GAAA;AACD,QAAM,MAAA,EAAE,CAAC,KAAK,GAAG,OAAU,GAAA,YAAA,CAAA,IAAA,EAAK,OAAM,MAAM,CAAA;AAC5C,QAAI,IAAA,KAAA,KAAU,cAAc,CAAG,EAAA;AAC7B,UAAA,SAAA,CAAU,IAAK,CAAA,YAAA,CAAA,IAAA,EAAK,KAAM,CAAA,CAAA,MAAM,CAAC,CAAA;AAAA,SACnC,MAAA,IAAW,SAAS,WAAa,EAAA;AAC/B,UAAA;AAAA;AAEF,QAAU,MAAA,IAAA,CAAA;AAAA,OACZ,QAAS,MAAS,GAAA,YAAA,CAAA,IAAA,EAAK,KAAM,CAAA,CAAA,MAAA;AAC7B,MAAO,OAAA,SAAA;AAAA,KACF,MAAA;AACL,MAAQ,OAAA,CAAA,IAAA;AAAA,QACN,qDAAqD,MAAM,CAAA;AAAA,OAC7D;AAAA;AAGF,IAAA,OAAO,EAAC;AAAA;AACV,EAEA,cAAA,CAAe,KAAe,EAAA,WAAA,GAAc,IAAM,EAAA;AAChD,IAAA,MAAM,IAAO,GAAA,WAAA,GAAc,IAAK,CAAA,WAAA,GAAc,YAAK,CAAA,IAAA,EAAA,KAAA,CAAA;AACnD,IAAA,OAAO,KAAK,MAAO,CAAA,CAAC,QAAQ,GAAI,CAAA,KAAK,MAAM,KAAK,CAAA;AAAA;AAClD,EAEA,cAAc,MAAgB,EAAA;AAC5B,IAAO,OAAA,IAAA,CAAK,YAAY,MAAM,CAAA;AAAA;AAElC;AAnZE,aAAA,GAAA,IAAA,OAAA,EAAA;AACA,KAAA,GAAA,IAAA,OAAA,EAAA;AACA,aAAA,GAAA,IAAA,OAAA,EAAA;AACA,kBAAA,GAAA,IAAA,OAAA,EAAA;AACA,KAAA,GAAA,IAAA,OAAA,EAAA;AACA,OAAA,GAAA,IAAA,OAAA,EAAA;AACA,UAAA,GAAA,IAAA,OAAA,EAAA;AA+YF,SAAS,cAAA,CACP,IACA,EAAA,YAAA,EACA,SACwD,EAAA;AACxD,EAAA,MAAM,cAA+B,EAAC;AACtC,EAAA,MAAM,kBAAmC,EAAC;AAE1C,EAAA,MAAM,OAAO,SAAa,IAAA,IAAA;AAE1B,EAAA,KAAA,IAAS,IAAI,CAAG,EAAA,KAAA,GAAQ,GAAG,CAAI,GAAA,IAAA,CAAK,QAAQ,CAAK,EAAA,EAAA;AAC/C,IAAA,MAAM,GAAM,GAAA,SAAA,GAAY,SAAU,CAAA,CAAC,CAAI,GAAA,CAAA;AACvC,IAAM,MAAA,GAAA,GAAM,KAAK,GAAG,CAAA;AACpB,IAAM,MAAA;AAAA,MACJ,CAAC,KAAK,GAAG,KAAA;AAAA,MACT,CAAC,KAAK,GAAG,KAAA;AAAA,MACT,CAAC,GAAG,GAAG,GAAA;AAAA,MACP,CAAC,OAAO,GAAG;AAAA,KACT,GAAA,GAAA;AACJ,IAAA,IAAI,SAAW,EAAA;AAKb,MAAM,MAAA,WAAA,GAAc,WAAY,CAAA,EAAA,CAAG,CAAE,CAAA,CAAA;AACrC,MAAI,IAAA,eAAA,CAAgB,GAAK,EAAA,WAAW,CAAG,EAAA;AACrC,QAAA,IAAI,UAAwC,GAAA,GAAA;AAC5C,QAAA,MAAM,cAAc,EAAC;AACrB,QAAA,OAAO,UAAY,EAAA;AACjB,UAAa,UAAA,GAAA,YAAA,CAAa,MAAM,UAAU,CAAA;AAC1C,UAAA,IAAI,UAAY,EAAA;AAEd,YAAA,WAAA,CAAY,QAAQ,UAAU,CAAA;AAAA;AAChC;AAEF,QAAY,WAAA,CAAA,OAAA,CAAQ,CAACC,IAAQ,KAAA;AAC3B,UAAA,WAAA,CAAY,IAAK,CAAA,QAAA,CAASA,IAAK,EAAA,KAAA,EAAA,EAAS,IAAI,CAAC,CAAA;AAAA,SAC9C,CAAA;AAAA;AAGH,MAAA,WAAA,CAAY,IAAK,CAAA,QAAA,CAAS,GAAK,EAAA,KAAA,EAAA,EAAS,IAAI,CAAC,CAAA;AAC7C,MAAA,eAAA,CAAgB,KAAK,CAAI,GAAA,CAAA;AAAA,KACpB,MAAA;AACL,MAAM,MAAA,UAAA,GAAa,YAAa,CAAA,GAAA,CAAI,GAAG,CAAA;AACvC,MAAA,WAAA,CAAY,IAAK,CAAA,QAAA,CAAS,GAAK,EAAA,KAAA,EAAO,UAAU,CAAC,CAAA;AACjD,MAAA,eAAA,CAAgB,OAAO,CAAI,GAAA,CAAA;AAC3B,MAAA,MAAM,kBAAqB,GAAA,CAAC,MAAU,IAAA,CAAC,cAAc,KAAQ,GAAA,CAAA;AAC7D,MAAA,IAAI,kBAAoB,EAAA;AACtB,QAAG,GAAA;AACD,UAAK,CAAA,IAAA,CAAA;AAAA,SACP,QAAS,CAAI,GAAA,IAAA,CAAK,MAAS,GAAA,CAAA,IAAK,KAAK,CAAI,GAAA,CAAC,CAAE,CAAA,KAAK,CAAI,GAAA,KAAA;AAAA;AACvD;AACF;AAEF,EAAO,OAAA,CAAC,aAAa,eAAe,CAAA;AACtC;AAEA,MAAM,QAAW,GAAA,CACf,GACA,EAAA,KAAA,EACA,UACkB,KAAA;AAClB,EAAM,MAAA,KAAA,GAAQ,IAAI,KAAM,EAAA;AACxB,EAAA,KAAA,CAAM,CAAC,CAAI,GAAA,KAAA;AACX,EAAA,KAAA,CAAM,CAAC,CAAI,GAAA,KAAA;AACX,EAAA,IAAI,UAAY,EAAA;AACd,IAAA,KAAA,CAAM,WAAW,CAAI,GAAA,IAAA;AAAA;AAEvB,EAAO,OAAA,KAAA;AACT,CAAA;;;;"}