@zephyr3d/device 0.2.4 → 0.2.6
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/base_types.js +19 -79
- package/dist/base_types.js.map +1 -1
- package/dist/builder/ast.js +142 -162
- package/dist/builder/ast.js.map +1 -1
- package/dist/builder/base.js +29 -27
- package/dist/builder/base.js.map +1 -1
- package/dist/builder/builtinfunc.js +61 -7
- package/dist/builder/builtinfunc.js.map +1 -1
- package/dist/builder/constructors.js +3 -1
- package/dist/builder/constructors.js.map +1 -1
- package/dist/builder/errors.js +11 -11
- package/dist/builder/errors.js.map +1 -1
- package/dist/builder/misc.js +10 -0
- package/dist/builder/misc.js.map +1 -0
- package/dist/builder/programbuilder.js +62 -58
- package/dist/builder/programbuilder.js.map +1 -1
- package/dist/builder/reflection.js +1 -1
- package/dist/builder/reflection.js.map +1 -1
- package/dist/builder/types.js +76 -75
- package/dist/builder/types.js.map +1 -1
- package/dist/device.js +220 -80
- package/dist/device.js.map +1 -1
- package/dist/gpuobject.js +84 -25
- package/dist/gpuobject.js.map +1 -1
- package/dist/helpers/drawtext.js +30 -25
- package/dist/helpers/drawtext.js.map +1 -1
- package/dist/helpers/font.js +1 -0
- package/dist/helpers/font.js.map +1 -1
- package/dist/helpers/glyphmanager.js +33 -15
- package/dist/helpers/glyphmanager.js.map +1 -1
- package/dist/helpers/textureatlas.js +10 -8
- package/dist/helpers/textureatlas.js.map +1 -1
- package/dist/index.d.ts +465 -394
- package/dist/index.js +6 -5
- package/dist/index.js.map +1 -1
- package/dist/pool.js +69 -31
- package/dist/pool.js.map +1 -1
- package/dist/timer.js +3 -2
- package/dist/timer.js.map +1 -1
- package/dist/uniformdata.js +3 -3
- package/dist/uniformdata.js.map +1 -1
- package/dist/vertexdata.js +29 -3
- package/dist/vertexdata.js.map +1 -1
- package/package.json +80 -65
package/dist/device.js
CHANGED
|
@@ -1,17 +1,119 @@
|
|
|
1
|
+
import { Observable } from '@zephyr3d/base';
|
|
1
2
|
import { CPUTimer } from './timer.js';
|
|
2
|
-
import { getVertexAttribFormat,
|
|
3
|
-
import './
|
|
4
|
-
import './builder/types.js';
|
|
3
|
+
import { getVertexAttribFormat, makeVertexBufferType, getVertexFormatSize, GPUResourceUsageFlags } from './gpuobject.js';
|
|
4
|
+
import { Pool } from './pool.js';
|
|
5
5
|
import { ProgramBuilder } from './builder/programbuilder.js';
|
|
6
|
-
import { DeviceGPUObjectAddedEvent, DeviceGPUObjectRemovedEvent, DeviceResizeEvent } from './base_types.js';
|
|
7
|
-
import '@zephyr3d/base';
|
|
8
6
|
import { DrawText } from './helpers/drawtext.js';
|
|
9
|
-
import { Pool } from './pool.js';
|
|
10
7
|
|
|
8
|
+
class ResizeHandler {
|
|
9
|
+
_canvas;
|
|
10
|
+
_dpr;
|
|
11
|
+
_cssWidth;
|
|
12
|
+
_cssHeight;
|
|
13
|
+
_deviceWidth;
|
|
14
|
+
_deviceHeight;
|
|
15
|
+
_resizeObserver;
|
|
16
|
+
_mutationObserver;
|
|
17
|
+
_onResizeCallback;
|
|
18
|
+
constructor(canvas, onResize, dpr){
|
|
19
|
+
this._canvas = canvas;
|
|
20
|
+
this._dpr = dpr;
|
|
21
|
+
this._cssWidth = 0;
|
|
22
|
+
this._cssHeight = 0;
|
|
23
|
+
this._deviceWidth = 0;
|
|
24
|
+
this._deviceHeight = 0;
|
|
25
|
+
this._onResizeCallback = onResize;
|
|
26
|
+
}
|
|
27
|
+
init() {
|
|
28
|
+
const canvas = this._canvas;
|
|
29
|
+
if (window.ResizeObserver) {
|
|
30
|
+
this._resizeObserver = new ResizeObserver((entries)=>{
|
|
31
|
+
const entry = entries[0];
|
|
32
|
+
this._handleResizeEntry(entry);
|
|
33
|
+
});
|
|
34
|
+
try {
|
|
35
|
+
this._resizeObserver.observe(canvas, {
|
|
36
|
+
box: 'device-pixel-content-box'
|
|
37
|
+
});
|
|
38
|
+
} catch {
|
|
39
|
+
this._resizeObserver.observe(canvas);
|
|
40
|
+
}
|
|
41
|
+
} else {
|
|
42
|
+
if (window.MutationObserver) {
|
|
43
|
+
this._mutationObserver = new MutationObserver((mutations)=>{
|
|
44
|
+
if (mutations.length > 0) {
|
|
45
|
+
this._handleLegacyResize();
|
|
46
|
+
}
|
|
47
|
+
});
|
|
48
|
+
this._mutationObserver.observe(canvas, {
|
|
49
|
+
attributes: true,
|
|
50
|
+
attributeFilter: [
|
|
51
|
+
'style'
|
|
52
|
+
]
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
window.addEventListener('resize', this._handleLegacyResize);
|
|
56
|
+
this._handleLegacyResize();
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
_handleResizeEntry(_entry) {
|
|
60
|
+
// CSS pixel
|
|
61
|
+
const cssWidth = this._canvas.clientWidth;
|
|
62
|
+
const cssHeight = this._canvas.clientHeight;
|
|
63
|
+
// Device pixel
|
|
64
|
+
/*
|
|
65
|
+
let deviceWidth: number;
|
|
66
|
+
let deviceHeight: number;
|
|
67
|
+
|
|
68
|
+
const dpBox = (entry as any).devicePixelContentBoxSize?.[0];
|
|
69
|
+
if (dpBox) {
|
|
70
|
+
deviceWidth = dpBox.inlineSize;
|
|
71
|
+
deviceHeight = dpBox.blockSize;
|
|
72
|
+
} else {
|
|
73
|
+
deviceWidth = Math.round(cssWidth * this._dpr);
|
|
74
|
+
deviceHeight = Math.round(cssHeight * this._dpr);
|
|
75
|
+
}
|
|
76
|
+
*/ const deviceWidth = cssWidth * this._dpr;
|
|
77
|
+
const deviceHeight = cssHeight * this._dpr;
|
|
78
|
+
if (cssWidth === this._cssWidth && cssHeight === this._cssHeight && deviceWidth === this._deviceWidth && deviceHeight === this._deviceHeight) {
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
this._cssWidth = cssWidth;
|
|
82
|
+
this._cssHeight = cssHeight;
|
|
83
|
+
this._deviceWidth = deviceWidth;
|
|
84
|
+
this._deviceHeight = deviceHeight;
|
|
85
|
+
this._onResizeCallback(cssWidth, cssHeight, deviceWidth, deviceHeight);
|
|
86
|
+
}
|
|
87
|
+
_handleLegacyResize = ()=>{
|
|
88
|
+
const cssWidth = this._canvas.clientWidth;
|
|
89
|
+
const cssHeight = this._canvas.clientHeight;
|
|
90
|
+
const dpr = window.devicePixelRatio || 1;
|
|
91
|
+
const deviceWidth = Math.round(cssWidth * dpr);
|
|
92
|
+
const deviceHeight = Math.round(cssHeight * dpr);
|
|
93
|
+
if (cssWidth === this._cssWidth && cssHeight === this._cssHeight && deviceWidth === this._deviceWidth && deviceHeight === this._deviceHeight) {
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
this._cssWidth = cssWidth;
|
|
97
|
+
this._cssHeight = cssHeight;
|
|
98
|
+
this._deviceWidth = deviceWidth;
|
|
99
|
+
this._deviceHeight = deviceHeight;
|
|
100
|
+
this._onResizeCallback(cssWidth, cssHeight, deviceWidth, deviceHeight);
|
|
101
|
+
};
|
|
102
|
+
dispose() {
|
|
103
|
+
if (this._resizeObserver) {
|
|
104
|
+
this._resizeObserver.disconnect();
|
|
105
|
+
}
|
|
106
|
+
if (this._mutationObserver) {
|
|
107
|
+
this._mutationObserver.disconnect();
|
|
108
|
+
}
|
|
109
|
+
window.removeEventListener('resize', this._handleLegacyResize);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
11
112
|
/**
|
|
12
113
|
* Base class for rendering device
|
|
13
114
|
* @public
|
|
14
|
-
*/ class BaseDevice {
|
|
115
|
+
*/ class BaseDevice extends Observable {
|
|
116
|
+
_dpr;
|
|
15
117
|
_canvas;
|
|
16
118
|
_canvasClientWidth;
|
|
17
119
|
_canvasClientHeight;
|
|
@@ -29,11 +131,15 @@ import { Pool } from './pool.js';
|
|
|
29
131
|
_backend;
|
|
30
132
|
_beginFrameCounter;
|
|
31
133
|
_programBuilder;
|
|
32
|
-
|
|
134
|
+
_poolMap;
|
|
135
|
+
_defaultPoolKey;
|
|
33
136
|
_temporalFramebuffer;
|
|
34
137
|
_vSync;
|
|
138
|
+
_resizer;
|
|
35
139
|
_stateStack;
|
|
36
|
-
constructor(cvs, backend){
|
|
140
|
+
constructor(cvs, backend, dpr){
|
|
141
|
+
super();
|
|
142
|
+
this._dpr = dpr ?? window.devicePixelRatio ?? 1;
|
|
37
143
|
this._backend = backend;
|
|
38
144
|
this._gpuObjectList = {
|
|
39
145
|
textures: [],
|
|
@@ -76,10 +182,22 @@ import { Pool } from './pool.js';
|
|
|
76
182
|
};
|
|
77
183
|
this._stateStack = [];
|
|
78
184
|
this._beginFrameCounter = 0;
|
|
79
|
-
this.
|
|
185
|
+
this._poolMap = new Map();
|
|
186
|
+
this._defaultPoolKey = Symbol('defaultPool');
|
|
187
|
+
this._poolMap.set(this._defaultPoolKey, new Pool(this, this._defaultPoolKey));
|
|
188
|
+
this._temporalFramebuffer = false;
|
|
80
189
|
this._temporalFramebuffer = false;
|
|
81
190
|
this._vSync = true;
|
|
82
|
-
this._registerEventHandlers();
|
|
191
|
+
//this._registerEventHandlers();
|
|
192
|
+
this._resizer = new ResizeHandler(this._canvas, (cssWidth, cssHeight, deviceWidth, deviceHeight)=>{
|
|
193
|
+
this.dispatchEvent('resize', cssWidth, cssHeight, deviceWidth, deviceHeight);
|
|
194
|
+
}, this._dpr);
|
|
195
|
+
}
|
|
196
|
+
getScaleX() {
|
|
197
|
+
return this._canvas.width / this._canvas.clientWidth;
|
|
198
|
+
}
|
|
199
|
+
getScaleY() {
|
|
200
|
+
return this._canvas.height / this._canvas.clientHeight;
|
|
83
201
|
}
|
|
84
202
|
get backend() {
|
|
85
203
|
return this._backend;
|
|
@@ -106,7 +224,7 @@ import { Pool } from './pool.js';
|
|
|
106
224
|
this._vSync = !!val;
|
|
107
225
|
}
|
|
108
226
|
get pool() {
|
|
109
|
-
return this.
|
|
227
|
+
return this._poolMap.get(this._defaultPoolKey);
|
|
110
228
|
}
|
|
111
229
|
get runLoopFunction() {
|
|
112
230
|
return this._runLoopFunc;
|
|
@@ -114,11 +232,22 @@ import { Pool } from './pool.js';
|
|
|
114
232
|
get programBuilder() {
|
|
115
233
|
return this._programBuilder;
|
|
116
234
|
}
|
|
235
|
+
poolExists(key) {
|
|
236
|
+
return this._poolMap.has(key);
|
|
237
|
+
}
|
|
238
|
+
getPool(key) {
|
|
239
|
+
let pool = this._poolMap.get(key);
|
|
240
|
+
if (!pool) {
|
|
241
|
+
pool = new Pool(this, key);
|
|
242
|
+
this._poolMap.set(key, pool);
|
|
243
|
+
}
|
|
244
|
+
return pool;
|
|
245
|
+
}
|
|
117
246
|
setFont(fontName) {
|
|
118
247
|
DrawText.setFont(this, fontName);
|
|
119
248
|
}
|
|
120
|
-
drawText(text, x, y, color) {
|
|
121
|
-
DrawText.drawText(this, text, color, x, y);
|
|
249
|
+
drawText(text, x, y, color, viewport) {
|
|
250
|
+
DrawText.drawText(this, text, color, x, y, viewport);
|
|
122
251
|
}
|
|
123
252
|
setFramebuffer(colorOrRT, depth, sampleCount) {
|
|
124
253
|
let newRT = null;
|
|
@@ -126,20 +255,13 @@ import { Pool } from './pool.js';
|
|
|
126
255
|
if (!Array.isArray(colorOrRT)) {
|
|
127
256
|
newRT = colorOrRT ?? null;
|
|
128
257
|
} else {
|
|
129
|
-
|
|
130
|
-
newRT = this._pool.createTemporalFramebuffer(false, colorAttachments, depth, sampleCount, true);
|
|
131
|
-
for(let i = 0; i < colorOrRT.length; i++){
|
|
132
|
-
const rt = colorOrRT[i];
|
|
133
|
-
newRT.setColorAttachmentMipLevel(i, rt.texture ? rt.miplevel ?? 0 : 0);
|
|
134
|
-
newRT.setColorAttachmentLayer(i, rt.texture ? rt.face ?? 0 : 0);
|
|
135
|
-
newRT.setColorAttachmentCubeFace(i, rt.texture ? rt.layer ?? 0 : 0);
|
|
136
|
-
}
|
|
258
|
+
newRT = this.pool.fetchTemporalFramebuffer(false, 0, 0, colorOrRT, depth, true, sampleCount);
|
|
137
259
|
temporal = true;
|
|
138
260
|
}
|
|
139
261
|
const currentRT = this.getFramebuffer();
|
|
140
262
|
if (currentRT !== newRT) {
|
|
141
|
-
if (this._temporalFramebuffer) {
|
|
142
|
-
this.
|
|
263
|
+
if (this._temporalFramebuffer && currentRT) {
|
|
264
|
+
this.pool.releaseFrameBuffer(currentRT);
|
|
143
265
|
}
|
|
144
266
|
this._temporalFramebuffer = temporal;
|
|
145
267
|
this._setFramebuffer(newRT);
|
|
@@ -150,22 +272,17 @@ import { Pool } from './pool.js';
|
|
|
150
272
|
if (remove) {
|
|
151
273
|
this.removeGPUObject(obj);
|
|
152
274
|
}
|
|
153
|
-
if (
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
this._disposeObjectList.push(obj);
|
|
158
|
-
}
|
|
275
|
+
if (this.isContextLost()) {
|
|
276
|
+
obj.destroy();
|
|
277
|
+
} else {
|
|
278
|
+
this._disposeObjectList.push(obj);
|
|
159
279
|
}
|
|
160
|
-
obj.dispatchEvent(null, 'disposed');
|
|
161
280
|
}
|
|
162
281
|
}
|
|
163
|
-
|
|
282
|
+
restoreObject(obj) {
|
|
164
283
|
if (obj && obj.disposed && !this.isContextLost()) {
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
await obj.restoreHandler(obj);
|
|
168
|
-
}
|
|
284
|
+
obj.restore();
|
|
285
|
+
obj.restoreHandler?.(obj);
|
|
169
286
|
}
|
|
170
287
|
}
|
|
171
288
|
enableGPUTimeRecording(enable) {
|
|
@@ -186,7 +303,7 @@ import { Pool } from './pool.js';
|
|
|
186
303
|
this._beginFrameCounter++;
|
|
187
304
|
this._beginFrameTime = this._cpuTimer.now();
|
|
188
305
|
this.updateFrameInfo();
|
|
189
|
-
this.
|
|
306
|
+
this._poolMap.forEach((pool)=>pool.autoRelease());
|
|
190
307
|
return this.onBeginFrame();
|
|
191
308
|
}
|
|
192
309
|
endFrame() {
|
|
@@ -194,6 +311,7 @@ import { Pool } from './pool.js';
|
|
|
194
311
|
this._beginFrameCounter--;
|
|
195
312
|
if (this._beginFrameCounter === 0) {
|
|
196
313
|
this._endFrameTime = this._cpuTimer.now();
|
|
314
|
+
this._frameInfo.frameCounter++;
|
|
197
315
|
this.onEndFrame();
|
|
198
316
|
}
|
|
199
317
|
}
|
|
@@ -203,7 +321,7 @@ import { Pool } from './pool.js';
|
|
|
203
321
|
}
|
|
204
322
|
createInterleavedVertexBuffer(attribFormats, data, options) {
|
|
205
323
|
if (options && options.usage && options.usage !== 'vertex') {
|
|
206
|
-
console.error(`
|
|
324
|
+
console.error(`createInterleavedVertexBuffer() failed: options.usage must be 'vertex' or not set`);
|
|
207
325
|
return null;
|
|
208
326
|
}
|
|
209
327
|
let size = 0;
|
|
@@ -211,6 +329,10 @@ import { Pool } from './pool.js';
|
|
|
211
329
|
size += getVertexFormatSize(format);
|
|
212
330
|
}
|
|
213
331
|
const vertexBufferType = makeVertexBufferType(data.byteLength / size >> 0, ...attribFormats);
|
|
332
|
+
if (!vertexBufferType) {
|
|
333
|
+
console.error('createInterleavedVertexBuffer() failed: Cannot determine vertex buffer type');
|
|
334
|
+
return null;
|
|
335
|
+
}
|
|
214
336
|
const opt = Object.assign({
|
|
215
337
|
usage: 'vertex',
|
|
216
338
|
dynamic: false,
|
|
@@ -233,6 +355,10 @@ import { Pool } from './pool.js';
|
|
|
233
355
|
}
|
|
234
356
|
const count = getVertexFormatSize(attribFormat);
|
|
235
357
|
const vertexBufferType = makeVertexBufferType(data.byteLength / count >> 0, attribFormat);
|
|
358
|
+
if (!vertexBufferType) {
|
|
359
|
+
console.error('createInterleavedVertexBuffer() failed: Cannot determine vertex buffer type');
|
|
360
|
+
return null;
|
|
361
|
+
}
|
|
236
362
|
const opt = Object.assign({
|
|
237
363
|
usage: 'vertex',
|
|
238
364
|
dynamic: false,
|
|
@@ -256,6 +382,9 @@ import { Pool } from './pool.js';
|
|
|
256
382
|
this._frameInfo.drawCalls++;
|
|
257
383
|
this._drawInstanced(primitiveType, first, count, numInstances);
|
|
258
384
|
}
|
|
385
|
+
executeRenderBundle(renderBundle) {
|
|
386
|
+
this._frameInfo.drawCalls += this._executeRenderBundle(renderBundle);
|
|
387
|
+
}
|
|
259
388
|
compute(workgroupCountX, workgroupCountY, workgroupCountZ) {
|
|
260
389
|
this._frameInfo.computeCalls++;
|
|
261
390
|
this._compute(workgroupCountX, workgroupCountY, workgroupCountZ);
|
|
@@ -265,6 +394,22 @@ import { Pool } from './pool.js';
|
|
|
265
394
|
this._frameInfo.nextFrameCall.push(f);
|
|
266
395
|
}
|
|
267
396
|
}
|
|
397
|
+
async runNextFrameAsync(f) {
|
|
398
|
+
return new Promise((resolve)=>{
|
|
399
|
+
if (f) {
|
|
400
|
+
this._frameInfo.nextFrameCall.push(()=>{
|
|
401
|
+
const p = f();
|
|
402
|
+
if (p instanceof Promise) {
|
|
403
|
+
p.then(()=>resolve());
|
|
404
|
+
} else {
|
|
405
|
+
resolve();
|
|
406
|
+
}
|
|
407
|
+
});
|
|
408
|
+
} else {
|
|
409
|
+
resolve();
|
|
410
|
+
}
|
|
411
|
+
});
|
|
412
|
+
}
|
|
268
413
|
exitLoop() {
|
|
269
414
|
if (this._runningLoop !== null) {
|
|
270
415
|
if (this._runningLoop !== 0) {
|
|
@@ -357,11 +502,17 @@ import { Pool } from './pool.js';
|
|
|
357
502
|
}
|
|
358
503
|
return null;
|
|
359
504
|
}
|
|
360
|
-
|
|
361
|
-
return this.getFramebuffer() ? val : Math.round(val * this.
|
|
505
|
+
screenXToDevice(val) {
|
|
506
|
+
return this.getFramebuffer() ? val : Math.round(val * this.getScaleX());
|
|
507
|
+
}
|
|
508
|
+
deviceXToScreen(val) {
|
|
509
|
+
return this.getFramebuffer() ? val : Math.round(val / this.getScaleX());
|
|
362
510
|
}
|
|
363
|
-
|
|
364
|
-
return this.getFramebuffer() ? val : Math.round(val
|
|
511
|
+
screenYToDevice(val) {
|
|
512
|
+
return this.getFramebuffer() ? val : Math.round(val * this.getScaleY());
|
|
513
|
+
}
|
|
514
|
+
deviceYToScreen(val) {
|
|
515
|
+
return this.getFramebuffer() ? val : Math.round(val / this.getScaleY());
|
|
365
516
|
}
|
|
366
517
|
buildRenderProgram(options) {
|
|
367
518
|
return this._programBuilder.buildRenderProgram(options);
|
|
@@ -373,7 +524,7 @@ import { Pool } from './pool.js';
|
|
|
373
524
|
const list = this.getGPUObjectList(obj);
|
|
374
525
|
if (list && list.indexOf(obj) < 0) {
|
|
375
526
|
list.push(obj);
|
|
376
|
-
this.dispatchEvent(
|
|
527
|
+
this.dispatchEvent('gpuobject_added', obj);
|
|
377
528
|
}
|
|
378
529
|
}
|
|
379
530
|
removeGPUObject(obj) {
|
|
@@ -382,47 +533,26 @@ import { Pool } from './pool.js';
|
|
|
382
533
|
const index = list.indexOf(obj);
|
|
383
534
|
if (index >= 0) {
|
|
384
535
|
list.splice(index, 1);
|
|
385
|
-
this.dispatchEvent(
|
|
536
|
+
this.dispatchEvent('gpuobject_removed', obj);
|
|
386
537
|
}
|
|
387
538
|
}
|
|
388
539
|
}
|
|
389
540
|
updateVideoMemoryCost(delta) {
|
|
390
541
|
this._gpuMemCost += delta;
|
|
391
542
|
}
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
this.
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
}
|
|
399
|
-
_registerEventHandlers() {
|
|
400
|
-
const canvas = this._canvas;
|
|
401
|
-
const that = this;
|
|
402
|
-
if (window.ResizeObserver) {
|
|
403
|
-
new window.ResizeObserver((entries)=>{
|
|
404
|
-
that._onresize();
|
|
405
|
-
}).observe(canvas, {});
|
|
406
|
-
} else {
|
|
407
|
-
if (window.MutationObserver) {
|
|
408
|
-
new MutationObserver(function(mutations) {
|
|
409
|
-
if (mutations.length > 0) {
|
|
410
|
-
that._onresize();
|
|
411
|
-
}
|
|
412
|
-
}).observe(canvas, {
|
|
413
|
-
attributes: true,
|
|
414
|
-
attributeFilter: [
|
|
415
|
-
'style'
|
|
416
|
-
]
|
|
543
|
+
async initResizer() {
|
|
544
|
+
return new Promise((resolve)=>{
|
|
545
|
+
this.once('resize', (cssWidth, cssHeight, deviceWidth, deviceHeight)=>{
|
|
546
|
+
this._handleResize(cssWidth, cssHeight, deviceWidth, deviceHeight);
|
|
547
|
+
this.on('resize', (cssWidth, cssHeight, deviceWidth, deviceHeight)=>{
|
|
548
|
+
this._handleResize(cssWidth, cssHeight, deviceWidth, deviceHeight);
|
|
417
549
|
});
|
|
418
|
-
|
|
419
|
-
window.addEventListener('resize', ()=>{
|
|
420
|
-
this._onresize();
|
|
550
|
+
resolve();
|
|
421
551
|
});
|
|
422
|
-
|
|
552
|
+
this._resizer.init();
|
|
553
|
+
});
|
|
423
554
|
}
|
|
424
555
|
updateFrameInfo() {
|
|
425
|
-
this._frameInfo.frameCounter++;
|
|
426
556
|
this._frameInfo.drawCalls = 0;
|
|
427
557
|
this._frameInfo.computeCalls = 0;
|
|
428
558
|
const now = this._beginFrameTime;
|
|
@@ -504,8 +634,7 @@ import { Pool } from './pool.js';
|
|
|
504
634
|
this._disposeObjectList = [];
|
|
505
635
|
}
|
|
506
636
|
}
|
|
507
|
-
|
|
508
|
-
const promises = [];
|
|
637
|
+
reloadAll() {
|
|
509
638
|
for (const list of [
|
|
510
639
|
this._gpuObjectList.buffers,
|
|
511
640
|
this._gpuObjectList.textures,
|
|
@@ -517,20 +646,23 @@ import { Pool } from './pool.js';
|
|
|
517
646
|
]){
|
|
518
647
|
// obj.reload() may change the list, so make a copy first
|
|
519
648
|
for (const obj of list.slice()){
|
|
520
|
-
|
|
649
|
+
obj.reload();
|
|
521
650
|
}
|
|
522
651
|
}
|
|
523
|
-
Promise.all(promises);
|
|
524
652
|
return;
|
|
525
653
|
}
|
|
526
654
|
parseTextureOptions(options) {
|
|
527
|
-
const noMipmapFlag = options?.
|
|
655
|
+
const noMipmapFlag = options?.mipmapping === false ? GPUResourceUsageFlags.TF_NO_MIPMAP : 0;
|
|
528
656
|
const writableFlag = options?.writable ? GPUResourceUsageFlags.TF_WRITABLE : 0;
|
|
529
657
|
const dynamicFlag = options?.dynamic ? GPUResourceUsageFlags.DYNAMIC : 0;
|
|
658
|
+
if (noMipmapFlag && options?.samplerOptions) {
|
|
659
|
+
options.samplerOptions.mipFilter = 'none';
|
|
660
|
+
}
|
|
530
661
|
return noMipmapFlag | writableFlag | dynamicFlag;
|
|
531
662
|
}
|
|
532
663
|
parseBufferOptions(options, defaultUsage) {
|
|
533
|
-
|
|
664
|
+
options = options ?? {};
|
|
665
|
+
const usage = options.usage ?? defaultUsage;
|
|
534
666
|
let usageFlag;
|
|
535
667
|
switch(usage){
|
|
536
668
|
case 'uniform':
|
|
@@ -552,6 +684,14 @@ import { Pool } from './pool.js';
|
|
|
552
684
|
usageFlag = GPUResourceUsageFlags.BF_WRITE;
|
|
553
685
|
options.managed = false;
|
|
554
686
|
break;
|
|
687
|
+
case 'pack-pixel':
|
|
688
|
+
usageFlag = GPUResourceUsageFlags.BF_PACK_PIXEL;
|
|
689
|
+
options.managed = false;
|
|
690
|
+
break;
|
|
691
|
+
case 'unpack-pixel':
|
|
692
|
+
usageFlag = GPUResourceUsageFlags.BF_UNPACK_PIXEL;
|
|
693
|
+
options.managed = false;
|
|
694
|
+
break;
|
|
555
695
|
default:
|
|
556
696
|
usageFlag = 0;
|
|
557
697
|
break;
|
package/dist/device.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"device.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
|
1
|
+
{"version":3,"file":"device.js","sources":["../src/device.ts"],"sourcesContent":["import type { Immutable, Nullable } from '@zephyr3d/base';\r\nimport { type Vector4, type TypedArray, type IEventTarget, Observable } from '@zephyr3d/base';\r\nimport type { ITimer } from './timer';\r\nimport { CPUTimer } from './timer';\r\nimport type {\r\n BlendingState,\r\n ColorState,\r\n DepthState,\r\n RasterizerState,\r\n RenderStateSet,\r\n StencilState\r\n} from './render_states';\r\nimport type {\r\n FrameBufferOptions,\r\n SamplerOptions,\r\n TextureSampler,\r\n Texture2D,\r\n Texture3D,\r\n TextureCube,\r\n VertexLayout,\r\n GPUDataBuffer,\r\n FrameBuffer,\r\n GPUProgram,\r\n GPUObject,\r\n StructuredBuffer,\r\n BindGroupLayout,\r\n BindGroup,\r\n IndexBuffer,\r\n TextureVideo,\r\n TextureMipmapData,\r\n TextureImageElement,\r\n Texture2DArray,\r\n TextureCreationOptions,\r\n BufferCreationOptions,\r\n BufferUsage,\r\n VertexSemantic,\r\n VertexAttribFormat,\r\n VertexLayoutOptions,\r\n BaseTexture,\r\n RenderBundle\r\n} from './gpuobject';\r\nimport {\r\n GPUResourceUsageFlags,\r\n makeVertexBufferType,\r\n getVertexFormatSize,\r\n getVertexAttribFormat\r\n} from './gpuobject';\r\nimport type { PBComputeOptions, PBRenderOptions, PBStructTypeInfo } from './builder';\r\nimport { ProgramBuilder } from './builder';\r\nimport type {\r\n DataType,\r\n PrimitiveType,\r\n TextureFormat,\r\n GPUObjectList,\r\n FrameInfo,\r\n DeviceCaps,\r\n GPUProgramConstructParams,\r\n AbstractDevice,\r\n DeviceOptions,\r\n DeviceEventMap,\r\n DeviceViewport\r\n} from './base_types';\r\nimport { DrawText } from './helpers';\r\nimport { Pool } from './pool';\r\n\r\n/**\r\n * The device backend interface\r\n * @public\r\n */\r\nexport interface DeviceBackend {\r\n typeName(): string;\r\n supported(): Promise<boolean>;\r\n createDevice(cvs: HTMLCanvasElement, options?: DeviceOptions): Promise<Nullable<AbstractDevice>>;\r\n}\r\n\r\ntype DeviceState = {\r\n framebuffer: Nullable<FrameBuffer>;\r\n windowOrderReversed: boolean;\r\n viewport: DeviceViewport;\r\n scissor: DeviceViewport;\r\n renderStateSet: Nullable<RenderStateSet>;\r\n program: Nullable<GPUProgram>;\r\n vertexLayout: Nullable<VertexLayout>;\r\n bindGroups: [BindGroup, Nullable<Iterable<number>>][];\r\n};\r\n\r\ntype ResizeCallback = (\r\n cssWidth: number,\r\n cssHeight: number,\r\n deviceWidth: number,\r\n deviceHeight: number\r\n) => void;\r\n\r\nclass ResizeHandler {\r\n private readonly _canvas: HTMLCanvasElement;\r\n private readonly _dpr: number;\r\n private _cssWidth: number;\r\n private _cssHeight: number;\r\n private _deviceWidth: number;\r\n private _deviceHeight: number;\r\n\r\n private _resizeObserver!: ResizeObserver;\r\n private _mutationObserver!: MutationObserver;\r\n private _onResizeCallback: ResizeCallback;\r\n\r\n constructor(canvas: HTMLCanvasElement, onResize: ResizeCallback, dpr: number) {\r\n this._canvas = canvas;\r\n this._dpr = dpr;\r\n this._cssWidth = 0;\r\n this._cssHeight = 0;\r\n this._deviceWidth = 0;\r\n this._deviceHeight = 0;\r\n this._onResizeCallback = onResize;\r\n }\r\n\r\n init() {\r\n const canvas = this._canvas;\r\n if (window.ResizeObserver) {\r\n this._resizeObserver = new ResizeObserver((entries) => {\r\n const entry = entries[0];\r\n this._handleResizeEntry(entry);\r\n });\r\n try {\r\n (this._resizeObserver as any).observe(canvas, { box: 'device-pixel-content-box' });\r\n } catch {\r\n this._resizeObserver.observe(canvas);\r\n }\r\n } else {\r\n if (window.MutationObserver) {\r\n this._mutationObserver = new MutationObserver((mutations) => {\r\n if (mutations.length > 0) {\r\n this._handleLegacyResize();\r\n }\r\n });\r\n this._mutationObserver.observe(canvas, { attributes: true, attributeFilter: ['style'] });\r\n }\r\n window.addEventListener('resize', this._handleLegacyResize);\r\n this._handleLegacyResize();\r\n }\r\n }\r\n\r\n private _handleResizeEntry(_entry: ResizeObserverEntry) {\r\n // CSS pixel\r\n const cssWidth = this._canvas.clientWidth;\r\n const cssHeight = this._canvas.clientHeight;\r\n\r\n // Device pixel\r\n /*\r\n let deviceWidth: number;\r\n let deviceHeight: number;\r\n\r\n const dpBox = (entry as any).devicePixelContentBoxSize?.[0];\r\n if (dpBox) {\r\n deviceWidth = dpBox.inlineSize;\r\n deviceHeight = dpBox.blockSize;\r\n } else {\r\n deviceWidth = Math.round(cssWidth * this._dpr);\r\n deviceHeight = Math.round(cssHeight * this._dpr);\r\n }\r\n */\r\n const deviceWidth = cssWidth * this._dpr;\r\n const deviceHeight = cssHeight * this._dpr;\r\n\r\n if (\r\n cssWidth === this._cssWidth &&\r\n cssHeight === this._cssHeight &&\r\n deviceWidth === this._deviceWidth &&\r\n deviceHeight === this._deviceHeight\r\n ) {\r\n return;\r\n }\r\n\r\n this._cssWidth = cssWidth;\r\n this._cssHeight = cssHeight;\r\n this._deviceWidth = deviceWidth;\r\n this._deviceHeight = deviceHeight;\r\n\r\n this._onResizeCallback(cssWidth, cssHeight, deviceWidth, deviceHeight);\r\n }\r\n\r\n private _handleLegacyResize = () => {\r\n const cssWidth = this._canvas.clientWidth;\r\n const cssHeight = this._canvas.clientHeight;\r\n const dpr = window.devicePixelRatio || 1;\r\n const deviceWidth = Math.round(cssWidth * dpr);\r\n const deviceHeight = Math.round(cssHeight * dpr);\r\n\r\n if (\r\n cssWidth === this._cssWidth &&\r\n cssHeight === this._cssHeight &&\r\n deviceWidth === this._deviceWidth &&\r\n deviceHeight === this._deviceHeight\r\n ) {\r\n return;\r\n }\r\n\r\n this._cssWidth = cssWidth;\r\n this._cssHeight = cssHeight;\r\n this._deviceWidth = deviceWidth;\r\n this._deviceHeight = deviceHeight;\r\n\r\n this._onResizeCallback(cssWidth, cssHeight, deviceWidth, deviceHeight);\r\n };\r\n\r\n public dispose() {\r\n if (this._resizeObserver) {\r\n this._resizeObserver.disconnect();\r\n }\r\n if (this._mutationObserver) {\r\n this._mutationObserver.disconnect();\r\n }\r\n window.removeEventListener('resize', this._handleLegacyResize);\r\n }\r\n}\r\n\r\n/**\r\n * Base class for rendering device\r\n * @public\r\n */\r\nexport abstract class BaseDevice extends Observable<DeviceEventMap> {\r\n protected _dpr: number;\r\n protected _canvas: HTMLCanvasElement;\r\n protected _canvasClientWidth: number;\r\n protected _canvasClientHeight: number;\r\n protected _gpuObjectList: GPUObjectList;\r\n protected _gpuMemCost: number;\r\n protected _disposeObjectList: GPUObject[];\r\n protected _beginFrameTime: number;\r\n protected _endFrameTime: number;\r\n protected _frameInfo: FrameInfo;\r\n protected _cpuTimer: CPUTimer;\r\n protected _gpuTimer: Nullable<ITimer>;\r\n protected _runningLoop: Nullable<number>;\r\n protected _fpsCounter: { time: number; frame: number };\r\n protected _runLoopFunc: Nullable<(device: AbstractDevice) => void>;\r\n protected _backend: DeviceBackend;\r\n protected _beginFrameCounter: number;\r\n protected _programBuilder: ProgramBuilder;\r\n protected _poolMap: Map<string | symbol, Pool>;\r\n protected _defaultPoolKey: symbol;\r\n protected _temporalFramebuffer: boolean;\r\n protected _vSync: boolean;\r\n private readonly _resizer: ResizeHandler;\r\n private readonly _stateStack: DeviceState[];\r\n constructor(cvs: HTMLCanvasElement, backend: DeviceBackend, dpr?: number) {\r\n super();\r\n this._dpr = dpr ?? window.devicePixelRatio ?? 1;\r\n this._backend = backend;\r\n this._gpuObjectList = {\r\n textures: [],\r\n samplers: [],\r\n buffers: [],\r\n programs: [],\r\n framebuffers: [],\r\n vertexArrayObjects: [],\r\n bindGroups: []\r\n };\r\n this._canvas = cvs;\r\n this._canvas.setAttribute('tabindex', '1');\r\n this._canvasClientWidth = cvs.clientWidth;\r\n this._canvasClientHeight = cvs.clientHeight;\r\n this._gpuMemCost = 0;\r\n this._disposeObjectList = [];\r\n this._beginFrameTime = 0;\r\n this._endFrameTime = 0;\r\n this._runLoopFunc = null;\r\n this._frameInfo = {\r\n frameCounter: 0,\r\n frameTimestamp: 0,\r\n elapsedTimeCPU: 0,\r\n elapsedTimeGPU: 0,\r\n elapsedFrame: 0,\r\n elapsedOverall: 0,\r\n FPS: 0,\r\n drawCalls: 0,\r\n computeCalls: 0,\r\n nextFrameCall: [],\r\n nextFrameCallNext: []\r\n };\r\n this._programBuilder = new ProgramBuilder(this);\r\n this._cpuTimer = new CPUTimer();\r\n this._gpuTimer = null;\r\n this._runningLoop = null;\r\n this._fpsCounter = { time: 0, frame: 0 };\r\n this._stateStack = [];\r\n this._beginFrameCounter = 0;\r\n this._poolMap = new Map();\r\n this._defaultPoolKey = Symbol('defaultPool');\r\n this._poolMap.set(this._defaultPoolKey, new Pool(this, this._defaultPoolKey));\r\n this._temporalFramebuffer = false;\r\n this._temporalFramebuffer = false;\r\n this._vSync = true;\r\n //this._registerEventHandlers();\r\n this._resizer = new ResizeHandler(\r\n this._canvas,\r\n (cssWidth, cssHeight, deviceWidth, deviceHeight) => {\r\n this.dispatchEvent('resize', cssWidth, cssHeight, deviceWidth, deviceHeight);\r\n },\r\n this._dpr\r\n );\r\n }\r\n getScaleX() {\r\n return this._canvas.width / this._canvas.clientWidth;\r\n }\r\n getScaleY() {\r\n return this._canvas.height / this._canvas.clientHeight;\r\n }\r\n abstract getAdapterInfo(): any;\r\n abstract getFrameBufferSampleCount(): number;\r\n abstract isContextLost(): boolean;\r\n abstract getDrawingBufferWidth(): number;\r\n abstract getDrawingBufferHeight(): number;\r\n abstract getBackBufferWidth(): number;\r\n abstract getBackBufferHeight(): number;\r\n abstract getDeviceCaps(): Immutable<DeviceCaps>;\r\n abstract initContext(): Promise<void>;\r\n abstract clearFrameBuffer(\r\n clearColor: Nullable<Vector4>,\r\n clearDepth: Nullable<number>,\r\n clearStencil: Nullable<number>\r\n ): void;\r\n abstract createGPUTimer(): Nullable<ITimer>;\r\n abstract createRenderStateSet(): RenderStateSet;\r\n abstract createBlendingState(): BlendingState;\r\n abstract createColorState(): ColorState;\r\n abstract createRasterizerState(): RasterizerState;\r\n abstract createDepthState(): DepthState;\r\n abstract createStencilState(): StencilState;\r\n abstract createSampler(options: SamplerOptions): TextureSampler;\r\n abstract createTextureFromMipmapData<T extends BaseTexture>(\r\n data: TextureMipmapData,\r\n sRGB: boolean,\r\n options?: TextureCreationOptions\r\n ): Nullable<T>;\r\n abstract createTexture2D(\r\n format: TextureFormat,\r\n width: number,\r\n height: number,\r\n options?: TextureCreationOptions\r\n ): Nullable<Texture2D>;\r\n abstract createTexture2DFromImage(\r\n element: TextureImageElement,\r\n sRGB: boolean,\r\n options?: TextureCreationOptions\r\n ): Nullable<Texture2D>;\r\n abstract createTexture2DArray(\r\n format: TextureFormat,\r\n width: number,\r\n height: number,\r\n depth: number,\r\n options?: TextureCreationOptions\r\n ): Nullable<Texture2DArray>;\r\n abstract createTexture2DArrayFromImages(\r\n elements: TextureImageElement[],\r\n sRGB: boolean,\r\n options?: TextureCreationOptions\r\n ): Nullable<Texture2DArray>;\r\n abstract createTexture3D(\r\n format: TextureFormat,\r\n width: number,\r\n height: number,\r\n depth: number,\r\n options?: TextureCreationOptions\r\n ): Nullable<Texture3D>;\r\n abstract createCubeTexture(\r\n format: TextureFormat,\r\n size: number,\r\n options?: TextureCreationOptions\r\n ): Nullable<TextureCube>;\r\n abstract createTextureVideo(el: HTMLVideoElement, samplerOptions?: SamplerOptions): TextureVideo;\r\n abstract reverseVertexWindingOrder(reverse: boolean): void;\r\n abstract isWindingOrderReversed(): boolean;\r\n abstract copyTexture2D(src: Texture2D, srcLevel: number, dst: Texture2D, dstLevel: number): void;\r\n abstract copyFramebufferToTexture2D(src: FrameBuffer, index: number, dst: Texture2D, level: number): void;\r\n // program\r\n abstract createGPUProgram(params: GPUProgramConstructParams): GPUProgram;\r\n abstract createBindGroup(layout: Immutable<BindGroupLayout>): BindGroup;\r\n abstract createBuffer(sizeInBytes: number, options: BufferCreationOptions): GPUDataBuffer;\r\n abstract copyBuffer(\r\n sourceBuffer: GPUDataBuffer,\r\n destBuffer: GPUDataBuffer,\r\n srcOffset: number,\r\n dstOffset: number,\r\n bytes: number\r\n ): void;\r\n abstract createIndexBuffer(\r\n data: Uint16Array<ArrayBuffer> | Uint32Array<ArrayBuffer>,\r\n options?: BufferCreationOptions\r\n ): IndexBuffer;\r\n abstract createStructuredBuffer(\r\n structureType: PBStructTypeInfo,\r\n options: BufferCreationOptions,\r\n data?: TypedArray\r\n ): StructuredBuffer;\r\n abstract createVertexLayout(options: VertexLayoutOptions): VertexLayout;\r\n abstract createFrameBuffer(\r\n colorAttachments: BaseTexture[],\r\n depthAttachment: Nullable<BaseTexture>,\r\n options?: Nullable<FrameBufferOptions>\r\n ): FrameBuffer;\r\n // render related\r\n abstract setViewport(vp: Nullable<Immutable<number[] | DeviceViewport>>): void;\r\n abstract getViewport(): Immutable<DeviceViewport>;\r\n abstract setScissor(scissor: Nullable<Immutable<number[] | DeviceViewport>>): void;\r\n abstract getScissor(): Immutable<DeviceViewport>;\r\n abstract setProgram(program: Nullable<GPUProgram>): void;\r\n abstract getProgram(): Nullable<GPUProgram>;\r\n abstract setVertexLayout(vertexData: Nullable<VertexLayout>): void;\r\n abstract getVertexLayout(): Nullable<VertexLayout>;\r\n abstract setRenderStates(renderStates: Nullable<RenderStateSet>): void;\r\n abstract getRenderStates(): Nullable<RenderStateSet>;\r\n abstract getFramebuffer(): Nullable<FrameBuffer>;\r\n abstract setBindGroup(\r\n index: number,\r\n bindGroup: BindGroup,\r\n dynamicOffsets?: Nullable<Iterable<number>>\r\n ): void;\r\n abstract getBindGroup(index: number): [BindGroup, Nullable<Iterable<number>>];\r\n abstract flush(): void;\r\n abstract nextFrame(callback: () => void): number;\r\n abstract cancelNextFrame(handle: number): void;\r\n // misc\r\n abstract readPixels(\r\n index: number,\r\n x: number,\r\n y: number,\r\n w: number,\r\n h: number,\r\n buffer: TypedArray\r\n ): Promise<void>;\r\n abstract readPixelsToBuffer(\r\n index: number,\r\n x: number,\r\n y: number,\r\n w: number,\r\n h: number,\r\n buffer: GPUDataBuffer\r\n ): void;\r\n abstract beginCapture(): void;\r\n abstract endCapture(): RenderBundle;\r\n abstract looseContext(): void;\r\n abstract restoreContext(): void;\r\n protected abstract _executeRenderBundle(renderBundle: RenderBundle): number;\r\n protected abstract _draw(primitiveType: PrimitiveType, first: number, count: number): void;\r\n protected abstract _drawInstanced(\r\n primitiveType: PrimitiveType,\r\n first: number,\r\n count: number,\r\n numInstances: number\r\n ): void;\r\n protected abstract _compute(\r\n workgroupCountX: number,\r\n workgroupCountY: number,\r\n workgroupCountZ: number\r\n ): void;\r\n get backend() {\r\n return this._backend;\r\n }\r\n get videoMemoryUsage() {\r\n return this._gpuMemCost;\r\n }\r\n get frameInfo() {\r\n return this._frameInfo;\r\n }\r\n get isRendering() {\r\n return this._runningLoop !== null;\r\n }\r\n get canvas() {\r\n return this._canvas;\r\n }\r\n get type() {\r\n return this._backend.typeName();\r\n }\r\n get vSync() {\r\n return this._vSync;\r\n }\r\n set vSync(val) {\r\n this._vSync = !!val;\r\n }\r\n get pool() {\r\n return this._poolMap.get(this._defaultPoolKey)!;\r\n }\r\n get runLoopFunction() {\r\n return this._runLoopFunc;\r\n }\r\n get programBuilder() {\r\n return this._programBuilder;\r\n }\r\n poolExists(key: string | symbol) {\r\n return this._poolMap.has(key);\r\n }\r\n getPool(key: string | symbol) {\r\n let pool = this._poolMap.get(key);\r\n if (!pool) {\r\n pool = new Pool(this, key);\r\n this._poolMap.set(key, pool);\r\n }\r\n return pool;\r\n }\r\n setFont(fontName: string) {\r\n DrawText.setFont(this, fontName);\r\n }\r\n drawText(text: string, x: number, y: number, color: string, viewport?: Immutable<number[]>) {\r\n DrawText.drawText(this, text, color, x, y, viewport);\r\n }\r\n setFramebuffer(rt: Nullable<FrameBuffer>): void;\r\n setFramebuffer(color: BaseTexture[], depth?: BaseTexture, sampleCount?: number): void;\r\n setFramebuffer(\r\n colorOrRT: BaseTexture[] | Nullable<FrameBuffer>,\r\n depth?: BaseTexture,\r\n sampleCount?: number\r\n ) {\r\n let newRT: Nullable<FrameBuffer> = null;\r\n let temporal = false;\r\n if (!Array.isArray(colorOrRT)) {\r\n newRT = colorOrRT ?? null;\r\n } else {\r\n newRT = this.pool!.fetchTemporalFramebuffer(false, 0, 0, colorOrRT, depth, true, sampleCount);\r\n temporal = true;\r\n }\r\n const currentRT = this.getFramebuffer();\r\n if (currentRT !== newRT) {\r\n if (this._temporalFramebuffer && currentRT) {\r\n this.pool!.releaseFrameBuffer(currentRT);\r\n }\r\n this._temporalFramebuffer = temporal;\r\n this._setFramebuffer(newRT);\r\n }\r\n }\r\n disposeObject(obj: GPUObject, remove = true) {\r\n if (obj) {\r\n if (remove) {\r\n this.removeGPUObject(obj);\r\n }\r\n if (this.isContextLost()) {\r\n obj.destroy();\r\n } else {\r\n this._disposeObjectList.push(obj);\r\n }\r\n }\r\n }\r\n restoreObject(obj: GPUObject) {\r\n if (obj && obj.disposed && !this.isContextLost()) {\r\n obj.restore();\r\n obj.restoreHandler?.(obj);\r\n }\r\n }\r\n enableGPUTimeRecording(enable: boolean) {\r\n if (enable && !this._gpuTimer) {\r\n this._gpuTimer = this.createGPUTimer();\r\n } else if (!enable) {\r\n this._gpuTimer?.end();\r\n this._gpuTimer = null;\r\n }\r\n }\r\n beginFrame() {\r\n if (this._beginFrameCounter === 0) {\r\n for (const obj of this._disposeObjectList) {\r\n obj.destroy();\r\n }\r\n this._disposeObjectList = [];\r\n }\r\n this._beginFrameCounter++;\r\n this._beginFrameTime = this._cpuTimer.now();\r\n this.updateFrameInfo();\r\n this._poolMap.forEach((pool) => pool.autoRelease());\r\n return this.onBeginFrame();\r\n }\r\n endFrame() {\r\n if (this._beginFrameCounter > 0) {\r\n this._beginFrameCounter--;\r\n if (this._beginFrameCounter === 0) {\r\n this._endFrameTime = this._cpuTimer.now();\r\n this._frameInfo.frameCounter++;\r\n this.onEndFrame();\r\n }\r\n }\r\n }\r\n getVertexAttribFormat(semantic: VertexSemantic, dataType: DataType, componentCount: number) {\r\n return getVertexAttribFormat(semantic, dataType, componentCount);\r\n }\r\n createInterleavedVertexBuffer(\r\n attribFormats: VertexAttribFormat[],\r\n data: TypedArray,\r\n options?: BufferCreationOptions\r\n ) {\r\n if (options && options.usage && options.usage !== 'vertex') {\r\n console.error(`createInterleavedVertexBuffer() failed: options.usage must be 'vertex' or not set`);\r\n return null;\r\n }\r\n let size = 0;\r\n for (const format of attribFormats) {\r\n size += getVertexFormatSize(format);\r\n }\r\n const vertexBufferType = makeVertexBufferType((data.byteLength / size) >> 0, ...attribFormats);\r\n if (!vertexBufferType) {\r\n console.error('createInterleavedVertexBuffer() failed: Cannot determine vertex buffer type');\r\n return null;\r\n }\r\n const opt = Object.assign(\r\n {\r\n usage: 'vertex',\r\n dynamic: false,\r\n managed: true,\r\n storage: false\r\n },\r\n options || {}\r\n );\r\n if (opt.storage) {\r\n opt.dynamic = false;\r\n opt.managed = false;\r\n }\r\n if (opt.dynamic) {\r\n opt.managed = false;\r\n }\r\n return this.createStructuredBuffer(vertexBufferType, opt, data);\r\n }\r\n createVertexBuffer(attribFormat: VertexAttribFormat, data: TypedArray, options?: BufferCreationOptions) {\r\n if (options && options.usage && options.usage !== 'vertex') {\r\n console.error(`createVertexBuffer() failed: options.usage must be 'vertex' or not set`);\r\n return null;\r\n }\r\n const count = getVertexFormatSize(attribFormat);\r\n const vertexBufferType = makeVertexBufferType((data.byteLength / count) >> 0, attribFormat);\r\n if (!vertexBufferType) {\r\n console.error('createInterleavedVertexBuffer() failed: Cannot determine vertex buffer type');\r\n return null;\r\n }\r\n const opt = Object.assign(\r\n {\r\n usage: 'vertex',\r\n dynamic: false,\r\n managed: true,\r\n storage: false\r\n },\r\n options || {}\r\n );\r\n if (opt.storage) {\r\n opt.dynamic = false;\r\n opt.managed = false;\r\n }\r\n if (opt.dynamic) {\r\n opt.managed = false;\r\n }\r\n return this.createStructuredBuffer(vertexBufferType, opt, data);\r\n }\r\n draw(primitiveType: PrimitiveType, first: number, count: number) {\r\n this._frameInfo.drawCalls++;\r\n this._draw(primitiveType, first, count);\r\n }\r\n drawInstanced(primitiveType: PrimitiveType, first: number, count: number, numInstances: number) {\r\n this._frameInfo.drawCalls++;\r\n this._drawInstanced(primitiveType, first, count, numInstances);\r\n }\r\n executeRenderBundle(renderBundle: RenderBundle): void {\r\n this._frameInfo.drawCalls += this._executeRenderBundle(renderBundle);\r\n }\r\n compute(workgroupCountX: number, workgroupCountY: number, workgroupCountZ: number) {\r\n this._frameInfo.computeCalls++;\r\n this._compute(workgroupCountX, workgroupCountY, workgroupCountZ);\r\n }\r\n runNextFrame(f: () => void) {\r\n if (f) {\r\n this._frameInfo.nextFrameCall.push(f);\r\n }\r\n }\r\n async runNextFrameAsync(f: () => void | Promise<void>) {\r\n return new Promise<void>((resolve) => {\r\n if (f) {\r\n this._frameInfo.nextFrameCall.push(() => {\r\n const p = f();\r\n if (p instanceof Promise) {\r\n p.then(() => resolve());\r\n } else {\r\n resolve();\r\n }\r\n });\r\n } else {\r\n resolve();\r\n }\r\n });\r\n }\r\n exitLoop() {\r\n if (this._runningLoop !== null) {\r\n if (this._runningLoop !== 0) {\r\n cancelAnimationFrame(this._runningLoop);\r\n } else {\r\n this.cancelNextFrame(this._runningLoop);\r\n }\r\n this._runningLoop = null;\r\n }\r\n }\r\n runLoop(func: (device: AbstractDevice) => void) {\r\n if (this._runningLoop !== null) {\r\n console.error('Device.runLoop() can not be nested');\r\n return;\r\n }\r\n if (!func) {\r\n console.error('Device.runLoop() argment error');\r\n return;\r\n }\r\n const that = this;\r\n that._runLoopFunc = func;\r\n (function entry() {\r\n if (that._vSync) {\r\n that._runningLoop = requestAnimationFrame(entry);\r\n } else {\r\n that._runningLoop = that.nextFrame(() => {\r\n if (that._runningLoop !== null) {\r\n entry();\r\n }\r\n });\r\n }\r\n if (that.beginFrame()) {\r\n that._runLoopFunc(that as unknown as AbstractDevice);\r\n that.endFrame();\r\n }\r\n })();\r\n }\r\n pushDeviceStates() {\r\n this._stateStack.push({\r\n windowOrderReversed: this.isWindingOrderReversed(),\r\n framebuffer: this.getFramebuffer(),\r\n viewport: this.getViewport(),\r\n scissor: this.getScissor(),\r\n program: this.getProgram(),\r\n renderStateSet: this.getRenderStates(),\r\n vertexLayout: this.getVertexLayout(),\r\n bindGroups: [this.getBindGroup(0), this.getBindGroup(1), this.getBindGroup(2), this.getBindGroup(3)]\r\n });\r\n }\r\n popDeviceStates() {\r\n if (this._stateStack.length === 0) {\r\n console.error('Device.popDeviceStates(): stack is empty');\r\n } else {\r\n const top = this._stateStack.pop()!;\r\n this.setFramebuffer(top.framebuffer);\r\n this.setViewport(top.viewport);\r\n this.setScissor(top.scissor);\r\n this.setProgram(top.program);\r\n this.setRenderStates(top.renderStateSet);\r\n this.setVertexLayout(top.vertexLayout);\r\n this.setBindGroup(0, ...top.bindGroups[0]);\r\n this.setBindGroup(1, ...top.bindGroups[1]);\r\n this.setBindGroup(2, ...top.bindGroups[2]);\r\n this.setBindGroup(3, ...top.bindGroups[3]);\r\n this.reverseVertexWindingOrder(top.windowOrderReversed);\r\n }\r\n }\r\n getGPUObjects() {\r\n return this._gpuObjectList;\r\n }\r\n getGPUObjectById(uid: number) {\r\n for (const list of [\r\n this._gpuObjectList.textures,\r\n this._gpuObjectList.samplers,\r\n this._gpuObjectList.buffers,\r\n this._gpuObjectList.framebuffers,\r\n this._gpuObjectList.programs,\r\n this._gpuObjectList.vertexArrayObjects\r\n ]) {\r\n for (const obj of list) {\r\n if (obj.uid === uid) {\r\n return obj;\r\n }\r\n }\r\n }\r\n return null;\r\n }\r\n screenXToDevice(val: number) {\r\n return this.getFramebuffer() ? val : Math.round(val * this.getScaleX());\r\n }\r\n deviceXToScreen(val: number) {\r\n return this.getFramebuffer() ? val : Math.round(val / this.getScaleX());\r\n }\r\n screenYToDevice(val: number) {\r\n return this.getFramebuffer() ? val : Math.round(val * this.getScaleY());\r\n }\r\n deviceYToScreen(val: number) {\r\n return this.getFramebuffer() ? val : Math.round(val / this.getScaleY());\r\n }\r\n buildRenderProgram(options: PBRenderOptions) {\r\n return this._programBuilder.buildRenderProgram(options);\r\n }\r\n buildComputeProgram(options: PBComputeOptions) {\r\n return this._programBuilder.buildComputeProgram(options);\r\n }\r\n addGPUObject(obj: GPUObject) {\r\n const list = this.getGPUObjectList(obj);\r\n if (list && list.indexOf(obj) < 0) {\r\n list.push(obj);\r\n this.dispatchEvent('gpuobject_added', obj);\r\n }\r\n }\r\n removeGPUObject(obj: GPUObject) {\r\n const list = this.getGPUObjectList(obj);\r\n if (list) {\r\n const index = list.indexOf(obj);\r\n if (index >= 0) {\r\n list.splice(index, 1);\r\n this.dispatchEvent('gpuobject_removed', obj);\r\n }\r\n }\r\n }\r\n updateVideoMemoryCost(delta: number) {\r\n this._gpuMemCost += delta;\r\n }\r\n protected abstract onBeginFrame(): boolean;\r\n protected abstract onEndFrame(): void;\r\n protected abstract _setFramebuffer(fb: Nullable<FrameBuffer>): void;\r\n protected abstract _handleResize(\r\n cssWidth: number,\r\n cssHeight: number,\r\n deviceWidth: number,\r\n deviceHeight: number\r\n ): void;\r\n protected async initResizer() {\r\n return new Promise<void>((resolve) => {\r\n this.once(\r\n 'resize',\r\n (cssWidth: number, cssHeight: number, deviceWidth: number, deviceHeight: number) => {\r\n this._handleResize(cssWidth, cssHeight, deviceWidth, deviceHeight);\r\n this.on(\r\n 'resize',\r\n (cssWidth: number, cssHeight: number, deviceWidth: number, deviceHeight: number) => {\r\n this._handleResize(cssWidth, cssHeight, deviceWidth, deviceHeight);\r\n }\r\n );\r\n resolve();\r\n }\r\n );\r\n this._resizer.init();\r\n });\r\n }\r\n private updateFrameInfo() {\r\n this._frameInfo.drawCalls = 0;\r\n this._frameInfo.computeCalls = 0;\r\n const now = this._beginFrameTime;\r\n if (this._frameInfo.frameTimestamp === 0) {\r\n this._frameInfo.frameTimestamp = now;\r\n this._frameInfo.elapsedTimeCPU = 0;\r\n this._frameInfo.elapsedTimeGPU = 0;\r\n this._frameInfo.elapsedFrame = 0;\r\n this._frameInfo.elapsedOverall = 0;\r\n this._frameInfo.FPS = 0;\r\n this._fpsCounter.time = now;\r\n this._fpsCounter.frame = this._frameInfo.frameCounter;\r\n if (this._gpuTimer) {\r\n this._gpuTimer.begin();\r\n }\r\n } else {\r\n this._frameInfo.elapsedFrame = now - this._frameInfo.frameTimestamp;\r\n this._frameInfo.elapsedOverall += this._frameInfo.elapsedFrame;\r\n let gpuTime = 0;\r\n let cpuTime = 0;\r\n if (this._endFrameTime !== 0) {\r\n gpuTime = now - this._endFrameTime;\r\n cpuTime = this._endFrameTime - this._frameInfo.frameTimestamp;\r\n }\r\n this._frameInfo.frameTimestamp = now;\r\n if (now >= this._fpsCounter.time + 1000) {\r\n this._frameInfo.FPS =\r\n ((this._frameInfo.frameCounter - this._fpsCounter.frame) * 1000) / (now - this._fpsCounter.time);\r\n this._fpsCounter.time = now;\r\n this._fpsCounter.frame = this._frameInfo.frameCounter;\r\n this._frameInfo.elapsedTimeGPU = gpuTime;\r\n this._frameInfo.elapsedTimeCPU = cpuTime;\r\n }\r\n }\r\n const tmp = this._frameInfo.nextFrameCall;\r\n this._frameInfo.nextFrameCall = this._frameInfo.nextFrameCallNext;\r\n this._frameInfo.nextFrameCallNext = tmp;\r\n for (const f of this._frameInfo.nextFrameCallNext) {\r\n f();\r\n }\r\n this._frameInfo.nextFrameCallNext.length = 0;\r\n }\r\n private getGPUObjectList(obj: GPUObject) {\r\n let list: Nullable<GPUObject[]> = null;\r\n if (obj.isTexture()) {\r\n list = this._gpuObjectList.textures;\r\n } else if (obj.isSampler()) {\r\n list = this._gpuObjectList.samplers;\r\n } else if (obj.isBuffer()) {\r\n list = this._gpuObjectList.buffers;\r\n } else if (obj.isFramebuffer()) {\r\n list = this._gpuObjectList.framebuffers;\r\n } else if (obj.isProgram()) {\r\n list = this._gpuObjectList.programs;\r\n } else if (obj.isVertexLayout()) {\r\n list = this._gpuObjectList.vertexArrayObjects;\r\n } else if (obj.isBindGroup()) {\r\n list = this._gpuObjectList.bindGroups;\r\n }\r\n return list;\r\n }\r\n protected invalidateAll() {\r\n for (const list of [\r\n this._gpuObjectList.buffers,\r\n this._gpuObjectList.textures,\r\n this._gpuObjectList.samplers,\r\n this._gpuObjectList.programs,\r\n this._gpuObjectList.framebuffers,\r\n this._gpuObjectList.vertexArrayObjects,\r\n this._gpuObjectList.bindGroups\r\n ]) {\r\n for (const obj of list) {\r\n this.disposeObject(obj, false);\r\n }\r\n }\r\n if (this.isContextLost()) {\r\n for (const obj of this._disposeObjectList) {\r\n obj.destroy();\r\n }\r\n this._disposeObjectList = [];\r\n }\r\n }\r\n protected reloadAll() {\r\n for (const list of [\r\n this._gpuObjectList.buffers,\r\n this._gpuObjectList.textures,\r\n this._gpuObjectList.samplers,\r\n this._gpuObjectList.programs,\r\n this._gpuObjectList.framebuffers,\r\n this._gpuObjectList.vertexArrayObjects,\r\n this._gpuObjectList.bindGroups\r\n ]) {\r\n // obj.reload() may change the list, so make a copy first\r\n for (const obj of list.slice()) {\r\n obj.reload();\r\n }\r\n }\r\n return;\r\n }\r\n protected parseTextureOptions(options?: TextureCreationOptions) {\r\n const noMipmapFlag = options?.mipmapping === false ? GPUResourceUsageFlags.TF_NO_MIPMAP : 0;\r\n const writableFlag = options?.writable ? GPUResourceUsageFlags.TF_WRITABLE : 0;\r\n const dynamicFlag = options?.dynamic ? GPUResourceUsageFlags.DYNAMIC : 0;\r\n if (noMipmapFlag && options?.samplerOptions) {\r\n options.samplerOptions.mipFilter = 'none';\r\n }\r\n return noMipmapFlag | writableFlag | dynamicFlag;\r\n }\r\n protected parseBufferOptions(options?: BufferCreationOptions, defaultUsage?: BufferUsage) {\r\n options = options ?? {};\r\n const usage = options.usage ?? defaultUsage;\r\n let usageFlag: number;\r\n switch (usage) {\r\n case 'uniform':\r\n usageFlag = GPUResourceUsageFlags.BF_UNIFORM;\r\n options.managed = false;\r\n options.dynamic = options.dynamic ?? true;\r\n break;\r\n case 'vertex':\r\n usageFlag = GPUResourceUsageFlags.BF_VERTEX;\r\n break;\r\n case 'index':\r\n usageFlag = GPUResourceUsageFlags.BF_INDEX;\r\n break;\r\n case 'read':\r\n usageFlag = GPUResourceUsageFlags.BF_READ;\r\n options.managed = false;\r\n break;\r\n case 'write':\r\n usageFlag = GPUResourceUsageFlags.BF_WRITE;\r\n options.managed = false;\r\n break;\r\n case 'pack-pixel':\r\n usageFlag = GPUResourceUsageFlags.BF_PACK_PIXEL;\r\n options.managed = false;\r\n break;\r\n case 'unpack-pixel':\r\n usageFlag = GPUResourceUsageFlags.BF_UNPACK_PIXEL;\r\n options.managed = false;\r\n break;\r\n default:\r\n usageFlag = 0;\r\n break;\r\n }\r\n const storageFlag = (options?.storage ?? false) ? GPUResourceUsageFlags.BF_STORAGE : 0;\r\n const dynamicFlag = (options?.dynamic ?? false) ? GPUResourceUsageFlags.DYNAMIC : 0;\r\n const managedFlag = dynamicFlag === 0 && (options?.managed ?? true) ? GPUResourceUsageFlags.MANAGED : 0;\r\n return usageFlag | storageFlag | dynamicFlag | managedFlag;\r\n }\r\n}\r\n\r\n/**\r\n * Merge event target interface\r\n * @public\r\n */\r\nexport interface BaseDevice extends IEventTarget<DeviceEventMap> {}\r\n"],"names":["ResizeHandler","_canvas","_dpr","_cssWidth","_cssHeight","_deviceWidth","_deviceHeight","_resizeObserver","_mutationObserver","_onResizeCallback","canvas","onResize","dpr","init","window","ResizeObserver","entries","entry","_handleResizeEntry","observe","box","MutationObserver","mutations","length","_handleLegacyResize","attributes","attributeFilter","addEventListener","_entry","cssWidth","clientWidth","cssHeight","clientHeight","deviceWidth","deviceHeight","devicePixelRatio","Math","round","dispose","disconnect","removeEventListener","BaseDevice","Observable","_canvasClientWidth","_canvasClientHeight","_gpuObjectList","_gpuMemCost","_disposeObjectList","_beginFrameTime","_endFrameTime","_frameInfo","_cpuTimer","_gpuTimer","_runningLoop","_fpsCounter","_runLoopFunc","_backend","_beginFrameCounter","_programBuilder","_poolMap","_defaultPoolKey","_temporalFramebuffer","_vSync","_resizer","_stateStack","cvs","backend","textures","samplers","buffers","programs","framebuffers","vertexArrayObjects","bindGroups","setAttribute","frameCounter","frameTimestamp","elapsedTimeCPU","elapsedTimeGPU","elapsedFrame","elapsedOverall","FPS","drawCalls","computeCalls","nextFrameCall","nextFrameCallNext","ProgramBuilder","CPUTimer","time","frame","Map","Symbol","set","Pool","dispatchEvent","getScaleX","width","getScaleY","height","videoMemoryUsage","frameInfo","isRendering","type","typeName","vSync","val","pool","get","runLoopFunction","programBuilder","poolExists","key","has","getPool","setFont","fontName","DrawText","drawText","text","x","y","color","viewport","setFramebuffer","colorOrRT","depth","sampleCount","newRT","temporal","Array","isArray","fetchTemporalFramebuffer","currentRT","getFramebuffer","releaseFrameBuffer","_setFramebuffer","disposeObject","obj","remove","removeGPUObject","isContextLost","destroy","push","restoreObject","disposed","restore","restoreHandler","enableGPUTimeRecording","enable","createGPUTimer","end","beginFrame","now","updateFrameInfo","forEach","autoRelease","onBeginFrame","endFrame","onEndFrame","getVertexAttribFormat","semantic","dataType","componentCount","createInterleavedVertexBuffer","attribFormats","data","options","usage","console","error","size","format","getVertexFormatSize","vertexBufferType","makeVertexBufferType","byteLength","opt","Object","assign","dynamic","managed","storage","createStructuredBuffer","createVertexBuffer","attribFormat","count","draw","primitiveType","first","_draw","drawInstanced","numInstances","_drawInstanced","executeRenderBundle","renderBundle","_executeRenderBundle","compute","workgroupCountX","workgroupCountY","workgroupCountZ","_compute","runNextFrame","f","runNextFrameAsync","Promise","resolve","p","then","exitLoop","cancelAnimationFrame","cancelNextFrame","runLoop","func","that","requestAnimationFrame","nextFrame","pushDeviceStates","windowOrderReversed","isWindingOrderReversed","framebuffer","getViewport","scissor","getScissor","program","getProgram","renderStateSet","getRenderStates","vertexLayout","getVertexLayout","getBindGroup","popDeviceStates","top","pop","setViewport","setScissor","setProgram","setRenderStates","setVertexLayout","setBindGroup","reverseVertexWindingOrder","getGPUObjects","getGPUObjectById","uid","list","screenXToDevice","deviceXToScreen","screenYToDevice","deviceYToScreen","buildRenderProgram","buildComputeProgram","addGPUObject","getGPUObjectList","indexOf","index","splice","updateVideoMemoryCost","delta","initResizer","once","_handleResize","on","begin","gpuTime","cpuTime","tmp","isTexture","isSampler","isBuffer","isFramebuffer","isProgram","isVertexLayout","isBindGroup","invalidateAll","reloadAll","slice","reload","parseTextureOptions","noMipmapFlag","mipmapping","GPUResourceUsageFlags","TF_NO_MIPMAP","writableFlag","writable","TF_WRITABLE","dynamicFlag","DYNAMIC","samplerOptions","mipFilter","parseBufferOptions","defaultUsage","usageFlag","BF_UNIFORM","BF_VERTEX","BF_INDEX","BF_READ","BF_WRITE","BF_PACK_PIXEL","BF_UNPACK_PIXEL","storageFlag","BF_STORAGE","managedFlag","MANAGED"],"mappings":";;;;;;;AA6FA,MAAMA,aAAAA,CAAAA;IACaC,OAA2B;IAC3BC,IAAa;IACtBC,SAAkB;IAClBC,UAAmB;IACnBC,YAAqB;IACrBC,aAAsB;IAEtBC,eAAiC;IACjCC,iBAAqC;IACrCC,iBAAkC;AAE1C,IAAA,WAAA,CAAYC,MAAyB,EAAEC,QAAwB,EAAEC,GAAW,CAAE;QAC5E,IAAI,CAACX,OAAO,GAAGS,MAAAA;QACf,IAAI,CAACR,IAAI,GAAGU,GAAAA;QACZ,IAAI,CAACT,SAAS,GAAG,CAAA;QACjB,IAAI,CAACC,UAAU,GAAG,CAAA;QAClB,IAAI,CAACC,YAAY,GAAG,CAAA;QACpB,IAAI,CAACC,aAAa,GAAG,CAAA;QACrB,IAAI,CAACG,iBAAiB,GAAGE,QAAAA;AAC3B;IAEAE,IAAO,GAAA;QACL,MAAMH,MAAAA,GAAS,IAAI,CAACT,OAAO;QAC3B,IAAIa,MAAAA,CAAOC,cAAc,EAAE;AACzB,YAAA,IAAI,CAACR,eAAe,GAAG,IAAIQ,eAAe,CAACC,OAAAA,GAAAA;gBACzC,MAAMC,KAAAA,GAAQD,OAAO,CAAC,CAAE,CAAA;gBACxB,IAAI,CAACE,kBAAkB,CAACD,KAAAA,CAAAA;AAC1B,aAAA,CAAA;YACA,IAAI;AACD,gBAAA,IAAI,CAACV,eAAe,CAASY,OAAO,CAACT,MAAQ,EAAA;oBAAEU,GAAK,EAAA;AAA2B,iBAAA,CAAA;AAClF,aAAA,CAAE,OAAM;AACN,gBAAA,IAAI,CAACb,eAAe,CAACY,OAAO,CAACT,MAAAA,CAAAA;AAC/B;SACK,MAAA;YACL,IAAII,MAAAA,CAAOO,gBAAgB,EAAE;AAC3B,gBAAA,IAAI,CAACb,iBAAiB,GAAG,IAAIa,iBAAiB,CAACC,SAAAA,GAAAA;oBAC7C,IAAIA,SAAAA,CAAUC,MAAM,GAAG,CAAG,EAAA;AACxB,wBAAA,IAAI,CAACC,mBAAmB,EAAA;AAC1B;AACF,iBAAA,CAAA;AACA,gBAAA,IAAI,CAAChB,iBAAiB,CAACW,OAAO,CAACT,MAAQ,EAAA;oBAAEe,UAAY,EAAA,IAAA;oBAAMC,eAAiB,EAAA;AAAC,wBAAA;AAAQ;AAAC,iBAAA,CAAA;AACxF;AACAZ,YAAAA,MAAAA,CAAOa,gBAAgB,CAAC,QAAU,EAAA,IAAI,CAACH,mBAAmB,CAAA;AAC1D,YAAA,IAAI,CAACA,mBAAmB,EAAA;AAC1B;AACF;AAEQN,IAAAA,kBAAAA,CAAmBU,MAA2B,EAAE;;AAEtD,QAAA,MAAMC,QAAW,GAAA,IAAI,CAAC5B,OAAO,CAAC6B,WAAW;AACzC,QAAA,MAAMC,SAAY,GAAA,IAAI,CAAC9B,OAAO,CAAC+B,YAAY;;AAG3C;;;;;;;;;;;;AAYA,OACA,MAAMC,WAAAA,GAAcJ,QAAW,GAAA,IAAI,CAAC3B,IAAI;AACxC,QAAA,MAAMgC,YAAeH,GAAAA,SAAAA,GAAY,IAAI,CAAC7B,IAAI;AAE1C,QAAA,IACE2B,aAAa,IAAI,CAAC1B,SAAS,IAC3B4B,SAAAA,KAAc,IAAI,CAAC3B,UAAU,IAC7B6B,WAAgB,KAAA,IAAI,CAAC5B,YAAY,IACjC6B,iBAAiB,IAAI,CAAC5B,aAAa,EACnC;AACA,YAAA;AACF;QAEA,IAAI,CAACH,SAAS,GAAG0B,QAAAA;QACjB,IAAI,CAACzB,UAAU,GAAG2B,SAAAA;QAClB,IAAI,CAAC1B,YAAY,GAAG4B,WAAAA;QACpB,IAAI,CAAC3B,aAAa,GAAG4B,YAAAA;AAErB,QAAA,IAAI,CAACzB,iBAAiB,CAACoB,QAAAA,EAAUE,WAAWE,WAAaC,EAAAA,YAAAA,CAAAA;AAC3D;IAEQV,mBAAsB,GAAA,IAAA;AAC5B,QAAA,MAAMK,QAAW,GAAA,IAAI,CAAC5B,OAAO,CAAC6B,WAAW;AACzC,QAAA,MAAMC,SAAY,GAAA,IAAI,CAAC9B,OAAO,CAAC+B,YAAY;QAC3C,MAAMpB,GAAAA,GAAME,MAAOqB,CAAAA,gBAAgB,IAAI,CAAA;AACvC,QAAA,MAAMF,WAAcG,GAAAA,IAAAA,CAAKC,KAAK,CAACR,QAAWjB,GAAAA,GAAAA,CAAAA;AAC1C,QAAA,MAAMsB,YAAeE,GAAAA,IAAAA,CAAKC,KAAK,CAACN,SAAYnB,GAAAA,GAAAA,CAAAA;AAE5C,QAAA,IACEiB,aAAa,IAAI,CAAC1B,SAAS,IAC3B4B,SAAAA,KAAc,IAAI,CAAC3B,UAAU,IAC7B6B,WAAgB,KAAA,IAAI,CAAC5B,YAAY,IACjC6B,iBAAiB,IAAI,CAAC5B,aAAa,EACnC;AACA,YAAA;AACF;QAEA,IAAI,CAACH,SAAS,GAAG0B,QAAAA;QACjB,IAAI,CAACzB,UAAU,GAAG2B,SAAAA;QAClB,IAAI,CAAC1B,YAAY,GAAG4B,WAAAA;QACpB,IAAI,CAAC3B,aAAa,GAAG4B,YAAAA;AAErB,QAAA,IAAI,CAACzB,iBAAiB,CAACoB,QAAAA,EAAUE,WAAWE,WAAaC,EAAAA,YAAAA,CAAAA;KACzD;IAEKI,OAAU,GAAA;QACf,IAAI,IAAI,CAAC/B,eAAe,EAAE;YACxB,IAAI,CAACA,eAAe,CAACgC,UAAU,EAAA;AACjC;QACA,IAAI,IAAI,CAAC/B,iBAAiB,EAAE;YAC1B,IAAI,CAACA,iBAAiB,CAAC+B,UAAU,EAAA;AACnC;AACAzB,QAAAA,MAAAA,CAAO0B,mBAAmB,CAAC,QAAU,EAAA,IAAI,CAAChB,mBAAmB,CAAA;AAC/D;AACF;AAEA;;;IAIO,MAAeiB,UAAmBC,SAAAA,UAAAA,CAAAA;IAC7BxC,IAAa;IACbD,OAA2B;IAC3B0C,kBAA2B;IAC3BC,mBAA4B;IAC5BC,cAA8B;IAC9BC,WAAoB;IACpBC,kBAAgC;IAChCC,eAAwB;IACxBC,aAAsB;IACtBC,UAAsB;IACtBC,SAAoB;IACpBC,SAA4B;IAC5BC,YAA+B;IAC/BC,WAA6C;IAC7CC,YAAyD;IACzDC,QAAwB;IACxBC,kBAA2B;IAC3BC,eAAgC;IAChCC,QAAqC;IACrCC,eAAwB;IACxBC,oBAA8B;IAC9BC,MAAgB;IACTC,QAAwB;IACxBC,WAA2B;AAC5C,IAAA,WAAA,CAAYC,GAAsB,EAAEC,OAAsB,EAAEtD,GAAY,CAAE;QACxE,KAAK,EAAA;AACL,QAAA,IAAI,CAACV,IAAI,GAAGU,GAAOE,IAAAA,MAAAA,CAAOqB,gBAAgB,IAAI,CAAA;QAC9C,IAAI,CAACqB,QAAQ,GAAGU,OAAAA;QAChB,IAAI,CAACrB,cAAc,GAAG;AACpBsB,YAAAA,QAAAA,EAAU,EAAE;AACZC,YAAAA,QAAAA,EAAU,EAAE;AACZC,YAAAA,OAAAA,EAAS,EAAE;AACXC,YAAAA,QAAAA,EAAU,EAAE;AACZC,YAAAA,YAAAA,EAAc,EAAE;AAChBC,YAAAA,kBAAAA,EAAoB,EAAE;AACtBC,YAAAA,UAAAA,EAAY;AACd,SAAA;QACA,IAAI,CAACxE,OAAO,GAAGgE,GAAAA;AACf,QAAA,IAAI,CAAChE,OAAO,CAACyE,YAAY,CAAC,UAAY,EAAA,GAAA,CAAA;AACtC,QAAA,IAAI,CAAC/B,kBAAkB,GAAGsB,GAAAA,CAAInC,WAAW;AACzC,QAAA,IAAI,CAACc,mBAAmB,GAAGqB,GAAAA,CAAIjC,YAAY;QAC3C,IAAI,CAACc,WAAW,GAAG,CAAA;QACnB,IAAI,CAACC,kBAAkB,GAAG,EAAE;QAC5B,IAAI,CAACC,eAAe,GAAG,CAAA;QACvB,IAAI,CAACC,aAAa,GAAG,CAAA;QACrB,IAAI,CAACM,YAAY,GAAG,IAAA;QACpB,IAAI,CAACL,UAAU,GAAG;YAChByB,YAAc,EAAA,CAAA;YACdC,cAAgB,EAAA,CAAA;YAChBC,cAAgB,EAAA,CAAA;YAChBC,cAAgB,EAAA,CAAA;YAChBC,YAAc,EAAA,CAAA;YACdC,cAAgB,EAAA,CAAA;YAChBC,GAAK,EAAA,CAAA;YACLC,SAAW,EAAA,CAAA;YACXC,YAAc,EAAA,CAAA;AACdC,YAAAA,aAAAA,EAAe,EAAE;AACjBC,YAAAA,iBAAAA,EAAmB;AACrB,SAAA;AACA,QAAA,IAAI,CAAC3B,eAAe,GAAG,IAAI4B,eAAe,IAAI,CAAA;QAC9C,IAAI,CAACnC,SAAS,GAAG,IAAIoC,QAAAA,EAAAA;QACrB,IAAI,CAACnC,SAAS,GAAG,IAAA;QACjB,IAAI,CAACC,YAAY,GAAG,IAAA;QACpB,IAAI,CAACC,WAAW,GAAG;YAAEkC,IAAM,EAAA,CAAA;YAAGC,KAAO,EAAA;AAAE,SAAA;QACvC,IAAI,CAACzB,WAAW,GAAG,EAAE;QACrB,IAAI,CAACP,kBAAkB,GAAG,CAAA;QAC1B,IAAI,CAACE,QAAQ,GAAG,IAAI+B,GAAAA,EAAAA;QACpB,IAAI,CAAC9B,eAAe,GAAG+B,MAAO,CAAA,aAAA,CAAA;AAC9B,QAAA,IAAI,CAAChC,QAAQ,CAACiC,GAAG,CAAC,IAAI,CAAChC,eAAe,EAAE,IAAIiC,IAAK,CAAA,IAAI,EAAE,IAAI,CAACjC,eAAe,CAAA,CAAA;QAC3E,IAAI,CAACC,oBAAoB,GAAG,KAAA;QAC5B,IAAI,CAACA,oBAAoB,GAAG,KAAA;QAC5B,IAAI,CAACC,MAAM,GAAG,IAAA;;AAEd,QAAA,IAAI,CAACC,QAAQ,GAAG,IAAI/D,aAClB,CAAA,IAAI,CAACC,OAAO,EACZ,CAAC4B,QAAUE,EAAAA,SAAAA,EAAWE,WAAaC,EAAAA,YAAAA,GAAAA;AACjC,YAAA,IAAI,CAAC4D,aAAa,CAAC,QAAUjE,EAAAA,QAAAA,EAAUE,WAAWE,WAAaC,EAAAA,YAAAA,CAAAA;SAEjE,EAAA,IAAI,CAAChC,IAAI,CAAA;AAEb;IACA6F,SAAY,GAAA;QACV,OAAO,IAAI,CAAC9F,OAAO,CAAC+F,KAAK,GAAG,IAAI,CAAC/F,OAAO,CAAC6B,WAAW;AACtD;IACAmE,SAAY,GAAA;QACV,OAAO,IAAI,CAAChG,OAAO,CAACiG,MAAM,GAAG,IAAI,CAACjG,OAAO,CAAC+B,YAAY;AACxD;AAqJA,IAAA,IAAIkC,OAAU,GAAA;QACZ,OAAO,IAAI,CAACV,QAAQ;AACtB;AACA,IAAA,IAAI2C,gBAAmB,GAAA;QACrB,OAAO,IAAI,CAACrD,WAAW;AACzB;AACA,IAAA,IAAIsD,SAAY,GAAA;QACd,OAAO,IAAI,CAAClD,UAAU;AACxB;AACA,IAAA,IAAImD,WAAc,GAAA;QAChB,OAAO,IAAI,CAAChD,YAAY,KAAK,IAAA;AAC/B;AACA,IAAA,IAAI3C,MAAS,GAAA;QACX,OAAO,IAAI,CAACT,OAAO;AACrB;AACA,IAAA,IAAIqG,IAAO,GAAA;AACT,QAAA,OAAO,IAAI,CAAC9C,QAAQ,CAAC+C,QAAQ,EAAA;AAC/B;AACA,IAAA,IAAIC,KAAQ,GAAA;QACV,OAAO,IAAI,CAAC1C,MAAM;AACpB;IACA,IAAI0C,KAAAA,CAAMC,GAAG,EAAE;AACb,QAAA,IAAI,CAAC3C,MAAM,GAAG,CAAC,CAAC2C,GAAAA;AAClB;AACA,IAAA,IAAIC,IAAO,GAAA;QACT,OAAO,IAAI,CAAC/C,QAAQ,CAACgD,GAAG,CAAC,IAAI,CAAC/C,eAAe,CAAA;AAC/C;AACA,IAAA,IAAIgD,eAAkB,GAAA;QACpB,OAAO,IAAI,CAACrD,YAAY;AAC1B;AACA,IAAA,IAAIsD,cAAiB,GAAA;QACnB,OAAO,IAAI,CAACnD,eAAe;AAC7B;AACAoD,IAAAA,UAAAA,CAAWC,GAAoB,EAAE;AAC/B,QAAA,OAAO,IAAI,CAACpD,QAAQ,CAACqD,GAAG,CAACD,GAAAA,CAAAA;AAC3B;AACAE,IAAAA,OAAAA,CAAQF,GAAoB,EAAE;AAC5B,QAAA,IAAIL,OAAO,IAAI,CAAC/C,QAAQ,CAACgD,GAAG,CAACI,GAAAA,CAAAA;AAC7B,QAAA,IAAI,CAACL,IAAM,EAAA;YACTA,IAAO,GAAA,IAAIb,IAAK,CAAA,IAAI,EAAEkB,GAAAA,CAAAA;AACtB,YAAA,IAAI,CAACpD,QAAQ,CAACiC,GAAG,CAACmB,GAAKL,EAAAA,IAAAA,CAAAA;AACzB;QACA,OAAOA,IAAAA;AACT;AACAQ,IAAAA,OAAAA,CAAQC,QAAgB,EAAE;QACxBC,QAASF,CAAAA,OAAO,CAAC,IAAI,EAAEC,QAAAA,CAAAA;AACzB;IACAE,QAASC,CAAAA,IAAY,EAAEC,CAAS,EAAEC,CAAS,EAAEC,KAAa,EAAEC,QAA8B,EAAE;AAC1FN,QAAAA,QAAAA,CAASC,QAAQ,CAAC,IAAI,EAAEC,IAAMG,EAAAA,KAAAA,EAAOF,GAAGC,CAAGE,EAAAA,QAAAA,CAAAA;AAC7C;AAGAC,IAAAA,cAAAA,CACEC,SAAgD,EAChDC,KAAmB,EACnBC,WAAoB,EACpB;AACA,QAAA,IAAIC,KAA+B,GAAA,IAAA;AACnC,QAAA,IAAIC,QAAW,GAAA,KAAA;AACf,QAAA,IAAI,CAACC,KAAAA,CAAMC,OAAO,CAACN,SAAY,CAAA,EAAA;AAC7BG,YAAAA,KAAAA,GAAQH,SAAa,IAAA,IAAA;SAChB,MAAA;YACLG,KAAQ,GAAA,IAAI,CAACrB,IAAI,CAAEyB,wBAAwB,CAAC,KAAA,EAAO,CAAG,EAAA,CAAA,EAAGP,SAAWC,EAAAA,KAAAA,EAAO,IAAMC,EAAAA,WAAAA,CAAAA;YACjFE,QAAW,GAAA,IAAA;AACb;QACA,MAAMI,SAAAA,GAAY,IAAI,CAACC,cAAc,EAAA;AACrC,QAAA,IAAID,cAAcL,KAAO,EAAA;AACvB,YAAA,IAAI,IAAI,CAAClE,oBAAoB,IAAIuE,SAAW,EAAA;AAC1C,gBAAA,IAAI,CAAC1B,IAAI,CAAE4B,kBAAkB,CAACF,SAAAA,CAAAA;AAChC;YACA,IAAI,CAACvE,oBAAoB,GAAGmE,QAAAA;YAC5B,IAAI,CAACO,eAAe,CAACR,KAAAA,CAAAA;AACvB;AACF;AACAS,IAAAA,aAAAA,CAAcC,GAAc,EAAEC,MAAS,GAAA,IAAI,EAAE;AAC3C,QAAA,IAAID,GAAK,EAAA;AACP,YAAA,IAAIC,MAAQ,EAAA;gBACV,IAAI,CAACC,eAAe,CAACF,GAAAA,CAAAA;AACvB;YACA,IAAI,IAAI,CAACG,aAAa,EAAI,EAAA;AACxBH,gBAAAA,GAAAA,CAAII,OAAO,EAAA;aACN,MAAA;AACL,gBAAA,IAAI,CAAC9F,kBAAkB,CAAC+F,IAAI,CAACL,GAAAA,CAAAA;AAC/B;AACF;AACF;AACAM,IAAAA,aAAAA,CAAcN,GAAc,EAAE;QAC5B,IAAIA,GAAAA,IAAOA,IAAIO,QAAQ,IAAI,CAAC,IAAI,CAACJ,aAAa,EAAI,EAAA;AAChDH,YAAAA,GAAAA,CAAIQ,OAAO,EAAA;AACXR,YAAAA,GAAAA,CAAIS,cAAc,GAAGT,GAAAA,CAAAA;AACvB;AACF;AACAU,IAAAA,sBAAAA,CAAuBC,MAAe,EAAE;AACtC,QAAA,IAAIA,MAAU,IAAA,CAAC,IAAI,CAAChG,SAAS,EAAE;AAC7B,YAAA,IAAI,CAACA,SAAS,GAAG,IAAI,CAACiG,cAAc,EAAA;SAC/B,MAAA,IAAI,CAACD,MAAQ,EAAA;YAClB,IAAI,CAAChG,SAAS,EAAEkG,GAAAA,EAAAA;YAChB,IAAI,CAAClG,SAAS,GAAG,IAAA;AACnB;AACF;IACAmG,UAAa,GAAA;AACX,QAAA,IAAI,IAAI,CAAC9F,kBAAkB,KAAK,CAAG,EAAA;AACjC,YAAA,KAAK,MAAMgF,GAAAA,IAAO,IAAI,CAAC1F,kBAAkB,CAAE;AACzC0F,gBAAAA,GAAAA,CAAII,OAAO,EAAA;AACb;YACA,IAAI,CAAC9F,kBAAkB,GAAG,EAAE;AAC9B;AACA,QAAA,IAAI,CAACU,kBAAkB,EAAA;AACvB,QAAA,IAAI,CAACT,eAAe,GAAG,IAAI,CAACG,SAAS,CAACqG,GAAG,EAAA;AACzC,QAAA,IAAI,CAACC,eAAe,EAAA;QACpB,IAAI,CAAC9F,QAAQ,CAAC+F,OAAO,CAAC,CAAChD,IAAAA,GAASA,KAAKiD,WAAW,EAAA,CAAA;QAChD,OAAO,IAAI,CAACC,YAAY,EAAA;AAC1B;IACAC,QAAW,GAAA;AACT,QAAA,IAAI,IAAI,CAACpG,kBAAkB,GAAG,CAAG,EAAA;AAC/B,YAAA,IAAI,CAACA,kBAAkB,EAAA;AACvB,YAAA,IAAI,IAAI,CAACA,kBAAkB,KAAK,CAAG,EAAA;AACjC,gBAAA,IAAI,CAACR,aAAa,GAAG,IAAI,CAACE,SAAS,CAACqG,GAAG,EAAA;gBACvC,IAAI,CAACtG,UAAU,CAACyB,YAAY,EAAA;AAC5B,gBAAA,IAAI,CAACmF,UAAU,EAAA;AACjB;AACF;AACF;AACAC,IAAAA,qBAAAA,CAAsBC,QAAwB,EAAEC,QAAkB,EAAEC,cAAsB,EAAE;QAC1F,OAAOH,qBAAAA,CAAsBC,UAAUC,QAAUC,EAAAA,cAAAA,CAAAA;AACnD;AACAC,IAAAA,6BAAAA,CACEC,aAAmC,EACnCC,IAAgB,EAChBC,OAA+B,EAC/B;AACA,QAAA,IAAIA,WAAWA,OAAQC,CAAAA,KAAK,IAAID,OAAQC,CAAAA,KAAK,KAAK,QAAU,EAAA;AAC1DC,YAAAA,OAAAA,CAAQC,KAAK,CAAC,CAAC,iFAAiF,CAAC,CAAA;YACjG,OAAO,IAAA;AACT;AACA,QAAA,IAAIC,IAAO,GAAA,CAAA;QACX,KAAK,MAAMC,UAAUP,aAAe,CAAA;AAClCM,YAAAA,IAAAA,IAAQE,mBAAoBD,CAAAA,MAAAA,CAAAA;AAC9B;AACA,QAAA,MAAME,mBAAmBC,oBAAqB,CAACT,KAAKU,UAAU,GAAGL,QAAS,CAAMN,EAAAA,GAAAA,aAAAA,CAAAA;AAChF,QAAA,IAAI,CAACS,gBAAkB,EAAA;AACrBL,YAAAA,OAAAA,CAAQC,KAAK,CAAC,6EAAA,CAAA;YACd,OAAO,IAAA;AACT;QACA,MAAMO,GAAAA,GAAMC,MAAOC,CAAAA,MAAM,CACvB;YACEX,KAAO,EAAA,QAAA;YACPY,OAAS,EAAA,KAAA;YACTC,OAAS,EAAA,IAAA;YACTC,OAAS,EAAA;AACX,SAAA,EACAf,WAAW,EAAC,CAAA;QAEd,IAAIU,GAAAA,CAAIK,OAAO,EAAE;AACfL,YAAAA,GAAAA,CAAIG,OAAO,GAAG,KAAA;AACdH,YAAAA,GAAAA,CAAII,OAAO,GAAG,KAAA;AAChB;QACA,IAAIJ,GAAAA,CAAIG,OAAO,EAAE;AACfH,YAAAA,GAAAA,CAAII,OAAO,GAAG,KAAA;AAChB;AACA,QAAA,OAAO,IAAI,CAACE,sBAAsB,CAACT,kBAAkBG,GAAKX,EAAAA,IAAAA,CAAAA;AAC5D;AACAkB,IAAAA,kBAAAA,CAAmBC,YAAgC,EAAEnB,IAAgB,EAAEC,OAA+B,EAAE;AACtG,QAAA,IAAIA,WAAWA,OAAQC,CAAAA,KAAK,IAAID,OAAQC,CAAAA,KAAK,KAAK,QAAU,EAAA;AAC1DC,YAAAA,OAAAA,CAAQC,KAAK,CAAC,CAAC,sEAAsE,CAAC,CAAA;YACtF,OAAO,IAAA;AACT;AACA,QAAA,MAAMgB,QAAQb,mBAAoBY,CAAAA,YAAAA,CAAAA;AAClC,QAAA,MAAMX,mBAAmBC,oBAAqB,CAACT,KAAKU,UAAU,GAAGU,SAAU,CAAGD,EAAAA,YAAAA,CAAAA;AAC9E,QAAA,IAAI,CAACX,gBAAkB,EAAA;AACrBL,YAAAA,OAAAA,CAAQC,KAAK,CAAC,6EAAA,CAAA;YACd,OAAO,IAAA;AACT;QACA,MAAMO,GAAAA,GAAMC,MAAOC,CAAAA,MAAM,CACvB;YACEX,KAAO,EAAA,QAAA;YACPY,OAAS,EAAA,KAAA;YACTC,OAAS,EAAA,IAAA;YACTC,OAAS,EAAA;AACX,SAAA,EACAf,WAAW,EAAC,CAAA;QAEd,IAAIU,GAAAA,CAAIK,OAAO,EAAE;AACfL,YAAAA,GAAAA,CAAIG,OAAO,GAAG,KAAA;AACdH,YAAAA,GAAAA,CAAII,OAAO,GAAG,KAAA;AAChB;QACA,IAAIJ,GAAAA,CAAIG,OAAO,EAAE;AACfH,YAAAA,GAAAA,CAAII,OAAO,GAAG,KAAA;AAChB;AACA,QAAA,OAAO,IAAI,CAACE,sBAAsB,CAACT,kBAAkBG,GAAKX,EAAAA,IAAAA,CAAAA;AAC5D;AACAqB,IAAAA,IAAAA,CAAKC,aAA4B,EAAEC,KAAa,EAAEH,KAAa,EAAE;QAC/D,IAAI,CAACvI,UAAU,CAACgC,SAAS,EAAA;AACzB,QAAA,IAAI,CAAC2G,KAAK,CAACF,aAAAA,EAAeC,KAAOH,EAAAA,KAAAA,CAAAA;AACnC;AACAK,IAAAA,aAAAA,CAAcH,aAA4B,EAAEC,KAAa,EAAEH,KAAa,EAAEM,YAAoB,EAAE;QAC9F,IAAI,CAAC7I,UAAU,CAACgC,SAAS,EAAA;AACzB,QAAA,IAAI,CAAC8G,cAAc,CAACL,aAAAA,EAAeC,OAAOH,KAAOM,EAAAA,YAAAA,CAAAA;AACnD;AACAE,IAAAA,mBAAAA,CAAoBC,YAA0B,EAAQ;QACpD,IAAI,CAAChJ,UAAU,CAACgC,SAAS,IAAI,IAAI,CAACiH,oBAAoB,CAACD,YAAAA,CAAAA;AACzD;AACAE,IAAAA,OAAAA,CAAQC,eAAuB,EAAEC,eAAuB,EAAEC,eAAuB,EAAE;QACjF,IAAI,CAACrJ,UAAU,CAACiC,YAAY,EAAA;AAC5B,QAAA,IAAI,CAACqH,QAAQ,CAACH,eAAAA,EAAiBC,eAAiBC,EAAAA,eAAAA,CAAAA;AAClD;AACAE,IAAAA,YAAAA,CAAaC,CAAa,EAAE;AAC1B,QAAA,IAAIA,CAAG,EAAA;AACL,YAAA,IAAI,CAACxJ,UAAU,CAACkC,aAAa,CAAC0D,IAAI,CAAC4D,CAAAA,CAAAA;AACrC;AACF;IACA,MAAMC,iBAAAA,CAAkBD,CAA6B,EAAE;QACrD,OAAO,IAAIE,QAAc,CAACC,OAAAA,GAAAA;AACxB,YAAA,IAAIH,CAAG,EAAA;AACL,gBAAA,IAAI,CAACxJ,UAAU,CAACkC,aAAa,CAAC0D,IAAI,CAAC,IAAA;AACjC,oBAAA,MAAMgE,CAAIJ,GAAAA,CAAAA,EAAAA;AACV,oBAAA,IAAII,aAAaF,OAAS,EAAA;wBACxBE,CAAEC,CAAAA,IAAI,CAAC,IAAMF,OAAAA,EAAAA,CAAAA;qBACR,MAAA;AACLA,wBAAAA,OAAAA,EAAAA;AACF;AACF,iBAAA,CAAA;aACK,MAAA;AACLA,gBAAAA,OAAAA,EAAAA;AACF;AACF,SAAA,CAAA;AACF;IACAG,QAAW,GAAA;AACT,QAAA,IAAI,IAAI,CAAC3J,YAAY,KAAK,IAAM,EAAA;AAC9B,YAAA,IAAI,IAAI,CAACA,YAAY,KAAK,CAAG,EAAA;gBAC3B4J,oBAAqB,CAAA,IAAI,CAAC5J,YAAY,CAAA;aACjC,MAAA;AACL,gBAAA,IAAI,CAAC6J,eAAe,CAAC,IAAI,CAAC7J,YAAY,CAAA;AACxC;YACA,IAAI,CAACA,YAAY,GAAG,IAAA;AACtB;AACF;AACA8J,IAAAA,OAAAA,CAAQC,IAAsC,EAAE;AAC9C,QAAA,IAAI,IAAI,CAAC/J,YAAY,KAAK,IAAM,EAAA;AAC9BmH,YAAAA,OAAAA,CAAQC,KAAK,CAAC,oCAAA,CAAA;AACd,YAAA;AACF;AACA,QAAA,IAAI,CAAC2C,IAAM,EAAA;AACT5C,YAAAA,OAAAA,CAAQC,KAAK,CAAC,gCAAA,CAAA;AACd,YAAA;AACF;AACA,QAAA,MAAM4C,OAAO,IAAI;AACjBA,QAAAA,IAAAA,CAAK9J,YAAY,GAAG6J,IAAAA;AACnB,QAAA,CAAA,SAASnM,KAAAA,GAAAA;YACR,IAAIoM,IAAAA,CAAKvJ,MAAM,EAAE;gBACfuJ,IAAKhK,CAAAA,YAAY,GAAGiK,qBAAsBrM,CAAAA,KAAAA,CAAAA;aACrC,MAAA;AACLoM,gBAAAA,IAAAA,CAAKhK,YAAY,GAAGgK,IAAKE,CAAAA,SAAS,CAAC,IAAA;oBACjC,IAAIF,IAAAA,CAAKhK,YAAY,KAAK,IAAM,EAAA;AAC9BpC,wBAAAA,KAAAA,EAAAA;AACF;AACF,iBAAA,CAAA;AACF;YACA,IAAIoM,IAAAA,CAAK9D,UAAU,EAAI,EAAA;AACrB8D,gBAAAA,IAAAA,CAAK9J,YAAY,CAAC8J,IAAAA,CAAAA;AAClBA,gBAAAA,IAAAA,CAAKxD,QAAQ,EAAA;AACf;SACF,GAAA;AACF;IACA2D,gBAAmB,GAAA;AACjB,QAAA,IAAI,CAACxJ,WAAW,CAAC8E,IAAI,CAAC;YACpB2E,mBAAqB,EAAA,IAAI,CAACC,sBAAsB,EAAA;YAChDC,WAAa,EAAA,IAAI,CAACtF,cAAc,EAAA;YAChCX,QAAU,EAAA,IAAI,CAACkG,WAAW,EAAA;YAC1BC,OAAS,EAAA,IAAI,CAACC,UAAU,EAAA;YACxBC,OAAS,EAAA,IAAI,CAACC,UAAU,EAAA;YACxBC,cAAgB,EAAA,IAAI,CAACC,eAAe,EAAA;YACpCC,YAAc,EAAA,IAAI,CAACC,eAAe,EAAA;YAClC3J,UAAY,EAAA;gBAAC,IAAI,CAAC4J,YAAY,CAAC,CAAA,CAAA;gBAAI,IAAI,CAACA,YAAY,CAAC,CAAA,CAAA;gBAAI,IAAI,CAACA,YAAY,CAAC,CAAA,CAAA;gBAAI,IAAI,CAACA,YAAY,CAAC,CAAA;AAAG;AACtG,SAAA,CAAA;AACF;IACAC,eAAkB,GAAA;AAChB,QAAA,IAAI,IAAI,CAACtK,WAAW,CAACzC,MAAM,KAAK,CAAG,EAAA;AACjCiJ,YAAAA,OAAAA,CAAQC,KAAK,CAAC,0CAAA,CAAA;SACT,MAAA;AACL,YAAA,MAAM8D,GAAM,GAAA,IAAI,CAACvK,WAAW,CAACwK,GAAG,EAAA;AAChC,YAAA,IAAI,CAAC7G,cAAc,CAAC4G,GAAAA,CAAIZ,WAAW,CAAA;AACnC,YAAA,IAAI,CAACc,WAAW,CAACF,GAAAA,CAAI7G,QAAQ,CAAA;AAC7B,YAAA,IAAI,CAACgH,UAAU,CAACH,GAAAA,CAAIV,OAAO,CAAA;AAC3B,YAAA,IAAI,CAACc,UAAU,CAACJ,GAAAA,CAAIR,OAAO,CAAA;AAC3B,YAAA,IAAI,CAACa,eAAe,CAACL,GAAAA,CAAIN,cAAc,CAAA;AACvC,YAAA,IAAI,CAACY,eAAe,CAACN,GAAAA,CAAIJ,YAAY,CAAA;AACrC,YAAA,IAAI,CAACW,YAAY,CAAC,MAAMP,GAAI9J,CAAAA,UAAU,CAAC,CAAE,CAAA,CAAA;AACzC,YAAA,IAAI,CAACqK,YAAY,CAAC,MAAMP,GAAI9J,CAAAA,UAAU,CAAC,CAAE,CAAA,CAAA;AACzC,YAAA,IAAI,CAACqK,YAAY,CAAC,MAAMP,GAAI9J,CAAAA,UAAU,CAAC,CAAE,CAAA,CAAA;AACzC,YAAA,IAAI,CAACqK,YAAY,CAAC,MAAMP,GAAI9J,CAAAA,UAAU,CAAC,CAAE,CAAA,CAAA;AACzC,YAAA,IAAI,CAACsK,yBAAyB,CAACR,GAAAA,CAAId,mBAAmB,CAAA;AACxD;AACF;IACAuB,aAAgB,GAAA;QACd,OAAO,IAAI,CAACnM,cAAc;AAC5B;AACAoM,IAAAA,gBAAAA,CAAiBC,GAAW,EAAE;AAC5B,QAAA,KAAK,MAAMC,IAAQ,IAAA;YACjB,IAAI,CAACtM,cAAc,CAACsB,QAAQ;YAC5B,IAAI,CAACtB,cAAc,CAACuB,QAAQ;YAC5B,IAAI,CAACvB,cAAc,CAACwB,OAAO;YAC3B,IAAI,CAACxB,cAAc,CAAC0B,YAAY;YAChC,IAAI,CAAC1B,cAAc,CAACyB,QAAQ;YAC5B,IAAI,CAACzB,cAAc,CAAC2B;SACrB,CAAE;YACD,KAAK,MAAMiE,OAAO0G,IAAM,CAAA;gBACtB,IAAI1G,GAAAA,CAAIyG,GAAG,KAAKA,GAAK,EAAA;oBACnB,OAAOzG,GAAAA;AACT;AACF;AACF;QACA,OAAO,IAAA;AACT;AACA2G,IAAAA,eAAAA,CAAgB3I,GAAW,EAAE;QAC3B,OAAO,IAAI,CAAC4B,cAAc,EAAK5B,GAAAA,GAAAA,GAAMrE,IAAKC,CAAAA,KAAK,CAACoE,GAAAA,GAAM,IAAI,CAACV,SAAS,EAAA,CAAA;AACtE;AACAsJ,IAAAA,eAAAA,CAAgB5I,GAAW,EAAE;QAC3B,OAAO,IAAI,CAAC4B,cAAc,EAAK5B,GAAAA,GAAAA,GAAMrE,IAAKC,CAAAA,KAAK,CAACoE,GAAAA,GAAM,IAAI,CAACV,SAAS,EAAA,CAAA;AACtE;AACAuJ,IAAAA,eAAAA,CAAgB7I,GAAW,EAAE;QAC3B,OAAO,IAAI,CAAC4B,cAAc,EAAK5B,GAAAA,GAAAA,GAAMrE,IAAKC,CAAAA,KAAK,CAACoE,GAAAA,GAAM,IAAI,CAACR,SAAS,EAAA,CAAA;AACtE;AACAsJ,IAAAA,eAAAA,CAAgB9I,GAAW,EAAE;QAC3B,OAAO,IAAI,CAAC4B,cAAc,EAAK5B,GAAAA,GAAAA,GAAMrE,IAAKC,CAAAA,KAAK,CAACoE,GAAAA,GAAM,IAAI,CAACR,SAAS,EAAA,CAAA;AACtE;AACAuJ,IAAAA,kBAAAA,CAAmBlF,OAAwB,EAAE;AAC3C,QAAA,OAAO,IAAI,CAAC5G,eAAe,CAAC8L,kBAAkB,CAAClF,OAAAA,CAAAA;AACjD;AACAmF,IAAAA,mBAAAA,CAAoBnF,OAAyB,EAAE;AAC7C,QAAA,OAAO,IAAI,CAAC5G,eAAe,CAAC+L,mBAAmB,CAACnF,OAAAA,CAAAA;AAClD;AACAoF,IAAAA,YAAAA,CAAajH,GAAc,EAAE;AAC3B,QAAA,MAAM0G,IAAO,GAAA,IAAI,CAACQ,gBAAgB,CAAClH,GAAAA,CAAAA;AACnC,QAAA,IAAI0G,IAAQA,IAAAA,IAAAA,CAAKS,OAAO,CAACnH,OAAO,CAAG,EAAA;AACjC0G,YAAAA,IAAAA,CAAKrG,IAAI,CAACL,GAAAA,CAAAA;YACV,IAAI,CAAC3C,aAAa,CAAC,iBAAmB2C,EAAAA,GAAAA,CAAAA;AACxC;AACF;AACAE,IAAAA,eAAAA,CAAgBF,GAAc,EAAE;AAC9B,QAAA,MAAM0G,IAAO,GAAA,IAAI,CAACQ,gBAAgB,CAAClH,GAAAA,CAAAA;AACnC,QAAA,IAAI0G,IAAM,EAAA;YACR,MAAMU,KAAAA,GAAQV,IAAKS,CAAAA,OAAO,CAACnH,GAAAA,CAAAA;AAC3B,YAAA,IAAIoH,SAAS,CAAG,EAAA;gBACdV,IAAKW,CAAAA,MAAM,CAACD,KAAO,EAAA,CAAA,CAAA;gBACnB,IAAI,CAAC/J,aAAa,CAAC,mBAAqB2C,EAAAA,GAAAA,CAAAA;AAC1C;AACF;AACF;AACAsH,IAAAA,qBAAAA,CAAsBC,KAAa,EAAE;QACnC,IAAI,CAAClN,WAAW,IAAIkN,KAAAA;AACtB;AAUA,IAAA,MAAgBC,WAAc,GAAA;QAC5B,OAAO,IAAIrD,QAAc,CAACC,OAAAA,GAAAA;AACxB,YAAA,IAAI,CAACqD,IAAI,CACP,UACA,CAACrO,QAAAA,EAAkBE,WAAmBE,WAAqBC,EAAAA,YAAAA,GAAAA;AACzD,gBAAA,IAAI,CAACiO,aAAa,CAACtO,QAAAA,EAAUE,WAAWE,WAAaC,EAAAA,YAAAA,CAAAA;AACrD,gBAAA,IAAI,CAACkO,EAAE,CACL,UACA,CAACvO,QAAAA,EAAkBE,WAAmBE,WAAqBC,EAAAA,YAAAA,GAAAA;AACzD,oBAAA,IAAI,CAACiO,aAAa,CAACtO,QAAAA,EAAUE,WAAWE,WAAaC,EAAAA,YAAAA,CAAAA;AACvD,iBAAA,CAAA;AAEF2K,gBAAAA,OAAAA,EAAAA;AACF,aAAA,CAAA;YAEF,IAAI,CAAC9I,QAAQ,CAAClD,IAAI,EAAA;AACpB,SAAA,CAAA;AACF;IACQ4I,eAAkB,GAAA;AACxB,QAAA,IAAI,CAACvG,UAAU,CAACgC,SAAS,GAAG,CAAA;AAC5B,QAAA,IAAI,CAAChC,UAAU,CAACiC,YAAY,GAAG,CAAA;QAC/B,MAAMqE,GAAAA,GAAM,IAAI,CAACxG,eAAe;AAChC,QAAA,IAAI,IAAI,CAACE,UAAU,CAAC0B,cAAc,KAAK,CAAG,EAAA;AACxC,YAAA,IAAI,CAAC1B,UAAU,CAAC0B,cAAc,GAAG4E,GAAAA;AACjC,YAAA,IAAI,CAACtG,UAAU,CAAC2B,cAAc,GAAG,CAAA;AACjC,YAAA,IAAI,CAAC3B,UAAU,CAAC4B,cAAc,GAAG,CAAA;AACjC,YAAA,IAAI,CAAC5B,UAAU,CAAC6B,YAAY,GAAG,CAAA;AAC/B,YAAA,IAAI,CAAC7B,UAAU,CAAC8B,cAAc,GAAG,CAAA;AACjC,YAAA,IAAI,CAAC9B,UAAU,CAAC+B,GAAG,GAAG,CAAA;AACtB,YAAA,IAAI,CAAC3B,WAAW,CAACkC,IAAI,GAAGgE,GAAAA;YACxB,IAAI,CAAClG,WAAW,CAACmC,KAAK,GAAG,IAAI,CAACvC,UAAU,CAACyB,YAAY;YACrD,IAAI,IAAI,CAACvB,SAAS,EAAE;gBAClB,IAAI,CAACA,SAAS,CAACiN,KAAK,EAAA;AACtB;SACK,MAAA;YACL,IAAI,CAACnN,UAAU,CAAC6B,YAAY,GAAGyE,MAAM,IAAI,CAACtG,UAAU,CAAC0B,cAAc;YACnE,IAAI,CAAC1B,UAAU,CAAC8B,cAAc,IAAI,IAAI,CAAC9B,UAAU,CAAC6B,YAAY;AAC9D,YAAA,IAAIuL,OAAU,GAAA,CAAA;AACd,YAAA,IAAIC,OAAU,GAAA,CAAA;AACd,YAAA,IAAI,IAAI,CAACtN,aAAa,KAAK,CAAG,EAAA;gBAC5BqN,OAAU9G,GAAAA,GAAAA,GAAM,IAAI,CAACvG,aAAa;gBAClCsN,OAAU,GAAA,IAAI,CAACtN,aAAa,GAAG,IAAI,CAACC,UAAU,CAAC0B,cAAc;AAC/D;AACA,YAAA,IAAI,CAAC1B,UAAU,CAAC0B,cAAc,GAAG4E,GAAAA;AACjC,YAAA,IAAIA,OAAO,IAAI,CAAClG,WAAW,CAACkC,IAAI,GAAG,IAAM,EAAA;AACvC,gBAAA,IAAI,CAACtC,UAAU,CAAC+B,GAAG,GACf,CAAA,IAAI,CAAC/B,UAAU,CAACyB,YAAY,GAAG,IAAI,CAACrB,WAAW,CAACmC,KAAK,IAAI,IAAS+D,IAAAA,GAAM,GAAA,IAAI,CAAClG,WAAW,CAACkC,IAAI,CAAD;AAChG,gBAAA,IAAI,CAAClC,WAAW,CAACkC,IAAI,GAAGgE,GAAAA;gBACxB,IAAI,CAAClG,WAAW,CAACmC,KAAK,GAAG,IAAI,CAACvC,UAAU,CAACyB,YAAY;AACrD,gBAAA,IAAI,CAACzB,UAAU,CAAC4B,cAAc,GAAGwL,OAAAA;AACjC,gBAAA,IAAI,CAACpN,UAAU,CAAC2B,cAAc,GAAG0L,OAAAA;AACnC;AACF;AACA,QAAA,MAAMC,GAAM,GAAA,IAAI,CAACtN,UAAU,CAACkC,aAAa;QACzC,IAAI,CAAClC,UAAU,CAACkC,aAAa,GAAG,IAAI,CAAClC,UAAU,CAACmC,iBAAiB;AACjE,QAAA,IAAI,CAACnC,UAAU,CAACmC,iBAAiB,GAAGmL,GAAAA;AACpC,QAAA,KAAK,MAAM9D,CAAK,IAAA,IAAI,CAACxJ,UAAU,CAACmC,iBAAiB,CAAE;AACjDqH,YAAAA,CAAAA,EAAAA;AACF;AACA,QAAA,IAAI,CAACxJ,UAAU,CAACmC,iBAAiB,CAAC9D,MAAM,GAAG,CAAA;AAC7C;AACQoO,IAAAA,gBAAAA,CAAiBlH,GAAc,EAAE;AACvC,QAAA,IAAI0G,IAA8B,GAAA,IAAA;QAClC,IAAI1G,GAAAA,CAAIgI,SAAS,EAAI,EAAA;AACnBtB,YAAAA,IAAAA,GAAO,IAAI,CAACtM,cAAc,CAACsB,QAAQ;SAC9B,MAAA,IAAIsE,GAAIiI,CAAAA,SAAS,EAAI,EAAA;AAC1BvB,YAAAA,IAAAA,GAAO,IAAI,CAACtM,cAAc,CAACuB,QAAQ;SAC9B,MAAA,IAAIqE,GAAIkI,CAAAA,QAAQ,EAAI,EAAA;AACzBxB,YAAAA,IAAAA,GAAO,IAAI,CAACtM,cAAc,CAACwB,OAAO;SAC7B,MAAA,IAAIoE,GAAImI,CAAAA,aAAa,EAAI,EAAA;AAC9BzB,YAAAA,IAAAA,GAAO,IAAI,CAACtM,cAAc,CAAC0B,YAAY;SAClC,MAAA,IAAIkE,GAAIoI,CAAAA,SAAS,EAAI,EAAA;AAC1B1B,YAAAA,IAAAA,GAAO,IAAI,CAACtM,cAAc,CAACyB,QAAQ;SAC9B,MAAA,IAAImE,GAAIqI,CAAAA,cAAc,EAAI,EAAA;AAC/B3B,YAAAA,IAAAA,GAAO,IAAI,CAACtM,cAAc,CAAC2B,kBAAkB;SACxC,MAAA,IAAIiE,GAAIsI,CAAAA,WAAW,EAAI,EAAA;AAC5B5B,YAAAA,IAAAA,GAAO,IAAI,CAACtM,cAAc,CAAC4B,UAAU;AACvC;QACA,OAAO0K,IAAAA;AACT;IACU6B,aAAgB,GAAA;AACxB,QAAA,KAAK,MAAM7B,IAAQ,IAAA;YACjB,IAAI,CAACtM,cAAc,CAACwB,OAAO;YAC3B,IAAI,CAACxB,cAAc,CAACsB,QAAQ;YAC5B,IAAI,CAACtB,cAAc,CAACuB,QAAQ;YAC5B,IAAI,CAACvB,cAAc,CAACyB,QAAQ;YAC5B,IAAI,CAACzB,cAAc,CAAC0B,YAAY;YAChC,IAAI,CAAC1B,cAAc,CAAC2B,kBAAkB;YACtC,IAAI,CAAC3B,cAAc,CAAC4B;SACrB,CAAE;YACD,KAAK,MAAMgE,OAAO0G,IAAM,CAAA;gBACtB,IAAI,CAAC3G,aAAa,CAACC,GAAK,EAAA,KAAA,CAAA;AAC1B;AACF;QACA,IAAI,IAAI,CAACG,aAAa,EAAI,EAAA;AACxB,YAAA,KAAK,MAAMH,GAAAA,IAAO,IAAI,CAAC1F,kBAAkB,CAAE;AACzC0F,gBAAAA,GAAAA,CAAII,OAAO,EAAA;AACb;YACA,IAAI,CAAC9F,kBAAkB,GAAG,EAAE;AAC9B;AACF;IACUkO,SAAY,GAAA;AACpB,QAAA,KAAK,MAAM9B,IAAQ,IAAA;YACjB,IAAI,CAACtM,cAAc,CAACwB,OAAO;YAC3B,IAAI,CAACxB,cAAc,CAACsB,QAAQ;YAC5B,IAAI,CAACtB,cAAc,CAACuB,QAAQ;YAC5B,IAAI,CAACvB,cAAc,CAACyB,QAAQ;YAC5B,IAAI,CAACzB,cAAc,CAAC0B,YAAY;YAChC,IAAI,CAAC1B,cAAc,CAAC2B,kBAAkB;YACtC,IAAI,CAAC3B,cAAc,CAAC4B;SACrB,CAAE;;AAED,YAAA,KAAK,MAAMgE,GAAAA,IAAO0G,IAAK+B,CAAAA,KAAK,EAAI,CAAA;AAC9BzI,gBAAAA,GAAAA,CAAI0I,MAAM,EAAA;AACZ;AACF;AACA,QAAA;AACF;AACUC,IAAAA,mBAAAA,CAAoB9G,OAAgC,EAAE;AAC9D,QAAA,MAAM+G,eAAe/G,OAASgH,EAAAA,UAAAA,KAAe,KAAQC,GAAAA,qBAAAA,CAAsBC,YAAY,GAAG,CAAA;AAC1F,QAAA,MAAMC,YAAenH,GAAAA,OAAAA,EAASoH,QAAWH,GAAAA,qBAAAA,CAAsBI,WAAW,GAAG,CAAA;AAC7E,QAAA,MAAMC,WAActH,GAAAA,OAAAA,EAASa,OAAUoG,GAAAA,qBAAAA,CAAsBM,OAAO,GAAG,CAAA;QACvE,IAAIR,YAAAA,IAAgB/G,SAASwH,cAAgB,EAAA;YAC3CxH,OAAQwH,CAAAA,cAAc,CAACC,SAAS,GAAG,MAAA;AACrC;AACA,QAAA,OAAOV,eAAeI,YAAeG,GAAAA,WAAAA;AACvC;IACUI,kBAAmB1H,CAAAA,OAA+B,EAAE2H,YAA0B,EAAE;AACxF3H,QAAAA,OAAAA,GAAUA,WAAW,EAAC;QACtB,MAAMC,KAAAA,GAAQD,OAAQC,CAAAA,KAAK,IAAI0H,YAAAA;QAC/B,IAAIC,SAAAA;QACJ,OAAQ3H,KAAAA;YACN,KAAK,SAAA;AACH2H,gBAAAA,SAAAA,GAAYX,sBAAsBY,UAAU;AAC5C7H,gBAAAA,OAAAA,CAAQc,OAAO,GAAG,KAAA;AAClBd,gBAAAA,OAAAA,CAAQa,OAAO,GAAGb,OAAQa,CAAAA,OAAO,IAAI,IAAA;AACrC,gBAAA;YACF,KAAK,QAAA;AACH+G,gBAAAA,SAAAA,GAAYX,sBAAsBa,SAAS;AAC3C,gBAAA;YACF,KAAK,OAAA;AACHF,gBAAAA,SAAAA,GAAYX,sBAAsBc,QAAQ;AAC1C,gBAAA;YACF,KAAK,MAAA;AACHH,gBAAAA,SAAAA,GAAYX,sBAAsBe,OAAO;AACzChI,gBAAAA,OAAAA,CAAQc,OAAO,GAAG,KAAA;AAClB,gBAAA;YACF,KAAK,OAAA;AACH8G,gBAAAA,SAAAA,GAAYX,sBAAsBgB,QAAQ;AAC1CjI,gBAAAA,OAAAA,CAAQc,OAAO,GAAG,KAAA;AAClB,gBAAA;YACF,KAAK,YAAA;AACH8G,gBAAAA,SAAAA,GAAYX,sBAAsBiB,aAAa;AAC/ClI,gBAAAA,OAAAA,CAAQc,OAAO,GAAG,KAAA;AAClB,gBAAA;YACF,KAAK,cAAA;AACH8G,gBAAAA,SAAAA,GAAYX,sBAAsBkB,eAAe;AACjDnI,gBAAAA,OAAAA,CAAQc,OAAO,GAAG,KAAA;AAClB,gBAAA;AACF,YAAA;gBACE8G,SAAY,GAAA,CAAA;AACZ,gBAAA;AACJ;AACA,QAAA,MAAMQ,cAAc,OAACpI,EAASe,WAAW,KAASkG,GAAAA,qBAAAA,CAAsBoB,UAAU,GAAG,CAAA;AACrF,QAAA,MAAMf,cAAc,OAACtH,EAASa,WAAW,KAASoG,GAAAA,qBAAAA,CAAsBM,OAAO,GAAG,CAAA;QAClF,MAAMe,WAAAA,GAAchB,WAAgB,KAAA,CAAA,KAAMtH,OAAAA,EAASc,WAAW,IAAG,CAAA,GAAKmG,qBAAsBsB,CAAAA,OAAO,GAAG,CAAA;QACtG,OAAOX,SAAAA,GAAYQ,cAAcd,WAAcgB,GAAAA,WAAAA;AACjD;AACF;;;;"}
|