@cratis/scene.engine 4.2.1 → 4.3.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/dist/cjs/editing/DescriptorCatalog.js +42 -0
- package/dist/cjs/editing/DescriptorCatalog.js.map +1 -0
- package/dist/cjs/editing/EditSession.js +44 -0
- package/dist/cjs/editing/EditSession.js.map +1 -0
- package/dist/cjs/editing/applyEdit.js +83 -0
- package/dist/cjs/editing/applyEdit.js.map +1 -0
- package/dist/cjs/editing/applyEffectiveConfiguration.js +62 -0
- package/dist/cjs/editing/applyEffectiveConfiguration.js.map +1 -0
- package/dist/cjs/editing/collectComponents.js +34 -0
- package/dist/cjs/editing/collectComponents.js.map +1 -0
- package/dist/cjs/editing/describeNode.js +63 -0
- package/dist/cjs/editing/describeNode.js.map +1 -0
- package/dist/cjs/editing/diagnostics.js +36 -0
- package/dist/cjs/editing/diagnostics.js.map +1 -0
- package/dist/cjs/editing/documentPaths.js +45 -0
- package/dist/cjs/editing/documentPaths.js.map +1 -0
- package/dist/cjs/editing/exposureEdits.js +106 -0
- package/dist/cjs/editing/exposureEdits.js.map +1 -0
- package/dist/cjs/editing/exposureGrants.js +115 -0
- package/dist/cjs/editing/exposureGrants.js.map +1 -0
- package/dist/cjs/editing/indexDocument.js +400 -0
- package/dist/cjs/editing/indexDocument.js.map +1 -0
- package/dist/cjs/editing/inspect.js +127 -0
- package/dist/cjs/editing/inspect.js.map +1 -0
- package/dist/cjs/editing/instanceEdits.js +255 -0
- package/dist/cjs/editing/instanceEdits.js.map +1 -0
- package/dist/cjs/editing/layoutTypeDescriptors.js +425 -0
- package/dist/cjs/editing/layoutTypeDescriptors.js.map +1 -0
- package/dist/cjs/editing/layoutTypeEdits.js +141 -0
- package/dist/cjs/editing/layoutTypeEdits.js.map +1 -0
- package/dist/cjs/editing/nodeIds.js +115 -0
- package/dist/cjs/editing/nodeIds.js.map +1 -0
- package/dist/cjs/editing/pathAccess.js +53 -0
- package/dist/cjs/editing/pathAccess.js.map +1 -0
- package/dist/cjs/editing/propertyEdits.js +118 -0
- package/dist/cjs/editing/propertyEdits.js.map +1 -0
- package/dist/cjs/editing/resolveEffectiveConfiguration.js +200 -0
- package/dist/cjs/editing/resolveEffectiveConfiguration.js.map +1 -0
- package/dist/cjs/editing/resolveTemplateChain.js +100 -0
- package/dist/cjs/editing/resolveTemplateChain.js.map +1 -0
- package/dist/cjs/editing/structureEdits.js +231 -0
- package/dist/cjs/editing/structureEdits.js.map +1 -0
- package/dist/cjs/editing/validateBinding.js +111 -0
- package/dist/cjs/editing/validateBinding.js.map +1 -0
- package/dist/cjs/editing/validateValue.js +114 -0
- package/dist/cjs/editing/validateValue.js.map +1 -0
- package/dist/cjs/index.js +51 -0
- package/dist/cjs/index.js.map +1 -1
- package/dist/esm/editing/DescriptorCatalog.d.ts +9 -0
- package/dist/esm/editing/DescriptorCatalog.d.ts.map +1 -0
- package/dist/esm/editing/DescriptorCatalog.js +38 -0
- package/dist/esm/editing/DescriptorCatalog.js.map +1 -0
- package/dist/esm/editing/DocumentIndex.d.ts +31 -0
- package/dist/esm/editing/DocumentIndex.d.ts.map +1 -0
- package/dist/esm/editing/DocumentIndex.js +2 -0
- package/dist/esm/editing/DocumentIndex.js.map +1 -0
- package/dist/esm/editing/EditOutcome.d.ts +7 -0
- package/dist/esm/editing/EditOutcome.d.ts.map +1 -0
- package/dist/esm/editing/EditOutcome.js +2 -0
- package/dist/esm/editing/EditOutcome.js.map +1 -0
- package/dist/esm/editing/EditSession.d.ts +20 -0
- package/dist/esm/editing/EditSession.d.ts.map +1 -0
- package/dist/esm/editing/EditSession.js +42 -0
- package/dist/esm/editing/EditSession.js.map +1 -0
- package/dist/esm/editing/EditingContext.d.ts +8 -0
- package/dist/esm/editing/EditingContext.d.ts.map +1 -0
- package/dist/esm/editing/EditingContext.js +2 -0
- package/dist/esm/editing/EditingContext.js.map +1 -0
- package/dist/esm/editing/TemplateChain.d.ts +13 -0
- package/dist/esm/editing/TemplateChain.d.ts.map +1 -0
- package/dist/esm/editing/TemplateChain.js +2 -0
- package/dist/esm/editing/TemplateChain.js.map +1 -0
- package/dist/esm/editing/applyEdit.d.ts +5 -0
- package/dist/esm/editing/applyEdit.d.ts.map +1 -0
- package/dist/esm/editing/applyEdit.js +81 -0
- package/dist/esm/editing/applyEdit.js.map +1 -0
- package/dist/esm/editing/applyEffectiveConfiguration.d.ts +3 -0
- package/dist/esm/editing/applyEffectiveConfiguration.d.ts.map +1 -0
- package/dist/esm/editing/applyEffectiveConfiguration.js +60 -0
- package/dist/esm/editing/applyEffectiveConfiguration.js.map +1 -0
- package/dist/esm/editing/collectComponents.d.ts +3 -0
- package/dist/esm/editing/collectComponents.d.ts.map +1 -0
- package/dist/esm/editing/collectComponents.js +32 -0
- package/dist/esm/editing/collectComponents.js.map +1 -0
- package/dist/esm/editing/describeNode.d.ts +11 -0
- package/dist/esm/editing/describeNode.d.ts.map +1 -0
- package/dist/esm/editing/describeNode.js +60 -0
- package/dist/esm/editing/describeNode.js.map +1 -0
- package/dist/esm/editing/diagnostics.d.ts +6 -0
- package/dist/esm/editing/diagnostics.d.ts.map +1 -0
- package/dist/esm/editing/diagnostics.js +32 -0
- package/dist/esm/editing/diagnostics.js.map +1 -0
- package/dist/esm/editing/documentPaths.d.ts +8 -0
- package/dist/esm/editing/documentPaths.d.ts.map +1 -0
- package/dist/esm/editing/documentPaths.js +41 -0
- package/dist/esm/editing/documentPaths.js.map +1 -0
- package/dist/esm/editing/exposureEdits.d.ts +5 -0
- package/dist/esm/editing/exposureEdits.d.ts.map +1 -0
- package/dist/esm/editing/exposureEdits.js +103 -0
- package/dist/esm/editing/exposureEdits.js.map +1 -0
- package/dist/esm/editing/exposureGrants.d.ts +21 -0
- package/dist/esm/editing/exposureGrants.d.ts.map +1 -0
- package/dist/esm/editing/exposureGrants.js +112 -0
- package/dist/esm/editing/exposureGrants.js.map +1 -0
- package/dist/esm/editing/given/a_layout_document.d.ts +14 -0
- package/dist/esm/editing/given/a_layout_document.d.ts.map +1 -0
- package/dist/esm/editing/given/a_layout_document.js +67 -0
- package/dist/esm/editing/given/a_layout_document.js.map +1 -0
- package/dist/esm/editing/given/a_scene_document.d.ts +20 -0
- package/dist/esm/editing/given/a_scene_document.d.ts.map +1 -0
- package/dist/esm/editing/given/a_scene_document.js +110 -0
- package/dist/esm/editing/given/a_scene_document.js.map +1 -0
- package/dist/esm/editing/index.d.ts +19 -0
- package/dist/esm/editing/index.d.ts.map +1 -0
- package/dist/esm/editing/index.js +19 -0
- package/dist/esm/editing/index.js.map +1 -0
- package/dist/esm/editing/indexDocument.d.ts +6 -0
- package/dist/esm/editing/indexDocument.d.ts.map +1 -0
- package/dist/esm/editing/indexDocument.js +396 -0
- package/dist/esm/editing/indexDocument.js.map +1 -0
- package/dist/esm/editing/inspect.d.ts +8 -0
- package/dist/esm/editing/inspect.d.ts.map +1 -0
- package/dist/esm/editing/inspect.js +124 -0
- package/dist/esm/editing/inspect.js.map +1 -0
- package/dist/esm/editing/instanceEdits.d.ts +9 -0
- package/dist/esm/editing/instanceEdits.d.ts.map +1 -0
- package/dist/esm/editing/instanceEdits.js +248 -0
- package/dist/esm/editing/instanceEdits.js.map +1 -0
- package/dist/esm/editing/layoutTypeDescriptors.d.ts +5 -0
- package/dist/esm/editing/layoutTypeDescriptors.d.ts.map +1 -0
- package/dist/esm/editing/layoutTypeDescriptors.js +421 -0
- package/dist/esm/editing/layoutTypeDescriptors.js.map +1 -0
- package/dist/esm/editing/layoutTypeEdits.d.ts +4 -0
- package/dist/esm/editing/layoutTypeEdits.d.ts.map +1 -0
- package/dist/esm/editing/layoutTypeEdits.js +139 -0
- package/dist/esm/editing/layoutTypeEdits.js.map +1 -0
- package/dist/esm/editing/nodeIds.d.ts +14 -0
- package/dist/esm/editing/nodeIds.d.ts.map +1 -0
- package/dist/esm/editing/nodeIds.js +102 -0
- package/dist/esm/editing/nodeIds.js.map +1 -0
- package/dist/esm/editing/pathAccess.d.ts +7 -0
- package/dist/esm/editing/pathAccess.d.ts.map +1 -0
- package/dist/esm/editing/pathAccess.js +48 -0
- package/dist/esm/editing/pathAccess.js.map +1 -0
- package/dist/esm/editing/propertyEdits.d.ts +15 -0
- package/dist/esm/editing/propertyEdits.d.ts.map +1 -0
- package/dist/esm/editing/propertyEdits.js +113 -0
- package/dist/esm/editing/propertyEdits.js.map +1 -0
- package/dist/esm/editing/resolveEffectiveConfiguration.d.ts +5 -0
- package/dist/esm/editing/resolveEffectiveConfiguration.d.ts.map +1 -0
- package/dist/esm/editing/resolveEffectiveConfiguration.js +198 -0
- package/dist/esm/editing/resolveEffectiveConfiguration.js.map +1 -0
- package/dist/esm/editing/resolveTemplateChain.d.ts +4 -0
- package/dist/esm/editing/resolveTemplateChain.d.ts.map +1 -0
- package/dist/esm/editing/resolveTemplateChain.js +98 -0
- package/dist/esm/editing/resolveTemplateChain.js.map +1 -0
- package/dist/esm/editing/structureEdits.d.ts +6 -0
- package/dist/esm/editing/structureEdits.d.ts.map +1 -0
- package/dist/esm/editing/structureEdits.js +227 -0
- package/dist/esm/editing/structureEdits.js.map +1 -0
- package/dist/esm/editing/validateBinding.d.ts +7 -0
- package/dist/esm/editing/validateBinding.d.ts.map +1 -0
- package/dist/esm/editing/validateBinding.js +108 -0
- package/dist/esm/editing/validateBinding.js.map +1 -0
- package/dist/esm/editing/validateValue.d.ts +8 -0
- package/dist/esm/editing/validateValue.d.ts.map +1 -0
- package/dist/esm/editing/validateValue.js +111 -0
- package/dist/esm/editing/validateValue.js.map +1 -0
- package/dist/esm/index.d.ts +1 -0
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.js +14 -0
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/tsconfig.tsbuildinfo +1 -1
- package/editing/DescriptorCatalog.ts +51 -0
- package/editing/DocumentIndex.ts +73 -0
- package/editing/EditOutcome.ts +21 -0
- package/editing/EditSession.ts +50 -0
- package/editing/EditingContext.ts +23 -0
- package/editing/TemplateChain.ts +36 -0
- package/editing/applyEdit.ts +69 -0
- package/editing/applyEffectiveConfiguration.ts +53 -0
- package/editing/collectComponents.ts +36 -0
- package/editing/describeNode.ts +61 -0
- package/editing/diagnostics.ts +30 -0
- package/editing/documentPaths.ts +40 -0
- package/editing/exposureEdits.ts +119 -0
- package/editing/exposureGrants.ts +159 -0
- package/editing/given/a_layout_document.ts +88 -0
- package/editing/given/a_scene_document.ts +135 -0
- package/editing/index.ts +21 -0
- package/editing/indexDocument.ts +237 -0
- package/editing/inspect.ts +142 -0
- package/editing/instanceEdits.ts +243 -0
- package/editing/layoutTypeDescriptors.ts +191 -0
- package/editing/layoutTypeEdits.ts +135 -0
- package/editing/nodeIds.ts +111 -0
- package/editing/pathAccess.ts +81 -0
- package/editing/propertyEdits.ts +119 -0
- package/editing/resolveEffectiveConfiguration.ts +202 -0
- package/editing/resolveTemplateChain.ts +109 -0
- package/editing/structureEdits.ts +234 -0
- package/editing/validateBinding.ts +103 -0
- package/editing/validateValue.ts +130 -0
- package/index.ts +1 -0
- package/package.json +3 -3
|
@@ -0,0 +1,396 @@
|
|
|
1
|
+
import { LayoutType, FlowContainerKind, SceneNodeKind, DiagnosticCode } from '@cratis/scene.model';
|
|
2
|
+
import { isPanel, isExternalComponent, isContentControl, isItemsControl } from '../elementKind.js';
|
|
3
|
+
import { isFlowContainer, isFlowSlotLeaf, isFlowLeaf } from '../flowNodeKind.js';
|
|
4
|
+
import { isGrid, isCanvas, isDockPanel, isStackPanel, isWrapPanel } from '../panelKind.js';
|
|
5
|
+
import { errorDiagnostic } from './diagnostics.js';
|
|
6
|
+
import { layoutNodeId, screenTemplateNodeId, dialogTemplateNodeId, screenNodeId, slotNodeId, ownerArrangementId, elementNodeId, flowNodeId, freeformNodeId, placementNodeId } from './nodeIds.js';
|
|
7
|
+
|
|
8
|
+
// Copyright (c) Cratis. All rights reserved.
|
|
9
|
+
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
|
10
|
+
/**
|
|
11
|
+
* The layout type a panel element is, by its shape.
|
|
12
|
+
*/ function panelLayoutType(element) {
|
|
13
|
+
if (!isPanel(element)) return undefined;
|
|
14
|
+
if (isGrid(element)) return LayoutType.GridPanel;
|
|
15
|
+
if (isCanvas(element)) return LayoutType.Canvas;
|
|
16
|
+
if (isDockPanel(element)) return LayoutType.DockPanel;
|
|
17
|
+
if (isStackPanel(element)) return LayoutType.StackPanel;
|
|
18
|
+
if (isWrapPanel(element)) return LayoutType.WrapPanel;
|
|
19
|
+
return undefined;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* The layout type a flow node is.
|
|
23
|
+
*/ function flowLayoutType(node) {
|
|
24
|
+
if (isFlowContainer(node)) {
|
|
25
|
+
switch(node.kind){
|
|
26
|
+
case FlowContainerKind.Row:
|
|
27
|
+
return LayoutType.FlowRow;
|
|
28
|
+
case FlowContainerKind.Column:
|
|
29
|
+
return LayoutType.FlowColumn;
|
|
30
|
+
default:
|
|
31
|
+
return LayoutType.FlowGrid;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
return isFlowSlotLeaf(node) ? LayoutType.FlowSlotLeaf : LayoutType.FlowLeaf;
|
|
35
|
+
}
|
|
36
|
+
class Indexer {
|
|
37
|
+
document;
|
|
38
|
+
index = {
|
|
39
|
+
nodes: new Map(),
|
|
40
|
+
diagnostics: []
|
|
41
|
+
};
|
|
42
|
+
constructor(document){
|
|
43
|
+
this.document = document;
|
|
44
|
+
}
|
|
45
|
+
run() {
|
|
46
|
+
this.document.layouts.forEach((layout, position)=>this.owner(layout, [
|
|
47
|
+
'layouts',
|
|
48
|
+
position
|
|
49
|
+
], {
|
|
50
|
+
owner: layout.name,
|
|
51
|
+
ownerKind: SceneNodeKind.Layout,
|
|
52
|
+
ownerId: layoutNodeId(layout.name)
|
|
53
|
+
}, undefined));
|
|
54
|
+
this.document.screenTemplates.forEach((template, position)=>this.owner(template, [
|
|
55
|
+
'screenTemplates',
|
|
56
|
+
position
|
|
57
|
+
], {
|
|
58
|
+
owner: template.name,
|
|
59
|
+
ownerKind: SceneNodeKind.ScreenTemplate,
|
|
60
|
+
ownerId: screenTemplateNodeId(template.name)
|
|
61
|
+
}, 'content'));
|
|
62
|
+
this.document.dialogTemplates.forEach((dialog, position)=>this.owner(dialog, [
|
|
63
|
+
'dialogTemplates',
|
|
64
|
+
position
|
|
65
|
+
], {
|
|
66
|
+
owner: dialog.name,
|
|
67
|
+
ownerKind: SceneNodeKind.DialogTemplate,
|
|
68
|
+
ownerId: dialogTemplateNodeId(dialog.name)
|
|
69
|
+
}, 'content'));
|
|
70
|
+
this.document.screens.forEach((screen, position)=>this.owner(screen, [
|
|
71
|
+
'screens',
|
|
72
|
+
position
|
|
73
|
+
], {
|
|
74
|
+
owner: screen.name,
|
|
75
|
+
ownerKind: SceneNodeKind.Screen,
|
|
76
|
+
ownerId: screenNodeId(screen.name)
|
|
77
|
+
}, 'slotContent'));
|
|
78
|
+
return this.index;
|
|
79
|
+
}
|
|
80
|
+
add(record) {
|
|
81
|
+
if (this.index.nodes.has(record.id)) return false;
|
|
82
|
+
this.index.nodes.set(record.id, record);
|
|
83
|
+
return true;
|
|
84
|
+
}
|
|
85
|
+
owner(owner, path, context, contentKey) {
|
|
86
|
+
this.add({
|
|
87
|
+
id: context.ownerId,
|
|
88
|
+
kind: context.ownerKind,
|
|
89
|
+
typeId: context.ownerKind,
|
|
90
|
+
label: owner.name,
|
|
91
|
+
path,
|
|
92
|
+
value: owner,
|
|
93
|
+
owner: context.owner,
|
|
94
|
+
ownerKind: context.ownerKind
|
|
95
|
+
});
|
|
96
|
+
const content = contentKey === undefined ? undefined : owner[contentKey];
|
|
97
|
+
const ownsSlots = 'slots' in owner;
|
|
98
|
+
const declared = ownsSlots ? owner.slots : this.slotsAvailableTo(owner);
|
|
99
|
+
const slotNames = new Set([
|
|
100
|
+
...declared.map((slot)=>slot.name),
|
|
101
|
+
...Object.keys(content ?? {})
|
|
102
|
+
]);
|
|
103
|
+
for (const name of slotNames){
|
|
104
|
+
const slotId = slotNodeId(context.ownerId, name);
|
|
105
|
+
const declaration = ownsSlots ? declared.findIndex((slot)=>slot.name === name) : -1;
|
|
106
|
+
const contentPath = contentKey === undefined ? undefined : [
|
|
107
|
+
...path,
|
|
108
|
+
contentKey,
|
|
109
|
+
name
|
|
110
|
+
];
|
|
111
|
+
this.add({
|
|
112
|
+
id: slotId,
|
|
113
|
+
kind: SceneNodeKind.Slot,
|
|
114
|
+
typeId: 'slot',
|
|
115
|
+
label: name,
|
|
116
|
+
path: declaration >= 0 ? [
|
|
117
|
+
...path,
|
|
118
|
+
'slots',
|
|
119
|
+
declaration
|
|
120
|
+
] : contentPath,
|
|
121
|
+
value: declaration >= 0 ? declared[declaration] : content?.[name],
|
|
122
|
+
parentId: context.ownerId,
|
|
123
|
+
owner: context.owner,
|
|
124
|
+
ownerKind: context.ownerKind,
|
|
125
|
+
slotName: name,
|
|
126
|
+
contentPath
|
|
127
|
+
});
|
|
128
|
+
if (declaration >= 0 && declared[declaration].arrangement) {
|
|
129
|
+
this.arrangement(declared[declaration].arrangement, [
|
|
130
|
+
...path,
|
|
131
|
+
'slots',
|
|
132
|
+
declaration,
|
|
133
|
+
'arrangement'
|
|
134
|
+
], slotId, context);
|
|
135
|
+
}
|
|
136
|
+
(content?.[name] ?? []).forEach((element, position)=>this.element(element, [
|
|
137
|
+
...contentPath,
|
|
138
|
+
position
|
|
139
|
+
], context, {
|
|
140
|
+
parentId: slotId,
|
|
141
|
+
list: {
|
|
142
|
+
path: contentPath,
|
|
143
|
+
index: position
|
|
144
|
+
}
|
|
145
|
+
}));
|
|
146
|
+
}
|
|
147
|
+
if ('arrangement' in owner && owner.arrangement) {
|
|
148
|
+
this.arrangement(owner.arrangement, [
|
|
149
|
+
...path,
|
|
150
|
+
'arrangement'
|
|
151
|
+
], ownerArrangementId(context.ownerId), context, context.ownerId);
|
|
152
|
+
}
|
|
153
|
+
if ('contributions' in owner) {
|
|
154
|
+
owner.contributions.forEach((contribution, position)=>this.element(contribution.content, [
|
|
155
|
+
...path,
|
|
156
|
+
'contributions',
|
|
157
|
+
position,
|
|
158
|
+
'content'
|
|
159
|
+
], context, {
|
|
160
|
+
parentId: context.ownerId
|
|
161
|
+
}));
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
slotsAvailableTo(screen) {
|
|
165
|
+
const template = screen.screenTemplate === undefined ? undefined : this.document.screenTemplates.find((candidate)=>candidate.name === screen.screenTemplate);
|
|
166
|
+
if (template) return template.slots;
|
|
167
|
+
return this.document.layouts.find((candidate)=>candidate.name === screen.layout)?.slots ?? [];
|
|
168
|
+
}
|
|
169
|
+
element(element, path, context, placement) {
|
|
170
|
+
const id = elementNodeId(element.id);
|
|
171
|
+
const panelType = panelLayoutType(element);
|
|
172
|
+
const typeId = isExternalComponent(element) ? element.componentName : panelType ?? (isContentControl(element) ? 'contentControl' : isItemsControl(element) ? 'itemsControl' : 'element');
|
|
173
|
+
const properties = element.properties;
|
|
174
|
+
const label = typeof properties?.label === 'string' && properties.label || isPanel(element) && element.name || isExternalComponent(element) && element.name || typeId;
|
|
175
|
+
if (!this.add({
|
|
176
|
+
id,
|
|
177
|
+
kind: SceneNodeKind.Element,
|
|
178
|
+
typeId,
|
|
179
|
+
label,
|
|
180
|
+
path,
|
|
181
|
+
value: element,
|
|
182
|
+
owner: context.owner,
|
|
183
|
+
ownerKind: context.ownerKind,
|
|
184
|
+
...placement
|
|
185
|
+
})) {
|
|
186
|
+
this.index.diagnostics.push(errorDiagnostic(DiagnosticCode.DuplicateElementId, `The element id '${element.id}' is used more than once.`, {
|
|
187
|
+
nodeId: id
|
|
188
|
+
}));
|
|
189
|
+
return false;
|
|
190
|
+
}
|
|
191
|
+
if (isExternalComponent(element)) {
|
|
192
|
+
for (const [name, children] of Object.entries(element.slots)){
|
|
193
|
+
children.forEach((child, position)=>this.element(child, [
|
|
194
|
+
...path,
|
|
195
|
+
'slots',
|
|
196
|
+
name,
|
|
197
|
+
position
|
|
198
|
+
], context, {
|
|
199
|
+
parentId: id,
|
|
200
|
+
list: {
|
|
201
|
+
path: [
|
|
202
|
+
...path,
|
|
203
|
+
'slots',
|
|
204
|
+
name
|
|
205
|
+
],
|
|
206
|
+
index: position
|
|
207
|
+
},
|
|
208
|
+
mirror: placement.mirror
|
|
209
|
+
}));
|
|
210
|
+
}
|
|
211
|
+
} else if (isContentControl(element)) {
|
|
212
|
+
this.element(element.content, [
|
|
213
|
+
...path,
|
|
214
|
+
'content'
|
|
215
|
+
], context, {
|
|
216
|
+
parentId: id,
|
|
217
|
+
mirror: placement.mirror
|
|
218
|
+
});
|
|
219
|
+
} else if (isItemsControl(element)) {
|
|
220
|
+
this.element(element.itemTemplate, [
|
|
221
|
+
...path,
|
|
222
|
+
'itemTemplate'
|
|
223
|
+
], context, {
|
|
224
|
+
parentId: id,
|
|
225
|
+
mirror: placement.mirror
|
|
226
|
+
});
|
|
227
|
+
} else if (isPanel(element)) {
|
|
228
|
+
element.children.forEach((child, position)=>this.element(child, [
|
|
229
|
+
...path,
|
|
230
|
+
'children',
|
|
231
|
+
position
|
|
232
|
+
], context, {
|
|
233
|
+
parentId: id,
|
|
234
|
+
list: {
|
|
235
|
+
path: [
|
|
236
|
+
...path,
|
|
237
|
+
'children'
|
|
238
|
+
],
|
|
239
|
+
index: position
|
|
240
|
+
},
|
|
241
|
+
mirror: placement.mirror
|
|
242
|
+
}));
|
|
243
|
+
}
|
|
244
|
+
return true;
|
|
245
|
+
}
|
|
246
|
+
arrangement(arrangement, path, holderId, context, parentId = holderId) {
|
|
247
|
+
if (arrangement.root !== undefined) {
|
|
248
|
+
const flow = arrangement;
|
|
249
|
+
this.flowNode(flow.root, [
|
|
250
|
+
...path,
|
|
251
|
+
'root'
|
|
252
|
+
], holderId, 'root', [], context, {
|
|
253
|
+
parentId
|
|
254
|
+
});
|
|
255
|
+
flow.overrides?.forEach((override, position)=>this.flowNode(override.root, [
|
|
256
|
+
...path,
|
|
257
|
+
'overrides',
|
|
258
|
+
position,
|
|
259
|
+
'root'
|
|
260
|
+
], holderId, `override${position}`, [], context, {
|
|
261
|
+
parentId
|
|
262
|
+
}));
|
|
263
|
+
return;
|
|
264
|
+
}
|
|
265
|
+
const variants = arrangement.variants;
|
|
266
|
+
if (!Array.isArray(variants)) return;
|
|
267
|
+
const freeformId = freeformNodeId(holderId);
|
|
268
|
+
this.add({
|
|
269
|
+
id: freeformId,
|
|
270
|
+
kind: SceneNodeKind.Freeform,
|
|
271
|
+
typeId: LayoutType.Freeform,
|
|
272
|
+
label: 'Freeform',
|
|
273
|
+
path,
|
|
274
|
+
value: arrangement,
|
|
275
|
+
parentId,
|
|
276
|
+
owner: context.owner,
|
|
277
|
+
ownerKind: context.ownerKind
|
|
278
|
+
});
|
|
279
|
+
const firstCopy = new Map();
|
|
280
|
+
variants.forEach((variant, variantIndex)=>{
|
|
281
|
+
variant.placements.forEach((placement, placementIndex)=>{
|
|
282
|
+
const placementPath = [
|
|
283
|
+
...path,
|
|
284
|
+
'variants',
|
|
285
|
+
variantIndex,
|
|
286
|
+
'placements',
|
|
287
|
+
placementIndex
|
|
288
|
+
];
|
|
289
|
+
const key = placement.element?.id ?? placement.slotName ?? String(placementIndex);
|
|
290
|
+
const placementId = placementNodeId(holderId, variantIndex, key);
|
|
291
|
+
this.add({
|
|
292
|
+
id: placementId,
|
|
293
|
+
kind: SceneNodeKind.Placement,
|
|
294
|
+
typeId: 'placement',
|
|
295
|
+
label: key,
|
|
296
|
+
path: placementPath,
|
|
297
|
+
value: placement,
|
|
298
|
+
parentId: freeformId,
|
|
299
|
+
owner: context.owner,
|
|
300
|
+
ownerKind: context.ownerKind,
|
|
301
|
+
list: {
|
|
302
|
+
path: [
|
|
303
|
+
...path,
|
|
304
|
+
'variants',
|
|
305
|
+
variantIndex,
|
|
306
|
+
'placements'
|
|
307
|
+
],
|
|
308
|
+
index: placementIndex
|
|
309
|
+
}
|
|
310
|
+
});
|
|
311
|
+
if (!placement.element) return;
|
|
312
|
+
const elementPath = [
|
|
313
|
+
...placementPath,
|
|
314
|
+
'element'
|
|
315
|
+
];
|
|
316
|
+
const known = this.index.nodes.get(elementNodeId(placement.element.id));
|
|
317
|
+
const original = firstCopy.get(placement.element.id);
|
|
318
|
+
if (known && original) {
|
|
319
|
+
known.placementIds.push(placementId);
|
|
320
|
+
known.mirror.others.push(elementPath);
|
|
321
|
+
return;
|
|
322
|
+
}
|
|
323
|
+
firstCopy.set(placement.element.id, elementPath);
|
|
324
|
+
const mirror = {
|
|
325
|
+
prefix: elementPath,
|
|
326
|
+
others: []
|
|
327
|
+
};
|
|
328
|
+
if (this.element(placement.element, elementPath, context, {
|
|
329
|
+
parentId: placementId,
|
|
330
|
+
mirror
|
|
331
|
+
})) {
|
|
332
|
+
this.index.nodes.get(elementNodeId(placement.element.id)).placementIds = [
|
|
333
|
+
placementId
|
|
334
|
+
];
|
|
335
|
+
}
|
|
336
|
+
});
|
|
337
|
+
});
|
|
338
|
+
// Descendants of a freeform element carry the same mirror object, so a copy found later is seen by all of them.
|
|
339
|
+
}
|
|
340
|
+
flowNode(node, path, holderId, variant, indexPath, context, placement) {
|
|
341
|
+
const id = flowNodeId(holderId, variant, indexPath);
|
|
342
|
+
const type = flowLayoutType(node);
|
|
343
|
+
this.add({
|
|
344
|
+
id,
|
|
345
|
+
kind: SceneNodeKind.FlowNode,
|
|
346
|
+
typeId: type,
|
|
347
|
+
label: type,
|
|
348
|
+
path,
|
|
349
|
+
value: node,
|
|
350
|
+
owner: context.owner,
|
|
351
|
+
ownerKind: context.ownerKind,
|
|
352
|
+
...placement
|
|
353
|
+
});
|
|
354
|
+
if (isFlowContainer(node)) {
|
|
355
|
+
node.children.forEach((child, position)=>this.flowNode(child, [
|
|
356
|
+
...path,
|
|
357
|
+
'children',
|
|
358
|
+
position
|
|
359
|
+
], holderId, variant, [
|
|
360
|
+
...indexPath,
|
|
361
|
+
position
|
|
362
|
+
], context, {
|
|
363
|
+
parentId: id,
|
|
364
|
+
list: {
|
|
365
|
+
path: [
|
|
366
|
+
...path,
|
|
367
|
+
'children'
|
|
368
|
+
],
|
|
369
|
+
index: position
|
|
370
|
+
}
|
|
371
|
+
}));
|
|
372
|
+
} else if (isFlowLeaf(node)) {
|
|
373
|
+
this.element(node.content, [
|
|
374
|
+
...path,
|
|
375
|
+
'content'
|
|
376
|
+
], context, {
|
|
377
|
+
parentId: id,
|
|
378
|
+
leafId: id
|
|
379
|
+
});
|
|
380
|
+
}
|
|
381
|
+
}
|
|
382
|
+
}
|
|
383
|
+
/**
|
|
384
|
+
* Indexes every addressable node of a document: layouts, templates, dialog templates, screens, their slots, the
|
|
385
|
+
* elements in them, and the flow and freeform arrangements that position them.
|
|
386
|
+
*
|
|
387
|
+
* The index is what inspection and editing look nodes up in. Duplicate element ids are reported, and the second
|
|
388
|
+
* occurrence is left out of the index.
|
|
389
|
+
*
|
|
390
|
+
* @param document The document to index.
|
|
391
|
+
*/ function indexDocument(document) {
|
|
392
|
+
return new Indexer(document).run();
|
|
393
|
+
}
|
|
394
|
+
|
|
395
|
+
export { flowLayoutType, indexDocument, panelLayoutType };
|
|
396
|
+
//# sourceMappingURL=indexDocument.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"indexDocument.js","sources":["../../../editing/indexDocument.ts"],"sourcesContent":["// Copyright (c) Cratis. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nimport {\n DiagnosticCode, DialogTemplate, ExternalComponent, FlowArrangement, FlowContainer, FlowLeaf, FlowNode,\n FreeformArrangement, FreeformSlotArrangement, Layout, LayoutType, SceneDocument, SceneElement, SceneNodeKind, Screen,\n ScreenTemplate, Slot, FlowContainerKind,\n} from '@cratis/scene.model';\nimport { isContentControl, isExternalComponent, isItemsControl, isPanel } from '../elementKind';\nimport { isFlowContainer, isFlowLeaf, isFlowSlotLeaf } from '../flowNodeKind';\nimport { isCanvas, isDockPanel, isGrid, isStackPanel, isWrapPanel } from '../panelKind';\nimport { errorDiagnostic } from './diagnostics';\nimport { DocumentIndex, DocumentPath, ListLocation, NodeRecord } from './DocumentIndex';\nimport {\n dialogTemplateNodeId, elementNodeId, flowNodeId, freeformNodeId, layoutNodeId, ownerArrangementId, placementNodeId,\n screenNodeId, screenTemplateNodeId, slotNodeId,\n} from './nodeIds';\n\ntype Owner = Layout | ScreenTemplate | DialogTemplate | Screen;\n\ninterface OwnerContext {\n owner: string;\n ownerKind: SceneNodeKind;\n ownerId: string;\n}\n\ninterface Placement {\n parentId?: string;\n list?: ListLocation;\n leafId?: string;\n mirror?: NodeRecord['mirror'];\n}\n\n/**\n * The layout type a panel element is, by its shape.\n */\nexport function panelLayoutType(element: SceneElement): LayoutType | undefined {\n if (!isPanel(element)) return undefined;\n if (isGrid(element)) return LayoutType.GridPanel;\n if (isCanvas(element)) return LayoutType.Canvas;\n if (isDockPanel(element)) return LayoutType.DockPanel;\n if (isStackPanel(element)) return LayoutType.StackPanel;\n if (isWrapPanel(element)) return LayoutType.WrapPanel;\n return undefined;\n}\n\n/**\n * The layout type a flow node is.\n */\nexport function flowLayoutType(node: FlowNode): LayoutType {\n if (isFlowContainer(node)) {\n switch (node.kind) {\n case FlowContainerKind.Row: return LayoutType.FlowRow;\n case FlowContainerKind.Column: return LayoutType.FlowColumn;\n default: return LayoutType.FlowGrid;\n }\n }\n\n return isFlowSlotLeaf(node) ? LayoutType.FlowSlotLeaf : LayoutType.FlowLeaf;\n}\n\nclass Indexer {\n readonly index: DocumentIndex = { nodes: new Map(), diagnostics: [] };\n\n constructor(private readonly document: SceneDocument) {}\n\n run(): DocumentIndex {\n this.document.layouts.forEach((layout, position) =>\n this.owner(layout, ['layouts', position], { owner: layout.name, ownerKind: SceneNodeKind.Layout, ownerId: layoutNodeId(layout.name) }, undefined));\n this.document.screenTemplates.forEach((template, position) =>\n this.owner(template, ['screenTemplates', position], { owner: template.name, ownerKind: SceneNodeKind.ScreenTemplate, ownerId: screenTemplateNodeId(template.name) }, 'content'));\n this.document.dialogTemplates.forEach((dialog, position) =>\n this.owner(dialog, ['dialogTemplates', position], { owner: dialog.name, ownerKind: SceneNodeKind.DialogTemplate, ownerId: dialogTemplateNodeId(dialog.name) }, 'content'));\n this.document.screens.forEach((screen, position) =>\n this.owner(screen, ['screens', position], { owner: screen.name, ownerKind: SceneNodeKind.Screen, ownerId: screenNodeId(screen.name) }, 'slotContent'));\n return this.index;\n }\n\n private add(record: NodeRecord): boolean {\n if (this.index.nodes.has(record.id)) return false;\n this.index.nodes.set(record.id, record);\n return true;\n }\n\n private owner(owner: Owner, path: DocumentPath, context: OwnerContext, contentKey: 'content' | 'slotContent' | undefined): void {\n this.add({ id: context.ownerId, kind: context.ownerKind, typeId: context.ownerKind, label: owner.name, path, value: owner, owner: context.owner, ownerKind: context.ownerKind });\n\n const content = contentKey === undefined ? undefined : (owner as unknown as Record<string, Record<string, SceneElement[]> | undefined>)[contentKey];\n const ownsSlots = 'slots' in owner;\n const declared: Slot[] = ownsSlots ? owner.slots : this.slotsAvailableTo(owner as Screen);\n const slotNames = new Set<string>([...declared.map(slot => slot.name), ...Object.keys(content ?? {})]);\n\n for (const name of slotNames) {\n const slotId = slotNodeId(context.ownerId, name);\n const declaration = ownsSlots ? declared.findIndex(slot => slot.name === name) : -1;\n const contentPath: DocumentPath | undefined = contentKey === undefined ? undefined : [...path, contentKey, name];\n this.add({\n id: slotId, kind: SceneNodeKind.Slot, typeId: 'slot', label: name, path: declaration >= 0 ? [...path, 'slots', declaration] : contentPath!,\n value: declaration >= 0 ? declared[declaration] : content?.[name], parentId: context.ownerId, owner: context.owner,\n ownerKind: context.ownerKind, slotName: name, contentPath,\n });\n\n if (declaration >= 0 && declared[declaration].arrangement) {\n this.arrangement(declared[declaration].arrangement!, [...path, 'slots', declaration, 'arrangement'], slotId, context);\n }\n\n (content?.[name] ?? []).forEach((element, position) =>\n this.element(element, [...contentPath!, position], context, { parentId: slotId, list: { path: contentPath!, index: position } }));\n }\n\n if ('arrangement' in owner && owner.arrangement) {\n this.arrangement(owner.arrangement, [...path, 'arrangement'], ownerArrangementId(context.ownerId), context, context.ownerId);\n }\n\n if ('contributions' in owner) {\n owner.contributions.forEach((contribution, position) =>\n this.element(contribution.content, [...path, 'contributions', position, 'content'], context, { parentId: context.ownerId }));\n }\n }\n\n private slotsAvailableTo(screen: Screen): Slot[] {\n const template = screen.screenTemplate === undefined ? undefined : this.document.screenTemplates.find(candidate => candidate.name === screen.screenTemplate);\n if (template) return template.slots;\n return this.document.layouts.find(candidate => candidate.name === screen.layout)?.slots ?? [];\n }\n\n private element(element: SceneElement, path: DocumentPath, context: OwnerContext, placement: Placement): boolean {\n const id = elementNodeId(element.id);\n const panelType = panelLayoutType(element);\n const typeId = isExternalComponent(element) ? element.componentName\n : (panelType ?? (isContentControl(element) ? 'contentControl' : (isItemsControl(element) ? 'itemsControl' : 'element')));\n const properties = (element as ExternalComponent).properties;\n const label = (typeof properties?.label === 'string' && properties.label)\n || (isPanel(element) && (element as { name?: string }).name)\n || (isExternalComponent(element) && element.name)\n || typeId;\n\n if (!this.add({\n id, kind: SceneNodeKind.Element, typeId, label, path, value: element, owner: context.owner, ownerKind: context.ownerKind, ...placement,\n })) {\n this.index.diagnostics.push(errorDiagnostic(DiagnosticCode.DuplicateElementId, `The element id '${element.id}' is used more than once.`, { nodeId: id }));\n return false;\n }\n\n if (isExternalComponent(element)) {\n for (const [name, children] of Object.entries(element.slots)) {\n children.forEach((child, position) =>\n this.element(child, [...path, 'slots', name, position], context, { parentId: id, list: { path: [...path, 'slots', name], index: position }, mirror: placement.mirror }));\n }\n } else if (isContentControl(element)) {\n this.element(element.content, [...path, 'content'], context, { parentId: id, mirror: placement.mirror });\n } else if (isItemsControl(element)) {\n this.element(element.itemTemplate, [...path, 'itemTemplate'], context, { parentId: id, mirror: placement.mirror });\n } else if (isPanel(element)) {\n element.children.forEach((child, position) =>\n this.element(child, [...path, 'children', position], context, { parentId: id, list: { path: [...path, 'children'], index: position }, mirror: placement.mirror }));\n }\n\n return true;\n }\n\n private arrangement(arrangement: unknown, path: DocumentPath, holderId: string, context: OwnerContext, parentId = holderId): void {\n if ((arrangement as FlowArrangement).root !== undefined) {\n const flow = arrangement as FlowArrangement;\n this.flowNode(flow.root, [...path, 'root'], holderId, 'root', [], context, { parentId });\n flow.overrides?.forEach((override, position) =>\n this.flowNode(override.root, [...path, 'overrides', position, 'root'], holderId, `override${position}`, [], context, { parentId }));\n return;\n }\n\n const variants = (arrangement as FreeformArrangement | FreeformSlotArrangement).variants;\n if (!Array.isArray(variants)) return;\n\n const freeformId = freeformNodeId(holderId);\n this.add({ id: freeformId, kind: SceneNodeKind.Freeform, typeId: LayoutType.Freeform, label: 'Freeform', path, value: arrangement, parentId, owner: context.owner, ownerKind: context.ownerKind });\n\n const firstCopy = new Map<string, DocumentPath>();\n variants.forEach((variant, variantIndex) => {\n (variant.placements as { element?: SceneElement; slotName?: string }[]).forEach((placement, placementIndex) => {\n const placementPath = [...path, 'variants', variantIndex, 'placements', placementIndex];\n const key = placement.element?.id ?? placement.slotName ?? String(placementIndex);\n const placementId = placementNodeId(holderId, variantIndex, key);\n this.add({\n id: placementId, kind: SceneNodeKind.Placement, typeId: 'placement', label: key, path: placementPath, value: placement,\n parentId: freeformId, owner: context.owner, ownerKind: context.ownerKind,\n list: { path: [...path, 'variants', variantIndex, 'placements'], index: placementIndex },\n });\n\n if (!placement.element) return;\n const elementPath = [...placementPath, 'element'];\n const known = this.index.nodes.get(elementNodeId(placement.element.id));\n const original = firstCopy.get(placement.element.id);\n if (known && original) {\n known.placementIds!.push(placementId);\n known.mirror!.others.push(elementPath);\n return;\n }\n\n firstCopy.set(placement.element.id, elementPath);\n const mirror = { prefix: elementPath, others: [] as DocumentPath[] };\n if (this.element(placement.element, elementPath, context, { parentId: placementId, mirror })) {\n this.index.nodes.get(elementNodeId(placement.element.id))!.placementIds = [placementId];\n }\n });\n });\n\n // Descendants of a freeform element carry the same mirror object, so a copy found later is seen by all of them.\n }\n\n private flowNode(node: FlowNode, path: DocumentPath, holderId: string, variant: string, indexPath: number[], context: OwnerContext, placement: Placement): void {\n const id = flowNodeId(holderId, variant, indexPath);\n const type = flowLayoutType(node);\n this.add({ id, kind: SceneNodeKind.FlowNode, typeId: type, label: type, path, value: node, owner: context.owner, ownerKind: context.ownerKind, ...placement });\n\n if (isFlowContainer(node)) {\n (node as FlowContainer).children.forEach((child, position) =>\n this.flowNode(child, [...path, 'children', position], holderId, variant, [...indexPath, position], context,\n { parentId: id, list: { path: [...path, 'children'], index: position } }));\n } else if (isFlowLeaf(node)) {\n this.element((node as FlowLeaf).content, [...path, 'content'], context, { parentId: id, leafId: id });\n }\n\n }\n}\n\n/**\n * Indexes every addressable node of a document: layouts, templates, dialog templates, screens, their slots, the\n * elements in them, and the flow and freeform arrangements that position them.\n *\n * The index is what inspection and editing look nodes up in. Duplicate element ids are reported, and the second\n * occurrence is left out of the index.\n *\n * @param document The document to index.\n */\nexport function indexDocument(document: SceneDocument): DocumentIndex {\n return new Indexer(document).run();\n}\n"],"names":["panelLayoutType","element","isPanel","undefined","isGrid","LayoutType","GridPanel","isCanvas","Canvas","isDockPanel","DockPanel","isStackPanel","StackPanel","isWrapPanel","WrapPanel","flowLayoutType","node","isFlowContainer","kind","FlowContainerKind","Row","FlowRow","Column","FlowColumn","FlowGrid","isFlowSlotLeaf","FlowSlotLeaf","FlowLeaf","Indexer","index","nodes","Map","diagnostics","document","run","layouts","forEach","layout","position","owner","name","ownerKind","SceneNodeKind","Layout","ownerId","layoutNodeId","screenTemplates","template","ScreenTemplate","screenTemplateNodeId","dialogTemplates","dialog","DialogTemplate","dialogTemplateNodeId","screens","screen","Screen","screenNodeId","add","record","has","id","set","path","context","contentKey","typeId","label","value","content","ownsSlots","declared","slots","slotsAvailableTo","slotNames","Set","map","slot","Object","keys","slotId","slotNodeId","declaration","findIndex","contentPath","Slot","parentId","slotName","arrangement","list","ownerArrangementId","contributions","contribution","screenTemplate","find","candidate","placement","elementNodeId","panelType","isExternalComponent","componentName","isContentControl","isItemsControl","properties","Element","push","errorDiagnostic","DiagnosticCode","DuplicateElementId","nodeId","children","entries","child","mirror","itemTemplate","holderId","root","flow","flowNode","overrides","override","variants","Array","isArray","freeformId","freeformNodeId","Freeform","firstCopy","variant","variantIndex","placements","placementIndex","placementPath","key","String","placementId","placementNodeId","Placement","elementPath","known","get","original","placementIds","others","prefix","indexPath","flowNodeId","type","FlowNode","isFlowLeaf","leafId","indexDocument"],"mappings":";;;;;;;AAAA;AACA;AAgCA;;IAGO,SAASA,eAAAA,CAAgBC,OAAqB,EAAA;IACjD,IAAI,CAACC,OAAAA,CAAQD,OAAAA,CAAAA,EAAU,OAAOE,SAAAA;AAC9B,IAAA,IAAIC,MAAAA,CAAOH,OAAAA,CAAAA,EAAU,OAAOI,UAAAA,CAAWC,SAAS;AAChD,IAAA,IAAIC,QAAAA,CAASN,OAAAA,CAAAA,EAAU,OAAOI,UAAAA,CAAWG,MAAM;AAC/C,IAAA,IAAIC,WAAAA,CAAYR,OAAAA,CAAAA,EAAU,OAAOI,UAAAA,CAAWK,SAAS;AACrD,IAAA,IAAIC,YAAAA,CAAaV,OAAAA,CAAAA,EAAU,OAAOI,UAAAA,CAAWO,UAAU;AACvD,IAAA,IAAIC,WAAAA,CAAYZ,OAAAA,CAAAA,EAAU,OAAOI,UAAAA,CAAWS,SAAS;IACrD,OAAOX,SAAAA;AACX;AAEA;;IAGO,SAASY,cAAAA,CAAeC,IAAc,EAAA;AACzC,IAAA,IAAIC,gBAAgBD,IAAAA,CAAAA,EAAO;AACvB,QAAA,OAAQA,KAAKE,IAAI;AACb,YAAA,KAAKC,kBAAkBC,GAAG;AAAE,gBAAA,OAAOf,WAAWgB,OAAO;AACrD,YAAA,KAAKF,kBAAkBG,MAAM;AAAE,gBAAA,OAAOjB,WAAWkB,UAAU;AAC3D,YAAA;AAAS,gBAAA,OAAOlB,WAAWmB,QAAQ;AACvC;AACJ,IAAA;AAEA,IAAA,OAAOC,eAAeT,IAAAA,CAAAA,GAAQX,UAAAA,CAAWqB,YAAY,GAAGrB,WAAWsB,QAAQ;AAC/E;AAEA,MAAMC,OAAAA,CAAAA;;IACOC,KAAAA,GAAuB;AAAEC,QAAAA,KAAAA,EAAO,IAAIC,GAAAA,EAAAA;AAAOC,QAAAA,WAAAA,EAAa;KAAG;IAEpE,WAAA,CAA6BC,QAAuB,CAAE;aAAzBA,QAAAA,GAAAA,QAAAA;AAA0B,IAAA;IAEvDC,GAAAA,GAAqB;AACjB,QAAA,IAAI,CAACD,QAAQ,CAACE,OAAO,CAACC,OAAO,CAAC,CAACC,MAAAA,EAAQC,QAAAA,GACnC,IAAI,CAACC,KAAK,CAACF,MAAAA,EAAQ;AAAC,gBAAA,SAAA;AAAWC,gBAAAA;aAAS,EAAE;AAAEC,gBAAAA,KAAAA,EAAOF,OAAOG,IAAI;AAAEC,gBAAAA,SAAAA,EAAWC,cAAcC,MAAM;gBAAEC,OAAAA,EAASC,YAAAA,CAAaR,OAAOG,IAAI;aAAE,EAAGrC,SAAAA,CAAAA,CAAAA;AAC3I,QAAA,IAAI,CAAC8B,QAAQ,CAACa,eAAe,CAACV,OAAO,CAAC,CAACW,QAAAA,EAAUT,QAAAA,GAC7C,IAAI,CAACC,KAAK,CAACQ,QAAAA,EAAU;AAAC,gBAAA,iBAAA;AAAmBT,gBAAAA;aAAS,EAAE;AAAEC,gBAAAA,KAAAA,EAAOQ,SAASP,IAAI;AAAEC,gBAAAA,SAAAA,EAAWC,cAAcM,cAAc;gBAAEJ,OAAAA,EAASK,oBAAAA,CAAqBF,SAASP,IAAI;aAAE,EAAG,SAAA,CAAA,CAAA;AACzK,QAAA,IAAI,CAACP,QAAQ,CAACiB,eAAe,CAACd,OAAO,CAAC,CAACe,MAAAA,EAAQb,QAAAA,GAC3C,IAAI,CAACC,KAAK,CAACY,MAAAA,EAAQ;AAAC,gBAAA,iBAAA;AAAmBb,gBAAAA;aAAS,EAAE;AAAEC,gBAAAA,KAAAA,EAAOY,OAAOX,IAAI;AAAEC,gBAAAA,SAAAA,EAAWC,cAAcU,cAAc;gBAAER,OAAAA,EAASS,oBAAAA,CAAqBF,OAAOX,IAAI;aAAE,EAAG,SAAA,CAAA,CAAA;AACnK,QAAA,IAAI,CAACP,QAAQ,CAACqB,OAAO,CAAClB,OAAO,CAAC,CAACmB,MAAAA,EAAQjB,QAAAA,GACnC,IAAI,CAACC,KAAK,CAACgB,MAAAA,EAAQ;AAAC,gBAAA,SAAA;AAAWjB,gBAAAA;aAAS,EAAE;AAAEC,gBAAAA,KAAAA,EAAOgB,OAAOf,IAAI;AAAEC,gBAAAA,SAAAA,EAAWC,cAAcc,MAAM;gBAAEZ,OAAAA,EAASa,YAAAA,CAAaF,OAAOf,IAAI;aAAE,EAAG,aAAA,CAAA,CAAA;QAC3I,OAAO,IAAI,CAACX,KAAK;AACrB,IAAA;AAEQ6B,IAAAA,GAAAA,CAAIC,MAAkB,EAAW;QACrC,IAAI,IAAI,CAAC9B,KAAK,CAACC,KAAK,CAAC8B,GAAG,CAACD,MAAAA,CAAOE,EAAE,CAAA,EAAG,OAAO,KAAA;QAC5C,IAAI,CAAChC,KAAK,CAACC,KAAK,CAACgC,GAAG,CAACH,MAAAA,CAAOE,EAAE,EAAEF,MAAAA,CAAAA;QAChC,OAAO,IAAA;AACX,IAAA;AAEQpB,IAAAA,KAAAA,CAAMA,KAAY,EAAEwB,IAAkB,EAAEC,OAAqB,EAAEC,UAAiD,EAAQ;QAC5H,IAAI,CAACP,GAAG,CAAC;AAAEG,YAAAA,EAAAA,EAAIG,QAAQpB,OAAO;AAAE1B,YAAAA,IAAAA,EAAM8C,QAAQvB,SAAS;AAAEyB,YAAAA,MAAAA,EAAQF,QAAQvB,SAAS;AAAE0B,YAAAA,KAAAA,EAAO5B,MAAMC,IAAI;AAAEuB,YAAAA,IAAAA;YAAMK,KAAAA,EAAO7B,KAAAA;AAAOA,YAAAA,KAAAA,EAAOyB,QAAQzB,KAAK;AAAEE,YAAAA,SAAAA,EAAWuB,QAAQvB;AAAU,SAAA,CAAA;AAE9K,QAAA,MAAM4B,UAAUJ,UAAAA,KAAe9D,SAAAA,GAAYA,YAAY,KAAgF,CAAC8D,UAAAA,CAAW;AACnJ,QAAA,MAAMK,YAAY,OAAA,IAAW/B,KAAAA;QAC7B,MAAMgC,QAAAA,GAAmBD,YAAY/B,KAAAA,CAAMiC,KAAK,GAAG,IAAI,CAACC,gBAAgB,CAAClC,KAAAA,CAAAA;QACzE,MAAMmC,SAAAA,GAAY,IAAIC,GAAAA,CAAY;AAAIJ,YAAAA,GAAAA,QAAAA,CAASK,GAAG,CAACC,CAAAA,IAAAA,GAAQA,KAAKrC,IAAI,CAAA;eAAMsC,MAAAA,CAAOC,IAAI,CAACV,OAAAA,IAAW,EAAC;AAAG,SAAA,CAAA;QAErG,KAAK,MAAM7B,QAAQkC,SAAAA,CAAW;AAC1B,YAAA,MAAMM,MAAAA,GAASC,UAAAA,CAAWjB,OAAAA,CAAQpB,OAAO,EAAEJ,IAAAA,CAAAA;YAC3C,MAAM0C,WAAAA,GAAcZ,SAAAA,GAAYC,QAAAA,CAASY,SAAS,CAACN,CAAAA,IAAAA,GAAQA,IAAAA,CAAKrC,IAAI,KAAKA,IAAAA,CAAAA,GAAQ,EAAC;YAClF,MAAM4C,WAAAA,GAAwCnB,UAAAA,KAAe9D,SAAAA,GAAYA,SAAAA,GAAY;AAAI4D,gBAAAA,GAAAA,IAAAA;AAAME,gBAAAA,UAAAA;AAAYzB,gBAAAA;AAAK,aAAA;YAChH,IAAI,CAACkB,GAAG,CAAC;gBACLG,EAAAA,EAAImB,MAAAA;AAAQ9D,gBAAAA,IAAAA,EAAMwB,cAAc2C,IAAI;gBAAEnB,MAAAA,EAAQ,MAAA;gBAAQC,KAAAA,EAAO3B,IAAAA;AAAMuB,gBAAAA,IAAAA,EAAMmB,eAAe,CAAA,GAAI;AAAInB,oBAAAA,GAAAA,IAAAA;AAAM,oBAAA,OAAA;AAASmB,oBAAAA;iBAAY,GAAGE,WAAAA;gBAC9HhB,KAAAA,EAAOc,WAAAA,IAAe,IAAIX,QAAQ,CAACW,YAAY,GAAGb,OAAAA,GAAU7B,IAAAA,CAAK;AAAE8C,gBAAAA,QAAAA,EAAUtB,QAAQpB,OAAO;AAAEL,gBAAAA,KAAAA,EAAOyB,QAAQzB,KAAK;AAClHE,gBAAAA,SAAAA,EAAWuB,QAAQvB,SAAS;gBAAE8C,QAAAA,EAAU/C,IAAAA;AAAM4C,gBAAAA;AAClD,aAAA,CAAA;AAEA,YAAA,IAAIF,eAAe,CAAA,IAAKX,QAAQ,CAACW,WAAAA,CAAY,CAACM,WAAW,EAAE;gBACvD,IAAI,CAACA,WAAW,CAACjB,QAAQ,CAACW,WAAAA,CAAY,CAACM,WAAW,EAAG;AAAIzB,oBAAAA,GAAAA,IAAAA;AAAM,oBAAA,OAAA;AAASmB,oBAAAA,WAAAA;AAAa,oBAAA;AAAc,iBAAA,EAAEF,MAAAA,EAAQhB,OAAAA,CAAAA;AACjH,YAAA;AAECK,YAAAA,CAAAA,UAAU7B,IAAAA,CAAK,IAAI,EAAE,EAAEJ,OAAO,CAAC,CAACnC,SAASqC,QAAAA,GACtC,IAAI,CAACrC,OAAO,CAACA,OAAAA,EAAS;AAAImF,oBAAAA,GAAAA,WAAAA;AAAc9C,oBAAAA;AAAS,iBAAA,EAAE0B,OAAAA,EAAS;oBAAEsB,QAAAA,EAAUN,MAAAA;oBAAQS,IAAAA,EAAM;wBAAE1B,IAAAA,EAAMqB,WAAAA;wBAAcvD,KAAAA,EAAOS;AAAS;AAAE,iBAAA,CAAA,CAAA;AACtI,QAAA;AAEA,QAAA,IAAI,aAAA,IAAiBC,KAAAA,IAASA,KAAAA,CAAMiD,WAAW,EAAE;AAC7C,YAAA,IAAI,CAACA,WAAW,CAACjD,KAAAA,CAAMiD,WAAW,EAAE;AAAIzB,gBAAAA,GAAAA,IAAAA;AAAM,gBAAA;AAAc,aAAA,EAAE2B,mBAAmB1B,OAAAA,CAAQpB,OAAO,CAAA,EAAGoB,OAAAA,EAASA,QAAQpB,OAAO,CAAA;AAC/H,QAAA;AAEA,QAAA,IAAI,mBAAmBL,KAAAA,EAAO;AAC1BA,YAAAA,KAAAA,CAAMoD,aAAa,CAACvD,OAAO,CAAC,CAACwD,YAAAA,EAActD,QAAAA,GACvC,IAAI,CAACrC,OAAO,CAAC2F,YAAAA,CAAavB,OAAO,EAAE;AAAIN,oBAAAA,GAAAA,IAAAA;AAAM,oBAAA,eAAA;AAAiBzB,oBAAAA,QAAAA;AAAU,oBAAA;AAAU,iBAAA,EAAE0B,OAAAA,EAAS;AAAEsB,oBAAAA,QAAAA,EAAUtB,QAAQpB;AAAQ,iBAAA,CAAA,CAAA;AACjI,QAAA;AACJ,IAAA;AAEQ6B,IAAAA,gBAAAA,CAAiBlB,MAAc,EAAU;QAC7C,MAAMR,QAAAA,GAAWQ,OAAOsC,cAAc,KAAK1F,YAAYA,SAAAA,GAAY,IAAI,CAAC8B,QAAQ,CAACa,eAAe,CAACgD,IAAI,CAACC,CAAAA,SAAAA,GAAaA,UAAUvD,IAAI,KAAKe,OAAOsC,cAAc,CAAA;QAC3J,IAAI9C,QAAAA,EAAU,OAAOA,QAAAA,CAASyB,KAAK;AACnC,QAAA,OAAO,IAAI,CAACvC,QAAQ,CAACE,OAAO,CAAC2D,IAAI,CAACC,CAAAA,SAAAA,GAAaA,UAAUvD,IAAI,KAAKe,OAAOlB,MAAM,CAAA,EAAGmC,SAAS,EAAE;AACjG,IAAA;AAEQvE,IAAAA,OAAAA,CAAQA,OAAqB,EAAE8D,IAAkB,EAAEC,OAAqB,EAAEgC,SAAoB,EAAW;QAC7G,MAAMnC,EAAAA,GAAKoC,aAAAA,CAAchG,OAAAA,CAAQ4D,EAAE,CAAA;AACnC,QAAA,MAAMqC,YAAYlG,eAAAA,CAAgBC,OAAAA,CAAAA;AAClC,QAAA,MAAMiE,MAAAA,GAASiC,mBAAAA,CAAoBlG,OAAAA,CAAAA,GAAWA,OAAAA,CAAQmG,aAAa,GAC5DF,SAAAA,KAAcG,gBAAAA,CAAiBpG,OAAAA,CAAAA,GAAW,gBAAA,GAAoBqG,cAAAA,CAAerG,OAAAA,CAAAA,GAAW,iBAAiB,SAAS,CAAA;QACzH,MAAMsG,UAAAA,GAAa,OAACtG,CAA8BsG,UAAU;AAC5D,QAAA,MAAMpC,QAAQ,OAAQoC,YAAYpC,KAAAA,KAAU,QAAA,IAAYoC,WAAWpC,KAAK,IAChEjE,QAAQD,OAAAA,CAAAA,IAAaA,QAA8BuC,IAAI,IACvD2D,oBAAoBlG,OAAAA,CAAAA,IAAYA,OAAAA,CAAQuC,IAAI,IAC7C0B,MAAAA;AAEP,QAAA,IAAI,CAAC,IAAI,CAACR,GAAG,CAAC;AACVG,YAAAA,EAAAA;AAAI3C,YAAAA,IAAAA,EAAMwB,cAAc8D,OAAO;AAAEtC,YAAAA,MAAAA;AAAQC,YAAAA,KAAAA;AAAOJ,YAAAA,IAAAA;YAAMK,KAAAA,EAAOnE,OAAAA;AAASsC,YAAAA,KAAAA,EAAOyB,QAAQzB,KAAK;AAAEE,YAAAA,SAAAA,EAAWuB,QAAQvB,SAAS;AAAE,YAAA,GAAGuD;SACjI,CAAA,EAAI;AACA,YAAA,IAAI,CAACnE,KAAK,CAACG,WAAW,CAACyE,IAAI,CAACC,eAAAA,CAAgBC,cAAAA,CAAeC,kBAAkB,EAAE,CAAC,gBAAgB,EAAE3G,OAAAA,CAAQ4D,EAAE,CAAC,yBAAyB,CAAC,EAAE;gBAAEgD,MAAAA,EAAQhD;AAAG,aAAA,CAAA,CAAA;YACtJ,OAAO,KAAA;AACX,QAAA;AAEA,QAAA,IAAIsC,oBAAoBlG,OAAAA,CAAAA,EAAU;YAC9B,KAAK,MAAM,CAACuC,IAAAA,EAAMsE,QAAAA,CAAS,IAAIhC,OAAOiC,OAAO,CAAC9G,OAAAA,CAAQuE,KAAK,CAAA,CAAG;gBAC1DsC,QAAAA,CAAS1E,OAAO,CAAC,CAAC4E,KAAAA,EAAO1E,WACrB,IAAI,CAACrC,OAAO,CAAC+G,KAAAA,EAAO;AAAIjD,wBAAAA,GAAAA,IAAAA;AAAM,wBAAA,OAAA;AAASvB,wBAAAA,IAAAA;AAAMF,wBAAAA;AAAS,qBAAA,EAAE0B,OAAAA,EAAS;wBAAEsB,QAAAA,EAAUzB,EAAAA;wBAAI4B,IAAAA,EAAM;4BAAE1B,IAAAA,EAAM;AAAIA,gCAAAA,GAAAA,IAAAA;AAAM,gCAAA,OAAA;AAASvB,gCAAAA;AAAK,6BAAA;4BAAEX,KAAAA,EAAOS;AAAS,yBAAA;AAAG2E,wBAAAA,MAAAA,EAAQjB,UAAUiB;AAAO,qBAAA,CAAA,CAAA;AAC7K,YAAA;QACJ,CAAA,MAAO,IAAIZ,iBAAiBpG,OAAAA,CAAAA,EAAU;AAClC,YAAA,IAAI,CAACA,OAAO,CAACA,OAAAA,CAAQoE,OAAO,EAAE;AAAIN,gBAAAA,GAAAA,IAAAA;AAAM,gBAAA;AAAU,aAAA,EAAEC,OAAAA,EAAS;gBAAEsB,QAAAA,EAAUzB,EAAAA;AAAIoD,gBAAAA,MAAAA,EAAQjB,UAAUiB;AAAO,aAAA,CAAA;QAC1G,CAAA,MAAO,IAAIX,eAAerG,OAAAA,CAAAA,EAAU;AAChC,YAAA,IAAI,CAACA,OAAO,CAACA,OAAAA,CAAQiH,YAAY,EAAE;AAAInD,gBAAAA,GAAAA,IAAAA;AAAM,gBAAA;AAAe,aAAA,EAAEC,OAAAA,EAAS;gBAAEsB,QAAAA,EAAUzB,EAAAA;AAAIoD,gBAAAA,MAAAA,EAAQjB,UAAUiB;AAAO,aAAA,CAAA;QACpH,CAAA,MAAO,IAAI/G,QAAQD,OAAAA,CAAAA,EAAU;YACzBA,OAAAA,CAAQ6G,QAAQ,CAAC1E,OAAO,CAAC,CAAC4E,KAAAA,EAAO1E,QAAAA,GAC7B,IAAI,CAACrC,OAAO,CAAC+G,KAAAA,EAAO;AAAIjD,oBAAAA,GAAAA,IAAAA;AAAM,oBAAA,UAAA;AAAYzB,oBAAAA;AAAS,iBAAA,EAAE0B,OAAAA,EAAS;oBAAEsB,QAAAA,EAAUzB,EAAAA;oBAAI4B,IAAAA,EAAM;wBAAE1B,IAAAA,EAAM;AAAIA,4BAAAA,GAAAA,IAAAA;AAAM,4BAAA;AAAW,yBAAA;wBAAElC,KAAAA,EAAOS;AAAS,qBAAA;AAAG2E,oBAAAA,MAAAA,EAAQjB,UAAUiB;AAAO,iBAAA,CAAA,CAAA;AACvK,QAAA;QAEA,OAAO,IAAA;AACX,IAAA;IAEQzB,WAAAA,CAAYA,WAAoB,EAAEzB,IAAkB,EAAEoD,QAAgB,EAAEnD,OAAqB,EAAEsB,QAAAA,GAAW6B,QAAQ,EAAQ;AAC9H,QAAA,IAAI,WAAC3B,CAAgC4B,IAAI,KAAKjH,SAAAA,EAAW;AACrD,YAAA,MAAMkH,IAAAA,GAAO7B,WAAAA;AACb,YAAA,IAAI,CAAC8B,QAAQ,CAACD,IAAAA,CAAKD,IAAI,EAAE;AAAIrD,gBAAAA,GAAAA,IAAAA;AAAM,gBAAA;AAAO,aAAA,EAAEoD,QAAAA,EAAU,MAAA,EAAQ,EAAE,EAAEnD,OAAAA,EAAS;AAAEsB,gBAAAA;AAAS,aAAA,CAAA;AACtF+B,YAAAA,IAAAA,CAAKE,SAAS,EAAEnF,OAAAA,CAAQ,CAACoF,QAAAA,EAAUlF,QAAAA,GAC/B,IAAI,CAACgF,QAAQ,CAACE,QAAAA,CAASJ,IAAI,EAAE;AAAIrD,oBAAAA,GAAAA,IAAAA;AAAM,oBAAA,WAAA;AAAazB,oBAAAA,QAAAA;AAAU,oBAAA;iBAAO,EAAE6E,QAAAA,EAAU,CAAC,QAAQ,EAAE7E,UAAU,EAAE,EAAE,EAAE0B,OAAAA,EAAS;AAAEsB,oBAAAA;AAAS,iBAAA,CAAA,CAAA;AACpI,YAAA;AACJ,QAAA;QAEA,MAAMmC,QAAAA,GAAW,WAACjC,CAA8DiC,QAAQ;AACxF,QAAA,IAAI,CAACC,KAAAA,CAAMC,OAAO,CAACF,QAAAA,CAAAA,EAAW;AAE9B,QAAA,MAAMG,aAAaC,cAAAA,CAAeV,QAAAA,CAAAA;QAClC,IAAI,CAACzD,GAAG,CAAC;YAAEG,EAAAA,EAAI+D,UAAAA;AAAY1G,YAAAA,IAAAA,EAAMwB,cAAcoF,QAAQ;AAAE5D,YAAAA,MAAAA,EAAQ7D,WAAWyH,QAAQ;YAAE3D,KAAAA,EAAO,UAAA;AAAYJ,YAAAA,IAAAA;YAAMK,KAAAA,EAAOoB,WAAAA;AAAaF,YAAAA,QAAAA;AAAU/C,YAAAA,KAAAA,EAAOyB,QAAQzB,KAAK;AAAEE,YAAAA,SAAAA,EAAWuB,QAAQvB;AAAU,SAAA,CAAA;AAEhM,QAAA,MAAMsF,YAAY,IAAIhG,GAAAA,EAAAA;QACtB0F,QAAAA,CAASrF,OAAO,CAAC,CAAC4F,OAAAA,EAASC,YAAAA,GAAAA;AACtBD,YAAAA,OAAAA,CAAQE,UAAU,CAAqD9F,OAAO,CAAC,CAAC4D,SAAAA,EAAWmC,cAAAA,GAAAA;AACxF,gBAAA,MAAMC,aAAAA,GAAgB;AAAIrE,oBAAAA,GAAAA,IAAAA;AAAM,oBAAA,UAAA;AAAYkE,oBAAAA,YAAAA;AAAc,oBAAA,YAAA;AAAcE,oBAAAA;AAAe,iBAAA;gBACvF,MAAME,GAAAA,GAAMrC,UAAU/F,OAAO,EAAE4D,MAAMmC,SAAAA,CAAUT,QAAQ,IAAI+C,MAAAA,CAAOH,cAAAA,CAAAA;gBAClE,MAAMI,WAAAA,GAAcC,eAAAA,CAAgBrB,QAAAA,EAAUc,YAAAA,EAAcI,GAAAA,CAAAA;gBAC5D,IAAI,CAAC3E,GAAG,CAAC;oBACLG,EAAAA,EAAI0E,WAAAA;AAAarH,oBAAAA,IAAAA,EAAMwB,cAAc+F,SAAS;oBAAEvE,MAAAA,EAAQ,WAAA;oBAAaC,KAAAA,EAAOkE,GAAAA;oBAAKtE,IAAAA,EAAMqE,aAAAA;oBAAehE,KAAAA,EAAO4B,SAAAA;oBAC7GV,QAAAA,EAAUsC,UAAAA;AAAYrF,oBAAAA,KAAAA,EAAOyB,QAAQzB,KAAK;AAAEE,oBAAAA,SAAAA,EAAWuB,QAAQvB,SAAS;oBACxEgD,IAAAA,EAAM;wBAAE1B,IAAAA,EAAM;AAAIA,4BAAAA,GAAAA,IAAAA;AAAM,4BAAA,UAAA;AAAYkE,4BAAAA,YAAAA;AAAc,4BAAA;AAAa,yBAAA;wBAAEpG,KAAAA,EAAOsG;AAAe;AAC3F,iBAAA,CAAA;gBAEA,IAAI,CAACnC,SAAAA,CAAU/F,OAAO,EAAE;AACxB,gBAAA,MAAMyI,WAAAA,GAAc;AAAIN,oBAAAA,GAAAA,aAAAA;AAAe,oBAAA;AAAU,iBAAA;AACjD,gBAAA,MAAMO,KAAAA,GAAQ,IAAI,CAAC9G,KAAK,CAACC,KAAK,CAAC8G,GAAG,CAAC3C,aAAAA,CAAcD,SAAAA,CAAU/F,OAAO,CAAC4D,EAAE,CAAA,CAAA;AACrE,gBAAA,MAAMgF,WAAWd,SAAAA,CAAUa,GAAG,CAAC5C,SAAAA,CAAU/F,OAAO,CAAC4D,EAAE,CAAA;AACnD,gBAAA,IAAI8E,SAASE,QAAAA,EAAU;oBACnBF,KAAAA,CAAMG,YAAY,CAAErC,IAAI,CAAC8B,WAAAA,CAAAA;AACzBI,oBAAAA,KAAAA,CAAM1B,MAAM,CAAE8B,MAAM,CAACtC,IAAI,CAACiC,WAAAA,CAAAA;AAC1B,oBAAA;AACJ,gBAAA;AAEAX,gBAAAA,SAAAA,CAAUjE,GAAG,CAACkC,SAAAA,CAAU/F,OAAO,CAAC4D,EAAE,EAAE6E,WAAAA,CAAAA;AACpC,gBAAA,MAAMzB,MAAAA,GAAS;oBAAE+B,MAAAA,EAAQN,WAAAA;AAAaK,oBAAAA,MAAAA,EAAQ;AAAqB,iBAAA;gBACnE,IAAI,IAAI,CAAC9I,OAAO,CAAC+F,UAAU/F,OAAO,EAAEyI,aAAa1E,OAAAA,EAAS;oBAAEsB,QAAAA,EAAUiD,WAAAA;AAAatB,oBAAAA;iBAAO,CAAA,EAAI;AAC1F,oBAAA,IAAI,CAACpF,KAAK,CAACC,KAAK,CAAC8G,GAAG,CAAC3C,aAAAA,CAAcD,SAAAA,CAAU/F,OAAO,CAAC4D,EAAE,CAAA,CAAA,CAAIiF,YAAY,GAAG;AAACP,wBAAAA;AAAY,qBAAA;AAC3F,gBAAA;AACJ,YAAA,CAAA,CAAA;AACJ,QAAA,CAAA,CAAA;;AAGJ,IAAA;AAEQjB,IAAAA,QAAAA,CAAStG,IAAc,EAAE+C,IAAkB,EAAEoD,QAAgB,EAAEa,OAAe,EAAEiB,SAAmB,EAAEjF,OAAqB,EAAEgC,SAAoB,EAAQ;QAC5J,MAAMnC,EAAAA,GAAKqF,UAAAA,CAAW/B,QAAAA,EAAUa,OAAAA,EAASiB,SAAAA,CAAAA;AACzC,QAAA,MAAME,OAAOpI,cAAAA,CAAeC,IAAAA,CAAAA;QAC5B,IAAI,CAAC0C,GAAG,CAAC;AAAEG,YAAAA,EAAAA;AAAI3C,YAAAA,IAAAA,EAAMwB,cAAc0G,QAAQ;YAAElF,MAAAA,EAAQiF,IAAAA;YAAMhF,KAAAA,EAAOgF,IAAAA;AAAMpF,YAAAA,IAAAA;YAAMK,KAAAA,EAAOpD,IAAAA;AAAMuB,YAAAA,KAAAA,EAAOyB,QAAQzB,KAAK;AAAEE,YAAAA,SAAAA,EAAWuB,QAAQvB,SAAS;AAAE,YAAA,GAAGuD;AAAU,SAAA,CAAA;AAE5J,QAAA,IAAI/E,gBAAgBD,IAAAA,CAAAA,EAAO;YACtBA,IAAAA,CAAuB8F,QAAQ,CAAC1E,OAAO,CAAC,CAAC4E,KAAAA,EAAO1E,QAAAA,GAC7C,IAAI,CAACgF,QAAQ,CAACN,KAAAA,EAAO;AAAIjD,oBAAAA,GAAAA,IAAAA;AAAM,oBAAA,UAAA;AAAYzB,oBAAAA;AAAS,iBAAA,EAAE6E,UAAUa,OAAAA,EAAS;AAAIiB,oBAAAA,GAAAA,SAAAA;AAAW3G,oBAAAA;AAAS,iBAAA,EAAE0B,OAAAA,EAC/F;oBAAEsB,QAAAA,EAAUzB,EAAAA;oBAAI4B,IAAAA,EAAM;wBAAE1B,IAAAA,EAAM;AAAIA,4BAAAA,GAAAA,IAAAA;AAAM,4BAAA;AAAW,yBAAA;wBAAElC,KAAAA,EAAOS;AAAS;AAAE,iBAAA,CAAA,CAAA;QACnF,CAAA,MAAO,IAAI+G,WAAWrI,IAAAA,CAAAA,EAAO;AACzB,YAAA,IAAI,CAACf,OAAO,CAAC,IAACe,CAAkBqD,OAAO,EAAE;AAAIN,gBAAAA,GAAAA,IAAAA;AAAM,gBAAA;AAAU,aAAA,EAAEC,OAAAA,EAAS;gBAAEsB,QAAAA,EAAUzB,EAAAA;gBAAIyF,MAAAA,EAAQzF;AAAG,aAAA,CAAA;AACvG,QAAA;AAEJ,IAAA;AACJ;AAEA;;;;;;;;IASO,SAAS0F,aAAAA,CAActH,QAAuB,EAAA;IACjD,OAAO,IAAIL,OAAAA,CAAQK,QAAAA,CAAAA,CAAUC,GAAG,EAAA;AACpC;;"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { NodeInspection, NodeProvenance, SceneDocument } from '@cratis/scene.model';
|
|
2
|
+
import { EditingContext } from './EditingContext';
|
|
3
|
+
import { ExposureGrant } from './exposureGrants';
|
|
4
|
+
import { NodeRecord } from './DocumentIndex';
|
|
5
|
+
import { TemplateChain } from './TemplateChain';
|
|
6
|
+
export declare function provenanceOf(record: NodeRecord, chain: TemplateChain, scopeGrants: Map<string, ExposureGrant> | undefined): NodeProvenance;
|
|
7
|
+
export declare function inspect(document: SceneDocument, nodeId: string, context: EditingContext): NodeInspection | undefined;
|
|
8
|
+
//# sourceMappingURL=inspect.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inspect.d.ts","sourceRoot":"","sources":["../../../editing/inspect.ts"],"names":[],"mappings":"AAGA,OAAO,EACqE,cAAc,EACtF,cAAc,EAA0E,aAAa,EACxG,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAyB,aAAa,EAAY,MAAM,kBAAkB,CAAC;AAElF,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAG7C,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAUhD,wBAAgB,YAAY,CAAC,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,GAAG,SAAS,GAAG,cAAc,CAO1I;AA0ED,wBAAgB,OAAO,CAAC,QAAQ,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,GAAG,cAAc,GAAG,SAAS,CAoCpH"}
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
import { SceneNodeKind, DiagnosticCode, ProvenanceKind, PropertyValueType, ValueSource, EditTarget } from '@cratis/scene.model';
|
|
2
|
+
import { describeNode, readNodeValue } from './describeNode.js';
|
|
3
|
+
import { computeExposureGrants, grantKey } from './exposureGrants.js';
|
|
4
|
+
import { indexDocument } from './indexDocument.js';
|
|
5
|
+
import { resolveEffectiveConfiguration } from './resolveEffectiveConfiguration.js';
|
|
6
|
+
import { resolveTemplateChain } from './resolveTemplateChain.js';
|
|
7
|
+
|
|
8
|
+
// Copyright (c) Cratis. All rights reserved.
|
|
9
|
+
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
|
10
|
+
/**
|
|
11
|
+
* Works out whether a node is the editing scope's own, and when it is not, where it comes from and whether any of
|
|
12
|
+
* it is configurable here.
|
|
13
|
+
*
|
|
14
|
+
* @param record The node.
|
|
15
|
+
* @param chain The chain the scope sits in.
|
|
16
|
+
* @param scopeGrants What the scope's own instance may configure.
|
|
17
|
+
*/ function provenanceOf(record, chain, scopeGrants) {
|
|
18
|
+
const scopeLevel = chain.levels.at(-1);
|
|
19
|
+
if (scopeLevel && record.owner === scopeLevel.owner && record.ownerKind === scopeLevel.kind) return {
|
|
20
|
+
kind: ProvenanceKind.Local
|
|
21
|
+
};
|
|
22
|
+
const configurable = record.kind === SceneNodeKind.Element && [
|
|
23
|
+
...scopeGrants?.values() ?? []
|
|
24
|
+
].some((grant)=>grant.component === record.value.id);
|
|
25
|
+
return {
|
|
26
|
+
kind: configurable ? ProvenanceKind.ConfigurableInherited : ProvenanceKind.Inherited,
|
|
27
|
+
source: record.owner
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
function isRemovable(record, provenance) {
|
|
31
|
+
return provenance.kind === ProvenanceKind.Local && (record.list !== undefined || record.leafId !== undefined || record.placementIds !== undefined);
|
|
32
|
+
}
|
|
33
|
+
function toInspectedItems(raw, local) {
|
|
34
|
+
return (Array.isArray(raw) ? raw : []).map((item, position)=>{
|
|
35
|
+
const { id, ...values } = item;
|
|
36
|
+
return {
|
|
37
|
+
id: typeof id === 'string' ? id : `owner-${position}`,
|
|
38
|
+
values,
|
|
39
|
+
origin: 'owner',
|
|
40
|
+
editable: local
|
|
41
|
+
};
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
function inspectProperty(descriptor, record, provenance, scopeInstance, grants, configuredValues) {
|
|
45
|
+
const currentValue = readNodeValue(record, descriptor.path);
|
|
46
|
+
const configured = configuredValues?.find((candidate)=>candidate.path === descriptor.path);
|
|
47
|
+
const local = provenance.kind === ProvenanceKind.Local;
|
|
48
|
+
const isCollection = descriptor.valueType === PropertyValueType.Collection;
|
|
49
|
+
const inspected = {
|
|
50
|
+
descriptor,
|
|
51
|
+
currentValue,
|
|
52
|
+
effectiveValue: configured ? configured.value : currentValue ?? descriptor.default,
|
|
53
|
+
source: configured?.source ?? (currentValue === undefined ? ValueSource.Default : ValueSource.Local),
|
|
54
|
+
editable: false
|
|
55
|
+
};
|
|
56
|
+
const grant = !local && record.kind === SceneNodeKind.Element ? grants?.get(grantKey(record.value.id, descriptor.path)) : undefined;
|
|
57
|
+
if (local) {
|
|
58
|
+
inspected.editable = descriptor.readOnly !== true;
|
|
59
|
+
if (inspected.editable) inspected.editTarget = EditTarget.Node;
|
|
60
|
+
else inspected.reason = 'This property is read-only.';
|
|
61
|
+
} else if (grant) {
|
|
62
|
+
inspected.editable = true;
|
|
63
|
+
inspected.editTarget = EditTarget.Instance;
|
|
64
|
+
if (isCollection) inspected.operations = grant.operations;
|
|
65
|
+
} else {
|
|
66
|
+
inspected.reason = `Inherited from '${provenance.source}', which does not expose it.`;
|
|
67
|
+
}
|
|
68
|
+
if (isCollection) {
|
|
69
|
+
const items = configured?.items ? configured.items.map((item)=>({
|
|
70
|
+
...item,
|
|
71
|
+
editable: local || item.origin === scopeInstance && grant !== undefined && grant.operations.length > 0
|
|
72
|
+
})) : toInspectedItems(currentValue, local);
|
|
73
|
+
inspected.items = items;
|
|
74
|
+
}
|
|
75
|
+
return inspected;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Describes one node for an editor: what it is, where it comes from, what can be edited on it - with current and
|
|
79
|
+
* effective values and effective editability - and what can be done with it.
|
|
80
|
+
*
|
|
81
|
+
* A property of a node the scope owns is edited on the node. A property of an inherited node is editable only
|
|
82
|
+
* when its owner exposed it, and then the edit goes to an instance contribution, never into the inherited node.
|
|
83
|
+
* Nothing is mutated.
|
|
84
|
+
*
|
|
85
|
+
* @param document The document to read.
|
|
86
|
+
* @param nodeId The node to describe; see the node id functions.
|
|
87
|
+
* @param context The catalog and the editing scope.
|
|
88
|
+
* @returns The inspection, or `undefined` when the document has no such node.
|
|
89
|
+
*/ function inspect(document, nodeId, context) {
|
|
90
|
+
const index = indexDocument(document);
|
|
91
|
+
const record = index.nodes.get(nodeId);
|
|
92
|
+
if (!record) return undefined;
|
|
93
|
+
const chain = resolveTemplateChain(document, context.scope);
|
|
94
|
+
const grants = computeExposureGrants(chain, context.catalog);
|
|
95
|
+
const scopeInstance = chain.levels.at(-1)?.instance;
|
|
96
|
+
const scopeGrants = scopeInstance === undefined ? undefined : grants.byInstance.get(scopeInstance);
|
|
97
|
+
const configuration = resolveEffectiveConfiguration(chain, document.instanceContributions, context.catalog);
|
|
98
|
+
const provenance = provenanceOf(record, chain, scopeGrants);
|
|
99
|
+
const description = describeNode(record, context.catalog);
|
|
100
|
+
const componentId = record.kind === SceneNodeKind.Element ? record.value.id : undefined;
|
|
101
|
+
const configuredValues = configuration.components.find((candidate)=>candidate.component === componentId)?.values;
|
|
102
|
+
const diagnostics = [
|
|
103
|
+
...description.diagnostics,
|
|
104
|
+
...configuration.diagnostics.filter((diagnostic)=>diagnostic.component !== undefined && diagnostic.component === componentId)
|
|
105
|
+
];
|
|
106
|
+
if (chain.levels.length === 0) {
|
|
107
|
+
diagnostics.push(...chain.diagnostics.filter((diagnostic)=>diagnostic.code === DiagnosticCode.UnknownScope));
|
|
108
|
+
}
|
|
109
|
+
return {
|
|
110
|
+
nodeId,
|
|
111
|
+
kind: record.kind,
|
|
112
|
+
typeId: record.typeId,
|
|
113
|
+
label: record.label,
|
|
114
|
+
parentId: record.parentId,
|
|
115
|
+
provenance,
|
|
116
|
+
properties: description.properties.map((descriptor)=>inspectProperty(descriptor, record, provenance, scopeInstance, scopeGrants, configuredValues)),
|
|
117
|
+
capabilities: description.capabilities,
|
|
118
|
+
removable: isRemovable(record, provenance),
|
|
119
|
+
diagnostics
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
export { inspect, provenanceOf };
|
|
124
|
+
//# sourceMappingURL=inspect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inspect.js","sources":["../../../editing/inspect.ts"],"sourcesContent":["// Copyright (c) Cratis. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nimport {\n DiagnosticCode, EditTarget, InspectedCollectionItem, InspectedProperty, NodeInspection,\n NodeProvenance, ProvenanceKind, PropertyDescriptor, PropertyValueType, SceneDiagnostic, SceneDocument, SceneNodeKind, ValueSource,\n} from '@cratis/scene.model';\nimport { describeNode, readNodeValue } from './describeNode';\nimport { EditingContext } from './EditingContext';\nimport { computeExposureGrants, ExposureGrant, grantKey } from './exposureGrants';\nimport { indexDocument } from './indexDocument';\nimport { NodeRecord } from './DocumentIndex';\nimport { resolveEffectiveConfiguration } from './resolveEffectiveConfiguration';\nimport { resolveTemplateChain } from './resolveTemplateChain';\nimport { TemplateChain } from './TemplateChain';\n\n/**\n * Works out whether a node is the editing scope's own, and when it is not, where it comes from and whether any of\n * it is configurable here.\n *\n * @param record The node.\n * @param chain The chain the scope sits in.\n * @param scopeGrants What the scope's own instance may configure.\n */\nexport function provenanceOf(record: NodeRecord, chain: TemplateChain, scopeGrants: Map<string, ExposureGrant> | undefined): NodeProvenance {\n const scopeLevel = chain.levels.at(-1);\n if (scopeLevel && record.owner === scopeLevel.owner && record.ownerKind === scopeLevel.kind) return { kind: ProvenanceKind.Local };\n\n const configurable = record.kind === SceneNodeKind.Element\n && [...(scopeGrants?.values() ?? [])].some(grant => grant.component === (record.value as { id: string }).id);\n return { kind: configurable ? ProvenanceKind.ConfigurableInherited : ProvenanceKind.Inherited, source: record.owner };\n}\n\nfunction isRemovable(record: NodeRecord, provenance: NodeProvenance): boolean {\n return provenance.kind === ProvenanceKind.Local\n && (record.list !== undefined || record.leafId !== undefined || record.placementIds !== undefined);\n}\n\nfunction toInspectedItems(raw: unknown, local: boolean): InspectedCollectionItem[] {\n return (Array.isArray(raw) ? raw : []).map((item: Record<string, unknown>, position) => {\n const { id, ...values } = item;\n return { id: typeof id === 'string' ? id : `owner-${position}`, values, origin: 'owner', editable: local };\n });\n}\n\nfunction inspectProperty(\n descriptor: PropertyDescriptor,\n record: NodeRecord,\n provenance: NodeProvenance,\n scopeInstance: string | undefined,\n grants: Map<string, ExposureGrant> | undefined,\n configuredValues: { path: string; value: unknown; source: string; items?: { id: string; values: Record<string, unknown>; origin: string }[] }[] | undefined,\n): InspectedProperty {\n const currentValue = readNodeValue(record, descriptor.path);\n const configured = configuredValues?.find(candidate => candidate.path === descriptor.path);\n const local = provenance.kind === ProvenanceKind.Local;\n const isCollection = descriptor.valueType === PropertyValueType.Collection;\n\n const inspected: InspectedProperty = {\n descriptor,\n currentValue,\n effectiveValue: configured ? configured.value : (currentValue ?? descriptor.default),\n source: (configured?.source ?? (currentValue === undefined ? ValueSource.Default : ValueSource.Local)) as ValueSource,\n editable: false,\n };\n\n const grant = !local && record.kind === SceneNodeKind.Element\n ? grants?.get(grantKey((record.value as { id: string }).id, descriptor.path))\n : undefined;\n\n if (local) {\n inspected.editable = descriptor.readOnly !== true;\n if (inspected.editable) inspected.editTarget = EditTarget.Node;\n else inspected.reason = 'This property is read-only.';\n } else if (grant) {\n inspected.editable = true;\n inspected.editTarget = EditTarget.Instance;\n if (isCollection) inspected.operations = grant.operations;\n } else {\n inspected.reason = `Inherited from '${provenance.source}', which does not expose it.`;\n }\n\n if (isCollection) {\n const items = configured?.items\n ? configured.items.map(item => ({ ...item, editable: local || (item.origin === scopeInstance && grant !== undefined && grant.operations.length > 0) }))\n : toInspectedItems(currentValue, local);\n inspected.items = items;\n }\n\n return inspected;\n}\n\n/**\n * Describes one node for an editor: what it is, where it comes from, what can be edited on it - with current and\n * effective values and effective editability - and what can be done with it.\n *\n * A property of a node the scope owns is edited on the node. A property of an inherited node is editable only\n * when its owner exposed it, and then the edit goes to an instance contribution, never into the inherited node.\n * Nothing is mutated.\n *\n * @param document The document to read.\n * @param nodeId The node to describe; see the node id functions.\n * @param context The catalog and the editing scope.\n * @returns The inspection, or `undefined` when the document has no such node.\n */\nexport function inspect(document: SceneDocument, nodeId: string, context: EditingContext): NodeInspection | undefined {\n const index = indexDocument(document);\n const record = index.nodes.get(nodeId);\n if (!record) return undefined;\n\n const chain = resolveTemplateChain(document, context.scope);\n const grants = computeExposureGrants(chain, context.catalog);\n const scopeInstance = chain.levels.at(-1)?.instance;\n const scopeGrants = scopeInstance === undefined ? undefined : grants.byInstance.get(scopeInstance);\n const configuration = resolveEffectiveConfiguration(chain, document.instanceContributions, context.catalog);\n\n const provenance = provenanceOf(record, chain, scopeGrants);\n const description = describeNode(record, context.catalog);\n const componentId = record.kind === SceneNodeKind.Element ? (record.value as { id: string }).id : undefined;\n const configuredValues = configuration.components.find(candidate => candidate.component === componentId)?.values;\n\n const diagnostics: SceneDiagnostic[] = [\n ...description.diagnostics,\n ...configuration.diagnostics.filter(diagnostic => diagnostic.component !== undefined && diagnostic.component === componentId),\n ];\n if (chain.levels.length === 0) {\n diagnostics.push(...chain.diagnostics.filter(diagnostic => diagnostic.code === DiagnosticCode.UnknownScope));\n }\n\n return {\n nodeId,\n kind: record.kind,\n typeId: record.typeId,\n label: record.label,\n parentId: record.parentId,\n provenance,\n properties: description.properties.map(descriptor => inspectProperty(descriptor, record, provenance, scopeInstance, scopeGrants, configuredValues)),\n capabilities: description.capabilities,\n removable: isRemovable(record, provenance),\n diagnostics,\n };\n}\n"],"names":["provenanceOf","record","chain","scopeGrants","scopeLevel","levels","at","owner","ownerKind","kind","ProvenanceKind","Local","configurable","SceneNodeKind","Element","values","some","grant","component","value","id","ConfigurableInherited","Inherited","source","isRemovable","provenance","list","undefined","leafId","placementIds","toInspectedItems","raw","local","Array","isArray","map","item","position","origin","editable","inspectProperty","descriptor","scopeInstance","grants","configuredValues","currentValue","readNodeValue","path","configured","find","candidate","isCollection","valueType","PropertyValueType","Collection","inspected","effectiveValue","default","ValueSource","Default","get","grantKey","readOnly","editTarget","EditTarget","Node","reason","Instance","operations","items","length","inspect","document","nodeId","context","index","indexDocument","nodes","resolveTemplateChain","scope","computeExposureGrants","catalog","instance","byInstance","configuration","resolveEffectiveConfiguration","instanceContributions","description","describeNode","componentId","components","diagnostics","filter","diagnostic","push","code","DiagnosticCode","UnknownScope","typeId","label","parentId","properties","capabilities","removable"],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { AddCollectionItemEdit, EditCollectionItemEdit, RemoveCollectionItemEdit, ReorderCollectionItemEdit, ResetInstanceValueEdit, SceneDiagnostic, SceneDocument, SetInstanceValueEdit } from '@cratis/scene.model';
|
|
2
|
+
import { EditSession } from './EditSession';
|
|
3
|
+
export declare function applySetInstanceValue(session: EditSession, edit: SetInstanceValueEdit, clone: SceneDocument, diagnostics: SceneDiagnostic[]): void;
|
|
4
|
+
export declare function applyResetInstanceValue(session: EditSession, edit: ResetInstanceValueEdit, clone: SceneDocument, diagnostics: SceneDiagnostic[]): void;
|
|
5
|
+
export declare function applyAddCollectionItem(session: EditSession, edit: AddCollectionItemEdit, clone: SceneDocument, diagnostics: SceneDiagnostic[]): void;
|
|
6
|
+
export declare function applyRemoveCollectionItem(session: EditSession, edit: RemoveCollectionItemEdit, clone: SceneDocument, diagnostics: SceneDiagnostic[]): void;
|
|
7
|
+
export declare function applyReorderCollectionItem(session: EditSession, edit: ReorderCollectionItemEdit, clone: SceneDocument, diagnostics: SceneDiagnostic[]): void;
|
|
8
|
+
export declare function applyEditCollectionItem(session: EditSession, edit: EditCollectionItemEdit, clone: SceneDocument, diagnostics: SceneDiagnostic[]): void;
|
|
9
|
+
//# sourceMappingURL=instanceEdits.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"instanceEdits.d.ts","sourceRoot":"","sources":["../../../editing/instanceEdits.ts"],"names":[],"mappings":"AAGA,OAAO,EACH,qBAAqB,EAAwD,sBAAsB,EAChF,wBAAwB,EAAE,yBAAyB,EAAE,sBAAsB,EAAE,eAAe,EAC/G,aAAa,EAAE,oBAAoB,EACtC,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAsG5C,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,oBAAoB,EAAE,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,eAAe,EAAE,GAAG,IAAI,CAclJ;AAKD,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,sBAAsB,EAAE,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,eAAe,EAAE,GAAG,IAAI,CAMtJ;AAKD,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,qBAAqB,EAAE,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,eAAe,EAAE,GAAG,IAAI,CAmCpJ;AAkBD,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,wBAAwB,EAAE,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,eAAe,EAAE,GAAG,IAAI,CAS1J;AAKD,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,yBAAyB,EAAE,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,eAAe,EAAE,GAAG,IAAI,CAiB5J;AAKD,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,sBAAsB,EAAE,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,eAAe,EAAE,GAAG,IAAI,CAYtJ"}
|