@esotericsoftware/spine-webgl 4.0.14 → 4.0.15

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (40) hide show
  1. package/dist/AssetManager.d.ts +33 -33
  2. package/dist/AssetManager.js +37 -37
  3. package/dist/Camera.d.ts +49 -49
  4. package/dist/Camera.js +80 -80
  5. package/dist/CameraController.d.ts +34 -34
  6. package/dist/CameraController.js +95 -95
  7. package/dist/GLTexture.d.ts +46 -46
  8. package/dist/GLTexture.js +102 -102
  9. package/dist/Input.d.ts +56 -56
  10. package/dist/Input.js +210 -210
  11. package/dist/LoadingScreen.d.ts +43 -43
  12. package/dist/LoadingScreen.js +114 -114
  13. package/dist/Matrix4.d.ts +68 -68
  14. package/dist/Matrix4.js +321 -321
  15. package/dist/Mesh.d.ts +88 -88
  16. package/dist/Mesh.js +193 -193
  17. package/dist/PolygonBatcher.d.ts +53 -53
  18. package/dist/PolygonBatcher.js +121 -119
  19. package/dist/SceneRenderer.d.ts +73 -73
  20. package/dist/SceneRenderer.js +476 -476
  21. package/dist/Shader.d.ts +75 -75
  22. package/dist/Shader.js +262 -262
  23. package/dist/ShapeRenderer.d.ts +69 -69
  24. package/dist/ShapeRenderer.js +338 -338
  25. package/dist/SkeletonDebugRenderer.d.ts +60 -60
  26. package/dist/SkeletonDebugRenderer.js +222 -222
  27. package/dist/SkeletonRenderer.d.ts +49 -49
  28. package/dist/SkeletonRenderer.js +295 -295
  29. package/dist/SpineCanvas.d.ts +73 -73
  30. package/dist/SpineCanvas.js +82 -82
  31. package/dist/Vector3.d.ts +47 -47
  32. package/dist/Vector3.js +103 -103
  33. package/dist/WebGL.d.ts +44 -44
  34. package/dist/WebGL.js +96 -96
  35. package/dist/iife/spine-webgl.js +2 -3
  36. package/dist/iife/spine-webgl.js.map +2 -2
  37. package/dist/iife/spine-webgl.min.js +3 -3
  38. package/dist/index.d.ts +18 -18
  39. package/dist/index.js +18 -18
  40. package/package.json +35 -35
@@ -1,477 +1,477 @@
1
- /******************************************************************************
2
- * Spine Runtimes License Agreement
3
- * Last updated January 1, 2020. Replaces all prior versions.
4
- *
5
- * Copyright (c) 2013-2020, Esoteric Software LLC
6
- *
7
- * Integration of the Spine Runtimes into software or otherwise creating
8
- * derivative works of the Spine Runtimes is permitted under the terms and
9
- * conditions of Section 2 of the Spine Editor License Agreement:
10
- * http://esotericsoftware.com/spine-editor-license
11
- *
12
- * Otherwise, it is permitted to integrate the Spine Runtimes into software
13
- * or otherwise create derivative works of the Spine Runtimes (collectively,
14
- * "Products"), provided that each user of the Products must obtain their own
15
- * Spine Editor license and redistribution of the Products in any form must
16
- * include this license and copyright notice.
17
- *
18
- * THE SPINE RUNTIMES ARE PROVIDED BY ESOTERIC SOFTWARE LLC "AS IS" AND ANY
19
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
20
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
21
- * DISCLAIMED. IN NO EVENT SHALL ESOTERIC SOFTWARE LLC BE LIABLE FOR ANY
22
- * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
23
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES,
24
- * BUSINESS INTERRUPTION, OR LOSS OF USE, DATA, OR PROFITS) HOWEVER CAUSED AND
25
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
27
- * THE SPINE RUNTIMES, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28
- *****************************************************************************/
29
- import { Color, MathUtils } from "@esotericsoftware/spine-core";
30
- import { OrthoCamera } from "./Camera";
31
- import { PolygonBatcher } from "./PolygonBatcher";
32
- import { Shader } from "./Shader";
33
- import { ShapeRenderer } from "./ShapeRenderer";
34
- import { SkeletonDebugRenderer } from "./SkeletonDebugRenderer";
35
- import { SkeletonRenderer } from "./SkeletonRenderer";
36
- import { ManagedWebGLRenderingContext } from "./WebGL";
37
- ;
38
- const quad = [
39
- 0, 0, 1, 1, 1, 1, 0, 0,
40
- 0, 0, 1, 1, 1, 1, 0, 0,
41
- 0, 0, 1, 1, 1, 1, 0, 0,
42
- 0, 0, 1, 1, 1, 1, 0, 0,
43
- ];
44
- const QUAD_TRIANGLES = [0, 1, 2, 2, 3, 0];
45
- const WHITE = new Color(1, 1, 1, 1);
46
- export class SceneRenderer {
47
- constructor(canvas, context, twoColorTint = true) {
48
- this.twoColorTint = false;
49
- this.canvas = canvas;
50
- this.context = context instanceof ManagedWebGLRenderingContext ? context : new ManagedWebGLRenderingContext(context);
51
- this.twoColorTint = twoColorTint;
52
- this.camera = new OrthoCamera(canvas.width, canvas.height);
53
- this.batcherShader = twoColorTint ? Shader.newTwoColoredTextured(this.context) : Shader.newColoredTextured(this.context);
54
- this.batcher = new PolygonBatcher(this.context, twoColorTint);
55
- this.shapesShader = Shader.newColored(this.context);
56
- this.shapes = new ShapeRenderer(this.context);
57
- this.skeletonRenderer = new SkeletonRenderer(this.context, twoColorTint);
58
- this.skeletonDebugRenderer = new SkeletonDebugRenderer(this.context);
59
- }
60
- begin() {
61
- this.camera.update();
62
- this.enableRenderer(this.batcher);
63
- }
64
- drawSkeleton(skeleton, premultipliedAlpha = false, slotRangeStart = -1, slotRangeEnd = -1) {
65
- this.enableRenderer(this.batcher);
66
- this.skeletonRenderer.premultipliedAlpha = premultipliedAlpha;
67
- this.skeletonRenderer.draw(this.batcher, skeleton, slotRangeStart, slotRangeEnd);
68
- }
69
- drawSkeletonDebug(skeleton, premultipliedAlpha = false, ignoredBones = null) {
70
- this.enableRenderer(this.shapes);
71
- this.skeletonDebugRenderer.premultipliedAlpha = premultipliedAlpha;
72
- this.skeletonDebugRenderer.draw(this.shapes, skeleton, ignoredBones);
73
- }
74
- drawTexture(texture, x, y, width, height, color = null) {
75
- this.enableRenderer(this.batcher);
76
- if (color === null)
77
- color = WHITE;
78
- var i = 0;
79
- quad[i++] = x;
80
- quad[i++] = y;
81
- quad[i++] = color.r;
82
- quad[i++] = color.g;
83
- quad[i++] = color.b;
84
- quad[i++] = color.a;
85
- quad[i++] = 0;
86
- quad[i++] = 1;
87
- if (this.twoColorTint) {
88
- quad[i++] = 0;
89
- quad[i++] = 0;
90
- quad[i++] = 0;
91
- quad[i++] = 0;
92
- }
93
- quad[i++] = x + width;
94
- quad[i++] = y;
95
- quad[i++] = color.r;
96
- quad[i++] = color.g;
97
- quad[i++] = color.b;
98
- quad[i++] = color.a;
99
- quad[i++] = 1;
100
- quad[i++] = 1;
101
- if (this.twoColorTint) {
102
- quad[i++] = 0;
103
- quad[i++] = 0;
104
- quad[i++] = 0;
105
- quad[i++] = 0;
106
- }
107
- quad[i++] = x + width;
108
- quad[i++] = y + height;
109
- quad[i++] = color.r;
110
- quad[i++] = color.g;
111
- quad[i++] = color.b;
112
- quad[i++] = color.a;
113
- quad[i++] = 1;
114
- quad[i++] = 0;
115
- if (this.twoColorTint) {
116
- quad[i++] = 0;
117
- quad[i++] = 0;
118
- quad[i++] = 0;
119
- quad[i++] = 0;
120
- }
121
- quad[i++] = x;
122
- quad[i++] = y + height;
123
- quad[i++] = color.r;
124
- quad[i++] = color.g;
125
- quad[i++] = color.b;
126
- quad[i++] = color.a;
127
- quad[i++] = 0;
128
- quad[i++] = 0;
129
- if (this.twoColorTint) {
130
- quad[i++] = 0;
131
- quad[i++] = 0;
132
- quad[i++] = 0;
133
- quad[i] = 0;
134
- }
135
- this.batcher.draw(texture, quad, QUAD_TRIANGLES);
136
- }
137
- drawTextureUV(texture, x, y, width, height, u, v, u2, v2, color = null) {
138
- this.enableRenderer(this.batcher);
139
- if (color === null)
140
- color = WHITE;
141
- var i = 0;
142
- quad[i++] = x;
143
- quad[i++] = y;
144
- quad[i++] = color.r;
145
- quad[i++] = color.g;
146
- quad[i++] = color.b;
147
- quad[i++] = color.a;
148
- quad[i++] = u;
149
- quad[i++] = v;
150
- if (this.twoColorTint) {
151
- quad[i++] = 0;
152
- quad[i++] = 0;
153
- quad[i++] = 0;
154
- quad[i++] = 0;
155
- }
156
- quad[i++] = x + width;
157
- quad[i++] = y;
158
- quad[i++] = color.r;
159
- quad[i++] = color.g;
160
- quad[i++] = color.b;
161
- quad[i++] = color.a;
162
- quad[i++] = u2;
163
- quad[i++] = v;
164
- if (this.twoColorTint) {
165
- quad[i++] = 0;
166
- quad[i++] = 0;
167
- quad[i++] = 0;
168
- quad[i++] = 0;
169
- }
170
- quad[i++] = x + width;
171
- quad[i++] = y + height;
172
- quad[i++] = color.r;
173
- quad[i++] = color.g;
174
- quad[i++] = color.b;
175
- quad[i++] = color.a;
176
- quad[i++] = u2;
177
- quad[i++] = v2;
178
- if (this.twoColorTint) {
179
- quad[i++] = 0;
180
- quad[i++] = 0;
181
- quad[i++] = 0;
182
- quad[i++] = 0;
183
- }
184
- quad[i++] = x;
185
- quad[i++] = y + height;
186
- quad[i++] = color.r;
187
- quad[i++] = color.g;
188
- quad[i++] = color.b;
189
- quad[i++] = color.a;
190
- quad[i++] = u;
191
- quad[i++] = v2;
192
- if (this.twoColorTint) {
193
- quad[i++] = 0;
194
- quad[i++] = 0;
195
- quad[i++] = 0;
196
- quad[i] = 0;
197
- }
198
- this.batcher.draw(texture, quad, QUAD_TRIANGLES);
199
- }
200
- drawTextureRotated(texture, x, y, width, height, pivotX, pivotY, angle, color = null) {
201
- this.enableRenderer(this.batcher);
202
- if (color === null)
203
- color = WHITE;
204
- // bottom left and top right corner points relative to origin
205
- let worldOriginX = x + pivotX;
206
- let worldOriginY = y + pivotY;
207
- let fx = -pivotX;
208
- let fy = -pivotY;
209
- let fx2 = width - pivotX;
210
- let fy2 = height - pivotY;
211
- // construct corner points, start from top left and go counter clockwise
212
- let p1x = fx;
213
- let p1y = fy;
214
- let p2x = fx;
215
- let p2y = fy2;
216
- let p3x = fx2;
217
- let p3y = fy2;
218
- let p4x = fx2;
219
- let p4y = fy;
220
- let x1 = 0;
221
- let y1 = 0;
222
- let x2 = 0;
223
- let y2 = 0;
224
- let x3 = 0;
225
- let y3 = 0;
226
- let x4 = 0;
227
- let y4 = 0;
228
- // rotate
229
- if (angle != 0) {
230
- let cos = MathUtils.cosDeg(angle);
231
- let sin = MathUtils.sinDeg(angle);
232
- x1 = cos * p1x - sin * p1y;
233
- y1 = sin * p1x + cos * p1y;
234
- x4 = cos * p2x - sin * p2y;
235
- y4 = sin * p2x + cos * p2y;
236
- x3 = cos * p3x - sin * p3y;
237
- y3 = sin * p3x + cos * p3y;
238
- x2 = x3 + (x1 - x4);
239
- y2 = y3 + (y1 - y4);
240
- }
241
- else {
242
- x1 = p1x;
243
- y1 = p1y;
244
- x4 = p2x;
245
- y4 = p2y;
246
- x3 = p3x;
247
- y3 = p3y;
248
- x2 = p4x;
249
- y2 = p4y;
250
- }
251
- x1 += worldOriginX;
252
- y1 += worldOriginY;
253
- x2 += worldOriginX;
254
- y2 += worldOriginY;
255
- x3 += worldOriginX;
256
- y3 += worldOriginY;
257
- x4 += worldOriginX;
258
- y4 += worldOriginY;
259
- var i = 0;
260
- quad[i++] = x1;
261
- quad[i++] = y1;
262
- quad[i++] = color.r;
263
- quad[i++] = color.g;
264
- quad[i++] = color.b;
265
- quad[i++] = color.a;
266
- quad[i++] = 0;
267
- quad[i++] = 1;
268
- if (this.twoColorTint) {
269
- quad[i++] = 0;
270
- quad[i++] = 0;
271
- quad[i++] = 0;
272
- quad[i++] = 0;
273
- }
274
- quad[i++] = x2;
275
- quad[i++] = y2;
276
- quad[i++] = color.r;
277
- quad[i++] = color.g;
278
- quad[i++] = color.b;
279
- quad[i++] = color.a;
280
- quad[i++] = 1;
281
- quad[i++] = 1;
282
- if (this.twoColorTint) {
283
- quad[i++] = 0;
284
- quad[i++] = 0;
285
- quad[i++] = 0;
286
- quad[i++] = 0;
287
- }
288
- quad[i++] = x3;
289
- quad[i++] = y3;
290
- quad[i++] = color.r;
291
- quad[i++] = color.g;
292
- quad[i++] = color.b;
293
- quad[i++] = color.a;
294
- quad[i++] = 1;
295
- quad[i++] = 0;
296
- if (this.twoColorTint) {
297
- quad[i++] = 0;
298
- quad[i++] = 0;
299
- quad[i++] = 0;
300
- quad[i++] = 0;
301
- }
302
- quad[i++] = x4;
303
- quad[i++] = y4;
304
- quad[i++] = color.r;
305
- quad[i++] = color.g;
306
- quad[i++] = color.b;
307
- quad[i++] = color.a;
308
- quad[i++] = 0;
309
- quad[i++] = 0;
310
- if (this.twoColorTint) {
311
- quad[i++] = 0;
312
- quad[i++] = 0;
313
- quad[i++] = 0;
314
- quad[i] = 0;
315
- }
316
- this.batcher.draw(texture, quad, QUAD_TRIANGLES);
317
- }
318
- drawRegion(region, x, y, width, height, color = null) {
319
- this.enableRenderer(this.batcher);
320
- if (color === null)
321
- color = WHITE;
322
- var i = 0;
323
- quad[i++] = x;
324
- quad[i++] = y;
325
- quad[i++] = color.r;
326
- quad[i++] = color.g;
327
- quad[i++] = color.b;
328
- quad[i++] = color.a;
329
- quad[i++] = region.u;
330
- quad[i++] = region.v2;
331
- if (this.twoColorTint) {
332
- quad[i++] = 0;
333
- quad[i++] = 0;
334
- quad[i++] = 0;
335
- quad[i++] = 0;
336
- }
337
- quad[i++] = x + width;
338
- quad[i++] = y;
339
- quad[i++] = color.r;
340
- quad[i++] = color.g;
341
- quad[i++] = color.b;
342
- quad[i++] = color.a;
343
- quad[i++] = region.u2;
344
- quad[i++] = region.v2;
345
- if (this.twoColorTint) {
346
- quad[i++] = 0;
347
- quad[i++] = 0;
348
- quad[i++] = 0;
349
- quad[i++] = 0;
350
- }
351
- quad[i++] = x + width;
352
- quad[i++] = y + height;
353
- quad[i++] = color.r;
354
- quad[i++] = color.g;
355
- quad[i++] = color.b;
356
- quad[i++] = color.a;
357
- quad[i++] = region.u2;
358
- quad[i++] = region.v;
359
- if (this.twoColorTint) {
360
- quad[i++] = 0;
361
- quad[i++] = 0;
362
- quad[i++] = 0;
363
- quad[i++] = 0;
364
- }
365
- quad[i++] = x;
366
- quad[i++] = y + height;
367
- quad[i++] = color.r;
368
- quad[i++] = color.g;
369
- quad[i++] = color.b;
370
- quad[i++] = color.a;
371
- quad[i++] = region.u;
372
- quad[i++] = region.v;
373
- if (this.twoColorTint) {
374
- quad[i++] = 0;
375
- quad[i++] = 0;
376
- quad[i++] = 0;
377
- quad[i] = 0;
378
- }
379
- this.batcher.draw(region.page.texture, quad, QUAD_TRIANGLES);
380
- }
381
- line(x, y, x2, y2, color = null, color2 = null) {
382
- this.enableRenderer(this.shapes);
383
- this.shapes.line(x, y, x2, y2, color);
384
- }
385
- triangle(filled, x, y, x2, y2, x3, y3, color = null, color2 = null, color3 = null) {
386
- this.enableRenderer(this.shapes);
387
- this.shapes.triangle(filled, x, y, x2, y2, x3, y3, color, color2, color3);
388
- }
389
- quad(filled, x, y, x2, y2, x3, y3, x4, y4, color = null, color2 = null, color3 = null, color4 = null) {
390
- this.enableRenderer(this.shapes);
391
- this.shapes.quad(filled, x, y, x2, y2, x3, y3, x4, y4, color, color2, color3, color4);
392
- }
393
- rect(filled, x, y, width, height, color = null) {
394
- this.enableRenderer(this.shapes);
395
- this.shapes.rect(filled, x, y, width, height, color);
396
- }
397
- rectLine(filled, x1, y1, x2, y2, width, color = null) {
398
- this.enableRenderer(this.shapes);
399
- this.shapes.rectLine(filled, x1, y1, x2, y2, width, color);
400
- }
401
- polygon(polygonVertices, offset, count, color = null) {
402
- this.enableRenderer(this.shapes);
403
- this.shapes.polygon(polygonVertices, offset, count, color);
404
- }
405
- circle(filled, x, y, radius, color = null, segments = 0) {
406
- this.enableRenderer(this.shapes);
407
- this.shapes.circle(filled, x, y, radius, color, segments);
408
- }
409
- curve(x1, y1, cx1, cy1, cx2, cy2, x2, y2, segments, color = null) {
410
- this.enableRenderer(this.shapes);
411
- this.shapes.curve(x1, y1, cx1, cy1, cx2, cy2, x2, y2, segments, color);
412
- }
413
- end() {
414
- if (this.activeRenderer === this.batcher)
415
- this.batcher.end();
416
- else if (this.activeRenderer === this.shapes)
417
- this.shapes.end();
418
- this.activeRenderer = null;
419
- }
420
- resize(resizeMode) {
421
- let canvas = this.canvas;
422
- var dpr = window.devicePixelRatio || 1;
423
- var w = Math.round(canvas.clientWidth * dpr);
424
- var h = Math.round(canvas.clientHeight * dpr);
425
- if (canvas.width != w || canvas.height != h) {
426
- canvas.width = w;
427
- canvas.height = h;
428
- }
429
- this.context.gl.viewport(0, 0, canvas.width, canvas.height);
430
- // Nothing to do for stretch, we simply apply the viewport size of the camera.
431
- if (resizeMode === ResizeMode.Expand)
432
- this.camera.setViewport(w, h);
433
- else if (resizeMode === ResizeMode.Fit) {
434
- let sourceWidth = canvas.width, sourceHeight = canvas.height;
435
- let targetWidth = this.camera.viewportWidth, targetHeight = this.camera.viewportHeight;
436
- let targetRatio = targetHeight / targetWidth;
437
- let sourceRatio = sourceHeight / sourceWidth;
438
- let scale = targetRatio < sourceRatio ? targetWidth / sourceWidth : targetHeight / sourceHeight;
439
- this.camera.setViewport(sourceWidth * scale, sourceHeight * scale);
440
- }
441
- this.camera.update();
442
- }
443
- enableRenderer(renderer) {
444
- if (this.activeRenderer === renderer)
445
- return;
446
- this.end();
447
- if (renderer instanceof PolygonBatcher) {
448
- this.batcherShader.bind();
449
- this.batcherShader.setUniform4x4f(Shader.MVP_MATRIX, this.camera.projectionView.values);
450
- this.batcherShader.setUniformi("u_texture", 0);
451
- this.batcher.begin(this.batcherShader);
452
- this.activeRenderer = this.batcher;
453
- }
454
- else if (renderer instanceof ShapeRenderer) {
455
- this.shapesShader.bind();
456
- this.shapesShader.setUniform4x4f(Shader.MVP_MATRIX, this.camera.projectionView.values);
457
- this.shapes.begin(this.shapesShader);
458
- this.activeRenderer = this.shapes;
459
- }
460
- else
461
- this.activeRenderer = this.skeletonDebugRenderer;
462
- }
463
- dispose() {
464
- this.batcher.dispose();
465
- this.batcherShader.dispose();
466
- this.shapes.dispose();
467
- this.shapesShader.dispose();
468
- this.skeletonDebugRenderer.dispose();
469
- }
470
- }
471
- export var ResizeMode;
472
- (function (ResizeMode) {
473
- ResizeMode[ResizeMode["Stretch"] = 0] = "Stretch";
474
- ResizeMode[ResizeMode["Expand"] = 1] = "Expand";
475
- ResizeMode[ResizeMode["Fit"] = 2] = "Fit";
476
- })(ResizeMode || (ResizeMode = {}));
1
+ /******************************************************************************
2
+ * Spine Runtimes License Agreement
3
+ * Last updated January 1, 2020. Replaces all prior versions.
4
+ *
5
+ * Copyright (c) 2013-2020, Esoteric Software LLC
6
+ *
7
+ * Integration of the Spine Runtimes into software or otherwise creating
8
+ * derivative works of the Spine Runtimes is permitted under the terms and
9
+ * conditions of Section 2 of the Spine Editor License Agreement:
10
+ * http://esotericsoftware.com/spine-editor-license
11
+ *
12
+ * Otherwise, it is permitted to integrate the Spine Runtimes into software
13
+ * or otherwise create derivative works of the Spine Runtimes (collectively,
14
+ * "Products"), provided that each user of the Products must obtain their own
15
+ * Spine Editor license and redistribution of the Products in any form must
16
+ * include this license and copyright notice.
17
+ *
18
+ * THE SPINE RUNTIMES ARE PROVIDED BY ESOTERIC SOFTWARE LLC "AS IS" AND ANY
19
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
20
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
21
+ * DISCLAIMED. IN NO EVENT SHALL ESOTERIC SOFTWARE LLC BE LIABLE FOR ANY
22
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
23
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES,
24
+ * BUSINESS INTERRUPTION, OR LOSS OF USE, DATA, OR PROFITS) HOWEVER CAUSED AND
25
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
27
+ * THE SPINE RUNTIMES, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28
+ *****************************************************************************/
29
+ import { Color, MathUtils } from "@esotericsoftware/spine-core";
30
+ import { OrthoCamera } from "./Camera";
31
+ import { PolygonBatcher } from "./PolygonBatcher";
32
+ import { Shader } from "./Shader";
33
+ import { ShapeRenderer } from "./ShapeRenderer";
34
+ import { SkeletonDebugRenderer } from "./SkeletonDebugRenderer";
35
+ import { SkeletonRenderer } from "./SkeletonRenderer";
36
+ import { ManagedWebGLRenderingContext } from "./WebGL";
37
+ ;
38
+ const quad = [
39
+ 0, 0, 1, 1, 1, 1, 0, 0,
40
+ 0, 0, 1, 1, 1, 1, 0, 0,
41
+ 0, 0, 1, 1, 1, 1, 0, 0,
42
+ 0, 0, 1, 1, 1, 1, 0, 0,
43
+ ];
44
+ const QUAD_TRIANGLES = [0, 1, 2, 2, 3, 0];
45
+ const WHITE = new Color(1, 1, 1, 1);
46
+ export class SceneRenderer {
47
+ constructor(canvas, context, twoColorTint = true) {
48
+ this.twoColorTint = false;
49
+ this.canvas = canvas;
50
+ this.context = context instanceof ManagedWebGLRenderingContext ? context : new ManagedWebGLRenderingContext(context);
51
+ this.twoColorTint = twoColorTint;
52
+ this.camera = new OrthoCamera(canvas.width, canvas.height);
53
+ this.batcherShader = twoColorTint ? Shader.newTwoColoredTextured(this.context) : Shader.newColoredTextured(this.context);
54
+ this.batcher = new PolygonBatcher(this.context, twoColorTint);
55
+ this.shapesShader = Shader.newColored(this.context);
56
+ this.shapes = new ShapeRenderer(this.context);
57
+ this.skeletonRenderer = new SkeletonRenderer(this.context, twoColorTint);
58
+ this.skeletonDebugRenderer = new SkeletonDebugRenderer(this.context);
59
+ }
60
+ begin() {
61
+ this.camera.update();
62
+ this.enableRenderer(this.batcher);
63
+ }
64
+ drawSkeleton(skeleton, premultipliedAlpha = false, slotRangeStart = -1, slotRangeEnd = -1) {
65
+ this.enableRenderer(this.batcher);
66
+ this.skeletonRenderer.premultipliedAlpha = premultipliedAlpha;
67
+ this.skeletonRenderer.draw(this.batcher, skeleton, slotRangeStart, slotRangeEnd);
68
+ }
69
+ drawSkeletonDebug(skeleton, premultipliedAlpha = false, ignoredBones = null) {
70
+ this.enableRenderer(this.shapes);
71
+ this.skeletonDebugRenderer.premultipliedAlpha = premultipliedAlpha;
72
+ this.skeletonDebugRenderer.draw(this.shapes, skeleton, ignoredBones);
73
+ }
74
+ drawTexture(texture, x, y, width, height, color = null) {
75
+ this.enableRenderer(this.batcher);
76
+ if (color === null)
77
+ color = WHITE;
78
+ var i = 0;
79
+ quad[i++] = x;
80
+ quad[i++] = y;
81
+ quad[i++] = color.r;
82
+ quad[i++] = color.g;
83
+ quad[i++] = color.b;
84
+ quad[i++] = color.a;
85
+ quad[i++] = 0;
86
+ quad[i++] = 1;
87
+ if (this.twoColorTint) {
88
+ quad[i++] = 0;
89
+ quad[i++] = 0;
90
+ quad[i++] = 0;
91
+ quad[i++] = 0;
92
+ }
93
+ quad[i++] = x + width;
94
+ quad[i++] = y;
95
+ quad[i++] = color.r;
96
+ quad[i++] = color.g;
97
+ quad[i++] = color.b;
98
+ quad[i++] = color.a;
99
+ quad[i++] = 1;
100
+ quad[i++] = 1;
101
+ if (this.twoColorTint) {
102
+ quad[i++] = 0;
103
+ quad[i++] = 0;
104
+ quad[i++] = 0;
105
+ quad[i++] = 0;
106
+ }
107
+ quad[i++] = x + width;
108
+ quad[i++] = y + height;
109
+ quad[i++] = color.r;
110
+ quad[i++] = color.g;
111
+ quad[i++] = color.b;
112
+ quad[i++] = color.a;
113
+ quad[i++] = 1;
114
+ quad[i++] = 0;
115
+ if (this.twoColorTint) {
116
+ quad[i++] = 0;
117
+ quad[i++] = 0;
118
+ quad[i++] = 0;
119
+ quad[i++] = 0;
120
+ }
121
+ quad[i++] = x;
122
+ quad[i++] = y + height;
123
+ quad[i++] = color.r;
124
+ quad[i++] = color.g;
125
+ quad[i++] = color.b;
126
+ quad[i++] = color.a;
127
+ quad[i++] = 0;
128
+ quad[i++] = 0;
129
+ if (this.twoColorTint) {
130
+ quad[i++] = 0;
131
+ quad[i++] = 0;
132
+ quad[i++] = 0;
133
+ quad[i] = 0;
134
+ }
135
+ this.batcher.draw(texture, quad, QUAD_TRIANGLES);
136
+ }
137
+ drawTextureUV(texture, x, y, width, height, u, v, u2, v2, color = null) {
138
+ this.enableRenderer(this.batcher);
139
+ if (color === null)
140
+ color = WHITE;
141
+ var i = 0;
142
+ quad[i++] = x;
143
+ quad[i++] = y;
144
+ quad[i++] = color.r;
145
+ quad[i++] = color.g;
146
+ quad[i++] = color.b;
147
+ quad[i++] = color.a;
148
+ quad[i++] = u;
149
+ quad[i++] = v;
150
+ if (this.twoColorTint) {
151
+ quad[i++] = 0;
152
+ quad[i++] = 0;
153
+ quad[i++] = 0;
154
+ quad[i++] = 0;
155
+ }
156
+ quad[i++] = x + width;
157
+ quad[i++] = y;
158
+ quad[i++] = color.r;
159
+ quad[i++] = color.g;
160
+ quad[i++] = color.b;
161
+ quad[i++] = color.a;
162
+ quad[i++] = u2;
163
+ quad[i++] = v;
164
+ if (this.twoColorTint) {
165
+ quad[i++] = 0;
166
+ quad[i++] = 0;
167
+ quad[i++] = 0;
168
+ quad[i++] = 0;
169
+ }
170
+ quad[i++] = x + width;
171
+ quad[i++] = y + height;
172
+ quad[i++] = color.r;
173
+ quad[i++] = color.g;
174
+ quad[i++] = color.b;
175
+ quad[i++] = color.a;
176
+ quad[i++] = u2;
177
+ quad[i++] = v2;
178
+ if (this.twoColorTint) {
179
+ quad[i++] = 0;
180
+ quad[i++] = 0;
181
+ quad[i++] = 0;
182
+ quad[i++] = 0;
183
+ }
184
+ quad[i++] = x;
185
+ quad[i++] = y + height;
186
+ quad[i++] = color.r;
187
+ quad[i++] = color.g;
188
+ quad[i++] = color.b;
189
+ quad[i++] = color.a;
190
+ quad[i++] = u;
191
+ quad[i++] = v2;
192
+ if (this.twoColorTint) {
193
+ quad[i++] = 0;
194
+ quad[i++] = 0;
195
+ quad[i++] = 0;
196
+ quad[i] = 0;
197
+ }
198
+ this.batcher.draw(texture, quad, QUAD_TRIANGLES);
199
+ }
200
+ drawTextureRotated(texture, x, y, width, height, pivotX, pivotY, angle, color = null) {
201
+ this.enableRenderer(this.batcher);
202
+ if (color === null)
203
+ color = WHITE;
204
+ // bottom left and top right corner points relative to origin
205
+ let worldOriginX = x + pivotX;
206
+ let worldOriginY = y + pivotY;
207
+ let fx = -pivotX;
208
+ let fy = -pivotY;
209
+ let fx2 = width - pivotX;
210
+ let fy2 = height - pivotY;
211
+ // construct corner points, start from top left and go counter clockwise
212
+ let p1x = fx;
213
+ let p1y = fy;
214
+ let p2x = fx;
215
+ let p2y = fy2;
216
+ let p3x = fx2;
217
+ let p3y = fy2;
218
+ let p4x = fx2;
219
+ let p4y = fy;
220
+ let x1 = 0;
221
+ let y1 = 0;
222
+ let x2 = 0;
223
+ let y2 = 0;
224
+ let x3 = 0;
225
+ let y3 = 0;
226
+ let x4 = 0;
227
+ let y4 = 0;
228
+ // rotate
229
+ if (angle != 0) {
230
+ let cos = MathUtils.cosDeg(angle);
231
+ let sin = MathUtils.sinDeg(angle);
232
+ x1 = cos * p1x - sin * p1y;
233
+ y1 = sin * p1x + cos * p1y;
234
+ x4 = cos * p2x - sin * p2y;
235
+ y4 = sin * p2x + cos * p2y;
236
+ x3 = cos * p3x - sin * p3y;
237
+ y3 = sin * p3x + cos * p3y;
238
+ x2 = x3 + (x1 - x4);
239
+ y2 = y3 + (y1 - y4);
240
+ }
241
+ else {
242
+ x1 = p1x;
243
+ y1 = p1y;
244
+ x4 = p2x;
245
+ y4 = p2y;
246
+ x3 = p3x;
247
+ y3 = p3y;
248
+ x2 = p4x;
249
+ y2 = p4y;
250
+ }
251
+ x1 += worldOriginX;
252
+ y1 += worldOriginY;
253
+ x2 += worldOriginX;
254
+ y2 += worldOriginY;
255
+ x3 += worldOriginX;
256
+ y3 += worldOriginY;
257
+ x4 += worldOriginX;
258
+ y4 += worldOriginY;
259
+ var i = 0;
260
+ quad[i++] = x1;
261
+ quad[i++] = y1;
262
+ quad[i++] = color.r;
263
+ quad[i++] = color.g;
264
+ quad[i++] = color.b;
265
+ quad[i++] = color.a;
266
+ quad[i++] = 0;
267
+ quad[i++] = 1;
268
+ if (this.twoColorTint) {
269
+ quad[i++] = 0;
270
+ quad[i++] = 0;
271
+ quad[i++] = 0;
272
+ quad[i++] = 0;
273
+ }
274
+ quad[i++] = x2;
275
+ quad[i++] = y2;
276
+ quad[i++] = color.r;
277
+ quad[i++] = color.g;
278
+ quad[i++] = color.b;
279
+ quad[i++] = color.a;
280
+ quad[i++] = 1;
281
+ quad[i++] = 1;
282
+ if (this.twoColorTint) {
283
+ quad[i++] = 0;
284
+ quad[i++] = 0;
285
+ quad[i++] = 0;
286
+ quad[i++] = 0;
287
+ }
288
+ quad[i++] = x3;
289
+ quad[i++] = y3;
290
+ quad[i++] = color.r;
291
+ quad[i++] = color.g;
292
+ quad[i++] = color.b;
293
+ quad[i++] = color.a;
294
+ quad[i++] = 1;
295
+ quad[i++] = 0;
296
+ if (this.twoColorTint) {
297
+ quad[i++] = 0;
298
+ quad[i++] = 0;
299
+ quad[i++] = 0;
300
+ quad[i++] = 0;
301
+ }
302
+ quad[i++] = x4;
303
+ quad[i++] = y4;
304
+ quad[i++] = color.r;
305
+ quad[i++] = color.g;
306
+ quad[i++] = color.b;
307
+ quad[i++] = color.a;
308
+ quad[i++] = 0;
309
+ quad[i++] = 0;
310
+ if (this.twoColorTint) {
311
+ quad[i++] = 0;
312
+ quad[i++] = 0;
313
+ quad[i++] = 0;
314
+ quad[i] = 0;
315
+ }
316
+ this.batcher.draw(texture, quad, QUAD_TRIANGLES);
317
+ }
318
+ drawRegion(region, x, y, width, height, color = null) {
319
+ this.enableRenderer(this.batcher);
320
+ if (color === null)
321
+ color = WHITE;
322
+ var i = 0;
323
+ quad[i++] = x;
324
+ quad[i++] = y;
325
+ quad[i++] = color.r;
326
+ quad[i++] = color.g;
327
+ quad[i++] = color.b;
328
+ quad[i++] = color.a;
329
+ quad[i++] = region.u;
330
+ quad[i++] = region.v2;
331
+ if (this.twoColorTint) {
332
+ quad[i++] = 0;
333
+ quad[i++] = 0;
334
+ quad[i++] = 0;
335
+ quad[i++] = 0;
336
+ }
337
+ quad[i++] = x + width;
338
+ quad[i++] = y;
339
+ quad[i++] = color.r;
340
+ quad[i++] = color.g;
341
+ quad[i++] = color.b;
342
+ quad[i++] = color.a;
343
+ quad[i++] = region.u2;
344
+ quad[i++] = region.v2;
345
+ if (this.twoColorTint) {
346
+ quad[i++] = 0;
347
+ quad[i++] = 0;
348
+ quad[i++] = 0;
349
+ quad[i++] = 0;
350
+ }
351
+ quad[i++] = x + width;
352
+ quad[i++] = y + height;
353
+ quad[i++] = color.r;
354
+ quad[i++] = color.g;
355
+ quad[i++] = color.b;
356
+ quad[i++] = color.a;
357
+ quad[i++] = region.u2;
358
+ quad[i++] = region.v;
359
+ if (this.twoColorTint) {
360
+ quad[i++] = 0;
361
+ quad[i++] = 0;
362
+ quad[i++] = 0;
363
+ quad[i++] = 0;
364
+ }
365
+ quad[i++] = x;
366
+ quad[i++] = y + height;
367
+ quad[i++] = color.r;
368
+ quad[i++] = color.g;
369
+ quad[i++] = color.b;
370
+ quad[i++] = color.a;
371
+ quad[i++] = region.u;
372
+ quad[i++] = region.v;
373
+ if (this.twoColorTint) {
374
+ quad[i++] = 0;
375
+ quad[i++] = 0;
376
+ quad[i++] = 0;
377
+ quad[i] = 0;
378
+ }
379
+ this.batcher.draw(region.page.texture, quad, QUAD_TRIANGLES);
380
+ }
381
+ line(x, y, x2, y2, color = null, color2 = null) {
382
+ this.enableRenderer(this.shapes);
383
+ this.shapes.line(x, y, x2, y2, color);
384
+ }
385
+ triangle(filled, x, y, x2, y2, x3, y3, color = null, color2 = null, color3 = null) {
386
+ this.enableRenderer(this.shapes);
387
+ this.shapes.triangle(filled, x, y, x2, y2, x3, y3, color, color2, color3);
388
+ }
389
+ quad(filled, x, y, x2, y2, x3, y3, x4, y4, color = null, color2 = null, color3 = null, color4 = null) {
390
+ this.enableRenderer(this.shapes);
391
+ this.shapes.quad(filled, x, y, x2, y2, x3, y3, x4, y4, color, color2, color3, color4);
392
+ }
393
+ rect(filled, x, y, width, height, color = null) {
394
+ this.enableRenderer(this.shapes);
395
+ this.shapes.rect(filled, x, y, width, height, color);
396
+ }
397
+ rectLine(filled, x1, y1, x2, y2, width, color = null) {
398
+ this.enableRenderer(this.shapes);
399
+ this.shapes.rectLine(filled, x1, y1, x2, y2, width, color);
400
+ }
401
+ polygon(polygonVertices, offset, count, color = null) {
402
+ this.enableRenderer(this.shapes);
403
+ this.shapes.polygon(polygonVertices, offset, count, color);
404
+ }
405
+ circle(filled, x, y, radius, color = null, segments = 0) {
406
+ this.enableRenderer(this.shapes);
407
+ this.shapes.circle(filled, x, y, radius, color, segments);
408
+ }
409
+ curve(x1, y1, cx1, cy1, cx2, cy2, x2, y2, segments, color = null) {
410
+ this.enableRenderer(this.shapes);
411
+ this.shapes.curve(x1, y1, cx1, cy1, cx2, cy2, x2, y2, segments, color);
412
+ }
413
+ end() {
414
+ if (this.activeRenderer === this.batcher)
415
+ this.batcher.end();
416
+ else if (this.activeRenderer === this.shapes)
417
+ this.shapes.end();
418
+ this.activeRenderer = null;
419
+ }
420
+ resize(resizeMode) {
421
+ let canvas = this.canvas;
422
+ var dpr = window.devicePixelRatio || 1;
423
+ var w = Math.round(canvas.clientWidth * dpr);
424
+ var h = Math.round(canvas.clientHeight * dpr);
425
+ if (canvas.width != w || canvas.height != h) {
426
+ canvas.width = w;
427
+ canvas.height = h;
428
+ }
429
+ this.context.gl.viewport(0, 0, canvas.width, canvas.height);
430
+ // Nothing to do for stretch, we simply apply the viewport size of the camera.
431
+ if (resizeMode === ResizeMode.Expand)
432
+ this.camera.setViewport(w, h);
433
+ else if (resizeMode === ResizeMode.Fit) {
434
+ let sourceWidth = canvas.width, sourceHeight = canvas.height;
435
+ let targetWidth = this.camera.viewportWidth, targetHeight = this.camera.viewportHeight;
436
+ let targetRatio = targetHeight / targetWidth;
437
+ let sourceRatio = sourceHeight / sourceWidth;
438
+ let scale = targetRatio < sourceRatio ? targetWidth / sourceWidth : targetHeight / sourceHeight;
439
+ this.camera.setViewport(sourceWidth * scale, sourceHeight * scale);
440
+ }
441
+ this.camera.update();
442
+ }
443
+ enableRenderer(renderer) {
444
+ if (this.activeRenderer === renderer)
445
+ return;
446
+ this.end();
447
+ if (renderer instanceof PolygonBatcher) {
448
+ this.batcherShader.bind();
449
+ this.batcherShader.setUniform4x4f(Shader.MVP_MATRIX, this.camera.projectionView.values);
450
+ this.batcherShader.setUniformi("u_texture", 0);
451
+ this.batcher.begin(this.batcherShader);
452
+ this.activeRenderer = this.batcher;
453
+ }
454
+ else if (renderer instanceof ShapeRenderer) {
455
+ this.shapesShader.bind();
456
+ this.shapesShader.setUniform4x4f(Shader.MVP_MATRIX, this.camera.projectionView.values);
457
+ this.shapes.begin(this.shapesShader);
458
+ this.activeRenderer = this.shapes;
459
+ }
460
+ else
461
+ this.activeRenderer = this.skeletonDebugRenderer;
462
+ }
463
+ dispose() {
464
+ this.batcher.dispose();
465
+ this.batcherShader.dispose();
466
+ this.shapes.dispose();
467
+ this.shapesShader.dispose();
468
+ this.skeletonDebugRenderer.dispose();
469
+ }
470
+ }
471
+ export var ResizeMode;
472
+ (function (ResizeMode) {
473
+ ResizeMode[ResizeMode["Stretch"] = 0] = "Stretch";
474
+ ResizeMode[ResizeMode["Expand"] = 1] = "Expand";
475
+ ResizeMode[ResizeMode["Fit"] = 2] = "Fit";
476
+ })(ResizeMode || (ResizeMode = {}));
477
477
  //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2NlbmVSZW5kZXJlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9TY2VuZVJlbmRlcmVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7K0VBMkIrRTtBQUUvRSxPQUFPLEVBQUUsS0FBSyxFQUF3QixTQUFTLEVBQXNCLE1BQU0sOEJBQThCLENBQUM7QUFDMUcsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUV2QyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDbEQsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUNsQyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDaEQsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDaEUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDdEQsT0FBTyxFQUFFLDRCQUE0QixFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQ3ZELENBQUM7QUFFRCxNQUFNLElBQUksR0FBRztJQUNaLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQ3RCLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQ3RCLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQ3RCLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0NBQ3RCLENBQUM7QUFDRixNQUFNLGNBQWMsR0FBRyxDQUFD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QUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ2xDLElBQUksS0FBSyxLQUFLLElBQUk7WUFBRSxLQUFLLEdBQUcsS0FBSyxDQUFDO1FBQ2xDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNWLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNkLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNkLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDcEIsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUNwQixJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQ3BCLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDcEIsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2QsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2QsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFO1lBQ3RCLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNkLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNkLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNkLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztTQUNkO1FBQ0QsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEtBQUssQ0FBQztRQUN0QixJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDZCxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQ3BCLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDcEIsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUNwQixJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQ3BCLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNkLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNkLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRTtZQUN0QixJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDZCxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDZCxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDZCxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7U0FDZDtRQUNELElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxLQUFLLENBQUM7UUFDdEIsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLE1BQU0sQ0FBQztRQUN2QixJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQ3BCLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDcEIsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUNwQixJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQ3BCLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNkLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNkLElBQUksSUFB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QUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsS0FBSyxDQUFDO1FBQ3RCLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNkLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDcEIsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUNwQixJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQ3BCLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDcEIsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ2YsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2QsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFO1lBQ3RCLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNkLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNkLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNkLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztTQUNkO1FBQ0QsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEtBQUssQ0FBQztRQUN0QixJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsTUFBTSxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDcEIsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUNwQixJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQ3BCLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDcEIsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ2YsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ2YsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFO1lBQ3RCLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNkLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNkLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNkLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztTQUNkO1FBQ0QsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2QsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLE1BQU0sQ0FBQztRQUN2QixJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQ3BCLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDcEIsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUNwQixJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQ3BCLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNkLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUNmLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRTtZQUN0QixJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDZCxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDZCxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDZCxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1NBQ1o7UUFDRCxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxFQUFFLGNBQWMsQ0FBQyxDQUFDO0lBQ2xELENBQUM7SUFFRCxrQkFBa0IsQ0FBRSxPQUFrQixFQUFFLENBQVMsRUFBRSxDQUFTLEVBQUUsS0FBYSxFQUFFLE1BQWMsRUFBRSxNQUFjLEVBQUUsTUFBYyxFQUFFLEtBQWEsRUFBRSxRQUFlLElBQUk7UUFDOUosSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDbEMsSUFBSSxLQUFLLEtBQUssSUFBSTtZQUFFLEtBQUssR0FBRyxLQUFLLENBQUM7UUFFbEMsNkRBQTZEO1FBQzdELElBQUksWUFBWSxHQUFHLENBQUMsR0FBRyxNQUFNLENBQUM7UUFDOUIsSUFBSSxZQUFZLEdBQUcsQ0FBQyxHQUFHLE1BQU0sQ0FBQztRQUM5QixJQUFJLEVBQUUsR0FBRyxDQUFDLE1BQU0sQ0FBQztRQUNqQixJQUFJLEVBQUUsR0FBRyxDQUFDLE1BQU0sQ0FBQztRQUNqQixJQUFJLEdBQUcsR0FBRyxLQUFLLEdBQUcsTUFBTSxDQUFDO1FBQ3pCLElBQUksR0FBRyxHQUFHLE1BQU0sR0FBRyxNQUFNLENBQUM7UUFFMUIsd0VBQXdFO1FBQ3hFLElBQUksR0FBRyxHQUFHLEVBQUUsQ0FBQztRQUNiLElBQUksR0FBRyxHQUFHLEVBQUUsQ0FBQztRQUNiLElBQUksR0FBRyxHQUFHLEVBQUUsQ0FBQztRQUNiLElBQUksR0FBRyxHQUFHLEdBQUcsQ0FBQztRQUNkLElBQUksR0FBRyxHQUFHLEdBQUcsQ0FBQztRQUNkLElBQUksR0FBRyxHQUFHLEdBQUcsQ0FBQztRQUNkLElBQUksR0FBRyxHQUFHLEdBQUcsQ0FBQztRQUNkLElBQUksR0FBRyxHQUFHLEVBQUUsQ0FBQztRQUViLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQztRQUNYLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQztRQUNYLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQztRQUNYLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQztRQUNYLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQztRQUNYLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQztRQUNYLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQztRQUNYLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQztRQUVYLFNBQVM7UUFDVCxJQUFJLEtBQUssSUFBSSxDQUFDLEVBQUU7WUFDZixJQUFJLEdBQUcsR0FBRyxTQUFTLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ2xDLElBQUksR0FBRyxHQUFHLFNBQVMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7WUFFbEMsRUFBRSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztZQUMzQixFQUFFLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO1lBRTNCLEVBQUUsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7WUFDM0IsRUFBRSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztZQUUzQixFQUFFLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO1lBQzNCLEVBQUUsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7WUFFM0IsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztZQUNwQixFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO1NBQ3BCO2FBQU07WUFDTixFQUFFLEdBQUcsR0FBRyxDQUFDO1lBQ1QsRUFBRSxHQUFHLEdBQUcsQ0FBQztZQUVULEVBQUUsR0FBRyxHQUFHLENBQUM7WUFDVCxFQUFFLEdBQUcsR0FBRyxDQUFDO1lBRVQsRUFBRSxHQUFHLEdBQUcsQ0FBQztZQUNULEVBQUUsR0FBRyxHQUFHLENBQUM7WUFFVCxFQUFFLEdBQUcsR0FBRyxDQUFDO1lBQ1QsRUFBRSxHQUFHLEdBQUcsQ0FBQztTQUNUO1FBRUQsRUFBRSxJQUFJLFlBQVksQ0FBQztRQUNuQixFQUFFLElBQUksWUFBWSxDQUFDO1FBQ25CLEVBQUUsSUFBSSxZQUFZLENBQUM7UUFDbkIsRUFBRSxJQUFJLFlBQVksQ0FBQztRQUNuQixFQUFFLElBQUksWUFBWSxDQUFDO1FBQ25CLEVBQUUsSUFBSSxZQUFZLENBQUM7UUFDbkIsRUFBRSxJQUFJLFlBQVksQ0FBQztRQUNuQixFQUFFLElBQUksWUFBWSxDQUFDO1FBRW5CLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNWLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUNmLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUNmLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDcEIsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUNwQixJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQ3BCLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDcEIsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2QsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2QsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFO1lBQ3RCLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNkLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNkLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNkLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztTQUNkO1FBQ0QsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ2YsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ2YsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUNwQixJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQ3BCLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDcEIsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUNwQixJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDZCxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDZCxJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUU7WUFDdEIsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ2QsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ2QsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ2QsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1NBQ2Q7UUFDRCxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDZixJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDZixJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQ3BCLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDcEIsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUNwQixJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQ3BCLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNkLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNkLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRTtZQUN0QixJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDZCxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDZCxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDZCxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7U0FDZDtRQUNELElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUNmLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUNmLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDcEIsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUNwQixJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQ3BCLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDcEIsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2QsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2QsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFO1lBQ3RCLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNkLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNkLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNkLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7U0FDWjtRQUNELElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsY0FBYyxDQUFDLENBQUM7SUFDbEQsQ0FBQztJQUVELFVBQVUsQ0FBRSxNQUEwQixFQUFFLENBQVMsRUFBRSxDQUFTLEVBQUUsS0FBYSxFQUFFLE1BQWMsRUFBRSxRQUFlLElBQUk7UUFDL0csSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDbEMsSUFBSSxLQUFLLEtBQUssSUFBSTtZQUFFLEtBQUssR0FBRyxLQUFLLENBQUM7UUFDbEMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ1YsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2QsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2QsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUNwQixJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQ3BCLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDcEIsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUNwQixJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDO1FBQ3JCLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxFQUFFLENBQUM7UUFDdEIsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFO1lBQ3RCLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNkLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNkLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNkLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztTQUNkO1FBQ0QsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEtBQUssQ0FBQztRQUN0QixJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDZCxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQ3BCLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDcEIsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUNwQixJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQ3BCLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxFQUFFLENBQUM7UUFDdEIsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsTUFBTSxDQUFDLEVBQUUsQ0FBQztRQUN0QixJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUU7WUFDdEIsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ2QsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ2QsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ2QsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1NBQ2Q7UUFDRCxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsS0FBSyxDQUFDO1FBQ3RCLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxNQUFNLENBQUM7UUFDdkIsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUNwQixJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQ3BCLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDcEIsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUNwQixJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxNQUFNLENBQUMsRUFBRSxDQUFDO1FBQ3RCLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUM7UUFDckIsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFO1lBQ3RCLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNkLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNkLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNkLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztTQUNkO1FBQ0QsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2QsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLE1BQU0sQ0FBQztRQUN2QixJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQ3BCLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDcEIsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUNwQixJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENB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