modern-path2d 1.2.18 → 1.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -62,6 +62,11 @@ class Vector2 {
62
62
  get array() {
63
63
  return [this.x, this.y];
64
64
  }
65
+ finite() {
66
+ this.x = Number.isFinite(this.x) ? this.x : 0;
67
+ this.y = Number.isFinite(this.y) ? this.y : 0;
68
+ return this;
69
+ }
65
70
  set(x, y) {
66
71
  this.x = x;
67
72
  this.y = y;
@@ -1594,8 +1599,13 @@ class Curve {
1594
1599
  return [];
1595
1600
  }
1596
1601
  applyTransform(transform) {
1602
+ const isFunction = typeof transform === "function";
1597
1603
  this.getControlPointRefs().forEach((p) => {
1598
- p.applyMatrix3(transform);
1604
+ if (isFunction) {
1605
+ transform(p);
1606
+ } else {
1607
+ p.applyMatrix3(transform);
1608
+ }
1599
1609
  });
1600
1610
  return this;
1601
1611
  }
@@ -1747,7 +1757,7 @@ class Curve {
1747
1757
  min.min(p);
1748
1758
  max.max(p);
1749
1759
  }
1750
- return { min, max };
1760
+ return { min: min.finite(), max: max.finite() };
1751
1761
  }
1752
1762
  getBoundingBox() {
1753
1763
  const { min, max } = this.getMinMax();
@@ -1783,7 +1793,7 @@ class Curve {
1783
1793
  const p1 = getPoint(indices[i]);
1784
1794
  const p2 = getPoint(indices[i + 1]);
1785
1795
  const p3 = getPoint(indices[i + 2]);
1786
- polygonStr += `<polygon points="${p1.join(",")} ${p2.join(",")} ${p3.join(",")}" fill="none" stroke="black" />`;
1796
+ polygonStr += `<polygon points="${p1.join(",")} ${p2.join(",")} ${p3.join(",")}" fill="none" stroke="black" stroke-width="0.5" stroke-linecap="round" stroke-linejoin="round" />`;
1787
1797
  }
1788
1798
  const viewBox = [min.x, min.y, max.x - min.x, max.y - min.y];
1789
1799
  return `<svg width="${viewBox[2]}" height="${viewBox[3]}" viewBox="${viewBox.join(" ")}" xmlns="http://www.w3.org/2000/svg">${polygonStr}</svg>`;
@@ -2095,7 +2105,7 @@ class RoundCurve extends Curve {
2095
2105
  min.y = Math.min(min.y, cy - halfHeight);
2096
2106
  max.x = Math.max(max.x, cx + halfWidth);
2097
2107
  max.y = Math.max(max.y, cy + halfHeight);
2098
- return { min, max };
2108
+ return { min: min.finite(), max: max.finite() };
2099
2109
  }
2100
2110
  copy(source) {
2101
2111
  super.copy(source);
@@ -2348,7 +2358,7 @@ class LineCurve extends Curve {
2348
2358
  min.y = Math.min(min.y, p1.y, p2.y);
2349
2359
  max.x = Math.max(max.x, p1.x, p2.x);
2350
2360
  max.y = Math.max(max.y, p1.y, p2.y);
2351
- return { min, max };
2361
+ return { min: min.finite(), max: max.finite() };
2352
2362
  }
2353
2363
  toCommands() {
2354
2364
  const { p1, p2 } = this;
@@ -2534,7 +2544,7 @@ class CompositeCurve extends Curve {
2534
2544
  }
2535
2545
  getMinMax(min = Vector2.MAX, max = Vector2.MIN) {
2536
2546
  this.curves.forEach((curve) => curve.getMinMax(min, max));
2537
- return { min, max };
2547
+ return { min: min.finite(), max: max.finite() };
2538
2548
  }
2539
2549
  getBoundingBox() {
2540
2550
  const { min, max } = this.getMinMax();
@@ -2634,7 +2644,7 @@ class CubicBezierCurve extends Curve {
2634
2644
  }
2635
2645
  };
2636
2646
  samplePoints(tValues, 10);
2637
- return { min, max };
2647
+ return { min: min.finite(), max: max.finite() };
2638
2648
  }
2639
2649
  toCommands() {
2640
2650
  const { p1, cp1, cp2, p2 } = this;
@@ -2781,7 +2791,7 @@ class QuadraticBezierCurve extends Curve {
2781
2791
  min.y = Math.min(min.y, p1.y, p2.y, y1, y2);
2782
2792
  max.x = Math.max(max.x, p1.x, p2.x, x1, x2);
2783
2793
  max.y = Math.max(max.y, p1.y, p2.y, y1, y2);
2784
- return { min, max };
2794
+ return { min: min.finite(), max: max.finite() };
2785
2795
  }
2786
2796
  toCommands() {
2787
2797
  const { p1, cp, p2 } = this;
@@ -3423,7 +3433,7 @@ class Path2D extends CompositeCurve {
3423
3433
  }
3424
3434
  }
3425
3435
  });
3426
- return { min, max };
3436
+ return { min: min.finite(), max: max.finite() };
3427
3437
  }
3428
3438
  strokeTriangulate(options) {
3429
3439
  const indices = options?.indices ?? [];
@@ -3559,6 +3569,61 @@ class Path2DSet {
3559
3569
  }
3560
3570
  }
3561
3571
 
3572
+ class FFDControlGrid {
3573
+ constructor(rows, cols, width = 1, height = 1) {
3574
+ this.rows = rows;
3575
+ this.cols = cols;
3576
+ this.width = width;
3577
+ this.height = height;
3578
+ for (let i = 0; i < rows; i++) {
3579
+ this.controlPoints[i] = [];
3580
+ for (let j = 0; j < cols; j++) {
3581
+ this.controlPoints[i][j] = {
3582
+ x: j / (cols - 1) * width,
3583
+ y: i / (rows - 1) * height
3584
+ };
3585
+ }
3586
+ }
3587
+ }
3588
+ controlPoints = [];
3589
+ moveControlPoint(i, j, dx, dy) {
3590
+ this.controlPoints[i][j].x += dx;
3591
+ this.controlPoints[i][j].y += dy;
3592
+ return this;
3593
+ }
3594
+ }
3595
+ function bsplineBasis(t) {
3596
+ const B = [];
3597
+ B[0] = (1 - t) ** 3 / 6;
3598
+ B[1] = (3 * t ** 3 - 6 * t ** 2 + 4) / 6;
3599
+ B[2] = (-3 * t ** 3 + 3 * t ** 2 + 3 * t + 1) / 6;
3600
+ B[3] = t ** 3 / 6;
3601
+ return B;
3602
+ }
3603
+ function applyFFD(point, grid, width = grid.width, height = grid.height) {
3604
+ const s = point.x / width * (grid.cols - 1);
3605
+ const t = point.y / height * (grid.rows - 1);
3606
+ const i = Math.floor(s);
3607
+ const j = Math.floor(t);
3608
+ const u = s - i;
3609
+ const v = t - j;
3610
+ const bu = bsplineBasis(u);
3611
+ const bv = bsplineBasis(v);
3612
+ let x = 0;
3613
+ let y = 0;
3614
+ for (let m = 0; m < 4; m++) {
3615
+ for (let n = 0; n < 4; n++) {
3616
+ const row = Math.min(Math.max(j - 1 + m, 0), grid.rows - 1);
3617
+ const col = Math.min(Math.max(i - 1 + n, 0), grid.cols - 1);
3618
+ const cp = grid.controlPoints[row][col];
3619
+ const weight = bu[n] * bv[m];
3620
+ x += cp.x * weight;
3621
+ y += cp.y * weight;
3622
+ }
3623
+ }
3624
+ point.set(x, y);
3625
+ }
3626
+
3562
3627
  const dataUri = "data:image/svg+xml;";
3563
3628
  const base64DataUri = `${dataUri}base64,`;
3564
3629
  const utf8DataUri = `${dataUri}charset=utf8,`;
@@ -4096,6 +4161,7 @@ exports.Curve = Curve;
4096
4161
  exports.CurvePath = CurvePath;
4097
4162
  exports.EllipseCurve = EllipseCurve;
4098
4163
  exports.EquilateralPloygonCurve = EquilateralPloygonCurve;
4164
+ exports.FFDControlGrid = FFDControlGrid;
4099
4165
  exports.LineCurve = LineCurve;
4100
4166
  exports.Matrix3 = Matrix3;
4101
4167
  exports.Path2D = Path2D;
@@ -4106,6 +4172,7 @@ exports.RectangleCurve = RectangleCurve;
4106
4172
  exports.RoundRectangleCurve = RoundRectangleCurve;
4107
4173
  exports.SplineCurve = SplineCurve;
4108
4174
  exports.Vector2 = Vector2;
4175
+ exports.applyFFD = applyFFD;
4109
4176
  exports.catmullRom = catmullRom;
4110
4177
  exports.cubicBezier = cubicBezier;
4111
4178
  exports.drawPoint = drawPoint;
package/dist/index.d.cts CHANGED
@@ -81,6 +81,7 @@ declare class Vector2 {
81
81
  static get MIN(): Vector2;
82
82
  get array(): [number, number];
83
83
  constructor(x?: number, y?: number);
84
+ finite(): this;
84
85
  set(x: number, y: number): this;
85
86
  add(vec: VectorLike): this;
86
87
  sub(vec: VectorLike): this;
@@ -136,7 +137,7 @@ declare abstract class Curve {
136
137
  getPointAt(u: number, output?: Vector2): Vector2;
137
138
  isClockwise(): boolean;
138
139
  getControlPointRefs(): Vector2[];
139
- applyTransform(transform: Matrix3): this;
140
+ applyTransform(transform: Matrix3 | ((point: Vector2) => void)): this;
140
141
  getUnevenPointArray(count?: number, output?: number[]): number[];
141
142
  getSpacedPointArray(count?: number, output?: number[]): number[];
142
143
  getAdaptivePointArray(output?: number[]): number[];
@@ -225,7 +226,7 @@ declare class CompositeCurve<T extends Curve = Curve> extends Curve {
225
226
  getSpacedPointArray(count?: number, output?: number[]): number[];
226
227
  getAdaptivePointArray(output?: number[]): number[];
227
228
  fillTriangulate(options?: FillTriangulateOptions): FillTriangulatedResult;
228
- applyTransform(transform: Matrix3): this;
229
+ applyTransform(transform: Matrix3 | ((point: Vector2) => void)): this;
229
230
  getMinMax(min?: Vector2, max?: Vector2): {
230
231
  min: Vector2;
231
232
  max: Vector2;
@@ -521,6 +522,20 @@ declare class Path2DSet {
521
522
 
522
523
  declare function setCanvasContext(ctx: CanvasRenderingContext2D, style: Partial<Path2DStyle>): void;
523
524
 
525
+ declare class FFDControlGrid {
526
+ rows: number;
527
+ cols: number;
528
+ width: number;
529
+ height: number;
530
+ controlPoints: {
531
+ x: number;
532
+ y: number;
533
+ }[][];
534
+ constructor(rows: number, cols: number, width?: number, height?: number);
535
+ moveControlPoint(i: number, j: number, dx: number, dy: number): this;
536
+ }
537
+ declare function applyFFD(point: Vector2, grid: FFDControlGrid, width?: number, height?: number): void;
538
+
524
539
  /**
525
540
  * @link https://www.w3.org/TR/SVG/implnote.html#ArcImplementationNotes
526
541
  * @link https://mortoray.com/2017/02/16/rendering-an-svg-elliptical-arc-as-bezier-curves/ Appendix: Endpoint to center arc conversion
@@ -549,4 +564,4 @@ declare function svgToDOM(svg: string | SVGElement): SVGElement;
549
564
 
550
565
  declare function svgToPath2DSet(svg: string | SVGElement): Path2DSet;
551
566
 
552
- export { ArcCurve, BoundingBox, CompositeCurve, CubicBezierCurve, Curve, CurvePath, type DrawPointOptions, EllipseCurve, EquilateralPloygonCurve, type FillRule, type FillTriangulateOptions, type FillTriangulatedResult, type LineCap, LineCurve, type LineJoin, type LineStyle, Matrix3, Path2D, type Path2DCommand, type Path2DData, type Path2DDrawStyle, Path2DSet, type Path2DStyle, PloygonCurve, QuadraticBezierCurve, RectangleCurve, RoundRectangleCurve, SplineCurve, type StrokeLinecap, type StrokeLinejoin, type StrokeTriangulateOptions, type StrokeTriangulatedResult, Vector2, type VectorLike, catmullRom, cubicBezier, drawPoint, fillTriangulate, getAdaptiveCubicBezierCurvePoints, getAdaptiveQuadraticBezierCurvePoints, parseArcCommand, parsePathDataArgs, quadraticBezier, setCanvasContext, strokeTriangulate, svgPathCommandsAddToPath2D, svgPathCommandsToData, svgPathDataToCommands, svgToDOM, svgToPath2DSet };
567
+ export { ArcCurve, BoundingBox, CompositeCurve, CubicBezierCurve, Curve, CurvePath, type DrawPointOptions, EllipseCurve, EquilateralPloygonCurve, FFDControlGrid, type FillRule, type FillTriangulateOptions, type FillTriangulatedResult, type LineCap, LineCurve, type LineJoin, type LineStyle, Matrix3, Path2D, type Path2DCommand, type Path2DData, type Path2DDrawStyle, Path2DSet, type Path2DStyle, PloygonCurve, QuadraticBezierCurve, RectangleCurve, RoundRectangleCurve, SplineCurve, type StrokeLinecap, type StrokeLinejoin, type StrokeTriangulateOptions, type StrokeTriangulatedResult, Vector2, type VectorLike, applyFFD, catmullRom, cubicBezier, drawPoint, fillTriangulate, getAdaptiveCubicBezierCurvePoints, getAdaptiveQuadraticBezierCurvePoints, parseArcCommand, parsePathDataArgs, quadraticBezier, setCanvasContext, strokeTriangulate, svgPathCommandsAddToPath2D, svgPathCommandsToData, svgPathDataToCommands, svgToDOM, svgToPath2DSet };
package/dist/index.d.mts CHANGED
@@ -81,6 +81,7 @@ declare class Vector2 {
81
81
  static get MIN(): Vector2;
82
82
  get array(): [number, number];
83
83
  constructor(x?: number, y?: number);
84
+ finite(): this;
84
85
  set(x: number, y: number): this;
85
86
  add(vec: VectorLike): this;
86
87
  sub(vec: VectorLike): this;
@@ -136,7 +137,7 @@ declare abstract class Curve {
136
137
  getPointAt(u: number, output?: Vector2): Vector2;
137
138
  isClockwise(): boolean;
138
139
  getControlPointRefs(): Vector2[];
139
- applyTransform(transform: Matrix3): this;
140
+ applyTransform(transform: Matrix3 | ((point: Vector2) => void)): this;
140
141
  getUnevenPointArray(count?: number, output?: number[]): number[];
141
142
  getSpacedPointArray(count?: number, output?: number[]): number[];
142
143
  getAdaptivePointArray(output?: number[]): number[];
@@ -225,7 +226,7 @@ declare class CompositeCurve<T extends Curve = Curve> extends Curve {
225
226
  getSpacedPointArray(count?: number, output?: number[]): number[];
226
227
  getAdaptivePointArray(output?: number[]): number[];
227
228
  fillTriangulate(options?: FillTriangulateOptions): FillTriangulatedResult;
228
- applyTransform(transform: Matrix3): this;
229
+ applyTransform(transform: Matrix3 | ((point: Vector2) => void)): this;
229
230
  getMinMax(min?: Vector2, max?: Vector2): {
230
231
  min: Vector2;
231
232
  max: Vector2;
@@ -521,6 +522,20 @@ declare class Path2DSet {
521
522
 
522
523
  declare function setCanvasContext(ctx: CanvasRenderingContext2D, style: Partial<Path2DStyle>): void;
523
524
 
525
+ declare class FFDControlGrid {
526
+ rows: number;
527
+ cols: number;
528
+ width: number;
529
+ height: number;
530
+ controlPoints: {
531
+ x: number;
532
+ y: number;
533
+ }[][];
534
+ constructor(rows: number, cols: number, width?: number, height?: number);
535
+ moveControlPoint(i: number, j: number, dx: number, dy: number): this;
536
+ }
537
+ declare function applyFFD(point: Vector2, grid: FFDControlGrid, width?: number, height?: number): void;
538
+
524
539
  /**
525
540
  * @link https://www.w3.org/TR/SVG/implnote.html#ArcImplementationNotes
526
541
  * @link https://mortoray.com/2017/02/16/rendering-an-svg-elliptical-arc-as-bezier-curves/ Appendix: Endpoint to center arc conversion
@@ -549,4 +564,4 @@ declare function svgToDOM(svg: string | SVGElement): SVGElement;
549
564
 
550
565
  declare function svgToPath2DSet(svg: string | SVGElement): Path2DSet;
551
566
 
552
- export { ArcCurve, BoundingBox, CompositeCurve, CubicBezierCurve, Curve, CurvePath, type DrawPointOptions, EllipseCurve, EquilateralPloygonCurve, type FillRule, type FillTriangulateOptions, type FillTriangulatedResult, type LineCap, LineCurve, type LineJoin, type LineStyle, Matrix3, Path2D, type Path2DCommand, type Path2DData, type Path2DDrawStyle, Path2DSet, type Path2DStyle, PloygonCurve, QuadraticBezierCurve, RectangleCurve, RoundRectangleCurve, SplineCurve, type StrokeLinecap, type StrokeLinejoin, type StrokeTriangulateOptions, type StrokeTriangulatedResult, Vector2, type VectorLike, catmullRom, cubicBezier, drawPoint, fillTriangulate, getAdaptiveCubicBezierCurvePoints, getAdaptiveQuadraticBezierCurvePoints, parseArcCommand, parsePathDataArgs, quadraticBezier, setCanvasContext, strokeTriangulate, svgPathCommandsAddToPath2D, svgPathCommandsToData, svgPathDataToCommands, svgToDOM, svgToPath2DSet };
567
+ export { ArcCurve, BoundingBox, CompositeCurve, CubicBezierCurve, Curve, CurvePath, type DrawPointOptions, EllipseCurve, EquilateralPloygonCurve, FFDControlGrid, type FillRule, type FillTriangulateOptions, type FillTriangulatedResult, type LineCap, LineCurve, type LineJoin, type LineStyle, Matrix3, Path2D, type Path2DCommand, type Path2DData, type Path2DDrawStyle, Path2DSet, type Path2DStyle, PloygonCurve, QuadraticBezierCurve, RectangleCurve, RoundRectangleCurve, SplineCurve, type StrokeLinecap, type StrokeLinejoin, type StrokeTriangulateOptions, type StrokeTriangulatedResult, Vector2, type VectorLike, applyFFD, catmullRom, cubicBezier, drawPoint, fillTriangulate, getAdaptiveCubicBezierCurvePoints, getAdaptiveQuadraticBezierCurvePoints, parseArcCommand, parsePathDataArgs, quadraticBezier, setCanvasContext, strokeTriangulate, svgPathCommandsAddToPath2D, svgPathCommandsToData, svgPathDataToCommands, svgToDOM, svgToPath2DSet };
package/dist/index.d.ts CHANGED
@@ -81,6 +81,7 @@ declare class Vector2 {
81
81
  static get MIN(): Vector2;
82
82
  get array(): [number, number];
83
83
  constructor(x?: number, y?: number);
84
+ finite(): this;
84
85
  set(x: number, y: number): this;
85
86
  add(vec: VectorLike): this;
86
87
  sub(vec: VectorLike): this;
@@ -136,7 +137,7 @@ declare abstract class Curve {
136
137
  getPointAt(u: number, output?: Vector2): Vector2;
137
138
  isClockwise(): boolean;
138
139
  getControlPointRefs(): Vector2[];
139
- applyTransform(transform: Matrix3): this;
140
+ applyTransform(transform: Matrix3 | ((point: Vector2) => void)): this;
140
141
  getUnevenPointArray(count?: number, output?: number[]): number[];
141
142
  getSpacedPointArray(count?: number, output?: number[]): number[];
142
143
  getAdaptivePointArray(output?: number[]): number[];
@@ -225,7 +226,7 @@ declare class CompositeCurve<T extends Curve = Curve> extends Curve {
225
226
  getSpacedPointArray(count?: number, output?: number[]): number[];
226
227
  getAdaptivePointArray(output?: number[]): number[];
227
228
  fillTriangulate(options?: FillTriangulateOptions): FillTriangulatedResult;
228
- applyTransform(transform: Matrix3): this;
229
+ applyTransform(transform: Matrix3 | ((point: Vector2) => void)): this;
229
230
  getMinMax(min?: Vector2, max?: Vector2): {
230
231
  min: Vector2;
231
232
  max: Vector2;
@@ -521,6 +522,20 @@ declare class Path2DSet {
521
522
 
522
523
  declare function setCanvasContext(ctx: CanvasRenderingContext2D, style: Partial<Path2DStyle>): void;
523
524
 
525
+ declare class FFDControlGrid {
526
+ rows: number;
527
+ cols: number;
528
+ width: number;
529
+ height: number;
530
+ controlPoints: {
531
+ x: number;
532
+ y: number;
533
+ }[][];
534
+ constructor(rows: number, cols: number, width?: number, height?: number);
535
+ moveControlPoint(i: number, j: number, dx: number, dy: number): this;
536
+ }
537
+ declare function applyFFD(point: Vector2, grid: FFDControlGrid, width?: number, height?: number): void;
538
+
524
539
  /**
525
540
  * @link https://www.w3.org/TR/SVG/implnote.html#ArcImplementationNotes
526
541
  * @link https://mortoray.com/2017/02/16/rendering-an-svg-elliptical-arc-as-bezier-curves/ Appendix: Endpoint to center arc conversion
@@ -549,4 +564,4 @@ declare function svgToDOM(svg: string | SVGElement): SVGElement;
549
564
 
550
565
  declare function svgToPath2DSet(svg: string | SVGElement): Path2DSet;
551
566
 
552
- export { ArcCurve, BoundingBox, CompositeCurve, CubicBezierCurve, Curve, CurvePath, type DrawPointOptions, EllipseCurve, EquilateralPloygonCurve, type FillRule, type FillTriangulateOptions, type FillTriangulatedResult, type LineCap, LineCurve, type LineJoin, type LineStyle, Matrix3, Path2D, type Path2DCommand, type Path2DData, type Path2DDrawStyle, Path2DSet, type Path2DStyle, PloygonCurve, QuadraticBezierCurve, RectangleCurve, RoundRectangleCurve, SplineCurve, type StrokeLinecap, type StrokeLinejoin, type StrokeTriangulateOptions, type StrokeTriangulatedResult, Vector2, type VectorLike, catmullRom, cubicBezier, drawPoint, fillTriangulate, getAdaptiveCubicBezierCurvePoints, getAdaptiveQuadraticBezierCurvePoints, parseArcCommand, parsePathDataArgs, quadraticBezier, setCanvasContext, strokeTriangulate, svgPathCommandsAddToPath2D, svgPathCommandsToData, svgPathDataToCommands, svgToDOM, svgToPath2DSet };
567
+ export { ArcCurve, BoundingBox, CompositeCurve, CubicBezierCurve, Curve, CurvePath, type DrawPointOptions, EllipseCurve, EquilateralPloygonCurve, FFDControlGrid, type FillRule, type FillTriangulateOptions, type FillTriangulatedResult, type LineCap, LineCurve, type LineJoin, type LineStyle, Matrix3, Path2D, type Path2DCommand, type Path2DData, type Path2DDrawStyle, Path2DSet, type Path2DStyle, PloygonCurve, QuadraticBezierCurve, RectangleCurve, RoundRectangleCurve, SplineCurve, type StrokeLinecap, type StrokeLinejoin, type StrokeTriangulateOptions, type StrokeTriangulatedResult, Vector2, type VectorLike, applyFFD, catmullRom, cubicBezier, drawPoint, fillTriangulate, getAdaptiveCubicBezierCurvePoints, getAdaptiveQuadraticBezierCurvePoints, parseArcCommand, parsePathDataArgs, quadraticBezier, setCanvasContext, strokeTriangulate, svgPathCommandsAddToPath2D, svgPathCommandsToData, svgPathDataToCommands, svgToDOM, svgToPath2DSet };
package/dist/index.js CHANGED
@@ -1,2 +1,2 @@
1
- (function(v,R){typeof exports=="object"&&typeof module<"u"?R(exports):typeof define=="function"&&define.amd?define(["exports"],R):(v=typeof globalThis<"u"?globalThis:v||self,R(v.modernPath2d={}))})(this,function(v){"use strict";var En=Object.defineProperty;var Ln=(v,R,nt)=>R in v?En(v,R,{enumerable:!0,configurable:!0,writable:!0,value:nt}):v[R]=nt;var X=(v,R,nt)=>Ln(v,typeof R!="symbol"?R+"":R,nt);function R(i,e,t,n={}){const{radius:r=1}=n;i.moveTo(e,t),i.arc(e,t,r,0,Math.PI*2)}const nt={arcs:"bevel",bevel:"bevel",miter:"miter","miter-clip":"miter",round:"round"};function Ct(i,e){const{fill:t="#000",stroke:n="none",strokeWidth:r=n==="none"?0:1,strokeLinecap:o="round",strokeLinejoin:s="miter",strokeMiterlimit:c=0,strokeDasharray:h=[],strokeDashoffset:a=0,shadowOffsetX:l=0,shadowOffsetY:y=0,shadowBlur:f=0,shadowColor:x="rgba(0, 0, 0, 0)"}=e;i.fillStyle=t,i.strokeStyle=n,i.lineWidth=r,i.lineCap=o,i.lineJoin=nt[s],i.miterLimit=c,i.setLineDash(h),i.lineDashOffset=a,i.shadowOffsetX=l,i.shadowOffsetY=y,i.shadowBlur=f,i.shadowColor=x}class p{constructor(e=0,t=0){this.x=e,this.y=t}static get MAX(){return new p(1/0,1/0)}static get MIN(){return new p(-1/0,-1/0)}get array(){return[this.x,this.y]}set(e,t){return this.x=e,this.y=t,this}add(e){return this.x+=e.x,this.y+=e.y,this}sub(e){return this.x-=e.x,this.y-=e.y,this}multiply(e){return this.x*=e.x,this.y*=e.y,this}divide(e){return this.x/=e.x,this.y/=e.y,this}dot(e){return this.x*e.x+this.y*e.y}cross(e){return this.x*e.y-this.y*e.x}rotate(e,t={x:0,y:0}){const n=-e/180*Math.PI,r=this.x-t.x,o=-(this.y-t.y),s=Math.sin(n),c=Math.cos(n);return this.set(t.x+(r*c-o*s),t.y-(r*s+o*c)),this}distanceTo(e){return Math.sqrt(this.distanceToSquared(e))}distanceToSquared(e){const t=this.x-e.x,n=this.y-e.y;return t*t+n*n}lengthSquared(){return this.x*this.x+this.y*this.y}length(){return Math.sqrt(this.lengthSquared())}scale(e,t=e,n={x:0,y:0}){const r=e<0?n.x-this.x+n.x:this.x,o=t<0?n.y-this.y+n.y:this.y;return this.x=r*Math.abs(e),this.y=o*Math.abs(t),this}skew(e,t=0,n={x:0,y:0}){const r=this.x-n.x,o=this.y-n.y;return this.x=n.x+(r+Math.tan(e)*o),this.y=n.y+(o+Math.tan(t)*r),this}min(...e){return this.x=Math.min(this.x,...e.map(t=>t.x)),this.y=Math.min(this.y,...e.map(t=>t.y)),this}max(...e){return this.x=Math.max(this.x,...e.map(t=>t.x)),this.y=Math.max(this.y,...e.map(t=>t.y)),this}normalize(){return this.scale(1/(this.length()||1))}addVectors(e,t){return this.x=e.x+t.x,this.y=e.y+t.y,this}subVectors(e,t){return this.x=e.x-t.x,this.y=e.y-t.y,this}multiplyVectors(e,t){return this.x=e.x*t.x,this.y=e.y*t.y,this}divideVectors(e,t){return this.x=e.x/t.x,this.y=e.y/t.y,this}lerpVectors(e,t,n){return this.x=e.x+(t.x-e.x)*n,this.y=e.y+(t.y-e.y)*n,this}equals(e){return this.x===e.x&&this.y===e.y}applyMatrix3(e){const t=this.x,n=this.y,r=e.elements;return this.x=r[0]*t+r[3]*n+r[6],this.y=r[1]*t+r[4]*n+r[7],this}copy(e){return this.x=e.x,this.y=e.y,this}clone(){return new p(this.x,this.y)}}class V{constructor(e=0,t=0,n=0,r=0){this.left=e,this.top=t,this.width=n,this.height=r}get x(){return this.left}set x(e){this.left=e}get y(){return this.top}set y(e){this.top=e}get right(){return this.left+this.width}get bottom(){return this.top+this.height}get center(){return new p((this.left+this.right)/2,(this.top+this.bottom)/2)}get array(){return[this.left,this.top,this.width,this.height]}static from(...e){if(e.length===0)return new V;if(e.length===1)return e[0].clone();const t=e[0],n=e.slice(1).reduce((r,o)=>(r.left=Math.min(r.left,o.left),r.top=Math.min(r.top,o.top),r.right=Math.max(r.right,o.right),r.bottom=Math.max(r.bottom,o.bottom),r),{left:(t==null?void 0:t.left)??0,top:(t==null?void 0:t.top)??0,right:(t==null?void 0:t.right)??0,bottom:(t==null?void 0:t.bottom)??0});return new V(n.left,n.top,n.right-n.left,n.bottom-n.top)}translate(e,t){return this.left+=e,this.top+=t,this}copy(e){return this.left=e.left,this.top=e.top,this.width=e.width,this.height=e.height,this}clone(){return new V(this.left,this.top,this.width,this.height)}}class z{constructor(e=1,t=0,n=0,r=0,o=1,s=0,c=0,h=0,a=1){X(this,"elements",[]);this.set(e,t,n,r,o,s,c,h,a)}set(e,t,n,r,o,s,c,h,a){const l=this.elements;return l[0]=e,l[1]=r,l[2]=c,l[3]=t,l[4]=o,l[5]=h,l[6]=n,l[7]=s,l[8]=a,this}identity(){return this.set(1,0,0,0,1,0,0,0,1),this}copy(e){const t=this.elements,n=e.elements;return t[0]=n[0],t[1]=n[1],t[2]=n[2],t[3]=n[3],t[4]=n[4],t[5]=n[5],t[6]=n[6],t[7]=n[7],t[8]=n[8],this}multiply(e){return this.multiplyMatrices(this,e)}premultiply(e){return this.multiplyMatrices(e,this)}multiplyMatrices(e,t){const n=e.elements,r=t.elements,o=this.elements,s=n[0],c=n[3],h=n[6],a=n[1],l=n[4],y=n[7],f=n[2],x=n[5],u=n[8],d=r[0],M=r[3],b=r[6],E=r[1],P=r[4],w=r[7],S=r[2],I=r[5],g=r[8];return o[0]=s*d+c*E+h*S,o[3]=s*M+c*P+h*I,o[6]=s*b+c*w+h*g,o[1]=a*d+l*E+y*S,o[4]=a*M+l*P+y*I,o[7]=a*b+l*w+y*g,o[2]=f*d+x*E+u*S,o[5]=f*M+x*P+u*I,o[8]=f*b+x*w+u*g,this}invert(){const e=this.elements,t=e[0],n=e[1],r=e[2],o=e[3],s=e[4],c=e[5],h=e[6],a=e[7],l=e[8],y=l*s-c*a,f=c*h-l*o,x=a*o-s*h,u=t*y+n*f+r*x;if(u===0)return this.set(0,0,0,0,0,0,0,0,0);const d=1/u;return e[0]=y*d,e[1]=(r*a-l*n)*d,e[2]=(c*n-r*s)*d,e[3]=f*d,e[4]=(l*t-r*h)*d,e[5]=(r*o-c*t)*d,e[6]=x*d,e[7]=(n*h-a*t)*d,e[8]=(s*t-n*o)*d,this}transpose(){let e;const t=this.elements;return e=t[1],t[1]=t[3],t[3]=e,e=t[2],t[2]=t[6],t[6]=e,e=t[5],t[5]=t[7],t[7]=e,this}scale(e,t){return this.premultiply(bt.makeScale(e,t)),this}rotate(e){return this.premultiply(bt.makeRotation(-e)),this}translate(e,t){return this.premultiply(bt.makeTranslation(e,t)),this}makeTranslation(e,t){return this.set(1,0,e,0,1,t,0,0,1),this}makeRotation(e){const t=Math.cos(e),n=Math.sin(e);return this.set(t,-n,0,n,t,0,0,0,1),this}makeScale(e,t){return this.set(e,0,0,0,t,0,0,0,1),this}fromArray(e,t=0){for(let n=0;n<9;n++)this.elements[n]=e[n+t];return this}clone(){return new this.constructor().fromArray(this.elements)}}const bt=new z;function Zt(i,e,t,n){const r=i*t+e*n,o=Math.sqrt(i*i+e*e)*Math.sqrt(t*t+n*n);let s=Math.acos(Math.max(-1,Math.min(1,r/o)));return i*n-e*t<0&&(s=-s),s}function jt(i,e,t,n,r,o,s,c){if(e===0||t===0){i.lineTo(c.x,c.y);return}n=n*Math.PI/180,e=Math.abs(e),t=Math.abs(t);const h=(s.x-c.x)/2,a=(s.y-c.y)/2,l=Math.cos(n)*h+Math.sin(n)*a,y=-Math.sin(n)*h+Math.cos(n)*a;let f=e*e,x=t*t;const u=l*l,d=y*y,M=u/f+d/x;if(M>1){const F=Math.sqrt(M);e=F*e,t=F*t,f=e*e,x=t*t}const b=f*d+x*u,E=(f*x-b)/b;let P=Math.sqrt(Math.max(0,E));r===o&&(P=-P);const w=P*e*y/t,S=-P*t*l/e,I=Math.cos(n)*w-Math.sin(n)*S+(s.x+c.x)/2,g=Math.sin(n)*w+Math.cos(n)*S+(s.y+c.y)/2,m=Zt(1,0,(l-w)/e,(y-S)/t),q=Zt((l-w)/e,(y-S)/t,(-l-w)/e,(-y-S)/t)%(Math.PI*2);i.ellipse(I,g,e,t,n,m,m+q,o===0)}const D={SEPARATOR:/[ \t\r\n,.\-+]/,WHITESPACE:/[ \t\r\n]/,DIGIT:/\d/,SIGN:/[-+]/,POINT:/\./,COMMA:/,/,EXP:/e/i,FLAGS:/[01]/};function Z(i,e,t=0){let c=0,h=!0,a="",l="";const y=[];function f(M,b,E){const P=new SyntaxError(`Unexpected character "${M}" at index ${b}.`);throw P.partial=E,P}function x(){a!==""&&(l===""?y.push(Number(a)):y.push(Number(a)*10**Number(l))),a="",l=""}let u;const d=i.length;for(let M=0;M<d;M++){if(u=i[M],Array.isArray(e)&&e.includes(y.length%t)&&D.FLAGS.test(u)){c=1,a=u,x();continue}if(c===0){if(D.WHITESPACE.test(u))continue;if(D.DIGIT.test(u)||D.SIGN.test(u)){c=1,a=u;continue}if(D.POINT.test(u)){c=2,a=u;continue}D.COMMA.test(u)&&(h&&f(u,M,y),h=!0)}if(c===1){if(D.DIGIT.test(u)){a+=u;continue}if(D.POINT.test(u)){a+=u,c=2;continue}if(D.EXP.test(u)){c=3;continue}D.SIGN.test(u)&&a.length===1&&D.SIGN.test(a[0])&&f(u,M,y)}if(c===2){if(D.DIGIT.test(u)){a+=u;continue}if(D.EXP.test(u)){c=3;continue}D.POINT.test(u)&&a[a.length-1]==="."&&f(u,M,y)}if(c===3){if(D.DIGIT.test(u)){l+=u;continue}if(D.SIGN.test(u)){if(l===""){l+=u;continue}l.length===1&&D.SIGN.test(l)&&f(u,M,y)}}D.WHITESPACE.test(u)?(x(),c=0,h=!1):D.COMMA.test(u)?(x(),c=0,h=!0):D.SIGN.test(u)?(x(),c=1,a=u):D.POINT.test(u)?(x(),c=2,a=u):f(u,M,y)}return x(),y}function st(i,e){return i-(e-i)}function kt(i,e){const t=new p,n=new p;for(let r=0,o=i.length;r<o;r++){const s=i[r];if(s.type==="m"||s.type==="M")s.type==="m"?t.add(s):t.copy(s),e.moveTo(t.x,t.y),n.copy(t);else if(s.type==="h"||s.type==="H")s.type==="h"?t.x+=s.x:t.x=s.x,e.lineTo(t.x,t.y),n.copy(t);else if(s.type==="v"||s.type==="V")s.type==="v"?t.y+=s.y:t.y=s.y,e.lineTo(t.x,t.y),n.copy(t);else if(s.type==="l"||s.type==="L")s.type==="l"?t.add(s):t.copy(s),e.lineTo(t.x,t.y),n.copy(t);else if(s.type==="c"||s.type==="C")s.type==="c"?(e.bezierCurveTo(t.x+s.x1,t.y+s.y1,t.x+s.x2,t.y+s.y2,t.x+s.x,t.y+s.y),n.x=t.x+s.x2,n.y=t.y+s.y2,t.add(s)):(e.bezierCurveTo(s.x1,s.y1,s.x2,s.y2,s.x,s.y),n.x=s.x2,n.y=s.y2,t.copy(s));else if(s.type==="s"||s.type==="S")s.type==="s"?(e.bezierCurveTo(st(t.x,n.x),st(t.y,n.y),t.x+s.x2,t.y+s.y2,t.x+s.x,t.y+s.y),n.x=t.x+s.x2,n.y=t.y+s.y2,t.add(s)):(e.bezierCurveTo(st(t.x,n.x),st(t.y,n.y),s.x2,s.y2,s.x,s.y),n.x=s.x2,n.y=s.y2,t.copy(s));else if(s.type==="q"||s.type==="Q")s.type==="q"?(e.quadraticCurveTo(t.x+s.x1,t.y+s.y1,t.x+s.x,t.y+s.y),n.x=t.x+s.x1,n.y=t.y+s.y1,t.add(s)):(e.quadraticCurveTo(s.x1,s.y1,s.x,s.y),n.x=s.x1,n.y=s.y1,t.copy(s));else if(s.type==="t"||s.type==="T"){const c=st(t.x,n.x),h=st(t.y,n.y);n.x=c,n.y=h,s.type==="t"?(e.quadraticCurveTo(c,h,t.x+s.x,t.y+s.y),t.add(s)):(e.quadraticCurveTo(c,h,s.x,s.y),t.copy(s))}else if(s.type==="a"||s.type==="A"){const c=t.clone();if(s.type==="a"){if(s.x===0&&s.y===0)continue;t.add(s)}else{if(t.equals(s))continue;t.copy(s)}n.copy(t),jt(e,s.rx,s.ry,s.angle,s.largeArcFlag,s.sweepFlag,c,t)}else s.type==="z"||s.type==="Z"?(e.startPoint&&t.copy(e.startPoint),e.closePath()):console.warn("Unsupported commands",s)}}function Gt(i){let e,t;const n=[];for(let r=0,o=i.length;r<o;r++){const s=i[r];switch(s.type){case"m":case"M":if(s.x.toFixed(4)===(t==null?void 0:t.x.toFixed(4))&&s.y.toFixed(4)===(t==null?void 0:t.y.toFixed(4)))continue;n.push(`${s.type} ${s.x} ${s.y}`),t={x:s.x,y:s.y},e={x:s.x,y:s.y};break;case"h":case"H":n.push(`${s.type} ${s.x}`),t={x:s.x,y:(t==null?void 0:t.y)??0};break;case"v":case"V":n.push(`${s.type} ${s.y}`),t={x:(t==null?void 0:t.x)??0,y:s.y};break;case"l":case"L":n.push(`${s.type} ${s.x} ${s.y}`),t={x:s.x,y:s.y};break;case"c":case"C":n.push(`${s.type} ${s.x1} ${s.y1} ${s.x2} ${s.y2} ${s.x} ${s.y}`),t={x:s.x,y:s.y};break;case"s":case"S":n.push(`${s.type} ${s.x2} ${s.y2} ${s.x} ${s.y}`),t={x:s.x,y:s.y};break;case"q":case"Q":n.push(`${s.type} ${s.x1} ${s.y1} ${s.x} ${s.y}`),t={x:s.x,y:s.y};break;case"t":case"T":n.push(`${s.type} ${s.x} ${s.y}`),t={x:s.x,y:s.y};break;case"a":case"A":n.push(`${s.type} ${s.rx} ${s.ry} ${s.angle} ${s.largeArcFlag} ${s.sweepFlag} ${s.x} ${s.y}`),t={x:s.x,y:s.y};break;case"z":case"Z":n.push(s.type),e&&(t={x:e.x,y:e.y});break}}return n.join(" ")}const Ae=/[a-df-z][^a-df-z]*/gi;function It(i){const e=[],t=i.match(Ae);if(!t)return e;for(let n=0,r=t.length;n<r;n++){const o=t[n],s=o.charAt(0),c=o.slice(1).trim();let h;switch(s){case"m":case"M":h=Z(c);for(let a=0,l=h.length;a<l;a+=2)a===0?e.push({type:s,x:h[a],y:h[a+1]}):e.push({type:s==="m"?"l":"L",x:h[a],y:h[a+1]});break;case"h":case"H":h=Z(c);for(let a=0,l=h.length;a<l;a++)e.push({type:s,x:h[a]});break;case"v":case"V":h=Z(c);for(let a=0,l=h.length;a<l;a++)e.push({type:s,y:h[a]});break;case"l":case"L":h=Z(c);for(let a=0,l=h.length;a<l;a+=2)e.push({type:s,x:h[a],y:h[a+1]});break;case"c":case"C":h=Z(c);for(let a=0,l=h.length;a<l;a+=6)e.push({type:s,x1:h[a],y1:h[a+1],x2:h[a+2],y2:h[a+3],x:h[a+4],y:h[a+5]});break;case"s":case"S":h=Z(c);for(let a=0,l=h.length;a<l;a+=4)e.push({type:s,x2:h[a],y2:h[a+1],x:h[a+2],y:h[a+3]});break;case"q":case"Q":h=Z(c);for(let a=0,l=h.length;a<l;a+=4)e.push({type:s,x1:h[a],y1:h[a+1],x:h[a+2],y:h[a+3]});break;case"t":case"T":h=Z(c);for(let a=0,l=h.length;a<l;a+=2)e.push({type:s,x:h[a],y:h[a+1]});break;case"a":case"A":h=Z(c,[3,4],7);for(let a=0,l=h.length;a<l;a+=7)e.push({type:s,rx:h[a],ry:h[a+1],angle:h[a+2],largeArcFlag:h[a+3],sweepFlag:h[a+4],x:h[a+5],y:h[a+6]});break;case"z":case"Z":e.push({type:s});break;default:console.warn(o)}}return e}function St(i,e,t,n,r){const o=(n-e)*.5,s=(r-t)*.5,c=i*i,h=i*c;return(2*t-2*n+o+s)*h+(-3*t+3*n-2*o-s)*c+o*i+t}function Ce(i,e){const t=1-i;return t*t*t*e}function be(i,e){const t=1-i;return 3*t*t*i*e}function ke(i,e){return 3*(1-i)*i*i*e}function Ie(i,e){return i*i*i*e}function Et(i,e,t,n,r){return Ce(i,e)+be(i,t)+ke(i,n)+Ie(i,r)}function Se(i,e,t=2){const n=e&&e.length,r=n?e[0]*t:i.length;let o=Bt(i,0,r,t,!0);const s=[];if(!o||o.next===o.prev)return s;let c,h,a;if(n&&(o=_e(i,e,o,t)),i.length>80*t){c=1/0,h=1/0;let l=-1/0,y=-1/0;for(let f=t;f<r;f+=t){const x=i[f],u=i[f+1];x<c&&(c=x),u<h&&(h=u),x>l&&(l=x),u>y&&(y=u)}a=Math.max(l-c,y-h),a=a!==0?32767/a:0}return ot(o,s,t,c,h,a,0),s}function Bt(i,e,t,n,r){let o;if(r===Ue(i,e,t,n)>0)for(let s=e;s<t;s+=n)o=Wt(s/n|0,i[s],i[s+1],o);else for(let s=t-n;s>=e;s-=n)o=Wt(s/n|0,i[s],i[s+1],o);return o&&it(o,o.next)&&(at(o),o=o.next),o}function H(i,e){if(!i)return i;e||(e=i);let t=i,n;do if(n=!1,!t.steiner&&(it(t,t.next)||N(t.prev,t,t.next)===0)){if(at(t),t=e=t.prev,t===t.next)break;n=!0}else t=t.next;while(n||t!==e);return e}function ot(i,e,t,n,r,o,s){if(!i)return;!s&&o&&Re(i,n,r,o);let c=i;for(;i.prev!==i.next;){const h=i.prev,a=i.next;if(o?Le(i,n,r,o):Ee(i)){e.push(h.i,i.i,a.i),at(i),i=a.next,c=a.next;continue}if(i=a,i===c){s?s===1?(i=$e(H(i),e),ot(i,e,t,n,r,o,2)):s===2&&Ne(i,e,t,n,r,o):ot(H(i),e,t,n,r,o,1);break}}}function Ee(i){const e=i.prev,t=i,n=i.next;if(N(e,t,n)>=0)return!1;const r=e.x,o=t.x,s=n.x,c=e.y,h=t.y,a=n.y,l=Math.min(r,o,s),y=Math.min(c,h,a),f=Math.max(r,o,s),x=Math.max(c,h,a);let u=n.next;for(;u!==e;){if(u.x>=l&&u.x<=f&&u.y>=y&&u.y<=x&&ct(r,c,o,h,s,a,u.x,u.y)&&N(u.prev,u,u.next)>=0)return!1;u=u.next}return!0}function Le(i,e,t,n){const r=i.prev,o=i,s=i.next;if(N(r,o,s)>=0)return!1;const c=r.x,h=o.x,a=s.x,l=r.y,y=o.y,f=s.y,x=Math.min(c,h,a),u=Math.min(l,y,f),d=Math.max(c,h,a),M=Math.max(l,y,f),b=Lt(x,u,e,t,n),E=Lt(d,M,e,t,n);let P=i.prevZ,w=i.nextZ;for(;P&&P.z>=b&&w&&w.z<=E;){if(P.x>=x&&P.x<=d&&P.y>=u&&P.y<=M&&P!==r&&P!==s&&ct(c,l,h,y,a,f,P.x,P.y)&&N(P.prev,P,P.next)>=0||(P=P.prevZ,w.x>=x&&w.x<=d&&w.y>=u&&w.y<=M&&w!==r&&w!==s&&ct(c,l,h,y,a,f,w.x,w.y)&&N(w.prev,w,w.next)>=0))return!1;w=w.nextZ}for(;P&&P.z>=b;){if(P.x>=x&&P.x<=d&&P.y>=u&&P.y<=M&&P!==r&&P!==s&&ct(c,l,h,y,a,f,P.x,P.y)&&N(P.prev,P,P.next)>=0)return!1;P=P.prevZ}for(;w&&w.z<=E;){if(w.x>=x&&w.x<=d&&w.y>=u&&w.y<=M&&w!==r&&w!==s&&ct(c,l,h,y,a,f,w.x,w.y)&&N(w.prev,w,w.next)>=0)return!1;w=w.nextZ}return!0}function $e(i,e){let t=i;do{const n=t.prev,r=t.next.next;!it(n,r)&&Vt(n,t,t.next,r)&&ht(n,r)&&ht(r,n)&&(e.push(n.i,t.i,r.i),at(t),at(t.next),t=i=r),t=t.next}while(t!==i);return H(t)}function Ne(i,e,t,n,r,o){let s=i;do{let c=s.next.next;for(;c!==s.prev;){if(s.i!==c.i&&je(s,c)){let h=Xt(s,c);s=H(s,s.next),h=H(h,h.next),ot(s,e,t,n,r,o,0),ot(h,e,t,n,r,o,0);return}c=c.next}s=s.next}while(s!==i)}function _e(i,e,t,n){const r=[];for(let o=0,s=e.length;o<s;o++){const c=e[o]*n,h=o<s-1?e[o+1]*n:i.length,a=Bt(i,c,h,n,!1);a===a.next&&(a.steiner=!0),r.push(Ze(a))}r.sort(De);for(let o=0;o<r.length;o++)t=qe(r[o],t);return t}function De(i,e){let t=i.x-e.x;if(t===0&&(t=i.y-e.y,t===0)){const n=(i.next.y-i.y)/(i.next.x-i.x),r=(e.next.y-e.y)/(e.next.x-e.x);t=n-r}return t}function qe(i,e){const t=Fe(i,e);if(!t)return e;const n=Xt(t,i);return H(n,n.next),H(t,t.next)}function Fe(i,e){let t=e;const n=i.x,r=i.y;let o=-1/0,s;if(it(i,t))return t;do{if(it(i,t.next))return t.next;if(r<=t.y&&r>=t.next.y&&t.next.y!==t.y){const y=t.x+(r-t.y)*(t.next.x-t.x)/(t.next.y-t.y);if(y<=n&&y>o&&(o=y,s=t.x<t.next.x?t:t.next,y===n))return s}t=t.next}while(t!==e);if(!s)return null;const c=s,h=s.x,a=s.y;let l=1/0;t=s;do{if(n>=t.x&&t.x>=h&&n!==t.x&&Ut(r<a?n:o,r,h,a,r<a?o:n,r,t.x,t.y)){const y=Math.abs(r-t.y)/(n-t.x);ht(t,i)&&(y<l||y===l&&(t.x>s.x||t.x===s.x&&Oe(s,t)))&&(s=t,l=y)}t=t.next}while(t!==c);return s}function Oe(i,e){return N(i.prev,i,e.prev)<0&&N(e.next,i,i.next)<0}function Re(i,e,t,n){let r=i;do r.z===0&&(r.z=Lt(r.x,r.y,e,t,n)),r.prevZ=r.prev,r.nextZ=r.next,r=r.next;while(r!==i);r.prevZ.nextZ=null,r.prevZ=null,ze(r)}function ze(i){let e,t=1;do{let n=i,r;i=null;let o=null;for(e=0;n;){e++;let s=n,c=0;for(let a=0;a<t&&(c++,s=s.nextZ,!!s);a++);let h=t;for(;c>0||h>0&&s;)c!==0&&(h===0||!s||n.z<=s.z)?(r=n,n=n.nextZ,c--):(r=s,s=s.nextZ,h--),o?o.nextZ=r:i=r,r.prevZ=o,o=r;n=s}o.nextZ=null,t*=2}while(e>1);return i}function Lt(i,e,t,n,r){return i=(i-t)*r|0,e=(e-n)*r|0,i=(i|i<<8)&16711935,i=(i|i<<4)&252645135,i=(i|i<<2)&858993459,i=(i|i<<1)&1431655765,e=(e|e<<8)&16711935,e=(e|e<<4)&252645135,e=(e|e<<2)&858993459,e=(e|e<<1)&1431655765,i|e<<1}function Ze(i){let e=i,t=i;do(e.x<t.x||e.x===t.x&&e.y<t.y)&&(t=e),e=e.next;while(e!==i);return t}function Ut(i,e,t,n,r,o,s,c){return(r-s)*(e-c)>=(i-s)*(o-c)&&(i-s)*(n-c)>=(t-s)*(e-c)&&(t-s)*(o-c)>=(r-s)*(n-c)}function ct(i,e,t,n,r,o,s,c){return!(i===s&&e===c)&&Ut(i,e,t,n,r,o,s,c)}function je(i,e){return i.next.i!==e.i&&i.prev.i!==e.i&&!Ge(i,e)&&(ht(i,e)&&ht(e,i)&&Be(i,e)&&(N(i.prev,i,e.prev)||N(i,e.prev,e))||it(i,e)&&N(i.prev,i,i.next)>0&&N(e.prev,e,e.next)>0)}function N(i,e,t){return(e.y-i.y)*(t.x-e.x)-(e.x-i.x)*(t.y-e.y)}function it(i,e){return i.x===e.x&&i.y===e.y}function Vt(i,e,t,n){const r=gt(N(i,e,t)),o=gt(N(i,e,n)),s=gt(N(t,n,i)),c=gt(N(t,n,e));return!!(r!==o&&s!==c||r===0&&pt(i,t,e)||o===0&&pt(i,n,e)||s===0&&pt(t,i,n)||c===0&&pt(t,e,n))}function pt(i,e,t){return e.x<=Math.max(i.x,t.x)&&e.x>=Math.min(i.x,t.x)&&e.y<=Math.max(i.y,t.y)&&e.y>=Math.min(i.y,t.y)}function gt(i){return i>0?1:i<0?-1:0}function Ge(i,e){let t=i;do{if(t.i!==i.i&&t.next.i!==i.i&&t.i!==e.i&&t.next.i!==e.i&&Vt(t,t.next,i,e))return!0;t=t.next}while(t!==i);return!1}function ht(i,e){return N(i.prev,i,i.next)<0?N(i,e,i.next)>=0&&N(i,i.prev,e)>=0:N(i,e,i.prev)<0||N(i,i.next,e)<0}function Be(i,e){let t=i,n=!1;const r=(i.x+e.x)/2,o=(i.y+e.y)/2;do t.y>o!=t.next.y>o&&t.next.y!==t.y&&r<(t.next.x-t.x)*(o-t.y)/(t.next.y-t.y)+t.x&&(n=!n),t=t.next;while(t!==i);return n}function Xt(i,e){const t=$t(i.i,i.x,i.y),n=$t(e.i,e.x,e.y),r=i.next,o=e.prev;return i.next=e,e.prev=i,t.next=r,r.prev=t,n.next=t,t.prev=n,o.next=n,n.prev=o,n}function Wt(i,e,t,n){const r=$t(i,e,t);return n?(r.next=n.next,r.prev=n,n.next.prev=r,n.next=r):(r.prev=r,r.next=r),r}function at(i){i.next.prev=i.prev,i.prev.next=i.next,i.prevZ&&(i.prevZ.nextZ=i.nextZ),i.nextZ&&(i.nextZ.prevZ=i.prevZ)}function $t(i,e,t){return{i,x:e,y:t,prev:null,next:null,z:0,prevZ:null,nextZ:null,steiner:!1}}function Ue(i,e,t,n){let r=0;for(let o=e,s=t-n;o<t;o+=n)r+=(i[s]-i[o])*(i[o+1]+i[s+1]),s=o;return r}function Nt(i,e={}){let{vertices:t=[],indices:n=[],holes:r=[],verticesStride:o=2,verticesOffset:s=t.length/o,indicesOffset:c=n.length}=e;const h=Se(i,r,2);if(h){for(let l=0;l<h.length;l+=3)n[c++]=h[l]+s,n[c++]=h[l+1]+s,n[c++]=h[l+2]+s;let a=s*o;for(let l=0;l<i.length;l+=2)t[a]=i[l],t[a+1]=i[l+1],a+=o}return{vertices:t,indices:n}}const Ve=8,dt=11920929e-14,Xe=1;function Ht(i,e,t,n,r,o,s,c,h=.5,a=[]){const y=Math.min(.99,Math.max(0,h));let f=(Xe-y)/1;return f*=f,_t(i,e,t,n,r,o,s,c,a,f,0),a.push(s,c),a}function _t(i,e,t,n,r,o,s,c,h,a,l){if(l>Ve)return;const y=(i+t)/2,f=(e+n)/2,x=(t+r)/2,u=(n+o)/2,d=(r+s)/2,M=(o+c)/2,b=(y+x)/2,E=(f+u)/2,P=(x+d)/2,w=(u+M)/2,S=(b+P)/2,I=(E+w)/2;if(l>0){let g=s-i,m=c-e;const q=Math.abs((t-s)*m-(n-c)*g),F=Math.abs((r-s)*m-(o-c)*g);if(q>dt&&F>dt){if((q+F)*(q+F)<=a*(g*g+m*m)){h.push(S,I);return}}else if(q>dt){if(q*q<=a*(g*g+m*m)){h.push(S,I);return}}else if(F>dt){if(F*F<=a*(g*g+m*m)){h.push(S,I);return}}else if(g=S-(i+s)/2,m=I-(e+c)/2,g*g+m*m<=a){h.push(S,I);return}}_t(i,e,y,f,b,E,S,I,h,a,l+1),_t(S,I,P,w,d,M,s,c,h,a,l+1)}const We=8,He=11920929e-14,Qe=1;function Qt(i,e,t,n,r,o,s=.5,c=[]){const a=Math.min(.99,Math.max(0,s));let l=(Qe-a)/1;return l*=l,Dt(c,i,e,t,n,r,o,l,0),c.push(r,o),c}function Dt(i,e,t,n,r,o,s,c,h){if(h>We)return;const a=(e+n)/2,l=(t+r)/2,y=(n+o)/2,f=(r+s)/2,x=(a+y)/2,u=(l+f)/2;let d=o-e,M=s-t;const b=Math.abs((n-o)*M-(r-s)*d);if(b>He){if(b*b<=c*(d*d+M*M)){i.push(x,u);return}}else if(d=x-(e+o)/2,M=u-(t+s)/2,d*d+M*M<=c){i.push(x,u);return}Dt(i,e,t,a,l,x,u,c,h+1),Dt(i,x,u,y,f,o,s,c,h+1)}function Ye(i,e){const t=1-i;return t*t*e}function Je(i,e){return 2*(1-i)*i*e}function Ke(i,e){return i*i*e}function qt(i,e,t,n){return Ye(i,e)+Je(i,t)+Ke(i,n)}const tn=1e-4,Yt=1e-4;function Jt(i,e={}){const{vertices:t=[],indices:n=[],lineStyle:r={alignment:.5,cap:"butt",join:"miter",width:1,miterLimit:10},flipAlignment:o=!1,closed:s=!0}=e,c=tn;if(i.length===0)return{vertices:t,indices:n};const h=r;let a=h.alignment;if(r.alignment!==.5){let $=en(i);o&&($*=-1),a=(a-.5)*$+.5}const l={x:i[0],y:i[1]},y={x:i[i.length-2],y:i[i.length-1]},f=s,x=Math.abs(l.x-y.x)<c&&Math.abs(l.y-y.y)<c;if(f){i=i.slice(),x&&(i.pop(),i.pop(),y.x=i[i.length-2],y.y=i[i.length-1]);const $=(l.x+y.x)*.5,W=(y.y+l.y)*.5;i.unshift($,W),i.push($,W)}const u=t,d=i.length/2;let M=i.length;const b=u.length/2,E=h.width/2,P=E*E,w=h.miterLimit*h.miterLimit;let S=i[0],I=i[1],g=i[2],m=i[3],q=0,F=0,A=-(I-m),C=S-g,_=0,O=0,B=Math.sqrt(A*A+C*C);A/=B,C/=B,A*=E,C*=E;const Me=a,T=(1-Me)*2,k=Me*2;f||(h.cap==="round"?M+=Q(S-A*(T-k)*.5,I-C*(T-k)*.5,S-A*T,I-C*T,S+A*k,I+C*k,u,!0)+2:h.cap==="square"&&(M+=Kt(S,I,A,C,T,k,!0,u))),u.push(S-A*T,I-C*T),u.push(S+A*k,I+C*k);for(let $=1;$<d-1;++$){S=i[($-1)*2],I=i[($-1)*2+1],g=i[$*2],m=i[$*2+1],q=i[($+1)*2],F=i[($+1)*2+1],A=-(I-m),C=S-g,B=Math.sqrt(A*A+C*C),A/=B,C/=B,A*=E,C*=E,_=-(m-F),O=g-q,B=Math.sqrt(_*_+O*O),_/=B,O/=B,_*=E,O*=E;const W=g-S,ut=I-m,yt=g-q,ft=F-m,Pe=W*yt+ut*ft,vt=ut*yt-ft*W,xt=vt<0;if(Math.abs(vt)<.001*Math.abs(Pe)){u.push(g-A*T,m-C*T),u.push(g+A*k,m+C*k),Pe>=0&&(h.join==="round"?M+=Q(g,m,g-A*T,m-C*T,g-_*T,m-O*T,u,!1)+4:M+=2,u.push(g-_*k,m-O*k),u.push(g+_*T,m+O*T));continue}const we=(-A+S)*(-C+m)-(-A+g)*(-C+I),ve=(-_+q)*(-O+m)-(-_+g)*(-O+F),Tt=(W*ve-yt*we)/vt,At=(ft*we-ut*ve)/vt,zt=(Tt-g)*(Tt-g)+(At-m)*(At-m),J=g+(Tt-g)*T,K=m+(At-m)*T,tt=g-(Tt-g)*k,et=m-(At-m)*k,In=Math.min(W*W+ut*ut,yt*yt+ft*ft),Te=xt?T:k,Sn=In+Te*Te*P;zt<=Sn?h.join==="bevel"||zt/P>w?(xt?(u.push(J,K),u.push(g+A*k,m+C*k),u.push(J,K),u.push(g+_*k,m+O*k)):(u.push(g-A*T,m-C*T),u.push(tt,et),u.push(g-_*T,m-O*T),u.push(tt,et)),M+=2):h.join==="round"?xt?(u.push(J,K),u.push(g+A*k,m+C*k),M+=Q(g,m,g+A*k,m+C*k,g+_*k,m+O*k,u,!0)+4,u.push(J,K),u.push(g+_*k,m+O*k)):(u.push(g-A*T,m-C*T),u.push(tt,et),M+=Q(g,m,g-A*T,m-C*T,g-_*T,m-O*T,u,!1)+4,u.push(g-_*T,m-O*T),u.push(tt,et)):(u.push(J,K),u.push(tt,et)):(u.push(g-A*T,m-C*T),u.push(g+A*k,m+C*k),h.join==="round"?xt?M+=Q(g,m,g+A*k,m+C*k,g+_*k,m+O*k,u,!0)+2:M+=Q(g,m,g-A*T,m-C*T,g-_*T,m-O*T,u,!1)+2:h.join==="miter"&&zt/P<=w&&(xt?(u.push(tt,et),u.push(tt,et)):(u.push(J,K),u.push(J,K)),M+=2),u.push(g-_*T,m-O*T),u.push(g+_*k,m+O*k),M+=2)}S=i[(d-2)*2],I=i[(d-2)*2+1],g=i[(d-1)*2],m=i[(d-1)*2+1],A=-(I-m),C=S-g,B=Math.sqrt(A*A+C*C),A/=B,C/=B,A*=E,C*=E,u.push(g-A*T,m-C*T),u.push(g+A*k,m+C*k),f||(h.cap==="round"?M+=Q(g-A*(T-k)*.5,m-C*(T-k)*.5,g-A*T,m-C*T,g+A*k,m+C*k,u,!1)+2:h.cap==="square"&&(M+=Kt(g,m,A,C,T,k,!1,u)));const kn=Yt*Yt;for(let $=b;$<M+b-2;++$)S=u[$*2],I=u[$*2+1],g=u[($+1)*2],m=u[($+1)*2+1],q=u[($+2)*2],F=u[($+2)*2+1],!(Math.abs(S*(m-F)+g*(F-I)+q*(I-m))<kn)&&n.push($,$+1,$+2);return{vertices:t,indices:n}}function en(i){const e=i.length;if(e<6)return 1;let t=0;for(let n=0,r=i[e-2],o=i[e-1];n<e;n+=2){const s=i[n],c=i[n+1];t+=(s-r)*(c+o),r=s,o=c}return t<0?-1:1}function Kt(i,e,t,n,r,o,s,c){const h=i-t*r,a=e-n*r,l=i+t*o,y=e+n*o;let f,x;s?(f=n,x=-t):(f=-n,x=t);const u=h+f,d=a+x,M=l+f,b=y+x;return c.push(u,d),c.push(M,b),2}function Q(i,e,t,n,r,o,s,c){const h=t-i,a=n-e;let l=Math.atan2(h,a),y=Math.atan2(r-i,o-e);c&&l<y?l+=Math.PI*2:!c&&l>y&&(y+=Math.PI*2);let f=l;const x=y-l,u=Math.abs(x),d=Math.sqrt(h*h+a*a),M=(15*u*Math.sqrt(d)/Math.PI>>0)+1,b=x/M;if(f+=b,c){s.push(i,e),s.push(t,n);for(let E=1,P=f;E<M;E++,P+=b)s.push(i,e),s.push(i+Math.sin(P)*d,e+Math.cos(P)*d);s.push(i,e),s.push(r,o)}else{s.push(t,n),s.push(i,e);for(let E=1,P=f;E<M;E++,P+=b)s.push(i+Math.sin(P)*d,e+Math.cos(P)*d),s.push(i,e);s.push(r,o),s.push(i,e)}return M*2}class Y{constructor(){X(this,"arcLengthDivision",200);X(this,"_arcLengths")}getPointAt(e,t=new p){return this.getPoint(this.getUToTMapping(e),t)}isClockwise(){const e=this.getPoint(1),t=this.getPoint(.5),n=this.getPoint(1);return(t.x-e.x)*(n.y-t.y)-(t.y-e.y)*(n.x-t.x)<0}getControlPointRefs(){return[]}applyTransform(e){return this.getControlPointRefs().forEach(t=>{t.applyMatrix3(e)}),this}getUnevenPointArray(e=5,t=[]){const n=new p;for(let r=0,o=Math.max(1,e)-1;r<=o;r++)this.getPoint(r/o,n),t.push(n.x,n.y);return t}getSpacedPointArray(e=5,t=[]){const n=new p;for(let r=0,o=Math.max(1,e)-1;r<=o;r++)this.getPointAt(r/o,n),t.push(n.x,n.y);return t}getAdaptivePointArray(e=[]){return this.getUnevenPointArray(5,e)}_pointArrayToPoint(e,t=[]){for(let n=0,r=e.length;n<r;n+=2){const o=e[n],s=e[n+1];t.push(new p(o,s))}return t}getSpacedPoints(e,t=[]){const n=this.getSpacedPointArray(e);return this._pointArrayToPoint(n,t),t}getUnevenPoints(e,t=[]){const n=this.getUnevenPointArray(e);return this._pointArrayToPoint(n,t),t}getAdaptivePoints(e=[]){const t=this.getAdaptivePointArray();return this._pointArrayToPoint(t,e),e}getPoints(e,t=[]){let n;return e?n=this.getUnevenPointArray(e):n=this.getAdaptivePointArray(),this._pointArrayToPoint(n,t),t}getLength(){const e=this.getLengths();return e[e.length-1]}getLengths(){return(!this._arcLengths||this._arcLengths.length!==this.arcLengthDivision+1)&&this.updateLengths(),this._arcLengths}updateLengths(){const e=this.arcLengthDivision,t=[0];for(let n=0,r=this.getPoint(0),o=1;o<=e;o++){const s=this.getPoint(o/e);n+=s.distanceTo(r),t.push(n),r=s}this._arcLengths=t}getUToTMapping(e,t){const n=this.getLengths(),r=n.length,o=t??e*n[r-1];if(r<2)return o/n[0];let s=0,c=0,h=r-1,a;for(;c<=h;)if(s=Math.floor(c+(h-c)/2),a=n[s]-o,a<0)c=s+1;else if(a>0)h=s-1;else{h=s;break}if(s=h,n[s]===o)return s/(r-1);const l=n[s],f=n[s+1]-l,x=(o-l)/f;return(s+x)/(r-1)}getTangent(e,t=new p){const r=Math.max(0,e-1e-4),o=Math.min(1,e+1e-4);return t.copy(this.getPoint(o).sub(this.getPoint(r)).normalize())}getTangentAt(e,t){return this.getTangent(this.getUToTMapping(e),t)}getNormal(e,t=new p){return this.getTangent(e,t),t.set(-t.y,t.x).normalize()}getNormalAt(e,t){return this.getNormal(this.getUToTMapping(e),t)}getTForPoint(e,t=.001){let n=0,r=1,o=(n+r)/2;for(;r-n>t;){o=(n+r)/2;const s=this.getPoint(o);if(s.distanceTo(e)<t)return o;s.x<e.x?n=o:r=o}return o}getMinMax(e=p.MAX,t=p.MIN){const n=this.getPoints();for(let r=0,o=n.length;r<o;r++){const s=n[r];e.min(s),t.max(s)}return{min:e,max:t}}getBoundingBox(){const{min:e,max:t}=this.getMinMax();return new V(e.x,e.y,t.x-e.x,t.y-e.y)}fillTriangulate(e){return Nt(this.getAdaptivePointArray(),e)}strokeTriangulate(e){return Jt(this.getAdaptivePointArray(),e)}toTriangulatedSVGString(e=this.fillTriangulate(),t=0){const{vertices:n,indices:r}=e,o={x:-t,y:-t},s={x:t,y:t},c=l=>{const y=n[l*2],f=n[l*2+1];return o.x=Math.min(o.x,y+t),s.x=Math.max(s.x,y+t),o.y=Math.min(o.y,f+t),s.y=Math.max(s.y,f+t),[y,f]};let h="";for(let l=0,y=r.length;l<y;l+=3){const f=c(r[l]),x=c(r[l+1]),u=c(r[l+2]);h+=`<polygon points="${f.join(",")} ${x.join(",")} ${u.join(",")}" fill="none" stroke="black" />`}const a=[o.x,o.y,s.x-o.x,s.y-o.y];return`<svg width="${a[2]}" height="${a[3]}" viewBox="${a.join(" ")}" xmlns="http://www.w3.org/2000/svg">${h}</svg>`}toTriangulatedSVG(e,t){return new DOMParser().parseFromString(this.toTriangulatedSVGString(e,t),"image/svg+xml").documentElement}toCommands(){const e=[],t=this.getPoints();for(let n=0,r=t.length;n<r;n++){const o=t[n];n===0?e.push({type:"M",x:o.x,y:o.y}):e.push({type:"L",x:o.x,y:o.y})}return e}toData(){return Gt(this.toCommands())}drawTo(e){return this.toCommands().forEach(t=>{switch(t.type){case"M":e.moveTo(t.x,t.y);break;case"L":e.lineTo(t.x,t.y);break}}),this}copy(e){return this.arcLengthDivision=e.arcLengthDivision,this}clone(){return new this.constructor().copy(this)}}const nn=new z,te=new z,ee=new z,mt=new p;class Ft extends Y{constructor(e=new p,t=new p,n=new p,r=0,o=0,s=Math.PI*2,c=!1){super(),this._center=e,this._radius=t,this._diff=n,this.rotate=r,this.startAngle=o,this.endAngle=s,this.clockwise=c}get cx(){return this._center.x}set cx(e){this._center.x=e}get cy(){return this._center.y}set cy(e){this._center.y=e}get rx(){return this._radius.x}set rx(e){this._radius.x=e}get ry(){return this._radius.y}set ry(e){this._radius.y=e}get dx(){return this._diff.x}set dx(e){this._diff.x=e}get dy(){return this._diff.y}set dy(e){this._diff.y=e}isClockwise(){return this.clockwise}_getDeltaAngle(){const e=Math.PI*2;let t=this.endAngle-this.startAngle;const n=Math.abs(t)<Number.EPSILON;return t=(t%e+e)%e,n?t=0:this.clockwise||(t=t===0?-e:t-e),t}getPoint(e,t=new p){const n=this._getDeltaAngle(),r=this.startAngle+e*n;let o=this.cx+this.rx*Math.cos(r),s=this.cy+this.ry*Math.sin(r);if(this.rotate!==0){const c=Math.cos(this.rotate),h=Math.sin(this.rotate),a=o-this.cx,l=s-this.cy;o=a*c-l*h+this.cx,s=a*h+l*c+this.cy}return t.set(o,s)}toCommands(){const{cx:e,cy:t,rx:n,ry:r,startAngle:o,endAngle:s,clockwise:c,rotate:h}=this,a=e+n*Math.cos(o)*Math.cos(h)-r*Math.sin(o)*Math.sin(h),l=t+n*Math.cos(o)*Math.sin(h)+r*Math.sin(o)*Math.cos(h),y=Math.abs(o-s),f=y>Math.PI?1:0,x=c?1:0,u=h*180/Math.PI;if(y>=2*Math.PI){const d=o+Math.PI,M=e+n*Math.cos(d)*Math.cos(h)-r*Math.sin(d)*Math.sin(h),b=t+n*Math.cos(d)*Math.sin(h)+r*Math.sin(d)*Math.cos(h);return[{type:"M",x:a,y:l},{type:"A",rx:n,ry:r,angle:u,largeArcFlag:0,sweepFlag:x,x:M,y:b},{type:"A",rx:n,ry:r,angle:u,largeArcFlag:0,sweepFlag:x,x:a,y:l}]}else{const d=e+n*Math.cos(s)*Math.cos(h)-r*Math.sin(s)*Math.sin(h),M=t+n*Math.cos(s)*Math.sin(h)+r*Math.sin(s)*Math.cos(h);return[{type:"M",x:a,y:l},{type:"A",rx:n,ry:r,angle:u,largeArcFlag:f,sweepFlag:x,x:d,y:M}]}}drawTo(e){const{cx:t,cy:n,rx:r,ry:o,rotate:s,startAngle:c,endAngle:h,clockwise:a}=this;return e.ellipse(t,n,r,o,s,c,h,!a),this}applyTransform(e){return mt.set(this.cx,this.cy),mt.applyMatrix3(e),this.cx=mt.x,this.cy=mt.y,on(e)?sn(this,e):rn(this,e),this}getControlPointRefs(){return[this._center]}getAdaptivePointArray(e=[]){const{cx:t,cy:n,rx:r,ry:o,dx:s,dy:c}=this;if(!(r>=0&&o>=0&&s>=0&&c>=0))return e;const h=Math.ceil(2.3*Math.sqrt(r+o)),a=t,l=n,y=h*8+(s?4:0)+(c?4:0);if(y===0)return e;if(h===0)return e[0]=e[6]=a+s,e[1]=e[3]=l+c,e[2]=e[4]=a-s,e[5]=e[7]=l-c,e;let f=0,x=h*4+(s?2:0)+2,u=x,d=y,M=s+r,b=c,E=a+M,P=a-M,w=l+b;if(e[f++]=E,e[f++]=w,e[--x]=w,e[--x]=P,c){const I=l-b;e[u++]=P,e[u++]=I,e[--d]=I,e[--d]=E}for(let I=1;I<h;I++){const g=Math.PI/2*(I/h),m=s+Math.cos(g)*r,q=c+Math.sin(g)*o,F=a+m,A=a-m,C=l+q,_=l-q;e[f++]=F,e[f++]=C,e[--x]=C,e[--x]=A,e[u++]=A,e[u++]=_,e[--d]=_,e[--d]=F}M=s,b=c+o,E=a+M,P=a-M,w=l+b;const S=l-b;return e[f++]=E,e[f++]=w,e[--d]=S,e[--d]=E,s&&(e[f++]=P,e[f++]=w,e[--d]=S,e[--d]=P),e}fillTriangulate(e={}){let{vertices:t=[],indices:n=[],verticesStride:r=2,verticesOffset:o=t.length/r,indicesOffset:s=n.length}=e;const c=this.getAdaptivePointArray();if(c.length===0)return{vertices:t,indices:n};let h=0,a=0;for(let f=0;f<c.length;f+=2)h+=c[f],a+=c[f+1];h/=c.length/2,a/=c.length/2;let l=o;t[l*r]=h,t[l*r+1]=a;const y=l++;for(let f=0;f<c.length;f+=2)t[l*r]=c[f],t[l*r+1]=c[f+1],f>0&&(n[s++]=l,n[s++]=y,n[s++]=l-1),l++;return n[s++]=y+1,n[s++]=y,n[s++]=l-1,{vertices:t,indices:n}}getMinMax(e=p.MAX,t=p.MIN){const{cx:n,cy:r,rx:o,ry:s,rotate:c}=this,h=Math.cos(c),a=Math.sin(c),l=Math.sqrt(o*o*h*h+s*s*a*a),y=Math.sqrt(o*o*a*a+s*s*h*h);return e.x=Math.min(e.x,n-l),e.y=Math.min(e.y,r-y),t.x=Math.max(t.x,n+l),t.y=Math.max(t.y,r+y),{min:e,max:t}}copy(e){return super.copy(e),this.cx=e.cx,this.cy=e.cy,this.rx=e.rx,this.ry=e.ry,this.dx=e.dx,this.dy=e.dy,this.startAngle=e.startAngle,this.endAngle=e.endAngle,this.clockwise=e.clockwise,this.rotate=e.rotate,this}}function sn(i,e){const t=i.rx,n=i.ry,r=Math.cos(i.rotate),o=Math.sin(i.rotate),s=new p(t*r,t*o),c=new p(-n*o,n*r),h=s.applyMatrix3(e),a=c.applyMatrix3(e),l=nn.set(h.x,a.x,0,h.y,a.y,0,0,0,1),y=te.copy(l).invert(),u=ee.copy(y).transpose().multiply(y).elements,d=cn(u[0],u[1],u[4]),M=Math.sqrt(d.rt1),b=Math.sqrt(d.rt2);if(i.rx=1/M,i.ry=1/b,i.rotate=Math.atan2(d.sn,d.cs),!((i.endAngle-i.startAngle)%(2*Math.PI)<Number.EPSILON)){const P=te.set(M,0,0,0,b,0,0,0,1),w=ee.set(d.cs,d.sn,0,-d.sn,d.cs,0,0,0,1),S=P.multiply(w).multiply(l),I=g=>{const{x:m,y:q}=new p(Math.cos(g),Math.sin(g)).applyMatrix3(S);return Math.atan2(q,m)};i.startAngle=I(i.startAngle),i.endAngle=I(i.endAngle),ne(e)&&(i.clockwise=!i.clockwise)}}function rn(i,e){const t=se(e),n=ie(e);i.rx*=t,i.ry*=n;const r=t>Number.EPSILON?Math.atan2(e.elements[1],e.elements[0]):Math.atan2(-e.elements[3],e.elements[4]);i.rotate+=r,ne(e)&&(i.startAngle*=-1,i.endAngle*=-1,i.clockwise=!i.clockwise)}function ne(i){const e=i.elements;return e[0]*e[4]-e[1]*e[3]<0}function on(i){const e=i.elements,t=e[0]*e[3]+e[1]*e[4];if(t===0)return!1;const n=se(i),r=ie(i);return Math.abs(t/(n*r))>Number.EPSILON}function se(i){const e=i.elements;return Math.sqrt(e[0]*e[0]+e[1]*e[1])}function ie(i){const e=i.elements;return Math.sqrt(e[3]*e[3]+e[4]*e[4])}function cn(i,e,t){let n,r,o,s,c;const h=i+t,a=i-t,l=Math.sqrt(a*a+4*e*e);return h>0?(n=.5*(h+l),c=1/n,r=i*c*t-e*c*e):h<0?r=.5*(h-l):(n=.5*l,r=-.5*l),a>0?o=a+l:o=a-l,Math.abs(o)>2*Math.abs(e)?(c=-2*e/o,s=1/Math.sqrt(1+c*c),o=c*s):Math.abs(e)===0?(o=1,s=0):(c=-.5*o/e,o=1/Math.sqrt(1+c*c),s=c*o),a>0&&(c=o,o=-s,s=c),{rt1:n,rt2:r,cs:o,sn:s}}class re extends Ft{constructor(e=0,t=0,n=1,r=0,o=Math.PI*2,s=!1){super(new p(e,t),new p(n,n),new p,0,r,o,s)}drawTo(e){const{cx:t,cy:n,rx:r,startAngle:o,endAngle:s,clockwise:c}=this;return e.arc(t,n,r,o,s,!c),this}getAdaptivePointArray(e=[]){const{cx:t,cy:n,rx:r,startAngle:o,endAngle:s,clockwise:c}=this;let h=Math.abs(o-s);(!c&&o>s||c&&s>o)&&(h=2*Math.PI-h);let a=Math.max(6,Math.floor(6*r**(1/3)*(h/Math.PI)));a=Math.max(a,3);let l=h/a,y=o;l*=c?1:-1;for(let f=0;f<a+1;f++){const x=Math.cos(y),u=Math.sin(y),d=t+x*r,M=n+u*r;e.push(d,M),y+=l}return e}}class j extends Y{constructor(e=new p,t=new p){super(),this.p1=e,this.p2=t}static from(e,t,n,r){return new j(new p(e,t),new p(n,r))}getPoint(e,t=new p){return e===1?t.copy(this.p2):t.copy(this.p2).sub(this.p1).scale(e).add(this.p1),t}getPointAt(e,t=new p){return this.getPoint(e,t)}getTangent(e,t=new p){return t.subVectors(this.p2,this.p1).normalize()}getTangentAt(e,t=new p){return this.getTangent(e,t)}getControlPointRefs(){return[this.p1,this.p2]}getAdaptivePointArray(e=[]){return e.push(this.p1.x,this.p1.y,this.p2.x,this.p2.y),e}getMinMax(e=p.MAX,t=p.MIN){const{p1:n,p2:r}=this;return e.x=Math.min(e.x,n.x,r.x),e.y=Math.min(e.y,n.y,r.y),t.x=Math.max(t.x,n.x,r.x),t.y=Math.max(t.y,n.y,r.y),{min:e,max:t}}toCommands(){const{p1:e,p2:t}=this;return[{type:"M",x:e.x,y:e.y},{type:"L",x:t.x,y:t.y}]}fillTriangulate(e={}){let{vertices:t=[],indices:n=[],verticesStride:r=2,verticesOffset:o=t.length/r,indicesOffset:s=n.length}=e;const c=this.p1.x,h=this.p1.y,a=this.p2.x-this.p1.x||1,l=this.p2.y-this.p2.y||1,y=[c,h,c+a,h,c+a,h+l,c,h+l];let f=0;o*=r,t[o+f]=y[0],t[o+f+1]=y[1],f+=r,t[o+f]=y[2],t[o+f+1]=y[3],f+=r,t[o+f]=y[6],t[o+f+1]=y[7],f+=r,t[o+f]=y[4],t[o+f+1]=y[5],f+=r;const x=o/r;return n[s++]=x,n[s++]=x+1,n[s++]=x+2,n[s++]=x+1,n[s++]=x+3,n[s++]=x+2,{vertices:t,indices:n}}drawTo(e){const{p1:t,p2:n}=this;return e.lineTo(t.x,t.y),e.lineTo(n.x,n.y),this}copy(e){return super.copy(e),this.p1.copy(e.p1),this.p2.copy(e.p2),this}}class rt extends Y{constructor(e=[]){super(),this.curves=e}getFlatCurves(){return this.curves.flatMap(e=>e instanceof rt?e.getFlatCurves():e)}addCurve(e){return this.curves.push(e),this}getPoint(e,t=new p){const n=e*this.getLength(),r=this.getLengths();let o=0;for(;o<r.length;){if(r[o]>=n){const s=r[o]-n,c=this.curves[o],h=c.getLength();return c.getPointAt(h===0?0:1-s/h,t)}o++}return t}updateLengths(){const e=[];for(let t=0,n=0,r=this.curves.length;t<r;t++)n+=this.curves[t].getLength(),e.push(n);this._arcLengths=e}getControlPointRefs(){return this.curves.flatMap(e=>e.getControlPointRefs())}_removeNextPointIfEqualPrevPoint(e,t){return e[t-1]===e[t+1]&&e[t]===e[t+2]&&e.splice(t+1,2),e}getSpacedPointArray(e=5,t=[]){let n;return this.curves.forEach(r=>{r.getSpacedPointArray(e,t),n&&this._removeNextPointIfEqualPrevPoint(t,n),n=t.length-1}),t}getAdaptivePointArray(e=[]){let t;return this.curves.forEach(n=>{n.getAdaptivePointArray(e),t&&this._removeNextPointIfEqualPrevPoint(e,t),t=e.length-1}),e}fillTriangulate(e){const t=(e==null?void 0:e.indices)??[],n=(e==null?void 0:e.vertices)??[],r=[],o=()=>{if(r.length){const s=[];r.forEach(c=>{const h=c.p1.x,a=c.p1.y;(s[s.length-2]!==h||s[s.length-1]!==a)&&s.push(h,a),s.push(c.p2.x,c.p2.y)}),Nt(s,{...e,indices:t,vertices:n}),r.length=0}};return this.curves.forEach(s=>{s instanceof j?r.push(s):(o(),s.fillTriangulate({...e,indices:t,vertices:n}))}),o(),{indices:t,vertices:n}}applyTransform(e){return this.curves.forEach(t=>t.applyTransform(e)),this}getMinMax(e=p.MAX,t=p.MIN){return this.curves.forEach(n=>n.getMinMax(e,t)),{min:e,max:t}}getBoundingBox(){const{min:e,max:t}=this.getMinMax();return new V(e.x,e.y,t.x-e.x,t.y-e.y)}toCommands(){return this.curves.flatMap(e=>e.toCommands())}drawTo(e){var n;const t=(n=this.curves[0])==null?void 0:n.getPoint(0);return t&&e.moveTo(t.x,t.y),this.curves.forEach(r=>r.drawTo(e)),this}copy(e){return super.copy(e),this.curves=e.curves.map(t=>t.clone()),this}}class Mt extends Y{constructor(e=new p,t=new p,n=new p,r=new p){super(),this.p1=e,this.cp1=t,this.cp2=n,this.p2=r}static from(e,t,n,r,o,s,c,h){return new Mt(new p(e,t),new p(n,r),new p(o,s),new p(c,h))}getPoint(e,t=new p){const{p1:n,cp1:r,cp2:o,p2:s}=this;return t.set(Et(e,n.x,r.x,o.x,s.x),Et(e,n.y,r.y,o.y,s.y))}getAdaptivePointArray(e=[]){return Ht(this.p1.x,this.p1.y,this.cp1.x,this.cp1.y,this.cp2.x,this.cp2.y,this.p2.x,this.p2.y,.5,e)}getControlPointRefs(){return[this.p1,this.cp1,this.cp2,this.p2]}_solveQuadratic(e,t,n){const r=t*t-4*e*n;if(r<0)return[];const o=Math.sqrt(r),s=(-t+o)/(2*e),c=(-t-o)/(2*e);return[s,c].filter(h=>h>=0&&h<=1)}getMinMax(e=p.MAX,t=p.MIN){const{p1:n,cp1:r,cp2:o,p2:s}=this,c=this._solveQuadratic(3*(r.x-n.x),6*(o.x-r.x),3*(s.x-o.x)),h=this._solveQuadratic(3*(r.y-n.y),6*(o.y-r.y),3*(s.y-o.y)),a=[0,1,...c,...h];return((y,f)=>{for(const x of y)for(let u=0;u<=f;u++){const d=u/f-.5,M=Math.min(1,Math.max(0,x+d)),b=this.getPoint(M);e.x=Math.min(e.x,b.x),e.y=Math.min(e.y,b.y),t.x=Math.max(t.x,b.x),t.y=Math.max(t.y,b.y)}})(a,10),{min:e,max:t}}toCommands(){const{p1:e,cp1:t,cp2:n,p2:r}=this;return[{type:"M",x:e.x,y:e.y},{type:"C",x1:t.x,y1:t.y,x2:n.x,y2:n.y,x:r.x,y:r.y}]}drawTo(e){const{p1:t,cp1:n,cp2:r,p2:o}=this;return e.lineTo(t.x,t.y),e.bezierCurveTo(n.x,n.y,r.x,r.y,o.x,o.y),this}copy(e){return super.copy(e),this.p1.copy(e.p1),this.cp1.copy(e.cp1),this.cp2.copy(e.cp2),this.p2.copy(e.p2),this}}class oe extends Ft{constructor(e=0,t=0,n=1,r=1,o=0,s=0,c=Math.PI*2,h=!1){super(new p(e,t),new p(n,r),new p,o,s,c,h)}drawTo(e){return e.ellipse(this.cx,this.cy,this.rx,this.ry,this.rotate,this.startAngle,this.endAngle,!this.clockwise),this}}class Ot extends rt{}class hn extends Ot{constructor(e=0,t=0,n=1,r=3){super(),this.cx=e,this.cy=t,this.radius=n,this.sideCount=r,this.update()}update(){const{cx:e,cy:t,radius:n,sideCount:r}=this,o=[];for(let c=0;c<r;c++){const h=c*2*Math.PI/r-.5*Math.PI;o.push(new p(n*Math.cos(h),n*Math.sin(h)).add({x:e,y:t}))}const s=[];for(let c=0;c<r;c++)s.push(new j(o[c],o[(c+1)%r]));return this.curves=s,this}copy(e){return super.copy(e),this.cx=e.cx,this.cy=e.cy,this.radius=e.radius,this.sideCount=e.sideCount,this.update(),this}}class Pt extends Y{constructor(e=new p,t=new p,n=new p){super(),this.p1=e,this.cp=t,this.p2=n}static from(e,t,n,r,o,s){return new Pt(new p(e,t),new p(n,r),new p(o,s))}getPoint(e,t=new p){const{p1:n,cp:r,p2:o}=this;return t.set(qt(e,n.x,r.x,o.x),qt(e,n.y,r.y,o.y)),t}getControlPointRefs(){return[this.p1,this.cp,this.p2]}getAdaptivePointArray(e=[]){return Qt(this.p1.x,this.p1.y,this.cp.x,this.cp.y,this.p2.x,this.p2.y,.5,e)}getMinMax(e=p.MAX,t=p.MIN){const{p1:n,cp:r,p2:o}=this,s=.5*(n.x+r.x),c=.5*(n.y+r.y),h=.5*(n.x+o.x),a=.5*(n.y+o.y);return e.x=Math.min(e.x,n.x,o.x,s,h),e.y=Math.min(e.y,n.y,o.y,c,a),t.x=Math.max(t.x,n.x,o.x,s,h),t.y=Math.max(t.y,n.y,o.y,c,a),{min:e,max:t}}toCommands(){const{p1:e,cp:t,p2:n}=this;return[{type:"M",x:e.x,y:e.y},{type:"Q",x1:t.x,y1:t.y,x:n.x,y:n.y}]}drawTo(e){const{p1:t,cp:n,p2:r}=this;return e.lineTo(t.x,t.y),e.quadraticCurveTo(n.x,n.y,r.x,r.y),this}copy(e){return super.copy(e),this.p1.copy(e.p1),this.cp.copy(e.cp),this.p2.copy(e.p2),this}}class ce extends Ot{constructor(e=0,t=0,n=0,r=0){super(),this.x=e,this.y=t,this.width=n,this.height=r,this.update()}update(){const{x:e,y:t,width:n,height:r}=this,o=[new p(e,t),new p(e+n,t),new p(e+n,t+r),new p(e,t+r)];return this.curves=[new j(o[0],o[1]),new j(o[1],o[2]),new j(o[2],o[3]),new j(o[3],o[0])],this}drawTo(e){return e.rect(this.x,this.y,this.width,this.height),this}fillTriangulate(e={}){let{vertices:t=[],indices:n=[],verticesStride:r=2,verticesOffset:o=t.length/r,indicesOffset:s=n.length}=e;const{x:c,y:h,width:a,height:l}=this,y=[c,h,c+a,h,c+a,h+l,c,h+l];let f=0;o*=r,t[o+f]=y[0],t[o+f+1]=y[1],f+=r,t[o+f]=y[2],t[o+f+1]=y[3],f+=r,t[o+f]=y[6],t[o+f+1]=y[7],f+=r,t[o+f]=y[4],t[o+f+1]=y[5],f+=r;const x=o/r;return n[s++]=x,n[s++]=x+1,n[s++]=x+2,n[s++]=x+1,n[s++]=x+3,n[s++]=x+2,{vertices:t,indices:n}}copy(e){return super.copy(e),this.x=e.x,this.y=e.y,this.width=e.width,this.height=e.height,this.update(),this}}class he extends Ft{constructor(e=0,t=0,n=1,r=1,o=1){super(),this.x=e,this.y=t,this.width=n,this.height=r,this.radius=o,this.update()}update(){const{x:e,y:t,width:n,height:r,radius:o}=this,s=n/2,c=r/2,h=e+s,a=t+c,l=Math.max(0,Math.min(o,Math.min(s,c))),y=l;return this._center=new p(h,a),this._radius=new p(l,y),this._diff=new p(s-l,c-y),this}drawTo(e){const{x:t,y:n,width:r,height:o,radius:s}=this;return e.roundRect(t,n,r,o,s),this}copy(e){return super.copy(e),this.x=e.x,this.y=e.y,this.width=e.width,this.height=e.height,this.radius=e.radius,this.update(),this}}class ae extends Y{constructor(e=[]){super(),this.points=e}getPoint(e,t=new p){const{points:n}=this,r=(n.length-1)*e,o=Math.floor(r),s=r-o,c=n[o===0?o:o-1],h=n[o],a=n[o>n.length-2?n.length-1:o+1],l=n[o>n.length-3?n.length-1:o+2];return t.set(St(s,c.x,h.x,a.x,l.x),St(s,c.y,h.y,a.y,l.y)),t}getControlPointRefs(){return this.points}copy(e){super.copy(e),this.points=[];for(let t=0,n=e.points.length;t<n;t++)this.points.push(e.points[t].clone());return this}}class lt extends rt{constructor(t){super();X(this,"startPoint");X(this,"currentPoint");X(this,"autoClose",!1);t&&this.addPoints(t)}addPoints(t){this.moveTo(t[0].x,t[0].y);for(let n=1,r=t.length;n<r;n++){const{x:o,y:s}=t[n];this.lineTo(o,s)}return this}addCommands(t){return kt(t,this),this}addData(t){return this.addCommands(It(t)),this}_closePointArray(t){return this.autoClose&&t.length>=4&&t[0]!==t[t.length-2]&&t[1]!==t[t.length-1]&&t.push(t[0],t[1]),t}getUnevenPointArray(t=40,n=[]){return this._closePointArray(super.getUnevenPointArray(t,n))}getSpacedPointArray(t=40,n=[]){return this._closePointArray(super.getSpacedPointArray(t,n))}getAdaptivePointArray(t=[]){return this._closePointArray(super.getAdaptivePointArray(t))}_setCurrentPoint(t){return this.currentPoint=new p(t.x,t.y),this.startPoint||(this.startPoint=this.currentPoint.clone()),this}_connetLineTo(t){if(this.curves.length>0){const n=t.getPoint(0);(!this.currentPoint||!n.equals(this.currentPoint))&&this.lineTo(n.x,n.y)}return this}closePath(){const t=this.startPoint;if(t){const n=this.currentPoint;n&&!t.equals(n)&&(this.curves.push(new j(n.clone(),t.clone())),n.copy(t)),this.startPoint=void 0}return this}moveTo(t,n){return this.currentPoint=new p(t,n),this.startPoint=this.currentPoint.clone(),this}lineTo(t,n){const r=this.currentPoint;return r!=null&&r.equals({x:t,y:n})||this.curves.push(j.from((r==null?void 0:r.x)??0,(r==null?void 0:r.y)??0,t,n)),this._setCurrentPoint({x:t,y:n}),this}bezierCurveTo(t,n,r,o,s,c){const h=this.currentPoint;return h!=null&&h.equals({x:s,y:c})||this.curves.push(Mt.from((h==null?void 0:h.x)??0,(h==null?void 0:h.y)??0,t,n,r,o,s,c)),this._setCurrentPoint({x:s,y:c}),this}quadraticCurveTo(t,n,r,o){const s=this.currentPoint;return s!=null&&s.equals({x:r,y:o})||this.curves.push(Pt.from((s==null?void 0:s.x)??0,(s==null?void 0:s.y)??0,t,n,r,o)),this._setCurrentPoint({x:r,y:o}),this}arc(t,n,r,o,s,c){const h=new re(t,n,r,o,s,!c);return this._connetLineTo(h),this.curves.push(h),this._setCurrentPoint(h.getPoint(1)),this}relativeArc(t,n,r,o,s,c){var h,a;return t+=((h=this.currentPoint)==null?void 0:h.x)??0,n+=((a=this.currentPoint)==null?void 0:a.y)??0,this.arc(t,n,r,o,s,c),this}arcTo(t,n,r,o,s){return console.warn("Method arcTo not supported yet"),this}ellipse(t,n,r,o,s,c,h,a=!0){const l=new oe(t,n,r,o,s,c,h,!a);return this._connetLineTo(l),this.curves.push(l),this._setCurrentPoint(l.getPoint(1)),this}relativeEllipse(t,n,r,o,s,c,h,a){var l,y;return t+=((l=this.currentPoint)==null?void 0:l.x)??0,n+=((y=this.currentPoint)==null?void 0:y.y)??0,this.ellipse(t,n,r,o,s,c,h,a),this}rect(t,n,r,o){const s=new ce(t,n,r,o);return this._connetLineTo(s),this.curves.push(s),this._setCurrentPoint({x:t,y:n}),this}roundRect(t,n,r,o,s){const c=new he(t,n,r,o,s);return this._connetLineTo(c),this.curves.push(c),this._setCurrentPoint({x:t,y:n}),this}splineThru(t){const n=this.currentPoint??new p;return this.curves.push(new ae([n].concat(t))),this._setCurrentPoint(t[t.length-1]),this}drawTo(t){var r;const n=(r=this.curves[0])==null?void 0:r.getPoint(0);return n&&t.moveTo(n.x,n.y),this.curves.forEach(o=>o.drawTo(t)),this.autoClose&&t.closePath(),this}copy(t){var n;return super.copy(t),this.autoClose=t.autoClose,this.currentPoint=(n=t.currentPoint)==null?void 0:n.clone(),this}}function an(i){return i.replace(/[^a-z0-9]/gi,"-").replace(/\B([A-Z])/g,"-$1").toLowerCase()}function ln(i,e,t,n){const r=e.clone().sub(i),o=n.clone().sub(t),s=t.clone().sub(i),c=r.cross(o);if(c===0)return new p((i.x+t.x)/2,(i.y+t.y)/2);const h=s.cross(o)/c;return Math.abs(h)>1?new p((i.x+t.x)/2,(i.y+t.y)/2):new p(i.x+h*r.x,i.y+h*r.y)}class G extends rt{constructor(t,n={}){super();X(this,"currentCurve",new lt);X(this,"style");this.curves.push(this.currentCurve),this.style=n,t&&(t instanceof G?this.addPath(t):Array.isArray(t)?this.addCommands(t):this.addData(t))}get startPoint(){return this.currentCurve.startPoint}get currentPoint(){return this.currentCurve.currentPoint}get strokeWidth(){return this.style.strokeWidth??((this.style.stroke??"none")==="none"?0:1)}addPath(t){const n=this.curves.findIndex(r=>r===this.currentCurve);return n>-1&&this.curves.splice(n,1),t instanceof G?this.curves.push(...t.curves.filter(r=>r.curves.length).map(r=>r.clone())):t.curves.length&&this.curves.push(t),this.curves.push(this.currentCurve),this}closePath(){const t=this.startPoint;return t&&(this.currentCurve.closePath(),this.currentCurve.curves.length&&(this.currentCurve=new lt().moveTo(t.x,t.y),this.curves.push(this.currentCurve))),this}moveTo(t,n){var r;return(r=this.currentCurve.currentPoint)!=null&&r.equals({x:t,y:n})||(this.currentCurve.curves.length&&(this.currentCurve=new lt,this.curves.push(this.currentCurve)),this.currentCurve.moveTo(t,n)),this}lineTo(t,n){return this.currentCurve.lineTo(t,n),this}bezierCurveTo(t,n,r,o,s,c){return this.currentCurve.bezierCurveTo(t,n,r,o,s,c),this}quadraticCurveTo(t,n,r,o){return this.currentCurve.quadraticCurveTo(t,n,r,o),this}arc(t,n,r,o,s,c){return this.currentCurve.arc(t,n,r,o,s,c),this}arcTo(t,n,r,o,s){return this.currentCurve.arcTo(t,n,r,o,s),this}ellipse(t,n,r,o,s,c,h,a){return this.currentCurve.ellipse(t,n,r,o,s,c,h,a),this}rect(t,n,r,o){return this.currentCurve.rect(t,n,r,o),this}roundRect(t,n,r,o,s){return this.currentCurve.roundRect(t,n,r,o,s),this}reset(){return this.currentCurve=new lt,this.curves=[this.currentCurve],this.style={},this}addCommands(t){return kt(t,this),this}addData(t){return this.addCommands(It(t)),this}splineThru(t){return this.currentCurve.splineThru(t),this}scale(t,n=t,r={x:0,y:0}){return this.getControlPointRefs().forEach(o=>{o.scale(t,n,r)}),this}skew(t,n=0,r={x:0,y:0}){return this.getControlPointRefs().forEach(o=>{o.skew(t,n,r)}),this}rotate(t,n={x:0,y:0}){return this.getControlPointRefs().forEach(r=>{r.rotate(t,n)}),this}bold(t){if(t===0)return this;const n=this.getFlatCurves(),r=[],o=[],s=[];n.forEach((h,a)=>{const l=h.getControlPointRefs(),y=h.isClockwise();s[a]=l,o[a]=y;const f=l[0],x=l[l.length-1]??f;r.push({start:y?x:f,end:y?f:x,index:a})});const c=[];return r.forEach((h,a)=>{c[a]=[],r.forEach((l,y)=>{var f;l.start&&h.end&&y!==a&&((f=l.start)!=null&&f.equals(h.end))&&c[a].push(l.index)})}),n.forEach((h,a)=>{const l=o[a];s[a].forEach(y=>{y.add(h.getNormal(h.getTForPoint(y)).scale(l?t:-t))})}),c.forEach((h,a)=>{const l=s[a];h.forEach(y=>{const f=s[y],x=ln(l[l.length-1],l[l.length-2]??l[l.length-1],f[0],f[1]??f[0]);x&&(l[l.length-1].copy(x),f[0].copy(x))})}),this}getMinMax(t=p.MAX,n=p.MIN,r=!0){const o=this.strokeWidth;return this.curves.forEach(s=>{if(s.getMinMax(t,n),r&&o>1){const c=o/2,h=s.isClockwise(),a=[];for(let l=0;l<=1;l+=1/s.arcLengthDivision){const y=s.getPoint(l),f=s.getNormal(l),x=f.clone().scale(h?c:-c),u=f.clone().scale(h?-c:c);a.push(y.clone().add(x),y.clone().add(u),y.clone().add({x:c,y:0}),y.clone().add({x:-c,y:0}),y.clone().add({x:0,y:c}),y.clone().add({x:0,y:-c}),y.clone().add({x:c,y:c}),y.clone().add({x:-c,y:-c}))}t.min(...a),n.max(...a)}}),{min:t,max:n}}strokeTriangulate(t){const n=(t==null?void 0:t.indices)??[],r=(t==null?void 0:t.vertices)??[];return this.curves.forEach(o=>{o.strokeTriangulate({...t,indices:n,vertices:r})}),{indices:n,vertices:r}}getBoundingBox(t=!0){const{min:n,max:r}=this.getMinMax(void 0,void 0,t);return new V(n.x,n.y,r.x-n.x,r.y-n.y)}drawTo(t,n={}){n={...this.style,...n};const{fill:r="#000",stroke:o="none"}=n;return t.beginPath(),t.save(),Ct(t,n),this.curves.forEach(s=>{s.drawTo(t)}),r!=="none"&&t.fill(),o!=="none"&&t.stroke(),t.restore(),this}drawControlPointsTo(t,n={}){n={...this.style,...n};const{fill:r="#000",stroke:o="none"}=n;return t.beginPath(),t.save(),Ct(t,n),this.getControlPointRefs().forEach(s=>{R(t,s.x,s.y,{radius:4})}),r!=="none"&&t.fill(),o!=="none"&&t.stroke(),t.restore(),this}toCommands(){return this.curves.flatMap(t=>t.toCommands())}toData(){return this.curves.filter(t=>t.curves.length).map(t=>t.toData()).join(" ")}toSVGPathString(){const t={...this.style,fill:this.style.fill??"#000",stroke:this.style.stroke??"none"},n={};for(const o in t)t[o]!==void 0&&(n[an(o)]=t[o]);Object.assign(n,{"stroke-width":`${this.strokeWidth}px`});let r="";for(const o in n)n[o]!==void 0&&(r+=`${o}:${n[o]};`);return`<path d="${this.toData()}" style="${r}"></path>`}copy(t){return super.copy(t),this.currentCurve=t.currentCurve.clone(),this.style={...t.style},this}}class le{constructor(e=[],t){this.paths=e,this.viewBox=t}getBoundingBox(e=!0){if(!this.paths.length)return;const t=p.MAX,n=p.MIN;return this.paths.forEach(r=>r.getMinMax(t,n,e)),new V(t.x,t.y,n.x-t.x,n.y-t.y)}toSVGString(){const{x:e,y:t,width:n,height:r}=this.getBoundingBox(),o=this.paths.map(s=>s.toSVGPathString()).join("");return`<svg viewBox="${e} ${t} ${n} ${r}" width="${n}px" height="${r}px" xmlns="http://www.w3.org/2000/svg">${o}</svg>`}toSVGUrl(){return`data:image/svg+xml;base64,${btoa(this.toSVGString())}`}toSVG(){return new DOMParser().parseFromString(this.toSVGString(),"image/svg+xml").documentElement}toCanvas(e={}){const{pixelRatio:t=2,...n}=e,{left:r,top:o,width:s,height:c}=this.getBoundingBox(),h=document.createElement("canvas");h.width=s*t,h.height=c*t,h.style.width=`${s}px`,h.style.height=`${c}px`;const a=h.getContext("2d");return a&&(a.scale(t,t),a.translate(-r,-o),this.paths.forEach(l=>{l.drawTo(a,n)})),h}}const ue="data:image/svg+xml;",ye=`${ue}base64,`,fe=`${ue}charset=utf8,`;function xe(i){if(typeof i=="string"){let e;i.startsWith(ye)?(i=i.substring(ye.length,i.length),e=atob(i)):i.startsWith(fe)?(i=i.substring(fe.length,i.length),e=decodeURIComponent(i)):e=i;const t=new DOMParser().parseFromString(e,"text/xml"),n=t.querySelector("parsererror");if(n)throw new Error(`${n.textContent??"parser error"}
2
- ${e}`);return t.documentElement}else return i}const un="px",yn=90,pe=["mm","cm","in","pt","pc","px"],ge={mm:{mm:1,cm:.1,in:1/25.4,pt:72/25.4,pc:6/25.4,px:-1},cm:{mm:10,cm:1,in:1/2.54,pt:72/2.54,pc:6/2.54,px:-1},in:{mm:25.4,cm:2.54,in:1,pt:72,pc:6,px:-1},pt:{mm:25.4/72,cm:2.54/72,in:1/72,pt:1,pc:6/72,px:-1},pc:{mm:25.4/6,cm:2.54/6,in:1/6,pt:72/6,pc:1,px:-1},px:{px:1}};function L(i){let e="px";if(typeof i=="string"||i instanceof String)for(let n=0,r=pe.length;n<r;n++){const o=pe[n];if(i.endsWith(o)){e=o,i=i.substring(0,i.length-o.length);break}}let t;return t=ge[e][un],t<0&&(t=ge[e].in*yn),t*Number.parseFloat(i)}const fn=new z,wt=new z,de=new z,me=new z;function xn(i,e,t){if(!(i.hasAttribute("transform")||i.nodeName==="use"&&(i.hasAttribute("x")||i.hasAttribute("y"))))return null;const n=pn(i);return t.length>0&&n.premultiply(t[t.length-1]),e.copy(n),t.push(n),n}function pn(i){const e=new z,t=fn;if(i.nodeName==="use"&&(i.hasAttribute("x")||i.hasAttribute("y"))&&e.translate(L(i.getAttribute("x")),L(i.getAttribute("y"))),i.hasAttribute("transform")){const n=i.getAttribute("transform").split(")");for(let r=n.length-1;r>=0;r--){const o=n[r].trim();if(o==="")continue;const s=o.indexOf("("),c=o.length;if(s>0&&s<c){const h=o.slice(0,s),a=Z(o.slice(s+1));switch(t.identity(),h){case"translate":if(a.length>=1){const l=a[0];let y=0;a.length>=2&&(y=a[1]),t.translate(l,y)}break;case"rotate":if(a.length>=1){let l=0,y=0,f=0;l=a[0]*Math.PI/180,a.length>=3&&(y=a[1],f=a[2]),wt.makeTranslation(-y,-f),de.makeRotation(l),me.multiplyMatrices(de,wt),wt.makeTranslation(y,f),t.multiplyMatrices(wt,me)}break;case"scale":a.length>=1&&t.scale(a[0],a[1]??a[0]);break;case"skewX":a.length===1&&t.set(1,Math.tan(a[0]*Math.PI/180),0,0,1,0,0,0,1);break;case"skewY":a.length===1&&t.set(1,0,0,Math.tan(a[0]*Math.PI/180),1,0,0,0,1);break;case"matrix":a.length===6&&t.set(a[0],a[2],a[4],a[1],a[3],a[5],0,0,1);break}}e.premultiply(t)}}return e}function gn(i){return new G().arc(L(i.getAttribute("cx")||0),L(i.getAttribute("cy")||0),L(i.getAttribute("r")||0),0,Math.PI*2)}function dn(i,e){if(!(!i.sheet||!i.sheet.cssRules||!i.sheet.cssRules.length))for(let t=0;t<i.sheet.cssRules.length;t++){const n=i.sheet.cssRules[t];if(n.type!==1)continue;const r=n.selectorText.split(/,/g).filter(Boolean).map(s=>s.trim()),o={};for(let s=n.style.length,c=0;c<s;c++){const h=n.style.item(c);o[h]=n.style.getPropertyValue(h)}for(let s=0;s<r.length;s++)e[r[s]]=Object.assign(e[r[s]]||{},{...o})}}function mn(i){return new G().ellipse(L(i.getAttribute("cx")||0),L(i.getAttribute("cy")||0),L(i.getAttribute("rx")||0),L(i.getAttribute("ry")||0),0,0,Math.PI*2)}function Mn(i){return new G().moveTo(L(i.getAttribute("x1")||0),L(i.getAttribute("y1")||0)).lineTo(L(i.getAttribute("x2")||0),L(i.getAttribute("y2")||0))}function Pn(i){const e=new G,t=i.getAttribute("d");return!t||t==="none"?null:(e.addData(t),e)}const wn=/([+-]?(?:\d+(?:\.\d+)?|\.\d+)(?:e[+-]?\d+)?)(?:,|\s)([+-]?\d*\.?\d+(?:e[+-]?\d+)?)/g;function vn(i){var n;const e=new G;let t=0;return(n=i.getAttribute("points"))==null||n.replace(wn,(r,o,s)=>{const c=L(o),h=L(s);return t===0?e.moveTo(c,h):e.lineTo(c,h),t++,r}),e.currentCurve.autoClose=!0,e}const Tn=/([+-]?(?:\d+(?:\.\d+)?|\.\d+)(?:e[+-]?\d+)?)(?:,|\s)([+-]?\d*\.?\d+(?:e[+-]?\d+)?)/g;function An(i){var n;const e=new G;let t=0;return(n=i.getAttribute("points"))==null||n.replace(Tn,(r,o,s)=>{const c=L(o),h=L(s);return t===0?e.moveTo(c,h):e.lineTo(c,h),t++,r}),e.currentCurve.autoClose=!1,e}function Cn(i){const e=L(i.getAttribute("x")||0),t=L(i.getAttribute("y")||0),n=L(i.getAttribute("rx")||i.getAttribute("ry")||0),r=L(i.getAttribute("ry")||i.getAttribute("rx")||0),o=L(i.getAttribute("width")),s=L(i.getAttribute("height")),c=1-.551915024494,h=new G;return h.moveTo(e+n,t),h.lineTo(e+o-n,t),(n!==0||r!==0)&&h.bezierCurveTo(e+o-n*c,t,e+o,t+r*c,e+o,t+r),h.lineTo(e+o,t+s-r),(n!==0||r!==0)&&h.bezierCurveTo(e+o,t+s-r*c,e+o-n*c,t+s,e+o-n,t+s),h.lineTo(e+n,t+s),(n!==0||r!==0)&&h.bezierCurveTo(e+n*c,t+s,e,t+s-r*c,e,t+s-r),h.lineTo(e,t+r),(n!==0||r!==0)&&h.bezierCurveTo(e,t+r*c,e+n*c,t,e+n,t),h}function U(i,e,t){e=Object.assign({},e);let n={};if(i.hasAttribute("class")){const a=i.getAttribute("class").split(/\s/).filter(Boolean).map(l=>l.trim());for(let l=0;l<a.length;l++)n=Object.assign(n,t[`.${a[l]}`])}i.hasAttribute("id")&&(n=Object.assign(n,t[`#${i.getAttribute("id")}`]));for(let a=i.style.length,l=0;l<a;l++){const y=i.style.item(l),f=i.style.getPropertyValue(y);e[y]=f,n[y]=f}function r(a,l,y=o){i.hasAttribute(a)&&(e[l]=y(i.getAttribute(a))),n[a]&&(e[l]=y(n[a]))}function o(a){return a.startsWith("url")&&console.warn("url access in attributes is not implemented."),a}function s(a){return Math.max(0,Math.min(1,L(a)))}function c(a){return Math.max(0,L(a))}function h(a){return a.split(" ").filter(l=>l!=="").map(l=>L(l))}return r("fill","fill"),r("fill-opacity","fillOpacity",s),r("fill-rule","fillRule"),r("opacity","opacity",s),r("stroke","stroke"),r("stroke-opacity","strokeOpacity",s),r("stroke-width","strokeWidth",c),r("stroke-linecap","strokeLinecap"),r("stroke-linejoin","strokeLinejoin"),r("stroke-miterlimit","strokeMiterlimit",c),r("stroke-dasharray","strokeDasharray",h),r("stroke-dashoffset","strokeDashoffset",L),r("visibility","visibility"),e}function Rt(i,e,t=[],n={}){var y;if(i.nodeType!==1)return t;let r=!1,o=null,s={...e};switch(i.nodeName){case"svg":s=U(i,s,n);break;case"style":dn(i,n);break;case"g":s=U(i,s,n);break;case"path":s=U(i,s,n),i.hasAttribute("d")&&(o=Pn(i));break;case"rect":s=U(i,s,n),o=Cn(i);break;case"polygon":s=U(i,s,n),o=vn(i);break;case"polyline":s=U(i,s,n),o=An(i);break;case"circle":s=U(i,s,n),o=gn(i);break;case"ellipse":s=U(i,s,n),o=mn(i);break;case"line":s=U(i,s,n),o=Mn(i);break;case"defs":r=!0;break;case"use":{s=U(i,s,n);const x=(i.getAttributeNS("http://www.w3.org/1999/xlink","href")||i.getAttribute("href")||"").substring(1),u=(y=i.viewportElement)==null?void 0:y.getElementById(x);u?Rt(u,s,t,n):console.warn(`'use node' references non-existent node id: ${x}`);break}default:console.warn(i);break}if(s.display==="none")return t;const c=new z,h=[],a=xn(i,c,h);o&&(o.applyTransform(c),t.push(o),o.style={...s});const l=i.childNodes;for(let f=0,x=l.length;f<x;f++){const u=l[f];r&&u.nodeName!=="style"&&u.nodeName!=="defs"||Rt(u,s,t,n)}return a&&(h.pop(),h.length>0?c.copy(h[h.length-1]):c.identity()),t}function bn(i){var t;const e=xe(i);return new le(Rt(e,{}),(t=e.getAttribute("viewBox"))==null?void 0:t.trim().split(" ").map(n=>Number(n)))}v.ArcCurve=re,v.BoundingBox=V,v.CompositeCurve=rt,v.CubicBezierCurve=Mt,v.Curve=Y,v.CurvePath=lt,v.EllipseCurve=oe,v.EquilateralPloygonCurve=hn,v.LineCurve=j,v.Matrix3=z,v.Path2D=G,v.Path2DSet=le,v.PloygonCurve=Ot,v.QuadraticBezierCurve=Pt,v.RectangleCurve=ce,v.RoundRectangleCurve=he,v.SplineCurve=ae,v.Vector2=p,v.catmullRom=St,v.cubicBezier=Et,v.drawPoint=R,v.fillTriangulate=Nt,v.getAdaptiveCubicBezierCurvePoints=Ht,v.getAdaptiveQuadraticBezierCurvePoints=Qt,v.parseArcCommand=jt,v.parsePathDataArgs=Z,v.quadraticBezier=qt,v.setCanvasContext=Ct,v.strokeTriangulate=Jt,v.svgPathCommandsAddToPath2D=kt,v.svgPathCommandsToData=Gt,v.svgPathDataToCommands=It,v.svgToDOM=xe,v.svgToPath2DSet=bn,Object.defineProperty(v,Symbol.toStringTag,{value:"Module"})});
1
+ (function(v,R){typeof exports=="object"&&typeof module<"u"?R(exports):typeof define=="function"&&define.amd?define(["exports"],R):(v=typeof globalThis<"u"?globalThis:v||self,R(v.modernPath2d={}))})(this,function(v){"use strict";var Nn=Object.defineProperty;var Fn=(v,R,nt)=>R in v?Nn(v,R,{enumerable:!0,configurable:!0,writable:!0,value:nt}):v[R]=nt;var V=(v,R,nt)=>Fn(v,typeof R!="symbol"?R+"":R,nt);function R(i,e,t,n={}){const{radius:r=1}=n;i.moveTo(e,t),i.arc(e,t,r,0,Math.PI*2)}const nt={arcs:"bevel",bevel:"bevel",miter:"miter","miter-clip":"miter",round:"round"};function At(i,e){const{fill:t="#000",stroke:n="none",strokeWidth:r=n==="none"?0:1,strokeLinecap:o="round",strokeLinejoin:s="miter",strokeMiterlimit:c=0,strokeDasharray:h=[],strokeDashoffset:a=0,shadowOffsetX:l=0,shadowOffsetY:f=0,shadowBlur:y=0,shadowColor:x="rgba(0, 0, 0, 0)"}=e;i.fillStyle=t,i.strokeStyle=n,i.lineWidth=r,i.lineCap=o,i.lineJoin=nt[s],i.miterLimit=c,i.setLineDash(h),i.lineDashOffset=a,i.shadowOffsetX=l,i.shadowOffsetY=f,i.shadowBlur=y,i.shadowColor=x}class p{constructor(e=0,t=0){this.x=e,this.y=t}static get MAX(){return new p(1/0,1/0)}static get MIN(){return new p(-1/0,-1/0)}get array(){return[this.x,this.y]}finite(){return this.x=Number.isFinite(this.x)?this.x:0,this.y=Number.isFinite(this.y)?this.y:0,this}set(e,t){return this.x=e,this.y=t,this}add(e){return this.x+=e.x,this.y+=e.y,this}sub(e){return this.x-=e.x,this.y-=e.y,this}multiply(e){return this.x*=e.x,this.y*=e.y,this}divide(e){return this.x/=e.x,this.y/=e.y,this}dot(e){return this.x*e.x+this.y*e.y}cross(e){return this.x*e.y-this.y*e.x}rotate(e,t={x:0,y:0}){const n=-e/180*Math.PI,r=this.x-t.x,o=-(this.y-t.y),s=Math.sin(n),c=Math.cos(n);return this.set(t.x+(r*c-o*s),t.y-(r*s+o*c)),this}distanceTo(e){return Math.sqrt(this.distanceToSquared(e))}distanceToSquared(e){const t=this.x-e.x,n=this.y-e.y;return t*t+n*n}lengthSquared(){return this.x*this.x+this.y*this.y}length(){return Math.sqrt(this.lengthSquared())}scale(e,t=e,n={x:0,y:0}){const r=e<0?n.x-this.x+n.x:this.x,o=t<0?n.y-this.y+n.y:this.y;return this.x=r*Math.abs(e),this.y=o*Math.abs(t),this}skew(e,t=0,n={x:0,y:0}){const r=this.x-n.x,o=this.y-n.y;return this.x=n.x+(r+Math.tan(e)*o),this.y=n.y+(o+Math.tan(t)*r),this}min(...e){return this.x=Math.min(this.x,...e.map(t=>t.x)),this.y=Math.min(this.y,...e.map(t=>t.y)),this}max(...e){return this.x=Math.max(this.x,...e.map(t=>t.x)),this.y=Math.max(this.y,...e.map(t=>t.y)),this}normalize(){return this.scale(1/(this.length()||1))}addVectors(e,t){return this.x=e.x+t.x,this.y=e.y+t.y,this}subVectors(e,t){return this.x=e.x-t.x,this.y=e.y-t.y,this}multiplyVectors(e,t){return this.x=e.x*t.x,this.y=e.y*t.y,this}divideVectors(e,t){return this.x=e.x/t.x,this.y=e.y/t.y,this}lerpVectors(e,t,n){return this.x=e.x+(t.x-e.x)*n,this.y=e.y+(t.y-e.y)*n,this}equals(e){return this.x===e.x&&this.y===e.y}applyMatrix3(e){const t=this.x,n=this.y,r=e.elements;return this.x=r[0]*t+r[3]*n+r[6],this.y=r[1]*t+r[4]*n+r[7],this}copy(e){return this.x=e.x,this.y=e.y,this}clone(){return new p(this.x,this.y)}}class X{constructor(e=0,t=0,n=0,r=0){this.left=e,this.top=t,this.width=n,this.height=r}get x(){return this.left}set x(e){this.left=e}get y(){return this.top}set y(e){this.top=e}get right(){return this.left+this.width}get bottom(){return this.top+this.height}get center(){return new p((this.left+this.right)/2,(this.top+this.bottom)/2)}get array(){return[this.left,this.top,this.width,this.height]}static from(...e){if(e.length===0)return new X;if(e.length===1)return e[0].clone();const t=e[0],n=e.slice(1).reduce((r,o)=>(r.left=Math.min(r.left,o.left),r.top=Math.min(r.top,o.top),r.right=Math.max(r.right,o.right),r.bottom=Math.max(r.bottom,o.bottom),r),{left:(t==null?void 0:t.left)??0,top:(t==null?void 0:t.top)??0,right:(t==null?void 0:t.right)??0,bottom:(t==null?void 0:t.bottom)??0});return new X(n.left,n.top,n.right-n.left,n.bottom-n.top)}translate(e,t){return this.left+=e,this.top+=t,this}copy(e){return this.left=e.left,this.top=e.top,this.width=e.width,this.height=e.height,this}clone(){return new X(this.left,this.top,this.width,this.height)}}class z{constructor(e=1,t=0,n=0,r=0,o=1,s=0,c=0,h=0,a=1){V(this,"elements",[]);this.set(e,t,n,r,o,s,c,h,a)}set(e,t,n,r,o,s,c,h,a){const l=this.elements;return l[0]=e,l[1]=r,l[2]=c,l[3]=t,l[4]=o,l[5]=h,l[6]=n,l[7]=s,l[8]=a,this}identity(){return this.set(1,0,0,0,1,0,0,0,1),this}copy(e){const t=this.elements,n=e.elements;return t[0]=n[0],t[1]=n[1],t[2]=n[2],t[3]=n[3],t[4]=n[4],t[5]=n[5],t[6]=n[6],t[7]=n[7],t[8]=n[8],this}multiply(e){return this.multiplyMatrices(this,e)}premultiply(e){return this.multiplyMatrices(e,this)}multiplyMatrices(e,t){const n=e.elements,r=t.elements,o=this.elements,s=n[0],c=n[3],h=n[6],a=n[1],l=n[4],f=n[7],y=n[2],x=n[5],u=n[8],g=r[0],M=r[3],T=r[6],I=r[1],P=r[4],w=r[7],E=r[2],S=r[5],d=r[8];return o[0]=s*g+c*I+h*E,o[3]=s*M+c*P+h*S,o[6]=s*T+c*w+h*d,o[1]=a*g+l*I+f*E,o[4]=a*M+l*P+f*S,o[7]=a*T+l*w+f*d,o[2]=y*g+x*I+u*E,o[5]=y*M+x*P+u*S,o[8]=y*T+x*w+u*d,this}invert(){const e=this.elements,t=e[0],n=e[1],r=e[2],o=e[3],s=e[4],c=e[5],h=e[6],a=e[7],l=e[8],f=l*s-c*a,y=c*h-l*o,x=a*o-s*h,u=t*f+n*y+r*x;if(u===0)return this.set(0,0,0,0,0,0,0,0,0);const g=1/u;return e[0]=f*g,e[1]=(r*a-l*n)*g,e[2]=(c*n-r*s)*g,e[3]=y*g,e[4]=(l*t-r*h)*g,e[5]=(r*o-c*t)*g,e[6]=x*g,e[7]=(n*h-a*t)*g,e[8]=(s*t-n*o)*g,this}transpose(){let e;const t=this.elements;return e=t[1],t[1]=t[3],t[3]=e,e=t[2],t[2]=t[6],t[6]=e,e=t[5],t[5]=t[7],t[7]=e,this}scale(e,t){return this.premultiply(bt.makeScale(e,t)),this}rotate(e){return this.premultiply(bt.makeRotation(-e)),this}translate(e,t){return this.premultiply(bt.makeTranslation(e,t)),this}makeTranslation(e,t){return this.set(1,0,e,0,1,t,0,0,1),this}makeRotation(e){const t=Math.cos(e),n=Math.sin(e);return this.set(t,-n,0,n,t,0,0,0,1),this}makeScale(e,t){return this.set(e,0,0,0,t,0,0,0,1),this}fromArray(e,t=0){for(let n=0;n<9;n++)this.elements[n]=e[n+t];return this}clone(){return new this.constructor().fromArray(this.elements)}}const bt=new z;function Zt(i,e,t,n){const r=i*t+e*n,o=Math.sqrt(i*i+e*e)*Math.sqrt(t*t+n*n);let s=Math.acos(Math.max(-1,Math.min(1,r/o)));return i*n-e*t<0&&(s=-s),s}function jt(i,e,t,n,r,o,s,c){if(e===0||t===0){i.lineTo(c.x,c.y);return}n=n*Math.PI/180,e=Math.abs(e),t=Math.abs(t);const h=(s.x-c.x)/2,a=(s.y-c.y)/2,l=Math.cos(n)*h+Math.sin(n)*a,f=-Math.sin(n)*h+Math.cos(n)*a;let y=e*e,x=t*t;const u=l*l,g=f*f,M=u/y+g/x;if(M>1){const q=Math.sqrt(M);e=q*e,t=q*t,y=e*e,x=t*t}const T=y*g+x*u,I=(y*x-T)/T;let P=Math.sqrt(Math.max(0,I));r===o&&(P=-P);const w=P*e*f/t,E=-P*t*l/e,S=Math.cos(n)*w-Math.sin(n)*E+(s.x+c.x)/2,d=Math.sin(n)*w+Math.cos(n)*E+(s.y+c.y)/2,m=Zt(1,0,(l-w)/e,(f-E)/t),_=Zt((l-w)/e,(f-E)/t,(-l-w)/e,(-f-E)/t)%(Math.PI*2);i.ellipse(S,d,e,t,n,m,m+_,o===0)}const D={SEPARATOR:/[ \t\r\n,.\-+]/,WHITESPACE:/[ \t\r\n]/,DIGIT:/\d/,SIGN:/[-+]/,POINT:/\./,COMMA:/,/,EXP:/e/i,FLAGS:/[01]/};function Z(i,e,t=0){let c=0,h=!0,a="",l="";const f=[];function y(M,T,I){const P=new SyntaxError(`Unexpected character "${M}" at index ${T}.`);throw P.partial=I,P}function x(){a!==""&&(l===""?f.push(Number(a)):f.push(Number(a)*10**Number(l))),a="",l=""}let u;const g=i.length;for(let M=0;M<g;M++){if(u=i[M],Array.isArray(e)&&e.includes(f.length%t)&&D.FLAGS.test(u)){c=1,a=u,x();continue}if(c===0){if(D.WHITESPACE.test(u))continue;if(D.DIGIT.test(u)||D.SIGN.test(u)){c=1,a=u;continue}if(D.POINT.test(u)){c=2,a=u;continue}D.COMMA.test(u)&&(h&&y(u,M,f),h=!0)}if(c===1){if(D.DIGIT.test(u)){a+=u;continue}if(D.POINT.test(u)){a+=u,c=2;continue}if(D.EXP.test(u)){c=3;continue}D.SIGN.test(u)&&a.length===1&&D.SIGN.test(a[0])&&y(u,M,f)}if(c===2){if(D.DIGIT.test(u)){a+=u;continue}if(D.EXP.test(u)){c=3;continue}D.POINT.test(u)&&a[a.length-1]==="."&&y(u,M,f)}if(c===3){if(D.DIGIT.test(u)){l+=u;continue}if(D.SIGN.test(u)){if(l===""){l+=u;continue}l.length===1&&D.SIGN.test(l)&&y(u,M,f)}}D.WHITESPACE.test(u)?(x(),c=0,h=!1):D.COMMA.test(u)?(x(),c=0,h=!0):D.SIGN.test(u)?(x(),c=1,a=u):D.POINT.test(u)?(x(),c=2,a=u):y(u,M,f)}return x(),f}function st(i,e){return i-(e-i)}function kt(i,e){const t=new p,n=new p;for(let r=0,o=i.length;r<o;r++){const s=i[r];if(s.type==="m"||s.type==="M")s.type==="m"?t.add(s):t.copy(s),e.moveTo(t.x,t.y),n.copy(t);else if(s.type==="h"||s.type==="H")s.type==="h"?t.x+=s.x:t.x=s.x,e.lineTo(t.x,t.y),n.copy(t);else if(s.type==="v"||s.type==="V")s.type==="v"?t.y+=s.y:t.y=s.y,e.lineTo(t.x,t.y),n.copy(t);else if(s.type==="l"||s.type==="L")s.type==="l"?t.add(s):t.copy(s),e.lineTo(t.x,t.y),n.copy(t);else if(s.type==="c"||s.type==="C")s.type==="c"?(e.bezierCurveTo(t.x+s.x1,t.y+s.y1,t.x+s.x2,t.y+s.y2,t.x+s.x,t.y+s.y),n.x=t.x+s.x2,n.y=t.y+s.y2,t.add(s)):(e.bezierCurveTo(s.x1,s.y1,s.x2,s.y2,s.x,s.y),n.x=s.x2,n.y=s.y2,t.copy(s));else if(s.type==="s"||s.type==="S")s.type==="s"?(e.bezierCurveTo(st(t.x,n.x),st(t.y,n.y),t.x+s.x2,t.y+s.y2,t.x+s.x,t.y+s.y),n.x=t.x+s.x2,n.y=t.y+s.y2,t.add(s)):(e.bezierCurveTo(st(t.x,n.x),st(t.y,n.y),s.x2,s.y2,s.x,s.y),n.x=s.x2,n.y=s.y2,t.copy(s));else if(s.type==="q"||s.type==="Q")s.type==="q"?(e.quadraticCurveTo(t.x+s.x1,t.y+s.y1,t.x+s.x,t.y+s.y),n.x=t.x+s.x1,n.y=t.y+s.y1,t.add(s)):(e.quadraticCurveTo(s.x1,s.y1,s.x,s.y),n.x=s.x1,n.y=s.y1,t.copy(s));else if(s.type==="t"||s.type==="T"){const c=st(t.x,n.x),h=st(t.y,n.y);n.x=c,n.y=h,s.type==="t"?(e.quadraticCurveTo(c,h,t.x+s.x,t.y+s.y),t.add(s)):(e.quadraticCurveTo(c,h,s.x,s.y),t.copy(s))}else if(s.type==="a"||s.type==="A"){const c=t.clone();if(s.type==="a"){if(s.x===0&&s.y===0)continue;t.add(s)}else{if(t.equals(s))continue;t.copy(s)}n.copy(t),jt(e,s.rx,s.ry,s.angle,s.largeArcFlag,s.sweepFlag,c,t)}else s.type==="z"||s.type==="Z"?(e.startPoint&&t.copy(e.startPoint),e.closePath()):console.warn("Unsupported commands",s)}}function Gt(i){let e,t;const n=[];for(let r=0,o=i.length;r<o;r++){const s=i[r];switch(s.type){case"m":case"M":if(s.x.toFixed(4)===(t==null?void 0:t.x.toFixed(4))&&s.y.toFixed(4)===(t==null?void 0:t.y.toFixed(4)))continue;n.push(`${s.type} ${s.x} ${s.y}`),t={x:s.x,y:s.y},e={x:s.x,y:s.y};break;case"h":case"H":n.push(`${s.type} ${s.x}`),t={x:s.x,y:(t==null?void 0:t.y)??0};break;case"v":case"V":n.push(`${s.type} ${s.y}`),t={x:(t==null?void 0:t.x)??0,y:s.y};break;case"l":case"L":n.push(`${s.type} ${s.x} ${s.y}`),t={x:s.x,y:s.y};break;case"c":case"C":n.push(`${s.type} ${s.x1} ${s.y1} ${s.x2} ${s.y2} ${s.x} ${s.y}`),t={x:s.x,y:s.y};break;case"s":case"S":n.push(`${s.type} ${s.x2} ${s.y2} ${s.x} ${s.y}`),t={x:s.x,y:s.y};break;case"q":case"Q":n.push(`${s.type} ${s.x1} ${s.y1} ${s.x} ${s.y}`),t={x:s.x,y:s.y};break;case"t":case"T":n.push(`${s.type} ${s.x} ${s.y}`),t={x:s.x,y:s.y};break;case"a":case"A":n.push(`${s.type} ${s.rx} ${s.ry} ${s.angle} ${s.largeArcFlag} ${s.sweepFlag} ${s.x} ${s.y}`),t={x:s.x,y:s.y};break;case"z":case"Z":n.push(s.type),e&&(t={x:e.x,y:e.y});break}}return n.join(" ")}const Ae=/[a-df-z][^a-df-z]*/gi;function It(i){const e=[],t=i.match(Ae);if(!t)return e;for(let n=0,r=t.length;n<r;n++){const o=t[n],s=o.charAt(0),c=o.slice(1).trim();let h;switch(s){case"m":case"M":h=Z(c);for(let a=0,l=h.length;a<l;a+=2)a===0?e.push({type:s,x:h[a],y:h[a+1]}):e.push({type:s==="m"?"l":"L",x:h[a],y:h[a+1]});break;case"h":case"H":h=Z(c);for(let a=0,l=h.length;a<l;a++)e.push({type:s,x:h[a]});break;case"v":case"V":h=Z(c);for(let a=0,l=h.length;a<l;a++)e.push({type:s,y:h[a]});break;case"l":case"L":h=Z(c);for(let a=0,l=h.length;a<l;a+=2)e.push({type:s,x:h[a],y:h[a+1]});break;case"c":case"C":h=Z(c);for(let a=0,l=h.length;a<l;a+=6)e.push({type:s,x1:h[a],y1:h[a+1],x2:h[a+2],y2:h[a+3],x:h[a+4],y:h[a+5]});break;case"s":case"S":h=Z(c);for(let a=0,l=h.length;a<l;a+=4)e.push({type:s,x2:h[a],y2:h[a+1],x:h[a+2],y:h[a+3]});break;case"q":case"Q":h=Z(c);for(let a=0,l=h.length;a<l;a+=4)e.push({type:s,x1:h[a],y1:h[a+1],x:h[a+2],y:h[a+3]});break;case"t":case"T":h=Z(c);for(let a=0,l=h.length;a<l;a+=2)e.push({type:s,x:h[a],y:h[a+1]});break;case"a":case"A":h=Z(c,[3,4],7);for(let a=0,l=h.length;a<l;a+=7)e.push({type:s,rx:h[a],ry:h[a+1],angle:h[a+2],largeArcFlag:h[a+3],sweepFlag:h[a+4],x:h[a+5],y:h[a+6]});break;case"z":case"Z":e.push({type:s});break;default:console.warn(o)}}return e}function St(i,e,t,n,r){const o=(n-e)*.5,s=(r-t)*.5,c=i*i,h=i*c;return(2*t-2*n+o+s)*h+(-3*t+3*n-2*o-s)*c+o*i+t}function be(i,e){const t=1-i;return t*t*t*e}function ke(i,e){const t=1-i;return 3*t*t*i*e}function Ie(i,e){return 3*(1-i)*i*i*e}function Se(i,e){return i*i*i*e}function Et(i,e,t,n,r){return be(i,e)+ke(i,t)+Ie(i,n)+Se(i,r)}function Ee(i,e,t=2){const n=e&&e.length,r=n?e[0]*t:i.length;let o=Bt(i,0,r,t,!0);const s=[];if(!o||o.next===o.prev)return s;let c,h,a;if(n&&(o=De(i,e,o,t)),i.length>80*t){c=1/0,h=1/0;let l=-1/0,f=-1/0;for(let y=t;y<r;y+=t){const x=i[y],u=i[y+1];x<c&&(c=x),u<h&&(h=u),x>l&&(l=x),u>f&&(f=u)}a=Math.max(l-c,f-h),a=a!==0?32767/a:0}return ot(o,s,t,c,h,a,0),s}function Bt(i,e,t,n,r){let o;if(r===Ve(i,e,t,n)>0)for(let s=e;s<t;s+=n)o=Wt(s/n|0,i[s],i[s+1],o);else for(let s=t-n;s>=e;s-=n)o=Wt(s/n|0,i[s],i[s+1],o);return o&&it(o,o.next)&&(at(o),o=o.next),o}function H(i,e){if(!i)return i;e||(e=i);let t=i,n;do if(n=!1,!t.steiner&&(it(t,t.next)||N(t.prev,t,t.next)===0)){if(at(t),t=e=t.prev,t===t.next)break;n=!0}else t=t.next;while(n||t!==e);return e}function ot(i,e,t,n,r,o,s){if(!i)return;!s&&o&&ze(i,n,r,o);let c=i;for(;i.prev!==i.next;){const h=i.prev,a=i.next;if(o?$e(i,n,r,o):Le(i)){e.push(h.i,i.i,a.i),at(i),i=a.next,c=a.next;continue}if(i=a,i===c){s?s===1?(i=Ne(H(i),e),ot(i,e,t,n,r,o,2)):s===2&&Fe(i,e,t,n,r,o):ot(H(i),e,t,n,r,o,1);break}}}function Le(i){const e=i.prev,t=i,n=i.next;if(N(e,t,n)>=0)return!1;const r=e.x,o=t.x,s=n.x,c=e.y,h=t.y,a=n.y,l=Math.min(r,o,s),f=Math.min(c,h,a),y=Math.max(r,o,s),x=Math.max(c,h,a);let u=n.next;for(;u!==e;){if(u.x>=l&&u.x<=y&&u.y>=f&&u.y<=x&&ct(r,c,o,h,s,a,u.x,u.y)&&N(u.prev,u,u.next)>=0)return!1;u=u.next}return!0}function $e(i,e,t,n){const r=i.prev,o=i,s=i.next;if(N(r,o,s)>=0)return!1;const c=r.x,h=o.x,a=s.x,l=r.y,f=o.y,y=s.y,x=Math.min(c,h,a),u=Math.min(l,f,y),g=Math.max(c,h,a),M=Math.max(l,f,y),T=Lt(x,u,e,t,n),I=Lt(g,M,e,t,n);let P=i.prevZ,w=i.nextZ;for(;P&&P.z>=T&&w&&w.z<=I;){if(P.x>=x&&P.x<=g&&P.y>=u&&P.y<=M&&P!==r&&P!==s&&ct(c,l,h,f,a,y,P.x,P.y)&&N(P.prev,P,P.next)>=0||(P=P.prevZ,w.x>=x&&w.x<=g&&w.y>=u&&w.y<=M&&w!==r&&w!==s&&ct(c,l,h,f,a,y,w.x,w.y)&&N(w.prev,w,w.next)>=0))return!1;w=w.nextZ}for(;P&&P.z>=T;){if(P.x>=x&&P.x<=g&&P.y>=u&&P.y<=M&&P!==r&&P!==s&&ct(c,l,h,f,a,y,P.x,P.y)&&N(P.prev,P,P.next)>=0)return!1;P=P.prevZ}for(;w&&w.z<=I;){if(w.x>=x&&w.x<=g&&w.y>=u&&w.y<=M&&w!==r&&w!==s&&ct(c,l,h,f,a,y,w.x,w.y)&&N(w.prev,w,w.next)>=0)return!1;w=w.nextZ}return!0}function Ne(i,e){let t=i;do{const n=t.prev,r=t.next.next;!it(n,r)&&Vt(n,t,t.next,r)&&ht(n,r)&&ht(r,n)&&(e.push(n.i,t.i,r.i),at(t),at(t.next),t=i=r),t=t.next}while(t!==i);return H(t)}function Fe(i,e,t,n,r,o){let s=i;do{let c=s.next.next;for(;c!==s.prev;){if(s.i!==c.i&&Ge(s,c)){let h=Xt(s,c);s=H(s,s.next),h=H(h,h.next),ot(s,e,t,n,r,o,0),ot(h,e,t,n,r,o,0);return}c=c.next}s=s.next}while(s!==i)}function De(i,e,t,n){const r=[];for(let o=0,s=e.length;o<s;o++){const c=e[o]*n,h=o<s-1?e[o+1]*n:i.length,a=Bt(i,c,h,n,!1);a===a.next&&(a.steiner=!0),r.push(je(a))}r.sort(_e);for(let o=0;o<r.length;o++)t=qe(r[o],t);return t}function _e(i,e){let t=i.x-e.x;if(t===0&&(t=i.y-e.y,t===0)){const n=(i.next.y-i.y)/(i.next.x-i.x),r=(e.next.y-e.y)/(e.next.x-e.x);t=n-r}return t}function qe(i,e){const t=Oe(i,e);if(!t)return e;const n=Xt(t,i);return H(n,n.next),H(t,t.next)}function Oe(i,e){let t=e;const n=i.x,r=i.y;let o=-1/0,s;if(it(i,t))return t;do{if(it(i,t.next))return t.next;if(r<=t.y&&r>=t.next.y&&t.next.y!==t.y){const f=t.x+(r-t.y)*(t.next.x-t.x)/(t.next.y-t.y);if(f<=n&&f>o&&(o=f,s=t.x<t.next.x?t:t.next,f===n))return s}t=t.next}while(t!==e);if(!s)return null;const c=s,h=s.x,a=s.y;let l=1/0;t=s;do{if(n>=t.x&&t.x>=h&&n!==t.x&&Ut(r<a?n:o,r,h,a,r<a?o:n,r,t.x,t.y)){const f=Math.abs(r-t.y)/(n-t.x);ht(t,i)&&(f<l||f===l&&(t.x>s.x||t.x===s.x&&Re(s,t)))&&(s=t,l=f)}t=t.next}while(t!==c);return s}function Re(i,e){return N(i.prev,i,e.prev)<0&&N(e.next,i,i.next)<0}function ze(i,e,t,n){let r=i;do r.z===0&&(r.z=Lt(r.x,r.y,e,t,n)),r.prevZ=r.prev,r.nextZ=r.next,r=r.next;while(r!==i);r.prevZ.nextZ=null,r.prevZ=null,Ze(r)}function Ze(i){let e,t=1;do{let n=i,r;i=null;let o=null;for(e=0;n;){e++;let s=n,c=0;for(let a=0;a<t&&(c++,s=s.nextZ,!!s);a++);let h=t;for(;c>0||h>0&&s;)c!==0&&(h===0||!s||n.z<=s.z)?(r=n,n=n.nextZ,c--):(r=s,s=s.nextZ,h--),o?o.nextZ=r:i=r,r.prevZ=o,o=r;n=s}o.nextZ=null,t*=2}while(e>1);return i}function Lt(i,e,t,n,r){return i=(i-t)*r|0,e=(e-n)*r|0,i=(i|i<<8)&16711935,i=(i|i<<4)&252645135,i=(i|i<<2)&858993459,i=(i|i<<1)&1431655765,e=(e|e<<8)&16711935,e=(e|e<<4)&252645135,e=(e|e<<2)&858993459,e=(e|e<<1)&1431655765,i|e<<1}function je(i){let e=i,t=i;do(e.x<t.x||e.x===t.x&&e.y<t.y)&&(t=e),e=e.next;while(e!==i);return t}function Ut(i,e,t,n,r,o,s,c){return(r-s)*(e-c)>=(i-s)*(o-c)&&(i-s)*(n-c)>=(t-s)*(e-c)&&(t-s)*(o-c)>=(r-s)*(n-c)}function ct(i,e,t,n,r,o,s,c){return!(i===s&&e===c)&&Ut(i,e,t,n,r,o,s,c)}function Ge(i,e){return i.next.i!==e.i&&i.prev.i!==e.i&&!Be(i,e)&&(ht(i,e)&&ht(e,i)&&Ue(i,e)&&(N(i.prev,i,e.prev)||N(i,e.prev,e))||it(i,e)&&N(i.prev,i,i.next)>0&&N(e.prev,e,e.next)>0)}function N(i,e,t){return(e.y-i.y)*(t.x-e.x)-(e.x-i.x)*(t.y-e.y)}function it(i,e){return i.x===e.x&&i.y===e.y}function Vt(i,e,t,n){const r=gt(N(i,e,t)),o=gt(N(i,e,n)),s=gt(N(t,n,i)),c=gt(N(t,n,e));return!!(r!==o&&s!==c||r===0&&pt(i,t,e)||o===0&&pt(i,n,e)||s===0&&pt(t,i,n)||c===0&&pt(t,e,n))}function pt(i,e,t){return e.x<=Math.max(i.x,t.x)&&e.x>=Math.min(i.x,t.x)&&e.y<=Math.max(i.y,t.y)&&e.y>=Math.min(i.y,t.y)}function gt(i){return i>0?1:i<0?-1:0}function Be(i,e){let t=i;do{if(t.i!==i.i&&t.next.i!==i.i&&t.i!==e.i&&t.next.i!==e.i&&Vt(t,t.next,i,e))return!0;t=t.next}while(t!==i);return!1}function ht(i,e){return N(i.prev,i,i.next)<0?N(i,e,i.next)>=0&&N(i,i.prev,e)>=0:N(i,e,i.prev)<0||N(i,i.next,e)<0}function Ue(i,e){let t=i,n=!1;const r=(i.x+e.x)/2,o=(i.y+e.y)/2;do t.y>o!=t.next.y>o&&t.next.y!==t.y&&r<(t.next.x-t.x)*(o-t.y)/(t.next.y-t.y)+t.x&&(n=!n),t=t.next;while(t!==i);return n}function Xt(i,e){const t=$t(i.i,i.x,i.y),n=$t(e.i,e.x,e.y),r=i.next,o=e.prev;return i.next=e,e.prev=i,t.next=r,r.prev=t,n.next=t,t.prev=n,o.next=n,n.prev=o,n}function Wt(i,e,t,n){const r=$t(i,e,t);return n?(r.next=n.next,r.prev=n,n.next.prev=r,n.next=r):(r.prev=r,r.next=r),r}function at(i){i.next.prev=i.prev,i.prev.next=i.next,i.prevZ&&(i.prevZ.nextZ=i.nextZ),i.nextZ&&(i.nextZ.prevZ=i.prevZ)}function $t(i,e,t){return{i,x:e,y:t,prev:null,next:null,z:0,prevZ:null,nextZ:null,steiner:!1}}function Ve(i,e,t,n){let r=0;for(let o=e,s=t-n;o<t;o+=n)r+=(i[s]-i[o])*(i[o+1]+i[s+1]),s=o;return r}function Nt(i,e={}){let{vertices:t=[],indices:n=[],holes:r=[],verticesStride:o=2,verticesOffset:s=t.length/o,indicesOffset:c=n.length}=e;const h=Ee(i,r,2);if(h){for(let l=0;l<h.length;l+=3)n[c++]=h[l]+s,n[c++]=h[l+1]+s,n[c++]=h[l+2]+s;let a=s*o;for(let l=0;l<i.length;l+=2)t[a]=i[l],t[a+1]=i[l+1],a+=o}return{vertices:t,indices:n}}const Xe=8,dt=11920929e-14,We=1;function Ht(i,e,t,n,r,o,s,c,h=.5,a=[]){const f=Math.min(.99,Math.max(0,h));let y=(We-f)/1;return y*=y,Ft(i,e,t,n,r,o,s,c,a,y,0),a.push(s,c),a}function Ft(i,e,t,n,r,o,s,c,h,a,l){if(l>Xe)return;const f=(i+t)/2,y=(e+n)/2,x=(t+r)/2,u=(n+o)/2,g=(r+s)/2,M=(o+c)/2,T=(f+x)/2,I=(y+u)/2,P=(x+g)/2,w=(u+M)/2,E=(T+P)/2,S=(I+w)/2;if(l>0){let d=s-i,m=c-e;const _=Math.abs((t-s)*m-(n-c)*d),q=Math.abs((r-s)*m-(o-c)*d);if(_>dt&&q>dt){if((_+q)*(_+q)<=a*(d*d+m*m)){h.push(E,S);return}}else if(_>dt){if(_*_<=a*(d*d+m*m)){h.push(E,S);return}}else if(q>dt){if(q*q<=a*(d*d+m*m)){h.push(E,S);return}}else if(d=E-(i+s)/2,m=S-(e+c)/2,d*d+m*m<=a){h.push(E,S);return}}Ft(i,e,f,y,T,I,E,S,h,a,l+1),Ft(E,S,P,w,g,M,s,c,h,a,l+1)}const He=8,Qe=11920929e-14,Ye=1;function Qt(i,e,t,n,r,o,s=.5,c=[]){const a=Math.min(.99,Math.max(0,s));let l=(Ye-a)/1;return l*=l,Dt(c,i,e,t,n,r,o,l,0),c.push(r,o),c}function Dt(i,e,t,n,r,o,s,c,h){if(h>He)return;const a=(e+n)/2,l=(t+r)/2,f=(n+o)/2,y=(r+s)/2,x=(a+f)/2,u=(l+y)/2;let g=o-e,M=s-t;const T=Math.abs((n-o)*M-(r-s)*g);if(T>Qe){if(T*T<=c*(g*g+M*M)){i.push(x,u);return}}else if(g=x-(e+o)/2,M=u-(t+s)/2,g*g+M*M<=c){i.push(x,u);return}Dt(i,e,t,a,l,x,u,c,h+1),Dt(i,x,u,f,y,o,s,c,h+1)}function Je(i,e){const t=1-i;return t*t*e}function Ke(i,e){return 2*(1-i)*i*e}function tn(i,e){return i*i*e}function _t(i,e,t,n){return Je(i,e)+Ke(i,t)+tn(i,n)}const en=1e-4,Yt=1e-4;function Jt(i,e={}){const{vertices:t=[],indices:n=[],lineStyle:r={alignment:.5,cap:"butt",join:"miter",width:1,miterLimit:10},flipAlignment:o=!1,closed:s=!0}=e,c=en;if(i.length===0)return{vertices:t,indices:n};const h=r;let a=h.alignment;if(r.alignment!==.5){let $=nn(i);o&&($*=-1),a=(a-.5)*$+.5}const l={x:i[0],y:i[1]},f={x:i[i.length-2],y:i[i.length-1]},y=s,x=Math.abs(l.x-f.x)<c&&Math.abs(l.y-f.y)<c;if(y){i=i.slice(),x&&(i.pop(),i.pop(),f.x=i[i.length-2],f.y=i[i.length-1]);const $=(l.x+f.x)*.5,W=(f.y+l.y)*.5;i.unshift($,W),i.push($,W)}const u=t,g=i.length/2;let M=i.length;const T=u.length/2,I=h.width/2,P=I*I,w=h.miterLimit*h.miterLimit;let E=i[0],S=i[1],d=i[2],m=i[3],_=0,q=0,A=-(S-m),b=E-d,F=0,O=0,B=Math.sqrt(A*A+b*b);A/=B,b/=B,A*=I,b*=I;const Pe=a,C=(1-Pe)*2,k=Pe*2;y||(h.cap==="round"?M+=Q(E-A*(C-k)*.5,S-b*(C-k)*.5,E-A*C,S-b*C,E+A*k,S+b*k,u,!0)+2:h.cap==="square"&&(M+=Kt(E,S,A,b,C,k,!0,u))),u.push(E-A*C,S-b*C),u.push(E+A*k,S+b*k);for(let $=1;$<g-1;++$){E=i[($-1)*2],S=i[($-1)*2+1],d=i[$*2],m=i[$*2+1],_=i[($+1)*2],q=i[($+1)*2+1],A=-(S-m),b=E-d,B=Math.sqrt(A*A+b*b),A/=B,b/=B,A*=I,b*=I,F=-(m-q),O=d-_,B=Math.sqrt(F*F+O*O),F/=B,O/=B,F*=I,O*=I;const W=d-E,ut=S-m,ft=d-_,yt=q-m,we=W*ft+ut*yt,vt=ut*ft-yt*W,xt=vt<0;if(Math.abs(vt)<.001*Math.abs(we)){u.push(d-A*C,m-b*C),u.push(d+A*k,m+b*k),we>=0&&(h.join==="round"?M+=Q(d,m,d-A*C,m-b*C,d-F*C,m-O*C,u,!1)+4:M+=2,u.push(d-F*k,m-O*k),u.push(d+F*C,m+O*C));continue}const ve=(-A+E)*(-b+m)-(-A+d)*(-b+S),Te=(-F+_)*(-O+m)-(-F+d)*(-O+q),Tt=(W*Te-ft*ve)/vt,Ct=(yt*ve-ut*Te)/vt,zt=(Tt-d)*(Tt-d)+(Ct-m)*(Ct-m),J=d+(Tt-d)*C,K=m+(Ct-m)*C,tt=d-(Tt-d)*k,et=m-(Ct-m)*k,Ln=Math.min(W*W+ut*ut,ft*ft+yt*yt),Ce=xt?C:k,$n=Ln+Ce*Ce*P;zt<=$n?h.join==="bevel"||zt/P>w?(xt?(u.push(J,K),u.push(d+A*k,m+b*k),u.push(J,K),u.push(d+F*k,m+O*k)):(u.push(d-A*C,m-b*C),u.push(tt,et),u.push(d-F*C,m-O*C),u.push(tt,et)),M+=2):h.join==="round"?xt?(u.push(J,K),u.push(d+A*k,m+b*k),M+=Q(d,m,d+A*k,m+b*k,d+F*k,m+O*k,u,!0)+4,u.push(J,K),u.push(d+F*k,m+O*k)):(u.push(d-A*C,m-b*C),u.push(tt,et),M+=Q(d,m,d-A*C,m-b*C,d-F*C,m-O*C,u,!1)+4,u.push(d-F*C,m-O*C),u.push(tt,et)):(u.push(J,K),u.push(tt,et)):(u.push(d-A*C,m-b*C),u.push(d+A*k,m+b*k),h.join==="round"?xt?M+=Q(d,m,d+A*k,m+b*k,d+F*k,m+O*k,u,!0)+2:M+=Q(d,m,d-A*C,m-b*C,d-F*C,m-O*C,u,!1)+2:h.join==="miter"&&zt/P<=w&&(xt?(u.push(tt,et),u.push(tt,et)):(u.push(J,K),u.push(J,K)),M+=2),u.push(d-F*C,m-O*C),u.push(d+F*k,m+O*k),M+=2)}E=i[(g-2)*2],S=i[(g-2)*2+1],d=i[(g-1)*2],m=i[(g-1)*2+1],A=-(S-m),b=E-d,B=Math.sqrt(A*A+b*b),A/=B,b/=B,A*=I,b*=I,u.push(d-A*C,m-b*C),u.push(d+A*k,m+b*k),y||(h.cap==="round"?M+=Q(d-A*(C-k)*.5,m-b*(C-k)*.5,d-A*C,m-b*C,d+A*k,m+b*k,u,!1)+2:h.cap==="square"&&(M+=Kt(d,m,A,b,C,k,!1,u)));const En=Yt*Yt;for(let $=T;$<M+T-2;++$)E=u[$*2],S=u[$*2+1],d=u[($+1)*2],m=u[($+1)*2+1],_=u[($+2)*2],q=u[($+2)*2+1],!(Math.abs(E*(m-q)+d*(q-S)+_*(S-m))<En)&&n.push($,$+1,$+2);return{vertices:t,indices:n}}function nn(i){const e=i.length;if(e<6)return 1;let t=0;for(let n=0,r=i[e-2],o=i[e-1];n<e;n+=2){const s=i[n],c=i[n+1];t+=(s-r)*(c+o),r=s,o=c}return t<0?-1:1}function Kt(i,e,t,n,r,o,s,c){const h=i-t*r,a=e-n*r,l=i+t*o,f=e+n*o;let y,x;s?(y=n,x=-t):(y=-n,x=t);const u=h+y,g=a+x,M=l+y,T=f+x;return c.push(u,g),c.push(M,T),2}function Q(i,e,t,n,r,o,s,c){const h=t-i,a=n-e;let l=Math.atan2(h,a),f=Math.atan2(r-i,o-e);c&&l<f?l+=Math.PI*2:!c&&l>f&&(f+=Math.PI*2);let y=l;const x=f-l,u=Math.abs(x),g=Math.sqrt(h*h+a*a),M=(15*u*Math.sqrt(g)/Math.PI>>0)+1,T=x/M;if(y+=T,c){s.push(i,e),s.push(t,n);for(let I=1,P=y;I<M;I++,P+=T)s.push(i,e),s.push(i+Math.sin(P)*g,e+Math.cos(P)*g);s.push(i,e),s.push(r,o)}else{s.push(t,n),s.push(i,e);for(let I=1,P=y;I<M;I++,P+=T)s.push(i+Math.sin(P)*g,e+Math.cos(P)*g),s.push(i,e);s.push(r,o),s.push(i,e)}return M*2}class Y{constructor(){V(this,"arcLengthDivision",200);V(this,"_arcLengths")}getPointAt(e,t=new p){return this.getPoint(this.getUToTMapping(e),t)}isClockwise(){const e=this.getPoint(1),t=this.getPoint(.5),n=this.getPoint(1);return(t.x-e.x)*(n.y-t.y)-(t.y-e.y)*(n.x-t.x)<0}getControlPointRefs(){return[]}applyTransform(e){const t=typeof e=="function";return this.getControlPointRefs().forEach(n=>{t?e(n):n.applyMatrix3(e)}),this}getUnevenPointArray(e=5,t=[]){const n=new p;for(let r=0,o=Math.max(1,e)-1;r<=o;r++)this.getPoint(r/o,n),t.push(n.x,n.y);return t}getSpacedPointArray(e=5,t=[]){const n=new p;for(let r=0,o=Math.max(1,e)-1;r<=o;r++)this.getPointAt(r/o,n),t.push(n.x,n.y);return t}getAdaptivePointArray(e=[]){return this.getUnevenPointArray(5,e)}_pointArrayToPoint(e,t=[]){for(let n=0,r=e.length;n<r;n+=2){const o=e[n],s=e[n+1];t.push(new p(o,s))}return t}getSpacedPoints(e,t=[]){const n=this.getSpacedPointArray(e);return this._pointArrayToPoint(n,t),t}getUnevenPoints(e,t=[]){const n=this.getUnevenPointArray(e);return this._pointArrayToPoint(n,t),t}getAdaptivePoints(e=[]){const t=this.getAdaptivePointArray();return this._pointArrayToPoint(t,e),e}getPoints(e,t=[]){let n;return e?n=this.getUnevenPointArray(e):n=this.getAdaptivePointArray(),this._pointArrayToPoint(n,t),t}getLength(){const e=this.getLengths();return e[e.length-1]}getLengths(){return(!this._arcLengths||this._arcLengths.length!==this.arcLengthDivision+1)&&this.updateLengths(),this._arcLengths}updateLengths(){const e=this.arcLengthDivision,t=[0];for(let n=0,r=this.getPoint(0),o=1;o<=e;o++){const s=this.getPoint(o/e);n+=s.distanceTo(r),t.push(n),r=s}this._arcLengths=t}getUToTMapping(e,t){const n=this.getLengths(),r=n.length,o=t??e*n[r-1];if(r<2)return o/n[0];let s=0,c=0,h=r-1,a;for(;c<=h;)if(s=Math.floor(c+(h-c)/2),a=n[s]-o,a<0)c=s+1;else if(a>0)h=s-1;else{h=s;break}if(s=h,n[s]===o)return s/(r-1);const l=n[s],y=n[s+1]-l,x=(o-l)/y;return(s+x)/(r-1)}getTangent(e,t=new p){const r=Math.max(0,e-1e-4),o=Math.min(1,e+1e-4);return t.copy(this.getPoint(o).sub(this.getPoint(r)).normalize())}getTangentAt(e,t){return this.getTangent(this.getUToTMapping(e),t)}getNormal(e,t=new p){return this.getTangent(e,t),t.set(-t.y,t.x).normalize()}getNormalAt(e,t){return this.getNormal(this.getUToTMapping(e),t)}getTForPoint(e,t=.001){let n=0,r=1,o=(n+r)/2;for(;r-n>t;){o=(n+r)/2;const s=this.getPoint(o);if(s.distanceTo(e)<t)return o;s.x<e.x?n=o:r=o}return o}getMinMax(e=p.MAX,t=p.MIN){const n=this.getPoints();for(let r=0,o=n.length;r<o;r++){const s=n[r];e.min(s),t.max(s)}return{min:e.finite(),max:t.finite()}}getBoundingBox(){const{min:e,max:t}=this.getMinMax();return new X(e.x,e.y,t.x-e.x,t.y-e.y)}fillTriangulate(e){return Nt(this.getAdaptivePointArray(),e)}strokeTriangulate(e){return Jt(this.getAdaptivePointArray(),e)}toTriangulatedSVGString(e=this.fillTriangulate(),t=0){const{vertices:n,indices:r}=e,o={x:-t,y:-t},s={x:t,y:t},c=l=>{const f=n[l*2],y=n[l*2+1];return o.x=Math.min(o.x,f+t),s.x=Math.max(s.x,f+t),o.y=Math.min(o.y,y+t),s.y=Math.max(s.y,y+t),[f,y]};let h="";for(let l=0,f=r.length;l<f;l+=3){const y=c(r[l]),x=c(r[l+1]),u=c(r[l+2]);h+=`<polygon points="${y.join(",")} ${x.join(",")} ${u.join(",")}" fill="none" stroke="black" stroke-width="0.5" stroke-linecap="round" stroke-linejoin="round" />`}const a=[o.x,o.y,s.x-o.x,s.y-o.y];return`<svg width="${a[2]}" height="${a[3]}" viewBox="${a.join(" ")}" xmlns="http://www.w3.org/2000/svg">${h}</svg>`}toTriangulatedSVG(e,t){return new DOMParser().parseFromString(this.toTriangulatedSVGString(e,t),"image/svg+xml").documentElement}toCommands(){const e=[],t=this.getPoints();for(let n=0,r=t.length;n<r;n++){const o=t[n];n===0?e.push({type:"M",x:o.x,y:o.y}):e.push({type:"L",x:o.x,y:o.y})}return e}toData(){return Gt(this.toCommands())}drawTo(e){return this.toCommands().forEach(t=>{switch(t.type){case"M":e.moveTo(t.x,t.y);break;case"L":e.lineTo(t.x,t.y);break}}),this}copy(e){return this.arcLengthDivision=e.arcLengthDivision,this}clone(){return new this.constructor().copy(this)}}const sn=new z,te=new z,ee=new z,mt=new p;class qt extends Y{constructor(e=new p,t=new p,n=new p,r=0,o=0,s=Math.PI*2,c=!1){super(),this._center=e,this._radius=t,this._diff=n,this.rotate=r,this.startAngle=o,this.endAngle=s,this.clockwise=c}get cx(){return this._center.x}set cx(e){this._center.x=e}get cy(){return this._center.y}set cy(e){this._center.y=e}get rx(){return this._radius.x}set rx(e){this._radius.x=e}get ry(){return this._radius.y}set ry(e){this._radius.y=e}get dx(){return this._diff.x}set dx(e){this._diff.x=e}get dy(){return this._diff.y}set dy(e){this._diff.y=e}isClockwise(){return this.clockwise}_getDeltaAngle(){const e=Math.PI*2;let t=this.endAngle-this.startAngle;const n=Math.abs(t)<Number.EPSILON;return t=(t%e+e)%e,n?t=0:this.clockwise||(t=t===0?-e:t-e),t}getPoint(e,t=new p){const n=this._getDeltaAngle(),r=this.startAngle+e*n;let o=this.cx+this.rx*Math.cos(r),s=this.cy+this.ry*Math.sin(r);if(this.rotate!==0){const c=Math.cos(this.rotate),h=Math.sin(this.rotate),a=o-this.cx,l=s-this.cy;o=a*c-l*h+this.cx,s=a*h+l*c+this.cy}return t.set(o,s)}toCommands(){const{cx:e,cy:t,rx:n,ry:r,startAngle:o,endAngle:s,clockwise:c,rotate:h}=this,a=e+n*Math.cos(o)*Math.cos(h)-r*Math.sin(o)*Math.sin(h),l=t+n*Math.cos(o)*Math.sin(h)+r*Math.sin(o)*Math.cos(h),f=Math.abs(o-s),y=f>Math.PI?1:0,x=c?1:0,u=h*180/Math.PI;if(f>=2*Math.PI){const g=o+Math.PI,M=e+n*Math.cos(g)*Math.cos(h)-r*Math.sin(g)*Math.sin(h),T=t+n*Math.cos(g)*Math.sin(h)+r*Math.sin(g)*Math.cos(h);return[{type:"M",x:a,y:l},{type:"A",rx:n,ry:r,angle:u,largeArcFlag:0,sweepFlag:x,x:M,y:T},{type:"A",rx:n,ry:r,angle:u,largeArcFlag:0,sweepFlag:x,x:a,y:l}]}else{const g=e+n*Math.cos(s)*Math.cos(h)-r*Math.sin(s)*Math.sin(h),M=t+n*Math.cos(s)*Math.sin(h)+r*Math.sin(s)*Math.cos(h);return[{type:"M",x:a,y:l},{type:"A",rx:n,ry:r,angle:u,largeArcFlag:y,sweepFlag:x,x:g,y:M}]}}drawTo(e){const{cx:t,cy:n,rx:r,ry:o,rotate:s,startAngle:c,endAngle:h,clockwise:a}=this;return e.ellipse(t,n,r,o,s,c,h,!a),this}applyTransform(e){return mt.set(this.cx,this.cy),mt.applyMatrix3(e),this.cx=mt.x,this.cy=mt.y,cn(e)?rn(this,e):on(this,e),this}getControlPointRefs(){return[this._center]}getAdaptivePointArray(e=[]){const{cx:t,cy:n,rx:r,ry:o,dx:s,dy:c}=this;if(!(r>=0&&o>=0&&s>=0&&c>=0))return e;const h=Math.ceil(2.3*Math.sqrt(r+o)),a=t,l=n,f=h*8+(s?4:0)+(c?4:0);if(f===0)return e;if(h===0)return e[0]=e[6]=a+s,e[1]=e[3]=l+c,e[2]=e[4]=a-s,e[5]=e[7]=l-c,e;let y=0,x=h*4+(s?2:0)+2,u=x,g=f,M=s+r,T=c,I=a+M,P=a-M,w=l+T;if(e[y++]=I,e[y++]=w,e[--x]=w,e[--x]=P,c){const S=l-T;e[u++]=P,e[u++]=S,e[--g]=S,e[--g]=I}for(let S=1;S<h;S++){const d=Math.PI/2*(S/h),m=s+Math.cos(d)*r,_=c+Math.sin(d)*o,q=a+m,A=a-m,b=l+_,F=l-_;e[y++]=q,e[y++]=b,e[--x]=b,e[--x]=A,e[u++]=A,e[u++]=F,e[--g]=F,e[--g]=q}M=s,T=c+o,I=a+M,P=a-M,w=l+T;const E=l-T;return e[y++]=I,e[y++]=w,e[--g]=E,e[--g]=I,s&&(e[y++]=P,e[y++]=w,e[--g]=E,e[--g]=P),e}fillTriangulate(e={}){let{vertices:t=[],indices:n=[],verticesStride:r=2,verticesOffset:o=t.length/r,indicesOffset:s=n.length}=e;const c=this.getAdaptivePointArray();if(c.length===0)return{vertices:t,indices:n};let h=0,a=0;for(let y=0;y<c.length;y+=2)h+=c[y],a+=c[y+1];h/=c.length/2,a/=c.length/2;let l=o;t[l*r]=h,t[l*r+1]=a;const f=l++;for(let y=0;y<c.length;y+=2)t[l*r]=c[y],t[l*r+1]=c[y+1],y>0&&(n[s++]=l,n[s++]=f,n[s++]=l-1),l++;return n[s++]=f+1,n[s++]=f,n[s++]=l-1,{vertices:t,indices:n}}getMinMax(e=p.MAX,t=p.MIN){const{cx:n,cy:r,rx:o,ry:s,rotate:c}=this,h=Math.cos(c),a=Math.sin(c),l=Math.sqrt(o*o*h*h+s*s*a*a),f=Math.sqrt(o*o*a*a+s*s*h*h);return e.x=Math.min(e.x,n-l),e.y=Math.min(e.y,r-f),t.x=Math.max(t.x,n+l),t.y=Math.max(t.y,r+f),{min:e.finite(),max:t.finite()}}copy(e){return super.copy(e),this.cx=e.cx,this.cy=e.cy,this.rx=e.rx,this.ry=e.ry,this.dx=e.dx,this.dy=e.dy,this.startAngle=e.startAngle,this.endAngle=e.endAngle,this.clockwise=e.clockwise,this.rotate=e.rotate,this}}function rn(i,e){const t=i.rx,n=i.ry,r=Math.cos(i.rotate),o=Math.sin(i.rotate),s=new p(t*r,t*o),c=new p(-n*o,n*r),h=s.applyMatrix3(e),a=c.applyMatrix3(e),l=sn.set(h.x,a.x,0,h.y,a.y,0,0,0,1),f=te.copy(l).invert(),u=ee.copy(f).transpose().multiply(f).elements,g=hn(u[0],u[1],u[4]),M=Math.sqrt(g.rt1),T=Math.sqrt(g.rt2);if(i.rx=1/M,i.ry=1/T,i.rotate=Math.atan2(g.sn,g.cs),!((i.endAngle-i.startAngle)%(2*Math.PI)<Number.EPSILON)){const P=te.set(M,0,0,0,T,0,0,0,1),w=ee.set(g.cs,g.sn,0,-g.sn,g.cs,0,0,0,1),E=P.multiply(w).multiply(l),S=d=>{const{x:m,y:_}=new p(Math.cos(d),Math.sin(d)).applyMatrix3(E);return Math.atan2(_,m)};i.startAngle=S(i.startAngle),i.endAngle=S(i.endAngle),ne(e)&&(i.clockwise=!i.clockwise)}}function on(i,e){const t=se(e),n=ie(e);i.rx*=t,i.ry*=n;const r=t>Number.EPSILON?Math.atan2(e.elements[1],e.elements[0]):Math.atan2(-e.elements[3],e.elements[4]);i.rotate+=r,ne(e)&&(i.startAngle*=-1,i.endAngle*=-1,i.clockwise=!i.clockwise)}function ne(i){const e=i.elements;return e[0]*e[4]-e[1]*e[3]<0}function cn(i){const e=i.elements,t=e[0]*e[3]+e[1]*e[4];if(t===0)return!1;const n=se(i),r=ie(i);return Math.abs(t/(n*r))>Number.EPSILON}function se(i){const e=i.elements;return Math.sqrt(e[0]*e[0]+e[1]*e[1])}function ie(i){const e=i.elements;return Math.sqrt(e[3]*e[3]+e[4]*e[4])}function hn(i,e,t){let n,r,o,s,c;const h=i+t,a=i-t,l=Math.sqrt(a*a+4*e*e);return h>0?(n=.5*(h+l),c=1/n,r=i*c*t-e*c*e):h<0?r=.5*(h-l):(n=.5*l,r=-.5*l),a>0?o=a+l:o=a-l,Math.abs(o)>2*Math.abs(e)?(c=-2*e/o,s=1/Math.sqrt(1+c*c),o=c*s):Math.abs(e)===0?(o=1,s=0):(c=-.5*o/e,o=1/Math.sqrt(1+c*c),s=c*o),a>0&&(c=o,o=-s,s=c),{rt1:n,rt2:r,cs:o,sn:s}}class re extends qt{constructor(e=0,t=0,n=1,r=0,o=Math.PI*2,s=!1){super(new p(e,t),new p(n,n),new p,0,r,o,s)}drawTo(e){const{cx:t,cy:n,rx:r,startAngle:o,endAngle:s,clockwise:c}=this;return e.arc(t,n,r,o,s,!c),this}getAdaptivePointArray(e=[]){const{cx:t,cy:n,rx:r,startAngle:o,endAngle:s,clockwise:c}=this;let h=Math.abs(o-s);(!c&&o>s||c&&s>o)&&(h=2*Math.PI-h);let a=Math.max(6,Math.floor(6*r**(1/3)*(h/Math.PI)));a=Math.max(a,3);let l=h/a,f=o;l*=c?1:-1;for(let y=0;y<a+1;y++){const x=Math.cos(f),u=Math.sin(f),g=t+x*r,M=n+u*r;e.push(g,M),f+=l}return e}}class j extends Y{constructor(e=new p,t=new p){super(),this.p1=e,this.p2=t}static from(e,t,n,r){return new j(new p(e,t),new p(n,r))}getPoint(e,t=new p){return e===1?t.copy(this.p2):t.copy(this.p2).sub(this.p1).scale(e).add(this.p1),t}getPointAt(e,t=new p){return this.getPoint(e,t)}getTangent(e,t=new p){return t.subVectors(this.p2,this.p1).normalize()}getTangentAt(e,t=new p){return this.getTangent(e,t)}getControlPointRefs(){return[this.p1,this.p2]}getAdaptivePointArray(e=[]){return e.push(this.p1.x,this.p1.y,this.p2.x,this.p2.y),e}getMinMax(e=p.MAX,t=p.MIN){const{p1:n,p2:r}=this;return e.x=Math.min(e.x,n.x,r.x),e.y=Math.min(e.y,n.y,r.y),t.x=Math.max(t.x,n.x,r.x),t.y=Math.max(t.y,n.y,r.y),{min:e.finite(),max:t.finite()}}toCommands(){const{p1:e,p2:t}=this;return[{type:"M",x:e.x,y:e.y},{type:"L",x:t.x,y:t.y}]}fillTriangulate(e={}){let{vertices:t=[],indices:n=[],verticesStride:r=2,verticesOffset:o=t.length/r,indicesOffset:s=n.length}=e;const c=this.p1.x,h=this.p1.y,a=this.p2.x-this.p1.x||1,l=this.p2.y-this.p2.y||1,f=[c,h,c+a,h,c+a,h+l,c,h+l];let y=0;o*=r,t[o+y]=f[0],t[o+y+1]=f[1],y+=r,t[o+y]=f[2],t[o+y+1]=f[3],y+=r,t[o+y]=f[6],t[o+y+1]=f[7],y+=r,t[o+y]=f[4],t[o+y+1]=f[5],y+=r;const x=o/r;return n[s++]=x,n[s++]=x+1,n[s++]=x+2,n[s++]=x+1,n[s++]=x+3,n[s++]=x+2,{vertices:t,indices:n}}drawTo(e){const{p1:t,p2:n}=this;return e.lineTo(t.x,t.y),e.lineTo(n.x,n.y),this}copy(e){return super.copy(e),this.p1.copy(e.p1),this.p2.copy(e.p2),this}}class rt extends Y{constructor(e=[]){super(),this.curves=e}getFlatCurves(){return this.curves.flatMap(e=>e instanceof rt?e.getFlatCurves():e)}addCurve(e){return this.curves.push(e),this}getPoint(e,t=new p){const n=e*this.getLength(),r=this.getLengths();let o=0;for(;o<r.length;){if(r[o]>=n){const s=r[o]-n,c=this.curves[o],h=c.getLength();return c.getPointAt(h===0?0:1-s/h,t)}o++}return t}updateLengths(){const e=[];for(let t=0,n=0,r=this.curves.length;t<r;t++)n+=this.curves[t].getLength(),e.push(n);this._arcLengths=e}getControlPointRefs(){return this.curves.flatMap(e=>e.getControlPointRefs())}_removeNextPointIfEqualPrevPoint(e,t){return e[t-1]===e[t+1]&&e[t]===e[t+2]&&e.splice(t+1,2),e}getSpacedPointArray(e=5,t=[]){let n;return this.curves.forEach(r=>{r.getSpacedPointArray(e,t),n&&this._removeNextPointIfEqualPrevPoint(t,n),n=t.length-1}),t}getAdaptivePointArray(e=[]){let t;return this.curves.forEach(n=>{n.getAdaptivePointArray(e),t&&this._removeNextPointIfEqualPrevPoint(e,t),t=e.length-1}),e}fillTriangulate(e){const t=(e==null?void 0:e.indices)??[],n=(e==null?void 0:e.vertices)??[],r=[],o=()=>{if(r.length){const s=[];r.forEach(c=>{const h=c.p1.x,a=c.p1.y;(s[s.length-2]!==h||s[s.length-1]!==a)&&s.push(h,a),s.push(c.p2.x,c.p2.y)}),Nt(s,{...e,indices:t,vertices:n}),r.length=0}};return this.curves.forEach(s=>{s instanceof j?r.push(s):(o(),s.fillTriangulate({...e,indices:t,vertices:n}))}),o(),{indices:t,vertices:n}}applyTransform(e){return this.curves.forEach(t=>t.applyTransform(e)),this}getMinMax(e=p.MAX,t=p.MIN){return this.curves.forEach(n=>n.getMinMax(e,t)),{min:e.finite(),max:t.finite()}}getBoundingBox(){const{min:e,max:t}=this.getMinMax();return new X(e.x,e.y,t.x-e.x,t.y-e.y)}toCommands(){return this.curves.flatMap(e=>e.toCommands())}drawTo(e){var n;const t=(n=this.curves[0])==null?void 0:n.getPoint(0);return t&&e.moveTo(t.x,t.y),this.curves.forEach(r=>r.drawTo(e)),this}copy(e){return super.copy(e),this.curves=e.curves.map(t=>t.clone()),this}}class Mt extends Y{constructor(e=new p,t=new p,n=new p,r=new p){super(),this.p1=e,this.cp1=t,this.cp2=n,this.p2=r}static from(e,t,n,r,o,s,c,h){return new Mt(new p(e,t),new p(n,r),new p(o,s),new p(c,h))}getPoint(e,t=new p){const{p1:n,cp1:r,cp2:o,p2:s}=this;return t.set(Et(e,n.x,r.x,o.x,s.x),Et(e,n.y,r.y,o.y,s.y))}getAdaptivePointArray(e=[]){return Ht(this.p1.x,this.p1.y,this.cp1.x,this.cp1.y,this.cp2.x,this.cp2.y,this.p2.x,this.p2.y,.5,e)}getControlPointRefs(){return[this.p1,this.cp1,this.cp2,this.p2]}_solveQuadratic(e,t,n){const r=t*t-4*e*n;if(r<0)return[];const o=Math.sqrt(r),s=(-t+o)/(2*e),c=(-t-o)/(2*e);return[s,c].filter(h=>h>=0&&h<=1)}getMinMax(e=p.MAX,t=p.MIN){const{p1:n,cp1:r,cp2:o,p2:s}=this,c=this._solveQuadratic(3*(r.x-n.x),6*(o.x-r.x),3*(s.x-o.x)),h=this._solveQuadratic(3*(r.y-n.y),6*(o.y-r.y),3*(s.y-o.y)),a=[0,1,...c,...h];return((f,y)=>{for(const x of f)for(let u=0;u<=y;u++){const g=u/y-.5,M=Math.min(1,Math.max(0,x+g)),T=this.getPoint(M);e.x=Math.min(e.x,T.x),e.y=Math.min(e.y,T.y),t.x=Math.max(t.x,T.x),t.y=Math.max(t.y,T.y)}})(a,10),{min:e.finite(),max:t.finite()}}toCommands(){const{p1:e,cp1:t,cp2:n,p2:r}=this;return[{type:"M",x:e.x,y:e.y},{type:"C",x1:t.x,y1:t.y,x2:n.x,y2:n.y,x:r.x,y:r.y}]}drawTo(e){const{p1:t,cp1:n,cp2:r,p2:o}=this;return e.lineTo(t.x,t.y),e.bezierCurveTo(n.x,n.y,r.x,r.y,o.x,o.y),this}copy(e){return super.copy(e),this.p1.copy(e.p1),this.cp1.copy(e.cp1),this.cp2.copy(e.cp2),this.p2.copy(e.p2),this}}class oe extends qt{constructor(e=0,t=0,n=1,r=1,o=0,s=0,c=Math.PI*2,h=!1){super(new p(e,t),new p(n,r),new p,o,s,c,h)}drawTo(e){return e.ellipse(this.cx,this.cy,this.rx,this.ry,this.rotate,this.startAngle,this.endAngle,!this.clockwise),this}}class Ot extends rt{}class an extends Ot{constructor(e=0,t=0,n=1,r=3){super(),this.cx=e,this.cy=t,this.radius=n,this.sideCount=r,this.update()}update(){const{cx:e,cy:t,radius:n,sideCount:r}=this,o=[];for(let c=0;c<r;c++){const h=c*2*Math.PI/r-.5*Math.PI;o.push(new p(n*Math.cos(h),n*Math.sin(h)).add({x:e,y:t}))}const s=[];for(let c=0;c<r;c++)s.push(new j(o[c],o[(c+1)%r]));return this.curves=s,this}copy(e){return super.copy(e),this.cx=e.cx,this.cy=e.cy,this.radius=e.radius,this.sideCount=e.sideCount,this.update(),this}}class Pt extends Y{constructor(e=new p,t=new p,n=new p){super(),this.p1=e,this.cp=t,this.p2=n}static from(e,t,n,r,o,s){return new Pt(new p(e,t),new p(n,r),new p(o,s))}getPoint(e,t=new p){const{p1:n,cp:r,p2:o}=this;return t.set(_t(e,n.x,r.x,o.x),_t(e,n.y,r.y,o.y)),t}getControlPointRefs(){return[this.p1,this.cp,this.p2]}getAdaptivePointArray(e=[]){return Qt(this.p1.x,this.p1.y,this.cp.x,this.cp.y,this.p2.x,this.p2.y,.5,e)}getMinMax(e=p.MAX,t=p.MIN){const{p1:n,cp:r,p2:o}=this,s=.5*(n.x+r.x),c=.5*(n.y+r.y),h=.5*(n.x+o.x),a=.5*(n.y+o.y);return e.x=Math.min(e.x,n.x,o.x,s,h),e.y=Math.min(e.y,n.y,o.y,c,a),t.x=Math.max(t.x,n.x,o.x,s,h),t.y=Math.max(t.y,n.y,o.y,c,a),{min:e.finite(),max:t.finite()}}toCommands(){const{p1:e,cp:t,p2:n}=this;return[{type:"M",x:e.x,y:e.y},{type:"Q",x1:t.x,y1:t.y,x:n.x,y:n.y}]}drawTo(e){const{p1:t,cp:n,p2:r}=this;return e.lineTo(t.x,t.y),e.quadraticCurveTo(n.x,n.y,r.x,r.y),this}copy(e){return super.copy(e),this.p1.copy(e.p1),this.cp.copy(e.cp),this.p2.copy(e.p2),this}}class ce extends Ot{constructor(e=0,t=0,n=0,r=0){super(),this.x=e,this.y=t,this.width=n,this.height=r,this.update()}update(){const{x:e,y:t,width:n,height:r}=this,o=[new p(e,t),new p(e+n,t),new p(e+n,t+r),new p(e,t+r)];return this.curves=[new j(o[0],o[1]),new j(o[1],o[2]),new j(o[2],o[3]),new j(o[3],o[0])],this}drawTo(e){return e.rect(this.x,this.y,this.width,this.height),this}fillTriangulate(e={}){let{vertices:t=[],indices:n=[],verticesStride:r=2,verticesOffset:o=t.length/r,indicesOffset:s=n.length}=e;const{x:c,y:h,width:a,height:l}=this,f=[c,h,c+a,h,c+a,h+l,c,h+l];let y=0;o*=r,t[o+y]=f[0],t[o+y+1]=f[1],y+=r,t[o+y]=f[2],t[o+y+1]=f[3],y+=r,t[o+y]=f[6],t[o+y+1]=f[7],y+=r,t[o+y]=f[4],t[o+y+1]=f[5],y+=r;const x=o/r;return n[s++]=x,n[s++]=x+1,n[s++]=x+2,n[s++]=x+1,n[s++]=x+3,n[s++]=x+2,{vertices:t,indices:n}}copy(e){return super.copy(e),this.x=e.x,this.y=e.y,this.width=e.width,this.height=e.height,this.update(),this}}class he extends qt{constructor(e=0,t=0,n=1,r=1,o=1){super(),this.x=e,this.y=t,this.width=n,this.height=r,this.radius=o,this.update()}update(){const{x:e,y:t,width:n,height:r,radius:o}=this,s=n/2,c=r/2,h=e+s,a=t+c,l=Math.max(0,Math.min(o,Math.min(s,c))),f=l;return this._center=new p(h,a),this._radius=new p(l,f),this._diff=new p(s-l,c-f),this}drawTo(e){const{x:t,y:n,width:r,height:o,radius:s}=this;return e.roundRect(t,n,r,o,s),this}copy(e){return super.copy(e),this.x=e.x,this.y=e.y,this.width=e.width,this.height=e.height,this.radius=e.radius,this.update(),this}}class ae extends Y{constructor(e=[]){super(),this.points=e}getPoint(e,t=new p){const{points:n}=this,r=(n.length-1)*e,o=Math.floor(r),s=r-o,c=n[o===0?o:o-1],h=n[o],a=n[o>n.length-2?n.length-1:o+1],l=n[o>n.length-3?n.length-1:o+2];return t.set(St(s,c.x,h.x,a.x,l.x),St(s,c.y,h.y,a.y,l.y)),t}getControlPointRefs(){return this.points}copy(e){super.copy(e),this.points=[];for(let t=0,n=e.points.length;t<n;t++)this.points.push(e.points[t].clone());return this}}class lt extends rt{constructor(t){super();V(this,"startPoint");V(this,"currentPoint");V(this,"autoClose",!1);t&&this.addPoints(t)}addPoints(t){this.moveTo(t[0].x,t[0].y);for(let n=1,r=t.length;n<r;n++){const{x:o,y:s}=t[n];this.lineTo(o,s)}return this}addCommands(t){return kt(t,this),this}addData(t){return this.addCommands(It(t)),this}_closePointArray(t){return this.autoClose&&t.length>=4&&t[0]!==t[t.length-2]&&t[1]!==t[t.length-1]&&t.push(t[0],t[1]),t}getUnevenPointArray(t=40,n=[]){return this._closePointArray(super.getUnevenPointArray(t,n))}getSpacedPointArray(t=40,n=[]){return this._closePointArray(super.getSpacedPointArray(t,n))}getAdaptivePointArray(t=[]){return this._closePointArray(super.getAdaptivePointArray(t))}_setCurrentPoint(t){return this.currentPoint=new p(t.x,t.y),this.startPoint||(this.startPoint=this.currentPoint.clone()),this}_connetLineTo(t){if(this.curves.length>0){const n=t.getPoint(0);(!this.currentPoint||!n.equals(this.currentPoint))&&this.lineTo(n.x,n.y)}return this}closePath(){const t=this.startPoint;if(t){const n=this.currentPoint;n&&!t.equals(n)&&(this.curves.push(new j(n.clone(),t.clone())),n.copy(t)),this.startPoint=void 0}return this}moveTo(t,n){return this.currentPoint=new p(t,n),this.startPoint=this.currentPoint.clone(),this}lineTo(t,n){const r=this.currentPoint;return r!=null&&r.equals({x:t,y:n})||this.curves.push(j.from((r==null?void 0:r.x)??0,(r==null?void 0:r.y)??0,t,n)),this._setCurrentPoint({x:t,y:n}),this}bezierCurveTo(t,n,r,o,s,c){const h=this.currentPoint;return h!=null&&h.equals({x:s,y:c})||this.curves.push(Mt.from((h==null?void 0:h.x)??0,(h==null?void 0:h.y)??0,t,n,r,o,s,c)),this._setCurrentPoint({x:s,y:c}),this}quadraticCurveTo(t,n,r,o){const s=this.currentPoint;return s!=null&&s.equals({x:r,y:o})||this.curves.push(Pt.from((s==null?void 0:s.x)??0,(s==null?void 0:s.y)??0,t,n,r,o)),this._setCurrentPoint({x:r,y:o}),this}arc(t,n,r,o,s,c){const h=new re(t,n,r,o,s,!c);return this._connetLineTo(h),this.curves.push(h),this._setCurrentPoint(h.getPoint(1)),this}relativeArc(t,n,r,o,s,c){var h,a;return t+=((h=this.currentPoint)==null?void 0:h.x)??0,n+=((a=this.currentPoint)==null?void 0:a.y)??0,this.arc(t,n,r,o,s,c),this}arcTo(t,n,r,o,s){return console.warn("Method arcTo not supported yet"),this}ellipse(t,n,r,o,s,c,h,a=!0){const l=new oe(t,n,r,o,s,c,h,!a);return this._connetLineTo(l),this.curves.push(l),this._setCurrentPoint(l.getPoint(1)),this}relativeEllipse(t,n,r,o,s,c,h,a){var l,f;return t+=((l=this.currentPoint)==null?void 0:l.x)??0,n+=((f=this.currentPoint)==null?void 0:f.y)??0,this.ellipse(t,n,r,o,s,c,h,a),this}rect(t,n,r,o){const s=new ce(t,n,r,o);return this._connetLineTo(s),this.curves.push(s),this._setCurrentPoint({x:t,y:n}),this}roundRect(t,n,r,o,s){const c=new he(t,n,r,o,s);return this._connetLineTo(c),this.curves.push(c),this._setCurrentPoint({x:t,y:n}),this}splineThru(t){const n=this.currentPoint??new p;return this.curves.push(new ae([n].concat(t))),this._setCurrentPoint(t[t.length-1]),this}drawTo(t){var r;const n=(r=this.curves[0])==null?void 0:r.getPoint(0);return n&&t.moveTo(n.x,n.y),this.curves.forEach(o=>o.drawTo(t)),this.autoClose&&t.closePath(),this}copy(t){var n;return super.copy(t),this.autoClose=t.autoClose,this.currentPoint=(n=t.currentPoint)==null?void 0:n.clone(),this}}function ln(i){return i.replace(/[^a-z0-9]/gi,"-").replace(/\B([A-Z])/g,"-$1").toLowerCase()}function un(i,e,t,n){const r=e.clone().sub(i),o=n.clone().sub(t),s=t.clone().sub(i),c=r.cross(o);if(c===0)return new p((i.x+t.x)/2,(i.y+t.y)/2);const h=s.cross(o)/c;return Math.abs(h)>1?new p((i.x+t.x)/2,(i.y+t.y)/2):new p(i.x+h*r.x,i.y+h*r.y)}class G extends rt{constructor(t,n={}){super();V(this,"currentCurve",new lt);V(this,"style");this.curves.push(this.currentCurve),this.style=n,t&&(t instanceof G?this.addPath(t):Array.isArray(t)?this.addCommands(t):this.addData(t))}get startPoint(){return this.currentCurve.startPoint}get currentPoint(){return this.currentCurve.currentPoint}get strokeWidth(){return this.style.strokeWidth??((this.style.stroke??"none")==="none"?0:1)}addPath(t){const n=this.curves.findIndex(r=>r===this.currentCurve);return n>-1&&this.curves.splice(n,1),t instanceof G?this.curves.push(...t.curves.filter(r=>r.curves.length).map(r=>r.clone())):t.curves.length&&this.curves.push(t),this.curves.push(this.currentCurve),this}closePath(){const t=this.startPoint;return t&&(this.currentCurve.closePath(),this.currentCurve.curves.length&&(this.currentCurve=new lt().moveTo(t.x,t.y),this.curves.push(this.currentCurve))),this}moveTo(t,n){var r;return(r=this.currentCurve.currentPoint)!=null&&r.equals({x:t,y:n})||(this.currentCurve.curves.length&&(this.currentCurve=new lt,this.curves.push(this.currentCurve)),this.currentCurve.moveTo(t,n)),this}lineTo(t,n){return this.currentCurve.lineTo(t,n),this}bezierCurveTo(t,n,r,o,s,c){return this.currentCurve.bezierCurveTo(t,n,r,o,s,c),this}quadraticCurveTo(t,n,r,o){return this.currentCurve.quadraticCurveTo(t,n,r,o),this}arc(t,n,r,o,s,c){return this.currentCurve.arc(t,n,r,o,s,c),this}arcTo(t,n,r,o,s){return this.currentCurve.arcTo(t,n,r,o,s),this}ellipse(t,n,r,o,s,c,h,a){return this.currentCurve.ellipse(t,n,r,o,s,c,h,a),this}rect(t,n,r,o){return this.currentCurve.rect(t,n,r,o),this}roundRect(t,n,r,o,s){return this.currentCurve.roundRect(t,n,r,o,s),this}reset(){return this.currentCurve=new lt,this.curves=[this.currentCurve],this.style={},this}addCommands(t){return kt(t,this),this}addData(t){return this.addCommands(It(t)),this}splineThru(t){return this.currentCurve.splineThru(t),this}scale(t,n=t,r={x:0,y:0}){return this.getControlPointRefs().forEach(o=>{o.scale(t,n,r)}),this}skew(t,n=0,r={x:0,y:0}){return this.getControlPointRefs().forEach(o=>{o.skew(t,n,r)}),this}rotate(t,n={x:0,y:0}){return this.getControlPointRefs().forEach(r=>{r.rotate(t,n)}),this}bold(t){if(t===0)return this;const n=this.getFlatCurves(),r=[],o=[],s=[];n.forEach((h,a)=>{const l=h.getControlPointRefs(),f=h.isClockwise();s[a]=l,o[a]=f;const y=l[0],x=l[l.length-1]??y;r.push({start:f?x:y,end:f?y:x,index:a})});const c=[];return r.forEach((h,a)=>{c[a]=[],r.forEach((l,f)=>{var y;l.start&&h.end&&f!==a&&((y=l.start)!=null&&y.equals(h.end))&&c[a].push(l.index)})}),n.forEach((h,a)=>{const l=o[a];s[a].forEach(f=>{f.add(h.getNormal(h.getTForPoint(f)).scale(l?t:-t))})}),c.forEach((h,a)=>{const l=s[a];h.forEach(f=>{const y=s[f],x=un(l[l.length-1],l[l.length-2]??l[l.length-1],y[0],y[1]??y[0]);x&&(l[l.length-1].copy(x),y[0].copy(x))})}),this}getMinMax(t=p.MAX,n=p.MIN,r=!0){const o=this.strokeWidth;return this.curves.forEach(s=>{if(s.getMinMax(t,n),r&&o>1){const c=o/2,h=s.isClockwise(),a=[];for(let l=0;l<=1;l+=1/s.arcLengthDivision){const f=s.getPoint(l),y=s.getNormal(l),x=y.clone().scale(h?c:-c),u=y.clone().scale(h?-c:c);a.push(f.clone().add(x),f.clone().add(u),f.clone().add({x:c,y:0}),f.clone().add({x:-c,y:0}),f.clone().add({x:0,y:c}),f.clone().add({x:0,y:-c}),f.clone().add({x:c,y:c}),f.clone().add({x:-c,y:-c}))}t.min(...a),n.max(...a)}}),{min:t.finite(),max:n.finite()}}strokeTriangulate(t){const n=(t==null?void 0:t.indices)??[],r=(t==null?void 0:t.vertices)??[];return this.curves.forEach(o=>{o.strokeTriangulate({...t,indices:n,vertices:r})}),{indices:n,vertices:r}}getBoundingBox(t=!0){const{min:n,max:r}=this.getMinMax(void 0,void 0,t);return new X(n.x,n.y,r.x-n.x,r.y-n.y)}drawTo(t,n={}){n={...this.style,...n};const{fill:r="#000",stroke:o="none"}=n;return t.beginPath(),t.save(),At(t,n),this.curves.forEach(s=>{s.drawTo(t)}),r!=="none"&&t.fill(),o!=="none"&&t.stroke(),t.restore(),this}drawControlPointsTo(t,n={}){n={...this.style,...n};const{fill:r="#000",stroke:o="none"}=n;return t.beginPath(),t.save(),At(t,n),this.getControlPointRefs().forEach(s=>{R(t,s.x,s.y,{radius:4})}),r!=="none"&&t.fill(),o!=="none"&&t.stroke(),t.restore(),this}toCommands(){return this.curves.flatMap(t=>t.toCommands())}toData(){return this.curves.filter(t=>t.curves.length).map(t=>t.toData()).join(" ")}toSVGPathString(){const t={...this.style,fill:this.style.fill??"#000",stroke:this.style.stroke??"none"},n={};for(const o in t)t[o]!==void 0&&(n[ln(o)]=t[o]);Object.assign(n,{"stroke-width":`${this.strokeWidth}px`});let r="";for(const o in n)n[o]!==void 0&&(r+=`${o}:${n[o]};`);return`<path d="${this.toData()}" style="${r}"></path>`}copy(t){return super.copy(t),this.currentCurve=t.currentCurve.clone(),this.style={...t.style},this}}class le{constructor(e=[],t){this.paths=e,this.viewBox=t}getBoundingBox(e=!0){if(!this.paths.length)return;const t=p.MAX,n=p.MIN;return this.paths.forEach(r=>r.getMinMax(t,n,e)),new X(t.x,t.y,n.x-t.x,n.y-t.y)}toSVGString(){const{x:e,y:t,width:n,height:r}=this.getBoundingBox(),o=this.paths.map(s=>s.toSVGPathString()).join("");return`<svg viewBox="${e} ${t} ${n} ${r}" width="${n}px" height="${r}px" xmlns="http://www.w3.org/2000/svg">${o}</svg>`}toSVGUrl(){return`data:image/svg+xml;base64,${btoa(this.toSVGString())}`}toSVG(){return new DOMParser().parseFromString(this.toSVGString(),"image/svg+xml").documentElement}toCanvas(e={}){const{pixelRatio:t=2,...n}=e,{left:r,top:o,width:s,height:c}=this.getBoundingBox(),h=document.createElement("canvas");h.width=s*t,h.height=c*t,h.style.width=`${s}px`,h.style.height=`${c}px`;const a=h.getContext("2d");return a&&(a.scale(t,t),a.translate(-r,-o),this.paths.forEach(l=>{l.drawTo(a,n)})),h}}class fn{constructor(e,t,n=1,r=1){V(this,"controlPoints",[]);this.rows=e,this.cols=t,this.width=n,this.height=r;for(let o=0;o<e;o++){this.controlPoints[o]=[];for(let s=0;s<t;s++)this.controlPoints[o][s]={x:s/(t-1)*n,y:o/(e-1)*r}}}moveControlPoint(e,t,n,r){return this.controlPoints[e][t].x+=n,this.controlPoints[e][t].y+=r,this}}function ue(i){const e=[];return e[0]=(1-i)**3/6,e[1]=(3*i**3-6*i**2+4)/6,e[2]=(-3*i**3+3*i**2+3*i+1)/6,e[3]=i**3/6,e}function yn(i,e,t=e.width,n=e.height){const r=i.x/t*(e.cols-1),o=i.y/n*(e.rows-1),s=Math.floor(r),c=Math.floor(o),h=r-s,a=o-c,l=ue(h),f=ue(a);let y=0,x=0;for(let u=0;u<4;u++)for(let g=0;g<4;g++){const M=Math.min(Math.max(c-1+u,0),e.rows-1),T=Math.min(Math.max(s-1+g,0),e.cols-1),I=e.controlPoints[M][T],P=l[g]*f[u];y+=I.x*P,x+=I.y*P}i.set(y,x)}const fe="data:image/svg+xml;",ye=`${fe}base64,`,xe=`${fe}charset=utf8,`;function pe(i){if(typeof i=="string"){let e;i.startsWith(ye)?(i=i.substring(ye.length,i.length),e=atob(i)):i.startsWith(xe)?(i=i.substring(xe.length,i.length),e=decodeURIComponent(i)):e=i;const t=new DOMParser().parseFromString(e,"text/xml"),n=t.querySelector("parsererror");if(n)throw new Error(`${n.textContent??"parser error"}
2
+ ${e}`);return t.documentElement}else return i}const xn="px",pn=90,ge=["mm","cm","in","pt","pc","px"],de={mm:{mm:1,cm:.1,in:1/25.4,pt:72/25.4,pc:6/25.4,px:-1},cm:{mm:10,cm:1,in:1/2.54,pt:72/2.54,pc:6/2.54,px:-1},in:{mm:25.4,cm:2.54,in:1,pt:72,pc:6,px:-1},pt:{mm:25.4/72,cm:2.54/72,in:1/72,pt:1,pc:6/72,px:-1},pc:{mm:25.4/6,cm:2.54/6,in:1/6,pt:72/6,pc:1,px:-1},px:{px:1}};function L(i){let e="px";if(typeof i=="string"||i instanceof String)for(let n=0,r=ge.length;n<r;n++){const o=ge[n];if(i.endsWith(o)){e=o,i=i.substring(0,i.length-o.length);break}}let t;return t=de[e][xn],t<0&&(t=de[e].in*pn),t*Number.parseFloat(i)}const gn=new z,wt=new z,me=new z,Me=new z;function dn(i,e,t){if(!(i.hasAttribute("transform")||i.nodeName==="use"&&(i.hasAttribute("x")||i.hasAttribute("y"))))return null;const n=mn(i);return t.length>0&&n.premultiply(t[t.length-1]),e.copy(n),t.push(n),n}function mn(i){const e=new z,t=gn;if(i.nodeName==="use"&&(i.hasAttribute("x")||i.hasAttribute("y"))&&e.translate(L(i.getAttribute("x")),L(i.getAttribute("y"))),i.hasAttribute("transform")){const n=i.getAttribute("transform").split(")");for(let r=n.length-1;r>=0;r--){const o=n[r].trim();if(o==="")continue;const s=o.indexOf("("),c=o.length;if(s>0&&s<c){const h=o.slice(0,s),a=Z(o.slice(s+1));switch(t.identity(),h){case"translate":if(a.length>=1){const l=a[0];let f=0;a.length>=2&&(f=a[1]),t.translate(l,f)}break;case"rotate":if(a.length>=1){let l=0,f=0,y=0;l=a[0]*Math.PI/180,a.length>=3&&(f=a[1],y=a[2]),wt.makeTranslation(-f,-y),me.makeRotation(l),Me.multiplyMatrices(me,wt),wt.makeTranslation(f,y),t.multiplyMatrices(wt,Me)}break;case"scale":a.length>=1&&t.scale(a[0],a[1]??a[0]);break;case"skewX":a.length===1&&t.set(1,Math.tan(a[0]*Math.PI/180),0,0,1,0,0,0,1);break;case"skewY":a.length===1&&t.set(1,0,0,Math.tan(a[0]*Math.PI/180),1,0,0,0,1);break;case"matrix":a.length===6&&t.set(a[0],a[2],a[4],a[1],a[3],a[5],0,0,1);break}}e.premultiply(t)}}return e}function Mn(i){return new G().arc(L(i.getAttribute("cx")||0),L(i.getAttribute("cy")||0),L(i.getAttribute("r")||0),0,Math.PI*2)}function Pn(i,e){if(!(!i.sheet||!i.sheet.cssRules||!i.sheet.cssRules.length))for(let t=0;t<i.sheet.cssRules.length;t++){const n=i.sheet.cssRules[t];if(n.type!==1)continue;const r=n.selectorText.split(/,/g).filter(Boolean).map(s=>s.trim()),o={};for(let s=n.style.length,c=0;c<s;c++){const h=n.style.item(c);o[h]=n.style.getPropertyValue(h)}for(let s=0;s<r.length;s++)e[r[s]]=Object.assign(e[r[s]]||{},{...o})}}function wn(i){return new G().ellipse(L(i.getAttribute("cx")||0),L(i.getAttribute("cy")||0),L(i.getAttribute("rx")||0),L(i.getAttribute("ry")||0),0,0,Math.PI*2)}function vn(i){return new G().moveTo(L(i.getAttribute("x1")||0),L(i.getAttribute("y1")||0)).lineTo(L(i.getAttribute("x2")||0),L(i.getAttribute("y2")||0))}function Tn(i){const e=new G,t=i.getAttribute("d");return!t||t==="none"?null:(e.addData(t),e)}const Cn=/([+-]?(?:\d+(?:\.\d+)?|\.\d+)(?:e[+-]?\d+)?)(?:,|\s)([+-]?\d*\.?\d+(?:e[+-]?\d+)?)/g;function An(i){var n;const e=new G;let t=0;return(n=i.getAttribute("points"))==null||n.replace(Cn,(r,o,s)=>{const c=L(o),h=L(s);return t===0?e.moveTo(c,h):e.lineTo(c,h),t++,r}),e.currentCurve.autoClose=!0,e}const bn=/([+-]?(?:\d+(?:\.\d+)?|\.\d+)(?:e[+-]?\d+)?)(?:,|\s)([+-]?\d*\.?\d+(?:e[+-]?\d+)?)/g;function kn(i){var n;const e=new G;let t=0;return(n=i.getAttribute("points"))==null||n.replace(bn,(r,o,s)=>{const c=L(o),h=L(s);return t===0?e.moveTo(c,h):e.lineTo(c,h),t++,r}),e.currentCurve.autoClose=!1,e}function In(i){const e=L(i.getAttribute("x")||0),t=L(i.getAttribute("y")||0),n=L(i.getAttribute("rx")||i.getAttribute("ry")||0),r=L(i.getAttribute("ry")||i.getAttribute("rx")||0),o=L(i.getAttribute("width")),s=L(i.getAttribute("height")),c=1-.551915024494,h=new G;return h.moveTo(e+n,t),h.lineTo(e+o-n,t),(n!==0||r!==0)&&h.bezierCurveTo(e+o-n*c,t,e+o,t+r*c,e+o,t+r),h.lineTo(e+o,t+s-r),(n!==0||r!==0)&&h.bezierCurveTo(e+o,t+s-r*c,e+o-n*c,t+s,e+o-n,t+s),h.lineTo(e+n,t+s),(n!==0||r!==0)&&h.bezierCurveTo(e+n*c,t+s,e,t+s-r*c,e,t+s-r),h.lineTo(e,t+r),(n!==0||r!==0)&&h.bezierCurveTo(e,t+r*c,e+n*c,t,e+n,t),h}function U(i,e,t){e=Object.assign({},e);let n={};if(i.hasAttribute("class")){const a=i.getAttribute("class").split(/\s/).filter(Boolean).map(l=>l.trim());for(let l=0;l<a.length;l++)n=Object.assign(n,t[`.${a[l]}`])}i.hasAttribute("id")&&(n=Object.assign(n,t[`#${i.getAttribute("id")}`]));for(let a=i.style.length,l=0;l<a;l++){const f=i.style.item(l),y=i.style.getPropertyValue(f);e[f]=y,n[f]=y}function r(a,l,f=o){i.hasAttribute(a)&&(e[l]=f(i.getAttribute(a))),n[a]&&(e[l]=f(n[a]))}function o(a){return a.startsWith("url")&&console.warn("url access in attributes is not implemented."),a}function s(a){return Math.max(0,Math.min(1,L(a)))}function c(a){return Math.max(0,L(a))}function h(a){return a.split(" ").filter(l=>l!=="").map(l=>L(l))}return r("fill","fill"),r("fill-opacity","fillOpacity",s),r("fill-rule","fillRule"),r("opacity","opacity",s),r("stroke","stroke"),r("stroke-opacity","strokeOpacity",s),r("stroke-width","strokeWidth",c),r("stroke-linecap","strokeLinecap"),r("stroke-linejoin","strokeLinejoin"),r("stroke-miterlimit","strokeMiterlimit",c),r("stroke-dasharray","strokeDasharray",h),r("stroke-dashoffset","strokeDashoffset",L),r("visibility","visibility"),e}function Rt(i,e,t=[],n={}){var f;if(i.nodeType!==1)return t;let r=!1,o=null,s={...e};switch(i.nodeName){case"svg":s=U(i,s,n);break;case"style":Pn(i,n);break;case"g":s=U(i,s,n);break;case"path":s=U(i,s,n),i.hasAttribute("d")&&(o=Tn(i));break;case"rect":s=U(i,s,n),o=In(i);break;case"polygon":s=U(i,s,n),o=An(i);break;case"polyline":s=U(i,s,n),o=kn(i);break;case"circle":s=U(i,s,n),o=Mn(i);break;case"ellipse":s=U(i,s,n),o=wn(i);break;case"line":s=U(i,s,n),o=vn(i);break;case"defs":r=!0;break;case"use":{s=U(i,s,n);const x=(i.getAttributeNS("http://www.w3.org/1999/xlink","href")||i.getAttribute("href")||"").substring(1),u=(f=i.viewportElement)==null?void 0:f.getElementById(x);u?Rt(u,s,t,n):console.warn(`'use node' references non-existent node id: ${x}`);break}default:console.warn(i);break}if(s.display==="none")return t;const c=new z,h=[],a=dn(i,c,h);o&&(o.applyTransform(c),t.push(o),o.style={...s});const l=i.childNodes;for(let y=0,x=l.length;y<x;y++){const u=l[y];r&&u.nodeName!=="style"&&u.nodeName!=="defs"||Rt(u,s,t,n)}return a&&(h.pop(),h.length>0?c.copy(h[h.length-1]):c.identity()),t}function Sn(i){var t;const e=pe(i);return new le(Rt(e,{}),(t=e.getAttribute("viewBox"))==null?void 0:t.trim().split(" ").map(n=>Number(n)))}v.ArcCurve=re,v.BoundingBox=X,v.CompositeCurve=rt,v.CubicBezierCurve=Mt,v.Curve=Y,v.CurvePath=lt,v.EllipseCurve=oe,v.EquilateralPloygonCurve=an,v.FFDControlGrid=fn,v.LineCurve=j,v.Matrix3=z,v.Path2D=G,v.Path2DSet=le,v.PloygonCurve=Ot,v.QuadraticBezierCurve=Pt,v.RectangleCurve=ce,v.RoundRectangleCurve=he,v.SplineCurve=ae,v.Vector2=p,v.applyFFD=yn,v.catmullRom=St,v.cubicBezier=Et,v.drawPoint=R,v.fillTriangulate=Nt,v.getAdaptiveCubicBezierCurvePoints=Ht,v.getAdaptiveQuadraticBezierCurvePoints=Qt,v.parseArcCommand=jt,v.parsePathDataArgs=Z,v.quadraticBezier=_t,v.setCanvasContext=At,v.strokeTriangulate=Jt,v.svgPathCommandsAddToPath2D=kt,v.svgPathCommandsToData=Gt,v.svgPathDataToCommands=It,v.svgToDOM=pe,v.svgToPath2DSet=Sn,Object.defineProperty(v,Symbol.toStringTag,{value:"Module"})});
package/dist/index.mjs CHANGED
@@ -56,6 +56,11 @@ class Vector2 {
56
56
  get array() {
57
57
  return [this.x, this.y];
58
58
  }
59
+ finite() {
60
+ this.x = Number.isFinite(this.x) ? this.x : 0;
61
+ this.y = Number.isFinite(this.y) ? this.y : 0;
62
+ return this;
63
+ }
59
64
  set(x, y) {
60
65
  this.x = x;
61
66
  this.y = y;
@@ -1588,8 +1593,13 @@ class Curve {
1588
1593
  return [];
1589
1594
  }
1590
1595
  applyTransform(transform) {
1596
+ const isFunction = typeof transform === "function";
1591
1597
  this.getControlPointRefs().forEach((p) => {
1592
- p.applyMatrix3(transform);
1598
+ if (isFunction) {
1599
+ transform(p);
1600
+ } else {
1601
+ p.applyMatrix3(transform);
1602
+ }
1593
1603
  });
1594
1604
  return this;
1595
1605
  }
@@ -1741,7 +1751,7 @@ class Curve {
1741
1751
  min.min(p);
1742
1752
  max.max(p);
1743
1753
  }
1744
- return { min, max };
1754
+ return { min: min.finite(), max: max.finite() };
1745
1755
  }
1746
1756
  getBoundingBox() {
1747
1757
  const { min, max } = this.getMinMax();
@@ -1777,7 +1787,7 @@ class Curve {
1777
1787
  const p1 = getPoint(indices[i]);
1778
1788
  const p2 = getPoint(indices[i + 1]);
1779
1789
  const p3 = getPoint(indices[i + 2]);
1780
- polygonStr += `<polygon points="${p1.join(",")} ${p2.join(",")} ${p3.join(",")}" fill="none" stroke="black" />`;
1790
+ polygonStr += `<polygon points="${p1.join(",")} ${p2.join(",")} ${p3.join(",")}" fill="none" stroke="black" stroke-width="0.5" stroke-linecap="round" stroke-linejoin="round" />`;
1781
1791
  }
1782
1792
  const viewBox = [min.x, min.y, max.x - min.x, max.y - min.y];
1783
1793
  return `<svg width="${viewBox[2]}" height="${viewBox[3]}" viewBox="${viewBox.join(" ")}" xmlns="http://www.w3.org/2000/svg">${polygonStr}</svg>`;
@@ -2089,7 +2099,7 @@ class RoundCurve extends Curve {
2089
2099
  min.y = Math.min(min.y, cy - halfHeight);
2090
2100
  max.x = Math.max(max.x, cx + halfWidth);
2091
2101
  max.y = Math.max(max.y, cy + halfHeight);
2092
- return { min, max };
2102
+ return { min: min.finite(), max: max.finite() };
2093
2103
  }
2094
2104
  copy(source) {
2095
2105
  super.copy(source);
@@ -2342,7 +2352,7 @@ class LineCurve extends Curve {
2342
2352
  min.y = Math.min(min.y, p1.y, p2.y);
2343
2353
  max.x = Math.max(max.x, p1.x, p2.x);
2344
2354
  max.y = Math.max(max.y, p1.y, p2.y);
2345
- return { min, max };
2355
+ return { min: min.finite(), max: max.finite() };
2346
2356
  }
2347
2357
  toCommands() {
2348
2358
  const { p1, p2 } = this;
@@ -2528,7 +2538,7 @@ class CompositeCurve extends Curve {
2528
2538
  }
2529
2539
  getMinMax(min = Vector2.MAX, max = Vector2.MIN) {
2530
2540
  this.curves.forEach((curve) => curve.getMinMax(min, max));
2531
- return { min, max };
2541
+ return { min: min.finite(), max: max.finite() };
2532
2542
  }
2533
2543
  getBoundingBox() {
2534
2544
  const { min, max } = this.getMinMax();
@@ -2628,7 +2638,7 @@ class CubicBezierCurve extends Curve {
2628
2638
  }
2629
2639
  };
2630
2640
  samplePoints(tValues, 10);
2631
- return { min, max };
2641
+ return { min: min.finite(), max: max.finite() };
2632
2642
  }
2633
2643
  toCommands() {
2634
2644
  const { p1, cp1, cp2, p2 } = this;
@@ -2775,7 +2785,7 @@ class QuadraticBezierCurve extends Curve {
2775
2785
  min.y = Math.min(min.y, p1.y, p2.y, y1, y2);
2776
2786
  max.x = Math.max(max.x, p1.x, p2.x, x1, x2);
2777
2787
  max.y = Math.max(max.y, p1.y, p2.y, y1, y2);
2778
- return { min, max };
2788
+ return { min: min.finite(), max: max.finite() };
2779
2789
  }
2780
2790
  toCommands() {
2781
2791
  const { p1, cp, p2 } = this;
@@ -3417,7 +3427,7 @@ class Path2D extends CompositeCurve {
3417
3427
  }
3418
3428
  }
3419
3429
  });
3420
- return { min, max };
3430
+ return { min: min.finite(), max: max.finite() };
3421
3431
  }
3422
3432
  strokeTriangulate(options) {
3423
3433
  const indices = options?.indices ?? [];
@@ -3553,6 +3563,61 @@ class Path2DSet {
3553
3563
  }
3554
3564
  }
3555
3565
 
3566
+ class FFDControlGrid {
3567
+ constructor(rows, cols, width = 1, height = 1) {
3568
+ this.rows = rows;
3569
+ this.cols = cols;
3570
+ this.width = width;
3571
+ this.height = height;
3572
+ for (let i = 0; i < rows; i++) {
3573
+ this.controlPoints[i] = [];
3574
+ for (let j = 0; j < cols; j++) {
3575
+ this.controlPoints[i][j] = {
3576
+ x: j / (cols - 1) * width,
3577
+ y: i / (rows - 1) * height
3578
+ };
3579
+ }
3580
+ }
3581
+ }
3582
+ controlPoints = [];
3583
+ moveControlPoint(i, j, dx, dy) {
3584
+ this.controlPoints[i][j].x += dx;
3585
+ this.controlPoints[i][j].y += dy;
3586
+ return this;
3587
+ }
3588
+ }
3589
+ function bsplineBasis(t) {
3590
+ const B = [];
3591
+ B[0] = (1 - t) ** 3 / 6;
3592
+ B[1] = (3 * t ** 3 - 6 * t ** 2 + 4) / 6;
3593
+ B[2] = (-3 * t ** 3 + 3 * t ** 2 + 3 * t + 1) / 6;
3594
+ B[3] = t ** 3 / 6;
3595
+ return B;
3596
+ }
3597
+ function applyFFD(point, grid, width = grid.width, height = grid.height) {
3598
+ const s = point.x / width * (grid.cols - 1);
3599
+ const t = point.y / height * (grid.rows - 1);
3600
+ const i = Math.floor(s);
3601
+ const j = Math.floor(t);
3602
+ const u = s - i;
3603
+ const v = t - j;
3604
+ const bu = bsplineBasis(u);
3605
+ const bv = bsplineBasis(v);
3606
+ let x = 0;
3607
+ let y = 0;
3608
+ for (let m = 0; m < 4; m++) {
3609
+ for (let n = 0; n < 4; n++) {
3610
+ const row = Math.min(Math.max(j - 1 + m, 0), grid.rows - 1);
3611
+ const col = Math.min(Math.max(i - 1 + n, 0), grid.cols - 1);
3612
+ const cp = grid.controlPoints[row][col];
3613
+ const weight = bu[n] * bv[m];
3614
+ x += cp.x * weight;
3615
+ y += cp.y * weight;
3616
+ }
3617
+ }
3618
+ point.set(x, y);
3619
+ }
3620
+
3556
3621
  const dataUri = "data:image/svg+xml;";
3557
3622
  const base64DataUri = `${dataUri}base64,`;
3558
3623
  const utf8DataUri = `${dataUri}charset=utf8,`;
@@ -4082,4 +4147,4 @@ function svgToPath2DSet(svg) {
4082
4147
  );
4083
4148
  }
4084
4149
 
4085
- export { ArcCurve, BoundingBox, CompositeCurve, CubicBezierCurve, Curve, CurvePath, EllipseCurve, EquilateralPloygonCurve, LineCurve, Matrix3, Path2D, Path2DSet, PloygonCurve, QuadraticBezierCurve, RectangleCurve, RoundRectangleCurve, SplineCurve, Vector2, catmullRom, cubicBezier, drawPoint, fillTriangulate, getAdaptiveCubicBezierCurvePoints, getAdaptiveQuadraticBezierCurvePoints, parseArcCommand, parsePathDataArgs, quadraticBezier, setCanvasContext, strokeTriangulate, svgPathCommandsAddToPath2D, svgPathCommandsToData, svgPathDataToCommands, svgToDOM, svgToPath2DSet };
4150
+ export { ArcCurve, BoundingBox, CompositeCurve, CubicBezierCurve, Curve, CurvePath, EllipseCurve, EquilateralPloygonCurve, FFDControlGrid, LineCurve, Matrix3, Path2D, Path2DSet, PloygonCurve, QuadraticBezierCurve, RectangleCurve, RoundRectangleCurve, SplineCurve, Vector2, applyFFD, catmullRom, cubicBezier, drawPoint, fillTriangulate, getAdaptiveCubicBezierCurvePoints, getAdaptiveQuadraticBezierCurvePoints, parseArcCommand, parsePathDataArgs, quadraticBezier, setCanvasContext, strokeTriangulate, svgPathCommandsAddToPath2D, svgPathCommandsToData, svgPathDataToCommands, svgToDOM, svgToPath2DSet };
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "modern-path2d",
3
3
  "type": "module",
4
- "version": "1.2.18",
4
+ "version": "1.3.0",
5
5
  "packageManager": "pnpm@9.15.1",
6
6
  "description": "A modern Path2D library, fully compatible with Web Path2D, with additional support for path animation, path deformation, path playback, etc.",
7
7
  "author": "wxm",