@revideo/2d 0.2.5 → 0.2.6-alpha.904

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 (69) hide show
  1. package/lib/components/Audio.d.ts +11 -11
  2. package/lib/components/Audio.d.ts.map +1 -1
  3. package/lib/components/Audio.js +109 -115
  4. package/lib/components/Code.d.ts +211 -244
  5. package/lib/components/Code.d.ts.map +1 -1
  6. package/lib/components/Code.js +269 -317
  7. package/lib/components/CodeBlock.d.ts +67 -109
  8. package/lib/components/CodeBlock.d.ts.map +1 -1
  9. package/lib/components/CodeBlock.js +373 -414
  10. package/lib/components/Curve.js +269 -270
  11. package/lib/components/Grid.js +56 -63
  12. package/lib/components/Icon.js +50 -58
  13. package/lib/components/Img.d.ts +79 -86
  14. package/lib/components/Img.d.ts.map +1 -1
  15. package/lib/components/Img.js +181 -193
  16. package/lib/components/Knot.js +60 -81
  17. package/lib/components/Latex.js +65 -77
  18. package/lib/components/Layout.d.ts +413 -455
  19. package/lib/components/Layout.d.ts.map +1 -1
  20. package/lib/components/Layout.js +681 -666
  21. package/lib/components/Line.js +193 -216
  22. package/lib/components/Media.d.ts +35 -35
  23. package/lib/components/Media.d.ts.map +1 -1
  24. package/lib/components/Media.js +134 -135
  25. package/lib/components/Node.d.ts +830 -875
  26. package/lib/components/Node.d.ts.map +1 -1
  27. package/lib/components/Node.js +1314 -1383
  28. package/lib/components/SVG.js +541 -609
  29. package/lib/components/Shape.d.ts +35 -44
  30. package/lib/components/Shape.d.ts.map +1 -1
  31. package/lib/components/Shape.js +127 -112
  32. package/lib/components/Spline.js +175 -190
  33. package/lib/components/Txt.d.ts +44 -55
  34. package/lib/components/Txt.d.ts.map +1 -1
  35. package/lib/components/Txt.js +155 -156
  36. package/lib/components/TxtLeaf.d.ts +16 -20
  37. package/lib/components/TxtLeaf.d.ts.map +1 -1
  38. package/lib/components/TxtLeaf.js +2 -2
  39. package/lib/components/Video.d.ts +45 -41
  40. package/lib/components/Video.d.ts.map +1 -1
  41. package/lib/components/Video.js +202 -138
  42. package/lib/components/View2D.d.ts +22 -21
  43. package/lib/components/View2D.d.ts.map +1 -1
  44. package/lib/components/View2D.js +89 -98
  45. package/lib/components/index.js +1 -1
  46. package/lib/components/types.js +1 -1
  47. package/lib/curves/ArcSegment.js +94 -145
  48. package/lib/scenes/Scene2D.d.ts +23 -42
  49. package/lib/scenes/Scene2D.d.ts.map +1 -1
  50. package/lib/scenes/Scene2D.js +152 -161
  51. package/lib/scenes/index.js +1 -1
  52. package/lib/scenes/makeScene2D.js +10 -10
  53. package/lib/scenes/useScene2D.js +3 -3
  54. package/lib/tsconfig.build.tsbuildinfo +1 -1
  55. package/lib/utils/CanvasUtils.d.ts +21 -93
  56. package/package.json +5 -5
  57. package/src/lib/components/Audio.ts +2 -2
  58. package/src/lib/components/Code.ts +4 -2
  59. package/src/lib/components/CodeBlock.ts +1 -1
  60. package/src/lib/components/Img.ts +2 -2
  61. package/src/lib/components/Layout.ts +2 -2
  62. package/src/lib/components/Media.ts +3 -1
  63. package/src/lib/components/Node.ts +9 -9
  64. package/src/lib/components/Shape.ts +2 -2
  65. package/src/lib/components/Txt.ts +2 -2
  66. package/src/lib/components/TxtLeaf.ts +1 -1
  67. package/src/lib/components/Video.ts +114 -8
  68. package/src/lib/components/View2D.ts +6 -2
  69. package/src/lib/scenes/Scene2D.ts +4 -3
@@ -1,47 +1,21 @@
1
- var __decorate =
2
- (this && this.__decorate) ||
3
- function (decorators, target, key, desc) {
4
- var c = arguments.length,
5
- r =
6
- c < 3
7
- ? target
8
- : desc === null
9
- ? (desc = Object.getOwnPropertyDescriptor(target, key))
10
- : desc,
11
- d;
12
- if (typeof Reflect === 'object' && typeof Reflect.decorate === 'function')
13
- r = Reflect.decorate(decorators, target, key, desc);
14
- else
15
- for (var i = decorators.length - 1; i >= 0; i--)
16
- if ((d = decorators[i]))
17
- r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
18
5
  return c > 3 && r && Object.defineProperty(target, key, r), r;
19
- };
20
- import {
21
- BBox,
22
- Matrix2D,
23
- Vector2,
24
- all,
25
- clampRemap,
26
- delay,
27
- easeInOutSine,
28
- isReactive,
29
- lazy,
30
- threadable,
31
- tween,
32
- useLogger,
33
- } from '@revideo/core';
34
- import {computed, signal} from '../decorators';
35
- import {applyTransformDiff, getTransformDiff} from '../utils/diff';
36
- import {Circle} from './Circle';
37
- import {Img} from './Img';
38
- import {Layout} from './Layout';
39
- import {Line} from './Line';
40
- import {Node} from './Node';
41
- import {Path} from './Path';
42
- import {Rect} from './Rect';
43
- import {Shape} from './Shape';
44
- import {View2D} from './View2D';
6
+ };
7
+ import { BBox, Matrix2D, Vector2, all, clampRemap, delay, easeInOutSine, isReactive, lazy, threadable, tween, useLogger, } from '@revideo/core';
8
+ import { computed, signal } from '../decorators';
9
+ import { applyTransformDiff, getTransformDiff } from '../utils/diff';
10
+ import { Circle } from './Circle';
11
+ import { Img } from './Img';
12
+ import { Layout } from './Layout';
13
+ import { Line } from './Line';
14
+ import { Node } from './Node';
15
+ import { Path } from './Path';
16
+ import { Rect } from './Rect';
17
+ import { Shape } from './Shape';
18
+ import { View2D } from './View2D';
45
19
  /**
46
20
  A Node for drawing and animating SVG images.
47
21
 
@@ -49,597 +23,555 @@ A Node for drawing and animating SVG images.
49
23
  If you're not interested in animating SVG, you can use {@link Img} instead.
50
24
  */
51
25
  export class SVG extends Shape {
52
- constructor(props) {
53
- super(props);
54
- this.lastTweenTargetSrc = null;
55
- this.lastTweenTargetDocument = null;
56
- this.wrapper = new Node({});
57
- this.wrapper.children(this.documentNodes);
58
- this.wrapper.scale(this.wrapperScale);
59
- this.add(this.wrapper);
60
- }
61
- /**
62
- * Get all SVG nodes with the given id.
63
- * @param id - An id to query.
64
- */
65
- getChildrenById(id) {
66
- return this.document()
67
- .nodes.filter(node => node.id === id)
68
- .map(({shape}) => shape);
69
- }
70
- desiredSize() {
71
- const docSize = this.document().size;
72
- const scale = this.calculateWrapperScale(docSize, super.desiredSize());
73
- return docSize.mul(scale);
74
- }
75
- getCurrentSize() {
76
- return {
77
- x: this.width.isInitial() ? null : this.width(),
78
- y: this.height.isInitial() ? null : this.height(),
79
- };
80
- }
81
- calculateWrapperScale(documentSize, parentSize) {
82
- const result = new Vector2(1, 1);
83
- if (parentSize.x && parentSize.y) {
84
- result.x = parentSize.x / documentSize.width;
85
- result.y = parentSize.y / documentSize.height;
86
- } else if (parentSize.x && !parentSize.y) {
87
- result.x = parentSize.x / documentSize.width;
88
- result.y = result.x;
89
- } else if (!parentSize.x && parentSize.y) {
90
- result.y = parentSize.y / documentSize.height;
91
- result.x = result.y;
26
+ constructor(props) {
27
+ super(props);
28
+ this.lastTweenTargetSrc = null;
29
+ this.lastTweenTargetDocument = null;
30
+ this.wrapper = new Node({});
31
+ this.wrapper.children(this.documentNodes);
32
+ this.wrapper.scale(this.wrapperScale);
33
+ this.add(this.wrapper);
92
34
  }
93
- return result;
94
- }
95
- /**
96
- * Convert `SVGDocumentData` to `SVGDocument`.
97
- * @param data - `SVGDocumentData` to convert.
98
- */
99
- buildDocument(data) {
100
- return {
101
- size: data.size,
102
- nodes: data.nodes.map(ch => this.buildShape(ch)),
103
- };
104
- }
105
- /**
106
- * Convert `SVGShapeData` to `SVGShape`.
107
- * @param data - `SVGShapeData` to convert.
108
- */
109
- buildShape({id, type, props, children}) {
110
- return {
111
- id,
112
- shape: new type({
113
- children: children?.map(ch => this.buildShape(ch).shape),
114
- ...this.processElementStyle(props),
115
- }),
116
- };
117
- }
118
- /**
119
- * Convert an SVG string to `SVGDocument`.
120
- * @param svg - An SVG string to be parsed.
121
- */
122
- parseSVG(svg) {
123
- return this.buildDocument(SVG.parseSVGData(svg));
124
- }
125
- /**
126
- * Create a tweening list to tween between two SVG nodes.
127
- * @param from - The initial node,
128
- * @param to - The final node.
129
- * @param duration - The duration of the tween.
130
- * @param timing - The timing function.
131
- */
132
- *generateTransformer(from, to, duration, timing) {
133
- yield from.position(to.position(), duration, timing);
134
- yield from.scale(to.scale(), duration, timing);
135
- yield from.rotation(to.rotation(), duration, timing);
136
- if (
137
- from instanceof Path &&
138
- to instanceof Path &&
139
- from.data() !== to.data()
140
- ) {
141
- yield from.data(to.data(), duration, timing);
35
+ /**
36
+ * Get all SVG nodes with the given id.
37
+ * @param id - An id to query.
38
+ */
39
+ getChildrenById(id) {
40
+ return this.document()
41
+ .nodes.filter(node => node.id === id)
42
+ .map(({ shape }) => shape);
142
43
  }
143
- if (from instanceof Layout && to instanceof Layout) {
144
- yield from.size(to.size(), duration, timing);
44
+ desiredSize() {
45
+ const docSize = this.document().size;
46
+ const scale = this.calculateWrapperScale(docSize, super.desiredSize());
47
+ return docSize.mul(scale);
145
48
  }
146
- if (from instanceof Shape && to instanceof Shape) {
147
- yield from.fill(to.fill(), duration, timing);
148
- yield from.stroke(to.stroke(), duration, timing);
149
- yield from.lineWidth(to.lineWidth(), duration, timing);
49
+ getCurrentSize() {
50
+ return {
51
+ x: this.width.isInitial() ? null : this.width(),
52
+ y: this.height.isInitial() ? null : this.height(),
53
+ };
150
54
  }
151
- const fromChildren = from.children();
152
- const toChildren = to.children();
153
- for (let i = 0; i < fromChildren.length; i++) {
154
- yield* this.generateTransformer(
155
- fromChildren[i],
156
- toChildren[i],
157
- duration,
158
- timing,
159
- );
55
+ calculateWrapperScale(documentSize, parentSize) {
56
+ const result = new Vector2(1, 1);
57
+ if (parentSize.x && parentSize.y) {
58
+ result.x = parentSize.x / documentSize.width;
59
+ result.y = parentSize.y / documentSize.height;
60
+ }
61
+ else if (parentSize.x && !parentSize.y) {
62
+ result.x = parentSize.x / documentSize.width;
63
+ result.y = result.x;
64
+ }
65
+ else if (!parentSize.x && parentSize.y) {
66
+ result.y = parentSize.y / documentSize.height;
67
+ result.x = result.y;
68
+ }
69
+ return result;
160
70
  }
161
- }
162
- *tweenSvg(value, time, timingFunction) {
163
- const newValue = isReactive(value) ? value() : value;
164
- const newSVG = this.parseSVG(newValue);
165
- const currentSVG = this.document();
166
- const diff = getTransformDiff(currentSVG.nodes, newSVG.nodes);
167
- this.lastTweenTargetSrc = newValue;
168
- this.lastTweenTargetDocument = newSVG;
169
- applyTransformDiff(currentSVG.nodes, diff, ({shape, ...rest}) => ({
170
- ...rest,
171
- shape: shape.clone(),
172
- }));
173
- this.wrapper.children(currentSVG.nodes.map(shape => shape.shape));
174
- for (const item of currentSVG.nodes) {
175
- item.shape.parent(this.wrapper);
71
+ /**
72
+ * Convert `SVGDocumentData` to `SVGDocument`.
73
+ * @param data - `SVGDocumentData` to convert.
74
+ */
75
+ buildDocument(data) {
76
+ return {
77
+ size: data.size,
78
+ nodes: data.nodes.map(ch => this.buildShape(ch)),
79
+ };
176
80
  }
177
- const beginning = 0.2;
178
- const ending = 0.8;
179
- const overlap = 0.15;
180
- const transformator = [];
181
- const transformatorTime = (ending - beginning) * time;
182
- const transformatorDelay = beginning * time;
183
- for (const item of diff.transformed) {
184
- transformator.push(
185
- ...this.generateTransformer(
186
- item.from.current.shape,
187
- item.to.current.shape,
188
- transformatorTime,
189
- timingFunction,
190
- ),
191
- );
81
+ /**
82
+ * Convert `SVGShapeData` to `SVGShape`.
83
+ * @param data - `SVGShapeData` to convert.
84
+ */
85
+ buildShape({ id, type, props, children }) {
86
+ return {
87
+ id,
88
+ shape: new type({
89
+ children: children?.map(ch => this.buildShape(ch).shape),
90
+ ...this.processElementStyle(props),
91
+ }),
92
+ };
192
93
  }
193
- const autoWidth = this.width.isInitial();
194
- const autoHeight = this.height.isInitial();
195
- this.wrapper.scale(
196
- this.calculateWrapperScale(currentSVG.size, this.getCurrentSize()),
197
- );
198
- const baseTween = tween(
199
- time,
200
- value => {
201
- const progress = timingFunction(value);
202
- const remapped = clampRemap(beginning, ending, 0, 1, progress);
203
- const scale = this.wrapper.scale();
204
- if (autoWidth) {
205
- this.width(
206
- easeInOutSine(remapped, currentSVG.size.x, newSVG.size.x) * scale.x,
207
- );
94
+ /**
95
+ * Convert an SVG string to `SVGDocument`.
96
+ * @param svg - An SVG string to be parsed.
97
+ */
98
+ parseSVG(svg) {
99
+ return this.buildDocument(SVG.parseSVGData(svg));
100
+ }
101
+ /**
102
+ * Create a tweening list to tween between two SVG nodes.
103
+ * @param from - The initial node,
104
+ * @param to - The final node.
105
+ * @param duration - The duration of the tween.
106
+ * @param timing - The timing function.
107
+ */
108
+ *generateTransformer(from, to, duration, timing) {
109
+ yield from.position(to.position(), duration, timing);
110
+ yield from.scale(to.scale(), duration, timing);
111
+ yield from.rotation(to.rotation(), duration, timing);
112
+ if (from instanceof Path &&
113
+ to instanceof Path &&
114
+ from.data() !== to.data()) {
115
+ yield from.data(to.data(), duration, timing);
208
116
  }
209
- if (autoHeight) {
210
- this.height(
211
- easeInOutSine(remapped, currentSVG.size.y, newSVG.size.y) * scale.y,
212
- );
117
+ if (from instanceof Layout && to instanceof Layout) {
118
+ yield from.size(to.size(), duration, timing);
213
119
  }
214
- const deletedOpacity = clampRemap(
215
- 0,
216
- beginning + overlap,
217
- 1,
218
- 0,
219
- progress,
220
- );
221
- for (const {current} of diff.deleted) {
222
- current.shape.opacity(deletedOpacity);
120
+ if (from instanceof Shape && to instanceof Shape) {
121
+ yield from.fill(to.fill(), duration, timing);
122
+ yield from.stroke(to.stroke(), duration, timing);
123
+ yield from.lineWidth(to.lineWidth(), duration, timing);
223
124
  }
224
- const insertedOpacity = clampRemap(ending - overlap, 1, 0, 1, progress);
225
- for (const {current} of diff.inserted) {
226
- current.shape.opacity(insertedOpacity);
125
+ const fromChildren = from.children();
126
+ const toChildren = to.children();
127
+ for (let i = 0; i < fromChildren.length; i++) {
128
+ yield* this.generateTransformer(fromChildren[i], toChildren[i], duration, timing);
227
129
  }
228
- },
229
- () => {
230
- this.wrapper.children(this.documentNodes);
231
- if (autoWidth) this.width.reset();
232
- if (autoHeight) this.height.reset();
233
- for (const {current} of diff.deleted) current.shape.dispose();
234
- for (const {from} of diff.transformed) {
235
- from.current.shape.dispose();
130
+ }
131
+ *tweenSvg(value, time, timingFunction) {
132
+ const newValue = isReactive(value) ? value() : value;
133
+ const newSVG = this.parseSVG(newValue);
134
+ const currentSVG = this.document();
135
+ const diff = getTransformDiff(currentSVG.nodes, newSVG.nodes);
136
+ this.lastTweenTargetSrc = newValue;
137
+ this.lastTweenTargetDocument = newSVG;
138
+ applyTransformDiff(currentSVG.nodes, diff, ({ shape, ...rest }) => ({
139
+ ...rest,
140
+ shape: shape.clone(),
141
+ }));
142
+ this.wrapper.children(currentSVG.nodes.map(shape => shape.shape));
143
+ for (const item of currentSVG.nodes) {
144
+ item.shape.parent(this.wrapper);
236
145
  }
237
- this.wrapper.scale(this.wrapperScale);
238
- },
239
- );
240
- yield* all(
241
- this.wrapper.scale(
242
- this.calculateWrapperScale(newSVG.size, this.getCurrentSize()),
243
- time,
244
- timingFunction,
245
- ),
246
- baseTween,
247
- delay(transformatorDelay, all(...transformator)),
248
- );
249
- }
250
- wrapperScale() {
251
- return this.calculateWrapperScale(
252
- this.document().size,
253
- this.getCurrentSize(),
254
- );
255
- }
256
- /**
257
- * Get the current `SVGDocument`.
258
- */
259
- document() {
260
- try {
261
- const src = this.svg();
262
- if (this.lastTweenTargetDocument && src === this.lastTweenTargetSrc) {
263
- return this.lastTweenTargetDocument;
264
- }
265
- return this.parseSVG(src);
266
- } finally {
267
- this.lastTweenTargetSrc = null;
268
- this.lastTweenTargetDocument = null;
146
+ const beginning = 0.2;
147
+ const ending = 0.8;
148
+ const overlap = 0.15;
149
+ const transformator = [];
150
+ const transformatorTime = (ending - beginning) * time;
151
+ const transformatorDelay = beginning * time;
152
+ for (const item of diff.transformed) {
153
+ transformator.push(...this.generateTransformer(item.from.current.shape, item.to.current.shape, transformatorTime, timingFunction));
154
+ }
155
+ const autoWidth = this.width.isInitial();
156
+ const autoHeight = this.height.isInitial();
157
+ this.wrapper.scale(this.calculateWrapperScale(currentSVG.size, this.getCurrentSize()));
158
+ const baseTween = tween(time, value => {
159
+ const progress = timingFunction(value);
160
+ const remapped = clampRemap(beginning, ending, 0, 1, progress);
161
+ const scale = this.wrapper.scale();
162
+ if (autoWidth) {
163
+ this.width(easeInOutSine(remapped, currentSVG.size.x, newSVG.size.x) * scale.x);
164
+ }
165
+ if (autoHeight) {
166
+ this.height(easeInOutSine(remapped, currentSVG.size.y, newSVG.size.y) * scale.y);
167
+ }
168
+ const deletedOpacity = clampRemap(0, beginning + overlap, 1, 0, progress);
169
+ for (const { current } of diff.deleted) {
170
+ current.shape.opacity(deletedOpacity);
171
+ }
172
+ const insertedOpacity = clampRemap(ending - overlap, 1, 0, 1, progress);
173
+ for (const { current } of diff.inserted) {
174
+ current.shape.opacity(insertedOpacity);
175
+ }
176
+ }, () => {
177
+ this.wrapper.children(this.documentNodes);
178
+ if (autoWidth)
179
+ this.width.reset();
180
+ if (autoHeight)
181
+ this.height.reset();
182
+ for (const { current } of diff.deleted)
183
+ current.shape.dispose();
184
+ for (const { from } of diff.transformed) {
185
+ from.current.shape.dispose();
186
+ }
187
+ this.wrapper.scale(this.wrapperScale);
188
+ });
189
+ yield* all(this.wrapper.scale(this.calculateWrapperScale(newSVG.size, this.getCurrentSize()), time, timingFunction), baseTween, delay(transformatorDelay, all(...transformator)));
269
190
  }
270
- }
271
- /**
272
- * Get current document nodes.
273
- */
274
- documentNodes() {
275
- return this.document().nodes.map(node => node.shape);
276
- }
277
- /**
278
- * Convert SVG colors in Shape properties to Motion Canvas colors.
279
- * @param param - Shape properties.
280
- * @returns Converted Shape properties.
281
- */
282
- processElementStyle({fill, stroke, ...rest}) {
283
- return {
284
- fill: fill === 'currentColor' ? this.fill : SVG.processSVGColor(fill),
285
- stroke:
286
- stroke === 'currentColor' ? this.stroke : SVG.processSVGColor(stroke),
287
- ...rest,
288
- };
289
- }
290
- /**
291
- * Parse an SVG string as `SVGDocumentData`.
292
- * @param svg - And SVG string to be parsed.
293
- * @returns `SVGDocumentData` that can be used to build SVGDocument.
294
- */
295
- static parseSVGData(svg) {
296
- const cached = SVG.svgNodesPool[svg];
297
- if (cached && (cached.size.x > 0 || cached.size.y > 0)) return cached;
298
- SVG.containerElement.innerHTML = svg;
299
- const svgRoot = SVG.containerElement.querySelector('svg');
300
- if (!svgRoot) {
301
- useLogger().error({
302
- message: 'Invalid SVG',
303
- object: svg,
304
- });
305
- return {
306
- size: new Vector2(0, 0),
307
- nodes: [],
308
- };
191
+ wrapperScale() {
192
+ return this.calculateWrapperScale(this.document().size, this.getCurrentSize());
309
193
  }
310
- let viewBox = new BBox();
311
- let size = new Vector2();
312
- const hasViewBox = svgRoot.hasAttribute('viewBox');
313
- const hasSize =
314
- svgRoot.hasAttribute('width') || svgRoot.hasAttribute('height');
315
- if (hasViewBox) {
316
- const {x, y, width, height} = svgRoot.viewBox.baseVal;
317
- viewBox = new BBox(x, y, width, height);
318
- if (!hasSize) size = viewBox.size;
194
+ /**
195
+ * Get the current `SVGDocument`.
196
+ */
197
+ document() {
198
+ try {
199
+ const src = this.svg();
200
+ if (this.lastTweenTargetDocument && src === this.lastTweenTargetSrc) {
201
+ return this.lastTweenTargetDocument;
202
+ }
203
+ return this.parseSVG(src);
204
+ }
205
+ finally {
206
+ this.lastTweenTargetSrc = null;
207
+ this.lastTweenTargetDocument = null;
208
+ }
319
209
  }
320
- if (hasSize) {
321
- size = new Vector2(
322
- svgRoot.width.baseVal.value,
323
- svgRoot.height.baseVal.value,
324
- );
325
- if (!hasViewBox) viewBox = new BBox(0, 0, size.width, size.height);
210
+ /**
211
+ * Get current document nodes.
212
+ */
213
+ documentNodes() {
214
+ return this.document().nodes.map(node => node.shape);
326
215
  }
327
- if (!hasViewBox && !hasSize) {
328
- viewBox = new BBox(svgRoot.getBBox());
329
- size = viewBox.size;
216
+ /**
217
+ * Convert SVG colors in Shape properties to Motion Canvas colors.
218
+ * @param param - Shape properties.
219
+ * @returns Converted Shape properties.
220
+ */
221
+ processElementStyle({ fill, stroke, ...rest }) {
222
+ return {
223
+ fill: fill === 'currentColor' ? this.fill : SVG.processSVGColor(fill),
224
+ stroke: stroke === 'currentColor' ? this.stroke : SVG.processSVGColor(stroke),
225
+ ...rest,
226
+ };
330
227
  }
331
- const scale = size.div(viewBox.size);
332
- const center = viewBox.center;
333
- const rootTransform = new DOMMatrix()
334
- .scaleSelf(scale.x, scale.y)
335
- .translateSelf(-center.x, -center.y);
336
- const nodes = Array.from(
337
- SVG.extractGroupNodes(svgRoot, svgRoot, rootTransform, {}),
338
- );
339
- const builder = {
340
- size,
341
- nodes,
342
- };
343
- SVG.svgNodesPool[svg] = builder;
344
- return builder;
345
- }
346
- /**
347
- * Get position, rotation and scale from Matrix transformation as Shape properties
348
- * @param transform - Matrix transformation
349
- * @returns MotionCanvas Shape properties
350
- */
351
- static getMatrixTransformation(transform) {
352
- const matrix2 = new Matrix2D(transform);
353
- const position = matrix2.translation;
354
- const rotation = matrix2.rotation;
355
- // matrix.scaling can give incorrect result when matrix contain skew operation
356
- const scale = {
357
- x: matrix2.x.magnitude,
358
- y: matrix2.y.magnitude,
359
- };
360
- if (matrix2.determinant < 0) {
361
- if (matrix2.values[0] < matrix2.values[3]) scale.x = -scale.x;
362
- else scale.y = -scale.y;
228
+ /**
229
+ * Parse an SVG string as `SVGDocumentData`.
230
+ * @param svg - And SVG string to be parsed.
231
+ * @returns `SVGDocumentData` that can be used to build SVGDocument.
232
+ */
233
+ static parseSVGData(svg) {
234
+ const cached = SVG.svgNodesPool[svg];
235
+ if (cached && (cached.size.x > 0 || cached.size.y > 0))
236
+ return cached;
237
+ SVG.containerElement.innerHTML = svg;
238
+ const svgRoot = SVG.containerElement.querySelector('svg');
239
+ if (!svgRoot) {
240
+ useLogger().error({
241
+ message: 'Invalid SVG',
242
+ object: svg,
243
+ });
244
+ return {
245
+ size: new Vector2(0, 0),
246
+ nodes: [],
247
+ };
248
+ }
249
+ let viewBox = new BBox();
250
+ let size = new Vector2();
251
+ const hasViewBox = svgRoot.hasAttribute('viewBox');
252
+ const hasSize = svgRoot.hasAttribute('width') || svgRoot.hasAttribute('height');
253
+ if (hasViewBox) {
254
+ const { x, y, width, height } = svgRoot.viewBox.baseVal;
255
+ viewBox = new BBox(x, y, width, height);
256
+ if (!hasSize)
257
+ size = viewBox.size;
258
+ }
259
+ if (hasSize) {
260
+ size = new Vector2(svgRoot.width.baseVal.value, svgRoot.height.baseVal.value);
261
+ if (!hasViewBox)
262
+ viewBox = new BBox(0, 0, size.width, size.height);
263
+ }
264
+ if (!hasViewBox && !hasSize) {
265
+ viewBox = new BBox(svgRoot.getBBox());
266
+ size = viewBox.size;
267
+ }
268
+ const scale = size.div(viewBox.size);
269
+ const center = viewBox.center;
270
+ const rootTransform = new DOMMatrix()
271
+ .scaleSelf(scale.x, scale.y)
272
+ .translateSelf(-center.x, -center.y);
273
+ const nodes = Array.from(SVG.extractGroupNodes(svgRoot, svgRoot, rootTransform, {}));
274
+ const builder = {
275
+ size,
276
+ nodes,
277
+ };
278
+ SVG.svgNodesPool[svg] = builder;
279
+ return builder;
363
280
  }
364
- return {
365
- position,
366
- rotation,
367
- scale,
368
- };
369
- }
370
- /**
371
- * Convert an SVG color into a Motion Canvas color.
372
- * @param color - SVG color.
373
- * @returns Motion Canvas color.
374
- */
375
- static processSVGColor(color) {
376
- if (color === 'transparent' || color === 'none') {
377
- return null;
281
+ /**
282
+ * Get position, rotation and scale from Matrix transformation as Shape properties
283
+ * @param transform - Matrix transformation
284
+ * @returns MotionCanvas Shape properties
285
+ */
286
+ static getMatrixTransformation(transform) {
287
+ const matrix2 = new Matrix2D(transform);
288
+ const position = matrix2.translation;
289
+ const rotation = matrix2.rotation;
290
+ // matrix.scaling can give incorrect result when matrix contain skew operation
291
+ const scale = {
292
+ x: matrix2.x.magnitude,
293
+ y: matrix2.y.magnitude,
294
+ };
295
+ if (matrix2.determinant < 0) {
296
+ if (matrix2.values[0] < matrix2.values[3])
297
+ scale.x = -scale.x;
298
+ else
299
+ scale.y = -scale.y;
300
+ }
301
+ return {
302
+ position,
303
+ rotation,
304
+ scale,
305
+ };
378
306
  }
379
- return color;
380
- }
381
- /**
382
- * Get the final transformation matrix for the given SVG element.
383
- * @param element - SVG element.
384
- * @param parentTransform - The transformation matrix of the parent.
385
- */
386
- static getElementTransformation(element, parentTransform) {
387
- const transform = element.transform.baseVal.consolidate();
388
- const transformMatrix = (
389
- transform ? parentTransform.multiply(transform.matrix) : parentTransform
390
- ).translate(
391
- SVG.parseNumberAttribute(element, 'x'),
392
- SVG.parseNumberAttribute(element, 'y'),
393
- );
394
- return transformMatrix;
395
- }
396
- static parseLineCap(name) {
397
- if (!name) return null;
398
- if (name === 'butt' || name === 'round' || name === 'square') return name;
399
- useLogger().warn(`SVG: invalid line cap "${name}"`);
400
- return null;
401
- }
402
- static parseLineJoin(name) {
403
- if (!name) return null;
404
- if (name === 'bevel' || name === 'miter' || name === 'round') return name;
405
- if (name === 'arcs' || name === 'miter-clip') {
406
- useLogger().warn(`SVG: line join is not supported "${name}"`);
407
- } else {
408
- useLogger().warn(`SVG: invalid line join "${name}"`);
307
+ /**
308
+ * Convert an SVG color into a Motion Canvas color.
309
+ * @param color - SVG color.
310
+ * @returns Motion Canvas color.
311
+ */
312
+ static processSVGColor(color) {
313
+ if (color === 'transparent' || color === 'none') {
314
+ return null;
315
+ }
316
+ return color;
409
317
  }
410
- return null;
411
- }
412
- static parseLineDash(value) {
413
- if (!value) return null;
414
- const list = value.split(/,|\s+/);
415
- if (list.findIndex(str => str.endsWith('%')) > 0) {
416
- useLogger().warn(`SVG: percentage line dash are ignored`);
417
- return null;
318
+ /**
319
+ * Get the final transformation matrix for the given SVG element.
320
+ * @param element - SVG element.
321
+ * @param parentTransform - The transformation matrix of the parent.
322
+ */
323
+ static getElementTransformation(element, parentTransform) {
324
+ const transform = element.transform.baseVal.consolidate();
325
+ const transformMatrix = (transform ? parentTransform.multiply(transform.matrix) : parentTransform).translate(SVG.parseNumberAttribute(element, 'x'), SVG.parseNumberAttribute(element, 'y'));
326
+ return transformMatrix;
418
327
  }
419
- return list.map(str => parseFloat(str));
420
- }
421
- static parseDashOffset(value) {
422
- if (!value) return null;
423
- const trimmed = value.trim();
424
- if (trimmed.endsWith('%')) {
425
- useLogger().warn(`SVG: percentage line dash offset are ignored`);
328
+ static parseLineCap(name) {
329
+ if (!name)
330
+ return null;
331
+ if (name === 'butt' || name === 'round' || name === 'square')
332
+ return name;
333
+ useLogger().warn(`SVG: invalid line cap "${name}"`);
334
+ return null;
426
335
  }
427
- return parseFloat(trimmed);
428
- }
429
- static parseOpacity(value) {
430
- if (!value) return null;
431
- if (value.endsWith('%')) return parseFloat(value) / 100;
432
- return parseFloat(value);
433
- }
434
- /**
435
- * Convert the SVG element's style to a Motion Canvas Shape properties.
436
- * @param element - An SVG element whose style should be converted.
437
- * @param inheritedStyle - The parent style that should be inherited.
438
- */
439
- static getElementStyle(element, inheritedStyle) {
440
- return {
441
- fill: element.getAttribute('fill') ?? inheritedStyle.fill,
442
- stroke: element.getAttribute('stroke') ?? inheritedStyle.stroke,
443
- lineWidth: element.hasAttribute('stroke-width')
444
- ? parseFloat(element.getAttribute('stroke-width'))
445
- : inheritedStyle.lineWidth,
446
- lineCap:
447
- this.parseLineCap(element.getAttribute('stroke-linecap')) ??
448
- inheritedStyle.lineCap,
449
- lineJoin:
450
- this.parseLineJoin(element.getAttribute('stroke-linejoin')) ??
451
- inheritedStyle.lineJoin,
452
- lineDash:
453
- this.parseLineDash(element.getAttribute('stroke-dasharray')) ??
454
- inheritedStyle.lineDash,
455
- lineDashOffset:
456
- this.parseDashOffset(element.getAttribute('stroke-dashoffset')) ??
457
- inheritedStyle.lineDashOffset,
458
- opacity:
459
- this.parseOpacity(element.getAttribute('opacity')) ??
460
- inheritedStyle.opacity,
461
- layout: false,
462
- };
463
- }
464
- /**
465
- * Extract `SVGShapeData` list from the SVG element's children.
466
- * This will not extract the current element's shape.
467
- * @param element - An element whose children will be extracted.
468
- * @param svgRoot - The SVG root ("svg" tag) of the element.
469
- * @param parentTransform - The transformation matrix applied to the parent.
470
- * @param inheritedStyle - The style of the current SVG `element` that the children should inherit.
471
- */
472
- static *extractGroupNodes(element, svgRoot, parentTransform, inheritedStyle) {
473
- for (const child of element.children) {
474
- if (!(child instanceof SVGGraphicsElement)) continue;
475
- yield* this.extractElementNodes(
476
- child,
477
- svgRoot,
478
- parentTransform,
479
- inheritedStyle,
480
- );
336
+ static parseLineJoin(name) {
337
+ if (!name)
338
+ return null;
339
+ if (name === 'bevel' || name === 'miter' || name === 'round')
340
+ return name;
341
+ if (name === 'arcs' || name === 'miter-clip') {
342
+ useLogger().warn(`SVG: line join is not supported "${name}"`);
343
+ }
344
+ else {
345
+ useLogger().warn(`SVG: invalid line join "${name}"`);
346
+ }
347
+ return null;
481
348
  }
482
- }
483
- /**
484
- * Parse a number from an SVG element attribute.
485
- * @param element - SVG element whose attribute will be parsed.
486
- * @param name - The name of the attribute to parse.
487
- * @returns a parsed number or `0` if the attribute is not defined.
488
- */
489
- static parseNumberAttribute(element, name) {
490
- return parseFloat(element.getAttribute(name) ?? '0');
491
- }
492
- /**
493
- * Extract `SVGShapeData` list from the SVG element.
494
- * This will also recursively extract shapes from its children.
495
- * @param child - An SVG element to extract.
496
- * @param svgRoot - The SVG root ("svg" tag) of the element.
497
- * @param parentTransform - The transformation matrix applied to the parent.
498
- * @param inheritedStyle - The style of the parent SVG element that the element should inherit.
499
- */
500
- static *extractElementNodes(child, svgRoot, parentTransform, inheritedStyle) {
501
- const transformMatrix = SVG.getElementTransformation(
502
- child,
503
- parentTransform,
504
- );
505
- const style = SVG.getElementStyle(child, inheritedStyle);
506
- const id = child.id ?? '';
507
- if (child.tagName === 'g') {
508
- yield* SVG.extractGroupNodes(child, svgRoot, transformMatrix, style);
509
- } else if (child.tagName === 'use') {
510
- const hrefElement = svgRoot.querySelector(child.href.baseVal);
511
- if (!(hrefElement instanceof SVGGraphicsElement)) {
512
- useLogger().warn(`invalid SVG use tag. element "${child.outerHTML}"`);
513
- return;
514
- }
515
- yield* SVG.extractElementNodes(
516
- hrefElement,
517
- svgRoot,
518
- transformMatrix,
519
- inheritedStyle,
520
- );
521
- } else if (child.tagName === 'path') {
522
- const data = child.getAttribute('d');
523
- if (!data) {
524
- useLogger().warn('blank path data at ' + child.id);
525
- return;
526
- }
527
- const transformation = transformMatrix;
528
- yield {
529
- id: id || 'path',
530
- type: Path,
531
- props: {
532
- data,
533
- tweenAlignPath: true,
534
- ...SVG.getMatrixTransformation(transformation),
535
- ...style,
536
- },
537
- };
538
- } else if (child.tagName === 'rect') {
539
- const width = SVG.parseNumberAttribute(child, 'width');
540
- const height = SVG.parseNumberAttribute(child, 'height');
541
- const rx = SVG.parseNumberAttribute(child, 'rx');
542
- const ry = SVG.parseNumberAttribute(child, 'ry');
543
- const bbox = new BBox(0, 0, width, height);
544
- const center = bbox.center;
545
- const transformation = transformMatrix.translate(center.x, center.y);
546
- yield {
547
- id: id || 'rect',
548
- type: Rect,
549
- props: {
550
- width,
551
- height,
552
- radius: [rx, ry],
553
- ...SVG.getMatrixTransformation(transformation),
554
- ...style,
555
- },
556
- };
557
- } else if (['circle', 'ellipse'].includes(child.tagName)) {
558
- const cx = SVG.parseNumberAttribute(child, 'cx');
559
- const cy = SVG.parseNumberAttribute(child, 'cy');
560
- const size =
561
- child.tagName === 'circle'
562
- ? SVG.parseNumberAttribute(child, 'r') * 2
563
- : [
564
- SVG.parseNumberAttribute(child, 'rx') * 2,
565
- SVG.parseNumberAttribute(child, 'ry') * 2,
566
- ];
567
- const transformation = transformMatrix.translate(cx, cy);
568
- yield {
569
- id: id || child.tagName,
570
- type: Circle,
571
- props: {
572
- size,
573
- ...style,
574
- ...SVG.getMatrixTransformation(transformation),
575
- },
576
- };
577
- } else if (['line', 'polyline', 'polygon'].includes(child.tagName)) {
578
- const numbers =
579
- child.tagName === 'line'
580
- ? ['x1', 'y1', 'x2', 'y2'].map(attr =>
581
- SVG.parseNumberAttribute(child, attr),
582
- )
583
- : child
584
- .getAttribute('points')
585
- .match(/-?[\d.e+-]+/g)
586
- .map(value => parseFloat(value));
587
- const points = numbers.reduce((accum, current) => {
588
- let last = accum.at(-1);
589
- if (!last || last.length === 2) {
590
- last = [];
591
- accum.push(last);
349
+ static parseLineDash(value) {
350
+ if (!value)
351
+ return null;
352
+ const list = value.split(/,|\s+/);
353
+ if (list.findIndex(str => str.endsWith('%')) > 0) {
354
+ useLogger().warn(`SVG: percentage line dash are ignored`);
355
+ return null;
356
+ }
357
+ return list.map(str => parseFloat(str));
358
+ }
359
+ static parseDashOffset(value) {
360
+ if (!value)
361
+ return null;
362
+ const trimmed = value.trim();
363
+ if (trimmed.endsWith('%')) {
364
+ useLogger().warn(`SVG: percentage line dash offset are ignored`);
365
+ }
366
+ return parseFloat(trimmed);
367
+ }
368
+ static parseOpacity(value) {
369
+ if (!value)
370
+ return null;
371
+ if (value.endsWith('%'))
372
+ return parseFloat(value) / 100;
373
+ return parseFloat(value);
374
+ }
375
+ /**
376
+ * Convert the SVG element's style to a Motion Canvas Shape properties.
377
+ * @param element - An SVG element whose style should be converted.
378
+ * @param inheritedStyle - The parent style that should be inherited.
379
+ */
380
+ static getElementStyle(element, inheritedStyle) {
381
+ return {
382
+ fill: element.getAttribute('fill') ?? inheritedStyle.fill,
383
+ stroke: element.getAttribute('stroke') ?? inheritedStyle.stroke,
384
+ lineWidth: element.hasAttribute('stroke-width')
385
+ ? parseFloat(element.getAttribute('stroke-width'))
386
+ : inheritedStyle.lineWidth,
387
+ lineCap: this.parseLineCap(element.getAttribute('stroke-linecap')) ??
388
+ inheritedStyle.lineCap,
389
+ lineJoin: this.parseLineJoin(element.getAttribute('stroke-linejoin')) ??
390
+ inheritedStyle.lineJoin,
391
+ lineDash: this.parseLineDash(element.getAttribute('stroke-dasharray')) ??
392
+ inheritedStyle.lineDash,
393
+ lineDashOffset: this.parseDashOffset(element.getAttribute('stroke-dashoffset')) ??
394
+ inheritedStyle.lineDashOffset,
395
+ opacity: this.parseOpacity(element.getAttribute('opacity')) ??
396
+ inheritedStyle.opacity,
397
+ layout: false,
398
+ };
399
+ }
400
+ /**
401
+ * Extract `SVGShapeData` list from the SVG element's children.
402
+ * This will not extract the current element's shape.
403
+ * @param element - An element whose children will be extracted.
404
+ * @param svgRoot - The SVG root ("svg" tag) of the element.
405
+ * @param parentTransform - The transformation matrix applied to the parent.
406
+ * @param inheritedStyle - The style of the current SVG `element` that the children should inherit.
407
+ */
408
+ static *extractGroupNodes(element, svgRoot, parentTransform, inheritedStyle) {
409
+ for (const child of element.children) {
410
+ if (!(child instanceof SVGGraphicsElement))
411
+ continue;
412
+ yield* this.extractElementNodes(child, svgRoot, parentTransform, inheritedStyle);
413
+ }
414
+ }
415
+ /**
416
+ * Parse a number from an SVG element attribute.
417
+ * @param element - SVG element whose attribute will be parsed.
418
+ * @param name - The name of the attribute to parse.
419
+ * @returns a parsed number or `0` if the attribute is not defined.
420
+ */
421
+ static parseNumberAttribute(element, name) {
422
+ return parseFloat(element.getAttribute(name) ?? '0');
423
+ }
424
+ /**
425
+ * Extract `SVGShapeData` list from the SVG element.
426
+ * This will also recursively extract shapes from its children.
427
+ * @param child - An SVG element to extract.
428
+ * @param svgRoot - The SVG root ("svg" tag) of the element.
429
+ * @param parentTransform - The transformation matrix applied to the parent.
430
+ * @param inheritedStyle - The style of the parent SVG element that the element should inherit.
431
+ */
432
+ static *extractElementNodes(child, svgRoot, parentTransform, inheritedStyle) {
433
+ const transformMatrix = SVG.getElementTransformation(child, parentTransform);
434
+ const style = SVG.getElementStyle(child, inheritedStyle);
435
+ const id = child.id ?? '';
436
+ if (child.tagName === 'g') {
437
+ yield* SVG.extractGroupNodes(child, svgRoot, transformMatrix, style);
438
+ }
439
+ else if (child.tagName === 'use') {
440
+ const hrefElement = svgRoot.querySelector(child.href.baseVal);
441
+ if (!(hrefElement instanceof SVGGraphicsElement)) {
442
+ useLogger().warn(`invalid SVG use tag. element "${child.outerHTML}"`);
443
+ return;
444
+ }
445
+ yield* SVG.extractElementNodes(hrefElement, svgRoot, transformMatrix, inheritedStyle);
446
+ }
447
+ else if (child.tagName === 'path') {
448
+ const data = child.getAttribute('d');
449
+ if (!data) {
450
+ useLogger().warn('blank path data at ' + child.id);
451
+ return;
452
+ }
453
+ const transformation = transformMatrix;
454
+ yield {
455
+ id: id || 'path',
456
+ type: Path,
457
+ props: {
458
+ data,
459
+ tweenAlignPath: true,
460
+ ...SVG.getMatrixTransformation(transformation),
461
+ ...style,
462
+ },
463
+ };
464
+ }
465
+ else if (child.tagName === 'rect') {
466
+ const width = SVG.parseNumberAttribute(child, 'width');
467
+ const height = SVG.parseNumberAttribute(child, 'height');
468
+ const rx = SVG.parseNumberAttribute(child, 'rx');
469
+ const ry = SVG.parseNumberAttribute(child, 'ry');
470
+ const bbox = new BBox(0, 0, width, height);
471
+ const center = bbox.center;
472
+ const transformation = transformMatrix.translate(center.x, center.y);
473
+ yield {
474
+ id: id || 'rect',
475
+ type: Rect,
476
+ props: {
477
+ width,
478
+ height,
479
+ radius: [rx, ry],
480
+ ...SVG.getMatrixTransformation(transformation),
481
+ ...style,
482
+ },
483
+ };
484
+ }
485
+ else if (['circle', 'ellipse'].includes(child.tagName)) {
486
+ const cx = SVG.parseNumberAttribute(child, 'cx');
487
+ const cy = SVG.parseNumberAttribute(child, 'cy');
488
+ const size = child.tagName === 'circle'
489
+ ? SVG.parseNumberAttribute(child, 'r') * 2
490
+ : [
491
+ SVG.parseNumberAttribute(child, 'rx') * 2,
492
+ SVG.parseNumberAttribute(child, 'ry') * 2,
493
+ ];
494
+ const transformation = transformMatrix.translate(cx, cy);
495
+ yield {
496
+ id: id || child.tagName,
497
+ type: Circle,
498
+ props: {
499
+ size,
500
+ ...style,
501
+ ...SVG.getMatrixTransformation(transformation),
502
+ },
503
+ };
504
+ }
505
+ else if (['line', 'polyline', 'polygon'].includes(child.tagName)) {
506
+ const numbers = child.tagName === 'line'
507
+ ? ['x1', 'y1', 'x2', 'y2'].map(attr => SVG.parseNumberAttribute(child, attr))
508
+ : child
509
+ .getAttribute('points')
510
+ .match(/-?[\d.e+-]+/g)
511
+ .map(value => parseFloat(value));
512
+ const points = numbers.reduce((accum, current) => {
513
+ let last = accum.at(-1);
514
+ if (!last || last.length === 2) {
515
+ last = [];
516
+ accum.push(last);
517
+ }
518
+ last.push(current);
519
+ return accum;
520
+ }, []);
521
+ if (child.tagName === 'polygon')
522
+ points.push(points[0]);
523
+ yield {
524
+ id: id || child.tagName,
525
+ type: Line,
526
+ props: {
527
+ points,
528
+ ...style,
529
+ ...SVG.getMatrixTransformation(transformMatrix),
530
+ },
531
+ };
532
+ }
533
+ else if (child.tagName === 'image') {
534
+ const x = SVG.parseNumberAttribute(child, 'x');
535
+ const y = SVG.parseNumberAttribute(child, 'y');
536
+ const width = SVG.parseNumberAttribute(child, 'width');
537
+ const height = SVG.parseNumberAttribute(child, 'height');
538
+ const href = child.getAttribute('href') ?? '';
539
+ const bbox = new BBox(x, y, width, height);
540
+ const center = bbox.center;
541
+ const transformation = transformMatrix.translate(center.x, center.y);
542
+ yield {
543
+ id: id || child.tagName,
544
+ type: Img,
545
+ props: {
546
+ src: href,
547
+ ...style,
548
+ ...SVG.getMatrixTransformation(transformation),
549
+ },
550
+ };
592
551
  }
593
- last.push(current);
594
- return accum;
595
- }, []);
596
- if (child.tagName === 'polygon') points.push(points[0]);
597
- yield {
598
- id: id || child.tagName,
599
- type: Line,
600
- props: {
601
- points,
602
- ...style,
603
- ...SVG.getMatrixTransformation(transformMatrix),
604
- },
605
- };
606
- } else if (child.tagName === 'image') {
607
- const x = SVG.parseNumberAttribute(child, 'x');
608
- const y = SVG.parseNumberAttribute(child, 'y');
609
- const width = SVG.parseNumberAttribute(child, 'width');
610
- const height = SVG.parseNumberAttribute(child, 'height');
611
- const href = child.getAttribute('href') ?? '';
612
- const bbox = new BBox(x, y, width, height);
613
- const center = bbox.center;
614
- const transformation = transformMatrix.translate(center.x, center.y);
615
- yield {
616
- id: id || child.tagName,
617
- type: Img,
618
- props: {
619
- src: href,
620
- ...style,
621
- ...SVG.getMatrixTransformation(transformation),
622
- },
623
- };
624
552
  }
625
- }
626
553
  }
627
554
  SVG.svgNodesPool = {};
628
- __decorate([signal()], SVG.prototype, 'svg', void 0);
629
- __decorate([threadable()], SVG.prototype, 'tweenSvg', null);
630
- __decorate([computed()], SVG.prototype, 'wrapperScale', null);
631
- __decorate([computed()], SVG.prototype, 'document', null);
632
- __decorate([computed()], SVG.prototype, 'documentNodes', null);
633
- __decorate(
634
- [
555
+ __decorate([
556
+ signal()
557
+ ], SVG.prototype, "svg", void 0);
558
+ __decorate([
559
+ threadable()
560
+ ], SVG.prototype, "tweenSvg", null);
561
+ __decorate([
562
+ computed()
563
+ ], SVG.prototype, "wrapperScale", null);
564
+ __decorate([
565
+ computed()
566
+ ], SVG.prototype, "document", null);
567
+ __decorate([
568
+ computed()
569
+ ], SVG.prototype, "documentNodes", null);
570
+ __decorate([
635
571
  lazy(() => {
636
- const element = document.createElement('div');
637
- View2D.shadowRoot.appendChild(element);
638
- return element;
639
- }),
640
- ],
641
- SVG,
642
- 'containerElement',
643
- void 0,
644
- );
645
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU1ZHLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2xpYi9jb21wb25lbnRzL1NWRy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxPQUFPLEVBQ0wsSUFBSSxFQUNKLFFBQVEsRUFPUixPQUFPLEVBQ1AsR0FBRyxFQUNILFVBQVUsRUFDVixLQUFLLEVBQ0wsYUFBYSxFQUNiLFVBQVUsRUFDVixJQUFJLEVBQ0osVUFBVSxFQUNWLEtBQUssRUFDTCxTQUFTLEdBQ1YsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFDLFFBQVEsRUFBRSxNQUFNLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFFL0MsT0FBTyxFQUFDLGtCQUFrQixFQUFFLGdCQUFnQixFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ25FLE9BQU8sRUFBQyxNQUFNLEVBQWMsTUFBTSxVQUFVLENBQUM7QUFDN0MsT0FBTyxFQUFDLEdBQUcsRUFBVyxNQUFNLE9BQU8sQ0FBQztBQUNwQyxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sVUFBVSxDQUFDO0FBQ2hDLE9BQU8sRUFBQyxJQUFJLEVBQVksTUFBTSxRQUFRLENBQUM7QUFDdkMsT0FBTyxFQUFDLElBQUksRUFBWSxNQUFNLFFBQVEsQ0FBQztBQUN2QyxPQUFPLEVBQUMsSUFBSSxFQUFZLE1BQU0sUUFBUSxDQUFDO0FBQ3ZDLE9BQU8sRUFBQyxJQUFJLEVBQVksTUFBTSxRQUFRLENBQUM7QUFDdkMsT0FBTyxFQUFDLEtBQUssRUFBYSxNQUFNLFNBQVMsQ0FBQztBQUMxQyxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sVUFBVSxDQUFDO0FBOENoQzs7Ozs7R0FLRztBQUNILE1BQU0sT0FBTyxHQUFJLFNBQVEsS0FBSztJQXVCNUIsWUFBbUIsS0FBZTtRQUNoQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7UUFKUCx1QkFBa0IsR0FBa0IsSUFBSSxDQUFDO1FBQ3pDLDRCQUF1QixHQUF1QixJQUFJLENBQUM7UUFJekQsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUM1QixJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDMUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ3RDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3pCLENBQUM7SUFFRDs7O09BR0c7SUFDSSxlQUFlLENBQUMsRUFBVTtRQUMvQixPQUFPLElBQUksQ0FBQyxRQUFRLEVBQUU7YUFDbkIsS0FBSyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDO2FBQ3BDLEdBQUcsQ0FBQyxDQUFDLEVBQUMsS0FBSyxFQUFDLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzdCLENBQUM7SUFFa0IsV0FBVztRQUM1QixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsSUFBSSxDQUFDO1FBQ3JDLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxxQkFBcUIsQ0FDdEMsT0FBTyxFQUNQLEtBQUssQ0FBQyxXQUFXLEVBQXNDLENBQ3hELENBQUM7UUFDRixPQUFPLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDNUIsQ0FBQztJQUVTLGNBQWM7UUFDdEIsT0FBTztZQUNMLENBQUMsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUU7WUFDL0MsQ0FBQyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRTtTQUNsRCxDQUFDO0lBQ0osQ0FBQztJQUVTLHFCQUFxQixDQUM3QixZQUFxQixFQUNyQixVQUE0QztRQUU1QyxNQUFNLE1BQU0sR0FBRyxJQUFJLE9BQU8sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDakMsSUFBSSxVQUFVLENBQUMsQ0FBQyxJQUFJLFVBQVUsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUNqQyxNQUFNLENBQUMsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxDQUFDLEdBQUcsWUFBWSxDQUFDLEtBQUssQ0FBQztZQUM3QyxNQUFNLENBQUMsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxDQUFDLEdBQUcsWUFBWSxDQUFDLE1BQU0sQ0FBQztRQUNoRCxDQUFDO2FBQU0sSUFBSSxVQUFVLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ3pDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsVUFBVSxDQUFDLENBQUMsR0FBRyxZQUFZLENBQUMsS0FBSyxDQUFDO1lBQzdDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQztRQUN0QixDQUFDO2FBQU0sSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLElBQUksVUFBVSxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ3pDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsVUFBVSxDQUFDLENBQUMsR0FBRyxZQUFZLENBQUMsTUFBTSxDQUFDO1lBQzlDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQztRQUN0QixDQUFDO1FBQ0QsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztJQUVEOzs7T0FHRztJQUNPLGFBQWEsQ0FBQyxJQUFxQjtRQUMzQyxPQUFPO1lBQ0wsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJO1lBQ2YsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsQ0FBQztTQUNqRCxDQUFDO0lBQ0osQ0FBQztJQUVEOzs7T0FHRztJQUNPLFVBQVUsQ0FBQyxFQUFDLEVBQUUsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBZTtRQUM1RCxPQUFPO1lBQ0wsRUFBRTtZQUNGLEtBQUssRUFBRSxJQUFJLElBQUksQ0FBQztnQkFDZCxRQUFRLEVBQUUsUUFBUSxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDO2dCQUN4RCxHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLENBQUM7YUFDbkMsQ0FBQztTQUNILENBQUM7SUFDSixDQUFDO0lBRUQ7OztPQUdHO0lBQ08sUUFBUSxDQUFDLEdBQVc7UUFDNUIsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUNuRCxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ08sQ0FBQyxtQkFBbUIsQ0FDNUIsSUFBVSxFQUNWLEVBQVEsRUFDUixRQUFnQixFQUNoQixNQUFzQjtRQUV0QixNQUFNLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLFFBQVEsRUFBRSxFQUFFLFFBQVEsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUNyRCxNQUFNLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFLFFBQVEsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUMvQyxNQUFNLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLFFBQVEsRUFBRSxFQUFFLFFBQVEsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUNyRCxJQUNFLElBQUksWUFBWSxJQUFJO1lBQ3BCLEVBQUUsWUFBWSxJQUFJO1lBQ2xCLElBQUksQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLENBQUMsSUFBSSxFQUFFLEVBQ3pCLENBQUM7WUFDRCxNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxFQUFFLFFBQVEsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUMvQyxDQUFDO1FBQ0QsSUFBSSxJQUFJLFlBQVksTUFBTSxJQUFJLEVBQUUsWUFBWSxNQUFNLEVBQUUsQ0FBQztZQUNuRCxNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxFQUFFLFFBQVEsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUMvQyxDQUFDO1FBQ0QsSUFBSSxJQUFJLFlBQVksS0FBSyxJQUFJLEVBQUUsWUFBWSxLQUFLLEVBQUUsQ0FBQztZQUNqRCxNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxFQUFFLFFBQVEsRUFBRSxNQUFNLENBQUMsQ0FBQztZQUM3QyxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLE1BQU0sRUFBRSxFQUFFLFFBQVEsRUFBRSxNQUFNLENBQUMsQ0FBQztZQUNqRCxNQUFNLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLFNBQVMsRUFBRSxFQUFFLFFBQVEsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUN6RCxDQUFDO1FBRUQsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ3JDLE1BQU0sVUFBVSxHQUFHLEVBQUUsQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUNqQyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsWUFBWSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQzdDLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FDN0IsWUFBWSxDQUFDLENBQUMsQ0FBQyxFQUNmLFVBQVUsQ0FBQyxDQUFDLENBQUMsRUFDYixRQUFRLEVBQ1IsTUFBTSxDQUNQLENBQUM7UUFDSixDQUFDO0lBQ0gsQ0FBQztJQUdVLEFBQUQsQ0FBQyxRQUFRLENBQ2pCLEtBQTBCLEVBQzFCLElBQVksRUFDWixjQUE4QjtRQUU5QixNQUFNLFFBQVEsR0FBRyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7UUFDckQsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUN2QyxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDbkMsTUFBTSxJQUFJLEdBQUcsZ0JBQWdCLENBQUMsVUFBVSxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFOUQsSUFBSSxDQUFDLGtCQUFrQixHQUFHLFFBQVEsQ0FBQztRQUNuQyxJQUFJLENBQUMsdUJBQXVCLEdBQUcsTUFBTSxDQUFDO1FBRXRDLGtCQUFrQixDQUFDLFVBQVUsQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBQyxLQUFLLEVBQUUsR0FBRyxJQUFJLEVBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUNoRSxHQUFHLElBQUk7WUFDUCxLQUFLLEVBQUUsS0FBSyxDQUFDLEtBQUssRUFBRTtTQUNyQixDQUFDLENBQUMsQ0FBQztRQUNKLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDbEUsS0FBSyxNQUFNLElBQUksSUFBSSxVQUFVLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDcEMsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ2xDLENBQUM7UUFFRCxNQUFNLFNBQVMsR0FBRyxHQUFHLENBQUM7UUFDdEIsTUFBTSxNQUFNLEdBQUcsR0FBRyxDQUFDO1FBQ25CLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQztRQUVyQixNQUFNLGFBQWEsR0FBc0IsRUFBRSxDQUFDO1FBQzVDLE1BQU0saUJBQWlCLEdBQUcsQ0FBQyxNQUFNLEdBQUcsU0FBUyxDQUFDLEdBQUcsSUFBSSxDQUFDO1FBQ3RELE1BQU0sa0JBQWtCLEdBQUcsU0FBUyxHQUFHLElBQUksQ0FBQztRQUU1QyxLQUFLLE1BQU0sSUFBSSxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUNwQyxhQUFhLENBQUMsSUFBSSxDQUNoQixHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FDekIsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUN2QixJQUFJLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQ3JCLGlCQUFpQixFQUNqQixjQUFjLENBQ2YsQ0FDRixDQUFDO1FBQ0osQ0FBQztRQUVELE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDekMsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUMzQyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FDaEIsSUFBSSxDQUFDLHFCQUFxQixDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDLENBQ25FLENBQUM7UUFFRixNQUFNLFNBQVMsR0FBRyxLQUFLLENBQ3JCLElBQUksRUFDSixLQUFLLENBQUMsRUFBRTtZQUNOLE1BQU0sUUFBUSxHQUFHLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUN2QyxNQUFNLFFBQVEsR0FBRyxVQUFVLENBQUMsU0FBUyxFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBRS9ELE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDbkMsSUFBSSxTQUFTLEVBQUUsQ0FBQztnQkFDZCxJQUFJLENBQUMsS0FBSyxDQUNSLGFBQWEsQ0FBQyxRQUFRLEVBQUUsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUNwRSxDQUFDO1lBQ0osQ0FBQztZQUVELElBQUksVUFBVSxFQUFFLENBQUM7Z0JBQ2YsSUFBSSxDQUFDLE1BQU0sQ0FDVCxhQUFhLENBQUMsUUFBUSxFQUFFLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FDcEUsQ0FBQztZQUNKLENBQUM7WUFFRCxNQUFNLGNBQWMsR0FBRyxVQUFVLENBQy9CLENBQUMsRUFDRCxTQUFTLEdBQUcsT0FBTyxFQUNuQixDQUFDLEVBQ0QsQ0FBQyxFQUNELFFBQVEsQ0FDVCxDQUFDO1lBQ0YsS0FBSyxNQUFNLEVBQUMsT0FBTyxFQUFDLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO2dCQUNyQyxPQUFPLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQztZQUN4QyxDQUFDO1lBRUQsTUFBTSxlQUFlLEdBQUcsVUFBVSxDQUFDLE1BQU0sR0FBRyxPQUFPLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDeEUsS0FBSyxNQUFNLEVBQUMsT0FBTyxFQUFDLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO2dCQUN0QyxPQUFPLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxlQUFlLENBQUMsQ0FBQztZQUN6QyxDQUFDO1FBQ0gsQ0FBQyxFQUNELEdBQUcsRUFBRTtZQUNILElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztZQUMxQyxJQUFJLFNBQVM7Z0JBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNsQyxJQUFJLFVBQVU7Z0JBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUVwQyxLQUFLLE1BQU0sRUFBQyxPQUFPLEVBQUMsSUFBSSxJQUFJLENBQUMsT0FBTztnQkFBRSxPQUFPLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQzlELEtBQUssTUFBTSxFQUFDLElBQUksRUFBQyxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztnQkFDdEMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDL0IsQ0FBQztZQUNELElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUN4QyxDQUFDLENBQ0YsQ0FBQztRQUNGLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FDUixJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FDaEIsSUFBSSxDQUFDLHFCQUFxQixDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDLEVBQzlELElBQUksRUFDSixjQUFjLENBQ2YsRUFDRCxTQUFTLEVBQ1QsS0FBSyxDQUFDLGtCQUFrQixFQUFFLEdBQUcsQ0FBQyxHQUFHLGFBQWEsQ0FBQyxDQUFDLENBQ2pELENBQUM7SUFDSixDQUFDO0lBR08sWUFBWTtRQUNsQixPQUFPLElBQUksQ0FBQyxxQkFBcUIsQ0FDL0IsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLElBQUksRUFDcEIsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUN0QixDQUFDO0lBQ0osQ0FBQztJQUVEOztPQUVHO0lBRUssUUFBUTtRQUNkLElBQUksQ0FBQztZQUNILE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUN2QixJQUFJLElBQUksQ0FBQyx1QkFBdUIsSUFBSSxHQUFHLEtBQUssSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7Z0JBQ3BFLE9BQU8sSUFBSSxDQUFDLHVCQUF1QixDQUFDO1lBQ3RDLENBQUM7WUFDRCxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDNUIsQ0FBQztnQkFBUyxDQUFDO1lBQ1QsSUFBSSxDQUFDLGtCQUFrQixHQUFHLElBQUksQ0FBQztZQUMvQixJQUFJLENBQUMsdUJBQXVCLEdBQUcsSUFBSSxDQUFDO1FBQ3RDLENBQUM7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFFSyxhQUFhO1FBQ25CLE9BQU8sSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDdkQsQ0FBQztJQUVEOzs7O09BSUc7SUFDSyxtQkFBbUIsQ0FBQyxFQUFDLElBQUksRUFBRSxNQUFNLEVBQUUsR0FBRyxJQUFJLEVBQWE7UUFDN0QsT0FBTztZQUNMLElBQUksRUFBRSxJQUFJLEtBQUssY0FBYyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQztZQUNyRSxNQUFNLEVBQ0osTUFBTSxLQUFLLGNBQWMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUM7WUFDdkUsR0FBRyxJQUFJO1NBQ1IsQ0FBQztJQUNKLENBQUM7SUFFRDs7OztPQUlHO0lBQ08sTUFBTSxDQUFDLFlBQVksQ0FBQyxHQUFXO1FBQ3ZDLE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDckMsSUFBSSxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQUUsT0FBTyxNQUFNLENBQUM7UUFFdEUsR0FBRyxDQUFDLGdCQUFnQixDQUFDLFNBQVMsR0FBRyxHQUFHLENBQUM7UUFFckMsTUFBTSxPQUFPLEdBQUcsR0FBRyxDQUFDLGdCQUFnQixDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUUxRCxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDYixTQUFTLEVBQUUsQ0FBQyxLQUFLLENBQUM7Z0JBQ2hCLE9BQU8sRUFBRSxhQUFhO2dCQUN0QixNQUFNLEVBQUUsR0FBRzthQUNaLENBQUMsQ0FBQztZQUNILE9BQU87Z0JBQ0wsSUFBSSxFQUFFLElBQUksT0FBTyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7Z0JBQ3ZCLEtBQUssRUFBRSxFQUFFO2FBQ1MsQ0FBQztRQUN2QixDQUFDO1FBRUQsSUFBSSxPQUFPLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQztRQUN6QixJQUFJLElBQUksR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFDO1FBRXpCLE1BQU0sVUFBVSxHQUFHLE9BQU8sQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDbkQsTUFBTSxPQUFPLEdBQ1gsT0FBTyxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsSUFBSSxPQUFPLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBRWxFLElBQUksVUFBVSxFQUFFLENBQUM7WUFDZixNQUFNLEVBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFDLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUM7WUFDdEQsT0FBTyxHQUFHLElBQUksSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1lBRXhDLElBQUksQ0FBQyxPQUFPO2dCQUFFLElBQUksR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDO1FBQ3BDLENBQUM7UUFFRCxJQUFJLE9BQU8sRUFBRSxDQUFDO1lBQ1osSUFBSSxHQUFHLElBQUksT0FBTyxDQUNoQixPQUFPLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQzNCLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FDN0IsQ0FBQztZQUVGLElBQUksQ0FBQyxVQUFVO2dCQUFFLE9BQU8sR0FBRyxJQUFJLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3JFLENBQUM7UUFFRCxJQUFJLENBQUMsVUFBVSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDNUIsT0FBTyxHQUFHLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1lBQ3RDLElBQUksR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDO1FBQ3RCLENBQUM7UUFFRCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNyQyxNQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDO1FBRTlCLE1BQU0sYUFBYSxHQUFHLElBQUksU0FBUyxFQUFFO2FBQ2xDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUM7YUFDM0IsYUFBYSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUV2QyxNQUFNLEtBQUssR0FBRyxLQUFLLENBQUMsSUFBSSxDQUN0QixHQUFHLENBQUMsaUJBQWlCLENBQUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxhQUFhLEVBQUUsRUFBRSxDQUFDLENBQzNELENBQUM7UUFDRixNQUFNLE9BQU8sR0FBb0I7WUFDL0IsSUFBSTtZQUNKLEtBQUs7U0FDTixDQUFDO1FBQ0YsR0FBRyxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsR0FBRyxPQUFPLENBQUM7UUFDaEMsT0FBTyxPQUFPLENBQUM7SUFDakIsQ0FBQztJQUVEOzs7O09BSUc7SUFDTyxNQUFNLENBQUMsdUJBQXVCLENBQUMsU0FBb0I7UUFDM0QsTUFBTSxPQUFPLEdBQUcsSUFBSSxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUM7UUFFeEMsTUFBTSxRQUFRLEdBQUcsT0FBTyxDQUFDLFdBQVcsQ0FBQztRQUNyQyxNQUFNLFFBQVEsR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDO1FBQ2xDLDhFQUE4RTtRQUM5RSxNQUFNLEtBQUssR0FBRztZQUNaLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLFNBQVM7WUFDdEIsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsU0FBUztTQUN2QixDQUFDO1FBQ0YsSUFBSSxPQUFPLENBQUMsV0FBVyxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQzVCLElBQUksT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztnQkFBRSxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQzs7Z0JBQ3pELEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQzFCLENBQUM7UUFDRCxPQUFPO1lBQ0wsUUFBUTtZQUNSLFFBQVE7WUFDUixLQUFLO1NBQ04sQ0FBQztJQUNKLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ssTUFBTSxDQUFDLGVBQWUsQ0FDNUIsS0FBbUQ7UUFFbkQsSUFBSSxLQUFLLEtBQUssYUFBYSxJQUFJLEtBQUssS0FBSyxNQUFNLEVBQUUsQ0FBQztZQUNoRCxPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7UUFFRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ssTUFBTSxDQUFDLHdCQUF3QixDQUNyQyxPQUEyQixFQUMzQixlQUEwQjtRQUUxQixNQUFNLFNBQVMsR0FBRyxPQUFPLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUMxRCxNQUFNLGVBQWUsR0FBRyxDQUN0QixTQUFTLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQ3pFLENBQUMsU0FBUyxDQUNULEdBQUcsQ0FBQyxvQkFBb0IsQ0FBQyxPQUFPLEVBQUUsR0FBRyxDQUFDLEVBQ3RDLEdBQUcsQ0FBQyxvQkFBb0IsQ0FBQyxPQUFPLEVBQUUsR0FBRyxDQUFDLENBQ3ZDLENBQUM7UUFDRixPQUFPLGVBQWUsQ0FBQztJQUN6QixDQUFDO0lBRU8sTUFBTSxDQUFDLFlBQVksQ0FBQyxJQUFtQjtRQUM3QyxJQUFJLENBQUMsSUFBSTtZQUFFLE9BQU8sSUFBSSxDQUFDO1FBQ3ZCLElBQUksSUFBSSxLQUFLLE1BQU0sSUFBSSxJQUFJLEtBQUssT0FBTyxJQUFJLElBQUksS0FBSyxRQUFRO1lBQUUsT0FBTyxJQUFJLENBQUM7UUFFMUUsU0FBUyxFQUFFLENBQUMsSUFBSSxDQUFDLDBCQUEwQixJQUFJLEdBQUcsQ0FBQyxDQUFDO1FBQ3BELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVPLE1BQU0sQ0FBQyxhQUFhLENBQUMsSUFBbUI7UUFDOUMsSUFBSSxDQUFDLElBQUk7WUFBRSxPQUFPLElBQUksQ0FBQztRQUN2QixJQUFJLElBQUksS0FBSyxPQUFPLElBQUksSUFBSSxLQUFLLE9BQU8sSUFBSSxJQUFJLEtBQUssT0FBTztZQUFFLE9BQU8sSUFBSSxDQUFDO1FBRTFFLElBQUksSUFBSSxLQUFLLE1BQU0sSUFBSSxJQUFJLEtBQUssWUFBWSxFQUFFLENBQUM7WUFDN0MsU0FBUyxFQUFFLENBQUMsSUFBSSxDQUFDLG9DQUFvQyxJQUFJLEdBQUcsQ0FBQyxDQUFDO1FBQ2hFLENBQUM7YUFBTSxDQUFDO1lBQ04sU0FBUyxFQUFFLENBQUMsSUFBSSxDQUFDLDJCQUEyQixJQUFJLEdBQUcsQ0FBQyxDQUFDO1FBQ3ZELENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFTyxNQUFNLENBQUMsYUFBYSxDQUFDLEtBQW9CO1FBQy9DLElBQUksQ0FBQyxLQUFLO1lBQUUsT0FBTyxJQUFJLENBQUM7UUFFeEIsTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNsQyxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDakQsU0FBUyxFQUFFLENBQUMsSUFBSSxDQUFDLHVDQUF1QyxDQUFDLENBQUM7WUFDMUQsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDMUMsQ0FBQztJQUVPLE1BQU0sQ0FBQyxlQUFlLENBQUMsS0FBb0I7UUFDakQsSUFBSSxDQUFDLEtBQUs7WUFBRSxPQUFPLElBQUksQ0FBQztRQUN4QixNQUFNLE9BQU8sR0FBRyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDN0IsSUFBSSxPQUFPLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDMUIsU0FBUyxFQUFFLENBQUMsSUFBSSxDQUFDLDhDQUE4QyxDQUFDLENBQUM7UUFDbkUsQ0FBQztRQUNELE9BQU8sVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzdCLENBQUM7SUFFTyxNQUFNLENBQUMsWUFBWSxDQUFDLEtBQW9CO1FBQzlDLElBQUksQ0FBQyxLQUFLO1lBQUUsT0FBTyxJQUFJLENBQUM7UUFDeEIsSUFBSSxLQUFLLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQztZQUFFLE9BQU8sVUFBVSxDQUFDLEtBQUssQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUN4RCxPQUFPLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMzQixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNLLE1BQU0sQ0FBQyxlQUFlLENBQzVCLE9BQTJCLEVBQzNCLGNBQTBCO1FBRTFCLE9BQU87WUFDTCxJQUFJLEVBQUUsT0FBTyxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsSUFBSSxjQUFjLENBQUMsSUFBSTtZQUN6RCxNQUFNLEVBQUUsT0FBTyxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsSUFBSSxjQUFjLENBQUMsTUFBTTtZQUMvRCxTQUFTLEVBQUUsT0FBTyxDQUFDLFlBQVksQ0FBQyxjQUFjLENBQUM7Z0JBQzdDLENBQUMsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxjQUFjLENBQUUsQ0FBQztnQkFDbkQsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxTQUFTO1lBQzVCLE9BQU8sRUFDTCxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztnQkFDekQsY0FBYyxDQUFDLE9BQU87WUFDeEIsUUFBUSxFQUNOLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO2dCQUMzRCxjQUFjLENBQUMsUUFBUTtZQUN6QixRQUFRLEVBQ04sSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLGtCQUFrQixDQUFDLENBQUM7Z0JBQzVELGNBQWMsQ0FBQyxRQUFRO1lBQ3pCLGNBQWMsRUFDWixJQUFJLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsbUJBQW1CLENBQUMsQ0FBQztnQkFDL0QsY0FBYyxDQUFDLGNBQWM7WUFDL0IsT0FBTyxFQUNMLElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQztnQkFDbEQsY0FBYyxDQUFDLE9BQU87WUFDeEIsTUFBTSxFQUFFLEtBQUs7U0FDZCxDQUFDO0lBQ0osQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSyxNQUFNLENBQUMsQ0FBQyxpQkFBaUIsQ0FDL0IsT0FBbUIsRUFDbkIsT0FBZ0IsRUFDaEIsZUFBMEIsRUFDMUIsY0FBMEI7UUFFMUIsS0FBSyxNQUFNLEtBQUssSUFBSSxPQUFPLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDckMsSUFBSSxDQUFDLENBQUMsS0FBSyxZQUFZLGtCQUFrQixDQUFDO2dCQUFFLFNBQVM7WUFFckQsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUM3QixLQUFLLEVBQ0wsT0FBTyxFQUNQLGVBQWUsRUFDZixjQUFjLENBQ2YsQ0FBQztRQUNKLENBQUM7SUFDSCxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSyxNQUFNLENBQUMsb0JBQW9CLENBQ2pDLE9BQW1CLEVBQ25CLElBQVk7UUFFWixPQUFPLFVBQVUsQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDO0lBQ3ZELENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0ssTUFBTSxDQUFDLENBQUMsbUJBQW1CLENBQ2pDLEtBQXlCLEVBQ3pCLE9BQWdCLEVBQ2hCLGVBQTBCLEVBQzFCLGNBQTBCO1FBRTFCLE1BQU0sZUFBZSxHQUFHLEdBQUcsQ0FBQyx3QkFBd0IsQ0FDbEQsS0FBSyxFQUNMLGVBQWUsQ0FDaEIsQ0FBQztRQUNGLE1BQU0sS0FBSyxHQUFHLEdBQUcsQ0FBQyxlQUFlLENBQUMsS0FBSyxFQUFFLGNBQWMsQ0FBQyxDQUFDO1FBQ3pELE1BQU0sRUFBRSxHQUFHLEtBQUssQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDO1FBQzFCLElBQUksS0FBSyxDQUFDLE9BQU8sS0FBSyxHQUFHLEVBQUUsQ0FBQztZQUMxQixLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsaUJBQWlCLENBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSxlQUFlLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDdkUsQ0FBQzthQUFNLElBQUksS0FBSyxDQUFDLE9BQU8sS0FBSyxLQUFLLEVBQUUsQ0FBQztZQUNuQyxNQUFNLFdBQVcsR0FBRyxPQUFPLENBQUMsYUFBYSxDQUN0QyxLQUF1QixDQUFDLElBQUksQ0FBQyxPQUFPLENBQ3RDLENBQUM7WUFDRixJQUFJLENBQUMsQ0FBQyxXQUFXLFlBQVksa0JBQWtCLENBQUMsRUFBRSxDQUFDO2dCQUNqRCxTQUFTLEVBQUUsQ0FBQyxJQUFJLENBQUMsaUNBQWlDLEtBQUssQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDO2dCQUN0RSxPQUFPO1lBQ1QsQ0FBQztZQUVELEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxtQkFBbUIsQ0FDNUIsV0FBVyxFQUNYLE9BQU8sRUFDUCxlQUFlLEVBQ2YsY0FBYyxDQUNmLENBQUM7UUFDSixDQUFDO2FBQU0sSUFBSSxLQUFLLENBQUMsT0FBTyxLQUFLLE1BQU0sRUFBRSxDQUFDO1lBQ3BDLE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDckMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO2dCQUNWLFNBQVMsRUFBRSxDQUFDLElBQUksQ0FBQyxxQkFBcUIsR0FBRyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7Z0JBQ25ELE9BQU87WUFDVCxDQUFDO1lBQ0QsTUFBTSxjQUFjLEdBQUcsZUFBZSxDQUFDO1lBQ3ZDLE1BQU07Z0JBQ0osRUFBRSxFQUFFLEVBQUUsSUFBSSxNQUFNO2dCQUNoQixJQUFJLEVBQUUsSUFBaUQ7Z0JBQ3ZELEtBQUssRUFBRTtvQkFDTCxJQUFJO29CQUNKLGNBQWMsRUFBRSxJQUFJO29CQUNwQixHQUFHLEdBQUcsQ0FBQyx1QkFBdUIsQ0FBQyxjQUFjLENBQUM7b0JBQzlDLEdBQUcsS0FBSztpQkFDSTthQUNmLENBQUM7UUFDSixDQUFDO2FBQU0sSUFBSSxLQUFLLENBQUMsT0FBTyxLQUFLLE1BQU0sRUFBRSxDQUFDO1lBQ3BDLE1BQU0sS0FBSyxHQUFHLEdBQUcsQ0FBQyxvQkFBb0IsQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLENBQUM7WUFDdkQsTUFBTSxNQUFNLEdBQUcsR0FBRyxDQUFDLG9CQUFvQixDQUFDLEtBQUssRUFBRSxRQUFRLENBQUMsQ0FBQztZQUN6RCxNQUFNLEVBQUUsR0FBRyxHQUFHLENBQUMsb0JBQW9CLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQ2pELE1BQU0sRUFBRSxHQUFHLEdBQUcsQ0FBQyxvQkFBb0IsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFFakQsTUFBTSxJQUFJLEdBQUcsSUFBSSxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUM7WUFDM0MsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztZQUMzQixNQUFNLGNBQWMsR0FBRyxlQUFlLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBRXJFLE1BQU07Z0JBQ0osRUFBRSxFQUFFLEVBQUUsSUFBSSxNQUFNO2dCQUNoQixJQUFJLEVBQUUsSUFBSTtnQkFDVixLQUFLLEVBQUU7b0JBQ0wsS0FBSztvQkFDTCxNQUFNO29CQUNOLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUM7b0JBQ2hCLEdBQUcsR0FBRyxDQUFDLHVCQUF1QixDQUFDLGNBQWMsQ0FBQztvQkFDOUMsR0FBRyxLQUFLO2lCQUNJO2FBQ2YsQ0FBQztRQUNKLENBQUM7YUFBTSxJQUFJLENBQUMsUUFBUSxFQUFFLFNBQVMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztZQUN6RCxNQUFNLEVBQUUsR0FBRyxHQUFHLENBQUMsb0JBQW9CLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQ2pELE1BQU0sRUFBRSxHQUFHLEdBQUcsQ0FBQyxvQkFBb0IsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDakQsTUFBTSxJQUFJLEdBQ1IsS0FBSyxDQUFDLE9BQU8sS0FBSyxRQUFRO2dCQUN4QixDQUFDLENBQUMsR0FBRyxDQUFDLG9CQUFvQixDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDO2dCQUMxQyxDQUFDLENBQUM7b0JBQ0UsR0FBRyxDQUFDLG9CQUFvQixDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDO29CQUN6QyxHQUFHLENBQUMsb0JBQW9CLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUM7aUJBQzFDLENBQUM7WUFFUixNQUFNLGNBQWMsR0FBRyxlQUFlLENBQUMsU0FBUyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUV6RCxNQUFNO2dCQUNKLEVBQUUsRUFBRSxFQUFFLElBQUksS0FBSyxDQUFDLE9BQU87Z0JBQ3ZCLElBQUksRUFBRSxNQUFNO2dCQUNaLEtBQUssRUFBRTtvQkFDTCxJQUFJO29CQUNKLEdBQUcsS0FBSztvQkFDUixHQUFHLEdBQUcsQ0FBQyx1QkFBdUIsQ0FBQyxjQUFjLENBQUM7aUJBQ2hDO2FBQ2pCLENBQUM7UUFDSixDQUFDO2FBQU0sSUFBSSxDQUFDLE1BQU0sRUFBRSxVQUFVLEVBQUUsU0FBUyxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQ25FLE1BQU0sT0FBTyxHQUNYLEtBQUssQ0FBQyxPQUFPLEtBQUssTUFBTTtnQkFDdEIsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQ2xDLEdBQUcsQ0FBQyxvQkFBb0IsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQ3RDO2dCQUNILENBQUMsQ0FBQyxLQUFLO3FCQUNGLFlBQVksQ0FBQyxRQUFRLENBQUU7cUJBQ3ZCLEtBQUssQ0FBQyxjQUFjLENBQUU7cUJBQ3RCLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1lBQ3pDLE1BQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQWEsQ0FBQyxLQUFLLEVBQUUsT0FBTyxFQUFFLEVBQUU7Z0JBQzNELElBQUksSUFBSSxHQUFHLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDeEIsSUFBSSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO29CQUMvQixJQUFJLEdBQUcsRUFBRSxDQUFDO29CQUNWLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ25CLENBQUM7Z0JBQ0QsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFDbkIsT0FBTyxLQUFLLENBQUM7WUFDZixDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFFUCxJQUFJLEtBQUssQ0FBQyxPQUFPLEtBQUssU0FBUztnQkFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBRXhELE1BQU07Z0JBQ0osRUFBRSxFQUFFLEVBQUUsSUFBSSxLQUFLLENBQUMsT0FBTztnQkFDdkIsSUFBSSxFQUFFLElBQWlEO2dCQUN2RCxLQUFLLEVBQUU7b0JBQ0wsTUFBTTtvQkFDTixHQUFHLEtBQUs7b0JBQ1IsR0FBRyxHQUFHLENBQUMsdUJBQXVCLENBQUMsZUFBZSxDQUFDO2lCQUNuQzthQUNmLENBQUM7UUFDSixDQUFDO2FBQU0sSUFBSSxLQUFLLENBQUMsT0FBTyxLQUFLLE9BQU8sRUFBRSxDQUFDO1lBQ3JDLE1BQU0sQ0FBQyxHQUFHLEdBQUcsQ0FBQyxvQkFBb0IsQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDL0MsTUFBTSxDQUFDLEdBQUcsR0FBRyxDQUFDLG9CQUFvQixDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsQ0FBQztZQUMvQyxNQUFNLEtBQUssR0FBRyxHQUFHLENBQUMsb0JBQW9CLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBQ3ZELE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxvQkFBb0IsQ0FBQyxLQUFLLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDekQsTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUM7WUFFOUMsTUFBTSxJQUFJLEdBQUcsSUFBSSxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUM7WUFDM0MsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztZQUMzQixNQUFNLGNBQWMsR0FBRyxlQUFlLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBRXJFLE1BQU07Z0JBQ0osRUFBRSxFQUFFLEVBQUUsSUFBSSxLQUFLLENBQUMsT0FBTztnQkFDdkIsSUFBSSxFQUFFLEdBQUc7Z0JBQ1QsS0FBSyxFQUFFO29CQUNMLEdBQUcsRUFBRSxJQUFJO29CQUNULEdBQUcsS0FBSztvQkFDUixHQUFHLEdBQUcsQ0FBQyx1QkFBdUIsQ0FBQyxjQUFjLENBQUM7aUJBQ25DO2FBQ2QsQ0FBQztRQUNKLENBQUM7SUFDSCxDQUFDOztBQXhyQmMsZ0JBQVksR0FBb0MsRUFBRSxBQUF0QyxDQUF1QztBQU0xQztJQUR2QixNQUFNLEVBQUU7Z0NBQytDO0FBNEk3QztJQURWLFVBQVUsRUFBRTttQ0F3R1o7QUFHTztJQURQLFFBQVEsRUFBRTt1Q0FNVjtBQU1PO0lBRFAsUUFBUSxFQUFFO21DQVlWO0FBTU87SUFEUCxRQUFRLEVBQUU7d0NBR1Y7QUEzUmdCO0lBTGhCLElBQUksQ0FBQyxHQUFHLEVBQUU7UUFDVCxNQUFNLE9BQU8sR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzlDLE1BQU0sQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3ZDLE9BQU8sT0FBTyxDQUFDO0lBQ2pCLENBQUMsQ0FBQzttQ0FDZ0QifQ==
572
+ const element = document.createElement('div');
573
+ View2D.shadowRoot.appendChild(element);
574
+ return element;
575
+ })
576
+ ], SVG, "containerElement", void 0);
577
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU1ZHLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2xpYi9jb21wb25lbnRzL1NWRy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxPQUFPLEVBQ0wsSUFBSSxFQUNKLFFBQVEsRUFPUixPQUFPLEVBQ1AsR0FBRyxFQUNILFVBQVUsRUFDVixLQUFLLEVBQ0wsYUFBYSxFQUNiLFVBQVUsRUFDVixJQUFJLEVBQ0osVUFBVSxFQUNWLEtBQUssRUFDTCxTQUFTLEdBQ1YsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFDLFFBQVEsRUFBRSxNQUFNLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFFL0MsT0FBTyxFQUFDLGtCQUFrQixFQUFFLGdCQUFnQixFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ25FLE9BQU8sRUFBQyxNQUFNLEVBQWMsTUFBTSxVQUFVLENBQUM7QUFDN0MsT0FBTyxFQUFDLEdBQUcsRUFBVyxNQUFNLE9BQU8sQ0FBQztBQUNwQyxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sVUFBVSxDQUFDO0FBQ2hDLE9BQU8sRUFBQyxJQUFJLEVBQVksTUFBTSxRQUFRLENBQUM7QUFDdkMsT0FBTyxFQUFDLElBQUksRUFBWSxNQUFNLFFBQVEsQ0FBQztBQUN2QyxPQUFPLEVBQUMsSUFBSSxFQUFZLE1BQU0sUUFBUSxDQUFDO0FBQ3ZDLE9BQU8sRUFBQyxJQUFJLEVBQVksTUFBTSxRQUFRLENBQUM7QUFDdkMsT0FBTyxFQUFDLEtBQUssRUFBYSxNQUFNLFNBQVMsQ0FBQztBQUMxQyxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sVUFBVSxDQUFDO0FBOENoQzs7Ozs7R0FLRztBQUNILE1BQU0sT0FBTyxHQUFJLFNBQVEsS0FBSztJQXVCNUIsWUFBbUIsS0FBZTtRQUNoQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7UUFKUCx1QkFBa0IsR0FBa0IsSUFBSSxDQUFDO1FBQ3pDLDRCQUF1QixHQUF1QixJQUFJLENBQUM7UUFJ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