@flighthq/spatial 0.3.1-next.975.01aea94 → 0.4.0-edge.1908.751021c
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bvh3D.d.ts +3 -0
- package/dist/bvh3D.d.ts.map +1 -0
- package/dist/bvh3D.js +575 -0
- package/dist/bvh3D.js.map +1 -0
- package/dist/contract.d.ts +6 -1
- package/dist/contract.d.ts.map +1 -1
- package/dist/contract.js +6 -1
- package/dist/contract.js.map +1 -1
- package/dist/explainSpatialIndexing2D.d.ts +3 -0
- package/dist/explainSpatialIndexing2D.d.ts.map +1 -0
- package/dist/{explainSpatialIndexing.js → explainSpatialIndexing2D.js} +2 -2
- package/dist/explainSpatialIndexing2D.js.map +1 -0
- package/dist/explainSpatialIndexing3D.d.ts +3 -0
- package/dist/explainSpatialIndexing3D.d.ts.map +1 -0
- package/dist/explainSpatialIndexing3D.js +15 -0
- package/dist/explainSpatialIndexing3D.js.map +1 -0
- package/dist/formatSpatialIndexingNotice.d.ts.map +1 -1
- package/dist/formatSpatialIndexingNotice.js +8 -2
- package/dist/formatSpatialIndexingNotice.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/spatialIndex.d.ts +10 -10
- package/dist/spatialIndex.d.ts.map +1 -1
- package/dist/spatialIndex.js +14 -14
- package/dist/spatialIndex.js.map +1 -1
- package/dist/spatialIndex3D.d.ts +13 -0
- package/dist/spatialIndex3D.d.ts.map +1 -0
- package/dist/spatialIndex3D.js +166 -0
- package/dist/spatialIndex3D.js.map +1 -0
- package/dist/spatialIndexingGuard.d.ts +4 -0
- package/dist/spatialIndexingGuard.d.ts.map +1 -0
- package/dist/spatialIndexingGuard.js +23 -0
- package/dist/spatialIndexingGuard.js.map +1 -0
- package/dist/uniformGrid.d.ts +2 -3
- package/dist/uniformGrid.d.ts.map +1 -1
- package/dist/uniformGrid.js +5 -15
- package/dist/uniformGrid.js.map +1 -1
- package/dist/uniformGrid3D.d.ts +3 -0
- package/dist/uniformGrid3D.d.ts.map +1 -0
- package/dist/uniformGrid3D.js +627 -0
- package/dist/uniformGrid3D.js.map +1 -0
- package/package.json +3 -3
- package/src/bvh3D.test.ts +294 -0
- package/src/explainSpatialIndexing2D.test.ts +81 -0
- package/src/explainSpatialIndexing3D.test.ts +59 -0
- package/src/formatSpatialIndexingNotice.test.ts +30 -4
- package/src/spatialIndex.test.ts +65 -65
- package/src/spatialIndex3D.test.ts +273 -0
- package/src/spatialIndexingGuard.test.ts +188 -0
- package/src/uniformGrid.test.ts +54 -182
- package/src/uniformGrid3D.test.ts +358 -0
- package/dist/explainSpatialIndexing.d.ts +0 -3
- package/dist/explainSpatialIndexing.d.ts.map +0 -1
- package/dist/explainSpatialIndexing.js.map +0 -1
- package/src/explainSpatialIndexing.test.ts +0 -76
|
@@ -0,0 +1,627 @@
|
|
|
1
|
+
import { reportSpatialIndexing } from './spatialIndexingGuard';
|
|
2
|
+
import { MAX_INDEXED_CELLS_PER_OBJECT } from './uniformGrid';
|
|
3
|
+
// Builds a 3D uniform-grid (spatial-hash) backend: an object's AABB is mapped to the rectangular
|
|
4
|
+
// block of fixed-size cells it covers, and each cell holds the ids overlapping it. Co-located objects
|
|
5
|
+
// share a cell, so candidate pairs and region/point/ray hits are found by looking only at the relevant
|
|
6
|
+
// cells instead of scanning every object. `cellSize` is the world-space side length of one cell; a
|
|
7
|
+
// good value is roughly the size of a typical object. No import-time side effect — the caller
|
|
8
|
+
// constructs a grid explicitly, and createSpatialIndex3D uses this as its default index.
|
|
9
|
+
//
|
|
10
|
+
// The cost policy is the 2D grid's, unchanged and deliberately so, but the per-object cell budget
|
|
11
|
+
// BINDS HARDER HERE and that is worth stating plainly: MAX_INDEXED_CELLS_PER_OBJECT is a 32x32 block
|
|
12
|
+
// in two dimensions and only a ~10x10x10 block in three. An object more than about ten cells wide on
|
|
13
|
+
// a side overflows, where its 2D counterpart would have had to be thirty-two. That is the bound doing
|
|
14
|
+
// its job rather than a mis-set constant — the walk it prevents grows as extent divided by cellSize
|
|
15
|
+
// CUBED, so the runaway it exists to stop arrives sooner and steeper. A workload whose objects
|
|
16
|
+
// overflow is telling the caller its cell size is wrong, which the indexing guard reports.
|
|
17
|
+
export function createUniformGridSpatialBackend3D(cellSize) {
|
|
18
|
+
const grid = {
|
|
19
|
+
cellSize,
|
|
20
|
+
cells: new Map(),
|
|
21
|
+
bounds: new Map(),
|
|
22
|
+
overflow: new Set(),
|
|
23
|
+
declined: new Map(),
|
|
24
|
+
minCellX: 0,
|
|
25
|
+
minCellY: 0,
|
|
26
|
+
minCellZ: 0,
|
|
27
|
+
maxCellX: 0,
|
|
28
|
+
maxCellY: 0,
|
|
29
|
+
maxCellZ: 0,
|
|
30
|
+
seen: new Set(),
|
|
31
|
+
pairIds: [],
|
|
32
|
+
};
|
|
33
|
+
return {
|
|
34
|
+
insertSpatialObject(id, bounds) {
|
|
35
|
+
return _insertIntoGrid3D(grid, id, bounds, 'insert');
|
|
36
|
+
},
|
|
37
|
+
updateSpatialObject(id, bounds) {
|
|
38
|
+
return _updateGrid3DObject(grid, id, bounds);
|
|
39
|
+
},
|
|
40
|
+
removeSpatialObject(id) {
|
|
41
|
+
const wasMissing = !grid.bounds.has(id) && !grid.declined.has(id);
|
|
42
|
+
_removeFromGrid3D(grid, id);
|
|
43
|
+
if (wasMissing)
|
|
44
|
+
_reportGrid3DIndexing(grid, id, 'absent', 'remove', 'missing-id', 0);
|
|
45
|
+
},
|
|
46
|
+
clearSpatialIndex() {
|
|
47
|
+
grid.cells.clear();
|
|
48
|
+
grid.bounds.clear();
|
|
49
|
+
grid.overflow.clear();
|
|
50
|
+
grid.declined.clear();
|
|
51
|
+
grid.seen.clear();
|
|
52
|
+
grid.pairIds.length = 0;
|
|
53
|
+
},
|
|
54
|
+
explainSpatialIndexing(id) {
|
|
55
|
+
return _explainGrid3DIndexing(grid, id);
|
|
56
|
+
},
|
|
57
|
+
querySpatialPairs(out) {
|
|
58
|
+
_queryGrid3DPairs(grid, out);
|
|
59
|
+
},
|
|
60
|
+
querySpatialRegion(region, out) {
|
|
61
|
+
_queryGrid3DRegion(grid, region, out);
|
|
62
|
+
},
|
|
63
|
+
querySpatialPoint(x, y, z, out) {
|
|
64
|
+
_queryGrid3DPoint(grid, x, y, z, out);
|
|
65
|
+
},
|
|
66
|
+
querySpatialRay(x, y, z, dx, dy, dz, out) {
|
|
67
|
+
_queryGrid3DRay(grid, x, y, z, dx, dy, dz, out);
|
|
68
|
+
},
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
// Maps a world coordinate to its cell index along one axis. Uses floor so negative coordinates map
|
|
72
|
+
// to consistently decreasing cell indices (world 0 is the boundary between cell -1 and cell 0).
|
|
73
|
+
function _cellIndex3D(coord, cellSize) {
|
|
74
|
+
return Math.floor(coord / cellSize);
|
|
75
|
+
}
|
|
76
|
+
// The map key for a cell. A string of the three signed integer coordinates — negatives and large
|
|
77
|
+
// magnitudes are represented exactly, unlike a numeric pairing that could overflow or collide.
|
|
78
|
+
function _cellKey3D(cx, cy, cz) {
|
|
79
|
+
return `${cx},${cy},${cz}`;
|
|
80
|
+
}
|
|
81
|
+
// Reports how `id` is currently held. Pure: reads only, allocates only the returned record.
|
|
82
|
+
function _explainGrid3DIndexing(grid, id) {
|
|
83
|
+
const declineReason = grid.declined.get(id);
|
|
84
|
+
if (declineReason !== undefined)
|
|
85
|
+
return { bucketCount: 0, id, mode: 'declined', reason: declineReason };
|
|
86
|
+
if (grid.overflow.has(id))
|
|
87
|
+
return { bucketCount: 0, id, mode: 'overflow', reason: null };
|
|
88
|
+
const bounds = grid.bounds.get(id);
|
|
89
|
+
if (bounds === undefined)
|
|
90
|
+
return { bucketCount: 0, id, mode: 'absent', reason: null };
|
|
91
|
+
return { bucketCount: _spannedCellCount3D(grid.cellSize, bounds), id, mode: 'cells', reason: null };
|
|
92
|
+
}
|
|
93
|
+
// Adds an object to the index, storing a private copy of the bounds; the caller may safely mutate or
|
|
94
|
+
// reuse the passed bounds afterward. Returns false only for bounds that cannot be indexed at all.
|
|
95
|
+
//
|
|
96
|
+
// Five outcomes, and which one applies is decided *before* any cell is touched — that ordering is the
|
|
97
|
+
// whole point, since deciding afterward would mean walking the cells to find out they were too many,
|
|
98
|
+
// and in three dimensions that walk is cubic in the object's extent.
|
|
99
|
+
function _insertIntoGrid3D(grid, id, bounds, operation) {
|
|
100
|
+
if (!Number.isFinite(bounds.minX) ||
|
|
101
|
+
!Number.isFinite(bounds.minY) ||
|
|
102
|
+
!Number.isFinite(bounds.minZ) ||
|
|
103
|
+
!Number.isFinite(bounds.maxX) ||
|
|
104
|
+
!Number.isFinite(bounds.maxY) ||
|
|
105
|
+
!Number.isFinite(bounds.maxZ)) {
|
|
106
|
+
grid.declined.set(id, 'non-finite-bounds');
|
|
107
|
+
_reportGrid3DIndexing(grid, id, 'declined', operation, 'non-finite-bounds', 0);
|
|
108
|
+
return false;
|
|
109
|
+
}
|
|
110
|
+
if (bounds.maxX < bounds.minX || bounds.maxY < bounds.minY || bounds.maxZ < bounds.minZ) {
|
|
111
|
+
grid.declined.set(id, 'inverted-bounds');
|
|
112
|
+
_reportGrid3DIndexing(grid, id, 'declined', operation, 'inverted-bounds', 0);
|
|
113
|
+
return false;
|
|
114
|
+
}
|
|
115
|
+
const cs = grid.cellSize;
|
|
116
|
+
const copy = {
|
|
117
|
+
minX: bounds.minX,
|
|
118
|
+
minY: bounds.minY,
|
|
119
|
+
minZ: bounds.minZ,
|
|
120
|
+
maxX: bounds.maxX,
|
|
121
|
+
maxY: bounds.maxY,
|
|
122
|
+
maxZ: bounds.maxZ,
|
|
123
|
+
};
|
|
124
|
+
if (!(cs > 0 && Number.isFinite(cs))) {
|
|
125
|
+
grid.bounds.set(id, copy);
|
|
126
|
+
grid.overflow.add(id);
|
|
127
|
+
_reportGrid3DIndexing(grid, id, 'overflow', operation, 'invalid-cell-size', 0);
|
|
128
|
+
return true;
|
|
129
|
+
}
|
|
130
|
+
const spanned = _spannedCellCount3D(cs, copy);
|
|
131
|
+
// Written as a negated `<=` so an unrepresentable span falls to overflow rather than through to a
|
|
132
|
+
// loop that cannot index it.
|
|
133
|
+
if (!(spanned <= MAX_INDEXED_CELLS_PER_OBJECT)) {
|
|
134
|
+
grid.bounds.set(id, copy);
|
|
135
|
+
grid.overflow.add(id);
|
|
136
|
+
_reportGrid3DIndexing(grid, id, 'overflow', operation, null, spanned);
|
|
137
|
+
return true;
|
|
138
|
+
}
|
|
139
|
+
const cx0 = _cellIndex3D(copy.minX, cs);
|
|
140
|
+
const cx1 = _cellIndex3D(copy.maxX, cs);
|
|
141
|
+
const cy0 = _cellIndex3D(copy.minY, cs);
|
|
142
|
+
const cy1 = _cellIndex3D(copy.maxY, cs);
|
|
143
|
+
const cz0 = _cellIndex3D(copy.minZ, cs);
|
|
144
|
+
const cz1 = _cellIndex3D(copy.maxZ, cs);
|
|
145
|
+
// Whether a cell range exists yet, read *before* this object's cells are added. A first celled
|
|
146
|
+
// object seeds the range; a later one widens it.
|
|
147
|
+
const hadCells = grid.cells.size !== 0;
|
|
148
|
+
grid.bounds.set(id, copy);
|
|
149
|
+
for (let cz = cz0; cz <= cz1; cz++) {
|
|
150
|
+
for (let cy = cy0; cy <= cy1; cy++) {
|
|
151
|
+
for (let cx = cx0; cx <= cx1; cx++) {
|
|
152
|
+
const key = _cellKey3D(cx, cy, cz);
|
|
153
|
+
let cell = grid.cells.get(key);
|
|
154
|
+
if (cell === undefined) {
|
|
155
|
+
cell = { cx, cy, cz, ids: new Set() };
|
|
156
|
+
grid.cells.set(key, cell);
|
|
157
|
+
}
|
|
158
|
+
cell.ids.add(id);
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
if (!hadCells) {
|
|
163
|
+
grid.minCellX = cx0;
|
|
164
|
+
grid.maxCellX = cx1;
|
|
165
|
+
grid.minCellY = cy0;
|
|
166
|
+
grid.maxCellY = cy1;
|
|
167
|
+
grid.minCellZ = cz0;
|
|
168
|
+
grid.maxCellZ = cz1;
|
|
169
|
+
}
|
|
170
|
+
else {
|
|
171
|
+
if (cx0 < grid.minCellX)
|
|
172
|
+
grid.minCellX = cx0;
|
|
173
|
+
if (cx1 > grid.maxCellX)
|
|
174
|
+
grid.maxCellX = cx1;
|
|
175
|
+
if (cy0 < grid.minCellY)
|
|
176
|
+
grid.minCellY = cy0;
|
|
177
|
+
if (cy1 > grid.maxCellY)
|
|
178
|
+
grid.maxCellY = cy1;
|
|
179
|
+
if (cz0 < grid.minCellZ)
|
|
180
|
+
grid.minCellZ = cz0;
|
|
181
|
+
if (cz1 > grid.maxCellZ)
|
|
182
|
+
grid.maxCellZ = cz1;
|
|
183
|
+
}
|
|
184
|
+
return true;
|
|
185
|
+
}
|
|
186
|
+
// Reports whether an AABB contains the point (`x`,`y`,`z`).
|
|
187
|
+
function _isSpatialAabb3DContainsPoint(aabb, x, y, z) {
|
|
188
|
+
const minX = aabb.minX;
|
|
189
|
+
const minY = aabb.minY;
|
|
190
|
+
const minZ = aabb.minZ;
|
|
191
|
+
const maxX = aabb.maxX;
|
|
192
|
+
const maxY = aabb.maxY;
|
|
193
|
+
const maxZ = aabb.maxZ;
|
|
194
|
+
return x >= minX && x < maxX && y >= minY && y < maxY && z >= minZ && z < maxZ;
|
|
195
|
+
}
|
|
196
|
+
// Reports whether two AABBs overlap; face-touching counts as disjoint.
|
|
197
|
+
function _isSpatialAabb3DOverlapping(a, b) {
|
|
198
|
+
const aMinX = a.minX;
|
|
199
|
+
const aMinY = a.minY;
|
|
200
|
+
const aMinZ = a.minZ;
|
|
201
|
+
const aMaxX = a.maxX;
|
|
202
|
+
const aMaxY = a.maxY;
|
|
203
|
+
const aMaxZ = a.maxZ;
|
|
204
|
+
const bMinX = b.minX;
|
|
205
|
+
const bMinY = b.minY;
|
|
206
|
+
const bMinZ = b.minZ;
|
|
207
|
+
const bMaxX = b.maxX;
|
|
208
|
+
const bMaxY = b.maxY;
|
|
209
|
+
const bMaxZ = b.maxZ;
|
|
210
|
+
return aMinX < bMaxX && aMaxX > bMinX && aMinY < bMaxY && aMaxY > bMinY && aMinZ < bMaxZ && aMaxZ > bMinZ;
|
|
211
|
+
}
|
|
212
|
+
// Appends the pairs involving overflowed objects. An overflowed object occupies no cell, so the cell
|
|
213
|
+
// walk in _queryGrid3DPairs can never emit a pair for it and no dedup against that walk is needed. Its
|
|
214
|
+
// pairs are enumerated here instead: against every other indexed object, which is what "spans nearly
|
|
215
|
+
// the whole world" already means. Unlike the cell path these are filtered by a real AABB overlap test
|
|
216
|
+
// rather than emitted as bare locality candidates.
|
|
217
|
+
function _queryGrid3DOverflowPairs(grid, out, written) {
|
|
218
|
+
for (const id of grid.overflow) {
|
|
219
|
+
const bounds = grid.bounds.get(id);
|
|
220
|
+
if (bounds === undefined)
|
|
221
|
+
continue;
|
|
222
|
+
for (const [otherId, otherBounds] of grid.bounds) {
|
|
223
|
+
if (otherId === id)
|
|
224
|
+
continue;
|
|
225
|
+
// Each overflow×overflow pair would otherwise be emitted from both sides; taking it only from
|
|
226
|
+
// the lower id emits it once. An overflow×celled pair reaches this test from one side only.
|
|
227
|
+
if (grid.overflow.has(otherId) && otherId < id)
|
|
228
|
+
continue;
|
|
229
|
+
if (!_isSpatialAabb3DOverlapping(bounds, otherBounds))
|
|
230
|
+
continue;
|
|
231
|
+
written =
|
|
232
|
+
id < otherId ? _writeGrid3DPair(out, written, id, otherId) : _writeGrid3DPair(out, written, otherId, id);
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
return written;
|
|
236
|
+
}
|
|
237
|
+
// Enumerates candidate pairs. Within each cell every co-occupant pair is a candidate, but a pair may
|
|
238
|
+
// share several cells; to emit it exactly once, a pair is emitted only from its canonical cell — the
|
|
239
|
+
// minimum-corner (min x, min y, min z) cell of the two objects' overlapping cell ranges, which both
|
|
240
|
+
// objects are guaranteed to occupy. Ids are ordered a < b so the unordered pair is canonical. A pair
|
|
241
|
+
// is never (a,a). The pair is a broadphase candidate (shared cell locality); the caller confirms real
|
|
242
|
+
// overlap.
|
|
243
|
+
function _queryGrid3DPairs(grid, out) {
|
|
244
|
+
let written = 0;
|
|
245
|
+
const cs = grid.cellSize;
|
|
246
|
+
const list = grid.pairIds;
|
|
247
|
+
for (const cell of grid.cells.values()) {
|
|
248
|
+
const ids = cell.ids;
|
|
249
|
+
if (ids.size < 2)
|
|
250
|
+
continue;
|
|
251
|
+
list.length = 0;
|
|
252
|
+
for (const id of ids)
|
|
253
|
+
list.push(id);
|
|
254
|
+
for (let i = 0; i < list.length; i++) {
|
|
255
|
+
for (let j = i + 1; j < list.length; j++) {
|
|
256
|
+
let a = list[i];
|
|
257
|
+
let b = list[j];
|
|
258
|
+
if (a > b) {
|
|
259
|
+
const t = a;
|
|
260
|
+
a = b;
|
|
261
|
+
b = t;
|
|
262
|
+
}
|
|
263
|
+
const ab = grid.bounds.get(a);
|
|
264
|
+
const bb = grid.bounds.get(b);
|
|
265
|
+
if (ab === undefined || bb === undefined)
|
|
266
|
+
continue;
|
|
267
|
+
const canonicalX = Math.max(_cellIndex3D(ab.minX, cs), _cellIndex3D(bb.minX, cs));
|
|
268
|
+
const canonicalY = Math.max(_cellIndex3D(ab.minY, cs), _cellIndex3D(bb.minY, cs));
|
|
269
|
+
const canonicalZ = Math.max(_cellIndex3D(ab.minZ, cs), _cellIndex3D(bb.minZ, cs));
|
|
270
|
+
if (cell.cx === canonicalX && cell.cy === canonicalY && cell.cz === canonicalZ) {
|
|
271
|
+
written = _writeGrid3DPair(out, written, a, b);
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
if (grid.overflow.size !== 0)
|
|
277
|
+
written = _queryGrid3DOverflowPairs(grid, out, written);
|
|
278
|
+
out.length = written;
|
|
279
|
+
}
|
|
280
|
+
// Rewrites a caller-owned high-water pair object instead of allocating one on every broadphase query.
|
|
281
|
+
// `out.length` is trimmed only after the gather, so every slot that survives from the previous query is
|
|
282
|
+
// still reachable while this one fills it.
|
|
283
|
+
function _writeGrid3DPair(out, index, a, b) {
|
|
284
|
+
const pair = out[index];
|
|
285
|
+
if (pair === undefined)
|
|
286
|
+
out.push({ a, b });
|
|
287
|
+
else {
|
|
288
|
+
pair.a = a;
|
|
289
|
+
pair.b = b;
|
|
290
|
+
}
|
|
291
|
+
return index + 1;
|
|
292
|
+
}
|
|
293
|
+
// Gathers the ids in the cell containing the point, then confirms each against its real bounds. A
|
|
294
|
+
// single cell holds each id at most once, so no dedup pass is needed. Overflowed objects hold no cell
|
|
295
|
+
// and are tested directly; they cannot collide with the cell gather, so no dedup is needed there
|
|
296
|
+
// either.
|
|
297
|
+
function _queryGrid3DPoint(grid, x, y, z, out) {
|
|
298
|
+
out.length = 0;
|
|
299
|
+
const cs = grid.cellSize;
|
|
300
|
+
const cell = grid.cells.get(_cellKey3D(_cellIndex3D(x, cs), _cellIndex3D(y, cs), _cellIndex3D(z, cs)));
|
|
301
|
+
if (cell !== undefined) {
|
|
302
|
+
for (const id of cell.ids) {
|
|
303
|
+
const bounds = grid.bounds.get(id);
|
|
304
|
+
if (bounds !== undefined && _isSpatialAabb3DContainsPoint(bounds, x, y, z))
|
|
305
|
+
out.push(id);
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
for (const id of grid.overflow) {
|
|
309
|
+
const bounds = grid.bounds.get(id);
|
|
310
|
+
if (bounds !== undefined && _isSpatialAabb3DContainsPoint(bounds, x, y, z))
|
|
311
|
+
out.push(id);
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
// Walks the cells the ray crosses (bounded to the occupied cell range) via an amanatides-woo DDA
|
|
315
|
+
// carrying a third axis, gathering deduplicated ids, then confirms each against a real ray-vs-AABB
|
|
316
|
+
// slab test — so a cell co-occupant the ray does not actually strike is dropped. A zero-length
|
|
317
|
+
// direction degenerates to a point query at the origin. An empty grid returns nothing.
|
|
318
|
+
function _queryGrid3DRay(grid, ox, oy, oz, dx, dy, dz, out) {
|
|
319
|
+
out.length = 0;
|
|
320
|
+
const cs = grid.cellSize;
|
|
321
|
+
const seen = grid.seen;
|
|
322
|
+
seen.clear();
|
|
323
|
+
if (dx === 0 && dy === 0 && dz === 0) {
|
|
324
|
+
_queryGrid3DPoint(grid, ox, oy, oz, out);
|
|
325
|
+
return;
|
|
326
|
+
}
|
|
327
|
+
// Overflowed objects are outside the cell range the DDA walks — deliberately, so one huge AABB
|
|
328
|
+
// cannot stretch that range and make every ray traverse it — so they are slab-tested directly.
|
|
329
|
+
for (const id of grid.overflow) {
|
|
330
|
+
const bounds = grid.bounds.get(id);
|
|
331
|
+
if (bounds !== undefined && _rayBox3DEntryT(ox, oy, oz, dx, dy, dz, bounds) >= 0)
|
|
332
|
+
out.push(id);
|
|
333
|
+
}
|
|
334
|
+
// The cell range describes the CELLS, so the cells decide whether it means anything. Deriving this
|
|
335
|
+
// rather than keeping an `empty` flag removes a whole class of defect: there is no flag that can
|
|
336
|
+
// disagree with the structure it describes at any transition. The 2D grid learned this the hard way.
|
|
337
|
+
if (grid.cells.size === 0)
|
|
338
|
+
return;
|
|
339
|
+
const rangeBounds = {
|
|
340
|
+
minX: grid.minCellX * cs,
|
|
341
|
+
minY: grid.minCellY * cs,
|
|
342
|
+
minZ: grid.minCellZ * cs,
|
|
343
|
+
maxX: (grid.maxCellX + 1) * cs,
|
|
344
|
+
maxY: (grid.maxCellY + 1) * cs,
|
|
345
|
+
maxZ: (grid.maxCellZ + 1) * cs,
|
|
346
|
+
};
|
|
347
|
+
const tEnter = _rayBox3DEntryT(ox, oy, oz, dx, dy, dz, rangeBounds);
|
|
348
|
+
if (tEnter < 0)
|
|
349
|
+
return;
|
|
350
|
+
let cx = _cellIndex3D(ox + tEnter * dx, cs);
|
|
351
|
+
let cy = _cellIndex3D(oy + tEnter * dy, cs);
|
|
352
|
+
let cz = _cellIndex3D(oz + tEnter * dz, cs);
|
|
353
|
+
if (cx < grid.minCellX)
|
|
354
|
+
cx = grid.minCellX;
|
|
355
|
+
else if (cx > grid.maxCellX)
|
|
356
|
+
cx = grid.maxCellX;
|
|
357
|
+
if (cy < grid.minCellY)
|
|
358
|
+
cy = grid.minCellY;
|
|
359
|
+
else if (cy > grid.maxCellY)
|
|
360
|
+
cy = grid.maxCellY;
|
|
361
|
+
if (cz < grid.minCellZ)
|
|
362
|
+
cz = grid.minCellZ;
|
|
363
|
+
else if (cz > grid.maxCellZ)
|
|
364
|
+
cz = grid.maxCellZ;
|
|
365
|
+
const stepX = dx > 0 ? 1 : dx < 0 ? -1 : 0;
|
|
366
|
+
const stepY = dy > 0 ? 1 : dy < 0 ? -1 : 0;
|
|
367
|
+
const stepZ = dz > 0 ? 1 : dz < 0 ? -1 : 0;
|
|
368
|
+
let tMaxX = Infinity;
|
|
369
|
+
let tDeltaX = Infinity;
|
|
370
|
+
if (stepX !== 0) {
|
|
371
|
+
tMaxX = ((stepX > 0 ? (cx + 1) * cs : cx * cs) - ox) / dx;
|
|
372
|
+
tDeltaX = cs / Math.abs(dx);
|
|
373
|
+
}
|
|
374
|
+
let tMaxY = Infinity;
|
|
375
|
+
let tDeltaY = Infinity;
|
|
376
|
+
if (stepY !== 0) {
|
|
377
|
+
tMaxY = ((stepY > 0 ? (cy + 1) * cs : cy * cs) - oy) / dy;
|
|
378
|
+
tDeltaY = cs / Math.abs(dy);
|
|
379
|
+
}
|
|
380
|
+
let tMaxZ = Infinity;
|
|
381
|
+
let tDeltaZ = Infinity;
|
|
382
|
+
if (stepZ !== 0) {
|
|
383
|
+
tMaxZ = ((stepZ > 0 ? (cz + 1) * cs : cz * cs) - oz) / dz;
|
|
384
|
+
tDeltaZ = cs / Math.abs(dz);
|
|
385
|
+
}
|
|
386
|
+
const maxSteps = grid.maxCellX - grid.minCellX + (grid.maxCellY - grid.minCellY) + (grid.maxCellZ - grid.minCellZ) + 4;
|
|
387
|
+
for (let step = 0; step <= maxSteps; step++) {
|
|
388
|
+
if (cx < grid.minCellX ||
|
|
389
|
+
cx > grid.maxCellX ||
|
|
390
|
+
cy < grid.minCellY ||
|
|
391
|
+
cy > grid.maxCellY ||
|
|
392
|
+
cz < grid.minCellZ ||
|
|
393
|
+
cz > grid.maxCellZ) {
|
|
394
|
+
break;
|
|
395
|
+
}
|
|
396
|
+
const cell = grid.cells.get(_cellKey3D(cx, cy, cz));
|
|
397
|
+
if (cell !== undefined) {
|
|
398
|
+
for (const id of cell.ids)
|
|
399
|
+
seen.add(id);
|
|
400
|
+
}
|
|
401
|
+
if (tMaxX < tMaxY && tMaxX < tMaxZ) {
|
|
402
|
+
cx += stepX;
|
|
403
|
+
tMaxX += tDeltaX;
|
|
404
|
+
}
|
|
405
|
+
else if (tMaxY < tMaxZ) {
|
|
406
|
+
cy += stepY;
|
|
407
|
+
tMaxY += tDeltaY;
|
|
408
|
+
}
|
|
409
|
+
else {
|
|
410
|
+
cz += stepZ;
|
|
411
|
+
tMaxZ += tDeltaZ;
|
|
412
|
+
}
|
|
413
|
+
}
|
|
414
|
+
for (const id of seen) {
|
|
415
|
+
const bounds = grid.bounds.get(id);
|
|
416
|
+
if (bounds !== undefined && _rayBox3DEntryT(ox, oy, oz, dx, dy, dz, bounds) >= 0)
|
|
417
|
+
out.push(id);
|
|
418
|
+
}
|
|
419
|
+
}
|
|
420
|
+
// Gathers the ids in every cell the region covers (deduplicated via the reused scratch set), then
|
|
421
|
+
// confirms each against the region's real bounds — so a false cell-mate whose bounds miss the region
|
|
422
|
+
// is dropped. Overflowed objects hold no cell and are tested directly.
|
|
423
|
+
//
|
|
424
|
+
// The region is caller-supplied, so it carries the same unbounded-walk hazard the insert bound closes
|
|
425
|
+
// and needs its own guard: a query region wider than the world costs extent ÷ cellSize CUBED cell
|
|
426
|
+
// lookups against a grid that may hold one object. When the region spans more cells than the grid has
|
|
427
|
+
// occupied, walking the objects is both cheaper and exact, so the walk flips — a region query is never
|
|
428
|
+
// more expensive than a full scan.
|
|
429
|
+
function _queryGrid3DRegion(grid, region, out) {
|
|
430
|
+
out.length = 0;
|
|
431
|
+
const cs = grid.cellSize;
|
|
432
|
+
const seen = grid.seen;
|
|
433
|
+
seen.clear();
|
|
434
|
+
if (!(_spannedCellCount3D(cs, region) <= grid.cells.size)) {
|
|
435
|
+
for (const [id, bounds] of grid.bounds) {
|
|
436
|
+
if (_isSpatialAabb3DOverlapping(bounds, region))
|
|
437
|
+
out.push(id);
|
|
438
|
+
}
|
|
439
|
+
return;
|
|
440
|
+
}
|
|
441
|
+
const cx0 = _cellIndex3D(region.minX, cs);
|
|
442
|
+
const cx1 = _cellIndex3D(region.maxX, cs);
|
|
443
|
+
const cy0 = _cellIndex3D(region.minY, cs);
|
|
444
|
+
const cy1 = _cellIndex3D(region.maxY, cs);
|
|
445
|
+
const cz0 = _cellIndex3D(region.minZ, cs);
|
|
446
|
+
const cz1 = _cellIndex3D(region.maxZ, cs);
|
|
447
|
+
for (let cz = cz0; cz <= cz1; cz++) {
|
|
448
|
+
for (let cy = cy0; cy <= cy1; cy++) {
|
|
449
|
+
for (let cx = cx0; cx <= cx1; cx++) {
|
|
450
|
+
const cell = grid.cells.get(_cellKey3D(cx, cy, cz));
|
|
451
|
+
if (cell === undefined)
|
|
452
|
+
continue;
|
|
453
|
+
for (const id of cell.ids) {
|
|
454
|
+
if (seen.has(id))
|
|
455
|
+
continue;
|
|
456
|
+
seen.add(id);
|
|
457
|
+
const bounds = grid.bounds.get(id);
|
|
458
|
+
if (bounds !== undefined && _isSpatialAabb3DOverlapping(bounds, region))
|
|
459
|
+
out.push(id);
|
|
460
|
+
}
|
|
461
|
+
}
|
|
462
|
+
}
|
|
463
|
+
}
|
|
464
|
+
for (const id of grid.overflow) {
|
|
465
|
+
const bounds = grid.bounds.get(id);
|
|
466
|
+
if (bounds !== undefined && _isSpatialAabb3DOverlapping(bounds, region))
|
|
467
|
+
out.push(id);
|
|
468
|
+
}
|
|
469
|
+
}
|
|
470
|
+
// Slab test for a ray (origin `o*`, direction `d*`, `t >= 0`) against an axis-aligned box. Returns the
|
|
471
|
+
// entry parameter `t` (0 when the origin is already inside), or -1 when the ray misses the box or the
|
|
472
|
+
// box lies entirely behind the origin. Direction need not be normalized.
|
|
473
|
+
function _rayBox3DEntryT(ox, oy, oz, dx, dy, dz, box) {
|
|
474
|
+
let tmin = -Infinity;
|
|
475
|
+
let tmax = Infinity;
|
|
476
|
+
if (dx !== 0) {
|
|
477
|
+
const inv = 1 / dx;
|
|
478
|
+
let t1 = (box.minX - ox) * inv;
|
|
479
|
+
let t2 = (box.maxX - ox) * inv;
|
|
480
|
+
if (t1 > t2) {
|
|
481
|
+
const t = t1;
|
|
482
|
+
t1 = t2;
|
|
483
|
+
t2 = t;
|
|
484
|
+
}
|
|
485
|
+
if (t1 > tmin)
|
|
486
|
+
tmin = t1;
|
|
487
|
+
if (t2 < tmax)
|
|
488
|
+
tmax = t2;
|
|
489
|
+
}
|
|
490
|
+
else if (ox < box.minX || ox > box.maxX) {
|
|
491
|
+
return -1;
|
|
492
|
+
}
|
|
493
|
+
if (dy !== 0) {
|
|
494
|
+
const inv = 1 / dy;
|
|
495
|
+
let t1 = (box.minY - oy) * inv;
|
|
496
|
+
let t2 = (box.maxY - oy) * inv;
|
|
497
|
+
if (t1 > t2) {
|
|
498
|
+
const t = t1;
|
|
499
|
+
t1 = t2;
|
|
500
|
+
t2 = t;
|
|
501
|
+
}
|
|
502
|
+
if (t1 > tmin)
|
|
503
|
+
tmin = t1;
|
|
504
|
+
if (t2 < tmax)
|
|
505
|
+
tmax = t2;
|
|
506
|
+
}
|
|
507
|
+
else if (oy < box.minY || oy > box.maxY) {
|
|
508
|
+
return -1;
|
|
509
|
+
}
|
|
510
|
+
if (dz !== 0) {
|
|
511
|
+
const inv = 1 / dz;
|
|
512
|
+
let t1 = (box.minZ - oz) * inv;
|
|
513
|
+
let t2 = (box.maxZ - oz) * inv;
|
|
514
|
+
if (t1 > t2) {
|
|
515
|
+
const t = t1;
|
|
516
|
+
t1 = t2;
|
|
517
|
+
t2 = t;
|
|
518
|
+
}
|
|
519
|
+
if (t1 > tmin)
|
|
520
|
+
tmin = t1;
|
|
521
|
+
if (t2 < tmax)
|
|
522
|
+
tmax = t2;
|
|
523
|
+
}
|
|
524
|
+
else if (oz < box.minZ || oz > box.maxZ) {
|
|
525
|
+
return -1;
|
|
526
|
+
}
|
|
527
|
+
if (tmax < tmin || tmax < 0)
|
|
528
|
+
return -1;
|
|
529
|
+
return tmin > 0 ? tmin : 0;
|
|
530
|
+
}
|
|
531
|
+
// Removes an object from every cell its stored AABB covered and drops now-empty cells. The occupied
|
|
532
|
+
// cell range is intentionally not shrunk (only reset when the grid fully empties). A no-op for an
|
|
533
|
+
// unknown id. Overflowed and declined ids leave through their own sets without a cell walk — remove
|
|
534
|
+
// re-derives the cell range from the stored bounds, so an overflowed object taking the ordinary path
|
|
535
|
+
// here would reintroduce exactly the unbounded walk the insert bound removed.
|
|
536
|
+
function _removeFromGrid3D(grid, id) {
|
|
537
|
+
grid.declined.delete(id);
|
|
538
|
+
const bounds = grid.bounds.get(id);
|
|
539
|
+
if (bounds === undefined)
|
|
540
|
+
return;
|
|
541
|
+
if (grid.overflow.delete(id)) {
|
|
542
|
+
grid.bounds.delete(id);
|
|
543
|
+
return;
|
|
544
|
+
}
|
|
545
|
+
const cs = grid.cellSize;
|
|
546
|
+
const cx0 = _cellIndex3D(bounds.minX, cs);
|
|
547
|
+
const cx1 = _cellIndex3D(bounds.maxX, cs);
|
|
548
|
+
const cy0 = _cellIndex3D(bounds.minY, cs);
|
|
549
|
+
const cy1 = _cellIndex3D(bounds.maxY, cs);
|
|
550
|
+
const cz0 = _cellIndex3D(bounds.minZ, cs);
|
|
551
|
+
const cz1 = _cellIndex3D(bounds.maxZ, cs);
|
|
552
|
+
for (let cz = cz0; cz <= cz1; cz++) {
|
|
553
|
+
for (let cy = cy0; cy <= cy1; cy++) {
|
|
554
|
+
for (let cx = cx0; cx <= cx1; cx++) {
|
|
555
|
+
const key = _cellKey3D(cx, cy, cz);
|
|
556
|
+
const cell = grid.cells.get(key);
|
|
557
|
+
if (cell === undefined)
|
|
558
|
+
continue;
|
|
559
|
+
cell.ids.delete(id);
|
|
560
|
+
if (cell.ids.size === 0)
|
|
561
|
+
grid.cells.delete(key);
|
|
562
|
+
}
|
|
563
|
+
}
|
|
564
|
+
}
|
|
565
|
+
grid.bounds.delete(id);
|
|
566
|
+
}
|
|
567
|
+
function _reportGrid3DIndexing(grid, id, mode, operation, reason, wouldOccupyBucketCount) {
|
|
568
|
+
reportSpatialIndexing({ cellSize: grid.cellSize, id, mode, operation, reason, wouldOccupyBucketCount });
|
|
569
|
+
}
|
|
570
|
+
// How many cells an AABB's span covers, as a count rather than a walk — the number the per-object
|
|
571
|
+
// budget is compared against, computed before any cell is touched. Returns NaN for bounds or a cell
|
|
572
|
+
// size that make the cell indices non-finite; callers test it with a negated `<=` so NaN falls to the
|
|
573
|
+
// bounded path rather than through it.
|
|
574
|
+
function _spannedCellCount3D(cellSize, aabb) {
|
|
575
|
+
const cx0 = _cellIndex3D(aabb.minX, cellSize);
|
|
576
|
+
const cx1 = _cellIndex3D(aabb.maxX, cellSize);
|
|
577
|
+
const cy0 = _cellIndex3D(aabb.minY, cellSize);
|
|
578
|
+
const cy1 = _cellIndex3D(aabb.maxY, cellSize);
|
|
579
|
+
const cz0 = _cellIndex3D(aabb.minZ, cellSize);
|
|
580
|
+
const cz1 = _cellIndex3D(aabb.maxZ, cellSize);
|
|
581
|
+
return (cx1 - cx0 + 1) * (cy1 - cy0 + 1) * (cz1 - cz0 + 1);
|
|
582
|
+
}
|
|
583
|
+
// Updates an object's private AABB copy without touching its cell sets when both the old and new
|
|
584
|
+
// bounds take the ordinary indexing path and cover exactly the same cells. Small per-frame movement
|
|
585
|
+
// usually stays inside this range, so its dominant cost becomes six field writes instead of a
|
|
586
|
+
// remove-and-reinsert walk. Every mode or range transition keeps using the shared slow path below.
|
|
587
|
+
function _updateGrid3DObject(grid, id, bounds) {
|
|
588
|
+
const wasMissing = !grid.bounds.has(id) && !grid.declined.has(id);
|
|
589
|
+
const previous = grid.bounds.get(id);
|
|
590
|
+
if (previous !== undefined &&
|
|
591
|
+
!grid.overflow.has(id) &&
|
|
592
|
+
Number.isFinite(bounds.minX) &&
|
|
593
|
+
Number.isFinite(bounds.minY) &&
|
|
594
|
+
Number.isFinite(bounds.minZ) &&
|
|
595
|
+
Number.isFinite(bounds.maxX) &&
|
|
596
|
+
Number.isFinite(bounds.maxY) &&
|
|
597
|
+
Number.isFinite(bounds.maxZ) &&
|
|
598
|
+
bounds.minX <= bounds.maxX &&
|
|
599
|
+
bounds.minY <= bounds.maxY &&
|
|
600
|
+
bounds.minZ <= bounds.maxZ) {
|
|
601
|
+
const cs = grid.cellSize;
|
|
602
|
+
const spanned = _spannedCellCount3D(cs, bounds);
|
|
603
|
+
if (spanned <= MAX_INDEXED_CELLS_PER_OBJECT &&
|
|
604
|
+
_cellIndex3D(previous.minX, cs) === _cellIndex3D(bounds.minX, cs) &&
|
|
605
|
+
_cellIndex3D(previous.minY, cs) === _cellIndex3D(bounds.minY, cs) &&
|
|
606
|
+
_cellIndex3D(previous.minZ, cs) === _cellIndex3D(bounds.minZ, cs) &&
|
|
607
|
+
_cellIndex3D(previous.maxX, cs) === _cellIndex3D(bounds.maxX, cs) &&
|
|
608
|
+
_cellIndex3D(previous.maxY, cs) === _cellIndex3D(bounds.maxY, cs) &&
|
|
609
|
+
_cellIndex3D(previous.maxZ, cs) === _cellIndex3D(bounds.maxZ, cs)) {
|
|
610
|
+
previous.minX = bounds.minX;
|
|
611
|
+
previous.minY = bounds.minY;
|
|
612
|
+
previous.minZ = bounds.minZ;
|
|
613
|
+
previous.maxX = bounds.maxX;
|
|
614
|
+
previous.maxY = bounds.maxY;
|
|
615
|
+
previous.maxZ = bounds.maxZ;
|
|
616
|
+
return true;
|
|
617
|
+
}
|
|
618
|
+
}
|
|
619
|
+
_removeFromGrid3D(grid, id);
|
|
620
|
+
const inserted = _insertIntoGrid3D(grid, id, bounds, 'update');
|
|
621
|
+
if (wasMissing) {
|
|
622
|
+
const explanation = _explainGrid3DIndexing(grid, id);
|
|
623
|
+
_reportGrid3DIndexing(grid, id, explanation.mode, 'update', 'missing-id', 0);
|
|
624
|
+
}
|
|
625
|
+
return inserted;
|
|
626
|
+
}
|
|
627
|
+
//# sourceMappingURL=uniformGrid3D.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"uniformGrid3D.js","sourceRoot":"","sources":["../src/uniformGrid3D.ts"],"names":[],"mappings":"AAYA,OAAO,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAC/D,OAAO,EAAE,4BAA4B,EAAE,MAAM,eAAe,CAAC;AAE7D,iGAAiG;AACjG,sGAAsG;AACtG,uGAAuG;AACvG,mGAAmG;AACnG,8FAA8F;AAC9F,yFAAyF;AACzF,EAAE;AACF,kGAAkG;AAClG,qGAAqG;AACrG,qGAAqG;AACrG,sGAAsG;AACtG,oGAAoG;AACpG,+FAA+F;AAC/F,2FAA2F;AAC3F,MAAM,UAAU,iCAAiC,CAAC,QAAgB;IAChE,MAAM,IAAI,GAAkB;QAC1B,QAAQ;QACR,KAAK,EAAE,IAAI,GAAG,EAAE;QAChB,MAAM,EAAE,IAAI,GAAG,EAAE;QACjB,QAAQ,EAAE,IAAI,GAAG,EAAE;QACnB,QAAQ,EAAE,IAAI,GAAG,EAAE;QACnB,QAAQ,EAAE,CAAC;QACX,QAAQ,EAAE,CAAC;QACX,QAAQ,EAAE,CAAC;QACX,QAAQ,EAAE,CAAC;QACX,QAAQ,EAAE,CAAC;QACX,QAAQ,EAAE,CAAC;QACX,IAAI,EAAE,IAAI,GAAG,EAAE;QACf,OAAO,EAAE,EAAE;KACZ,CAAC;IACF,OAAO;QACL,mBAAmB,CAAC,EAAE,EAAE,MAAM;YAC5B,OAAO,iBAAiB,CAAC,IAAI,EAAE,EAAE,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;QACvD,CAAC;QACD,mBAAmB,CAAC,EAAE,EAAE,MAAM;YAC5B,OAAO,mBAAmB,CAAC,IAAI,EAAE,EAAE,EAAE,MAAM,CAAC,CAAC;QAC/C,CAAC;QACD,mBAAmB,CAAC,EAAE;YACpB,MAAM,UAAU,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAClE,iBAAiB,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;YAC5B,IAAI,UAAU;gBAAE,qBAAqB,CAAC,IAAI,EAAE,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC;QACvF,CAAC;QACD,iBAAiB;YACf,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;YACnB,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;YACpB,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;YACtB,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;YACtB,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;YAClB,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;QAC1B,CAAC;QACD,sBAAsB,CAAC,EAAE;YACvB,OAAO,sBAAsB,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QAC1C,CAAC;QACD,iBAAiB,CAAC,GAAG;YACnB,iBAAiB,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QAC/B,CAAC;QACD,kBAAkB,CAAC,MAAM,EAAE,GAAG;YAC5B,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC;QACxC,CAAC;QACD,iBAAiB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG;YAC5B,iBAAiB,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC;QACxC,CAAC;QACD,eAAe,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG;YACtC,eAAe,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,CAAC;QAClD,CAAC;KACF,CAAC;AACJ,CAAC;AAqCD,mGAAmG;AACnG,gGAAgG;AAChG,SAAS,YAAY,CAAC,KAAa,EAAE,QAAgB;IACnD,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,QAAQ,CAAC,CAAC;AACtC,CAAC;AAED,iGAAiG;AACjG,+FAA+F;AAC/F,SAAS,UAAU,CAAC,EAAU,EAAE,EAAU,EAAE,EAAU;IACpD,OAAO,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC;AAC7B,CAAC;AAED,4FAA4F;AAC5F,SAAS,sBAAsB,CAAC,IAAmB,EAAE,EAAmB;IACtE,MAAM,aAAa,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC5C,IAAI,aAAa,KAAK,SAAS;QAAE,OAAO,EAAE,WAAW,EAAE,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,aAAa,EAAE,CAAC;IACxG,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QAAE,OAAO,EAAE,WAAW,EAAE,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;IACzF,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACnC,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO,EAAE,WAAW,EAAE,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;IACtF,OAAO,EAAE,WAAW,EAAE,mBAAmB,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;AACtG,CAAC;AAED,qGAAqG;AACrG,kGAAkG;AAClG,EAAE;AACF,sGAAsG;AACtG,qGAAqG;AACrG,qEAAqE;AACrE,SAAS,iBAAiB,CACxB,IAAmB,EACnB,EAAmB,EACnB,MAA+B,EAC/B,SAAmC;IAEnC,IACE,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC;QAC7B,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC;QAC7B,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC;QAC7B,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC;QAC7B,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC;QAC7B,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,EAC7B,CAAC;QACD,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,EAAE,mBAAmB,CAAC,CAAC;QAC3C,qBAAqB,CAAC,IAAI,EAAE,EAAE,EAAE,UAAU,EAAE,SAAS,EAAE,mBAAmB,EAAE,CAAC,CAAC,CAAC;QAC/E,OAAO,KAAK,CAAC;IACf,CAAC;IACD,IAAI,MAAM,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC;QACxF,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,EAAE,iBAAiB,CAAC,CAAC;QACzC,qBAAqB,CAAC,IAAI,EAAE,EAAE,EAAE,UAAU,EAAE,SAAS,EAAE,iBAAiB,EAAE,CAAC,CAAC,CAAC;QAC7E,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC;IACzB,MAAM,IAAI,GAAG;QACX,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,IAAI,EAAE,MAAM,CAAC,IAAI;KAClB,CAAC;IACF,IAAI,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;QACrC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;QAC1B,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACtB,qBAAqB,CAAC,IAAI,EAAE,EAAE,EAAE,UAAU,EAAE,SAAS,EAAE,mBAAmB,EAAE,CAAC,CAAC,CAAC;QAC/E,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,OAAO,GAAG,mBAAmB,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;IAC9C,kGAAkG;IAClG,6BAA6B;IAC7B,IAAI,CAAC,CAAC,OAAO,IAAI,4BAA4B,CAAC,EAAE,CAAC;QAC/C,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;QAC1B,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACtB,qBAAqB,CAAC,IAAI,EAAE,EAAE,EAAE,UAAU,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;QACtE,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,GAAG,GAAG,YAAY,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IACxC,MAAM,GAAG,GAAG,YAAY,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IACxC,MAAM,GAAG,GAAG,YAAY,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IACxC,MAAM,GAAG,GAAG,YAAY,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IACxC,MAAM,GAAG,GAAG,YAAY,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IACxC,MAAM,GAAG,GAAG,YAAY,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IACxC,+FAA+F;IAC/F,iDAAiD;IACjD,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,CAAC;IACvC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;IAC1B,KAAK,IAAI,EAAE,GAAG,GAAG,EAAE,EAAE,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,CAAC;QACnC,KAAK,IAAI,EAAE,GAAG,GAAG,EAAE,EAAE,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,CAAC;YACnC,KAAK,IAAI,EAAE,GAAG,GAAG,EAAE,EAAE,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,CAAC;gBACnC,MAAM,GAAG,GAAG,UAAU,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;gBACnC,IAAI,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;gBAC/B,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;oBACvB,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,IAAI,GAAG,EAAE,EAAE,CAAC;oBACtC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;gBAC5B,CAAC;gBACD,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACnB,CAAC;QACH,CAAC;IACH,CAAC;IACD,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,IAAI,CAAC,QAAQ,GAAG,GAAG,CAAC;QACpB,IAAI,CAAC,QAAQ,GAAG,GAAG,CAAC;QACpB,IAAI,CAAC,QAAQ,GAAG,GAAG,CAAC;QACpB,IAAI,CAAC,QAAQ,GAAG,GAAG,CAAC;QACpB,IAAI,CAAC,QAAQ,GAAG,GAAG,CAAC;QACpB,IAAI,CAAC,QAAQ,GAAG,GAAG,CAAC;IACtB,CAAC;SAAM,CAAC;QACN,IAAI,GAAG,GAAG,IAAI,CAAC,QAAQ;YAAE,IAAI,CAAC,QAAQ,GAAG,GAAG,CAAC;QAC7C,IAAI,GAAG,GAAG,IAAI,CAAC,QAAQ;YAAE,IAAI,CAAC,QAAQ,GAAG,GAAG,CAAC;QAC7C,IAAI,GAAG,GAAG,IAAI,CAAC,QAAQ;YAAE,IAAI,CAAC,QAAQ,GAAG,GAAG,CAAC;QAC7C,IAAI,GAAG,GAAG,IAAI,CAAC,QAAQ;YAAE,IAAI,CAAC,QAAQ,GAAG,GAAG,CAAC;QAC7C,IAAI,GAAG,GAAG,IAAI,CAAC,QAAQ;YAAE,IAAI,CAAC,QAAQ,GAAG,GAAG,CAAC;QAC7C,IAAI,GAAG,GAAG,IAAI,CAAC,QAAQ;YAAE,IAAI,CAAC,QAAQ,GAAG,GAAG,CAAC;IAC/C,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,4DAA4D;AAC5D,SAAS,6BAA6B,CAAC,IAA6B,EAAE,CAAS,EAAE,CAAS,EAAE,CAAS;IACnG,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;IACvB,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;IACvB,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;IACvB,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;IACvB,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;IACvB,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;IACvB,OAAO,CAAC,IAAI,IAAI,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,GAAG,IAAI,CAAC;AACjF,CAAC;AAED,uEAAuE;AACvE,SAAS,2BAA2B,CAAC,CAA0B,EAAE,CAA0B;IACzF,MAAM,KAAK,GAAG,CAAC,CAAC,IAAI,CAAC;IACrB,MAAM,KAAK,GAAG,CAAC,CAAC,IAAI,CAAC;IACrB,MAAM,KAAK,GAAG,CAAC,CAAC,IAAI,CAAC;IACrB,MAAM,KAAK,GAAG,CAAC,CAAC,IAAI,CAAC;IACrB,MAAM,KAAK,GAAG,CAAC,CAAC,IAAI,CAAC;IACrB,MAAM,KAAK,GAAG,CAAC,CAAC,IAAI,CAAC;IACrB,MAAM,KAAK,GAAG,CAAC,CAAC,IAAI,CAAC;IACrB,MAAM,KAAK,GAAG,CAAC,CAAC,IAAI,CAAC;IACrB,MAAM,KAAK,GAAG,CAAC,CAAC,IAAI,CAAC;IACrB,MAAM,KAAK,GAAG,CAAC,CAAC,IAAI,CAAC;IACrB,MAAM,KAAK,GAAG,CAAC,CAAC,IAAI,CAAC;IACrB,MAAM,KAAK,GAAG,CAAC,CAAC,IAAI,CAAC;IACrB,OAAO,KAAK,GAAG,KAAK,IAAI,KAAK,GAAG,KAAK,IAAI,KAAK,GAAG,KAAK,IAAI,KAAK,GAAG,KAAK,IAAI,KAAK,GAAG,KAAK,IAAI,KAAK,GAAG,KAAK,CAAC;AAC5G,CAAC;AAED,qGAAqG;AACrG,uGAAuG;AACvG,qGAAqG;AACrG,sGAAsG;AACtG,mDAAmD;AACnD,SAAS,yBAAyB,CAAC,IAAmB,EAAE,GAAkB,EAAE,OAAe;IACzF,KAAK,MAAM,EAAE,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;QAC/B,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACnC,IAAI,MAAM,KAAK,SAAS;YAAE,SAAS;QACnC,KAAK,MAAM,CAAC,OAAO,EAAE,WAAW,CAAC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YACjD,IAAI,OAAO,KAAK,EAAE;gBAAE,SAAS;YAC7B,8FAA8F;YAC9F,4FAA4F;YAC5F,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,OAAO,GAAG,EAAE;gBAAE,SAAS;YACzD,IAAI,CAAC,2BAA2B,CAAC,MAAM,EAAE,WAAW,CAAC;gBAAE,SAAS;YAChE,OAAO;gBACL,EAAE,GAAG,OAAO,CAAC,CAAC,CAAC,gBAAgB,CAAC,GAAG,EAAE,OAAO,EAAE,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,gBAAgB,CAAC,GAAG,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,CAAC,CAAC;QAC7G,CAAC;IACH,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,qGAAqG;AACrG,qGAAqG;AACrG,oGAAoG;AACpG,qGAAqG;AACrG,sGAAsG;AACtG,WAAW;AACX,SAAS,iBAAiB,CAAC,IAAmB,EAAE,GAAkB;IAChE,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,MAAM,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC;IACzB,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC;IAC1B,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC;QACvC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC;QACrB,IAAI,GAAG,CAAC,IAAI,GAAG,CAAC;YAAE,SAAS;QAC3B,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;QAChB,KAAK,MAAM,EAAE,IAAI,GAAG;YAAE,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACpC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACrC,KAAK,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBACzC,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;gBAChB,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;gBAChB,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;oBACV,MAAM,CAAC,GAAG,CAAC,CAAC;oBACZ,CAAC,GAAG,CAAC,CAAC;oBACN,CAAC,GAAG,CAAC,CAAC;gBACR,CAAC;gBACD,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;gBAC9B,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;gBAC9B,IAAI,EAAE,KAAK,SAAS,IAAI,EAAE,KAAK,SAAS;oBAAE,SAAS;gBACnD,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,EAAE,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC;gBAClF,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,EAAE,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC;gBAClF,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,EAAE,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC;gBAClF,IAAI,IAAI,CAAC,EAAE,KAAK,UAAU,IAAI,IAAI,CAAC,EAAE,KAAK,UAAU,IAAI,IAAI,CAAC,EAAE,KAAK,UAAU,EAAE,CAAC;oBAC/E,OAAO,GAAG,gBAAgB,CAAC,GAAG,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;gBACjD,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IACD,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,KAAK,CAAC;QAAE,OAAO,GAAG,yBAAyB,CAAC,IAAI,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC;IACtF,GAAG,CAAC,MAAM,GAAG,OAAO,CAAC;AACvB,CAAC;AAED,sGAAsG;AACtG,wGAAwG;AACxG,2CAA2C;AAC3C,SAAS,gBAAgB,CAAC,GAAkB,EAAE,KAAa,EAAE,CAAkB,EAAE,CAAkB;IACjG,MAAM,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC;IACxB,IAAI,IAAI,KAAK,SAAS;QAAE,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;SACtC,CAAC;QACJ,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;QACX,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;IACb,CAAC;IACD,OAAO,KAAK,GAAG,CAAC,CAAC;AACnB,CAAC;AAED,kGAAkG;AAClG,sGAAsG;AACtG,iGAAiG;AACjG,UAAU;AACV,SAAS,iBAAiB,CAAC,IAAmB,EAAE,CAAS,EAAE,CAAS,EAAE,CAAS,EAAE,GAAsB;IACrG,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC;IACf,MAAM,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC;IACzB,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,YAAY,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,YAAY,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;IACvG,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACvB,KAAK,MAAM,EAAE,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;YAC1B,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACnC,IAAI,MAAM,KAAK,SAAS,IAAI,6BAA6B,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;gBAAE,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC3F,CAAC;IACH,CAAC;IACD,KAAK,MAAM,EAAE,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;QAC/B,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACnC,IAAI,MAAM,KAAK,SAAS,IAAI,6BAA6B,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;YAAE,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC3F,CAAC;AACH,CAAC;AAED,iGAAiG;AACjG,mGAAmG;AACnG,+FAA+F;AAC/F,uFAAuF;AACvF,SAAS,eAAe,CACtB,IAAmB,EACnB,EAAU,EACV,EAAU,EACV,EAAU,EACV,EAAU,EACV,EAAU,EACV,EAAU,EACV,GAAsB;IAEtB,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC;IACf,MAAM,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC;IACzB,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;IACvB,IAAI,CAAC,KAAK,EAAE,CAAC;IACb,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,CAAC;QACrC,iBAAiB,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,CAAC;QACzC,OAAO;IACT,CAAC;IACD,+FAA+F;IAC/F,+FAA+F;IAC/F,KAAK,MAAM,EAAE,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;QAC/B,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACnC,IAAI,MAAM,KAAK,SAAS,IAAI,eAAe,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,IAAI,CAAC;YAAE,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjG,CAAC;IACD,mGAAmG;IACnG,iGAAiG;IACjG,qGAAqG;IACrG,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC;QAAE,OAAO;IAClC,MAAM,WAAW,GAAkB;QACjC,IAAI,EAAE,IAAI,CAAC,QAAQ,GAAG,EAAE;QACxB,IAAI,EAAE,IAAI,CAAC,QAAQ,GAAG,EAAE;QACxB,IAAI,EAAE,IAAI,CAAC,QAAQ,GAAG,EAAE;QACxB,IAAI,EAAE,CAAC,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC,GAAG,EAAE;QAC9B,IAAI,EAAE,CAAC,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC,GAAG,EAAE;QAC9B,IAAI,EAAE,CAAC,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC,GAAG,EAAE;KAC/B,CAAC;IACF,MAAM,MAAM,GAAG,eAAe,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,WAAW,CAAC,CAAC;IACpE,IAAI,MAAM,GAAG,CAAC;QAAE,OAAO;IACvB,IAAI,EAAE,GAAG,YAAY,CAAC,EAAE,GAAG,MAAM,GAAG,EAAE,EAAE,EAAE,CAAC,CAAC;IAC5C,IAAI,EAAE,GAAG,YAAY,CAAC,EAAE,GAAG,MAAM,GAAG,EAAE,EAAE,EAAE,CAAC,CAAC;IAC5C,IAAI,EAAE,GAAG,YAAY,CAAC,EAAE,GAAG,MAAM,GAAG,EAAE,EAAE,EAAE,CAAC,CAAC;IAC5C,IAAI,EAAE,GAAG,IAAI,CAAC,QAAQ;QAAE,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC;SACtC,IAAI,EAAE,GAAG,IAAI,CAAC,QAAQ;QAAE,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC;IAChD,IAAI,EAAE,GAAG,IAAI,CAAC,QAAQ;QAAE,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC;SACtC,IAAI,EAAE,GAAG,IAAI,CAAC,QAAQ;QAAE,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC;IAChD,IAAI,EAAE,GAAG,IAAI,CAAC,QAAQ;QAAE,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC;SACtC,IAAI,EAAE,GAAG,IAAI,CAAC,QAAQ;QAAE,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC;IAChD,MAAM,KAAK,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3C,MAAM,KAAK,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3C,MAAM,KAAK,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3C,IAAI,KAAK,GAAG,QAAQ,CAAC;IACrB,IAAI,OAAO,GAAG,QAAQ,CAAC;IACvB,IAAI,KAAK,KAAK,CAAC,EAAE,CAAC;QAChB,KAAK,GAAG,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC;QAC1D,OAAO,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC9B,CAAC;IACD,IAAI,KAAK,GAAG,QAAQ,CAAC;IACrB,IAAI,OAAO,GAAG,QAAQ,CAAC;IACvB,IAAI,KAAK,KAAK,CAAC,EAAE,CAAC;QAChB,KAAK,GAAG,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC;QAC1D,OAAO,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC9B,CAAC;IACD,IAAI,KAAK,GAAG,QAAQ,CAAC;IACrB,IAAI,OAAO,GAAG,QAAQ,CAAC;IACvB,IAAI,KAAK,KAAK,CAAC,EAAE,CAAC;QAChB,KAAK,GAAG,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC;QAC1D,OAAO,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC9B,CAAC;IACD,MAAM,QAAQ,GACZ,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,GAAG,CAAC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;IACxG,KAAK,IAAI,IAAI,GAAG,CAAC,EAAE,IAAI,IAAI,QAAQ,EAAE,IAAI,EAAE,EAAE,CAAC;QAC5C,IACE,EAAE,GAAG,IAAI,CAAC,QAAQ;YAClB,EAAE,GAAG,IAAI,CAAC,QAAQ;YAClB,EAAE,GAAG,IAAI,CAAC,QAAQ;YAClB,EAAE,GAAG,IAAI,CAAC,QAAQ;YAClB,EAAE,GAAG,IAAI,CAAC,QAAQ;YAClB,EAAE,GAAG,IAAI,CAAC,QAAQ,EAClB,CAAC;YACD,MAAM;QACR,CAAC;QACD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;QACpD,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YACvB,KAAK,MAAM,EAAE,IAAI,IAAI,CAAC,GAAG;gBAAE,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC1C,CAAC;QACD,IAAI,KAAK,GAAG,KAAK,IAAI,KAAK,GAAG,KAAK,EAAE,CAAC;YACnC,EAAE,IAAI,KAAK,CAAC;YACZ,KAAK,IAAI,OAAO,CAAC;QACnB,CAAC;aAAM,IAAI,KAAK,GAAG,KAAK,EAAE,CAAC;YACzB,EAAE,IAAI,KAAK,CAAC;YACZ,KAAK,IAAI,OAAO,CAAC;QACnB,CAAC;aAAM,CAAC;YACN,EAAE,IAAI,KAAK,CAAC;YACZ,KAAK,IAAI,OAAO,CAAC;QACnB,CAAC;IACH,CAAC;IACD,KAAK,MAAM,EAAE,IAAI,IAAI,EAAE,CAAC;QACtB,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACnC,IAAI,MAAM,KAAK,SAAS,IAAI,eAAe,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,IAAI,CAAC;YAAE,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjG,CAAC;AACH,CAAC;AAED,kGAAkG;AAClG,qGAAqG;AACrG,uEAAuE;AACvE,EAAE;AACF,sGAAsG;AACtG,kGAAkG;AAClG,sGAAsG;AACtG,uGAAuG;AACvG,mCAAmC;AACnC,SAAS,kBAAkB,CAAC,IAAmB,EAAE,MAA+B,EAAE,GAAsB;IACtG,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC;IACf,MAAM,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC;IACzB,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;IACvB,IAAI,CAAC,KAAK,EAAE,CAAC;IAEb,IAAI,CAAC,CAAC,mBAAmB,CAAC,EAAE,EAAE,MAAM,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QAC1D,KAAK,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YACvC,IAAI,2BAA2B,CAAC,MAAM,EAAE,MAAM,CAAC;gBAAE,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAChE,CAAC;QACD,OAAO;IACT,CAAC;IAED,MAAM,GAAG,GAAG,YAAY,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IAC1C,MAAM,GAAG,GAAG,YAAY,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IAC1C,MAAM,GAAG,GAAG,YAAY,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IAC1C,MAAM,GAAG,GAAG,YAAY,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IAC1C,MAAM,GAAG,GAAG,YAAY,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IAC1C,MAAM,GAAG,GAAG,YAAY,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IAC1C,KAAK,IAAI,EAAE,GAAG,GAAG,EAAE,EAAE,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,CAAC;QACnC,KAAK,IAAI,EAAE,GAAG,GAAG,EAAE,EAAE,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,CAAC;YACnC,KAAK,IAAI,EAAE,GAAG,GAAG,EAAE,EAAE,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,CAAC;gBACnC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;gBACpD,IAAI,IAAI,KAAK,SAAS;oBAAE,SAAS;gBACjC,KAAK,MAAM,EAAE,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;oBAC1B,IAAI,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;wBAAE,SAAS;oBAC3B,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;oBACb,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;oBACnC,IAAI,MAAM,KAAK,SAAS,IAAI,2BAA2B,CAAC,MAAM,EAAE,MAAM,CAAC;wBAAE,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBACxF,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IACD,KAAK,MAAM,EAAE,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;QAC/B,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACnC,IAAI,MAAM,KAAK,SAAS,IAAI,2BAA2B,CAAC,MAAM,EAAE,MAAM,CAAC;YAAE,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACxF,CAAC;AACH,CAAC;AAED,uGAAuG;AACvG,sGAAsG;AACtG,yEAAyE;AACzE,SAAS,eAAe,CACtB,EAAU,EACV,EAAU,EACV,EAAU,EACV,EAAU,EACV,EAAU,EACV,EAAU,EACV,GAA4B;IAE5B,IAAI,IAAI,GAAG,CAAC,QAAQ,CAAC;IACrB,IAAI,IAAI,GAAG,QAAQ,CAAC;IACpB,IAAI,EAAE,KAAK,CAAC,EAAE,CAAC;QACb,MAAM,GAAG,GAAG,CAAC,GAAG,EAAE,CAAC;QACnB,IAAI,EAAE,GAAG,CAAC,GAAG,CAAC,IAAI,GAAG,EAAE,CAAC,GAAG,GAAG,CAAC;QAC/B,IAAI,EAAE,GAAG,CAAC,GAAG,CAAC,IAAI,GAAG,EAAE,CAAC,GAAG,GAAG,CAAC;QAC/B,IAAI,EAAE,GAAG,EAAE,EAAE,CAAC;YACZ,MAAM,CAAC,GAAG,EAAE,CAAC;YACb,EAAE,GAAG,EAAE,CAAC;YACR,EAAE,GAAG,CAAC,CAAC;QACT,CAAC;QACD,IAAI,EAAE,GAAG,IAAI;YAAE,IAAI,GAAG,EAAE,CAAC;QACzB,IAAI,EAAE,GAAG,IAAI;YAAE,IAAI,GAAG,EAAE,CAAC;IAC3B,CAAC;SAAM,IAAI,EAAE,GAAG,GAAG,CAAC,IAAI,IAAI,EAAE,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;QAC1C,OAAO,CAAC,CAAC,CAAC;IACZ,CAAC;IACD,IAAI,EAAE,KAAK,CAAC,EAAE,CAAC;QACb,MAAM,GAAG,GAAG,CAAC,GAAG,EAAE,CAAC;QACnB,IAAI,EAAE,GAAG,CAAC,GAAG,CAAC,IAAI,GAAG,EAAE,CAAC,GAAG,GAAG,CAAC;QAC/B,IAAI,EAAE,GAAG,CAAC,GAAG,CAAC,IAAI,GAAG,EAAE,CAAC,GAAG,GAAG,CAAC;QAC/B,IAAI,EAAE,GAAG,EAAE,EAAE,CAAC;YACZ,MAAM,CAAC,GAAG,EAAE,CAAC;YACb,EAAE,GAAG,EAAE,CAAC;YACR,EAAE,GAAG,CAAC,CAAC;QACT,CAAC;QACD,IAAI,EAAE,GAAG,IAAI;YAAE,IAAI,GAAG,EAAE,CAAC;QACzB,IAAI,EAAE,GAAG,IAAI;YAAE,IAAI,GAAG,EAAE,CAAC;IAC3B,CAAC;SAAM,IAAI,EAAE,GAAG,GAAG,CAAC,IAAI,IAAI,EAAE,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;QAC1C,OAAO,CAAC,CAAC,CAAC;IACZ,CAAC;IACD,IAAI,EAAE,KAAK,CAAC,EAAE,CAAC;QACb,MAAM,GAAG,GAAG,CAAC,GAAG,EAAE,CAAC;QACnB,IAAI,EAAE,GAAG,CAAC,GAAG,CAAC,IAAI,GAAG,EAAE,CAAC,GAAG,GAAG,CAAC;QAC/B,IAAI,EAAE,GAAG,CAAC,GAAG,CAAC,IAAI,GAAG,EAAE,CAAC,GAAG,GAAG,CAAC;QAC/B,IAAI,EAAE,GAAG,EAAE,EAAE,CAAC;YACZ,MAAM,CAAC,GAAG,EAAE,CAAC;YACb,EAAE,GAAG,EAAE,CAAC;YACR,EAAE,GAAG,CAAC,CAAC;QACT,CAAC;QACD,IAAI,EAAE,GAAG,IAAI;YAAE,IAAI,GAAG,EAAE,CAAC;QACzB,IAAI,EAAE,GAAG,IAAI;YAAE,IAAI,GAAG,EAAE,CAAC;IAC3B,CAAC;SAAM,IAAI,EAAE,GAAG,GAAG,CAAC,IAAI,IAAI,EAAE,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;QAC1C,OAAO,CAAC,CAAC,CAAC;IACZ,CAAC;IACD,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,CAAC;QAAE,OAAO,CAAC,CAAC,CAAC;IACvC,OAAO,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;AAC7B,CAAC;AAED,oGAAoG;AACpG,kGAAkG;AAClG,oGAAoG;AACpG,qGAAqG;AACrG,8EAA8E;AAC9E,SAAS,iBAAiB,CAAC,IAAmB,EAAE,EAAmB;IACjE,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IACzB,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACnC,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO;IACjC,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC;QAC7B,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACvB,OAAO;IACT,CAAC;IACD,MAAM,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC;IACzB,MAAM,GAAG,GAAG,YAAY,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IAC1C,MAAM,GAAG,GAAG,YAAY,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IAC1C,MAAM,GAAG,GAAG,YAAY,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IAC1C,MAAM,GAAG,GAAG,YAAY,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IAC1C,MAAM,GAAG,GAAG,YAAY,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IAC1C,MAAM,GAAG,GAAG,YAAY,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IAC1C,KAAK,IAAI,EAAE,GAAG,GAAG,EAAE,EAAE,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,CAAC;QACnC,KAAK,IAAI,EAAE,GAAG,GAAG,EAAE,EAAE,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,CAAC;YACnC,KAAK,IAAI,EAAE,GAAG,GAAG,EAAE,EAAE,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,CAAC;gBACnC,MAAM,GAAG,GAAG,UAAU,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;gBACnC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;gBACjC,IAAI,IAAI,KAAK,SAAS;oBAAE,SAAS;gBACjC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;gBACpB,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC;oBAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAClD,CAAC;QACH,CAAC;IACH,CAAC;IACD,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;AACzB,CAAC;AAED,SAAS,qBAAqB,CAC5B,IAA6B,EAC7B,EAAmB,EACnB,IAAyB,EACzB,SAAmC,EACnC,MAAoC,EACpC,sBAA8B;IAE9B,qBAAqB,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,sBAAsB,EAAE,CAAC,CAAC;AAC1G,CAAC;AAED,kGAAkG;AAClG,oGAAoG;AACpG,sGAAsG;AACtG,uCAAuC;AACvC,SAAS,mBAAmB,CAAC,QAAgB,EAAE,IAA6B;IAC1E,MAAM,GAAG,GAAG,YAAY,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IAC9C,MAAM,GAAG,GAAG,YAAY,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IAC9C,MAAM,GAAG,GAAG,YAAY,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IAC9C,MAAM,GAAG,GAAG,YAAY,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IAC9C,MAAM,GAAG,GAAG,YAAY,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IAC9C,MAAM,GAAG,GAAG,YAAY,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IAC9C,OAAO,CAAC,GAAG,GAAG,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC;AAC7D,CAAC;AAED,iGAAiG;AACjG,oGAAoG;AACpG,8FAA8F;AAC9F,mGAAmG;AACnG,SAAS,mBAAmB,CAAC,IAAmB,EAAE,EAAmB,EAAE,MAA+B;IACpG,MAAM,UAAU,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAClE,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACrC,IACE,QAAQ,KAAK,SAAS;QACtB,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QACtB,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC;QAC5B,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC;QAC5B,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC;QAC5B,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC;QAC5B,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC;QAC5B,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC;QAC5B,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,IAAI;QAC1B,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,IAAI;QAC1B,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,IAAI,EAC1B,CAAC;QACD,MAAM,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC;QACzB,MAAM,OAAO,GAAG,mBAAmB,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;QAChD,IACE,OAAO,IAAI,4BAA4B;YACvC,YAAY,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,YAAY,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC;YACjE,YAAY,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,YAAY,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC;YACjE,YAAY,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,YAAY,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC;YACjE,YAAY,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,YAAY,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC;YACjE,YAAY,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,YAAY,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC;YACjE,YAAY,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,YAAY,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,EACjE,CAAC;YACD,QAAQ,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;YAC5B,QAAQ,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;YAC5B,QAAQ,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;YAC5B,QAAQ,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;YAC5B,QAAQ,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;YAC5B,QAAQ,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;YAC5B,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IACD,iBAAiB,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IAC5B,MAAM,QAAQ,GAAG,iBAAiB,CAAC,IAAI,EAAE,EAAE,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;IAC/D,IAAI,UAAU,EAAE,CAAC;QACf,MAAM,WAAW,GAAG,sBAAsB,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QACrD,qBAAqB,CAAC,IAAI,EAAE,EAAE,EAAE,WAAW,CAAC,IAAI,EAAE,QAAQ,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC;IAC/E,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC"}
|