@ng-draw-flow/layouts 1.2.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.
- package/README.md +243 -0
- package/fesm2022/ng-draw-flow-layouts.mjs +411 -0
- package/fesm2022/ng-draw-flow-layouts.mjs.map +1 -0
- package/index.d.ts +4 -0
- package/lib/auto-layout.service.d.ts +28 -0
- package/lib/layout.configs.d.ts +6 -0
- package/lib/layout.interfaces.d.ts +44 -0
- package/lib/tree/d3-tree-layout.engine.d.ts +13 -0
- package/lib/tree/tree-layout.error.d.ts +6 -0
- package/lib/tree-layout-options.token.d.ts +3 -0
- package/package.json +47 -0
- package/tsconfig.lib.prod.tsbuildinfo +1 -0
package/README.md
ADDED
|
@@ -0,0 +1,243 @@
|
|
|
1
|
+
# @ng-draw-flow/layouts
|
|
2
|
+
|
|
3
|
+
Dynamic strict-tree positioning for graphs rendered by `@ng-draw-flow/core`.
|
|
4
|
+
|
|
5
|
+
- [Layouts documentation](https://taiga-family.github.io/ng-draw-flow/documentation/layouts)
|
|
6
|
+
- [Interactive dynamic-tree example](https://taiga-family.github.io/ng-draw-flow/examples/dynamic-layout)
|
|
7
|
+
- [`@ng-draw-flow/core`](https://npmjs.com/package/@ng-draw-flow/core)
|
|
8
|
+
- [Source and issues](https://github.com/taiga-family/ng-draw-flow)
|
|
9
|
+
|
|
10
|
+
## Features
|
|
11
|
+
|
|
12
|
+
- Left-to-right, right-to-left, top-to-bottom and bottom-to-top trees
|
|
13
|
+
- Fixed or measured node dimensions
|
|
14
|
+
- Configurable level and sibling gaps
|
|
15
|
+
- Stable branch ordering for nodes with multiple outputs
|
|
16
|
+
- Anchored updates that keep the activated parent under the pointer
|
|
17
|
+
- Position animation through the core configuration
|
|
18
|
+
- Signal-based running, result and error state
|
|
19
|
+
|
|
20
|
+
The package uses `d3-hierarchy` internally. Applications configure the supported tree behavior and inject
|
|
21
|
+
`DfAutoLayoutService`; they do not instantiate or manage a D3 engine.
|
|
22
|
+
|
|
23
|
+
## Installation
|
|
24
|
+
|
|
25
|
+
```bash
|
|
26
|
+
npm install @ng-draw-flow/layouts
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
A compatible `@ng-draw-flow/core` installation is required as a peer dependency.
|
|
30
|
+
|
|
31
|
+
## Basic Setup
|
|
32
|
+
|
|
33
|
+
Register layouts next to the core editor configuration. The following setup creates a non-draggable strict tree with
|
|
34
|
+
measured node dimensions and animated position updates.
|
|
35
|
+
|
|
36
|
+
```ts
|
|
37
|
+
import {DfArrowhead, DfConnectionType, provideNgDrawFlowConfigs} from '@ng-draw-flow/core';
|
|
38
|
+
import {DfNodeSizingStrategy, DfTreeLayoutDirection, provideNgDrawFlowLayouts} from '@ng-draw-flow/layouts';
|
|
39
|
+
|
|
40
|
+
providers: [
|
|
41
|
+
provideNgDrawFlowConfigs({
|
|
42
|
+
nodes: {
|
|
43
|
+
treeNode: TreeNodeComponent,
|
|
44
|
+
},
|
|
45
|
+
connection: {
|
|
46
|
+
type: DfConnectionType.SmoothStep,
|
|
47
|
+
arrowhead: {type: DfArrowhead.ArrowClosed},
|
|
48
|
+
},
|
|
49
|
+
options: {
|
|
50
|
+
nodesDraggable: false,
|
|
51
|
+
connectionsCreatable: false,
|
|
52
|
+
connectionsDeletable: false,
|
|
53
|
+
},
|
|
54
|
+
positionAnimation: {
|
|
55
|
+
duration: 280,
|
|
56
|
+
easing: 'ease-in-out',
|
|
57
|
+
},
|
|
58
|
+
}),
|
|
59
|
+
provideNgDrawFlowLayouts({
|
|
60
|
+
tree: {
|
|
61
|
+
direction: DfTreeLayoutDirection.LeftToRight,
|
|
62
|
+
nodeSizing: {
|
|
63
|
+
strategy: DfNodeSizingStrategy.Measured,
|
|
64
|
+
fallback: {width: 180, height: 64},
|
|
65
|
+
},
|
|
66
|
+
levelGap: 96,
|
|
67
|
+
siblingGap: 32,
|
|
68
|
+
},
|
|
69
|
+
}),
|
|
70
|
+
];
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
Call `apply()` after the editor is attached. The service reads the current model from core, calculates positions and
|
|
74
|
+
writes the resulting model back through the editor and its form control.
|
|
75
|
+
|
|
76
|
+
```ts
|
|
77
|
+
import {type AfterViewInit, inject} from '@angular/core';
|
|
78
|
+
import {DfAutoLayoutService} from '@ng-draw-flow/layouts';
|
|
79
|
+
|
|
80
|
+
export class TreeEditorComponent implements AfterViewInit {
|
|
81
|
+
private readonly autoLayout = inject(DfAutoLayoutService);
|
|
82
|
+
|
|
83
|
+
readonly layoutRunning = this.autoLayout.running;
|
|
84
|
+
readonly layoutResult = this.autoLayout.result;
|
|
85
|
+
readonly layoutError = this.autoLayout.error;
|
|
86
|
+
|
|
87
|
+
ngAfterViewInit(): void {
|
|
88
|
+
this.autoLayout.apply();
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
## Dynamic Children
|
|
94
|
+
|
|
95
|
+
An action output is a click-only `df-output` that requests an application action instead of starting a draggable draft
|
|
96
|
+
connection. It does not create a node automatically. The `(activated)` handler must update the model with both the new
|
|
97
|
+
node and its connection.
|
|
98
|
+
|
|
99
|
+
```html
|
|
100
|
+
<ng-template #addChildIcon>
|
|
101
|
+
<tui-icon icon="@tui.plus" />
|
|
102
|
+
</ng-template>
|
|
103
|
+
|
|
104
|
+
<df-output
|
|
105
|
+
title="Add child"
|
|
106
|
+
[content]="addChildIcon"
|
|
107
|
+
[layoutOrder]="0"
|
|
108
|
+
[connectorData]="{
|
|
109
|
+
nodeId: nodeIdSignal(),
|
|
110
|
+
connectorId: nodeIdSignal() + '-output-1',
|
|
111
|
+
single: false,
|
|
112
|
+
data: {childType: 'treeNode'},
|
|
113
|
+
}"
|
|
114
|
+
[mode]="outputMode.Action"
|
|
115
|
+
(activated)="addChild($event)"
|
|
116
|
+
/>
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
Pass the changed model directly to `apply()`. `anchorNodeId` translates the complete result so the activated parent
|
|
120
|
+
keeps its current canvas position while the rest of the tree is rearranged.
|
|
121
|
+
|
|
122
|
+
```ts
|
|
123
|
+
import {
|
|
124
|
+
DfConnectionPoint,
|
|
125
|
+
type DfDataConnectorConfig,
|
|
126
|
+
type DfDataNode,
|
|
127
|
+
} from '@ng-draw-flow/core';
|
|
128
|
+
|
|
129
|
+
private addChild({nodeId, connectorId}: DfDataConnectorConfig): void {
|
|
130
|
+
const model = this.form.getRawValue();
|
|
131
|
+
const parent = model.nodes.find(({id}) => id === nodeId);
|
|
132
|
+
|
|
133
|
+
if (!parent) {
|
|
134
|
+
return;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
const childId = crypto.randomUUID();
|
|
138
|
+
const position = 'position' in parent ? parent.position : {x: 0, y: 0};
|
|
139
|
+
const child: DfDataNode = {
|
|
140
|
+
id: childId,
|
|
141
|
+
data: {type: 'treeNode', title: 'New node'},
|
|
142
|
+
position: {...position},
|
|
143
|
+
};
|
|
144
|
+
|
|
145
|
+
this.autoLayout.apply({
|
|
146
|
+
anchorNodeId: nodeId,
|
|
147
|
+
model: {
|
|
148
|
+
nodes: [...model.nodes, child],
|
|
149
|
+
connections: [
|
|
150
|
+
...model.connections,
|
|
151
|
+
{
|
|
152
|
+
source: {
|
|
153
|
+
nodeId,
|
|
154
|
+
connectorId,
|
|
155
|
+
connectorType: DfConnectionPoint.Output,
|
|
156
|
+
},
|
|
157
|
+
target: {
|
|
158
|
+
nodeId: childId,
|
|
159
|
+
connectorId: childId + '-input-1',
|
|
160
|
+
connectorType: DfConnectionPoint.Input,
|
|
161
|
+
},
|
|
162
|
+
},
|
|
163
|
+
],
|
|
164
|
+
},
|
|
165
|
+
});
|
|
166
|
+
}
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
The child component must render the target `df-input` with the same connector id. Connection paths continue to use the
|
|
170
|
+
real connector elements from core; layouts only calculate node positions.
|
|
171
|
+
|
|
172
|
+
## Node Sizing
|
|
173
|
+
|
|
174
|
+
### Fixed
|
|
175
|
+
|
|
176
|
+
Fixed sizing is the default and assumes `180 x 64px` nodes. Provide an explicit size when every node follows another
|
|
177
|
+
known dimension.
|
|
178
|
+
|
|
179
|
+
```ts
|
|
180
|
+
provideNgDrawFlowLayouts({
|
|
181
|
+
tree: {
|
|
182
|
+
nodeSizing: {
|
|
183
|
+
strategy: DfNodeSizingStrategy.Fixed,
|
|
184
|
+
size: {width: 240, height: 80},
|
|
185
|
+
},
|
|
186
|
+
},
|
|
187
|
+
});
|
|
188
|
+
```
|
|
189
|
+
|
|
190
|
+
### Measured
|
|
191
|
+
|
|
192
|
+
Use measured sizing when node dimensions depend on text, forms or expandable content. The fallback is used before every
|
|
193
|
+
current node has reported its DOM size.
|
|
194
|
+
|
|
195
|
+
```ts
|
|
196
|
+
provideNgDrawFlowLayouts({
|
|
197
|
+
tree: {
|
|
198
|
+
nodeSizing: {
|
|
199
|
+
strategy: DfNodeSizingStrategy.Measured,
|
|
200
|
+
fallback: {width: 180, height: 64},
|
|
201
|
+
},
|
|
202
|
+
},
|
|
203
|
+
});
|
|
204
|
+
```
|
|
205
|
+
|
|
206
|
+
Measured sizing opts into core's node `ResizeObserver`, coalesces size changes per animation frame and reapplies the
|
|
207
|
+
layout after all current nodes have measurements. DOM dimensions remain runtime view state and are not stored in
|
|
208
|
+
`DfDataModel`.
|
|
209
|
+
|
|
210
|
+
## Branch Order
|
|
211
|
+
|
|
212
|
+
When one parent has children connected through multiple outputs, assign every used output a unique zero-based
|
|
213
|
+
`layoutOrder`.
|
|
214
|
+
|
|
215
|
+
- Horizontal trees interpret output order from top to bottom.
|
|
216
|
+
- Vertical trees interpret output order from left to right.
|
|
217
|
+
- Children connected through the same output retain their order from `DfDataModel.connections`.
|
|
218
|
+
- A parent with only one connected output does not need `layoutOrder`.
|
|
219
|
+
|
|
220
|
+
## Tree Options
|
|
221
|
+
|
|
222
|
+
| Option | Behavior |
|
|
223
|
+
| ---------------------- | --------------------------------------------------------------------------- |
|
|
224
|
+
| `direction` | Tree orientation. Defaults to `LeftToRight`. |
|
|
225
|
+
| `nodeSizing` | Fixed or measured node dimensions. |
|
|
226
|
+
| `levelGap` | Space between parent and child levels. Defaults to `80`. |
|
|
227
|
+
| `siblingGap` | Space between sibling nodes. Defaults to `32`. |
|
|
228
|
+
| `preserveRootPosition` | Keeps the model's root position by default. Set to `false` to use `origin`. |
|
|
229
|
+
| `origin` | Root position when the existing root position is not preserved. |
|
|
230
|
+
| `rootId` | Verifies the expected root id. The model must still have exactly one root. |
|
|
231
|
+
|
|
232
|
+
## Strict-tree Constraints
|
|
233
|
+
|
|
234
|
+
The current package supports strict trees only. A valid model must have:
|
|
235
|
+
|
|
236
|
+
- exactly one root with no incoming connection;
|
|
237
|
+
- no cycles;
|
|
238
|
+
- at most one parent for every non-root node;
|
|
239
|
+
- no disconnected nodes;
|
|
240
|
+
- connections that reference existing nodes.
|
|
241
|
+
|
|
242
|
+
Invalid models are exposed through `DfAutoLayoutService.error` as `DfTreeLayoutError`. General DAG layouts and custom
|
|
243
|
+
layout engines are not supported.
|
|
@@ -0,0 +1,411 @@
|
|
|
1
|
+
import * as i0 from '@angular/core';
|
|
2
|
+
import { InjectionToken, inject, signal, effect, untracked, Injectable } from '@angular/core';
|
|
3
|
+
import { NgDrawFlowStoreService, DF_NODE_SIZE_REGISTRY, DF_CONNECTOR_ORDER_REGISTRY, DfConnectorOrderRegistryService, DfNodeSizeRegistryService } from '@ng-draw-flow/core';
|
|
4
|
+
import { hierarchy, tree } from 'd3-hierarchy';
|
|
5
|
+
|
|
6
|
+
var DfTreeLayoutDirection;
|
|
7
|
+
(function (DfTreeLayoutDirection) {
|
|
8
|
+
DfTreeLayoutDirection["BottomToTop"] = "bottom-to-top";
|
|
9
|
+
DfTreeLayoutDirection["LeftToRight"] = "left-to-right";
|
|
10
|
+
DfTreeLayoutDirection["RightToLeft"] = "right-to-left";
|
|
11
|
+
DfTreeLayoutDirection["TopToBottom"] = "top-to-bottom";
|
|
12
|
+
})(DfTreeLayoutDirection || (DfTreeLayoutDirection = {}));
|
|
13
|
+
var DfNodeSizingStrategy;
|
|
14
|
+
(function (DfNodeSizingStrategy) {
|
|
15
|
+
DfNodeSizingStrategy["Fixed"] = "fixed";
|
|
16
|
+
DfNodeSizingStrategy["Measured"] = "measured";
|
|
17
|
+
})(DfNodeSizingStrategy || (DfNodeSizingStrategy = {}));
|
|
18
|
+
|
|
19
|
+
class DfTreeLayoutError extends Error {
|
|
20
|
+
constructor(code, message, nodeIds = []) {
|
|
21
|
+
super(message);
|
|
22
|
+
this.code = code;
|
|
23
|
+
this.nodeIds = nodeIds;
|
|
24
|
+
this.name = 'DfTreeLayoutError';
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
const DEFAULT_NODE_SIZE = { width: 180, height: 64 };
|
|
29
|
+
const DEFAULT_LEVEL_GAP = 80;
|
|
30
|
+
const DEFAULT_SIBLING_GAP = 32;
|
|
31
|
+
const DEFAULT_ORIGIN = { x: 0, y: 0 };
|
|
32
|
+
const EMPTY_CONNECTOR_ORDERS$1 = new Map();
|
|
33
|
+
class D3TreeLayoutEngine {
|
|
34
|
+
constructor(options = {}) {
|
|
35
|
+
this.options = options;
|
|
36
|
+
this.id = 'd3-tree';
|
|
37
|
+
}
|
|
38
|
+
layout(model, measuredSizes = new Map(), connectorOrders = EMPTY_CONNECTOR_ORDERS$1) {
|
|
39
|
+
const direction = this.options.direction ?? DfTreeLayoutDirection.LeftToRight;
|
|
40
|
+
if (!model.nodes.length) {
|
|
41
|
+
return {
|
|
42
|
+
model: {
|
|
43
|
+
...model,
|
|
44
|
+
nodes: [],
|
|
45
|
+
connections: model.connections.slice(),
|
|
46
|
+
},
|
|
47
|
+
diagnostics: [],
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
const graph = this.buildGraph(model, connectorOrders);
|
|
51
|
+
const root = hierarchy(graph.root, (node) => graph.children.get(node.id) ?? []);
|
|
52
|
+
const horizontal = direction === DfTreeLayoutDirection.LeftToRight ||
|
|
53
|
+
direction === DfTreeLayoutDirection.RightToLeft;
|
|
54
|
+
const sizes = new Map(model.nodes.map(({ id }) => [id, this.resolveNodeSize(id, measuredSizes)]));
|
|
55
|
+
const breadthSize = (nodeId) => {
|
|
56
|
+
const size = sizes.get(nodeId);
|
|
57
|
+
return horizontal ? size.height : size.width;
|
|
58
|
+
};
|
|
59
|
+
const depthSize = (nodeId) => {
|
|
60
|
+
const size = sizes.get(nodeId);
|
|
61
|
+
return horizontal ? size.width : size.height;
|
|
62
|
+
};
|
|
63
|
+
const siblingGap = this.options.siblingGap ?? DEFAULT_SIBLING_GAP;
|
|
64
|
+
const maxDepthSizes = [];
|
|
65
|
+
root.each((node) => {
|
|
66
|
+
maxDepthSizes[node.depth] = Math.max(maxDepthSizes[node.depth] ?? 0, depthSize(node.data.id));
|
|
67
|
+
});
|
|
68
|
+
const depthOffsets = maxDepthSizes.map((_, depth) => {
|
|
69
|
+
let offset = 0;
|
|
70
|
+
for (let index = 1; index <= depth; index++) {
|
|
71
|
+
offset +=
|
|
72
|
+
maxDepthSizes[index - 1] / 2 +
|
|
73
|
+
(this.options.levelGap ?? DEFAULT_LEVEL_GAP) +
|
|
74
|
+
maxDepthSizes[index] / 2;
|
|
75
|
+
}
|
|
76
|
+
return offset;
|
|
77
|
+
});
|
|
78
|
+
tree()
|
|
79
|
+
.nodeSize([1, 1])
|
|
80
|
+
.separation((left, right) => {
|
|
81
|
+
const distance = (breadthSize(left.data.id) + breadthSize(right.data.id)) / 2 +
|
|
82
|
+
siblingGap;
|
|
83
|
+
return left.parent === right.parent ? distance : distance * 1.25;
|
|
84
|
+
})(root);
|
|
85
|
+
const anchor = this.resolveAnchor(graph.root);
|
|
86
|
+
const positions = new Map();
|
|
87
|
+
root.each((node) => {
|
|
88
|
+
positions.set(node.data.id, this.orientPosition(direction, anchor, node.x ?? 0, depthOffsets[node.depth] ?? 0));
|
|
89
|
+
});
|
|
90
|
+
return {
|
|
91
|
+
model: {
|
|
92
|
+
...model,
|
|
93
|
+
nodes: model.nodes.map((node) => ({
|
|
94
|
+
...node,
|
|
95
|
+
data: { ...node.data },
|
|
96
|
+
position: positions.get(node.id),
|
|
97
|
+
})),
|
|
98
|
+
connections: model.connections.map((connection) => ({
|
|
99
|
+
...connection,
|
|
100
|
+
source: { ...connection.source },
|
|
101
|
+
target: { ...connection.target },
|
|
102
|
+
label: connection.label ? { ...connection.label } : undefined,
|
|
103
|
+
})),
|
|
104
|
+
},
|
|
105
|
+
diagnostics: [],
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
resolveNodeSize(nodeId, measuredSizes) {
|
|
109
|
+
const sizing = this.options.nodeSizing;
|
|
110
|
+
if (sizing?.strategy === DfNodeSizingStrategy.Measured) {
|
|
111
|
+
return measuredSizes.get(nodeId) ?? sizing.fallback;
|
|
112
|
+
}
|
|
113
|
+
return sizing?.strategy === DfNodeSizingStrategy.Fixed
|
|
114
|
+
? sizing.size
|
|
115
|
+
: DEFAULT_NODE_SIZE;
|
|
116
|
+
}
|
|
117
|
+
buildGraph(model, connectorOrders) {
|
|
118
|
+
const nodes = new Map();
|
|
119
|
+
model.nodes.forEach((node) => {
|
|
120
|
+
if (nodes.has(node.id)) {
|
|
121
|
+
throw new DfTreeLayoutError('duplicate-node', `Tree layout requires unique node ids; "${node.id}" is duplicated.`, [node.id]);
|
|
122
|
+
}
|
|
123
|
+
nodes.set(node.id, node);
|
|
124
|
+
});
|
|
125
|
+
const parentByChild = new Map();
|
|
126
|
+
const childrenByParent = new Map();
|
|
127
|
+
const sourceConnectorByChild = new Map();
|
|
128
|
+
const links = new Set();
|
|
129
|
+
model.connections.forEach((connection) => {
|
|
130
|
+
const parentId = connection.source.nodeId;
|
|
131
|
+
const childId = connection.target.nodeId;
|
|
132
|
+
const parent = nodes.get(parentId);
|
|
133
|
+
const child = nodes.get(childId);
|
|
134
|
+
if (!parent || !child) {
|
|
135
|
+
const missingIds = [
|
|
136
|
+
parent ? null : parentId,
|
|
137
|
+
child ? null : childId,
|
|
138
|
+
].filter((id) => id !== null);
|
|
139
|
+
throw new DfTreeLayoutError('missing-node', `Tree layout connection references missing node(s): ${missingIds.join(', ')}.`, missingIds);
|
|
140
|
+
}
|
|
141
|
+
const linkKey = `${parentId}\u0000${childId}`;
|
|
142
|
+
if (links.has(linkKey)) {
|
|
143
|
+
return;
|
|
144
|
+
}
|
|
145
|
+
links.add(linkKey);
|
|
146
|
+
const existingParent = parentByChild.get(childId);
|
|
147
|
+
if (existingParent && existingParent !== parentId) {
|
|
148
|
+
throw new DfTreeLayoutError('multiple-parents', `Tree node "${childId}" has more than one parent.`, [existingParent, parentId, childId]);
|
|
149
|
+
}
|
|
150
|
+
parentByChild.set(childId, parentId);
|
|
151
|
+
sourceConnectorByChild.set(childId, connection.source.connectorId);
|
|
152
|
+
childrenByParent.set(parentId, [
|
|
153
|
+
...(childrenByParent.get(parentId) ?? []),
|
|
154
|
+
child,
|
|
155
|
+
]);
|
|
156
|
+
});
|
|
157
|
+
this.sortChildrenByOutputOrder(childrenByParent, sourceConnectorByChild, connectorOrders);
|
|
158
|
+
const rootCandidates = model.nodes.filter((node) => !parentByChild.has(node.id));
|
|
159
|
+
const root = this.options.rootId
|
|
160
|
+
? nodes.get(this.options.rootId)
|
|
161
|
+
: rootCandidates[0];
|
|
162
|
+
if (!root ||
|
|
163
|
+
parentByChild.has(root.id) ||
|
|
164
|
+
rootCandidates.length !== 1 ||
|
|
165
|
+
(this.options.rootId && rootCandidates[0]?.id !== this.options.rootId)) {
|
|
166
|
+
throw new DfTreeLayoutError('invalid-root', 'Tree layout requires exactly one root node with no incoming connections.', rootCandidates.map(({ id }) => id));
|
|
167
|
+
}
|
|
168
|
+
const visited = new Set();
|
|
169
|
+
const pending = [root];
|
|
170
|
+
while (pending.length) {
|
|
171
|
+
const current = pending.pop();
|
|
172
|
+
if (visited.has(current.id)) {
|
|
173
|
+
continue;
|
|
174
|
+
}
|
|
175
|
+
visited.add(current.id);
|
|
176
|
+
pending.push(...(childrenByParent.get(current.id) ?? []));
|
|
177
|
+
}
|
|
178
|
+
if (visited.size !== model.nodes.length) {
|
|
179
|
+
const disconnected = model.nodes
|
|
180
|
+
.filter((node) => !visited.has(node.id))
|
|
181
|
+
.map(({ id }) => id);
|
|
182
|
+
throw new DfTreeLayoutError('disconnected-graph', `Tree layout cannot reach node(s) from root "${root.id}": ${disconnected.join(', ')}.`, disconnected);
|
|
183
|
+
}
|
|
184
|
+
return { root, children: childrenByParent };
|
|
185
|
+
}
|
|
186
|
+
sortChildrenByOutputOrder(childrenByParent, sourceConnectorByChild, connectorOrders) {
|
|
187
|
+
childrenByParent.forEach((children, parentId) => {
|
|
188
|
+
const connectorIds = [
|
|
189
|
+
...new Set(children.map((child) => sourceConnectorByChild.get(child.id))),
|
|
190
|
+
];
|
|
191
|
+
if (connectorIds.length < 2) {
|
|
192
|
+
return;
|
|
193
|
+
}
|
|
194
|
+
const nodeOrders = connectorOrders.get(parentId);
|
|
195
|
+
const orderByConnector = new Map();
|
|
196
|
+
const connectorByOrder = new Map();
|
|
197
|
+
connectorIds.forEach((connectorId) => {
|
|
198
|
+
const order = nodeOrders?.get(connectorId);
|
|
199
|
+
if (order === undefined || order === null) {
|
|
200
|
+
throw new DfTreeLayoutError('missing-output-order', `Tree node "${parentId}" has multiple connected outputs, but connector "${connectorId}" has no layoutOrder.`, [parentId]);
|
|
201
|
+
}
|
|
202
|
+
if (!Number.isInteger(order) || order < 0) {
|
|
203
|
+
throw new DfTreeLayoutError('invalid-output-order', `Tree output "${connectorId}" on node "${parentId}" requires a non-negative integer layoutOrder.`, [parentId]);
|
|
204
|
+
}
|
|
205
|
+
const duplicateConnectorId = connectorByOrder.get(order);
|
|
206
|
+
if (duplicateConnectorId) {
|
|
207
|
+
throw new DfTreeLayoutError('duplicate-output-order', `Tree outputs "${duplicateConnectorId}" and "${connectorId}" on node "${parentId}" use the same layoutOrder ${order}.`, [parentId]);
|
|
208
|
+
}
|
|
209
|
+
orderByConnector.set(connectorId, order);
|
|
210
|
+
connectorByOrder.set(order, connectorId);
|
|
211
|
+
});
|
|
212
|
+
children.sort((left, right) => orderByConnector.get(sourceConnectorByChild.get(left.id)) -
|
|
213
|
+
orderByConnector.get(sourceConnectorByChild.get(right.id)));
|
|
214
|
+
});
|
|
215
|
+
}
|
|
216
|
+
resolveAnchor(root) {
|
|
217
|
+
if (this.options.preserveRootPosition !== false &&
|
|
218
|
+
'position' in root &&
|
|
219
|
+
Number.isFinite(root.position.x) &&
|
|
220
|
+
Number.isFinite(root.position.y)) {
|
|
221
|
+
return { ...root.position };
|
|
222
|
+
}
|
|
223
|
+
return { ...(this.options.origin ?? DEFAULT_ORIGIN) };
|
|
224
|
+
}
|
|
225
|
+
orientPosition(direction, anchor, breadth, depth) {
|
|
226
|
+
switch (direction) {
|
|
227
|
+
case DfTreeLayoutDirection.BottomToTop:
|
|
228
|
+
return { x: anchor.x + breadth, y: anchor.y - depth };
|
|
229
|
+
case DfTreeLayoutDirection.RightToLeft:
|
|
230
|
+
return { x: anchor.x - depth, y: anchor.y + breadth };
|
|
231
|
+
case DfTreeLayoutDirection.TopToBottom:
|
|
232
|
+
return { x: anchor.x + breadth, y: anchor.y + depth };
|
|
233
|
+
case DfTreeLayoutDirection.LeftToRight:
|
|
234
|
+
default:
|
|
235
|
+
return { x: anchor.x + depth, y: anchor.y + breadth };
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
const DF_TREE_LAYOUT_OPTIONS = new InjectionToken('[DF_TREE_LAYOUT_OPTIONS]: Tree layout options', { factory: () => ({}) });
|
|
241
|
+
|
|
242
|
+
const EMPTY_NODE_SIZES = new Map();
|
|
243
|
+
const EMPTY_CONNECTOR_ORDERS = new Map();
|
|
244
|
+
class DfAutoLayoutService {
|
|
245
|
+
constructor() {
|
|
246
|
+
this.store = inject(NgDrawFlowStoreService);
|
|
247
|
+
this.treeOptions = inject(DF_TREE_LAYOUT_OPTIONS);
|
|
248
|
+
this.nodeSizeRegistry = inject(DF_NODE_SIZE_REGISTRY);
|
|
249
|
+
this.connectorOrderRegistry = inject(DF_CONNECTOR_ORDER_REGISTRY);
|
|
250
|
+
this.engine = new D3TreeLayoutEngine(this.treeOptions);
|
|
251
|
+
this.runningSignal = signal(false);
|
|
252
|
+
this.resultSignal = signal(null);
|
|
253
|
+
this.errorSignal = signal(null);
|
|
254
|
+
this.lastAppliedSizes = null;
|
|
255
|
+
this.lastAppliedConnectorOrders = null;
|
|
256
|
+
this.hasApplied = false;
|
|
257
|
+
this.running = this.runningSignal.asReadonly();
|
|
258
|
+
this.result = this.resultSignal.asReadonly();
|
|
259
|
+
this.error = this.errorSignal.asReadonly();
|
|
260
|
+
const nodeSizeRegistry = this.nodeSizeRegistry;
|
|
261
|
+
if (this.treeOptions.nodeSizing?.strategy === DfNodeSizingStrategy.Measured &&
|
|
262
|
+
nodeSizeRegistry) {
|
|
263
|
+
effect(() => {
|
|
264
|
+
const sizes = nodeSizeRegistry.sizes();
|
|
265
|
+
untracked(() => this.applyMeasuredSizes(sizes));
|
|
266
|
+
});
|
|
267
|
+
}
|
|
268
|
+
const connectorOrderRegistry = this.connectorOrderRegistry;
|
|
269
|
+
if (connectorOrderRegistry) {
|
|
270
|
+
effect(() => {
|
|
271
|
+
const orders = connectorOrderRegistry.orders();
|
|
272
|
+
untracked(() => this.applyConnectorOrders(orders));
|
|
273
|
+
});
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
apply(options = {}) {
|
|
277
|
+
const sourceModel = this.store.dataModel();
|
|
278
|
+
const model = options.model ?? sourceModel;
|
|
279
|
+
if (!model) {
|
|
280
|
+
return;
|
|
281
|
+
}
|
|
282
|
+
const measuredSizes = this.nodeSizeRegistry?.sizes() ?? EMPTY_NODE_SIZES;
|
|
283
|
+
const connectorOrders = this.connectorOrderRegistry?.orders() ?? EMPTY_CONNECTOR_ORDERS;
|
|
284
|
+
this.hasApplied = true;
|
|
285
|
+
this.lastAppliedConnectorOrders = connectorOrders;
|
|
286
|
+
if (this.treeOptions.nodeSizing?.strategy === DfNodeSizingStrategy.Measured) {
|
|
287
|
+
this.lastAppliedSizes = measuredSizes;
|
|
288
|
+
this.pendingMeasurementAnchorNodeId = this.hasMissingSizes(model, measuredSizes)
|
|
289
|
+
? options.anchorNodeId
|
|
290
|
+
: undefined;
|
|
291
|
+
}
|
|
292
|
+
this.applyLayout(model, sourceModel ?? model, measuredSizes, connectorOrders, options.anchorNodeId);
|
|
293
|
+
}
|
|
294
|
+
applyMeasuredSizes(sizes) {
|
|
295
|
+
const model = this.store.dataModel();
|
|
296
|
+
if (!model ||
|
|
297
|
+
sizes === this.lastAppliedSizes ||
|
|
298
|
+
this.hasMissingSizes(model, sizes)) {
|
|
299
|
+
return;
|
|
300
|
+
}
|
|
301
|
+
const anchorNodeId = this.pendingMeasurementAnchorNodeId;
|
|
302
|
+
this.lastAppliedSizes = sizes;
|
|
303
|
+
this.pendingMeasurementAnchorNodeId = undefined;
|
|
304
|
+
this.applyLayout(model, model, sizes, this.connectorOrderRegistry?.orders() ?? EMPTY_CONNECTOR_ORDERS, anchorNodeId);
|
|
305
|
+
}
|
|
306
|
+
applyConnectorOrders(orders) {
|
|
307
|
+
const model = this.store.dataModel();
|
|
308
|
+
const measuredSizes = this.nodeSizeRegistry?.sizes() ?? EMPTY_NODE_SIZES;
|
|
309
|
+
if (!this.hasApplied ||
|
|
310
|
+
!model ||
|
|
311
|
+
orders === this.lastAppliedConnectorOrders ||
|
|
312
|
+
(this.treeOptions.nodeSizing?.strategy === DfNodeSizingStrategy.Measured &&
|
|
313
|
+
this.hasMissingSizes(model, measuredSizes))) {
|
|
314
|
+
return;
|
|
315
|
+
}
|
|
316
|
+
this.lastAppliedConnectorOrders = orders;
|
|
317
|
+
this.applyLayout(model, model, measuredSizes, orders);
|
|
318
|
+
}
|
|
319
|
+
applyLayout(model, sourceModel, measuredSizes, connectorOrders, anchorNodeId) {
|
|
320
|
+
this.runningSignal.set(true);
|
|
321
|
+
this.errorSignal.set(null);
|
|
322
|
+
try {
|
|
323
|
+
const result = this.engine.layout(model, measuredSizes, connectorOrders);
|
|
324
|
+
const anchoredResult = this.anchorResult(sourceModel, result, anchorNodeId);
|
|
325
|
+
this.store.setDataModel(anchoredResult.model);
|
|
326
|
+
this.resultSignal.set(anchoredResult);
|
|
327
|
+
}
|
|
328
|
+
catch (error) {
|
|
329
|
+
this.resultSignal.set(null);
|
|
330
|
+
this.errorSignal.set(error instanceof Error ? error : new Error(String(error)));
|
|
331
|
+
}
|
|
332
|
+
finally {
|
|
333
|
+
this.runningSignal.set(false);
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
hasMissingSizes(model, sizes) {
|
|
337
|
+
return model.nodes.some(({ id }) => !sizes.has(id));
|
|
338
|
+
}
|
|
339
|
+
anchorResult(sourceModel, result, anchorNodeId) {
|
|
340
|
+
if (!anchorNodeId) {
|
|
341
|
+
return result;
|
|
342
|
+
}
|
|
343
|
+
const sourceAnchor = sourceModel.nodes.find(({ id }) => id === anchorNodeId);
|
|
344
|
+
const resultAnchor = result.model.nodes.find(({ id }) => id === anchorNodeId);
|
|
345
|
+
if (!sourceAnchor ||
|
|
346
|
+
!resultAnchor ||
|
|
347
|
+
!('position' in sourceAnchor) ||
|
|
348
|
+
!('position' in resultAnchor) ||
|
|
349
|
+
!Number.isFinite(sourceAnchor.position.x) ||
|
|
350
|
+
!Number.isFinite(sourceAnchor.position.y) ||
|
|
351
|
+
!Number.isFinite(resultAnchor.position.x) ||
|
|
352
|
+
!Number.isFinite(resultAnchor.position.y)) {
|
|
353
|
+
return result;
|
|
354
|
+
}
|
|
355
|
+
const deltaX = sourceAnchor.position.x - resultAnchor.position.x;
|
|
356
|
+
const deltaY = sourceAnchor.position.y - resultAnchor.position.y;
|
|
357
|
+
if (!deltaX && !deltaY) {
|
|
358
|
+
return result;
|
|
359
|
+
}
|
|
360
|
+
return {
|
|
361
|
+
...result,
|
|
362
|
+
model: {
|
|
363
|
+
...result.model,
|
|
364
|
+
nodes: result.model.nodes.map((node) => 'position' in node
|
|
365
|
+
? {
|
|
366
|
+
...node,
|
|
367
|
+
position: {
|
|
368
|
+
x: node.position.x + deltaX,
|
|
369
|
+
y: node.position.y + deltaY,
|
|
370
|
+
},
|
|
371
|
+
}
|
|
372
|
+
: node),
|
|
373
|
+
},
|
|
374
|
+
};
|
|
375
|
+
}
|
|
376
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: DfAutoLayoutService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
377
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: DfAutoLayoutService, providedIn: 'root' }); }
|
|
378
|
+
}
|
|
379
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: DfAutoLayoutService, decorators: [{
|
|
380
|
+
type: Injectable,
|
|
381
|
+
args: [{ providedIn: 'root' }]
|
|
382
|
+
}], ctorParameters: () => [] });
|
|
383
|
+
|
|
384
|
+
function provideNgDrawFlowLayouts(options = {}) {
|
|
385
|
+
const providers = [
|
|
386
|
+
DfAutoLayoutService,
|
|
387
|
+
DfConnectorOrderRegistryService,
|
|
388
|
+
{
|
|
389
|
+
provide: DF_CONNECTOR_ORDER_REGISTRY,
|
|
390
|
+
useExisting: DfConnectorOrderRegistryService,
|
|
391
|
+
},
|
|
392
|
+
{
|
|
393
|
+
provide: DF_TREE_LAYOUT_OPTIONS,
|
|
394
|
+
useValue: options.tree ?? {},
|
|
395
|
+
},
|
|
396
|
+
];
|
|
397
|
+
if (options.tree?.nodeSizing?.strategy === DfNodeSizingStrategy.Measured) {
|
|
398
|
+
providers.push(DfNodeSizeRegistryService, {
|
|
399
|
+
provide: DF_NODE_SIZE_REGISTRY,
|
|
400
|
+
useExisting: DfNodeSizeRegistryService,
|
|
401
|
+
});
|
|
402
|
+
}
|
|
403
|
+
return providers;
|
|
404
|
+
}
|
|
405
|
+
|
|
406
|
+
/**
|
|
407
|
+
* Generated bundle index. Do not edit.
|
|
408
|
+
*/
|
|
409
|
+
|
|
410
|
+
export { DfAutoLayoutService, DfNodeSizingStrategy, DfTreeLayoutDirection, DfTreeLayoutError, provideNgDrawFlowLayouts };
|
|
411
|
+
//# sourceMappingURL=ng-draw-flow-layouts.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ng-draw-flow-layouts.mjs","sources":["../../../projects/layouts/src/lib/layout.interfaces.ts","../../../projects/layouts/src/lib/tree/tree-layout.error.ts","../../../projects/layouts/src/lib/tree/d3-tree-layout.engine.ts","../../../projects/layouts/src/lib/tree-layout-options.token.ts","../../../projects/layouts/src/lib/auto-layout.service.ts","../../../projects/layouts/src/lib/layout.configs.ts","../../../projects/layouts/src/ng-draw-flow-layouts.ts"],"sourcesContent":["import {type DfDataModel, type DfNodeSize, type DfPoint} from '@ng-draw-flow/core';\n\nexport interface DfLayoutDiagnostic {\n readonly code: string;\n readonly message: string;\n readonly nodeIds?: readonly string[];\n}\n\nexport interface DfLayoutResult {\n readonly model: DfDataModel;\n readonly diagnostics: readonly DfLayoutDiagnostic[];\n}\n\nexport interface DfAutoLayoutOptions {\n /** Keeps this node at its current canvas position by translating the result. */\n readonly anchorNodeId?: string;\n /** Layouts this model immediately instead of waiting for form-to-store synchronization. */\n readonly model?: DfDataModel;\n}\n\nexport enum DfTreeLayoutDirection {\n BottomToTop = 'bottom-to-top',\n LeftToRight = 'left-to-right',\n RightToLeft = 'right-to-left',\n TopToBottom = 'top-to-bottom',\n}\n\nexport enum DfNodeSizingStrategy {\n Fixed = 'fixed',\n Measured = 'measured',\n}\n\nexport interface DfFixedNodeSizingOptions {\n readonly strategy: DfNodeSizingStrategy.Fixed;\n readonly size: DfNodeSize;\n}\n\nexport interface DfMeasuredNodeSizingOptions {\n readonly strategy: DfNodeSizingStrategy.Measured;\n readonly fallback: DfNodeSize;\n}\n\nexport type DfNodeSizingOptions = DfFixedNodeSizingOptions | DfMeasuredNodeSizingOptions;\n\nexport interface DfTreeLayoutOptions {\n readonly direction?: DfTreeLayoutDirection;\n readonly rootId?: string;\n readonly nodeSizing?: DfNodeSizingOptions;\n readonly levelGap?: number;\n readonly siblingGap?: number;\n readonly preserveRootPosition?: boolean;\n readonly origin?: DfPoint;\n}\n","export type DfTreeLayoutErrorCode =\n | 'disconnected-graph'\n | 'duplicate-node'\n | 'duplicate-output-order'\n | 'invalid-output-order'\n | 'invalid-root'\n | 'missing-node'\n | 'missing-output-order'\n | 'multiple-parents';\n\nexport class DfTreeLayoutError extends Error {\n constructor(\n public readonly code: DfTreeLayoutErrorCode,\n message: string,\n public readonly nodeIds: readonly string[] = [],\n ) {\n super(message);\n this.name = 'DfTreeLayoutError';\n }\n}\n","import {\n type DfDataInitialNode,\n type DfDataModel,\n type DfDataNode,\n type DfId,\n type DfNodeConnectorOrders,\n type DfNodeSize,\n type DfPoint,\n} from '@ng-draw-flow/core';\nimport {hierarchy, tree} from 'd3-hierarchy';\n\nimport {\n type DfLayoutResult,\n DfNodeSizingStrategy,\n DfTreeLayoutDirection,\n type DfTreeLayoutOptions,\n} from '../layout.interfaces';\nimport {DfTreeLayoutError} from './tree-layout.error';\n\ntype DfAnyNode = DfDataInitialNode | DfDataNode;\n\nconst DEFAULT_NODE_SIZE: DfNodeSize = {width: 180, height: 64};\nconst DEFAULT_LEVEL_GAP = 80;\nconst DEFAULT_SIBLING_GAP = 32;\nconst DEFAULT_ORIGIN: DfPoint = {x: 0, y: 0};\nconst EMPTY_CONNECTOR_ORDERS: DfNodeConnectorOrders = new Map();\n\nexport class D3TreeLayoutEngine {\n public readonly id = 'd3-tree';\n\n constructor(private readonly options: DfTreeLayoutOptions = {}) {}\n\n public layout(\n model: DfDataModel,\n measuredSizes: ReadonlyMap<DfId, DfNodeSize> = new Map(),\n connectorOrders: DfNodeConnectorOrders = EMPTY_CONNECTOR_ORDERS,\n ): DfLayoutResult {\n const direction = this.options.direction ?? DfTreeLayoutDirection.LeftToRight;\n\n if (!model.nodes.length) {\n return {\n model: {\n ...model,\n nodes: [],\n connections: model.connections.slice(),\n },\n diagnostics: [],\n };\n }\n\n const graph = this.buildGraph(model, connectorOrders);\n const root = hierarchy(graph.root, (node) => graph.children.get(node.id) ?? []);\n const horizontal =\n direction === DfTreeLayoutDirection.LeftToRight ||\n direction === DfTreeLayoutDirection.RightToLeft;\n const sizes = new Map(\n model.nodes.map(({id}) => [id, this.resolveNodeSize(id, measuredSizes)]),\n );\n const breadthSize = (nodeId: DfId): number => {\n const size = sizes.get(nodeId)!;\n\n return horizontal ? size.height : size.width;\n };\n const depthSize = (nodeId: DfId): number => {\n const size = sizes.get(nodeId)!;\n\n return horizontal ? size.width : size.height;\n };\n const siblingGap = this.options.siblingGap ?? DEFAULT_SIBLING_GAP;\n const maxDepthSizes: number[] = [];\n\n root.each((node) => {\n maxDepthSizes[node.depth] = Math.max(\n maxDepthSizes[node.depth] ?? 0,\n depthSize(node.data.id),\n );\n });\n\n const depthOffsets = maxDepthSizes.map((_, depth) => {\n let offset = 0;\n\n for (let index = 1; index <= depth; index++) {\n offset +=\n maxDepthSizes[index - 1]! / 2 +\n (this.options.levelGap ?? DEFAULT_LEVEL_GAP) +\n maxDepthSizes[index]! / 2;\n }\n\n return offset;\n });\n\n tree<DfAnyNode>()\n .nodeSize([1, 1])\n .separation((left, right) => {\n const distance =\n (breadthSize(left.data.id) + breadthSize(right.data.id)) / 2 +\n siblingGap;\n\n return left.parent === right.parent ? distance : distance * 1.25;\n })(root);\n\n const anchor = this.resolveAnchor(graph.root);\n const positions = new Map<string, DfPoint>();\n\n root.each((node) => {\n positions.set(\n node.data.id,\n this.orientPosition(\n direction,\n anchor,\n node.x ?? 0,\n depthOffsets[node.depth] ?? 0,\n ),\n );\n });\n\n return {\n model: {\n ...model,\n nodes: model.nodes.map((node) => ({\n ...node,\n data: {...node.data},\n position: positions.get(node.id)!,\n })),\n connections: model.connections.map((connection) => ({\n ...connection,\n source: {...connection.source},\n target: {...connection.target},\n label: connection.label ? {...connection.label} : undefined,\n })),\n },\n diagnostics: [],\n };\n }\n\n private resolveNodeSize(\n nodeId: DfId,\n measuredSizes: ReadonlyMap<DfId, DfNodeSize>,\n ): DfNodeSize {\n const sizing = this.options.nodeSizing;\n\n if (sizing?.strategy === DfNodeSizingStrategy.Measured) {\n return measuredSizes.get(nodeId) ?? sizing.fallback;\n }\n\n return sizing?.strategy === DfNodeSizingStrategy.Fixed\n ? sizing.size\n : DEFAULT_NODE_SIZE;\n }\n\n private buildGraph(\n model: DfDataModel,\n connectorOrders: DfNodeConnectorOrders,\n ): {\n readonly root: DfAnyNode;\n readonly children: ReadonlyMap<string, readonly DfAnyNode[]>;\n } {\n const nodes = new Map<string, DfAnyNode>();\n\n model.nodes.forEach((node) => {\n if (nodes.has(node.id)) {\n throw new DfTreeLayoutError(\n 'duplicate-node',\n `Tree layout requires unique node ids; \"${node.id}\" is duplicated.`,\n [node.id],\n );\n }\n\n nodes.set(node.id, node);\n });\n\n const parentByChild = new Map<string, string>();\n const childrenByParent = new Map<string, DfAnyNode[]>();\n const sourceConnectorByChild = new Map<string, string>();\n const links = new Set<string>();\n\n model.connections.forEach((connection) => {\n const parentId = connection.source.nodeId;\n const childId = connection.target.nodeId;\n const parent = nodes.get(parentId);\n const child = nodes.get(childId);\n\n if (!parent || !child) {\n const missingIds = [\n parent ? null : parentId,\n child ? null : childId,\n ].filter((id): id is string => id !== null);\n\n throw new DfTreeLayoutError(\n 'missing-node',\n `Tree layout connection references missing node(s): ${missingIds.join(', ')}.`,\n missingIds,\n );\n }\n\n const linkKey = `${parentId}\\u0000${childId}`;\n\n if (links.has(linkKey)) {\n return;\n }\n\n links.add(linkKey);\n\n const existingParent = parentByChild.get(childId);\n\n if (existingParent && existingParent !== parentId) {\n throw new DfTreeLayoutError(\n 'multiple-parents',\n `Tree node \"${childId}\" has more than one parent.`,\n [existingParent, parentId, childId],\n );\n }\n\n parentByChild.set(childId, parentId);\n sourceConnectorByChild.set(childId, connection.source.connectorId);\n childrenByParent.set(parentId, [\n ...(childrenByParent.get(parentId) ?? []),\n child,\n ]);\n });\n\n this.sortChildrenByOutputOrder(\n childrenByParent,\n sourceConnectorByChild,\n connectorOrders,\n );\n\n const rootCandidates = model.nodes.filter((node) => !parentByChild.has(node.id));\n const root = this.options.rootId\n ? nodes.get(this.options.rootId)\n : rootCandidates[0];\n\n if (\n !root ||\n parentByChild.has(root.id) ||\n rootCandidates.length !== 1 ||\n (this.options.rootId && rootCandidates[0]?.id !== this.options.rootId)\n ) {\n throw new DfTreeLayoutError(\n 'invalid-root',\n 'Tree layout requires exactly one root node with no incoming connections.',\n rootCandidates.map(({id}) => id),\n );\n }\n\n const visited = new Set<string>();\n const pending = [root];\n\n while (pending.length) {\n const current = pending.pop()!;\n\n if (visited.has(current.id)) {\n continue;\n }\n\n visited.add(current.id);\n pending.push(...(childrenByParent.get(current.id) ?? []));\n }\n\n if (visited.size !== model.nodes.length) {\n const disconnected = model.nodes\n .filter((node) => !visited.has(node.id))\n .map(({id}) => id);\n\n throw new DfTreeLayoutError(\n 'disconnected-graph',\n `Tree layout cannot reach node(s) from root \"${root.id}\": ${disconnected.join(', ')}.`,\n disconnected,\n );\n }\n\n return {root, children: childrenByParent};\n }\n\n private sortChildrenByOutputOrder(\n childrenByParent: Map<string, DfAnyNode[]>,\n sourceConnectorByChild: ReadonlyMap<string, string>,\n connectorOrders: DfNodeConnectorOrders,\n ): void {\n childrenByParent.forEach((children, parentId) => {\n const connectorIds = [\n ...new Set(\n children.map((child) => sourceConnectorByChild.get(child.id)!),\n ),\n ];\n\n if (connectorIds.length < 2) {\n return;\n }\n\n const nodeOrders = connectorOrders.get(parentId);\n const orderByConnector = new Map<string, number>();\n const connectorByOrder = new Map<number, string>();\n\n connectorIds.forEach((connectorId) => {\n const order = nodeOrders?.get(connectorId);\n\n if (order === undefined || order === null) {\n throw new DfTreeLayoutError(\n 'missing-output-order',\n `Tree node \"${parentId}\" has multiple connected outputs, but connector \"${connectorId}\" has no layoutOrder.`,\n [parentId],\n );\n }\n\n if (!Number.isInteger(order) || order < 0) {\n throw new DfTreeLayoutError(\n 'invalid-output-order',\n `Tree output \"${connectorId}\" on node \"${parentId}\" requires a non-negative integer layoutOrder.`,\n [parentId],\n );\n }\n\n const duplicateConnectorId = connectorByOrder.get(order);\n\n if (duplicateConnectorId) {\n throw new DfTreeLayoutError(\n 'duplicate-output-order',\n `Tree outputs \"${duplicateConnectorId}\" and \"${connectorId}\" on node \"${parentId}\" use the same layoutOrder ${order}.`,\n [parentId],\n );\n }\n\n orderByConnector.set(connectorId, order);\n connectorByOrder.set(order, connectorId);\n });\n\n children.sort(\n (left, right) =>\n orderByConnector.get(sourceConnectorByChild.get(left.id)!)! -\n orderByConnector.get(sourceConnectorByChild.get(right.id)!)!,\n );\n });\n }\n\n private resolveAnchor(root: DfAnyNode): DfPoint {\n if (\n this.options.preserveRootPosition !== false &&\n 'position' in root &&\n Number.isFinite(root.position.x) &&\n Number.isFinite(root.position.y)\n ) {\n return {...root.position};\n }\n\n return {...(this.options.origin ?? DEFAULT_ORIGIN)};\n }\n\n private orientPosition(\n direction: DfTreeLayoutDirection,\n anchor: DfPoint,\n breadth: number,\n depth: number,\n ): DfPoint {\n switch (direction) {\n case DfTreeLayoutDirection.BottomToTop:\n return {x: anchor.x + breadth, y: anchor.y - depth};\n case DfTreeLayoutDirection.RightToLeft:\n return {x: anchor.x - depth, y: anchor.y + breadth};\n case DfTreeLayoutDirection.TopToBottom:\n return {x: anchor.x + breadth, y: anchor.y + depth};\n case DfTreeLayoutDirection.LeftToRight:\n default:\n return {x: anchor.x + depth, y: anchor.y + breadth};\n }\n }\n}\n","import {InjectionToken} from '@angular/core';\n\nimport {type DfTreeLayoutOptions} from './layout.interfaces';\n\nexport const DF_TREE_LAYOUT_OPTIONS = new InjectionToken<DfTreeLayoutOptions>(\n '[DF_TREE_LAYOUT_OPTIONS]: Tree layout options',\n {factory: () => ({})},\n);\n","import {effect, inject, Injectable, signal, untracked} from '@angular/core';\nimport {\n DF_CONNECTOR_ORDER_REGISTRY,\n DF_NODE_SIZE_REGISTRY,\n type DfDataModel,\n type DfId,\n type DfNodeConnectorOrders,\n type DfNodeSize,\n NgDrawFlowStoreService,\n} from '@ng-draw-flow/core';\n\nimport {\n type DfAutoLayoutOptions,\n type DfLayoutResult,\n DfNodeSizingStrategy,\n} from './layout.interfaces';\nimport {D3TreeLayoutEngine} from './tree/d3-tree-layout.engine';\nimport {DF_TREE_LAYOUT_OPTIONS} from './tree-layout-options.token';\n\nconst EMPTY_NODE_SIZES: ReadonlyMap<DfId, DfNodeSize> = new Map();\nconst EMPTY_CONNECTOR_ORDERS: DfNodeConnectorOrders = new Map();\n\n@Injectable({providedIn: 'root'})\nexport class DfAutoLayoutService {\n private readonly store = inject(NgDrawFlowStoreService);\n private readonly treeOptions = inject(DF_TREE_LAYOUT_OPTIONS);\n private readonly nodeSizeRegistry = inject(DF_NODE_SIZE_REGISTRY);\n private readonly connectorOrderRegistry = inject(DF_CONNECTOR_ORDER_REGISTRY);\n private readonly engine = new D3TreeLayoutEngine(this.treeOptions);\n private readonly runningSignal = signal(false);\n private readonly resultSignal = signal<DfLayoutResult | null>(null);\n private readonly errorSignal = signal<Error | null>(null);\n private lastAppliedSizes: ReadonlyMap<DfId, DfNodeSize> | null = null;\n private lastAppliedConnectorOrders: DfNodeConnectorOrders | null = null;\n private pendingMeasurementAnchorNodeId?: DfId;\n private hasApplied = false;\n\n public readonly running = this.runningSignal.asReadonly();\n public readonly result = this.resultSignal.asReadonly();\n public readonly error = this.errorSignal.asReadonly();\n\n constructor() {\n const nodeSizeRegistry = this.nodeSizeRegistry;\n\n if (\n this.treeOptions.nodeSizing?.strategy === DfNodeSizingStrategy.Measured &&\n nodeSizeRegistry\n ) {\n effect(() => {\n const sizes = nodeSizeRegistry.sizes();\n\n untracked(() => this.applyMeasuredSizes(sizes));\n });\n }\n\n const connectorOrderRegistry = this.connectorOrderRegistry;\n\n if (connectorOrderRegistry) {\n effect(() => {\n const orders = connectorOrderRegistry.orders();\n\n untracked(() => this.applyConnectorOrders(orders));\n });\n }\n }\n\n public apply(options: DfAutoLayoutOptions = {}): void {\n const sourceModel = this.store.dataModel();\n const model = options.model ?? sourceModel;\n\n if (!model) {\n return;\n }\n\n const measuredSizes = this.nodeSizeRegistry?.sizes() ?? EMPTY_NODE_SIZES;\n const connectorOrders =\n this.connectorOrderRegistry?.orders() ?? EMPTY_CONNECTOR_ORDERS;\n\n this.hasApplied = true;\n this.lastAppliedConnectorOrders = connectorOrders;\n\n if (this.treeOptions.nodeSizing?.strategy === DfNodeSizingStrategy.Measured) {\n this.lastAppliedSizes = measuredSizes;\n this.pendingMeasurementAnchorNodeId = this.hasMissingSizes(\n model,\n measuredSizes,\n )\n ? options.anchorNodeId\n : undefined;\n }\n\n this.applyLayout(\n model,\n sourceModel ?? model,\n measuredSizes,\n connectorOrders,\n options.anchorNodeId,\n );\n }\n\n private applyMeasuredSizes(sizes: ReadonlyMap<DfId, DfNodeSize>): void {\n const model = this.store.dataModel();\n\n if (\n !model ||\n sizes === this.lastAppliedSizes ||\n this.hasMissingSizes(model, sizes)\n ) {\n return;\n }\n\n const anchorNodeId = this.pendingMeasurementAnchorNodeId;\n\n this.lastAppliedSizes = sizes;\n this.pendingMeasurementAnchorNodeId = undefined;\n this.applyLayout(\n model,\n model,\n sizes,\n this.connectorOrderRegistry?.orders() ?? EMPTY_CONNECTOR_ORDERS,\n anchorNodeId,\n );\n }\n\n private applyConnectorOrders(orders: DfNodeConnectorOrders): void {\n const model = this.store.dataModel();\n const measuredSizes = this.nodeSizeRegistry?.sizes() ?? EMPTY_NODE_SIZES;\n\n if (\n !this.hasApplied ||\n !model ||\n orders === this.lastAppliedConnectorOrders ||\n (this.treeOptions.nodeSizing?.strategy === DfNodeSizingStrategy.Measured &&\n this.hasMissingSizes(model, measuredSizes))\n ) {\n return;\n }\n\n this.lastAppliedConnectorOrders = orders;\n this.applyLayout(model, model, measuredSizes, orders);\n }\n\n private applyLayout(\n model: DfDataModel,\n sourceModel: DfDataModel,\n measuredSizes: ReadonlyMap<DfId, DfNodeSize>,\n connectorOrders: DfNodeConnectorOrders,\n anchorNodeId?: DfId,\n ): void {\n this.runningSignal.set(true);\n this.errorSignal.set(null);\n\n try {\n const result = this.engine.layout(model, measuredSizes, connectorOrders);\n const anchoredResult = this.anchorResult(sourceModel, result, anchorNodeId);\n\n this.store.setDataModel(anchoredResult.model);\n this.resultSignal.set(anchoredResult);\n } catch (error) {\n this.resultSignal.set(null);\n this.errorSignal.set(\n error instanceof Error ? error : new Error(String(error)),\n );\n } finally {\n this.runningSignal.set(false);\n }\n }\n\n private hasMissingSizes(\n model: DfDataModel,\n sizes: ReadonlyMap<DfId, DfNodeSize>,\n ): boolean {\n return model.nodes.some(({id}) => !sizes.has(id));\n }\n\n private anchorResult(\n sourceModel: DfLayoutResult['model'],\n result: DfLayoutResult,\n anchorNodeId?: string,\n ): DfLayoutResult {\n if (!anchorNodeId) {\n return result;\n }\n\n const sourceAnchor = sourceModel.nodes.find(({id}) => id === anchorNodeId);\n const resultAnchor = result.model.nodes.find(({id}) => id === anchorNodeId);\n\n if (\n !sourceAnchor ||\n !resultAnchor ||\n !('position' in sourceAnchor) ||\n !('position' in resultAnchor) ||\n !Number.isFinite(sourceAnchor.position.x) ||\n !Number.isFinite(sourceAnchor.position.y) ||\n !Number.isFinite(resultAnchor.position.x) ||\n !Number.isFinite(resultAnchor.position.y)\n ) {\n return result;\n }\n\n const deltaX = sourceAnchor.position.x - resultAnchor.position.x;\n const deltaY = sourceAnchor.position.y - resultAnchor.position.y;\n\n if (!deltaX && !deltaY) {\n return result;\n }\n\n return {\n ...result,\n model: {\n ...result.model,\n nodes: result.model.nodes.map((node) =>\n 'position' in node\n ? {\n ...node,\n position: {\n x: node.position.x + deltaX,\n y: node.position.y + deltaY,\n },\n }\n : node,\n ),\n },\n };\n }\n}\n","import {type Provider} from '@angular/core';\nimport {\n DF_CONNECTOR_ORDER_REGISTRY,\n DF_NODE_SIZE_REGISTRY,\n DfConnectorOrderRegistryService,\n DfNodeSizeRegistryService,\n} from '@ng-draw-flow/core';\n\nimport {DfAutoLayoutService} from './auto-layout.service';\nimport {DfNodeSizingStrategy, type DfTreeLayoutOptions} from './layout.interfaces';\nimport {DF_TREE_LAYOUT_OPTIONS} from './tree-layout-options.token';\n\nexport interface DfLayoutsOptions {\n readonly tree?: DfTreeLayoutOptions;\n}\n\nexport function provideNgDrawFlowLayouts(options: DfLayoutsOptions = {}): Provider[] {\n const providers: Provider[] = [\n DfAutoLayoutService,\n DfConnectorOrderRegistryService,\n {\n provide: DF_CONNECTOR_ORDER_REGISTRY,\n useExisting: DfConnectorOrderRegistryService,\n },\n {\n provide: DF_TREE_LAYOUT_OPTIONS,\n useValue: options.tree ?? {},\n },\n ];\n\n if (options.tree?.nodeSizing?.strategy === DfNodeSizingStrategy.Measured) {\n providers.push(DfNodeSizeRegistryService, {\n provide: DF_NODE_SIZE_REGISTRY,\n useExisting: DfNodeSizeRegistryService,\n });\n }\n\n return providers;\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["EMPTY_CONNECTOR_ORDERS"],"mappings":"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"}
|
package/index.d.ts
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { type DfAutoLayoutOptions, type DfLayoutResult } from './layout.interfaces';
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
export declare class DfAutoLayoutService {
|
|
4
|
+
private readonly store;
|
|
5
|
+
private readonly treeOptions;
|
|
6
|
+
private readonly nodeSizeRegistry;
|
|
7
|
+
private readonly connectorOrderRegistry;
|
|
8
|
+
private readonly engine;
|
|
9
|
+
private readonly runningSignal;
|
|
10
|
+
private readonly resultSignal;
|
|
11
|
+
private readonly errorSignal;
|
|
12
|
+
private lastAppliedSizes;
|
|
13
|
+
private lastAppliedConnectorOrders;
|
|
14
|
+
private pendingMeasurementAnchorNodeId?;
|
|
15
|
+
private hasApplied;
|
|
16
|
+
readonly running: import("@angular/core").Signal<boolean>;
|
|
17
|
+
readonly result: import("@angular/core").Signal<DfLayoutResult | null>;
|
|
18
|
+
readonly error: import("@angular/core").Signal<Error | null>;
|
|
19
|
+
constructor();
|
|
20
|
+
apply(options?: DfAutoLayoutOptions): void;
|
|
21
|
+
private applyMeasuredSizes;
|
|
22
|
+
private applyConnectorOrders;
|
|
23
|
+
private applyLayout;
|
|
24
|
+
private hasMissingSizes;
|
|
25
|
+
private anchorResult;
|
|
26
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<DfAutoLayoutService, never>;
|
|
27
|
+
static ɵprov: i0.ɵɵInjectableDeclaration<DfAutoLayoutService>;
|
|
28
|
+
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { type Provider } from '@angular/core';
|
|
2
|
+
import { type DfTreeLayoutOptions } from './layout.interfaces';
|
|
3
|
+
export interface DfLayoutsOptions {
|
|
4
|
+
readonly tree?: DfTreeLayoutOptions;
|
|
5
|
+
}
|
|
6
|
+
export declare function provideNgDrawFlowLayouts(options?: DfLayoutsOptions): Provider[];
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { type DfDataModel, type DfNodeSize, type DfPoint } from '@ng-draw-flow/core';
|
|
2
|
+
export interface DfLayoutDiagnostic {
|
|
3
|
+
readonly code: string;
|
|
4
|
+
readonly message: string;
|
|
5
|
+
readonly nodeIds?: readonly string[];
|
|
6
|
+
}
|
|
7
|
+
export interface DfLayoutResult {
|
|
8
|
+
readonly model: DfDataModel;
|
|
9
|
+
readonly diagnostics: readonly DfLayoutDiagnostic[];
|
|
10
|
+
}
|
|
11
|
+
export interface DfAutoLayoutOptions {
|
|
12
|
+
/** Keeps this node at its current canvas position by translating the result. */
|
|
13
|
+
readonly anchorNodeId?: string;
|
|
14
|
+
/** Layouts this model immediately instead of waiting for form-to-store synchronization. */
|
|
15
|
+
readonly model?: DfDataModel;
|
|
16
|
+
}
|
|
17
|
+
export declare enum DfTreeLayoutDirection {
|
|
18
|
+
BottomToTop = "bottom-to-top",
|
|
19
|
+
LeftToRight = "left-to-right",
|
|
20
|
+
RightToLeft = "right-to-left",
|
|
21
|
+
TopToBottom = "top-to-bottom"
|
|
22
|
+
}
|
|
23
|
+
export declare enum DfNodeSizingStrategy {
|
|
24
|
+
Fixed = "fixed",
|
|
25
|
+
Measured = "measured"
|
|
26
|
+
}
|
|
27
|
+
export interface DfFixedNodeSizingOptions {
|
|
28
|
+
readonly strategy: DfNodeSizingStrategy.Fixed;
|
|
29
|
+
readonly size: DfNodeSize;
|
|
30
|
+
}
|
|
31
|
+
export interface DfMeasuredNodeSizingOptions {
|
|
32
|
+
readonly strategy: DfNodeSizingStrategy.Measured;
|
|
33
|
+
readonly fallback: DfNodeSize;
|
|
34
|
+
}
|
|
35
|
+
export type DfNodeSizingOptions = DfFixedNodeSizingOptions | DfMeasuredNodeSizingOptions;
|
|
36
|
+
export interface DfTreeLayoutOptions {
|
|
37
|
+
readonly direction?: DfTreeLayoutDirection;
|
|
38
|
+
readonly rootId?: string;
|
|
39
|
+
readonly nodeSizing?: DfNodeSizingOptions;
|
|
40
|
+
readonly levelGap?: number;
|
|
41
|
+
readonly siblingGap?: number;
|
|
42
|
+
readonly preserveRootPosition?: boolean;
|
|
43
|
+
readonly origin?: DfPoint;
|
|
44
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { type DfDataModel, type DfId, type DfNodeConnectorOrders, type DfNodeSize } from '@ng-draw-flow/core';
|
|
2
|
+
import { type DfLayoutResult, type DfTreeLayoutOptions } from '../layout.interfaces';
|
|
3
|
+
export declare class D3TreeLayoutEngine {
|
|
4
|
+
private readonly options;
|
|
5
|
+
readonly id = "d3-tree";
|
|
6
|
+
constructor(options?: DfTreeLayoutOptions);
|
|
7
|
+
layout(model: DfDataModel, measuredSizes?: ReadonlyMap<DfId, DfNodeSize>, connectorOrders?: DfNodeConnectorOrders): DfLayoutResult;
|
|
8
|
+
private resolveNodeSize;
|
|
9
|
+
private buildGraph;
|
|
10
|
+
private sortChildrenByOutputOrder;
|
|
11
|
+
private resolveAnchor;
|
|
12
|
+
private orientPosition;
|
|
13
|
+
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export type DfTreeLayoutErrorCode = 'disconnected-graph' | 'duplicate-node' | 'duplicate-output-order' | 'invalid-output-order' | 'invalid-root' | 'missing-node' | 'missing-output-order' | 'multiple-parents';
|
|
2
|
+
export declare class DfTreeLayoutError extends Error {
|
|
3
|
+
readonly code: DfTreeLayoutErrorCode;
|
|
4
|
+
readonly nodeIds: readonly string[];
|
|
5
|
+
constructor(code: DfTreeLayoutErrorCode, message: string, nodeIds?: readonly string[]);
|
|
6
|
+
}
|
package/package.json
ADDED
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@ng-draw-flow/layouts",
|
|
3
|
+
"version": "1.2.1",
|
|
4
|
+
"description": "Strict-tree automatic layouts for @ng-draw-flow/core",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"angular",
|
|
7
|
+
"graph",
|
|
8
|
+
"layout",
|
|
9
|
+
"tree",
|
|
10
|
+
"d3"
|
|
11
|
+
],
|
|
12
|
+
"homepage": "https://github.com/taiga-family/ng-draw-flow",
|
|
13
|
+
"bugs": "https://github.com/taiga-family/ng-draw-flow/issues",
|
|
14
|
+
"repository": {
|
|
15
|
+
"type": "git",
|
|
16
|
+
"url": "https://github.com/taiga-family/ng-draw-flow"
|
|
17
|
+
},
|
|
18
|
+
"license": "Apache-2.0",
|
|
19
|
+
"author": {
|
|
20
|
+
"name": "Airat Khairullin",
|
|
21
|
+
"email": "a1rat91@yandex.ru",
|
|
22
|
+
"url": "https://t.me/a1rat91"
|
|
23
|
+
},
|
|
24
|
+
"dependencies": {
|
|
25
|
+
"d3-hierarchy": "3.1.2",
|
|
26
|
+
"tslib": "2.8.1"
|
|
27
|
+
},
|
|
28
|
+
"peerDependencies": {
|
|
29
|
+
"@angular/core": ">=19.0.0",
|
|
30
|
+
"@ng-draw-flow/core": "^1.2.1"
|
|
31
|
+
},
|
|
32
|
+
"publishConfig": {
|
|
33
|
+
"access": "public"
|
|
34
|
+
},
|
|
35
|
+
"module": "fesm2022/ng-draw-flow-layouts.mjs",
|
|
36
|
+
"typings": "index.d.ts",
|
|
37
|
+
"exports": {
|
|
38
|
+
"./package.json": {
|
|
39
|
+
"default": "./package.json"
|
|
40
|
+
},
|
|
41
|
+
".": {
|
|
42
|
+
"types": "./index.d.ts",
|
|
43
|
+
"default": "./fesm2022/ng-draw-flow-layouts.mjs"
|
|
44
|
+
}
|
|
45
|
+
},
|
|
46
|
+
"sideEffects": false
|
|
47
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"fileNames":["../../node_modules/typescript/lib/lib.es5.d.ts","../../node_modules/typescript/lib/lib.es2015.d.ts","../../node_modules/typescript/lib/lib.es2016.d.ts","../../node_modules/typescript/lib/lib.es2017.d.ts","../../node_modules/typescript/lib/lib.es2018.d.ts","../../node_modules/typescript/lib/lib.dom.d.ts","../../node_modules/typescript/lib/lib.es2015.core.d.ts","../../node_modules/typescript/lib/lib.es2015.collection.d.ts","../../node_modules/typescript/lib/lib.es2015.generator.d.ts","../../node_modules/typescript/lib/lib.es2015.iterable.d.ts","../../node_modules/typescript/lib/lib.es2015.promise.d.ts","../../node_modules/typescript/lib/lib.es2015.proxy.d.ts","../../node_modules/typescript/lib/lib.es2015.reflect.d.ts","../../node_modules/typescript/lib/lib.es2015.symbol.d.ts","../../node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../../node_modules/typescript/lib/lib.es2016.array.include.d.ts","../../node_modules/typescript/lib/lib.es2016.intl.d.ts","../../node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts","../../node_modules/typescript/lib/lib.es2017.date.d.ts","../../node_modules/typescript/lib/lib.es2017.object.d.ts","../../node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../../node_modules/typescript/lib/lib.es2017.string.d.ts","../../node_modules/typescript/lib/lib.es2017.intl.d.ts","../../node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../../node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../../node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../../node_modules/typescript/lib/lib.es2018.intl.d.ts","../../node_modules/typescript/lib/lib.es2018.promise.d.ts","../../node_modules/typescript/lib/lib.es2018.regexp.d.ts","../../node_modules/typescript/lib/lib.decorators.d.ts","../../node_modules/typescript/lib/lib.decorators.legacy.d.ts","../../node_modules/tslib/tslib.d.ts","../../projects/layouts/src/index.ngtypecheck.ts","../../projects/layouts/src/lib/auto-layout.service.ngtypecheck.ts","../../node_modules/@angular/core/weak_ref.d-DWHPG08n.d.ts","../../node_modules/@angular/core/event_dispatcher.d-K56StcHr.d.ts","../../node_modules/rxjs/dist/types/internal/Subscription.d.ts","../../node_modules/rxjs/dist/types/internal/Subscriber.d.ts","../../node_modules/rxjs/dist/types/internal/Operator.d.ts","../../node_modules/rxjs/dist/types/internal/Observable.d.ts","../../node_modules/rxjs/dist/types/internal/types.d.ts","../../node_modules/rxjs/dist/types/internal/operators/audit.d.ts","../../node_modules/rxjs/dist/types/internal/operators/auditTime.d.ts","../../node_modules/rxjs/dist/types/internal/operators/buffer.d.ts","../../node_modules/rxjs/dist/types/internal/operators/bufferCount.d.ts","../../node_modules/rxjs/dist/types/internal/operators/bufferTime.d.ts","../../node_modules/rxjs/dist/types/internal/operators/bufferToggle.d.ts","../../node_modules/rxjs/dist/types/internal/operators/bufferWhen.d.ts","../../node_modules/rxjs/dist/types/internal/operators/catchError.d.ts","../../node_modules/rxjs/dist/types/internal/operators/combineLatestAll.d.ts","../../node_modules/rxjs/dist/types/internal/operators/combineAll.d.ts","../../node_modules/rxjs/dist/types/internal/operators/combineLatest.d.ts","../../node_modules/rxjs/dist/types/internal/operators/combineLatestWith.d.ts","../../node_modules/rxjs/dist/types/internal/operators/concat.d.ts","../../node_modules/rxjs/dist/types/internal/operators/concatAll.d.ts","../../node_modules/rxjs/dist/types/internal/operators/concatMap.d.ts","../../node_modules/rxjs/dist/types/internal/operators/concatMapTo.d.ts","../../node_modules/rxjs/dist/types/internal/operators/concatWith.d.ts","../../node_modules/rxjs/dist/types/internal/operators/connect.d.ts","../../node_modules/rxjs/dist/types/internal/operators/count.d.ts","../../node_modules/rxjs/dist/types/internal/operators/debounce.d.ts","../../node_modules/rxjs/dist/types/internal/operators/debounceTime.d.ts","../../node_modules/rxjs/dist/types/internal/operators/defaultIfEmpty.d.ts","../../node_modules/rxjs/dist/types/internal/operators/delay.d.ts","../../node_modules/rxjs/dist/types/internal/operators/delayWhen.d.ts","../../node_modules/rxjs/dist/types/internal/operators/dematerialize.d.ts","../../node_modules/rxjs/dist/types/internal/operators/distinct.d.ts","../../node_modules/rxjs/dist/types/internal/operators/distinctUntilChanged.d.ts","../../node_modules/rxjs/dist/types/internal/operators/distinctUntilKeyChanged.d.ts","../../node_modules/rxjs/dist/types/internal/operators/elementAt.d.ts","../../node_modules/rxjs/dist/types/internal/operators/endWith.d.ts","../../node_modules/rxjs/dist/types/internal/operators/every.d.ts","../../node_modules/rxjs/dist/types/internal/operators/exhaustAll.d.ts","../../node_modules/rxjs/dist/types/internal/operators/exhaust.d.ts","../../node_modules/rxjs/dist/types/internal/operators/exhaustMap.d.ts","../../node_modules/rxjs/dist/types/internal/operators/expand.d.ts","../../node_modules/rxjs/dist/types/internal/operators/filter.d.ts","../../node_modules/rxjs/dist/types/internal/operators/finalize.d.ts","../../node_modules/rxjs/dist/types/internal/operators/find.d.ts","../../node_modules/rxjs/dist/types/internal/operators/findIndex.d.ts","../../node_modules/rxjs/dist/types/internal/operators/first.d.ts","../../node_modules/rxjs/dist/types/internal/Subject.d.ts","../../node_modules/rxjs/dist/types/internal/operators/groupBy.d.ts","../../node_modules/rxjs/dist/types/internal/operators/ignoreElements.d.ts","../../node_modules/rxjs/dist/types/internal/operators/isEmpty.d.ts","../../node_modules/rxjs/dist/types/internal/operators/last.d.ts","../../node_modules/rxjs/dist/types/internal/operators/map.d.ts","../../node_modules/rxjs/dist/types/internal/operators/mapTo.d.ts","../../node_modules/rxjs/dist/types/internal/Notification.d.ts","../../node_modules/rxjs/dist/types/internal/operators/materialize.d.ts","../../node_modules/rxjs/dist/types/internal/operators/max.d.ts","../../node_modules/rxjs/dist/types/internal/operators/merge.d.ts","../../node_modules/rxjs/dist/types/internal/operators/mergeAll.d.ts","../../node_modules/rxjs/dist/types/internal/operators/mergeMap.d.ts","../../node_modules/rxjs/dist/types/internal/operators/flatMap.d.ts","../../node_modules/rxjs/dist/types/internal/operators/mergeMapTo.d.ts","../../node_modules/rxjs/dist/types/internal/operators/mergeScan.d.ts","../../node_modules/rxjs/dist/types/internal/operators/mergeWith.d.ts","../../node_modules/rxjs/dist/types/internal/operators/min.d.ts","../../node_modules/rxjs/dist/types/internal/observable/ConnectableObservable.d.ts","../../node_modules/rxjs/dist/types/internal/operators/multicast.d.ts","../../node_modules/rxjs/dist/types/internal/operators/observeOn.d.ts","../../node_modules/rxjs/dist/types/internal/operators/onErrorResumeNextWith.d.ts","../../node_modules/rxjs/dist/types/internal/operators/pairwise.d.ts","../../node_modules/rxjs/dist/types/internal/operators/partition.d.ts","../../node_modules/rxjs/dist/types/internal/operators/pluck.d.ts","../../node_modules/rxjs/dist/types/internal/operators/publish.d.ts","../../node_modules/rxjs/dist/types/internal/operators/publishBehavior.d.ts","../../node_modules/rxjs/dist/types/internal/operators/publishLast.d.ts","../../node_modules/rxjs/dist/types/internal/operators/publishReplay.d.ts","../../node_modules/rxjs/dist/types/internal/operators/race.d.ts","../../node_modules/rxjs/dist/types/internal/operators/raceWith.d.ts","../../node_modules/rxjs/dist/types/internal/operators/reduce.d.ts","../../node_modules/rxjs/dist/types/internal/operators/repeat.d.ts","../../node_modules/rxjs/dist/types/internal/operators/repeatWhen.d.ts","../../node_modules/rxjs/dist/types/internal/operators/retry.d.ts","../../node_modules/rxjs/dist/types/internal/operators/retryWhen.d.ts","../../node_modules/rxjs/dist/types/internal/operators/refCount.d.ts","../../node_modules/rxjs/dist/types/internal/operators/sample.d.ts","../../node_modules/rxjs/dist/types/internal/operators/sampleTime.d.ts","../../node_modules/rxjs/dist/types/internal/operators/scan.d.ts","../../node_modules/rxjs/dist/types/internal/operators/sequenceEqual.d.ts","../../node_modules/rxjs/dist/types/internal/operators/share.d.ts","../../node_modules/rxjs/dist/types/internal/operators/shareReplay.d.ts","../../node_modules/rxjs/dist/types/internal/operators/single.d.ts","../../node_modules/rxjs/dist/types/internal/operators/skip.d.ts","../../node_modules/rxjs/dist/types/internal/operators/skipLast.d.ts","../../node_modules/rxjs/dist/types/internal/operators/skipUntil.d.ts","../../node_modules/rxjs/dist/types/internal/operators/skipWhile.d.ts","../../node_modules/rxjs/dist/types/internal/operators/startWith.d.ts","../../node_modules/rxjs/dist/types/internal/operators/subscribeOn.d.ts","../../node_modules/rxjs/dist/types/internal/operators/switchAll.d.ts","../../node_modules/rxjs/dist/types/internal/operators/switchMap.d.ts","../../node_modules/rxjs/dist/types/internal/operators/switchMapTo.d.ts","../../node_modules/rxjs/dist/types/internal/operators/switchScan.d.ts","../../node_modules/rxjs/dist/types/internal/operators/take.d.ts","../../node_modules/rxjs/dist/types/internal/operators/takeLast.d.ts","../../node_modules/rxjs/dist/types/internal/operators/takeUntil.d.ts","../../node_modules/rxjs/dist/types/internal/operators/takeWhile.d.ts","../../node_modules/rxjs/dist/types/internal/operators/tap.d.ts","../../node_modules/rxjs/dist/types/internal/operators/throttle.d.ts","../../node_modules/rxjs/dist/types/internal/operators/throttleTime.d.ts","../../node_modules/rxjs/dist/types/internal/operators/throwIfEmpty.d.ts","../../node_modules/rxjs/dist/types/internal/operators/timeInterval.d.ts","../../node_modules/rxjs/dist/types/internal/operators/timeout.d.ts","../../node_modules/rxjs/dist/types/internal/operators/timeoutWith.d.ts","../../node_modules/rxjs/dist/types/internal/operators/timestamp.d.ts","../../node_modules/rxjs/dist/types/internal/operators/toArray.d.ts","../../node_modules/rxjs/dist/types/internal/operators/window.d.ts","../../node_modules/rxjs/dist/types/internal/operators/windowCount.d.ts","../../node_modules/rxjs/dist/types/internal/operators/windowTime.d.ts","../../node_modules/rxjs/dist/types/internal/operators/windowToggle.d.ts","../../node_modules/rxjs/dist/types/internal/operators/windowWhen.d.ts","../../node_modules/rxjs/dist/types/internal/operators/withLatestFrom.d.ts","../../node_modules/rxjs/dist/types/internal/operators/zip.d.ts","../../node_modules/rxjs/dist/types/internal/operators/zipAll.d.ts","../../node_modules/rxjs/dist/types/internal/operators/zipWith.d.ts","../../node_modules/rxjs/dist/types/operators/index.d.ts","../../node_modules/rxjs/dist/types/internal/scheduler/Action.d.ts","../../node_modules/rxjs/dist/types/internal/Scheduler.d.ts","../../node_modules/rxjs/dist/types/internal/testing/TestMessage.d.ts","../../node_modules/rxjs/dist/types/internal/testing/SubscriptionLog.d.ts","../../node_modules/rxjs/dist/types/internal/testing/SubscriptionLoggable.d.ts","../../node_modules/rxjs/dist/types/internal/testing/ColdObservable.d.ts","../../node_modules/rxjs/dist/types/internal/testing/HotObservable.d.ts","../../node_modules/rxjs/dist/types/internal/scheduler/AsyncScheduler.d.ts","../../node_modules/rxjs/dist/types/internal/scheduler/timerHandle.d.ts","../../node_modules/rxjs/dist/types/internal/scheduler/AsyncAction.d.ts","../../node_modules/rxjs/dist/types/internal/scheduler/VirtualTimeScheduler.d.ts","../../node_modules/rxjs/dist/types/internal/testing/TestScheduler.d.ts","../../node_modules/rxjs/dist/types/testing/index.d.ts","../../node_modules/rxjs/dist/types/internal/symbol/observable.d.ts","../../node_modules/rxjs/dist/types/internal/observable/dom/animationFrames.d.ts","../../node_modules/rxjs/dist/types/internal/BehaviorSubject.d.ts","../../node_modules/rxjs/dist/types/internal/ReplaySubject.d.ts","../../node_modules/rxjs/dist/types/internal/AsyncSubject.d.ts","../../node_modules/rxjs/dist/types/internal/scheduler/AsapScheduler.d.ts","../../node_modules/rxjs/dist/types/internal/scheduler/asap.d.ts","../../node_modules/rxjs/dist/types/internal/scheduler/async.d.ts","../../node_modules/rxjs/dist/types/internal/scheduler/QueueScheduler.d.ts","../../node_modules/rxjs/dist/types/internal/scheduler/queue.d.ts","../../node_modules/rxjs/dist/types/internal/scheduler/AnimationFrameScheduler.d.ts","../../node_modules/rxjs/dist/types/internal/scheduler/animationFrame.d.ts","../../node_modules/rxjs/dist/types/internal/util/identity.d.ts","../../node_modules/rxjs/dist/types/internal/util/pipe.d.ts","../../node_modules/rxjs/dist/types/internal/util/noop.d.ts","../../node_modules/rxjs/dist/types/internal/util/isObservable.d.ts","../../node_modules/rxjs/dist/types/internal/lastValueFrom.d.ts","../../node_modules/rxjs/dist/types/internal/firstValueFrom.d.ts","../../node_modules/rxjs/dist/types/internal/util/ArgumentOutOfRangeError.d.ts","../../node_modules/rxjs/dist/types/internal/util/EmptyError.d.ts","../../node_modules/rxjs/dist/types/internal/util/NotFoundError.d.ts","../../node_modules/rxjs/dist/types/internal/util/ObjectUnsubscribedError.d.ts","../../node_modules/rxjs/dist/types/internal/util/SequenceError.d.ts","../../node_modules/rxjs/dist/types/internal/util/UnsubscriptionError.d.ts","../../node_modules/rxjs/dist/types/internal/observable/bindCallback.d.ts","../../node_modules/rxjs/dist/types/internal/observable/bindNodeCallback.d.ts","../../node_modules/rxjs/dist/types/internal/AnyCatcher.d.ts","../../node_modules/rxjs/dist/types/internal/observable/combineLatest.d.ts","../../node_modules/rxjs/dist/types/internal/observable/concat.d.ts","../../node_modules/rxjs/dist/types/internal/observable/connectable.d.ts","../../node_modules/rxjs/dist/types/internal/observable/defer.d.ts","../../node_modules/rxjs/dist/types/internal/observable/empty.d.ts","../../node_modules/rxjs/dist/types/internal/observable/forkJoin.d.ts","../../node_modules/rxjs/dist/types/internal/observable/from.d.ts","../../node_modules/rxjs/dist/types/internal/observable/fromEvent.d.ts","../../node_modules/rxjs/dist/types/internal/observable/fromEventPattern.d.ts","../../node_modules/rxjs/dist/types/internal/observable/generate.d.ts","../../node_modules/rxjs/dist/types/internal/observable/iif.d.ts","../../node_modules/rxjs/dist/types/internal/observable/interval.d.ts","../../node_modules/rxjs/dist/types/internal/observable/merge.d.ts","../../node_modules/rxjs/dist/types/internal/observable/never.d.ts","../../node_modules/rxjs/dist/types/internal/observable/of.d.ts","../../node_modules/rxjs/dist/types/internal/observable/onErrorResumeNext.d.ts","../../node_modules/rxjs/dist/types/internal/observable/pairs.d.ts","../../node_modules/rxjs/dist/types/internal/observable/partition.d.ts","../../node_modules/rxjs/dist/types/internal/observable/race.d.ts","../../node_modules/rxjs/dist/types/internal/observable/range.d.ts","../../node_modules/rxjs/dist/types/internal/observable/throwError.d.ts","../../node_modules/rxjs/dist/types/internal/observable/timer.d.ts","../../node_modules/rxjs/dist/types/internal/observable/using.d.ts","../../node_modules/rxjs/dist/types/internal/observable/zip.d.ts","../../node_modules/rxjs/dist/types/internal/scheduled/scheduled.d.ts","../../node_modules/rxjs/dist/types/internal/config.d.ts","../../node_modules/rxjs/dist/types/index.d.ts","../../node_modules/@angular/core/primitives/di/index.d.ts","../../node_modules/@angular/core/navigation_types.d-fAxd92YV.d.ts","../../node_modules/@angular/core/index.d.ts","../../node_modules/@taiga-ui/polymorpheus/classes/component.d.ts","../../node_modules/@taiga-ui/polymorpheus/classes/context.d.ts","../../node_modules/@taiga-ui/polymorpheus/directives/template.d.ts","../../node_modules/@angular/common/platform_location.d-Lbv6Ueec.d.ts","../../node_modules/@angular/common/common_module.d-NEF7UaHr.d.ts","../../node_modules/@angular/common/xhr.d-D_1kTQR5.d.ts","../../node_modules/@angular/common/index.d.ts","../../node_modules/@angular/platform-browser/browser.d-CXj5swf3.d.ts","../../node_modules/@angular/common/module.d-CnjH8Dlt.d.ts","../../node_modules/@angular/common/http/index.d.ts","../../node_modules/@angular/platform-browser/index.d.ts","../../node_modules/@taiga-ui/polymorpheus/types/primitive.d.ts","../../node_modules/@taiga-ui/polymorpheus/types/handler.d.ts","../../node_modules/@taiga-ui/polymorpheus/types/content.d.ts","../../node_modules/@taiga-ui/polymorpheus/directives/outlet.d.ts","../../node_modules/@taiga-ui/polymorpheus/tokens/context.d.ts","../../node_modules/@taiga-ui/polymorpheus/index.d.ts","../ng-draw-flow/lib/ng-draw-flow-node.base.d.ts","../ng-draw-flow/lib/ng-draw-flow.interfaces.d.ts","../ng-draw-flow/lib/components/connections/connections.service.d.ts","../ng-draw-flow/lib/components/connectors/base-connector.d.ts","../ng-draw-flow/lib/components/connectors/input.component.d.ts","../ng-draw-flow/lib/components/connectors/output.component.d.ts","../ng-draw-flow/lib/components/connectors/index.d.ts","../ng-draw-flow/lib/components/pan-zoom/pan-zoom.options.d.ts","../ng-draw-flow/lib/directives/errors/errors.directive.d.ts","../../node_modules/@angular/forms/index.d.ts","../ng-draw-flow/lib/directives/drag-drop/drag-drop.enum.d.ts","../ng-draw-flow/lib/directives/drag-drop/drag-drop.interface.d.ts","../ng-draw-flow/lib/directives/drag-drop/drag-drop.directive.d.ts","../ng-draw-flow/lib/directives/drag-drop/drag-drop.service.d.ts","../ng-draw-flow/lib/directives/drag-drop/index.d.ts","../ng-draw-flow/lib/components/pan-zoom/pan-zoom.controller.service.d.ts","../../node_modules/@ng-web-apis/resize-observer/index.d.ts","../ng-draw-flow/lib/components/pan-zoom/pan-zoom.component.d.ts","../ng-draw-flow/lib/ng-draw-flow.component.d.ts","../ng-draw-flow/lib/ng-draw-flow.configs.d.ts","../ng-draw-flow/lib/ng-draw-flow.token.d.ts","../ng-draw-flow/lib/services/connector-order-registry.service.d.ts","../ng-draw-flow/lib/services/ng-draw-flow-store.service.d.ts","../ng-draw-flow/lib/services/node-size-registry.service.d.ts","../ng-draw-flow/lib/validators/cycle-detection/cycle-detection.validator.d.ts","../ng-draw-flow/lib/validators/isolated-nodes/isolated-nodes.validator.d.ts","../ng-draw-flow/lib/validators/index.d.ts","../ng-draw-flow/index.d.ts","../../projects/layouts/src/lib/layout.interfaces.ngtypecheck.ts","../../projects/layouts/src/lib/layout.interfaces.ts","../../projects/layouts/src/lib/tree/d3-tree-layout.engine.ngtypecheck.ts","../../node_modules/@types/d3-hierarchy/index.d.ts","../../projects/layouts/src/lib/tree/tree-layout.error.ngtypecheck.ts","../../projects/layouts/src/lib/tree/tree-layout.error.ts","../../projects/layouts/src/lib/tree/d3-tree-layout.engine.ts","../../projects/layouts/src/lib/tree-layout-options.token.ngtypecheck.ts","../../projects/layouts/src/lib/tree-layout-options.token.ts","../../projects/layouts/src/lib/auto-layout.service.ts","../../projects/layouts/src/lib/layout.configs.ngtypecheck.ts","../../projects/layouts/src/lib/layout.configs.ts","../../projects/layouts/src/index.ts","../../projects/layouts/src/ng-draw-flow-layouts.ts"],"fileIdsList":[[246,247,252,253,254,264,265,266,267,268,269,272],[225,228,247],[228,245,247,248],[250,251],[228,247,249],[228,247,261,262],[225,228,247,260],[228],[228,257],[256],[225,228,257],[256,257,258,259],[228,252],[228,247,254,255,262,263],[228,247],[228,245,246],[225,228,247,264],[255],[270,271],[225,228,232],[225,228,234,237],[225,228,232,233,234],[35,36,225,226,227,228],[225,228],[228,235],[228,235,236,238],[228,230,240,242],[229,231,240,241,242,243,244],[228,229,231,240,241],[240],[239],[37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,53,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,93,94,95,96,97,98,99,100,101,102,103,104,106,107,108,109,110,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,156,157,158,160,169,171,172,173,174,175,176,178,179,181,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224],[82],[40,41],[37,38,39,41],[38,41],[41,82],[37,41,159],[39,40,41],[37,41],[41],[40],[37,40,82],[38,40,41,198],[40,41,198],[40,206],[38,40,41],[50],[73],[94],[40,41,82],[41,89],[40,41,82,100],[40,41,100],[41,141],[37,41,160],[166,168],[37,41,159,166,167],[159,160,168],[166],[37,41,166,167,168],[182],[177],[180],[38,40,160,161,162,163],[82,160,161,162,163],[160,162],[40,161,162,164,165,169],[37,40],[41,184],[42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,83,84,85,86,87,88,90,91,92,93,94,95,96,97,98,99,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157],[170],[32],[32,33,275,279,283,285],[32,34,228,273,275,280,282],[32,228,273,275,282,283,284],[32,273,274],[32,228,275,281],[32,273,275,276,277,279],[32,278],[32,286]],"fileInfos":[{"version":"69684132aeb9b5642cbcd9e22dff7818ff0ee1aa831728af0ecf97d3364d5546","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","impliedFormat":1},{"version":"e44bb8bbac7f10ecc786703fe0a6a4b952189f908707980ba8f3c8975a760962","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"092c2bfe125ce69dbb1223c85d68d4d2397d7d8411867b5cc03cec902c233763","affectsGlobalScope":true,"impliedFormat":1},{"version":"c57796738e7f83dbc4b8e65132f11a377649c00dd3eee333f672b8f0a6bea671","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true,"impliedFormat":1},{"version":"515d0b7b9bea2e31ea4ec968e9edd2c39d3eebf4a2d5cbd04e88639819ae3b71","affectsGlobalScope":true,"impliedFormat":1},{"version":"0559b1f683ac7505ae451f9a96ce4c3c92bdc71411651ca6ddb0e88baaaad6a3","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true,"impliedFormat":1},{"version":"936e80ad36a2ee83fc3caf008e7c4c5afe45b3cf3d5c24408f039c1d47bdc1df","affectsGlobalScope":true,"impliedFormat":1},{"version":"d15bea3d62cbbdb9797079416b8ac375ae99162a7fba5de2c6c505446486ac0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"68d18b664c9d32a7336a70235958b8997ebc1c3b8505f4f1ae2b7e7753b87618","affectsGlobalScope":true,"impliedFormat":1},{"version":"eb3d66c8327153d8fa7dd03f9c58d351107fe824c79e9b56b462935176cdf12a","affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true,"impliedFormat":1},{"version":"69ab18c3b76cd9b1be3d188eaf8bba06112ebbe2f47f6c322b5105a6fbc45a2e","affectsGlobalScope":true,"impliedFormat":1},{"version":"fef8cfad2e2dc5f5b3d97a6f4f2e92848eb1b88e897bb7318cef0e2820bceaab","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"954296b30da6d508a104a3a0b5d96b76495c709785c1d11610908e63481ee667","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac9538681b19688c8eae65811b329d3744af679e0bdfa5d842d0e32524c73e1c","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a969edff4bd52585473d24995c5ef223f6652d6ef46193309b3921d65dd4376","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e7f8264d0fb4c5339605a15daadb037bf238c10b654bb3eee14208f860a32ea","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},{"version":"a6a5253138c5432c68a1510c70fe78a644fe2e632111ba778e1978010d6edfec","impliedFormat":1},{"version":"ddd578018a259d1c494c834bdd8707769d07d1eb64f87f5217560cd2181b9e93","signature":"da14a67372982ca6e605fea114900b492b3316618581634e0ce72afbcb09baca"},{"version":"ddd578018a259d1c494c834bdd8707769d07d1eb64f87f5217560cd2181b9e93","signature":"da14a67372982ca6e605fea114900b492b3316618581634e0ce72afbcb09baca"},{"version":"565d472c6754314ec9159ad141aa890772cc05050b7a20ed32d1f1e3b848ee5e","impliedFormat":99},{"version":"b31f1d9477503052434df5fd8c3a41f348ff69e5b9d7d1c327ca3c4ad9f1dbbf","affectsGlobalScope":true,"impliedFormat":99},{"version":"073ca26c96184db9941b5ec0ddea6981c9b816156d9095747809e524fdd90e35","impliedFormat":1},{"version":"e41d17a2ec23306d953cda34e573ed62954ca6ea9b8c8b74e013d07a6886ce47","impliedFormat":1},{"version":"241bd4add06f06f0699dcd58f3b334718d85e3045d9e9d4fa556f11f4d1569c1","impliedFormat":1},{"version":"2ae3787e1498b20aad1b9c2ee9ea517ec30e89b70d242d8e3e52d1e091039695","impliedFormat":1},{"version":"c7c72c4cffb1bc83617eefed71ed68cc89df73cab9e19507ccdecb3e72b4967e","affectsGlobalScope":true,"impliedFormat":1},{"version":"b8bff8a60af0173430b18d9c3e5c443eaa3c515617210c0c7b3d2e1743c19ecb","impliedFormat":1},{"version":"38b38db08e7121828294dec10957a7a9ff263e33e2a904b346516d4a4acca482","impliedFormat":1},{"version":"a76ebdf2579e68e4cfe618269c47e5a12a4e045c2805ed7f7ab37af8daa6b091","impliedFormat":1},{"version":"8a2aaea564939c22be05d665cc955996721bad6d43148f8fa21ae8f64afecd37","impliedFormat":1},{"version":"e59d36b7b6e8ba2dd36d032a5f5c279d2460968c8b4e691ca384f118fb09b52a","impliedFormat":1},{"version":"e96885c0684c9042ec72a9a43ef977f6b4b4a2728f4b9e737edcbaa0c74e5bf6","impliedFormat":1},{"version":"95950a187596e206d32d5d9c7b932901088c65ed8f9040e614aa8e321e0225ef","impliedFormat":1},{"version":"89e061244da3fc21b7330f4bd32f47c1813dd4d7f1dc3d0883d88943f035b993","impliedFormat":1},{"version":"e46558c2e04d06207b080138678020448e7fc201f3d69c2601b0d1456105f29a","impliedFormat":1},{"version":"71549375db52b1163411dba383b5f4618bdf35dc57fa327a1c7d135cf9bf67d1","impliedFormat":1},{"version":"7e6b2d61d6215a4e82ea75bc31a80ebb8ad0c2b37a60c10c70dd671e8d9d6d5d","impliedFormat":1},{"version":"78bea05df2896083cca28ed75784dde46d4b194984e8fc559123b56873580a23","impliedFormat":1},{"version":"5dd04ced37b7ea09f29d277db11f160df7fd73ba8b9dba86cb25552e0653a637","impliedFormat":1},{"version":"f74b81712e06605677ae1f061600201c425430151f95b5ef4d04387ad7617e6a","impliedFormat":1},{"version":"9a72847fcf4ac937e352d40810f7b7aec7422d9178451148296cf1aa19467620","impliedFormat":1},{"version":"3ae18f60e0b96fa1e025059b7d25b3247ba4dcb5f4372f6d6e67ce2adac74eac","impliedFormat":1},{"version":"2b9260f44a2e071450ae82c110f5dc8f330c9e5c3e85567ed97248330f2bf639","impliedFormat":1},{"version":"4f196e13684186bda6f5115fc4677a87cf84a0c9c4fc17b8f51e0984f3697b6d","impliedFormat":1},{"version":"61419f2c5822b28c1ea483258437c1faab87d00c6f84481aa22afb3380d8e9a4","impliedFormat":1},{"version":"64479aee03812264e421c0bf5104a953ca7b02740ba80090aead1330d0effe91","impliedFormat":1},{"version":"0521108c9f8ddb17654a0a54dae6ba9667c99eddccfd6af5748113e022d1c37a","impliedFormat":1},{"version":"c5570e504be103e255d80c60b56c367bf45d502ca52ee35c55dec882f6563b5c","impliedFormat":1},{"version":"ee764e6e9a7f2b987cc1a2c0a9afd7a8f4d5ebc4fdb66ad557a7f14a8c2bd320","impliedFormat":1},{"version":"0520b5093712c10c6ef23b5fea2f833bf5481771977112500045e5ea7e8e2b69","impliedFormat":1},{"version":"5c3cf26654cf762ac4d7fd7b83f09acfe08eef88d2d6983b9a5a423cb4004ca3","impliedFormat":1},{"version":"e60fa19cf7911c1623b891155d7eb6b7e844e9afdf5738e3b46f3b687730a2bd","impliedFormat":1},{"version":"b1fd72ff2bb0ba91bb588f3e5329f8fc884eb859794f1c4657a2bfa122ae54d0","impliedFormat":1},{"version":"6cf42a4f3cfec648545925d43afaa8bb364ac10a839ffed88249da109361b275","impliedFormat":1},{"version":"d7058e75920120b142a9d57be25562a3cd9a936269fd52908505f530105f2ec4","impliedFormat":1},{"version":"6df52b70d7f7702202f672541a5f4a424d478ee5be51a9d37b8ccbe1dbf3c0f2","impliedFormat":1},{"version":"0ca7f997e9a4d8985e842b7c882e521b6f63233c4086e9fe79dd7a9dc4742b5e","impliedFormat":1},{"version":"91046b5c6b55d3b194c81fd4df52f687736fad3095e9d103ead92bb64dc160ee","impliedFormat":1},{"version":"db5704fdad56c74dfc5941283c1182ed471bd17598209d3ac4a49faa72e43cfc","impliedFormat":1},{"version":"758e8e89559b02b81bc0f8fd395b17ad5aff75490c862cbe369bb1a3d1577c40","impliedFormat":1},{"version":"2ee64342c077b1868f1834c063f575063051edd6e2964257d34aad032d6b657c","impliedFormat":1},{"version":"6f6b4b3d670b6a5f0e24ea001c1b3d36453c539195e875687950a178f1730fa7","impliedFormat":1},{"version":"a472a1d3f25ce13a1d44911cd3983956ac040ce2018e155435ea34afb25f864c","impliedFormat":1},{"version":"b48b83a86dd9cfe36f8776b3ff52fcd45b0e043c0538dc4a4b149ba45fe367b9","impliedFormat":1},{"version":"792de5c062444bd2ee0413fb766e57e03cce7cdaebbfc52fc0c7c8e95069c96b","impliedFormat":1},{"version":"a79e3e81094c7a04a885bad9b049c519aace53300fb8a0fe4f26727cb5a746ce","impliedFormat":1},{"version":"93181bac0d90db185bb730c95214f6118ae997fe836a98a49664147fbcaf1988","impliedFormat":1},{"version":"8a4e89564d8ea66ad87ee3762e07540f9f0656a62043c910d819b4746fc429c5","impliedFormat":1},{"version":"b9011d99942889a0f95e120d06b698c628b0b6fdc3e6b7ecb459b97ed7d5bcc6","impliedFormat":1},{"version":"4d639cbbcc2f8f9ce6d55d5d503830d6c2556251df332dc5255d75af53c8a0e7","impliedFormat":1},{"version":"cdb48277f600ab5f429ecf1c5ea046683bc6b9f73f3deab9a100adac4b34969c","impliedFormat":1},{"version":"75be84956a29040a1afbe864c0a7a369dfdb739380072484eff153905ef867ee","impliedFormat":1},{"version":"b06b4adc2ae03331a92abd1b19af8eb91ec2bf8541747ee355887a167d53145e","impliedFormat":1},{"version":"c54166a85bd60f86d1ebb90ce0117c0ecb850b8a33b366691629fdf26f1bbbd8","impliedFormat":1},{"version":"0d417c15c5c635384d5f1819cc253a540fe786cc3fda32f6a2ae266671506a21","impliedFormat":1},{"version":"80f23f1d60fbed356f726b3b26f9d348dddbb34027926d10d59fad961e70a730","impliedFormat":1},{"version":"cb59317243a11379a101eb2f27b9df1022674c3df1df0727360a0a3f963f523b","impliedFormat":1},{"version":"cc20bb2227dd5de0aab0c8d697d1572f8000550e62c7bf5c92f212f657dd88c5","impliedFormat":1},{"version":"06b8a7d46195b6b3980e523ef59746702fd210b71681a83a5cf73799623621f9","impliedFormat":1},{"version":"860e4405959f646c101b8005a191298b2381af8f33716dc5f42097e4620608f8","impliedFormat":1},{"version":"f7e32adf714b8f25d3c1783473abec3f2e82d5724538d8dcf6f51baaaff1ca7a","impliedFormat":1},{"version":"d0da80c845999a16c24d0783033fb5366ada98df17867c98ad433ede05cd87fd","impliedFormat":1},{"version":"bfbf80f9cd4558af2d7b2006065340aaaced15947d590045253ded50aabb9bc5","impliedFormat":1},{"version":"fd9a991b51870325e46ebb0e6e18722d313f60cd8e596e645ec5ac15b96dbf4e","impliedFormat":1},{"version":"c3bd2b94e4298f81743d92945b80e9b56c1cdfb2bef43c149b7106a2491b1fc9","impliedFormat":1},{"version":"a246cce57f558f9ebaffd55c1e5673da44ea603b4da3b2b47eb88915d30a9181","impliedFormat":1},{"version":"d993eacc103c5a065227153c9aae8acea3a4322fe1a169ee7c70b77015bf0bb2","impliedFormat":1},{"version":"fc2b03d0c042aa1627406e753a26a1eaad01b3c496510a78016822ef8d456bb6","impliedFormat":1},{"version":"063c7ebbe756f0155a8b453f410ca6b76ffa1bbc1048735bcaf9c7c81a1ce35f","impliedFormat":1},{"version":"314e402cd481370d08f63051ae8b8c8e6370db5ee3b8820eeeaaf8d722a6dac6","impliedFormat":1},{"version":"9669075ac38ce36b638b290ba468233980d9f38bdc62f0519213b2fd3e2552ec","impliedFormat":1},{"version":"4d123de012c24e2f373925100be73d50517ac490f9ed3578ac82d0168bfbd303","impliedFormat":1},{"version":"656c9af789629aa36b39092bee3757034009620439d9a39912f587538033ce28","impliedFormat":1},{"version":"3ac3f4bdb8c0905d4c3035d6f7fb20118c21e8a17bee46d3735195b0c2a9f39f","impliedFormat":1},{"version":"1f453e6798ed29c86f703e9b41662640d4f2e61337007f27ac1c616f20093f69","impliedFormat":1},{"version":"af43b7871ff21c62bf1a54ec5c488e31a8d3408d5b51ff2e9f8581b6c55f2fc7","impliedFormat":1},{"version":"70550511d25cbb0b6a64dcac7fffc3c1397fd4cbeb6b23ccc7f9b794ab8a6954","impliedFormat":1},{"version":"af0fbf08386603a62f2a78c42d998c90353b1f1d22e05a384545f7accf881e0a","impliedFormat":1},{"version":"cefc20054d20b85b534206dbcedd509bb74f87f3d8bc45c58c7be3a76caa45e1","impliedFormat":1},{"version":"ad6eee4877d0f7e5244d34bc5026fd6e9cf8e66c5c79416b73f9f6ebf132f924","impliedFormat":1},{"version":"4888fd2bcfee9a0ce89d0df860d233e0cee8ee9c479b6bd5a5d5f9aae98342fe","impliedFormat":1},{"version":"f4749c102ced952aa6f40f0b579865429c4869f6d83df91000e98005476bee87","impliedFormat":1},{"version":"56654d2c5923598384e71cb808fac2818ca3f07dd23bb018988a39d5e64f268b","impliedFormat":1},{"version":"8b6719d3b9e65863da5390cb26994602c10a315aa16e7d70778a63fee6c4c079","impliedFormat":1},{"version":"05f56cd4b929977d18df8f3d08a4c929a2592ef5af083e79974b20a063f30940","impliedFormat":1},{"version":"547d3c406a21b30e2b78629ecc0b2ddaf652d9e0bdb2d59ceebce5612906df33","impliedFormat":1},{"version":"b3a4f9385279443c3a5568ec914a9492b59a723386161fd5ef0619d9f8982f97","impliedFormat":1},{"version":"3fe66aba4fbe0c3ba196a4f9ed2a776fe99dc4d1567a558fb11693e9fcc4e6ed","impliedFormat":1},{"version":"140eef237c7db06fc5adcb5df434ee21e81ee3a6fd57e1a75b8b3750aa2df2d8","impliedFormat":1},{"version":"0944ec553e4744efae790c68807a461720cff9f3977d4911ac0d918a17c9dd99","impliedFormat":1},{"version":"cb46b38d5e791acaa243bf342b8b5f8491639847463ac965b93896d4fb0af0d9","impliedFormat":1},{"version":"7c7d9e116fe51100ff766703e6b5e4424f51ad8977fe474ddd8d0959aa6de257","impliedFormat":1},{"version":"af70a2567e586be0083df3938b6a6792e6821363d8ef559ad8d721a33a5bcdaf","impliedFormat":1},{"version":"006cff3a8bcb92d77953f49a94cd7d5272fef4ab488b9052ef82b6a1260d870b","impliedFormat":1},{"version":"7d44bfdc8ee5e9af70738ff652c622ae3ad81815e63ab49bdc593d34cb3a68e5","impliedFormat":1},{"version":"339814517abd4dbc7b5f013dfd3b5e37ef0ea914a8bbe65413ecffd668792bc6","impliedFormat":1},{"version":"34d5bc0a6958967ec237c99f980155b5145b76e6eb927c9ffc57d8680326b5d8","impliedFormat":1},{"version":"9eae79b70c9d8288032cbe1b21d0941f6bd4f315e14786b2c1d10bccc634e897","impliedFormat":1},{"version":"18ce015ed308ea469b13b17f99ce53bbb97975855b2a09b86c052eefa4aa013a","impliedFormat":1},{"version":"5a931bc4106194e474be141e0bc1046629510dc95b9a0e4b02a3783847222965","impliedFormat":1},{"version":"5e5f371bf23d5ced2212a5ff56675aefbd0c9b3f4d4fdda1b6123ac6e28f058c","impliedFormat":1},{"version":"907c17ad5a05eecb29b42b36cc8fec6437be27cc4986bb3a218e4f74f606911c","impliedFormat":1},{"version":"ce60a562cd2a92f37a88f2ddd99a3abfbc5848d7baf38c48fb8d3243701fcb75","impliedFormat":1},{"version":"a726ad2d0a98bfffbe8bc1cd2d90b6d831638c0adc750ce73103a471eb9a891c","impliedFormat":1},{"version":"f44c0c8ce58d3dacac016607a1a90e5342d830ea84c48d2e571408087ae55894","impliedFormat":1},{"version":"75a315a098e630e734d9bc932d9841b64b30f7a349a20cf4717bf93044eff113","impliedFormat":1},{"version":"9131d95e32b3d4611d4046a613e022637348f6cebfe68230d4e81b691e4761a1","impliedFormat":1},{"version":"b03aa292cfdcd4edc3af00a7dbd71136dd067ec70a7536b655b82f4dd444e857","impliedFormat":1},{"version":"b6e2b0448ced813b8c207810d96551a26e7d7bb73255eea4b9701698f78846d6","impliedFormat":1},{"version":"8ae10cd85c1bd94d2f2d17c4cbd25c068a4b2471c70c2d96434239f97040747a","impliedFormat":1},{"version":"9ed5b799c50467b0c9f81ddf544b6bcda3e34d92076d6cab183c84511e45c39f","impliedFormat":1},{"version":"b4fa87cc1833839e51c49f20de71230e259c15b2c9c3e89e4814acc1d1ef10de","impliedFormat":1},{"version":"e90ac9e4ac0326faa1bc39f37af38ace0f9d4a655cd6d147713c653139cf4928","impliedFormat":1},{"version":"ea27110249d12e072956473a86fd1965df8e1be985f3b686b4e277afefdde584","impliedFormat":1},{"version":"8776a368617ce51129b74db7d55c3373dadcce5d0701e61d106e99998922a239","impliedFormat":1},{"version":"5666075052877fe2fdddd5b16de03168076cf0f03fbca5c1d4a3b8f43cba570c","impliedFormat":1},{"version":"9108ab5af05418f599ab48186193b1b07034c79a4a212a7f73535903ba4ca249","impliedFormat":1},{"version":"bb4e2cdcadf9c9e6ee2820af23cee6582d47c9c9c13b0dca1baaffe01fbbcb5f","impliedFormat":1},{"version":"6e30d0b5a1441d831d19fe02300ab3d83726abd5141cbcc0e2993fa0efd33db4","impliedFormat":1},{"version":"423f28126b2fc8d8d6fa558035309000a1297ed24473c595b7dec52e5c7ebae5","impliedFormat":1},{"version":"fb30734f82083d4790775dae393cd004924ebcbfde49849d9430bf0f0229dd16","impliedFormat":1},{"version":"2c92b04a7a4a1cd9501e1be338bf435738964130fb2ad5bd6c339ee41224ac4c","impliedFormat":1},{"version":"c5c5f0157b41833180419dacfbd2bcce78fb1a51c136bd4bcba5249864d8b9b5","impliedFormat":1},{"version":"02ae43d5bae42efcd5a00d3923e764895ce056bca005a9f4e623aa6b4797c8af","impliedFormat":1},{"version":"db6e01f17012a9d7b610ae764f94a1af850f5d98c9c826ad61747dca0fb800bd","impliedFormat":1},{"version":"8a44b424edee7bb17dc35a558cc15f92555f14a0441205613e0e50452ab3a602","impliedFormat":1},{"version":"24a00d0f98b799e6f628373249ece352b328089c3383b5606214357e9107e7d5","impliedFormat":1},{"version":"33637e3bc64edd2075d4071c55d60b32bdb0d243652977c66c964021b6fc8066","impliedFormat":1},{"version":"0f0ad9f14dedfdca37260931fac1edf0f6b951c629e84027255512f06a6ebc4c","impliedFormat":1},{"version":"16ad86c48bf950f5a480dc812b64225ca4a071827d3d18ffc5ec1ae176399e36","impliedFormat":1},{"version":"8cbf55a11ff59fd2b8e39a4aa08e25c5ddce46e3af0ed71fb51610607a13c505","impliedFormat":1},{"version":"d5bc4544938741f5daf8f3a339bfbf0d880da9e89e79f44a6383aaf056fe0159","impliedFormat":1},{"version":"97f9169882d393e6f303f570168ca86b5fe9aab556e9a43672dae7e6bb8e6495","impliedFormat":1},{"version":"7c9adb3fcd7851497818120b7e151465406e711d6a596a71b807f3a17853cb58","impliedFormat":1},{"version":"6752d402f9282dd6f6317c8c048aaaac27295739a166eed27e00391b358fed9a","impliedFormat":1},{"version":"9fd7466b77020847dbc9d2165829796bf7ea00895b2520ff3752ffdcff53564b","impliedFormat":1},{"version":"fbfc12d54a4488c2eb166ed63bab0fb34413e97069af273210cf39da5280c8d6","impliedFormat":1},{"version":"85a84240002b7cf577cec637167f0383409d086e3c4443852ca248fc6e16711e","impliedFormat":1},{"version":"84794e3abd045880e0fadcf062b648faf982aa80cfc56d28d80120e298178626","impliedFormat":1},{"version":"053d8b827286a16a669a36ffc8ccc8acdf8cc154c096610aa12348b8c493c7b8","impliedFormat":1},{"version":"3cce4ce031710970fe12d4f7834375f5fd455aa129af4c11eb787935923ff551","impliedFormat":1},{"version":"8f62cbd3afbd6a07bb8c934294b6bfbe437021b89e53a4da7de2648ecfc7af25","impliedFormat":1},{"version":"62c3621d34fb2567c17a2c4b89914ebefbfbd1b1b875b070391a7d4f722e55dc","impliedFormat":1},{"version":"c05ac811542e0b59cb9c2e8f60e983461f0b0e39cea93e320fad447ff8e474f3","impliedFormat":1},{"version":"8e7a5b8f867b99cc8763c0b024068fb58e09f7da2c4810c12833e1ca6eb11c4f","impliedFormat":1},{"version":"132351cbd8437a463757d3510258d0fa98fd3ebef336f56d6f359cf3e177a3ce","impliedFormat":1},{"version":"df877050b04c29b9f8409aa10278d586825f511f0841d1ec41b6554f8362092b","impliedFormat":1},{"version":"33d1888c3c27d3180b7fd20bac84e97ecad94b49830d5dd306f9e770213027d1","impliedFormat":1},{"version":"ee942c58036a0de88505ffd7c129f86125b783888288c2389330168677d6347f","impliedFormat":1},{"version":"a3f317d500c30ea56d41501632cdcc376dae6d24770563a5e59c039e1c2a08ec","impliedFormat":1},{"version":"eb21ddc3a8136a12e69176531197def71dc28ffaf357b74d4bf83407bd845991","impliedFormat":1},{"version":"0c1651a159995dfa784c57b4ea9944f16bdf8d924ed2d8b3db5c25d25749a343","impliedFormat":1},{"version":"aaa13958e03409d72e179b5d7f6ec5c6cc666b7be14773ae7b6b5ee4921e52db","impliedFormat":1},{"version":"0a86e049843ad02977a94bb9cdfec287a6c5a0a4b6b5391a6648b1a122072c5a","impliedFormat":1},{"version":"40f06693e2e3e58526b713c937895c02e113552dc8ba81ecd49cdd9596567ddb","impliedFormat":1},{"version":"4ed5e1992aedb174fb8f5aa8796aa6d4dcb8bd819b4af1b162a222b680a37fa0","impliedFormat":1},{"version":"d7f4bd46a8b97232ea6f8c28012b8d2b995e55e729d11405f159d3e00c51420a","impliedFormat":1},{"version":"d604d413aff031f4bfbdae1560e54ebf503d374464d76d50a2c6ded4df525712","impliedFormat":1},{"version":"e4f4f9cf1e3ac9fd91ada072e4d428ecbf0aa6dc57138fb797b8a0ca3a1d521c","impliedFormat":1},{"version":"12bfd290936824373edda13f48a4094adee93239b9a73432db603127881a300d","impliedFormat":1},{"version":"340ceb3ea308f8e98264988a663640e567c553b8d6dc7d5e43a8f3b64f780374","impliedFormat":1},{"version":"c5a769564e530fba3ec696d0a5cff1709b9095a0bdf5b0826d940d2fc9786413","impliedFormat":1},{"version":"7124ef724c3fc833a17896f2d994c368230a8d4b235baed39aa8037db31de54f","impliedFormat":1},{"version":"5de1c0759a76e7710f76899dcae601386424eab11fb2efaf190f2b0f09c3d3d3","impliedFormat":1},{"version":"9c5ee8f7e581f045b6be979f062a61bf076d362bf89c7f966b993a23424e8b0d","impliedFormat":1},{"version":"1a11df987948a86aa1ec4867907c59bdf431f13ed2270444bf47f788a5c7f92d","impliedFormat":1},{"version":"8018dd2e95e7ce6e613ddd81672a54532614dc745520a2f9e3860ff7fb1be0ca","impliedFormat":1},{"version":"b756781cd40d465da57d1fc6a442c34ae61fe8c802d752aace24f6a43fedacee","impliedFormat":1},{"version":"0fe76167c87289ea094e01616dcbab795c11b56bad23e1ef8aba9aa37e93432a","impliedFormat":1},{"version":"3a45029dba46b1f091e8dc4d784e7be970e209cd7d4ff02bd15270a98a9ba24b","impliedFormat":1},{"version":"032c1581f921f8874cf42966f27fd04afcabbb7878fa708a8251cac5415a2a06","impliedFormat":1},{"version":"69c68ed9652842ce4b8e495d63d2cd425862104c9fb7661f72e7aa8a9ef836f8","impliedFormat":1},{"version":"0e704ee6e9fd8b6a5a7167886f4d8915f4bc22ed79f19cb7b32bd28458f50643","impliedFormat":1},{"version":"06f62a14599a68bcde148d1efd60c2e52e8fa540cc7dcfa4477af132bb3de271","impliedFormat":1},{"version":"904a96f84b1bcee9a7f0f258d17f8692e6652a0390566515fe6741a5c6db8c1c","impliedFormat":1},{"version":"11f19ce32d21222419cecab448fa335017ebebf4f9e5457c4fa9df42fa2dcca7","impliedFormat":1},{"version":"2e8ee2cbb5e9159764e2189cf5547aebd0e6b0d9a64d479397bb051cd1991744","impliedFormat":1},{"version":"1b0471d75f5adb7f545c1a97c02a0f825851b95fe6e069ac6ecaa461b8bb321d","impliedFormat":1},{"version":"1d157c31a02b1e5cca9bc495b3d8d39f4b42b409da79f863fb953fbe3c7d4884","impliedFormat":1},{"version":"07baaceaec03d88a4b78cb0651b25f1ae0322ac1aa0b555ae3749a79a41cba86","impliedFormat":1},{"version":"619a132f634b4ebe5b4b4179ea5870f62f2cb09916a25957bff17b408de8b56d","impliedFormat":1},{"version":"f60fa446a397eb1aead9c4e568faf2df8068b4d0306ebc075fb4be16ed26b741","impliedFormat":1},{"version":"f3cb784be4d9e91f966a0b5052a098d9b53b0af0d341f690585b0cc05c6ca412","impliedFormat":1},{"version":"350f63439f8fe2e06c97368ddc7fb6d6c676d54f59520966f7dbbe6a4586014e","impliedFormat":1},{"version":"eba613b9b357ac8c50a925fa31dc7e65ff3b95a07efbaa684b624f143d8d34ba","impliedFormat":1},{"version":"45b74185005ed45bec3f07cac6e4d68eaf02ead9ff5a66721679fb28020e5e7c","impliedFormat":1},{"version":"0f6199602df09bdb12b95b5434f5d7474b1490d2cd8cc036364ab3ba6fd24263","impliedFormat":1},{"version":"c8ca7fd9ec7a3ec82185bfc8213e4a7f63ae748fd6fced931741d23ef4ea3c0f","impliedFormat":1},{"version":"5c6a8a3c2a8d059f0592d4eab59b062210a1c871117968b10797dee36d991ef7","impliedFormat":1},{"version":"ad77fd25ece8e09247040826a777dc181f974d28257c9cd5acb4921b51967bd8","impliedFormat":1},{"version":"ebe810fed06eee793fed6d2b43adc7259d80232681f3ec4fbbefed1bb8ed4e3a","impliedFormat":99},{"version":"3d56c0f6a266992b33378ef3391874dc4ebf5fbdf405832451bec0b4059ec0ea","impliedFormat":99},{"version":"9ea17eb395571376a3118c7dd70d6121f2914056fe1f72519c2576571469f625","affectsGlobalScope":true,"impliedFormat":99},{"version":"ed189ba69e565e21a5ce3600289c8a617610d6edae82b69d83f0e92a90d1f05c","impliedFormat":1},{"version":"fa0184f02c544b29e55d59bc072012192249aa01bcb114835a1c2b6734a18b1b","impliedFormat":1},{"version":"6b55a883ad769f82c76e4ac6bd04944b9260047f14516c562740d8c338d13fd6","impliedFormat":1},{"version":"35ecf8ddc666458f18796279d2ebff207b5af58f850352d90f990a0e74e06e12","impliedFormat":99},{"version":"011cfc691db561c14da5d397332a7942242cde809bf7c0a892f09f68b82134e9","impliedFormat":99},{"version":"6a5d4be8ae7a44ad14e801fcdcbdfc296f2400e264aa568dd215a61769764cae","impliedFormat":99},{"version":"4c7691df2c689a7f61ddf739d547d9aaab68e5f875f110a1baff4c5d84817879","impliedFormat":99},{"version":"fa7eb0f1c586e04b97230107e62bba8a1f6b01ebf4a6932e439ac10199dfe40b","impliedFormat":99},{"version":"16179274f1290d41510e6daa2bd150ce9c0cfadcd70f6526e978850e84dd3a48","impliedFormat":99},{"version":"3d1f85616f1d44db08c667d65eef3a1355c8e2a984232bb4edbd57ef664c4707","impliedFormat":99},{"version":"9bc0f1ed708bb7a44f6142a641a8046b3be3c40b79d1da541ddb7a7eb90fc46f","impliedFormat":99},{"version":"4a510f83ad2e1b4f36073eb4b6062f91cb332a82df0b23ee7beb6234a31e4fd6","impliedFormat":1},{"version":"64263222b36886450780fcae5cebe860e6c86e73953f8b8c60511320a4fe63ea","impliedFormat":1},{"version":"d98c84e26d16b760867b51531563297cdff4b744c7d97281b69356e4e72837a3","impliedFormat":1},{"version":"f3b0b4ef9fa51bf06e5c3d576cbb1626bc0786f3a26de1f4380c2c41c73a0ace","impliedFormat":1},{"version":"8af7046e2943c2bc7cc9d3261f714147f518d4a01baac0cde7fd17e91ef8c8d2","impliedFormat":1},{"version":"38a5ca5fabf95f2971413529653c5686226eb583b84ac59e257bcb19d1e4e963","impliedFormat":1},"fa5d6a9ae4e38062a5c38e46515e4a75f3eec081365ad220c106bfd82b51c18f","c149218312f5742495046b0bbbcbd4f08c4810458266bf68c94eeeefd8f19460","39a5de7b02b4a31ad36c3eab9f73698bfa8c2fa65e71c3a19fc5dfa4a9c2e879","eacca1dbe9b581a9aa192c193ee98311d70fd4ea2aa5b9201f57cca4ab3e8ab3","d17307d5e3f3ddb4c6d48740e33e3d471b7ff4792ceee2091c0a5459663ff631","491ae92e9e3cc0baa176ef2f1bed8e5205e0dcc609fddd28ee23588bf0df2ab5","aadcea6b89ca20acc9ad8b82f5d0e7567d47212241f157ae446f99553abda25d","dd18e6d5f49e7eb45fee07daabce3fce0f0107bd5a1fec41cfdc965828f88794","d1bf6781b0e4cfbcbe0539b48f0a19d7422991df1fb2f8b072df31adaef2cb9c",{"version":"f28555ca3d3cd38cbe5f56d8eebcc2032d6d03eeea769db2aec4178527cf421f","impliedFormat":99},"9992094d0bd614792e8d3eff48ff01ea1ae559a27e8098378bfa43a4e8db4bca","9070217d35466a1057bac632ff428447d39e44732e726c0232e2974490046eb6","21f7200a38c73966bf6340f8fd10663d436104e15e2f0cae6db970234ecdcf4d","e16ae1e836cb592da4c82f164696c395b4d0a2a58dccf547fba63eb7b12fa2c5","04e661d5250faf046c3036d53020b20416b481473d9fc489e4426e4c26ac6494","b93a489ee00a284c9fca5d4d27a080967f634429269ec8343f083d926b29ad90",{"version":"26b629f4e022362cc67323736ed5d9c25e4d21fa2d823654d23616a817963de6","impliedFormat":1},"fe7603fdb01871b5e9cc0006e38f35890b9b1704323b86adade08a9d602660a3","3214c9cfc21abacf02dece19a483456d03d0e25b13c25f07bc77af853be721ed","de27ab9cdf928ae8cadec43ac9cf530f9d5f1f983df8b9096e879d913feaf5f5","e87885df9349d045add9fff9ad6d3f7da52357aeae59c349c00bb22b564035bd","076b4a6861ae1b3d7a6c743f0182d95ec7e28b357085ac1056fe9682465fff11","8853b47dc60c3d4906c1714e76eecaa76b41b059b1e919d6863ed18ea1375728","3f69d19d4faa826d95cfb35e61d74a7a57830c996b07a58206a7930d96591345","6bce67154db4049e2513c494c71c4af72b71f9621c716e2f234fd351b495e5ea","9d726807aa9471e819020076cb15453cea6c118ab0883037dc8ca53fe557a814","6e00ebe3b40746b53ff9e082ee948f630db5e163c19a99f0c3f030fbc3f02272","c85e58549db9b82b19e7dcf3218e7bbe0d0232376e54e4422dec05b3151fc0ee",{"version":"ddd578018a259d1c494c834bdd8707769d07d1eb64f87f5217560cd2181b9e93","signature":"da14a67372982ca6e605fea114900b492b3316618581634e0ce72afbcb09baca"},{"version":"35299f21db2cf656cb7bcfd7266b9d9079ee6141c71b39eca442d33299876699","signature":"e33069c0a5e09502dc48f9f08afe7d34c4bd604e050ea286b4d05128dfdff5cd"},{"version":"ddd578018a259d1c494c834bdd8707769d07d1eb64f87f5217560cd2181b9e93","signature":"da14a67372982ca6e605fea114900b492b3316618581634e0ce72afbcb09baca"},{"version":"a80e02af710bdac31f2d8308890ac4de4b6a221aafcbce808123bfc2903c5dc2","impliedFormat":1},{"version":"ddd578018a259d1c494c834bdd8707769d07d1eb64f87f5217560cd2181b9e93","signature":"da14a67372982ca6e605fea114900b492b3316618581634e0ce72afbcb09baca"},{"version":"d6b3a7a8b7c4b5370d89fdfdc495a0880e755a22cf10277d9f3baeaedbe54438","signature":"09b45f26f1af40cd23b468e108d5a9b36141274cfc88adb7c7d187e3abef0a09"},{"version":"592ce59f6bccb249bdf9155c0a04f5dbf606aae1a489e77b9fe250506795779a","signature":"49aa0077f3666df9d9993f6110cd9dfd33e56b6007143aff5f5a76ffb8204aa7"},{"version":"ddd578018a259d1c494c834bdd8707769d07d1eb64f87f5217560cd2181b9e93","signature":"da14a67372982ca6e605fea114900b492b3316618581634e0ce72afbcb09baca"},{"version":"3679876bacf261dfaabf658ad74e34467b3a62531c70eb665c065cd2207524b3","signature":"1d4a1434793c9455bc54673bf81ad6a5f3e547a403148261c8d5fd9570d26420"},{"version":"3431cf7b9448418cdccd40642e66e89e913fcf81292f432cef17c282c6b030e1","signature":"d18d9967a6034647562fce85981114bbea01f120ff5347e50b5ad8ae60b3d95b"},{"version":"ddd578018a259d1c494c834bdd8707769d07d1eb64f87f5217560cd2181b9e93","signature":"da14a67372982ca6e605fea114900b492b3316618581634e0ce72afbcb09baca"},{"version":"dfccbddcc3b1a1a89e63fdae57906897ae0bf8a17772a661e3a57bb0eba48332","signature":"b464f274acd75c5bc46e1b8b35f81e99f24b7a74cd94d0dca760772d8dbd6016"},"da18b3db189153315fcea2bb81499e6cc6ebede84bac6de8ed2c936dc87d075c",{"version":"b16c500d08b986f9d7908d00353247bfe1691f99102c3bffe0cd6d88abdfaa97","signature":"69126c7e3396215566f04e7bdad270f2b28cb6c5a23833e4edb68e730220cb12"}],"root":[33,286,287],"options":{"allowJs":true,"allowSyntheticDefaultImports":true,"allowUmdGlobalAccess":true,"allowUnreachableCode":false,"allowUnusedLabels":false,"alwaysStrict":true,"checkJs":false,"declaration":true,"declarationDir":"./","declarationMap":false,"downlevelIteration":true,"esModuleInterop":true,"experimentalDecorators":true,"importHelpers":true,"inlineSourceMap":true,"inlineSources":true,"module":6,"noEmitHelpers":true,"noEmitOnError":true,"noFallthroughCasesInSwitch":true,"noImplicitOverride":true,"noImplicitReturns":true,"noPropertyAccessFromIndexSignature":false,"noStrictGenericChecks":false,"noUncheckedIndexedAccess":true,"noUnusedLocals":true,"noUnusedParameters":true,"outDir":"./esm2022","removeComments":false,"rootDir":"../../projects/layouts/src","skipDefaultLibCheck":true,"skipLibCheck":true,"sourceMap":false,"sourceRoot":"","strict":true,"strictBindCallApply":true,"strictFunctionTypes":true,"strictNullChecks":true,"strictPropertyInitialization":true,"stripInternal":false,"target":9,"useDefineForClassFields":false,"verbatimModuleSyntax":false},"referencedMap":[[273,1],[248,2],[249,3],[252,4],[250,5],[251,5],[263,6],[261,7],[253,8],[258,9],[257,10],[259,11],[260,12],[254,8],[246,13],[264,14],[265,15],[247,16],[266,8],[267,15],[268,17],[269,15],[270,18],[272,19],[271,18],[233,20],[238,21],[235,22],[237,8],[232,8],[228,23],[255,24],[236,25],[239,26],[262,24],[229,8],[243,27],[231,8],[245,28],[244,8],[242,29],[241,30],[240,31],[225,32],[176,33],[174,33],[89,34],[40,35],[39,36],[175,37],[160,38],[82,39],[38,40],[37,41],[224,36],[189,42],[188,42],[100,43],[196,34],[197,34],[199,44],[200,34],[201,41],[202,34],[173,34],[203,34],[204,45],[205,34],[206,42],[207,46],[208,34],[209,34],[210,34],[211,34],[212,42],[213,34],[214,34],[215,34],[216,34],[217,47],[218,34],[219,34],[220,34],[221,34],[222,34],[42,41],[43,41],[44,41],[45,41],[46,41],[47,41],[48,41],[49,34],[51,48],[52,41],[50,41],[53,41],[54,41],[55,41],[56,41],[57,41],[58,41],[59,34],[60,41],[61,41],[62,41],[63,41],[64,41],[65,34],[66,41],[67,41],[68,41],[69,41],[70,41],[71,41],[72,34],[74,49],[73,41],[75,41],[76,41],[77,41],[78,41],[79,47],[80,34],[81,34],[95,50],[83,51],[84,41],[85,41],[86,34],[87,41],[88,41],[90,52],[91,41],[92,41],[93,41],[94,41],[96,41],[97,41],[98,41],[99,41],[101,53],[102,41],[103,41],[104,41],[105,34],[106,41],[107,54],[108,54],[109,54],[110,34],[111,41],[112,41],[113,41],[118,41],[114,41],[115,34],[116,41],[117,34],[119,41],[120,41],[121,41],[122,41],[123,41],[124,41],[125,34],[126,41],[127,41],[128,41],[129,41],[130,41],[131,41],[132,41],[133,41],[134,41],[135,41],[136,41],[137,41],[138,41],[139,41],[140,41],[141,41],[142,55],[143,41],[144,41],[145,41],[146,41],[147,41],[148,41],[149,34],[150,34],[151,34],[152,34],[153,34],[154,41],[155,41],[156,41],[157,41],[223,34],[159,56],[182,57],[177,57],[168,58],[166,59],[180,60],[169,61],[183,62],[178,63],[179,60],[181,64],[164,65],[165,66],[163,67],[161,41],[170,68],[41,69],[187,42],[185,70],[158,71],[171,72],[33,73],[286,74],[34,73],[283,75],[284,73],[285,76],[274,73],[275,77],[281,73],[282,78],[276,73],[280,79],[278,73],[279,80],[287,81]],"semanticDiagnosticsPerFile":[33,34,274,276,278,281,284],"version":"5.8.3"}
|